You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ga...@apache.org on 2007/08/14 03:22:29 UTC

svn commit: r565600 - /geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WsdlGenerator.java

Author: gawor
Date: Mon Aug 13 18:22:28 2007
New Revision: 565600

URL: http://svn.apache.org/viewvc?view=rev&rev=565600
Log:
fork wsgen process on windows (GERONIMO-3405)

Modified:
    geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WsdlGenerator.java

Modified: geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WsdlGenerator.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WsdlGenerator.java?view=diff&rev=565600&r1=565599&r2=565600
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WsdlGenerator.java (original)
+++ geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WsdlGenerator.java Mon Aug 13 18:22:28 2007
@@ -27,6 +27,7 @@
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 import java.util.Random;
@@ -39,7 +40,6 @@
 import org.apache.geronimo.common.DeploymentException;
 import org.apache.geronimo.deployment.DeploymentConfigurationManager;
 import org.apache.geronimo.deployment.DeploymentContext;
-import org.apache.geronimo.j2ee.deployment.EARContext;
 import org.apache.geronimo.j2ee.deployment.Module;
 import org.apache.geronimo.jaxws.PortInfo;
 import org.apache.geronimo.kernel.repository.Artifact;
@@ -50,6 +50,8 @@
 
     private static final Log LOG = LogFactory.getLog(WsdlGenerator.class);
     
+    private final static String FORK_WSGEN_PROPERTY = "org.apache.geronimo.jaxws.wsgen.fork";
+    
     private final static Artifact AXIS2_JAXWS_API_ARTIFACT = new Artifact("org.apache.axis2","axis2-jaxws-api", (Version)null, "jar");
     private final static Artifact AXIS2_SAAJ_API_ARTIFACT = new Artifact("org.apache.axis2","axis2-saaj-api", (Version)null, "jar");
     private final static Artifact AXIS2_SAAJ_IMPL_ARTIFACT = new Artifact("org.apache.axis2","axis2-saaj", (Version)null, "jar");
@@ -68,7 +70,23 @@
     private Artifact saajImpl;
     private QName wsdlService;
     private QName wsdlPort;
+    private boolean forkWsgen = getForkWsgen();
         
+    private static boolean getForkWsgen() {
+        String value = System.getProperty(FORK_WSGEN_PROPERTY);
+        if (value != null) {
+            return Boolean.valueOf(value).booleanValue();
+        } else {
+            String osName = System.getProperty("os.name");
+            if (osName == null) {
+                return false;
+            }
+            osName = osName.toLowerCase();
+            // Fork on Windows only
+            return (osName.indexOf("windows") != -1);            
+        }
+    }
+    
     public WsdlGenerator() {
     }
     
@@ -329,20 +347,12 @@
         String[] arguments = buildArguments(serviceClass, classPath.toString(), baseDir, portInfo);
         
         try {
-            URLClassLoader loader = new URLClassLoader(urls, ClassLoader.getSystemClassLoader());
-            Class clazz = loader.loadClass("com.sun.tools.ws.spi.WSToolsObjectFactory");
-            Method method = clazz.getMethod("newInstance");
-            Object factory = method.invoke(null);
-            Method method2 = clazz.getMethod("wsgen", OutputStream.class, String[].class);
-            ByteArrayOutputStream os = new ByteArrayOutputStream();
-            Boolean result = (Boolean) method2.invoke(factory, os, arguments);
-            os.close();
-            
-            byte [] arr = os.toByteArray();
-            String wsgenOutput = new String(arr, 0, arr.length);
+            boolean result = false;
             
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("wsgen output: " + wsgenOutput);
+            if (this.forkWsgen) {
+                result = forkWsgen(classPath, arguments);
+            } else {
+                result = invokeWsgen(urls, arguments);
             }
             
             if (result) {
@@ -353,12 +363,65 @@
                 }
                 return getRelativeNameOrURL(moduleBase, wsdlFile);
             } else {
-                throw new DeploymentException("wsgen failed: " + wsgenOutput);
-            }
+                throw new DeploymentException("wsgen failed");
+            }            
+                                 
         } catch (DeploymentException e) {
             throw e;
         } catch (Exception e) {
             throw new DeploymentException("Unable to generate the wsdl file using wsgen.", e);
+        }
+    }
+
+    private boolean invokeWsgen(URL[] urls, String[] arguments) throws Exception {
+        URLClassLoader loader = new URLClassLoader(urls, ClassLoader.getSystemClassLoader());
+        Class clazz = loader.loadClass("com.sun.tools.ws.spi.WSToolsObjectFactory");
+        Method method = clazz.getMethod("newInstance");
+        Object factory = method.invoke(null);
+        Method method2 = clazz.getMethod("wsgen", OutputStream.class, String[].class);
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        
+        LOG.debug("Invoking wsgen");
+        
+        Boolean result = (Boolean) method2.invoke(factory, os, arguments);
+        os.close();
+        
+        byte [] arr = os.toByteArray();
+        String wsgenOutput = new String(arr, 0, arr.length);
+        
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("wsgen output: " + wsgenOutput);
+        }
+        
+        return result;
+    }
+    
+    private boolean forkWsgen(StringBuilder classPath, String[] arguments) throws Exception {           
+        List<String> cmd = new ArrayList<String>();
+        String javaHome = System.getProperty("java.home");                       
+        String java = javaHome + File.separator + "bin" + File.separator + "java";
+        cmd.add(java);
+        cmd.add("-classpath");
+        cmd.add(classPath.toString());
+        cmd.add("com.sun.tools.ws.WsGen");
+        cmd.addAll(Arrays.asList(arguments));
+        
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Executing wsgen: " + cmd);
+        }
+                
+        String [] cmdArray = (String[]) cmd.toArray(new String[] {});
+        
+        Process process = Runtime.getRuntime().exec(cmdArray);
+        int errorCode = process.waitFor();
+        
+        if (errorCode == 0) {
+            return true;
+        } else {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("wsgen error code: " + errorCode);
+            }
+            return false;
         }
     }
 }