You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by aj...@apache.org on 2006/03/29 08:55:05 UTC
svn commit: r389698 - in /webservices/axis2/trunk/java/modules/codegen:
src/org/apache/axis2/schema/ src/org/apache/axis2/schema/writer/
test-resources/xsd/ test/org/apache/axis2/schema/compile/
Author: ajith
Date: Tue Mar 28 22:55:03 2006
New Revision: 389698
URL: http://svn.apache.org/viewcvs?rev=389698&view=rev
Log:
1.Adding the patch from chuck for handling recursive datatypes
2.Added a testcase (and the relevant xsd) to test this functionality
Added:
webservices/axis2/trunk/java/modules/codegen/test-resources/xsd/simple_recursive.xsd
webservices/axis2/trunk/java/modules/codegen/test/org/apache/axis2/schema/compile/RecursiveCompileTest.java
Modified:
webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java
webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/writer/BeanWriter.java
webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/writer/JavaBeanWriter.java
Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java?rev=389698&r1=389697&r2=389698&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java Tue Mar 28 22:55:03 2006
@@ -1,10 +1,9 @@
package org.apache.axis2.schema;
-import org.apache.axiom.om.OMAttribute;
-import org.apache.axiom.om.OMElement;
import org.apache.axis2.schema.i18n.SchemaCompilerMessages;
import org.apache.axis2.schema.util.SchemaPropertyLoader;
import org.apache.axis2.schema.writer.BeanWriter;
+
import org.apache.ws.commons.schema.XmlSchema;
import org.apache.ws.commons.schema.XmlSchemaAll;
import org.apache.ws.commons.schema.XmlSchemaAny;
@@ -33,6 +32,8 @@
import org.apache.ws.commons.schema.XmlSchemaSimpleTypeRestriction;
import org.apache.ws.commons.schema.XmlSchemaSimpleTypeUnion;
import org.apache.ws.commons.schema.XmlSchemaType;
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
import javax.xml.namespace.QName;
import java.util.ArrayList;
@@ -98,10 +99,10 @@
public static final String EXTRA_ATTRIBUTE_FIELD_NAME = "extraAttributes";
public static final String DEFAULT_CLASS_NAME = OMElement.class.getName();
- public static final String DEFAULT_CLASS_ARRAY_NAME = "org.apache.axiom.om.OMElement[]";
+ public static final String DEFAULT_CLASS_ARRAY_NAME = "org.apache.ws.commons.om.OMElement[]";
public static final String DEFAULT_ATTRIB_CLASS_NAME = OMAttribute.class.getName();
- public static final String DEFAULT_ATTRIB_ARRAY_CLASS_NAME = "org.apache.axiom.om.OMAttribute[]";
+ public static final String DEFAULT_ATTRIB_ARRAY_CLASS_NAME = "org.apache.ws.commons.om.OMAttribute[]";
private static int typeCounter = 0;
@@ -381,7 +382,8 @@
//set a name
schemaType.setName(generatedTypeName.getLocalPart());
writeComplexType((XmlSchemaComplexType)schemaType,
- (BeanWriterMetaInfoHolder)processedAnonymousComplexTypesMap.get(xsElt));
+ (BeanWriterMetaInfoHolder)processedAnonymousComplexTypesMap.get(xsElt),
+ null);
//remove the reference from the anon list since we named the type
processedAnonymousComplexTypesMap.remove(xsElt);
innerElementMap.put(
@@ -423,7 +425,8 @@
referenceSchemaType.setName(generatedTypeName.getLocalPart());
writeComplexType((XmlSchemaComplexType)referenceSchemaType,
- (BeanWriterMetaInfoHolder)processedAnonymousComplexTypesMap.get(referencedElement));
+ (BeanWriterMetaInfoHolder)processedAnonymousComplexTypesMap.get(referencedElement),
+ null);
//remove the reference from the anon list since we named the type
processedAnonymousComplexTypesMap.remove(referencedElement);
@@ -601,11 +604,15 @@
return;
}
+ // Must do this up front to support recursive types
+ String fullyQualifiedClassName = writer.makeFullyQualifiedClassName(complexType.getQName());
+ processedTypemap.put(complexType.getQName(), fullyQualifiedClassName);
+
BeanWriterMetaInfoHolder metaInfHolder = processComplexType(complexType,parentSchema);
//write the class. This type mapping would have been populated right now
//Note - We always write classes for named complex types
- writeComplexType(complexType, metaInfHolder);
+ writeComplexType(complexType, metaInfHolder, fullyQualifiedClassName);
}
@@ -614,12 +621,12 @@
* Writes a complex type
* @param complexType
* @param metaInfHolder
+ * @param fullyQualifiedClassName the name returned by makeFullyQualifiedClassName() or null if it wasn't called
* @throws SchemaCompilationException
*/
- private void writeComplexType(XmlSchemaComplexType complexType, BeanWriterMetaInfoHolder metaInfHolder) throws SchemaCompilationException {
- String fullyQualifiedClassName = writer.write(complexType, processedTypemap, metaInfHolder);
- //populate the type map with the type QName
- processedTypemap.put(complexType.getQName(), fullyQualifiedClassName);
+ private void writeComplexType(XmlSchemaComplexType complexType, BeanWriterMetaInfoHolder metaInfHolder, String fullyQualifiedClassName)
+ throws SchemaCompilationException {
+ writer.write(complexType, processedTypemap, metaInfHolder, fullyQualifiedClassName);
processedTypeMetaInfoMap.put(complexType.getQName(),metaInfHolder);
}
Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/writer/BeanWriter.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/writer/BeanWriter.java?rev=389698&r1=389697&r2=389698&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/writer/BeanWriter.java (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/writer/BeanWriter.java Tue Mar 28 22:55:03 2006
@@ -1,5 +1,6 @@
package org.apache.axis2.schema.writer;
+import javax.xml.namespace.QName;
import org.apache.axis2.schema.BeanWriterMetaInfoHolder;
import org.apache.axis2.schema.CompilerOptions;
import org.apache.axis2.schema.SchemaCompilationException;
@@ -51,6 +52,12 @@
* of the schema compiler may be exposed.
*/
public Map getModelMap();
+
+ /** Make the fully qualified class name for an element or named type
+ * @param qName the qualified Name for this element or type in the schema
+ * @return the appropriate fully qualified class name to use in generated code
+ */
+ public String makeFullyQualifiedClassName(QName qName);
/**
* Write a complex type
@@ -58,10 +65,12 @@
* @param complexType
* @param typeMap
* @param metainf
+ * @param fullyQualifiedClassName the name returned by makeFullyQualifiedClassName() or null if it wasn't called
* @return Returns String.
* @throws SchemaCompilationException
*/
- public String write(XmlSchemaComplexType complexType, Map typeMap, BeanWriterMetaInfoHolder metainf) throws SchemaCompilationException;
+ public String write(XmlSchemaComplexType complexType, Map typeMap, BeanWriterMetaInfoHolder metainf, String fullyQualifiedClassName)
+ throws SchemaCompilationException;
/**
* Write a element
Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/writer/JavaBeanWriter.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/writer/JavaBeanWriter.java?rev=389698&r1=389697&r2=389698&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/writer/JavaBeanWriter.java (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/writer/JavaBeanWriter.java Tue Mar 28 22:55:03 2006
@@ -143,7 +143,7 @@
try {
QName qName = element.getQName();
- return process(qName, metainf, typeMap, true);
+ return process(qName, metainf, typeMap, true, null);
} catch (Exception e) {
throw new SchemaCompilationException(e);
}
@@ -155,16 +155,18 @@
* @param complexType
* @param typeMap
* @param metainf
+ * @param fullyQualifiedClassName the name returned by makeFullyQualifiedClassName() or null if it wasn't called
* @throws org.apache.axis2.schema.SchemaCompilationException
*
* @see BeanWriter#write(org.apache.ws.commons.schema.XmlSchemaComplexType, java.util.Map, org.apache.axis2.schema.BeanWriterMetaInfoHolder)
*/
- public String write(XmlSchemaComplexType complexType, Map typeMap, BeanWriterMetaInfoHolder metainf) throws SchemaCompilationException {
+ public String write(XmlSchemaComplexType complexType, Map typeMap, BeanWriterMetaInfoHolder metainf, String fullyQualifiedClassName)
+ throws SchemaCompilationException {
try {
//determine the package for this type.
QName qName = complexType.getQName();
- return process(qName, metainf, typeMap, false);
+ return process(qName, metainf, typeMap, false, fullyQualifiedClassName);
} catch (SchemaCompilationException e) {
throw e;
@@ -228,6 +230,36 @@
}
+ /** Make the fully qualified class name for an element or named type
+ * @param qName the qualified Name for this element or type in the schema
+ * @return the appropriate fully qualified class name to use in generated code
+ */
+ public String makeFullyQualifiedClassName(QName qName) {
+
+ String nameSpaceFromURL = URLProcessor.makePackageName(qName.getNamespaceURI());
+
+ String packageName = this.packageName == null ?
+ nameSpaceFromURL :
+ this.packageName + nameSpaceFromURL;
+
+ String originalName = qName.getLocalPart();
+ String className = makeUniqueJavaClassName(this.namesList, originalName);
+
+ String packagePrefix = null;
+
+ String fullyqualifiedClassName;
+ if (wrapClasses)
+ packagePrefix = (this.packageName == null ? DEFAULT_PACKAGE+"." : this.packageName) + WRAPPED_DATABINDING_CLASS_NAME;
+ else if (writeClasses)
+ packagePrefix = packageName;
+ if (packagePrefix!=null)
+ fullyqualifiedClassName = packagePrefix + (packagePrefix.endsWith(".")?"":".") + className;
+ else
+ fullyqualifiedClassName = className;
+ //return the fully qualified class name
+ return fullyqualifiedClassName;
+ }
+
/**
* A util method that holds common code
* for the complete schema that the generated XML complies to
@@ -237,10 +269,15 @@
* @param metainf
* @param typeMap
* @param isElement
+ * @param fullyQualifiedClassName the name returned by makeFullyQualifiedClassName() or null if it wasn't called
* @return Returns String.
* @throws Exception
*/
- private String process(QName qName, BeanWriterMetaInfoHolder metainf, Map typeMap, boolean isElement) throws Exception {
+ private String process(QName qName, BeanWriterMetaInfoHolder metainf, Map typeMap, boolean isElement, String fullyQualifiedClassName) throws Exception {
+
+ if (fullyQualifiedClassName == null)
+ fullyQualifiedClassName = makeFullyQualifiedClassName(qName);
+ String className = fullyQualifiedClassName.substring(1+fullyQualifiedClassName.lastIndexOf('.'));
String nameSpaceFromURL = URLProcessor.makePackageName(qName.getNamespaceURI());
@@ -249,11 +286,7 @@
this.packageName + nameSpaceFromURL;
String originalName = qName.getLocalPart();
- String className = makeUniqueJavaClassName(this.namesList, originalName);
-
- String packagePrefix = null;
- String fullyqualifiedClassName;
ArrayList propertyNames = new ArrayList();
if (!templateLoaded) {
@@ -266,7 +299,6 @@
globalWrappedDocument.getDocumentElement().appendChild(
getBeanElement(globalWrappedDocument, className, originalName, packageName, qName, isElement, metainf, propertyNames, typeMap)
);
- packagePrefix = (this.packageName == null ? DEFAULT_PACKAGE+"." : this.packageName) + WRAPPED_DATABINDING_CLASS_NAME;
} else {
//create the model
@@ -279,8 +311,6 @@
File out = createOutFile(packageName, className);
//parse with the template and create the files
parse(model, out);
-
- packagePrefix = packageName ;
}
//add the model to the model map
@@ -291,13 +321,8 @@
}
- if (packagePrefix!=null){
- fullyqualifiedClassName = packagePrefix + (packagePrefix.endsWith(".")?"":".") + className;
- }else{
- fullyqualifiedClassName = className;
- }
//return the fully qualified class name
- return fullyqualifiedClassName;
+ return fullyQualifiedClassName;
}
Added: webservices/axis2/trunk/java/modules/codegen/test-resources/xsd/simple_recursive.xsd
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/test-resources/xsd/simple_recursive.xsd?rev=389698&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/test-resources/xsd/simple_recursive.xsd (added)
+++ webservices/axis2/trunk/java/modules/codegen/test-resources/xsd/simple_recursive.xsd Tue Mar 28 22:55:03 2006
@@ -0,0 +1,14 @@
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:tns="http://soapinterop.org/types"
+ targetNamespace="http://soapinterop.org/types">
+ <complexType name="SOAPStruct1">
+ <sequence>
+ <element name="varString" type="xsd:string" nillable="true"/>
+ <element name="varInt" type="xsd:int"/>
+ <element name="varFloat" type="xsd:float"/>
+ <element name="child" type="tns:SOAPStruct1"/>
+ </sequence>
+ </complexType>
+ <element name="myElementNillable" type="tns:SOAPStruct1" nillable="true"/>
+</schema>
\ No newline at end of file
Added: webservices/axis2/trunk/java/modules/codegen/test/org/apache/axis2/schema/compile/RecursiveCompileTest.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/test/org/apache/axis2/schema/compile/RecursiveCompileTest.java?rev=389698&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/test/org/apache/axis2/schema/compile/RecursiveCompileTest.java (added)
+++ webservices/axis2/trunk/java/modules/codegen/test/org/apache/axis2/schema/compile/RecursiveCompileTest.java Tue Mar 28 22:55:03 2006
@@ -0,0 +1,27 @@
+package org.apache.axis2.schema.compile;
+
+import junit.framework.TestCase;
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+
+public class RecursiveCompileTest extends AbstractSchemaCompilerTester {
+ protected void setUp() throws Exception {
+ this.fileName = "test-resources/xsd/simple_recursive.xsd";
+ super.setUp();
+ }
+
+
+}