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

com.rexsl.maven.AbstractRexslMojo Maven / Gradle / Ivy

There is a newer version: 0.13.3
Show newest version
/**
 * Copyright (c) 2011-2013, ReXSL.com
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met: 1) Redistributions of source code must retain the above
 * copyright notice, this list of conditions and the following
 * disclaimer. 2) Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following
 * disclaimer in the documentation and/or other materials provided
 * with the distribution. 3) Neither the name of the ReXSL.com nor
 * the names of its contributors may be used to endorse or promote
 * products derived from this software without specific prior written
 * permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package com.rexsl.maven;

import com.jcabi.aspects.Loggable;
import com.jcabi.log.Logger;
import com.rexsl.maven.utils.PortReserver;
import java.util.Map;
import java.util.Properties;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.slf4j.impl.StaticLoggerBinder;
import org.sonatype.aether.RepositorySystemSession;

/**
 * Abstract mojo.
 *
 * 

We import {@link StaticLoggerBinder} from SLF4J package, but this * class actually is not from slf4j artifact. Instead, we are using * {@code com.rempl.plugins:rempl-maven-plugin} artifact, where this class * is defined. Additional information about how exactly this reloading * works can be found at SLF4J documentation. This implementation of * {@link StaticLoggerBinder} forwards all SLF4J calls to Maven log. * *

This class is public because Maven needs it this way. * *

The class is NOT thread-safe. * * @author Yegor Bugayenko ([email protected]) * @version $Id$ * @see SLF4J manual */ public abstract class AbstractRexslMojo extends AbstractMojo { /** * Maven project, to be injected by Maven itself. * @parameter property="project" * @required * @readonly */ private transient MavenProject iproject; /** * The current repository/network configuration of Maven. * @parameter default-value="${repositorySystemSession}" * @readonly */ private transient RepositorySystemSession session; /** * Shall we skip execution? * @parameter property="rexsl.skip" default-value="false" * @required */ private transient boolean skip; /** * Webapp directory. * @parameter property="rexsl.webappDirectory" default-value="${project.build.directory}/${project.build.finalName}" * @required */ private transient String webappDirectory; /** * TPC port to bind to (by default a random port is used). * @parameter property="rexsl.port" */ private transient Integer port; /** * System variables to be set before running tests. * *

You define them in a similar way as in * maven-surefire-plugin, * for example you want to reconfigure LOG4J just for the tests: * *

     * <plugin>
     *   <groupId>com.rexsl</groupId>
     *   <artifactId>rexsl-maven-plugin</artifactId>
     *   <configuration>
     *     <systemPropertyVariables>
     *       <log4j.configuration>./x.props</log4j.configuration>
     *     </systemPropertyVariables>
     *   </configuration>
     * </plugin>
     * 
* * @parameter * @since 0.3 */ @SuppressWarnings("PMD.LongVariable") private transient Map systemPropertyVariables; /** * Environment. */ private transient MavenEnvironment environment; /** * Set Maven Project (used mostly for unit testing). * @param proj The project to set */ @Loggable(Loggable.DEBUG) public final void setProject(final MavenProject proj) { this.iproject = proj; } /** * Set skip option. * @param skp Shall we skip execution? */ @Loggable(Loggable.DEBUG) public final void setSkip(final boolean skp) { this.skip = skp; } /** * Set webapp directory. * @param dir The directory */ @Loggable(Loggable.DEBUG) public final void setWebappDirectory(final String dir) { this.webappDirectory = dir; } /** * Set repository system session. * @param sess The session */ @Loggable(Loggable.DEBUG) public final void setSession(final RepositorySystemSession sess) { this.session = sess; } /** * Set systemPropertyVariables. * @param props Properties */ @Loggable(Loggable.DEBUG) public final void setsystemProperties(final Map props) { this.systemPropertyVariables = props; } /** * Get access to project. * @return The project */ protected final MavenProject project() { return this.iproject; } /** * Get access to environment. * @return The environment */ protected final MavenEnvironment env() { return this.environment; } /** * {@inheritDoc} */ @Override public final void execute() throws MojoFailureException { StaticLoggerBinder.getSingleton().setMavenLog(this.getLog()); if (this.skip) { Logger.info(this, "execution skipped because of 'skip' option"); return; } if (!"war".equals(this.project().getPackaging())) { throw new IllegalStateException("project packaging is not WAR"); } final Properties properties = new Properties(); properties.setProperty( MavenEnvironment.WEBAPP_DIR, this.webappDirectory ); this.environment = new MavenEnvironment(this.project(), properties); if (this.session != null) { this.environment.setLocalRepository( this.session.getLocalRepository().getBasedir().getPath() ); } if (this.port == null) { this.environment.setPort(new PortReserver().port()); } else { this.environment.setPort(this.port); } final Properties before = this.inject(); try { this.run(); } finally { this.revert(before); } } /** * Run this mojo. * @throws MojoFailureException If some problem inside */ protected abstract void run() throws MojoFailureException; /** * Sets the system properties to the argument passed. * @param before The properties. */ private void revert(final Properties before) { System.setProperties(before); } /** * Injects system property variables and returns the properties as * they are before being modified in the method. * @return The properties before being modified */ private Properties inject() { final Properties before = new Properties(); before.putAll(System.getProperties()); if (this.systemPropertyVariables != null) { for (Map.Entry var : this.systemPropertyVariables.entrySet()) { if (var.getValue() == null) { Logger.warn( this, "System variable '%s' can't be set to NULL", var.getKey() ); } else { System.setProperty(var.getKey(), var.getValue()); Logger.info( this, "System variable '%s' set to '%s'", var.getKey(), var.getValue() ); } } } return before; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy