package org.codehaus.mojo.weblogic; /* * Copyright 2006 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import org.apache.maven.plugin.MojoExecutionException; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.Path; import org.codehaus.mojo.weblogic.util.WeblogicMojoUtilities; import org.codehaus.plexus.util.ReflectionUtils; import weblogic.ant.taskdefs.j2ee.Appc; import java.io.File; import java.lang.reflect.Method; /** * Run the weblogic appc compiler against an artifact. * * @author <a href="mailto:scott@theryansplace.com">Scott Ryan</a> * @version $Id$ * @description Run APPC compiler on an artifact (war, ear, etc). * @goal appc * @requiresDependencyResolution compile */ public class AppcMojo extends AbstractWeblogicMojo { /** * The full path to the artifact to be compiled. It can be an EAR, War or Jar. If the project packaging is ejb then * the .ejb suffix will be replaced with .jar if needed. * * @parameter expression="${project.build.directory}/${project.build.finalName}.${project.packaging}" */ private String inputArtifactPath; /** * The project packaging used to check the suffix on the artifact. * * @parameter expression="${project.packaging}" */ private String projectPackaging; /** * If this is set to true then verbose output for the process will be generated. * * @parameter default-value="false" */ private boolean verbose; /** * If set to true the generated source files will be kept. * * @parameter default-value="true" */ private boolean keepGenerated; /** * The full path to the output artifact. By default it is not used and defaults to be the same as the input. * * @parameter default-value="" */ private String outputArtifactPath; /** * If set to true the generation of JSP and EJB s will be forced to happen. * * @parameter default-value="true" */ private boolean forceGeneration; /** * If set to true then line numbers will be added to classes for debugging. * * @parameter default-value="false" */ private boolean lineNumbers; /** * If set to true the basic client jar will be created without descriptors, etc. * * @parameter default-value="false" */ private boolean basicClientJar; /** * The full path to create the generated client jar file. * * @parameter default-value="${project.build.directory}" */ private String clientJarOutputDir; /** * If set to false the plugin stops after if compilation of a JSP file fails. * * @parameter default-value="true" */ private boolean continueCompilation; /** * Getter for property input artifact path. * * @return The value of input artifact path. */ public String getInputArtifactPath() { return inputArtifactPath; } /** * Setter for the input artifact path. * * @param inInputArtifactPath The value of input artifact path. */ public void setInputArtifactPath( final String inInputArtifactPath ) { this.inputArtifactPath = inInputArtifactPath; } /** * This method will perform the appc compilation of artifact. * Calls super.execute() * * @throws MojoExecutionException Thrown if we fail to access the complier or the compilation fails. */ public void execute() throws MojoExecutionException { //be sure to call super so weblogic.home will be set. super.execute(); final String classPath = WeblogicMojoUtilities.getDependencies( this.getArtifacts(), this.getPluginArtifacts() ); // Process the input artifact for proper suffixes inputArtifactPath = WeblogicMojoUtilities.updateArtifactName( this.inputArtifactPath, this.projectPackaging ); if ( getLog().isInfoEnabled() ) { getLog().info( "Weblogic APPC processing beginning for artifact " + this.getInputArtifactPath() ); getLog().info( " Detailed Appc settings information " + this.toString() ); getLog().info( "Using Classpath " + classPath ); } try { System.setProperty( "com.sun.xml.namespace.QName.useCompatibleSerialVersionUID", "1.0" ); // Create the Ant task, pass in the options and execute it Appc appc = new Appc(); File source = new File( this.inputArtifactPath ); appc.setSource( source.getAbsolutePath() ); if ( this.outputArtifactPath != null ) { File destination = new File( this.outputArtifactPath ); appc.setOutput( destination.getAbsolutePath() ); } appc.setVerbose( this.verbose ); appc.setKeepGenerated( this.keepGenerated ); appc.setBasicClientJar( this.basicClientJar ); // use reflection here to maintain compatibility with previous WebLogic versions // appc.setClientJarOutputDir( this.clientJarOutputDir ); Method method = ReflectionUtils.getSetter("clientJarOutputDir", appc.getClass()); if (method != null) { method.invoke(appc, new Object[] { this.clientJarOutputDir }); } appc.setForceGeneration( this.forceGeneration ); appc.setLineNumbers( this.lineNumbers ); appc.setContinueCompilation( this.continueCompilation ); Project antProject = new Project(); antProject.setName( "appc" ); appc.setProject( antProject ); appc.setClasspath( new Path( antProject, classPath ) ); appc.execute(); } catch ( Exception ex ) { getLog().error( "Exception encountered during APPC processing ", ex ); throw new MojoExecutionException( "Exception encountered during APPC processing", ex ); } finally { WeblogicMojoUtilities.unsetWeblogicProtocolHandler(); } if ( getLog().isInfoEnabled() ) { getLog().info( "Weblogic APPC processing of " + this.getInputArtifactPath() + " successful " ); } } /** * Getter for property verbose. * * @return The value of verbose. */ public boolean isVerbose() { return this.verbose; } /** * Setter for the verbose. * * @param inVerbose The value of verbose. */ public void setVerbose( final boolean inVerbose ) { this.verbose = inVerbose; } /** * Getter for property basic client jar. * * @return The value of basic client jar. */ public boolean isBasicClientJar() { return this.basicClientJar; } /** * Setter for the basic client jar. * * @param inBasicClientJar The value of basic client jar. */ public void setBasicClientJar( final boolean inBasicClientJar ) { this.basicClientJar = inBasicClientJar; } /** * Setter for the path to place the client jar. * * @param clientJarOutputDir The path to place the client jar. */ public void setClientJarOutputDir( final String clientJarOutputDir ) { this.clientJarOutputDir = clientJarOutputDir; } /** * Getter for property force generation. * * @return The value of force generation. */ public boolean isForceGeneration() { return this.forceGeneration; } /** * Setter for the force generation. * * @param inForceGeneration The value of force generation. */ public void setForceGeneration( final boolean inForceGeneration ) { this.forceGeneration = inForceGeneration; } /** * Getter for property keep generated. * * @return The value of keep generated. */ public boolean isKeepGenerated() { return this.keepGenerated; } /** * Setter for the keep generated. * * @param inKeepGenerated The value of keep generated. */ public void setKeepGenerated( final boolean inKeepGenerated ) { this.keepGenerated = inKeepGenerated; } /** * Getter for property line numbers. * * @return The value of line numbers. */ public boolean isLineNumbers() { return this.lineNumbers; } /** * Setter for the line numbers. * * @param inLineNumbers The value of line numbers. */ public void setLineNumbers( final boolean inLineNumbers ) { this.lineNumbers = inLineNumbers; } /** * Getter for property output artifact path. * * @return The value of output artifact path. */ public String getOutputArtifactPath() { return outputArtifactPath; } /** * Setter for the output artifact path. * * @param inOutputArtifactPath The value of output artifact path. */ public void setOutputArtifactPath( final String inOutputArtifactPath ) { this.outputArtifactPath = inOutputArtifactPath; } /** * Getter for property project packaging. * * @return The value of project packaging. */ public String getProjectPackaging() { return projectPackaging; } /** * Setter for the project packaging. * * @param inProjectPackaging The value of project packaging. */ public void setProjectPackaging( String inProjectPackaging ) { this.projectPackaging = inProjectPackaging; } /** * This method creates a String representation of this object. * * @return The String representation of this object. */ public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append( "AppcMojo[" ); buffer.append( "\n basicClientJar = " ).append( basicClientJar ); buffer.append( "\n clientJarOutputDir = " ).append( clientJarOutputDir ); buffer.append( "\n forceGeneration = " ).append( forceGeneration ); buffer.append( "\n keepGenerated = " ).append( keepGenerated ); buffer.append( "\n lineNumbers = " ).append( lineNumbers ); buffer.append( "\n inputArtifactPath = " ).append( inputArtifactPath ); buffer.append( "\n outputArtifactPath = " ).append( outputArtifactPath ); buffer.append( "\n artifacts = " ).append( getArtifacts() ); buffer.append( "\n project Packaging = " ).append( projectPackaging ); buffer.append( "\n verbose = " ).append( verbose ); buffer.append( "\n continueCompilation = " ).append( continueCompilation ); buffer.append( "]" ); return buffer.toString(); } }