[jbossws-commits] JBossWS SVN: r17246 - stack/cxf/trunk/modules/client/src/main/java/org/jboss/wsf/stack/cxf/tools.

jbossws-commits at lists.jboss.org jbossws-commits at lists.jboss.org
Fri Jan 25 06:18:01 EST 2013


Author: alessio.soldano at jboss.com
Date: 2013-01-25 06:18:01 -0500 (Fri, 25 Jan 2013)
New Revision: 17246

Modified:
   stack/cxf/trunk/modules/client/src/main/java/org/jboss/wsf/stack/cxf/tools/CXFConsumerImpl.java
Log:
[JBWS-3589] Setting custom CXF compiler in ToolContext


Modified: stack/cxf/trunk/modules/client/src/main/java/org/jboss/wsf/stack/cxf/tools/CXFConsumerImpl.java
===================================================================
--- stack/cxf/trunk/modules/client/src/main/java/org/jboss/wsf/stack/cxf/tools/CXFConsumerImpl.java	2013-01-25 11:08:14 UTC (rev 17245)
+++ stack/cxf/trunk/modules/client/src/main/java/org/jboss/wsf/stack/cxf/tools/CXFConsumerImpl.java	2013-01-25 11:18:01 UTC (rev 17246)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -24,12 +24,31 @@
 import static org.jboss.wsf.stack.cxf.Messages.MESSAGES;
 
 import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.io.PrintStream;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
+import javax.tools.FileObject;
+import javax.tools.ForwardingJavaFileManager;
+import javax.tools.JavaFileManager;
+import javax.tools.JavaFileObject;
+import javax.tools.JavaFileObject.Kind;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.StandardLocation;
+import javax.xml.ws.spi.Provider;
+
+import org.apache.cxf.common.util.Compiler;
 import org.apache.cxf.helpers.FileUtils;
+import org.apache.cxf.tools.common.ToolConstants;
 import org.apache.cxf.tools.common.ToolContext;
 import org.apache.cxf.tools.wsdlto.WSDLToJava;
 import org.jboss.ws.api.tools.WSContractConsumer;
@@ -257,7 +276,9 @@
       WSDLToJava w2j = new WSDLToJava(args.toArray(new String[0]));
       try
       {
-         w2j.run(new ToolContext(), stream);
+         ToolContext ctx = new ToolContext();
+         ctx.put(ToolConstants.COMPILER, new JBossModulesAwareCompiler());
+         w2j.run(ctx, stream);
       }
       catch (Throwable t)
       {
@@ -279,4 +300,145 @@
          }
       }
    }
+   
+
+   /**
+    * A CXF Compiler that installs a custom JavaFileManager to load JAXWS and JAXB apis from
+    * the proper JBoss module (the one providing the JAXWS SPI Provider) instead of from the
+    * JDK boot classpath.
+    */
+   private final class JBossModulesAwareCompiler extends Compiler
+   {
+      @Override
+      protected JavaFileManager wrapJavaFileManager(StandardJavaFileManager standardJavaFileManger)
+      {
+         return new CustomJavaFileManager(standardJavaFileManger);
+      }
+   }
+
+   final class CustomJavaFileManager extends ForwardingJavaFileManager<JavaFileManager>
+   {
+      private ClassLoader classLoader = Provider.provider().getClass().getClassLoader();
+
+      protected CustomJavaFileManager(JavaFileManager fileManager)
+      {
+         super(fileManager);
+      }
+
+      public ClassLoader getClassLoader(Location location)
+      {
+         //TODO evaluate replacing with return new DelegateClassLoader(super.getClassLoader(location), classLoader);
+         return classLoader;
+      }
+
+      @Override
+      public FileObject getFileForInput(Location location, String packageName, String relativeName) throws IOException
+      {
+         return super.getFileForInput(location, packageName, relativeName);
+      }
+
+      @Override
+      public String inferBinaryName(Location loc, JavaFileObject file)
+      {
+         String result;
+         if (file instanceof JavaFileObjectImpl)
+            result = file.getName();
+         else
+            result = super.inferBinaryName(loc, file);
+         return result;
+      }
+
+      @Override
+      public Iterable<JavaFileObject> list(Location location, String packageName, Set<Kind> kinds, boolean recurse)
+            throws IOException
+      {
+         Iterable<JavaFileObject> result = super.list(location, packageName, kinds, recurse);
+         List<JavaFileObject> files = new ArrayList<JavaFileObject>();
+         if (location == StandardLocation.PLATFORM_CLASS_PATH && kinds.contains(JavaFileObject.Kind.CLASS))
+         {
+            List<JavaFileObject> resultFiltered = new ArrayList<JavaFileObject>();
+            for (Iterator<JavaFileObject> it = result.iterator(); it.hasNext();)
+            {
+               final JavaFileObject obj = it.next();
+               final String objName = obj.getName();
+               Class<?> clazz = null;
+               final String className = packageName + "." + objName.substring(0, objName.length() - 6);
+               try
+               {
+                  clazz = classLoader.loadClass(className);
+               }
+               catch (ClassNotFoundException cnfe)
+               {
+                  //NOOP
+               }
+               boolean added = false;
+               if (clazz != null)
+               {
+                  ClassLoader loader = clazz.getClassLoader();
+                  if (loader != null)
+                  {
+                     files.add(new JavaFileObjectImpl(className, loader));
+                     added = true;
+                  }
+               }
+               if (!added)
+               {
+                  resultFiltered.add(obj);
+               }
+            }
+            for (JavaFileObject file : resultFiltered)
+            {
+               files.add(file);
+            }
+         }
+         else
+         {
+            for (JavaFileObject file : result)
+            {
+               files.add(file);
+            }
+         }
+         return files;
+      }
+   }
+
+   final class JavaFileObjectImpl extends SimpleJavaFileObject
+   {
+
+      private ClassLoader loader;
+
+      private final String key;
+
+      JavaFileObjectImpl(String fqClassName, ClassLoader loader)
+      {
+         super(toURI(fqClassName), JavaFileObject.Kind.CLASS);
+         this.loader = loader;
+         this.key = "/" + fqClassName.replace(".", "/") + ".class";
+      }
+
+      @Override
+      public InputStream openInputStream()
+      {
+         return loader.getResourceAsStream(key);
+      }
+
+      @Override
+      public OutputStream openOutputStream()
+      {
+         throw new UnsupportedOperationException();
+      }
+   }
+
+   static URI toURI(String name)
+   {
+      try
+      {
+         return new URI(name);
+      }
+      catch (URISyntaxException e)
+      {
+         throw new RuntimeException(e);
+      }
+   }
+
 }



More information about the jbossws-commits mailing list