You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2010/11/24 00:42:45 UTC

svn commit: r1038386 - in /cxf/trunk: maven-plugins/java2ws-plugin/pom.xml maven-plugins/java2ws-plugin/src/main/java/org/apache/cxf/maven_plugin/Java2WSMojo.java systests/wsdl_maven/java2ws/pom.xml

Author: dkulp
Date: Tue Nov 23 23:42:45 2010
New Revision: 1038386

URL: http://svn.apache.org/viewvc?rev=1038386&view=rev
Log:
[CXF-3074] Add fork mode to java2ws plugin
Patch from Vincent Siveton applied

Modified:
    cxf/trunk/maven-plugins/java2ws-plugin/pom.xml
    cxf/trunk/maven-plugins/java2ws-plugin/src/main/java/org/apache/cxf/maven_plugin/Java2WSMojo.java
    cxf/trunk/systests/wsdl_maven/java2ws/pom.xml

Modified: cxf/trunk/maven-plugins/java2ws-plugin/pom.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/maven-plugins/java2ws-plugin/pom.xml?rev=1038386&r1=1038385&r2=1038386&view=diff
==============================================================================
--- cxf/trunk/maven-plugins/java2ws-plugin/pom.xml (original)
+++ cxf/trunk/maven-plugins/java2ws-plugin/pom.xml Tue Nov 23 23:42:45 2010
@@ -50,6 +50,12 @@
             <groupId>org.apache.maven</groupId>
             <artifactId>maven-project</artifactId>
             <scope>provided</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.codehaus.plexus</groupId>
+                    <artifactId>plexus-utils</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.apache.maven</groupId>
@@ -58,6 +64,12 @@
         </dependency>
 
         <dependency>
+            <groupId>org.codehaus.plexus</groupId>
+            <artifactId>plexus-utils</artifactId>
+            <version>2.0.5</version>
+        </dependency>
+
+        <dependency>
             <groupId>org.apache.cxf</groupId>
             <artifactId>cxf-tools-common</artifactId>
             <version>${project.version}</version>
@@ -86,7 +98,5 @@
             <artifactId>cxf-tools-java2ws</artifactId>
             <version>${project.version}</version>
         </dependency>
-                     
     </dependencies>
-
 </project>

Modified: cxf/trunk/maven-plugins/java2ws-plugin/src/main/java/org/apache/cxf/maven_plugin/Java2WSMojo.java
URL: http://svn.apache.org/viewvc/cxf/trunk/maven-plugins/java2ws-plugin/src/main/java/org/apache/cxf/maven_plugin/Java2WSMojo.java?rev=1038386&r1=1038385&r2=1038386&view=diff
==============================================================================
--- cxf/trunk/maven-plugins/java2ws-plugin/src/main/java/org/apache/cxf/maven_plugin/Java2WSMojo.java (original)
+++ cxf/trunk/maven-plugins/java2ws-plugin/src/main/java/org/apache/cxf/maven_plugin/Java2WSMojo.java Tue Nov 23 23:42:45 2010
@@ -20,17 +20,24 @@
 package org.apache.cxf.maven_plugin;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.StringTokenizer;
 
+import org.apache.commons.lang.SystemUtils;
 import org.apache.cxf.helpers.FileUtils;
 import org.apache.cxf.tools.common.CommandInterfaceUtils;
 import org.apache.cxf.tools.java2ws.JavaToWS;
