Author: rfeng
Date: Sat May 31 16:18:31 2008
New Revision: 662105

URL: http://svn.apache.org/viewvc?rev=662105&view=rev
Log:
Refactor the JAXWS bean generator and add a test case to demonstrate 
Wrapper2XSD code gen

Added:
    
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/BaseBeanGenerator.java
   (with props)
Modified:
    
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java
    
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/FaultBeanGenerator.java
    
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/GeneratedClassLoader.java
    
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/WrapperBeanGenerator.java
    
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/test/java/org/apache/tuscany/sca/interfacedef/java/jaxws/TestInterface.java
    
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/test/java/org/apache/tuscany/sca/interfacedef/java/jaxws/WrapperBeanGeneratorTestCase.java

Modified: 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java?rev=662105&r1=662104&r2=662105&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java
 Sat May 31 16:18:31 2008
@@ -32,17 +32,14 @@
 import javax.xml.transform.Result;
 import javax.xml.transform.dom.DOMResult;
 
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
 import org.apache.tuscany.sca.databinding.XMLTypeHelper;
 import org.apache.tuscany.sca.interfacedef.util.JavaXMLMapper;
-import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
 import org.apache.tuscany.sca.interfacedef.util.TypeInfo;
 import org.apache.tuscany.sca.interfacedef.util.XMLType;
-import org.apache.tuscany.sca.xsd.XSDefinition;
 import org.apache.tuscany.sca.xsd.XSDFactory;
-
+import org.apache.tuscany.sca.xsd.XSDefinition;
 import org.w3c.dom.Document;
-import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.Node;
 
 public class JAXBTypeHelper implements XMLTypeHelper {
     private static final String SCHEMA_NS = "http://www.w3.org/2001/XMLSchema";;
@@ -79,6 +76,12 @@
         generateJAXBSchemas(definitions, factory);
         return definitions;
     }
