package de.saumya.mojo.gem; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.util.Collections; import java.util.List; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.codehaus.plexus.util.DirectoryScanner; import org.codehaus.plexus.util.FileUtils; import de.saumya.mojo.ruby.gems.GemException; import de.saumya.mojo.ruby.script.Script; import de.saumya.mojo.ruby.script.ScriptException; /** * installs a set of given gems without resolving any transitive dependencies */ @Mojo( name = "process-resources", defaultPhase = LifecyclePhase.PROCESS_RESOURCES ) public class ProcessResourcesMojo extends AbstractGemMojo { @Parameter protected List<String> includeRubyResources; @Parameter protected List<String> excludeRubyResources = Collections.emptyList(); @Override protected void executeWithGems() throws MojoExecutionException, ScriptException, IOException, GemException { File jrubydir = new File(project.getBuild().getOutputDirectory(), ".jrubydir"); if ( includeRubyResources != null ) { jrubydir.delete(); DirectoryScanner scanner = scan(includeRubyResources.toArray(new String[includeRubyResources.size()]), excludeRubyResources.toArray(new String[excludeRubyResources.size()]) ); processBaseDirectory(scanner, jrubydir); processNestedDiretories(scanner); } if ( rubySourceDirectory.exists() ) { processDir(jrubydir, rubySourceDirectory); } if ( libDirectory.exists() && includeLibDirectoryInResources ) { processDir(jrubydir, libDirectory); } } private void processDir(File jrubydir, File dir) throws IOException, ScriptException { File[] dirs = dir.listFiles(new FileFilter() { public boolean accept(File f) { return f.isDirectory(); } }); String[] includes = new String[ dirs.length + 1 ]; includes[ 0 ] = "*"; int index = 1; for( File d: dirs ) { includes[ index ++ ] = d.getName() + "/*"; } DirectoryScanner scanner = scan(includes, new String[0]); processBaseDirectory(scanner, jrubydir); processNestedDiretories(scanner); } private void processNestedDiretories(DirectoryScanner scanner) throws IOException, ScriptException { String[] directories = scanner.getIncludedDirectories(); if (directories.length > 0) { StringBuilder script = new StringBuilder("require 'jruby/commands';"); for( String dir: directories) { if (!dir.contains("/")) { script.append("JRuby::Commands.generate_dir_info('" + new File( project.getBuild().getOutputDirectory(), dir ).getAbsolutePath() + "', false) if JRuby::Commands.respond_to? :generate_dir_info;" ); } } Script s = this.factory.newScript(script.toString()); s.execute(); } } private void processBaseDirectory(DirectoryScanner scanner, File jrubydir) throws IOException { String[] files = scanner.getIncludedFiles(); if (files.length > 0) { StringBuilder fileList; if (jrubydir.exists()) { fileList = new StringBuilder(FileUtils.fileRead(jrubydir)); } else { fileList = new StringBuilder(".\n"); } for (String file: files) { if (!file.contains("/")) { fileList.append(file).append("\n"); } } FileUtils.fileWrite(jrubydir, fileList.toString()); } } private DirectoryScanner scan(String[] includes, String[] excludes) { DirectoryScanner scanner = new DirectoryScanner(); scanner.setBasedir(project.getBuild().getOutputDirectory()); scanner.addDefaultExcludes(); scanner.setIncludes(includes); scanner.setExcludes(excludes); scanner.scan(); return scanner; } }