Author: jochen
Date: Fri Aug 19 05:41:20 2005
New Revision: 233473

URL: http://svn.apache.org/viewcvs?rev=233473&view=rev
Log:
Fixed the ChainGenerator's dependency on the class path

Removed:
    
webservices/jaxme/branches/MAVEN/projects/js/src/test/java/org/apache/ws/jaxme/js/junit/VersionTest.java
Modified:
    webservices/jaxme/branches/MAVEN/projects/api/   (props changed)
    webservices/jaxme/branches/MAVEN/projects/jm/   (props changed)
    webservices/jaxme/branches/MAVEN/projects/jm/maven.xml
    webservices/jaxme/branches/MAVEN/projects/js/   (props changed)
    webservices/jaxme/branches/MAVEN/projects/js/maven.xml
    
webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/Ant.java
    
webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/ChainGenerator.java
    
webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/InterfaceDescription.java
    webservices/jaxme/branches/MAVEN/projects/xs/   (props changed)

Propchange: webservices/jaxme/branches/MAVEN/projects/api/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Aug 19 05:41:20 2005
@@ -0,0 +1,2 @@
+
+target

Propchange: webservices/jaxme/branches/MAVEN/projects/jm/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Aug 19 05:41:20 2005
@@ -0,0 +1,2 @@
+
+target

Modified: webservices/jaxme/branches/MAVEN/projects/jm/maven.xml
URL: 
http://svn.apache.org/viewcvs/webservices/jaxme/branches/MAVEN/projects/jm/maven.xml?rev=233473&r1=233472&r2=233473&view=diff
==============================================================================
--- webservices/jaxme/branches/MAVEN/projects/jm/maven.xml (original)
+++ webservices/jaxme/branches/MAVEN/projects/jm/maven.xml Fri Aug 19 05:41:20 
2005
@@ -33,7 +33,7 @@
        <ant:taskdef name="chainGenerator" 
classname="org.apache.ws.jaxme.js.pattern.Ant$AntChainGenerator"

                        classpathref="jm.class.path"/>  

                

-       <ant:chainGenerator destDir="${build.jm.src}">

+       <ant:chainGenerator destDir="${build.jm.src}" srcDir="src/main/java">

                        <ant:chain

                 
controllerInterfaceName="org.apache.ws.jaxme.generator.sg.AttributeSG"

                 
chainInterfaceName="org.apache.ws.jaxme.generator.sg.AttributeSGChain"


Propchange: webservices/jaxme/branches/MAVEN/projects/js/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Aug 19 05:41:20 2005
@@ -0,0 +1,2 @@
+
+target

Modified: webservices/jaxme/branches/MAVEN/projects/js/maven.xml
URL: 
http://svn.apache.org/viewcvs/webservices/jaxme/branches/MAVEN/projects/js/maven.xml?rev=233473&r1=233472&r2=233473&view=diff
==============================================================================
--- webservices/jaxme/branches/MAVEN/projects/js/maven.xml (original)
+++ webservices/jaxme/branches/MAVEN/projects/js/maven.xml Fri Aug 19 05:41:20 
2005
@@ -60,25 +60,6 @@
             <ant:serverClasses dir="${pom.build.unitTestSourceDirectory}" 
includes="**/XmlRpcClientTestRemoteClass.java"/>

     </ant:xmlRpcGenerator>   

 

-    <ant:sql

-            
src="${pom.build.unitTestSourceDirectory}/org/apache/ws/jaxme/js/junit/create.sql"

-            driver="${jdbc.driver}"

-            url="${jdbc.url}"

-            userid="${jdbc.user}"

-            password="${jdbc.password}"             

-            classpathref="js.test.path"

-            caching="false"/>

-

-    <ant:versionGenerator driver="${jdbc.driver}"

-                              url="${jdbc.url}"

-                             user="${jdbc.user}"

-                         password="${jdbc.password}"

-                           tables="MAIN SUB SUBSUB"

-                        verColumn="VER"

-                      targetClass="org.apache.ws.jaxme.js.junit.MAINCloner"

-                generatingLogging="true"

-                          destDir="${JS.build.test}"/>

-

        <ant:path id="generated.test.src"

               location="${JS.build.test}"/>

 


Modified: 
webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/Ant.java
URL: 
http://svn.apache.org/viewcvs/webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/Ant.java?rev=233473&r1=233472&r2=233473&view=diff
==============================================================================
--- 
webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/Ant.java
 (original)
+++ 
webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/Ant.java
 Fri Aug 19 05:41:20 2005