+    
+    public static Map<String, DOMResult> generateSchema(JAXBContext context) 
throws IOException {
+        SchemaOutputResolverImpl resolver = new SchemaOutputResolverImpl();
+        context.generateSchema(resolver);
+        return resolver.getResults();
+    }
 
     private void generateJAXBSchemas(List<XSDefinition> definitions, 
XSDFactory factory) {
         if (types.size() > 0) {

Added: 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/BaseBeanGenerator.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/BaseBeanGenerator.java?rev=662105&view=auto
==============================================================================
--- 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/BaseBeanGenerator.java
 (added)
+++ 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/BaseBeanGenerator.java
 Sat May 31 16:18:31 2008
@@ -0,0 +1,193 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.    
+ */
+
+package org.apache.tuscany.sca.interfacedef.java.jaxws;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+public class BaseBeanGenerator implements Opcodes {
+
+    protected void defineClass(ClassWriter cw,
+                               String classDescriptor,
+                               String classSignature,
+                               String namespace,
+                               String name) {
+        declareClass(cw, classDescriptor);
+        annotateClass(cw, name, namespace);
+        declareConstructor(cw, classSignature);
+    }
+
+    protected void declareProperty(ClassWriter cw,
+                                   String classDescriptor,
+                                   String classSignature,
+                                   String propName,
+                                   String propClassSignature,
+                                   String propTypeSignature) {
+        if (propClassSignature.equals(propTypeSignature)) {
+            propTypeSignature = null;
+        }
+        declareField(cw, propName, propClassSignature, propTypeSignature);
+        decalreGetter(cw, classDescriptor, classSignature, propName, 
propClassSignature, propTypeSignature);
+        declareSetter(cw, classDescriptor, classSignature, propName, 
propClassSignature, propTypeSignature);
+    }
+
+    protected String getFieldName(String propName) {
+        if ("return".equals(propName)) {
+            return "_return";
+        } else {
+            return propName;
+        }
+    }
+
+    protected void declareField(ClassWriter cw, String propName, String 
propClassSignature, String propTypeSignature) {
+        FieldVisitor fv;
+        AnnotationVisitor av0;
+        fv = cw.visitField(ACC_PRIVATE, getFieldName(propName), 
propClassSignature, propTypeSignature, null);
+
+        av0 = fv.visitAnnotation("Ljavax/xml/bind/annotation/XmlElement;", 
true);
+        av0.visit("name", propName);
+        av0.visit("namespace", "");
+        av0.visitEnd();
+
+        fv.visitEnd();
+    }
+
+    protected void declareSetter(ClassWriter cw,
+                                 String classDescriptor,
+                                 String classSignature,
+                                 String propName,
+                                 String propClassSignature,
+                                 String propTypeSignature) {
+        MethodVisitor mv =
+            cw.visitMethod(ACC_PUBLIC,
+                           "set" + capitalize(propName),
+                           "(" + propClassSignature + ")V",
+                           propTypeSignature == null ? null : "(" + 
propTypeSignature + ")V",
+                           null);
+        mv.visitCode();
+        Label l0 = new Label();
+        mv.visitLabel(l0);
+        // mv.visitLineNumber(57, l0);
+        mv.visitVarInsn(ALOAD, 0);
+        
mv.visitVarInsn(CodeGenerationHelper.getLoadOPCode(propClassSignature), 1);
+        mv.visitFieldInsn(PUTFIELD, classDescriptor, getFieldName(propName), 
propClassSignature);
+        Label l1 = new Label();
+        mv.visitLabel(l1);
+        // mv.visitLineNumber(58, l1);
+        mv.visitInsn(RETURN);
+        Label l2 = new Label();
+        mv.visitLabel(l2);
+        mv.visitLocalVariable("this", classSignature, null, l0, l2, 0);
+        mv.visitLocalVariable(getFieldName(propName), propClassSignature, 
propTypeSignature, l0, l2, 1);
+        mv.visitMaxs(3, 3);
+        mv.visitEnd();
+
+    }
+
+    protected void decalreGetter(ClassWriter cw,
+                                 String classDescriptor,
+                                 String classSignature,
+                                 String propName,
+                                 String propClassSignature,
+                                 String propTypeSignature) {
+        String getterName = ("B".equals(propClassSignature) ? "is" : "get") + 
capitalize(propName);
+        MethodVisitor mv =
+            cw.visitMethod(ACC_PUBLIC, getterName, "()" + propClassSignature, 
propTypeSignature == null ? null
+                : "()" + propTypeSignature, null);
+        mv.visitCode();
+        Label l0 = new Label();
+        mv.visitLabel(l0);
+        // mv.visitLineNumber(48, l0);
+        mv.visitVarInsn(ALOAD, 0);
+        mv.visitFieldInsn(GETFIELD, classDescriptor, getFieldName(propName), 
propClassSignature);
+        mv.visitInsn(CodeGenerationHelper.getReturnOPCode(propClassSignature));
+        Label l1 = new Label();
+        mv.visitLabel(l1);
+        mv.visitLocalVariable("this", classSignature, null, l0, l1, 0);
+        mv.visitMaxs(2, 1);
+        mv.visitEnd();
+    }
+
+    private static String capitalize(String name) {
+        if (name == null || name.length() == 0) {
+            return name;
+        } else {
+            return Character.toUpperCase(name.charAt(0)) + name.substring(1);
+        }
+    }
+
+    protected void declareConstructor(ClassWriter cw, String classSignature) {
+        MethodVisitor mv;
+        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+        mv.visitCode();
+        Label l0 = new Label();
+        mv.visitLabel(l0);
+        // mv.visitLineNumber(37, l0);
+        mv.visitVarInsn(ALOAD, 0);
+        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
+        mv.visitInsn(RETURN);
+        Label l1 = new Label();
+        mv.visitLabel(l1);
+        mv.visitLocalVariable("this", classSignature, null, l0, l1, 0);
+        mv.visitMaxs(1, 1);
+        mv.visitEnd();
+    }
+
+    protected void declareClass(ClassWriter cw, String classDescriptor) {
+        cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, classDescriptor, null, 
"java/lang/Object", null);
+    }
+
+    protected void annotateClass(ClassWriter cw, String name, String 
namespace) {
+        AnnotationVisitor av0;
+        // @XmlRootElement
+        av0 = cw.visitAnnotation("Ljavax/xml/bind/annotation/XmlRootElement;", 
true);
+        av0.visit("name", name);
+        av0.visit("namespace", namespace);
+        av0.visitEnd();
+        // @XmlAccessorType
+        av0 = 
cw.visitAnnotation("Ljavax/xml/bind/annotation/XmlAccessorType;", true);
+        av0.visitEnum("value", "Ljavax/xml/bind/annotation/XmlAccessType;", 
"FIELD");
+        av0.visitEnd();
+        // @XmlType
+        av0 = cw.visitAnnotation("Ljavax/xml/bind/annotation/XmlType;", true);
+        av0.visit("name", name);
+        av0.visit("namespace", namespace);
+        av0.visitEnd();
+    }
+
+    public Class<?> generate(String classDescriptor,
+                             String classSignature,
+                             String namespace,
+                             String name,
+                             ClassLoader parent) {
+        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+        defineClass(cw, classDescriptor, classSignature, namespace, name);
+        cw.visitEnd();
+        String className = classDescriptor.replace('/', '.');
+        GeneratedClassLoader cl = new GeneratedClassLoader(parent, className, 
cw.toByteArray());
+        Class<?> generated = cl.getGeneratedClass();
+        return generated;
+    }
+
+}

Propchange: 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/BaseBeanGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/BaseBeanGenerator.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/FaultBeanGenerator.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/FaultBeanGenerator.java?rev=662105&r1=662104&r2=662105&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/FaultBeanGenerator.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/FaultBeanGenerator.java
 Sat May 31 16:18:31 2008
@@ -41,17 +41,14 @@
 import org.apache.tuscany.sca.interfacedef.java.impl.JavaInterfaceUtil;
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 
 public class FaultBeanGenerator implements Opcodes {
-    private final ClassWriter writer;
+    private final ClassWriter cw;
     private final Class<?> exceptionClass;
-    private final String className;
     private final String classDescriptor;
+    private final String classSignature;
     private byte[] content;
     private Class<?> faultBeanClass;
 
@@ -60,10 +57,10 @@
 
     public FaultBeanGenerator(Class<? extends Throwable> exceptionClass) {
         super();
-        this.writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+        this.cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
         this.exceptionClass = exceptionClass;
-        this.className = getFaultBeanName(exceptionClass);
-        this.classDescriptor = "L" + className + ";";
+        this.classDescriptor = getFaultBeanName(exceptionClass);
+        this.classSignature = "L" + classDescriptor + ";";
     }
 
     protected List<PropertyDescriptor> getProperties() {
@@ -102,7 +99,7 @@
             for (int i = 0; i < size; i++) {
                 propOrder[i] = props.get(i).getName();
             }
-            addJAXBAnnotations(propOrder);
+            annotateClass(propOrder);
             for (PropertyDescriptor pd : props) {
                 visitProperty(pd);
             }
@@ -111,7 +108,7 @@
     }
 
     protected void visit() {
-        writer.visit(V1_5, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, className, 
null, "java/lang/Object", null);
+        WrapperBeanGenerator.declareClass(cw, classDescriptor);
     }
 
     private static String getFaultBeanName(Class<?> exceptionClass) {
@@ -133,17 +130,6 @@
         return faultBeanName;
     }
 
-    private String getSetterName(PropertyDescriptor pd) {
-        String name = pd.getName();
-        return "set" + Character.toUpperCase(name.charAt(0)) + 
name.substring(1);
-    }
-
-    private String getGetterName(PropertyDescriptor pd) {
-        String name = pd.getName();
-        String prefix = pd.getPropertyType() == boolean.class ? "is" : "get";
-        return prefix + Character.toUpperCase(name.charAt(0)) + 
name.substring(1);
-    }
-
     protected void visitProperty(PropertyDescriptor pd) {
         Method getter = pd.getReadMethod();
         if (getter == null) {
@@ -160,73 +146,18 @@
         // Add the field
         String field = pd.getName();
         String desc = Type.getDescriptor(pd.getPropertyType());
-        FieldVisitor fv = writer.visitField(ACC_PRIVATE, field, desc, null, 
null);
-        fv.visitEnd();
-
-        String getterName = getGetterName(pd);
-        String getterDesc = 
Type.getMethodDescriptor(Type.getType(pd.getPropertyType()), new Type[0]);
-
-        // Add the getter
-        MethodVisitor mv = writer.visitMethod(ACC_PUBLIC, getterName, 
getterDesc, null, null);
-        mv.visitCode();
-        Label l0 = new Label();
-        mv.visitLabel(l0);
-        mv.visitVarInsn(ALOAD, 0);
-        mv.visitFieldInsn(GETFIELD, className, field, desc);
-        mv.visitInsn(CodeGenerationHelper.getReturnOPCode(desc));
-        Label l1 = new Label();
-        mv.visitLabel(l1);
-        mv.visitLocalVariable("this", classDescriptor, null, l0, l1, 0);
-        mv.visitMaxs(1, 1);
-        mv.visitEnd();
-
-        String setterName = getSetterName(pd);
-        String setterDesc =
-            Type.getMethodDescriptor(Type.getType(void.class), new Type[] 
{Type.getType(pd.getPropertyType())});
-        mv = writer.visitMethod(ACC_PUBLIC, setterName, setterDesc, null, 
null);
-
-        mv.visitCode();
-        l0 = new Label();
-        mv.visitLabel(l0);
-        mv.visitVarInsn(ALOAD, 0);
-        mv.visitVarInsn(CodeGenerationHelper.getLoadOPCode(desc), 1);
-        mv.visitFieldInsn(PUTFIELD, className, field, desc);
-        l1 = new Label();
-        mv.visitLabel(l1);
-        mv.visitInsn(RETURN);
-        Label l2 = new Label();
-        mv.visitLabel(l2);
-        mv.visitLocalVariable("this", classDescriptor, null, l0, l2, 0);
-        mv.visitLocalVariable(field, desc, null, l0, l2, 1);
-        mv.visitMaxs(2, 2);
-        mv.visitEnd();
-
+        String genericDesc = 
CodeGenerationHelper.getSignature(pd.getReadMethod().getGenericReturnType());
+        
+        WrapperBeanGenerator.declareProperty(cw, classDescriptor, 
classSignature, field, desc, genericDesc);
     }
 
     protected void visitEnd() {
-        addDefaultConstructor();
-        writer.visitEnd();
-        content = writer.toByteArray();
-    }
-
-    protected void addDefaultConstructor() {
-        MethodVisitor mv = writer.visitMethod(ACC_PUBLIC, "<init>", "()V", 
null, null);
-        mv.visitCode();
-        Label label0 = new Label();
-        mv.visitLabel(label0);
-        mv.visitVarInsn(ALOAD, 0);
-        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
-        Label label1 = new Label();
-        mv.visitLabel(label1);
-        mv.visitInsn(RETURN);
-        Label lable2 = new Label();
-        mv.visitLabel(lable2);
-        mv.visitLocalVariable("this", classDescriptor, null, label0, lable2, 
0);
-        mv.visitMaxs(1, 1);
-        mv.visitEnd();
+        WrapperBeanGenerator.declareConstructor(cw, classSignature);
+        cw.visitEnd();
+        content = cw.toByteArray();
     }
 
-    protected void addJAXBAnnotations(String[] propOrder) {
+    protected void annotateClass(String[] propOrder) {
         WebFault webFault = exceptionClass.getAnnotation(WebFault.class);
         String ns = null, name = null;
         if (webFault != null) {
@@ -240,13 +171,13 @@
             name = exceptionClass.getSimpleName();
         }
         String desc = Type.getDescriptor(XmlRootElement.class);
-        AnnotationVisitor av = writer.visitAnnotation(desc, true);
+        AnnotationVisitor av = cw.visitAnnotation(desc, true);
         av.visit("namespace", ns);
         av.visit("name", name);
         av.visitEnd();
 
         desc = Type.getDescriptor(XmlType.class);
-        av = writer.visitAnnotation(desc, true);
+        av = cw.visitAnnotation(desc, true);
         av.visit("namespace", ns);
         av.visit("name", name);
         AnnotationVisitor pv = av.visitArray("propOrder");
@@ -257,7 +188,7 @@
         av.visitEnd();
 
         desc = Type.getDescriptor(XmlAccessorType.class);
-        av = writer.visitAnnotation(desc, true);
+        av = cw.visitAnnotation(desc, true);
         av.visitEnum("value", Type.getDescriptor(XmlAccessType.class), 
"FIELD");
         av.visitEnd();
 
@@ -266,14 +197,14 @@
     public Class<?> getFaultBeanClass() {
         if (faultBeanClass == null && content != null) {
             faultBeanClass =
-                new GeneratedClassLoader(exceptionClass.getClassLoader(), 
className.replace('/', '.'), content)
+                new GeneratedClassLoader(exceptionClass.getClassLoader(), 
classDescriptor.replace('/', '.'), content)
                     .getGeneratedClass();
         }
         return faultBeanClass;
     }
 
     public String getClassName() {
-        return className.replace('/', '.');
+        return classDescriptor.replace('/', '.');
     }
 
     public byte[] getContent() {

Modified: 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/GeneratedClassLoader.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/GeneratedClassLoader.java?rev=662105&r1=662104&r2=662105&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/GeneratedClassLoader.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/GeneratedClassLoader.java
 Sat May 31 16:18:31 2008
@@ -20,11 +20,21 @@
 package org.apache.tuscany.sca.interfacedef.java.jaxws;
 
 import java.security.SecureClassLoader;
+import java.util.HashMap;
+import java.util.Map;
 
 public class GeneratedClassLoader extends SecureClassLoader {
     private String className;
     private byte[] content;
     private Class<?> cls;
+    
+    private static class GeneratedClass {
+        private String className;
+        private byte[] content;
+        private Class<?> cls;
+    }
+    
+    private Map<String, GeneratedClass> generatedClasses = new HashMap<String, 
GeneratedClass>();
 
     public GeneratedClassLoader(ClassLoader parentLoader, String className, 
byte[] content) {
         super(parentLoader);

Modified: 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/WrapperBeanGenerator.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/WrapperBeanGenerator.java?rev=662105&r1=662104&r2=662105&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/WrapperBeanGenerator.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/WrapperBeanGenerator.java
 Sat May 31 16:18:31 2008
@@ -42,8 +42,8 @@
                                      String wrapperClassSignature,
                                      String wrapperNamespace,
                                      String wrapperName) {
-        declareWrapperClass(cw, wrapperClassDescriptor);
-        annotateWrapperClass(cw, wrapperName, wrapperNamespace);
+        declareClass(cw, wrapperClassDescriptor);
+        annotateClass(cw, wrapperName, wrapperNamespace);
         declareConstructor(cw, wrapperClassSignature);
     }
 
@@ -78,7 +78,7 @@
             //            if (paramTypes[i].isPrimitive()) {
             //                propTypeSignature = null;
             //            }
-            processProperty(cw,
+            declareProperty(cw,
                             wrapperClassDescriptor,
                             wrapperClassSignature,
                             propName,
@@ -110,7 +110,7 @@
             //        if (returnType.isPrimitive()) {
             //            propTypeSignature = null;
             //        }
-            processProperty(cw,
+            declareProperty(cw,
                             wrapperClassDescriptor,
                             wrapperClassSignature,
                             propName,
@@ -124,15 +124,15 @@
         return generated;
     }
 
-    private static void processProperty(ClassWriter cw,
-                                        String classDescriptor,
-                                        String wrapperClassSignature,
-                                        String propName,
-                                        String propClassSignature,
-                                        String propTypeSignature) {
-        //        if (propClassSignature.equals(propTypeSignature)) {
-        //            propTypeSignature = null;
-        //        }
+    public static void declareProperty(ClassWriter cw,
+                                       String classDescriptor,
+                                       String wrapperClassSignature,
+                                       String propName,
+                                       String propClassSignature,
+                                       String propTypeSignature) {
+        if (propClassSignature.equals(propTypeSignature)) {
+            propTypeSignature = null;
+        }
         declareField(cw, propName, propClassSignature, propTypeSignature);
         decalreGetter(cw, classDescriptor, wrapperClassSignature, propName, 
propClassSignature, propTypeSignature);
         declareSetter(cw, classDescriptor, wrapperClassSignature, propName, 
propClassSignature, propTypeSignature);
@@ -230,7 +230,7 @@
         }
     }
 
-    private static void declareConstructor(ClassWriter cw, String 
wrapperClassSignature) {
+    public static void declareConstructor(ClassWriter cw, String 
wrapperClassSignature) {
         MethodVisitor mv;
         mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
         mv.visitCode();
@@ -247,11 +247,11 @@
         mv.visitEnd();
     }
 
-    private static void declareWrapperClass(ClassWriter cw, String 
classDescriptor) {
+    public static void declareClass(ClassWriter cw, String classDescriptor) {
         cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, classDescriptor, null, 
"java/lang/Object", null);
     }
 
-    private static void annotateWrapperClass(ClassWriter cw, String 
wrapperName, String wrapperNamespace) {
+    private static void annotateClass(ClassWriter cw, String wrapperName, 
String wrapperNamespace) {
         AnnotationVisitor av0;
         // @XmlRootElement
         av0 = cw.visitAnnotation("Ljavax/xml/bind/annotation/XmlRootElement;", 
true);

Modified: 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/test/java/org/apache/tuscany/sca/interfacedef/java/jaxws/TestInterface.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-java-jaxws/src/test/java/org/apache/tuscany/sca/interfacedef/java/jaxws/TestInterface.java?rev=662105&r1=662104&r2=662105&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/test/java/org/apache/tuscany/sca/interfacedef/java/jaxws/TestInterface.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/test/java/org/apache/tuscany/sca/interfacedef/java/jaxws/TestInterface.java
 Sat May 31 16:18:31 2008
@@ -28,4 +28,6 @@
     int convert(String currency1, String currency2);
     List<Double> getRates(String currency);
     void check(boolean flag);
+    String[] list(int[] list);
+    int[][] map(String[][] strs);
 }

Modified: 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/test/java/org/apache/tuscany/sca/interfacedef/java/jaxws/WrapperBeanGeneratorTestCase.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/interface-java-jaxws/src/test/java/org/apache/tuscany/sca/interfacedef/java/jaxws/WrapperBeanGeneratorTestCase.java?rev=662105&r1=662104&r2=662105&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/test/java/org/apache/tuscany/sca/interfacedef/java/jaxws/WrapperBeanGeneratorTestCase.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/interface-java-jaxws/src/test/java/org/apache/tuscany/sca/interfacedef/java/jaxws/WrapperBeanGeneratorTestCase.java
 Sat May 31 16:18:31 2008
@@ -24,10 +24,14 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.List;
+import java.util.Map;
 
 import javax.xml.bind.JAXBContext;
+import javax.xml.transform.dom.DOMResult;
 
 import org.apache.tuscany.sca.databinding.jaxb.JAXBContextHelper;
+import org.apache.tuscany.sca.databinding.jaxb.JAXBTypeHelper;
+import org.apache.tuscany.sca.databinding.xml.Node2String;
 import org.junit.Test;
 
 /**
@@ -57,4 +61,15 @@
             System.out.println(sw.toString());
         }
     }
+
+    @Test
+    public void testGenerateSchema() throws Exception {
+        List<Class<?>> classes = 
WrapperBeanGenerator.generateWrapperBeans(TestInterface.class);
+        JAXBContext context = JAXBContext.newInstance(classes.toArray(new 
Class[0]));
+        Map<String, DOMResult> results = 
JAXBTypeHelper.generateSchema(context);
+        Node2String t = new Node2String();
+        for (DOMResult d : results.values()) {
+            System.out.println(t.transform(d.getNode(), null));
+        }
+    }
 }


Reply via email to