All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.saumya.mojo.gem.PomMojo Maven / Gradle / Ivy

There is a newer version: 2.0.1
Show newest version
package de.saumya.mojo.gem;

import java.io.File;
import java.io.IOException;
import java.net.URL;

import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.codehaus.plexus.util.FileUtils;

import de.saumya.mojo.jruby.AbstractJRubyMojo;
import de.saumya.mojo.ruby.script.ScriptException;

/**
 * goal to converts a gemspec file into pom.xml.
 * 
 * @goal pom
 */
public class PomMojo extends AbstractJRubyMojo {

    /** @parameter expression="${plugin}" @readonly */
    PluginDescriptor  plugin;

    /**
     * the pom file to generate
     * 
* Command line -Dpom=... * * @parameter expression="${pom}" default-value="pom.xml" */ protected File pom; /** * force overwrite of an existing pom *
* Command line -Dpom.force=... * * @parameter default-value="${pom.force}" */ protected boolean force = false; /** * temporary store generated pom. * * @parameter default-value="${project.build.directory}/pom.xml" */ protected File tmpPom; /** * use a gemspec file to generate a pom *
* Command line -Dpom.gemspec=... * * @parameter default-value="${pom.gemspec}" */ protected File gemspec; /** * use Gemfile to generate a pom *
* Command line -Dpom.gemfile=... * * @parameter expression="${pom.gemfile}" * default-value="Gemfile" */ protected File gemfile; /** * @parameter */ private boolean skipGeneration; @Override public void executeJRuby() throws MojoExecutionException, ScriptException, IOException { if (tmpPom.getPath().contains( "${project.basedir}" ) ) { tmpPom = new File( tmpPom.getPath().replace( "${project.basedir}/", "" ) ); } File source = null; if( this.skipGeneration ) { this.gemfile = null; this.gemspec = null; } else { if ( this.gemfile.exists() ) { this.gemspec = null; } else { this.gemfile = null; if (this.gemspec == null) { this.gemspec = findGemspec(); } } if (this.gemspec != null) { generatePom( this.gemspec, "gemspec" ); source = this.gemspec; } if (this.gemfile != null ) { generatePom( this.gemfile, "gemfile" ); source = this.gemspec; } } copyGeneratedPom( source ); } private void copyGeneratedPom( File source ) throws IOException { if( pom.exists() && tmpPom.exists() ) { String pomString = FileUtils.fileRead( pom ); String tmpString = FileUtils.fileRead( tmpPom ); if ( force || // no source then copy on change ( source == null && ! pomString.equals( tmpString ) ) || // with source copy on modification ( source != null && source.lastModified() > pom.lastModified() ) ) { movePom(); } else if (this.jrubyVerbose) { if ( source != null ) { getLog().info( "skip creation of pom. force creation with -Dpom.force"); } else { rubyMavenHelper(); tmpPom.delete(); getLog().info( "generated pom up to date - deleted " + tmpPom.getAbsolutePath().replace( this.project.getBasedir().getAbsolutePath() + "/", "" ) ); } } } else if ( tmpPom.exists() ) { movePom(); } } private void movePom() throws IOException { //pom.delete(); FileUtils.rename( tmpPom, pom ); rubyMavenHelper(); if (this.jrubyVerbose) { getLog().info( "moved " + tmpPom.getAbsolutePath().replace( this.project.getBasedir().getAbsolutePath() + "/", "" ) + " to " + pom.getAbsolutePath().replace( this.project.getBasedir().getAbsolutePath() + "/", "" ) ); } } private void rubyMavenHelper() { // helper for ruby-maven to keep the project data valid if (project.getFile() != null && project.getFile().getAbsolutePath().equals( tmpPom.getAbsolutePath() ) ){ project.setFile( pom ); } } private void generatePom(File file, String type) throws ScriptException, IOException { this.tmpPom.getParentFile().mkdirs(); URL url = Thread.currentThread().getContextClassLoader().getResource("maven/tools/pom.rb"); this.factory.newScript("$LOAD_PATH << '" + url.toString().replace("maven/tools/pom.rb", "")+"';" + "require 'maven/tools/pom';" + "puts Maven::Tools::POM.new('" + file.getAbsolutePath() + "').to_s") .execute(tmpPom); } private File findGemspec() { getLog().debug("no gemspec file given, see if there is single one"); File result = null; File basedir = this.project.getBasedir() == null ? new File(".") : this.project.getBasedir(); for (final File file : basedir.listFiles()) { if (file.getName().endsWith(".gemspec")) { if (result != null) { getLog().info("there is no gemspec file given but there are more then one in the current directory."); getLog().info("use '-Dpom.gemspec=...' to select the gemspec file or -Dpom.gemfile to select a Gemfile to process"); return null; } result = file; } } return result; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy