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));
+ }
+ }
}