@@ -227,9 +227,12 @@
     /** Adds a new interface being implemented.
      */
     public InterfaceDescription createImplementedInterface() {
-      InterfaceDescription result = new InterfaceDescription();
-      implementedInterfaces.add(result);
-      return result;
+       ClassLoader cl = Thread.currentThread().getContextClassLoader();
+       if (cl == null) {
+               cl = ClassLoader.getSystemClassLoader();
+       InterfaceDescription result = new InterfaceDescription(cl);
+       implementedInterfaces.add(result);
+       return result;
     }
     public void finish() {
        super.finish();
@@ -294,37 +297,50 @@
   /** Ant task for the [EMAIL PROTECTED] 
org.apache.ws.jaxme.js.pattern.ChainGenerator}.
    */
   public static class AntChainGenerator extends ReallyBasicAntTask {
-     private List chains = new ArrayList();
-     /** Creates a new, nested element with another chain being
-      * generated.
-      */
-     public ChainGenerator createChain() {
-        ChainGenerator chain = new ChainGenerator();
-        chains.add(chain);
-        return chain;
-     }
-     public void finish() {
-        if (chains.size() == 0) {
-           throw new BuildException("At least one nested 'chain' element must 
be given.",
-                                     getLocation());
-        }
-     }
-     public void doExecute() {
-        JavaSourceFactory pFactory = new JavaSourceFactory();
-        for (Iterator iter = chains.iterator();  iter.hasNext();  ) {
-           ChainGenerator chain = (ChainGenerator) iter.next();
-           try {
-                 chain.generate(pFactory);
-           } catch (Exception e) {
-                 throw new BuildException(e, getLocation());
-           }
-        }
-        try {
-           pFactory.write(getDestDir());
-        } catch (IOException e) {
-           throw new BuildException(e, getLocation());
-        }
-     }
+         private final List chains = new ArrayList();
+         private File srcDir;
+         /** Creates a new, nested element with another chain being
+          * generated.
+          */
+         public ChainGenerator createChain() {
+                 ChainGenerator chain = new ChainGenerator();
+                 chains.add(chain);
+                 return chain;
+         }
+         public void setSrcDir(File pSrcDir) {
+                 srcDir = pSrcDir;
+         }
+         public void finish() {
+                 if (chains.size() == 0) {
+                         throw new BuildException("At least one nested 'chain' 
element must be given.",
+                                         getLocation());
+                 }
+         }
+         public void doExecute() {
+                 ClassLoader cl = 
Thread.currentThread().getContextClassLoader();
+                 if (cl == null) {
+                         cl = ClassLoader.getSystemClassLoader();
+                 }
+                 if (srcDir != null) {
+                         Path path = (Path) 
getProject().createDataType("path");
+                         path.createPathElement().setLocation(srcDir);
+                         cl = new AntClassLoader(getProject(), path);
+                 }
+                 JavaSourceFactory pFactory = new JavaSourceFactory();
+                 for (Iterator iter = chains.iterator();  iter.hasNext();  ) {
+                         ChainGenerator chain = (ChainGenerator) iter.next();
+                         try {
+                                 chain.generate(pFactory, cl);
+                         } catch (Exception e) {
+                                 throw new BuildException(e, getLocation());
+                         }
+                 }
+                 try {
+                         pFactory.write(getDestDir());
+                 } catch (IOException e) {
+                         throw new BuildException(e, getLocation());
+                 }
+         }
   }
 
   /** Ant task for the [EMAIL PROTECTED] 
org.apache.ws.jaxme.js.pattern.VersionGenerator}

Modified: 
webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/ChainGenerator.java
URL: 
http://svn.apache.org/viewcvs/webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/ChainGenerator.java?rev=233473&r1=233472&r2=233473&view=diff
==============================================================================
--- 
webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/ChainGenerator.java
 (original)
+++ 
webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/ChainGenerator.java
 Fri Aug 19 05:41:20 2005
@@ -12,11 +12,10 @@
  * 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.
-
+ 
  */
 package org.apache.ws.jaxme.js.pattern;
 
-import java.io.File;
 import java.io.IOException;
 import java.net.URL;
 import java.util.ArrayList;
@@ -51,339 +50,322 @@
  * @author <a href="mailto:[EMAIL PROTECTED]">Jochen Wiedmann</a>
  */
 public class ChainGenerator {
+       private ClassLoader classLoader;
        private String controllerInterfaceName;
-    private JavaSource controllerInterface;
-    private JavaQName chainInterface, proxyClass, implClass;
-
-    /** <p>Sets the controller interface name.</p>
-     */
-    public void setControllerInterfaceName(String pInterfaceName) throws 
ClassNotFoundException {
-        controllerInterfaceName = pInterfaceName;
-    }
-
-    /** Returns the controller interface.
-     */
-    public JavaSource getControllerInterface() {
-       return controllerInterface;
-    }
-
-    private JavaSource loadSource(ClassLoader pClassLoader,
-                                  String pName,
-                                  JavaSourceFactory pFactory)
-            throws RecognitionException, TokenStreamException, IOException {
-       URL url = pClassLoader.getResource(pName.replace('.', '/') + ".java");
-        if (url == null) {
-            return null;
-        } else {
-            return new SourceReflector(url).getJavaSource(pFactory);
-        }
-    }
-
-    private void loadSources(ClassLoader pClassLoader, JavaQName pQName,
-                             JavaSourceFactory pFactory,
-                             List pSources, Set pNames)
-            throws RecognitionException, TokenStreamException, IOException {
-        if (pNames.contains(pQName)) {
-               return;
-        }
-        pNames.add(pQName);
-        JavaSource js = 
loadSource(Thread.currentThread().getContextClassLoader(),
-                                          pQName.toString(), pFactory);
-        if (js == null) {
-               return;
-        }
-        pSources.add(js);
-        JavaQName[] superInterfaces = js.getExtends();
-        for (int i = 0;  i < superInterfaces.length;  i++) {
-               loadSources(pClassLoader, superInterfaces[i],
-                        pFactory, pSources, pNames);
-        }
-    }
-
-    private JavaSource[] loadSources(ClassLoader pClassLoader, String pName)
-            throws RecognitionException, TokenStreamException, IOException {
-        JavaSourceFactory jsf = new JavaSourceFactory();
-        List sources = new ArrayList();
-        Set names = new HashSet();
-        loadSources(pClassLoader, JavaQNameImpl.getInstance(pName),
-                    jsf, sources, names);
-        if (sources.isEmpty()) {
-               return null;
-        } else {
-               return (JavaSource[]) sources.toArray(new 
JavaSource[sources.size()]);
-        }
-    }
-
-    /** <p>Initializes the controller interface.</p>
-     * @throws ClassNotFoundException
-     * @throws IOException
-     * @throws TokenStreamException
-     * @throws RecognitionException
-     */
-    protected JavaSource[] initControllerInterface()
-            throws ClassNotFoundException, RecognitionException, 
TokenStreamException, IOException {
-        ClassLoader cl = Thread.currentThread().getContextClassLoader();
-        JavaSource[] result;
-        try {
-            if (cl == null) {
-                throw new ClassNotFoundException(controllerInterfaceName);
-            }
-            CompiledClassReflector r = new 
CompiledClassReflector(controllerInterfaceName, cl);
-            result = new JavaSource[]{r.getJavaSource(new 
JavaSourceFactory())};
-        } catch (ClassNotFoundException e) {
-            result = 
loadSources(Thread.currentThread().getContextClassLoader(),
-                                 controllerInterfaceName);
-            if (result == null) {
-               throw e;
-            }
-        }
-        if (!result[0].isInterface()) {
-               throw new ClassCastException("The controller must be an 
interface");
-        }
-        return result;
-   }
-
-   /** <p>Sets the interface name being generated for the chain objects.</p>
-    */
-   public void setChainInterfaceName(String pInterfaceName) {
-      JavaQName qName = JavaQNameImpl.getInstance(pInterfaceName);
-      setChainInterface(qName);
-   }
-
-   /** <p>Sets the interface being generated for the chain objects.</p>
-    */
-   public void setChainInterface(JavaQName pInterface) {
-      chainInterface = pInterface;
-   }
-
-   /** <p>Returns the interface being generated for the chain objects.</p>
-    */
-   public JavaQName getChainInterface() {
-      return chainInterface;
-   }
-
-   /** <p>Sets the class name being generated for the chain objects.</p>
-    */
-   public void setProxyClassName(String pClassName) {
-      JavaQName qName = JavaQNameImpl.getInstance(pClassName);
-      setProxyClass(qName);
-   }
-
-   /** <p>Sets the class being generated for the chain objects.</p>
-    */
-   public void setProxyClass(JavaQName pClassName) {
-      proxyClass = pClassName;
-   }
-
-   /** <p>Returns the class being generated for the chain objects. Defaults
-    * to <code>getChainInterface() + "Impl"</code>.</p>
-    */
-   public JavaQName getProxyClass() {
-      if (proxyClass == null) {
-         JavaQName chainClass = getChainInterface();
-         if (chainClass == null) {
-            return null; 
-         } else {
-            return JavaQNameImpl.getInstance(chainClass.getPackageName(),
-                                                             
chainClass.getClassName() + "Impl");
-         }
-      } else {
-         return proxyClass;
-      }
-   }
-
-   /** <p>Sets the name of the chain implementation class.</p>
-    */
-   public void setImplementationClassName(String pClassName) {
-      setImplementationClass(JavaQNameImpl.getInstance(pClassName));
-   }
-
-   /** <p>Sets the chain implementation class.</p>
-    */
-   public void setImplementationClass(JavaQName pClassName) {
-      implClass = pClassName;
-   }
-
-   /** <p>Returns the chain implementation classes name. Defaults to
-    * <code>getControllerInterface() + "Impl"</code>.</p>
-    */
-   public JavaQName getImplementationClass() {
-      if (implClass == null) {
-         if (controllerInterface == null) {
-            return null;
-         } else {
-            JavaQName controllerClass = controllerInterface.getQName();
-            return JavaQNameImpl.getInstance(controllerClass.getPackageName(),
-                                              controllerClass.getClassName() + 
"Impl");
-         }
-      } else {
-         return implClass;
-      }
-   }
-
-   /** Validates the input data.
-    */
-   public void finish() {
-      if (controllerInterface == null) {
-         throw new NullPointerException("A controller interface must be 
given.");
-      }
-      if (chainInterface == null) {
-         throw new NullPointerException("A chain interface must be given.");
-      }
-   }
-
-   private class ProxyInterfaceGenerator extends ProxyGenerator {
-       public JavaMethod getInterfaceMethod(JavaSource pSource, JavaMethod 
pMethod) {
-               JavaMethod jm = pSource.newJavaMethod(pMethod);
-               Parameter[] parameters = jm.getParams();
-               JavaQName controllerInterfaceQName = 
getControllerInterface().getQName();
-               jm.clearParams();
-               jm.addParam(controllerInterfaceQName, "pController");
-               for (int i = 0;  i < parameters.length;  i++) {
-                       jm.addParam(parameters[i]);
-               }
-               return jm;
-       }
-       public JavaSource generate(JavaSourceFactory pInterfaceFactory,
-                                                          JavaQName 
pTargetClass,
-                                                          
InterfaceDescription[] pDescription) throws Exception {
-               JavaSource result = super.generate(pInterfaceFactory, 
pTargetClass,
-                               pDescription);
-               result.clearImplements();
-               return result;
-       }
-   }
-
-   private class ProxyImplementationGenerator extends ProxyGenerator {
-       protected JavaField getBackingObjectField(JavaSource pJs, 
InterfaceDescription[] pInterfaces) {
-               return pJs.newJavaField("backingObject", getChainInterface(), 
JavaSource.PRIVATE);
-       }
-       protected JavaConstructor getConstructor(JavaSource pJs,
-                                                                               
         InterfaceDescription[] pInterfaces) {
-               JavaConstructor jcon = 
pJs.newJavaConstructor(JavaSource.PROTECTED);
-               jcon.addParam(getChainInterface(), "o");
-               jcon.addIf("o == null");
-               jcon.addThrowNew(NullPointerException.class,
-                               JavaSource.getQuoted("The supplied object must 
not be null."));
-               jcon.addEndIf();
-               jcon.addLine("backingObject = o;");
-               return jcon;
-       }
-
-       public JavaMethod getInterfaceMethod(JavaSource pSource, JavaMethod 
pMethod) {
-               JavaMethod jm = pSource.newJavaMethod(pMethod);
-               Parameter[] parameters = jm.getParams();
-               JavaQName controllerInterfaceQName = 
getControllerInterface().getQName();
-               jm.clearParams();
-               jm.addParam(controllerInterfaceQName, "pController");
-               for (int i = 0;  i < parameters.length;  i++) {
-                       jm.addParam(parameters[i]);
-               }
-               List callParameters = new ArrayList();
-               callParameters.add("pController");
-               for (int i = 0;  i < parameters.length;  i++) {
-                       Parameter parameter = parameters[i];
-                       callParameters.add(", "); 
-                       callParameters.add(parameter.getName());
-               }
-        jm.addLine((JavaQNameImpl.VOID.equals(pMethod.getType()) ? "" : 
"return "),
-                          "backingObject.",
-                                  pMethod.getName(), "(", callParameters, 
");");
-               return jm;
-       }
-       public JavaSource generate(JavaSourceFactory pImplementationFactory,
-                                                          JavaQName 
pTargetClass,
-                                                          
InterfaceDescription[] pDescription) throws Exception {
-               JavaSource result = super.generate(pImplementationFactory, 
pTargetClass, pDescription);
-               result.clearImplements();
-               result.addImplements(getChainInterface());
-               return result;
-       }
-   }
-
-   private class ControllerImplementationGenerator extends ProxyGenerator {
-       protected JavaField getBackingObjectField(JavaSource pJs, 
InterfaceDescription[] pInterfaces) {
-               return pJs.newJavaField("backingObject", getChainInterface(), 
JavaSource.PRIVATE);
-       }
-       protected JavaConstructor getConstructor(JavaSource pJs,
-                                                                               
         InterfaceDescription[] pInterfaces) {
-               JavaConstructor jcon = 
pJs.newJavaConstructor(JavaSource.PUBLIC);
-               jcon.addParam(getChainInterface(), "o");
-               jcon.addIf("o == null");
-               jcon.addThrowNew(NullPointerException.class,
-                               JavaSource.getQuoted("The supplied object must 
not be null."));
-               jcon.addEndIf();
-               jcon.addLine("backingObject = o;");
-               return jcon;
-       }
-       public JavaMethod getInterfaceMethod(JavaSource pSource,
-                                                    JavaMethod pMethod) {
-               JavaMethod jm = pSource.newJavaMethod(pMethod);
-               Parameter[] parameters = jm.getParams();
-               List callParameters = new ArrayList();
-               callParameters.add("this");
-               for (int i = 0;  i < parameters.length;  i++) {
-                       Parameter parameter = parameters[i];
-                       callParameters.add(", "); 
-                       callParameters.add(parameter.getName());
-               }
-               jm.addLine((JavaQNameImpl.VOID.equals(pMethod.getType()) ? "" : 
"return "),
-                               "backingObject.",
-                               pMethod.getName(), "(", callParameters, ");");
-               return jm;
-       }
-       protected JavaMethod getGetHeadOfChainMethod(JavaSource pSource) {
-               JavaMethod jm = pSource.newJavaMethod("getHeadOfChain",
-                               getChainInterface(),
-                               JavaSource.PUBLIC);
-               jm.addLine("return backingObject;");
-               return jm;
-       }
-       public JavaSource generate(JavaSourceFactory pImplementationFactory,
-                                                          JavaQName 
pTargetClass,
-                                                          
InterfaceDescription[] pDescription) throws Exception {
-               JavaSource result = super.generate(pImplementationFactory, 
pTargetClass, pDescription);
-               getGetHeadOfChainMethod(result);
-               return result;
-       }
-   }
-
-   /** Performs the actual work by generating classes using
-    * the given <code>pFactory</code>.
-    */
-   public JavaSource[] generate(JavaSourceFactory pFactory) throws Exception {
-
-      JavaSource[] sources = initControllerInterface();
-      controllerInterface = sources[0];
-      InterfaceDescription[] interfaces = new 
InterfaceDescription[sources.length];
-      for (int i = 0;  i < interfaces.length;  i++) {
-        InterfaceDescription controllerDescription = new 
InterfaceDescription();
-        controllerDescription.setInterface(sources[i].getQName().toString());
-        controllerDescription.setMandatory(true);
-         interfaces[i] = controllerDescription;
-      }
-
-      ProxyGenerator proxyInterfaceGenerator = new ProxyInterfaceGenerator();
-      JavaSource proxyInterface = proxyInterfaceGenerator.generate(pFactory, 
getChainInterface(), interfaces);
-      proxyInterface.setType(JavaSource.INTERFACE);
-
-      ProxyGenerator proxyImpGenerator = new ProxyImplementationGenerator();
-      JavaSource proxyImplementation = proxyImpGenerator.generate(pFactory, 
getProxyClass(), interfaces);
-
-      ProxyGenerator controllerImplementationGenerator = new 
ControllerImplementationGenerator();
-      JavaSource controllerImplementation = 
controllerImplementationGenerator.generate(pFactory, getImplementationClass(), 
interfaces);
-
-      return new JavaSource[]{controllerImplementation, proxyInterface, 
proxyImplementation};
-   }
-
-   public static void main(String[] args) throws Exception {
-          ChainGenerator cg = new ChainGenerator();
-          
cg.setChainInterfaceName("org.apache.ws.jaxme.generator.sg.ComplexTypeSGChain");
-          
cg.setControllerInterfaceName("org.apache.ws.jaxme.generator.sg.ComplexTypeSG");
-          
cg.setImplementationClassName("org.apache.ws.jaxme.generator.sg.ComplexTypeSGImpl");
-          
cg.setProxyClassName("org.apache.ws.jaxme.generator.sg.ComplexTypeSGChainImpl");
-          JavaSourceFactory f = new JavaSourceFactory();
-          cg.generate(f);
-          f.write(new File("/tmp/qName"));
-   }
+       private JavaSource controllerInterface;
+       private JavaQName chainInterface, proxyClass, implClass;
+       
+       /** <p>Sets the controller interface name.</p>
+        */
+       public void setControllerInterfaceName(String pInterfaceName) throws 
ClassNotFoundException {
+               controllerInterfaceName = pInterfaceName;
+       }
+       
+       /** Returns the controller interface.
+        */
+       public JavaSource getControllerInterface() {
+               return controllerInterface;
+       }
+       
+       private JavaSource loadSource(String pName,
+                       JavaSourceFactory pFactory)
+       throws RecognitionException, TokenStreamException, IOException {
+               URL url = classLoader.getResource(pName.replace('.', '/') + 
".java");
+               if (url == null) {
+                       return null;
+               } else {
+                       return new SourceReflector(url).getJavaSource(pFactory);
+               }
+       }
+       
+       private void loadSources(JavaQName pQName,
+                       JavaSourceFactory pFactory,
+                       List pSources, Set pNames)
+       throws RecognitionException, TokenStreamException, IOException {
+               if (pNames.contains(pQName)) {
+                       return;
+               }
+               pNames.add(pQName);
+               JavaSource js = loadSource(pQName.toString(), pFactory);
+               if (js == null) {
+                       return;
+               }
+               pSources.add(js);
+               JavaQName[] superInterfaces = js.getExtends();
+               for (int i = 0;  i < superInterfaces.length;  i++) {
+                       loadSources(superInterfaces[i],
+                                       pFactory, pSources, pNames);
+               }
+       }
+       
+       private JavaSource[] loadSources(String pName)
+       throws RecognitionException, TokenStreamException, IOException {
+               JavaSourceFactory jsf = new JavaSourceFactory();
+               List sources = new ArrayList();
+               Set names = new HashSet();
+               loadSources(JavaQNameImpl.getInstance(pName),
+                               jsf, sources, names);
+               if (sources.isEmpty()) {
+                       return null;
+               } else {
+                       return (JavaSource[]) sources.toArray(new 
JavaSource[sources.size()]);
+               }
+       }
+       
+       /** <p>Initializes the controller interface.</p>
+        * @throws ClassNotFoundException
+        * @throws IOException
+        * @throws TokenStreamException
+        * @throws RecognitionException
+        */
+       protected JavaSource[] initControllerInterface()
+       throws ClassNotFoundException, RecognitionException, 
TokenStreamException, IOException {
+               JavaSource[] result;
+               try {
+                       CompiledClassReflector r = new 
CompiledClassReflector(controllerInterfaceName, classLoader);
+                       result = new JavaSource[]{r.getJavaSource(new 
JavaSourceFactory())};
+               } catch (ClassNotFoundException e) {
+                       result = loadSources(controllerInterfaceName);
+                       if (result == null) {
+                               throw e;
+                       }
+               }
+               if (!result[0].isInterface()) {
+                       throw new ClassCastException("The controller must be an 
interface");
+               }
+               return result;
+       }
+       
+       /** <p>Sets the interface name being generated for the chain 
objects.</p>
+        */
+       public void setChainInterfaceName(String pInterfaceName) {
+               JavaQName qName = JavaQNameImpl.getInstance(pInterfaceName);
+               setChainInterface(qName);
+       }
+       
+       /** <p>Sets the interface being generated for the chain objects.</p>
+        */
+       public void setChainInterface(JavaQName pInterface) {
+               chainInterface = pInterface;
+       }
+       
+       /** <p>Returns the interface being generated for the chain objects.</p>
+        */
+       public JavaQName getChainInterface() {
+               return chainInterface;
+       }
+       
+       /** <p>Sets the class name being generated for the chain objects.</p>
+        */
+       public void setProxyClassName(String pClassName) {
+               JavaQName qName = JavaQNameImpl.getInstance(pClassName);
+               setProxyClass(qName);
+       }
+       
+       /** <p>Sets the class being generated for the chain objects.</p>
+        */
+       public void setProxyClass(JavaQName pClassName) {
+               proxyClass = pClassName;
+       }
+       
+       /** <p>Returns the class being generated for the chain objects. Defaults
+        * to <code>getChainInterface() + "Impl"</code>.</p>
+        */
+       public JavaQName getProxyClass() {
+               if (proxyClass == null) {
+                       JavaQName chainClass = getChainInterface();
+                       if (chainClass == null) {
+                               return null; 
+                       } else {
+                               return 
JavaQNameImpl.getInstance(chainClass.getPackageName(),
+                                               chainClass.getClassName() + 
"Impl");
+                       }
+               } else {
+                       return proxyClass;
+               }
+       }
+       
+       /** <p>Sets the name of the chain implementation class.</p>
+        */
+       public void setImplementationClassName(String pClassName) {
+               setImplementationClass(JavaQNameImpl.getInstance(pClassName));
+       }
+       
+       /** <p>Sets the chain implementation class.</p>
+        */
+       public void setImplementationClass(JavaQName pClassName) {
+               implClass = pClassName;
+       }
+       
+       /** <p>Returns the chain implementation classes name. Defaults to
+        * <code>getControllerInterface() + "Impl"</code>.</p>
+        */
+       public JavaQName getImplementationClass() {
+               if (implClass == null) {
+                       if (controllerInterface == null) {
+                               return null;
+                       } else {
+                               JavaQName controllerClass = 
controllerInterface.getQName();
+                               return 
JavaQNameImpl.getInstance(controllerClass.getPackageName(),
+                                               controllerClass.getClassName() 
+ "Impl");
+                       }
+               } else {
+                       return implClass;
+               }
+       }
+       
+       /** Validates the input data.
+        */
+       public void finish() {
+               if (controllerInterface == null) {
+                       throw new NullPointerException("A controller interface 
must be given.");
+               }
+               if (chainInterface == null) {
+                       throw new NullPointerException("A chain interface must 
be given.");
+               }
+       }
+       
+       private class ProxyInterfaceGenerator extends ProxyGenerator {
+               public JavaMethod getInterfaceMethod(JavaSource pSource, 
JavaMethod pMethod) {
+                       JavaMethod jm = pSource.newJavaMethod(pMethod);
+                       Parameter[] parameters = jm.getParams();
+                       JavaQName controllerInterfaceQName = 
getControllerInterface().getQName();
+                       jm.clearParams();
+                       jm.addParam(controllerInterfaceQName, "pController");
+                       for (int i = 0;  i < parameters.length;  i++) {
+                               jm.addParam(parameters[i]);
+                       }
+                       return jm;
+               }
+               public JavaSource generate(JavaSourceFactory pInterfaceFactory,
+                               JavaQName pTargetClass,
+                               InterfaceDescription[] pDescription) throws 
Exception {
+                       JavaSource result = super.generate(pInterfaceFactory, 
pTargetClass,
+                                       pDescription);
+                       result.clearImplements();
+                       return result;
+               }
+       }
+       
+       private class ProxyImplementationGenerator extends ProxyGenerator {
+               protected JavaField getBackingObjectField(JavaSource pJs, 
InterfaceDescription[] pInterfaces) {
+                       return pJs.newJavaField("backingObject", 
getChainInterface(), JavaSource.PRIVATE);
+               }
+               protected JavaConstructor getConstructor(JavaSource pJs,
+                               InterfaceDescription[] pInterfaces) {
+                       JavaConstructor jcon = 
pJs.newJavaConstructor(JavaSource.PROTECTED);
+                       jcon.addParam(getChainInterface(), "o");
+                       jcon.addIf("o == null");
+                       jcon.addThrowNew(NullPointerException.class,
+                                       JavaSource.getQuoted("The supplied 
object must not be null."));
+                       jcon.addEndIf();
+                       jcon.addLine("backingObject = o;");
+                       return jcon;
+               }
+               
+               public JavaMethod getInterfaceMethod(JavaSource pSource, 
JavaMethod pMethod) {
+                       JavaMethod jm = pSource.newJavaMethod(pMethod);
+                       Parameter[] parameters = jm.getParams();
+                       JavaQName controllerInterfaceQName = 
getControllerInterface().getQName();
+                       jm.clearParams();
+                       jm.addParam(controllerInterfaceQName, "pController");
+                       for (int i = 0;  i < parameters.length;  i++) {
+                               jm.addParam(parameters[i]);
+                       }
+                       List callParameters = new ArrayList();
+                       callParameters.add("pController");
+                       for (int i = 0;  i < parameters.length;  i++) {
+                               Parameter parameter = parameters[i];
+                               callParameters.add(", "); 
+                               callParameters.add(parameter.getName());
+                       }
+                       
jm.addLine((JavaQNameImpl.VOID.equals(pMethod.getType()) ? "" : "return "),
+                                       "backingObject.",
+                                       pMethod.getName(), "(", callParameters, 
");");
+                       return jm;
+               }
+               public JavaSource generate(JavaSourceFactory 
pImplementationFactory,
+                               JavaQName pTargetClass,
+                               InterfaceDescription[] pDescription) throws 
Exception {
+                       JavaSource result = 
super.generate(pImplementationFactory, pTargetClass, pDescription);
+                       result.clearImplements();
+                       result.addImplements(getChainInterface());
+                       return result;
+               }
+       }
+       
+       private class ControllerImplementationGenerator extends ProxyGenerator {
+               protected JavaField getBackingObjectField(JavaSource pJs, 
InterfaceDescription[] pInterfaces) {
+                       return pJs.newJavaField("backingObject", 
getChainInterface(), JavaSource.PRIVATE);
+               }
+               protected JavaConstructor getConstructor(JavaSource pJs,
+                               InterfaceDescription[] pInterfaces) {
+                       JavaConstructor jcon = 
pJs.newJavaConstructor(JavaSource.PUBLIC);
+                       jcon.addParam(getChainInterface(), "o");
+                       jcon.addIf("o == null");
+                       jcon.addThrowNew(NullPointerException.class,
+                                       JavaSource.getQuoted("The supplied 
object must not be null."));
+                       jcon.addEndIf();
+                       jcon.addLine("backingObject = o;");
+                       return jcon;
+               }
+               public JavaMethod getInterfaceMethod(JavaSource pSource,
+                               JavaMethod pMethod) {
+                       JavaMethod jm = pSource.newJavaMethod(pMethod);
+                       Parameter[] parameters = jm.getParams();
+                       List callParameters = new ArrayList();
+                       callParameters.add("this");
+                       for (int i = 0;  i < parameters.length;  i++) {
+                               Parameter parameter = parameters[i];
+                               callParameters.add(", "); 
+                               callParameters.add(parameter.getName());
+                       }
+                       
jm.addLine((JavaQNameImpl.VOID.equals(pMethod.getType()) ? "" : "return "),
+                                       "backingObject.",
+                                       pMethod.getName(), "(", callParameters, 
");");
+                       return jm;
+               }
+               protected JavaMethod getGetHeadOfChainMethod(JavaSource 
pSource) {
+                       JavaMethod jm = pSource.newJavaMethod("getHeadOfChain",
+                                       getChainInterface(),
+                                       JavaSource.PUBLIC);
+                       jm.addLine("return backingObject;");
+                       return jm;
+               }
+               public JavaSource generate(JavaSourceFactory 
pImplementationFactory,
+                               JavaQName pTargetClass,
+                               InterfaceDescription[] pDescription) throws 
Exception {
+                       JavaSource result = 
super.generate(pImplementationFactory, pTargetClass, pDescription);
+                       getGetHeadOfChainMethod(result);
+                       return result;
+               }
+       }
+       
+       /** Performs the actual work by generating classes using
+        * the given <code>pFactory</code>.
+        */
+       public JavaSource[] generate(JavaSourceFactory pFactory, ClassLoader 
pClassLoader) throws Exception {
+               classLoader = pClassLoader;
+               JavaSource[] sources = initControllerInterface();
+               controllerInterface = sources[0];
+               InterfaceDescription[] interfaces = new 
InterfaceDescription[sources.length];
+               for (int i = 0;  i < interfaces.length;  i++) {
+                       InterfaceDescription controllerDescription = new 
InterfaceDescription(classLoader);
+                       
controllerDescription.setInterface(sources[i].getQName().toString());
+                       controllerDescription.setMandatory(true);
+                       interfaces[i] = controllerDescription;
+               }
+               
+               ProxyGenerator proxyInterfaceGenerator = new 
ProxyInterfaceGenerator();
+               JavaSource proxyInterface = 
proxyInterfaceGenerator.generate(pFactory, getChainInterface(), interfaces);
+               proxyInterface.setType(JavaSource.INTERFACE);
+               
+               ProxyGenerator proxyImpGenerator = new 
ProxyImplementationGenerator();
+               JavaSource proxyImplementation = 
proxyImpGenerator.generate(pFactory, getProxyClass(), interfaces);
+               
+               ProxyGenerator controllerImplementationGenerator = new 
ControllerImplementationGenerator();
+               JavaSource controllerImplementation = 
controllerImplementationGenerator.generate(pFactory, getImplementationClass(), 
interfaces);
+               
+               return new JavaSource[]{controllerImplementation, 
proxyInterface, proxyImplementation};
+       }
 }

Modified: 
webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/InterfaceDescription.java
URL: 
http://svn.apache.org/viewcvs/webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/InterfaceDescription.java?rev=233473&r1=233472&r2=233473&view=diff
==============================================================================
--- 
webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/InterfaceDescription.java
 (original)
+++ 
webservices/jaxme/branches/MAVEN/projects/js/src/main/java/org/apache/ws/jaxme/js/pattern/InterfaceDescription.java
 Fri Aug 19 05:41:20 2005
@@ -22,128 +22,114 @@
  * </ol
  */
 public class InterfaceDescription {
-      private boolean isMandatory = true;
-      private String interfaceName;
-      private String type;
-      private JavaSource javaSource;
+       private final ClassLoader classLoader;
+       private boolean isMandatory = true;
+       private String interfaceName;
+       private String type;
+       private JavaSource javaSource;
 
-      private ClassLoader[] getClassLoaders() {
-         return new ClassLoader[]{
-                 Thread.currentThread().getContextClassLoader(),
-                         getClass().getClassLoader(),
-                         ClassLoader.getSystemClassLoader()
-         };
-      }
-      
-      /** Sets the name of the interface being implemented.
-       */
-      public void setInterface(String pName) {
-         interfaceName = pName;
-      }
-      
-      /** Returns the name of the interface being implemented.
-       */
-      public String getInterface() {
-         return interfaceName;
-      }
+       /** Creates a new instance, which uses the given class loader.
+        */
+       public InterfaceDescription(ClassLoader pClassLoader) {
+               classLoader = pClassLoader;
+       }
+
+       /** Sets the name of the interface being implemented.
+        */
+       public void setInterface(String pName) {
+               interfaceName = pName;
+       }
       
-      /** Sets, how to gather information about the interface.
-       * Supported values are "Reflection" (Java reflection),
-       * or "Source" ([EMAIL PROTECTED] 
org.apache.ws.jaxme.js.util.JavaParser}).
-       * The default is null, in which case "Reflection" and "Source"
-       * are tried, in that order.
-       */
-      public void setType(String pType) {
-         if (pType == null
-             ||  "Reflection".equalsIgnoreCase(pType)
-                         ||  "Source".equalsIgnoreCase(pType)) {
-                 type = pType;
-         } else {
-                 throw new IllegalArgumentException("Invalid type: " + pType +
-                                                    ", expected 'Reflection', 
'Source', or null.");
-         }
-      }
+       /** Returns the name of the interface being implemented.
+        */
+       public String getInterface() {
+               return interfaceName;
+       }
       
-      /** Returns, how to gather information about the interface.
-       * Supported values are "Reflection" (Java reflection),
-       * or "Source" ([EMAIL PROTECTED] 
org.apache.ws.jaxme.js.util.JavaParser}).
-       * The default is null, in which case "Reflection" and "Source"
-       * are tried, in that order.
-       */
-      public String getType() {
-         return type;
-      }
+       /** Sets, how to gather information about the interface.
+        * Supported values are "Reflection" (Java reflection),
+        * or "Source" ([EMAIL PROTECTED] 
org.apache.ws.jaxme.js.util.JavaParser}).
+        * The default is null, in which case "Reflection" and "Source"
+        * are tried, in that order.
+        */
+       public void setType(String pType) {
+               if (pType == null
+                               ||  "Reflection".equalsIgnoreCase(pType)
+                               ||  "Source".equalsIgnoreCase(pType)) {
+                       type = pType;
+               } else {
+                       throw new IllegalArgumentException("Invalid type: " + 
pType +
+                       ", expected 'Reflection', 'Source', or null.");
+               }
+       }
       
-      /** Sets whether this interface is mandatory. By default interfaces
-       * are mandatory and the backing objects must implement this interface.
-       * If an interface isn't mandatory, then a Proxy instance can be created
-       * even for objects which don't implement the interface. However, in that
-       * case it may happen that a ClassCastException is thrown while invoking
-       * a method declared by the interface.
-       */
-      public void setMandatory(boolean pMandatory) { isMandatory = pMandatory; 
}
-
-      /** Returns whether this interface is mandatory. By default interfaces
-       * are mandatory and the backing objects must implement this interface.
-       * If an interface isn't mandatory, then a Proxy instance can be created
-       * even for objects which don't implement the interface. However, in that
-       * case it may happen that a ClassCastException is thrown while invoking
-       * a method declared by the interface.
-       */
-      public boolean isMandatory() { return isMandatory; }
-
-      /** Returns an instance of [EMAIL PROTECTED] JavaSource}, matching
-       * the interface [EMAIL PROTECTED] #getInterface()}.
-       */
-      public JavaSource getJavaSource() throws Exception {
-          if (javaSource == null) {
-                 javaSource = initJavaSource();
-          }
-          return javaSource;
-      }
-
-      /** Initializes the object, after all parameters are set.
-       */
-      private JavaSource initJavaSource() throws Exception {
-         Exception ex = null;
-         String mode = getType();
-         if (mode == null  ||  "Reflection".equals(mode)) {
-                 try {
-                  ClassLoader[] cls = getClassLoaders();
-                  for (int i = 0;  i < cls.length;  i++) {
-                         if (cls[i] == null) {
-                          continue;
-                         }
-                      
-                      Class c = cls[i].loadClass(getInterface());
-                      if (c != null) {
-                         return new 
CompiledClassReflector(c).getJavaSource(new JavaSourceFactory());
-                      }
-                  }
-                 } catch (Exception e) {
-                  if (ex == null) {
-                         ex = e;
-                  }
-                 }
-         }
-         if (mode == null  ||  "Source".equals(mode)) {
-                 ClassLoader[] cls = getClassLoaders();
-                 for (int i = 0;  i < cls.length;  i++) {
-                  if (cls[i] == null) {
-                         continue;
-                  }
-                         URL url = 
cls[i].getResource(getInterface().replace('.', '/') + ".java");
-                         if (url != null) {
-                                 SourceReflector reflector = new 
SourceReflector(url);
-                                 return reflector.getJavaSource(new 
JavaSourceFactory());
-                         }
-                 }
-         }
-         if (ex == null) {
-               throw new IllegalStateException("Failed to locate Java class "
-                               + getInterface());
-         } else {
-               throw ex;
-         }
-      }
+       /** Returns, how to gather information about the interface.
+        * Supported values are "Reflection" (Java reflection),
+        * or "Source" ([EMAIL PROTECTED] 
org.apache.ws.jaxme.js.util.JavaParser}).
+        * The default is null, in which case "Reflection" and "Source"
+        * are tried, in that order.
+        */
+       public String getType() {
+               return type;
+       }
+       
+       /** Sets whether this interface is mandatory. By default interfaces
+        * are mandatory and the backing objects must implement this interface.
+        * If an interface isn't mandatory, then a Proxy instance can be created
+        * even for objects which don't implement the interface. However, in 
that
+        * case it may happen that a ClassCastException is thrown while invoking
+        * a method declared by the interface.
+        */
+       public void setMandatory(boolean pMandatory) { isMandatory = 
pMandatory; }
+       
+       /** Returns whether this interface is mandatory. By default interfaces
+        * are mandatory and the backing objects must implement this interface.
+        * If an interface isn't mandatory, then a Proxy instance can be created
+        * even for objects which don't implement the interface. However, in 
that
+        * case it may happen that a ClassCastException is thrown while invoking
+        * a method declared by the interface.
+        */
+       public boolean isMandatory() { return isMandatory; }
+       
+       /** Returns an instance of [EMAIL PROTECTED] JavaSource}, matching
+        * the interface [EMAIL PROTECTED] #getInterface()}.
+        */
+       public JavaSource getJavaSource() throws Exception {
+               if (javaSource == null) {
+                       javaSource = initJavaSource();
+               }
+               return javaSource;
+       }
+       
+       /** Initializes the object, after all parameters are set.
+        */
+       private JavaSource initJavaSource() throws Exception {
+               Exception ex = null;
+               String mode = getType();
+               if (mode == null  ||  "Reflection".equals(mode)) {
+                       try {
+                               Class c = classLoader.loadClass(getInterface());
+                               if (c != null) {
+                                       return new 
CompiledClassReflector(c).getJavaSource(new JavaSourceFactory());
+                               }
+                       } catch (Exception e) {
+                               if (ex == null) {
+                                       ex = e;
+                               }
+                       }
+               }
+               if (mode == null  ||  "Source".equals(mode)) {
+                       URL url = 
classLoader.getResource(getInterface().replace('.', '/') + ".java");
+                       if (url != null) {
+                               SourceReflector reflector = new 
SourceReflector(url);
+                               return reflector.getJavaSource(new 
JavaSourceFactory());
+                       }
+               }
+               if (ex == null) {
+                       throw new IllegalStateException("Failed to locate Java 
class "
+                                       + getInterface());
+               } else {
+                       throw ex;
+               }
+       }
 }

Propchange: webservices/jaxme/branches/MAVEN/projects/xs/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Aug 19 05:41:20 2005
@@ -0,0 +1,2 @@
+
+target



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to