+import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
 
 /**
  * @goal java2ws
@@ -39,7 +46,7 @@ import org.apache.maven.project.MavenPro
 */
 public class Java2WSMojo extends AbstractMojo {
     /**
-     * @parameter 
+     * @parameter
      * @required
      */
     private String className;
@@ -54,7 +61,7 @@ public class Java2WSMojo extends Abstrac
      * @parameter
      */
     private String outputFile;
-    
+
     /**
      * @parameter
      */
@@ -94,22 +101,22 @@ public class Java2WSMojo extends Abstrac
 
     /**
      * Maven ProjectHelper.
-     * 
+     *
      * @component
      * @readonly
      */
-    private MavenProjectHelper projectHelper;    
+    private MavenProjectHelper projectHelper;
 
     /**
      * @parameter
      */
     private String argline;
-    
+
     /**
      * @parameter
      */
     private String frontend;
-    
+
     /**
      * @parameter
      */
@@ -130,26 +137,86 @@ public class Java2WSMojo extends Abstrac
      * @parameter default-value="false"
      */
     private Boolean genWrapperbean;
-    
+
     /**
      * Attach the generated wsdl file to the list of files to be deployed
      * on install. This means the wsdl file will be copied to the repository
      * with groupId, artifactId and version of the project and type "wsdl".
-     * 
+     *
      * With this option you can use the maven repository as a Service Repository.
-     * 
+     *
      * @parameter default-value="true"
      */
     private Boolean attachWsdl;
-    
+
+    /**
+     * The plugin dependencies, needed for the fork mode.
+     *
+     * @parameter expression="${plugin.artifacts}"
+     * @required
+     * @readonly
+     */
+    private List<Artifact> pluginArtifacts;
+
+    /**
+     * Specifies whether the JavaToWs execution should be skipped.
+     *
+     * @parameter default-value="false"
+     * @since 2.4
+     */
+    private Boolean skip;
+
+    /**
+     * Allows running the JavaToWs in a separate process.
+     *
+     * @parameter default-value="false"
+     * @since 2.4
+     */
+    private Boolean fork;
+
+    /**
+     * Sets the Java executable to use when fork parameter is <code>true</code>.
+     *
+     * @parameter default-value="${java.home}/bin/java"
+     * @since 2.4
+     */
+    private String javaExecutable;
+
+    /**
+     * Sets the JVM arguments (i.e. <code>-Xms128m -Xmx128m</code>) if fork is set to <code>true</code>.
+     *
+     * @parameter
+     * @since 2.4
+     */
+    private String additionalJvmArgs;
+
     public void execute() throws MojoExecutionException {
+        if (skip) {
+            getLog().info("Skipping Java2WS execution");
+            return;
+        }
+
         ClassLoaderSwitcher classLoaderSwitcher = new ClassLoaderSwitcher(getLog());
-        
 
         try {
-            String cp = classLoaderSwitcher.switchClassLoader(project, false, 
+            String cp = classLoaderSwitcher.switchClassLoader(project, false,
                                                               classpath, classpathElements);
-            processJavaClass(cp);
+            if (fork) {
+                List<String> artifactsPath = new ArrayList<String>(pluginArtifacts.size());
+                for (Artifact a : pluginArtifacts) {
+                    File file = a.getFile();
+                    if (file == null) {
+                        throw new MojoExecutionException("Unable to find " + file + " for artifact "
+                                                         + a.getGroupId() + ":" + a.getArtifactId()
+                                                         + ":" + a.getVersion());
+                    }
+                    artifactsPath.add(file.getPath());
+                }
+                cp = StringUtils.join(artifactsPath.iterator(), File.pathSeparator) + File.pathSeparator + cp;
+            }
+
+            List<String> args = initArgs(cp);
+            processJavaClass(args);
         } finally {
             classLoaderSwitcher.restoreClassLoader();
         }
@@ -157,15 +224,29 @@ public class Java2WSMojo extends Abstrac
         System.gc();
     }
 
-    private void processJavaClass(String cp) throws MojoExecutionException {
+    private List<String> initArgs(String cp) {
         List<String> args = new ArrayList<String>();
 
+        if (fork) {
+            args.add(additionalJvmArgs);
+            // @see JavaToWS#isExitOnFinish()
+            args.add("-DexitOnFinish=true");
+        }
+
+        // classpath arg
+        args.add("-cp");
+        args.add(cp);
+
+        if (fork) {
+            args.add(JavaToWS.class.getCanonicalName());
+        }
+
         // outputfile arg
         if (outputFile == null && project != null) {
             // Put the wsdl in target/generated/wsdl
             int i = className.lastIndexOf('.');
             // Prone to OoBE, but then it's wrong anyway
-            String name = className.substring(i + 1); 
+            String name = className.substring(i + 1);
             outputFile = (project.getBuild().getDirectory() + "/generated/wsdl/" + name + ".wsdl")
                 .replace("/", File.separator);
         }
@@ -181,7 +262,7 @@ public class Java2WSMojo extends Abstrac
               Sometimes JavaToWSDL creates Java code for the wrappers.  I don't *think* this is
               needed by the end user.
             */
-            
+
             // Commiter's comment:
             // Yes, it's required, it's defined in the JAXWS spec.
 
@@ -189,36 +270,32 @@ public class Java2WSMojo extends Abstrac
                 project.addCompileSourceRoot(new File(outputFile).getParentFile().getAbsolutePath());
             }
         }
-        
+
         if (frontend != null) {
             args.add("-frontend");
             args.add(frontend);
         }
-        
+
         if (databinding != null) {
             args.add("-databinding");
             args.add(databinding);
         }
-        
+
         if (genWrapperbean) {
             args.add("-wrapperbean");
         }
-        
+
         if (genWsdl) {
             args.add("-wsdl");
         }
-        
+
         if (genServer) {
             args.add("-server");
         }
-        
+
         if (genClient) {
             args.add("-client");
         }
-        
-        // classpath arg
-        args.add("-cp");
-        args.add(cp);
 
         // soap12 arg
         if (soap12 != null && soap12.booleanValue()) {
@@ -257,21 +334,101 @@ public class Java2WSMojo extends Abstrac
         // classname arg
         args.add(className);
 
-        try {
-            CommandInterfaceUtils.commandCommonMain();
-            JavaToWS j2w = new JavaToWS(args.toArray(new String[args.size()]));
-            j2w.run();
-        } catch (Throwable e) {
-            getLog().debug(e);
-            throw new MojoExecutionException(e.getMessage(), e);
+        return args;
+    }
+
+    private void processJavaClass(List<String> args) throws MojoExecutionException {
+        if (!fork) {
+            try {
+                CommandInterfaceUtils.commandCommonMain();
+                JavaToWS j2w = new JavaToWS(args.toArray(new String[args.size()]));
+                j2w.run();
+            } catch (OutOfMemoryError e) {
+                getLog().debug(e);
+
+                StringBuffer msg = new StringBuffer();
+                msg.append(e.getMessage()).append('\n');
+                msg.append("Try to run this goal using the <fork>true</fork> and "
+                        + "<additionalJvmArgs>-Xms128m -Xmx128m</additionalJvmArgs> parameters.");
+                throw new MojoExecutionException(msg.toString(), e);
+            } catch (Throwable e) {
+                getLog().debug(e);
+                throw new MojoExecutionException(e.getMessage(), e);
+            }
+        } else {
+            getLog().info("Running java2ws in fork mode...");
+
+            Commandline cmd = new Commandline();
+            cmd.getShell().setQuotedArgumentsEnabled(false); // for JVM args
+            cmd.setWorkingDirectory(project.getBuild().getDirectory());
+            try {
+                cmd.setExecutable(getJavaExecutable().getAbsolutePath());
+            } catch (IOException e) {
+                getLog().debug(e);
+                throw new MojoExecutionException(e.getMessage(), e);
+            }
+
+            cmd.addArguments(args.toArray(new String[args.size()]));
+
+            CommandLineUtils.StringStreamConsumer err = new CommandLineUtils.StringStreamConsumer();
+            CommandLineUtils.StringStreamConsumer out = new CommandLineUtils.StringStreamConsumer();
+
+            int exitCode;
+            try {
+                exitCode = CommandLineUtils.executeCommandLine(cmd, out, err);
+            } catch (CommandLineException e) {
+                getLog().debug(e);
+                throw new MojoExecutionException(e.getMessage(), e);
+            }
+
+            String output = StringUtils.isEmpty(out.getOutput()) ? null : '\n' + out.getOutput().trim();
+
+            String cmdLine = CommandLineUtils.toString(cmd.getCommandline());
+
+            if (exitCode != 0) {
+                if (StringUtils.isNotEmpty(output)) {
+                    getLog().info(output);
+                }
+
+                StringBuffer msg = new StringBuffer("\nExit code: ");
+                msg.append(exitCode);
+                if (StringUtils.isNotEmpty(err.getOutput())) {
+                    msg.append(" - ").append(err.getOutput());
+                }
+                msg.append('\n');
+                msg.append("Command line was: ").append(cmdLine).append('\n').append('\n');
+
+                throw new MojoExecutionException(msg.toString());
+            }
+
+            if (StringUtils.isNotEmpty(err.getOutput()) && err.getOutput().contains("JavaToWS Error")) {
+                StringBuffer msg = new StringBuffer();
+                msg.append(err.getOutput());
+                msg.append('\n');
+                msg.append("Command line was: ").append(cmdLine).append('\n').append('\n');
+                throw new MojoExecutionException(msg.toString());
+            }
         }
 
         // Attach the generated wsdl file to the artifacts that get deployed
         // with the enclosing project
         if (attachWsdl && outputFile != null) {
             File wsdlFile = new File(outputFile);
-            projectHelper.attachArtifact(project, "wsdl", wsdlFile);
+            if (wsdlFile.exists()) {
+                projectHelper.attachArtifact(project, "wsdl", wsdlFile);
+            }
+        }
+    }
+
+    private File getJavaExecutable() throws IOException {
+        String exe = (SystemUtils.IS_OS_WINDOWS && !javaExecutable.endsWith(".exe")) ? ".exe" : "";
+        File javaExe = new File(javaExecutable + exe);
+
+        if (!javaExe.isFile()) {
+            throw new IOException("The java executable '" + javaExe
+                + "' doesn't exist or is not a file. Verify the <javaExecutable/> parameter.");
         }
+
+        return javaExe;
     }
-       
 }
\ No newline at end of file

Modified: cxf/trunk/systests/wsdl_maven/java2ws/pom.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/wsdl_maven/java2ws/pom.xml?rev=1038386&r1=1038385&r2=1038386&view=diff
==============================================================================
--- cxf/trunk/systests/wsdl_maven/java2ws/pom.xml (original)
+++ cxf/trunk/systests/wsdl_maven/java2ws/pom.xml Tue Nov 23 23:42:45 2010
@@ -56,6 +56,7 @@
 							<genWsdl>true</genWsdl>
 							<verbose>true</verbose>
 							<attachWsdl>true</attachWsdl>
+                            <fork>true</fork>
 						</configuration>
 						<goals>
 							<goal>java2ws</goal>