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 ia...@apache.org on 2004/08/31 19:37:14 UTC
cvs commit: ws-axis/contrib/ews/src/org/apache/geronimo/ews/jaxrpcmapping J2eeBeanHelperWriter.java
ias 2004/08/31 10:37:14
Modified: contrib/ews/src/org/apache/geronimo/ews/jaxrpcmapping
J2eeBeanHelperWriter.java
Log:
Fix - follow up Axis' element name concept introduced by Jongjin Choi.
Revision Changes Path
1.4 +417 -419 ws-axis/contrib/ews/src/org/apache/geronimo/ews/jaxrpcmapping/J2eeBeanHelperWriter.java
Index: J2eeBeanHelperWriter.java
===================================================================
RCS file: /home/cvs/ws-axis/contrib/ews/src/org/apache/geronimo/ews/jaxrpcmapping/J2eeBeanHelperWriter.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- J2eeBeanHelperWriter.java 11 Aug 2004 09:16:10 -0000 1.3
+++ J2eeBeanHelperWriter.java 31 Aug 2004 17:37:14 -0000 1.4
@@ -1,419 +1,417 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001-2003 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Axis" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-package org.apache.geronimo.ews.jaxrpcmapping;
-
-import org.apache.axis.utils.Messages;
-import org.apache.axis.wsdl.symbolTable.DefinedType;
-import org.apache.axis.wsdl.symbolTable.ElementDecl;
-import org.apache.axis.wsdl.symbolTable.SchemaUtils;
-import org.apache.axis.wsdl.symbolTable.TypeEntry;
-import org.apache.axis.wsdl.toJava.Utils;
-
-import javax.xml.namespace.QName;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Vector;
-
-/**
- * This is Wsdl2java's Helper Type Writer. It writes the <typeName>.java file.
- *
- * @author Ias (iasandcb@tmax.co.kr)
- * @deprecated no more used by J2eeGeneratorFactory
- */
-public class J2eeBeanHelperWriter extends J2eeClassWriter {
- protected TypeEntry type;
- protected Vector elements;
- protected Vector attributes;
- protected TypeEntry extendType;
- protected PrintWriter wrapperPW = null;
- protected Vector elementMetaData = null;
- protected boolean canSearchParents;
-
- /**
- * Constructor.
- *
- * @param emitter
- * @param type The type representing this class
- * @param elements Vector containing the Type and name of each property
- * @param extendType The type representing the extended class (or null)
- * @param attributes Vector containing the attribute types and names
- */
- protected J2eeBeanHelperWriter(J2eeEmitter emitter,
- TypeEntry type,
- Vector elements,
- TypeEntry extendType,
- Vector attributes) {
- super(emitter, type.getName() + "_Helper", "helper");
- this.type = type;
- this.elements = elements;
- this.attributes = attributes;
- this.extendType = extendType;
- // is this a complex type that is derived from other types
- // by restriction? if so, set the policy of the generated
- // TypeDescription to ignore metadata associated with
- // superclasses, as restricted types are required to
- // define their entire content model. Hence the type
- // description associated with the current type provides
- // all of the types (and only those types) allowed in
- // the restricted derivation.
- if (null != extendType
- && null != SchemaUtils.getComplexElementRestrictionBase(type.getNode(),
- emitter.getSymbolTable())) {
- this.canSearchParents = false;
- } else {
- this.canSearchParents = true;
- }
-
- } // ctor
-
- /**
- * The bean helper class may be its own class, or it may be
- * embedded within the bean class. If it's embedded within the
- * bean class, the JavaBeanWriter will set JavaBeanHelperWriter's
- * PrintWriter to its own.
- */
- protected void setPrintWriter(PrintWriter pw) {
- this.wrapperPW = pw;
- } // setPrintWriter
-
- /**
- * The default behaviour (of super.getPrintWriter) is, given the
- * file name, create a PrintWriter for it. If the bean helper
- * that this class is generating is embedded within a bean, then
- * the PrintWriter returned by this method is the JavaBeanWriter's
- * PrintWriter. Otherwise super.getPrintWriter is called.
- */
- protected PrintWriter getPrintWriter(String filename) throws IOException {
- return wrapperPW == null ? super.getPrintWriter(filename) : wrapperPW;
- } // getPrintWriter
-
- /**
- * Only register the filename if the bean helper is not wrapped
- * within a bean.
- */
- protected void registerFile(String file) {
- if (wrapperPW == null)
- super.registerFile(file);
- } // registerFile
-
- /**
- * Return the string: "Generating <file>".
- * only if we are going to generate a new file.
- */
- protected String verboseMessage(String file) {
- if (wrapperPW == null) {
- return super.verboseMessage(file);
- } else {
- return null;
- }
- } // verboseMessage
-
- /**
- * Only write the file header if the bean helper is not wrapped
- * within a bean.
- */
- protected void writeFileHeader(PrintWriter pw) throws IOException {
- if (wrapperPW == null) {
- super.writeFileHeader(pw);
- }
- } // writeFileHeader
-
- /**
- * Generate the file body for the bean helper.
- */
- protected void writeFileBody(PrintWriter pw) throws IOException {
- writeMetaData(pw);
- writeSerializer(pw);
- writeDeserializer(pw);
- } // writeFileBody
-
- /**
- * Only write the file footer if the bean helper is not
- * wrapped within a bean.
- */
- protected void writeFileFooter(PrintWriter pw) throws IOException {
- if (wrapperPW == null) {
- super.writeFileFooter(pw);
- }
- } // writeFileFooter
-
- /**
- * Only close the PrintWriter if the PrintWriter belongs to
- * this class. If the bean helper is embedded within a bean
- * then the PrintWriter belongs to JavaBeanWriter and THAT
- * class is responsible for closing the PrintWriter.
- */
- protected void closePrintWriter(PrintWriter pw) {
- // If the output of this writer is wrapped within
- // another writer (JavaBeanWriter), then THAT
- // writer will close the PrintWriter, not this one.
- if (wrapperPW == null) {
- pw.close();
- }
- } // closePrintWriter
-
- /**
- * write MetaData code
- */
- protected void writeMetaData(PrintWriter pw) throws IOException {
- // Collect elementMetaData
- if (elements != null) {
- for (int i = 0; i < elements.size(); i++) {
- ElementDecl elem = (ElementDecl) elements.get(i);
- // String elemName = elem.getName().getLocalPart();
- // String javaName = Utils.xmlNameToJava(elemName);
-
- // Changed the code to write meta data
- // for all of the elements in order to
- // support sequences. Defect 9060
-
-
- // Meta data is needed if the default serializer
- // action cannot map the javaName back to the
- // element's qname. This occurs if:
- // - the javaName and element name local part are different.
- // - the javaName starts with uppercase char (this is a wierd
- // case and we have several problems with the mapping rules.
- // Seems best to gen meta data in this case.)
- // - the element name is qualified (has a namespace uri)
- // its also needed if:
- // - the element has the minoccurs flag set
- //if (!javaName.equals(elemName) ||
- // Character.isUpperCase(javaName.charAt(0)) ||
- //!elem.getName().getNamespaceURI().equals("") ||
- //elem.getMinOccursIs0()) {
- // If we did some mangling, make sure we'll write out the XML
- // the correct way.
- if (elementMetaData == null)
- elementMetaData = new Vector();
-
- elementMetaData.add(elem);
- //}
- }
- }
- pw.println(" // " + Messages.getMessage("typeMeta"));
- pw.println(" private static org.apache.axis.description.TypeDesc typeDesc =");
- pw.println(" new org.apache.axis.description.TypeDesc("
- + Utils.getJavaLocalName(jaxRpcMapper.getJavaType(type.getQName()))
- + ".class, "
- + (this.canSearchParents ? "true" : "false")
- + ");");
- pw.println();
-
- pw.println(" static {");
- pw.println(" typeDesc.setXmlType(" + Utils.getNewQName(type.getQName()) + ");");
-
- // Add attribute and element field descriptors
- if (attributes != null || elementMetaData != null) {
- if (attributes != null) {
- boolean wroteAttrDecl = false;
-
- for (int i = 0; i < attributes.size(); i += 2) {
- TypeEntry te = (TypeEntry) attributes.get(i);
- QName attrName = (QName) attributes.get(i + 1);
- String attrLocalName = attrName.getLocalPart();
- String fieldName = Utils.xmlNameToJava(attrLocalName);
- fieldName = getAsFieldName(fieldName);
- QName attrXmlType = te.getQName();
- pw.print(" ");
- if (!wroteAttrDecl) {
- pw.print("org.apache.axis.description.AttributeDesc ");
- wroteAttrDecl = true;
- }
- pw.println("attrField = new org.apache.axis.description.AttributeDesc();");
- pw.println(" attrField.setFieldName(\"" + fieldName + "\");");
- pw.println(" attrField.setXmlName(" + Utils.getNewQName(attrName) + ");");
- if (attrXmlType != null) {
- pw.println(" attrField.setXmlType(" + Utils.getNewQName(attrXmlType) + ");");
- }
- pw.println(" typeDesc.addFieldDesc(attrField);");
- }
- }
-
- if (elementMetaData != null) {
- boolean wroteElemDecl = false;
-
- for (int i = 0; i < elementMetaData.size(); i++) {
- ElementDecl elem = (ElementDecl) elementMetaData.elementAt(i);
-
- if (elem.getAnyElement()) {
- continue;
- }
-
- String elemLocalName = elem.getName().getLocalPart();
- String fieldName = Utils.xmlNameToJava(elemLocalName);
- fieldName = getAsFieldName(fieldName);
- QName xmlName = elem.getName();
-
- // Some special handling for arrays.
- TypeEntry elemType = elem.getType();
- QName xmlType = null;
-
- if (elemType.getDimensions().length() > 1 &&
- (elemType.getClass() == DefinedType.class)) {
- // If we have a DefinedType with dimensions, it must
- // be a SOAP array derived type. In this case, use
- // the refType's QName for the metadata.
- xmlType = elemType.getRefType().getQName();
- } else {
- // Otherwise, use the type at the end of the ref
- // chain.
- while (elemType.getRefType() != null) {
- elemType = elemType.getRefType();
- }
- xmlType = elemType.getQName();
- }
-
- pw.print(" ");
- if (!wroteElemDecl) {
- pw.print("org.apache.axis.description.ElementDesc ");
- wroteElemDecl = true;
- }
- pw.println("elemField = new org.apache.axis.description.ElementDesc();");
- pw.println(" elemField.setFieldName(\"" + fieldName + "\");");
- pw.println(" elemField.setXmlName(" + Utils.getNewQName(xmlName) + ");");
- if (xmlType != null) {
- pw.println(" elemField.setXmlType(" + Utils.getNewQName(xmlType) + ");");
- }
- if (elem.getMinOccursIs0()) {
- pw.println(" elemField.setMinOccurs(0);");
- }
- pw.println(" typeDesc.addFieldDesc(elemField);");
- }
- }
- }
-
- pw.println(" }");
- pw.println();
-
- pw.println(" /**");
- pw.println(" * " + Messages.getMessage("returnTypeMeta"));
- pw.println(" */");
- pw.println(" public static org.apache.axis.description.TypeDesc getTypeDesc() {");
- pw.println(" return typeDesc;");
- pw.println(" }");
- pw.println();
- }
-
- /**
- * Utility function to get the bean property name (as will be returned
- * by the Introspector) for a given field name. This just means
- * we capitalize the first character if the second character is
- * capitalized. Example: a field named "fOO" will turn into
- * getter/setter methods "getFOO()/setFOO()". So when the Introspector
- * looks at that bean, the property name will be "FOO", not "fOO" due
- * to the rules in the JavaBeans spec. So this makes sure the
- * metadata will match.
- */
- private String getAsFieldName(String fieldName) {
- // If there's a second character, and it is uppercase, then the
- // bean property name will have a capitalized first character
- // (because setURL() maps to a property named "URL", not "uRL")
- if (fieldName.length() > 1 &&
- Character.isUpperCase(fieldName.charAt(1))) {
- return Utils.capitalizeFirstChar(fieldName);
- }
-
- return fieldName;
- }
-
- /**
- * write Serializer getter code and pass in meta data to avoid
- * undo introspection.
- */
- protected void writeSerializer(PrintWriter pw) throws IOException {
- String typeDesc = "typeDesc";
- String ser = " org.apache.axis.encoding.ser.BeanSerializer";
- if (type.isSimpleType()) {
- ser = " org.apache.axis.encoding.ser.SimpleSerializer";
- }
- pw.println(" /**");
- pw.println(" * Get Custom Serializer");
- pw.println(" */");
- pw.println(" public static org.apache.axis.encoding.Serializer getSerializer(");
- pw.println(" java.lang.String mechType, ");
- pw.println(" java.lang.Class _javaType, ");
- pw.println(" javax.xml.namespace.QName _xmlType) {");
- pw.println(" return ");
- pw.println(" new " + ser + "(");
- pw.println(" _javaType, _xmlType, " + typeDesc + ");");
- pw.println(" }");
- pw.println();
- }
-
- /**
- * write Deserializer getter code and pass in meta data to avoid
- * undo introspection.
- */
- protected void writeDeserializer(PrintWriter pw) throws IOException {
- String typeDesc = "typeDesc";
- String dser = " org.apache.axis.encoding.ser.BeanDeserializer";
- if (type.isSimpleType()) {
- dser = " org.apache.axis.encoding.ser.SimpleDeserializer";
- }
- pw.println(" /**");
- pw.println(" * Get Custom Deserializer");
- pw.println(" */");
- pw.println(" public static org.apache.axis.encoding.Deserializer getDeserializer(");
- pw.println(" java.lang.String mechType, ");
- pw.println(" java.lang.Class _javaType, ");
- pw.println(" javax.xml.namespace.QName _xmlType) {");
- pw.println(" return ");
- pw.println(" new " + dser + "(");
- pw.println(" _javaType, _xmlType, " + typeDesc + ");");
- pw.println(" }");
- pw.println();
- }
-} // class JavaBeanHelperWriter
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 2001-2003 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Axis" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.geronimo.ews.jaxrpcmapping;
+
+import org.apache.axis.utils.Messages;
+import org.apache.axis.wsdl.symbolTable.DefinedType;
+import org.apache.axis.wsdl.symbolTable.ElementDecl;
+import org.apache.axis.wsdl.symbolTable.SchemaUtils;
+import org.apache.axis.wsdl.symbolTable.TypeEntry;
+import org.apache.axis.wsdl.toJava.Utils;
+
+import javax.xml.namespace.QName;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Vector;
+
+/**
+ * This is Wsdl2java's Helper Type Writer. It writes the <typeName>.java file.
+ *
+ * @author Ias (iasandcb@tmax.co.kr)
+ * @deprecated no more used by J2eeGeneratorFactory
+ */
+public class J2eeBeanHelperWriter extends J2eeClassWriter {
+ protected TypeEntry type;
+ protected Vector elements;
+ protected Vector attributes;
+ protected TypeEntry extendType;
+ protected PrintWriter wrapperPW = null;
+ protected Vector elementMetaData = null;
+ protected boolean canSearchParents;
+
+ /**
+ * Constructor.
+ *
+ * @param emitter
+ * @param type The type representing this class
+ * @param elements Vector containing the Type and name of each property
+ * @param extendType The type representing the extended class (or null)
+ * @param attributes Vector containing the attribute types and names
+ */
+ protected J2eeBeanHelperWriter(J2eeEmitter emitter,
+ TypeEntry type,
+ Vector elements,
+ TypeEntry extendType,
+ Vector attributes) {
+ super(emitter, type.getName() + "_Helper", "helper");
+ this.type = type;
+ this.elements = elements;
+ this.attributes = attributes;
+ this.extendType = extendType;
+ // is this a complex type that is derived from other types
+ // by restriction? if so, set the policy of the generated
+ // TypeDescription to ignore metadata associated with
+ // superclasses, as restricted types are required to
+ // define their entire content model. Hence the type
+ // description associated with the current type provides
+ // all of the types (and only those types) allowed in
+ // the restricted derivation.
+ if (null != extendType
+ && null != SchemaUtils.getComplexElementRestrictionBase(type.getNode(),
+ emitter.getSymbolTable())) {
+ this.canSearchParents = false;
+ } else {
+ this.canSearchParents = true;
+ }
+
+ } // ctor
+
+ /**
+ * The bean helper class may be its own class, or it may be
+ * embedded within the bean class. If it's embedded within the
+ * bean class, the JavaBeanWriter will set JavaBeanHelperWriter's
+ * PrintWriter to its own.
+ */
+ protected void setPrintWriter(PrintWriter pw) {
+ this.wrapperPW = pw;
+ } // setPrintWriter
+
+ /**
+ * The default behaviour (of super.getPrintWriter) is, given the
+ * file name, create a PrintWriter for it. If the bean helper
+ * that this class is generating is embedded within a bean, then
+ * the PrintWriter returned by this method is the JavaBeanWriter's
+ * PrintWriter. Otherwise super.getPrintWriter is called.
+ */
+ protected PrintWriter getPrintWriter(String filename) throws IOException {
+ return wrapperPW == null ? super.getPrintWriter(filename) : wrapperPW;
+ } // getPrintWriter
+
+ /**
+ * Only register the filename if the bean helper is not wrapped
+ * within a bean.
+ */
+ protected void registerFile(String file) {
+ if (wrapperPW == null)
+ super.registerFile(file);
+ } // registerFile
+
+ /**
+ * Return the string: "Generating <file>".
+ * only if we are going to generate a new file.
+ */
+ protected String verboseMessage(String file) {
+ if (wrapperPW == null) {
+ return super.verboseMessage(file);
+ } else {
+ return null;
+ }
+ } // verboseMessage
+
+ /**
+ * Only write the file header if the bean helper is not wrapped
+ * within a bean.
+ */
+ protected void writeFileHeader(PrintWriter pw) throws IOException {
+ if (wrapperPW == null) {
+ super.writeFileHeader(pw);
+ }
+ } // writeFileHeader
+
+ /**
+ * Generate the file body for the bean helper.
+ */
+ protected void writeFileBody(PrintWriter pw) throws IOException {
+ writeMetaData(pw);
+ writeSerializer(pw);
+ writeDeserializer(pw);
+ } // writeFileBody
+
+ /**
+ * Only write the file footer if the bean helper is not
+ * wrapped within a bean.
+ */
+ protected void writeFileFooter(PrintWriter pw) throws IOException {
+ if (wrapperPW == null) {
+ super.writeFileFooter(pw);
+ }
+ } // writeFileFooter
+
+ /**
+ * Only close the PrintWriter if the PrintWriter belongs to
+ * this class. If the bean helper is embedded within a bean
+ * then the PrintWriter belongs to JavaBeanWriter and THAT
+ * class is responsible for closing the PrintWriter.
+ */
+ protected void closePrintWriter(PrintWriter pw) {
+ // If the output of this writer is wrapped within
+ // another writer (JavaBeanWriter), then THAT
+ // writer will close the PrintWriter, not this one.
+ if (wrapperPW == null) {
+ pw.close();
+ }
+ } // closePrintWriter
+
+ /**
+ * write MetaData code
+ */
+ protected void writeMetaData(PrintWriter pw) throws IOException {
+ // Collect elementMetaData
+ if (elements != null) {
+ for (int i = 0; i < elements.size(); i++) {
+ ElementDecl elem = (ElementDecl) elements.get(i);
+ // String elemName = elem.getName().getLocalPart();
+ // String javaName = Utils.xmlNameToJava(elemName);
+
+ // Changed the code to write meta data
+ // for all of the elements in order to
+ // support sequences. Defect 9060
+
+
+ // Meta data is needed if the default serializer
+ // action cannot map the javaName back to the
+ // element's qname. This occurs if:
+ // - the javaName and element name local part are different.
+ // - the javaName starts with uppercase char (this is a wierd
+ // case and we have several problems with the mapping rules.
+ // Seems best to gen meta data in this case.)
+ // - the element name is qualified (has a namespace uri)
+ // its also needed if:
+ // - the element has the minoccurs flag set
+ //if (!javaName.equals(elemName) ||
+ // Character.isUpperCase(javaName.charAt(0)) ||
+ //!elem.getName().getNamespaceURI().equals("") ||
+ //elem.getMinOccursIs0()) {
+ // If we did some mangling, make sure we'll write out the XML
+ // the correct way.
+ if (elementMetaData == null)
+ elementMetaData = new Vector();
+
+ elementMetaData.add(elem);
+ //}
+ }
+ }
+ pw.println(" // " + Messages.getMessage("typeMeta"));
+ pw.println(" private static org.apache.axis.description.TypeDesc typeDesc =");
+ pw.println(" new org.apache.axis.description.TypeDesc("
+ + Utils.getJavaLocalName(jaxRpcMapper.getJavaType(type.getQName()))
+ + ".class, "
+ + (this.canSearchParents ? "true" : "false")
+ + ");");
+ pw.println();
+
+ pw.println(" static {");
+ pw.println(" typeDesc.setXmlType(" + Utils.getNewQName(type.getQName()) + ");");
+
+ // Add attribute and element field descriptors
+ if (attributes != null || elementMetaData != null) {
+ if (attributes != null) {
+ boolean wroteAttrDecl = false;
+
+ for (int i = 0; i < attributes.size(); i += 2) {
+ TypeEntry te = (TypeEntry) attributes.get(i);
+ QName attrName = (QName) attributes.get(i + 1);
+ String attrLocalName = attrName.getLocalPart();
+ String fieldName = Utils.xmlNameToJava(attrLocalName);
+ fieldName = getAsFieldName(fieldName);
+ QName attrXmlType = te.getQName();
+ pw.print(" ");
+ if (!wroteAttrDecl) {
+ pw.print("org.apache.axis.description.AttributeDesc ");
+ wroteAttrDecl = true;
+ }
+ pw.println("attrField = new org.apache.axis.description.AttributeDesc();");
+ pw.println(" attrField.setFieldName(\"" + fieldName + "\");");
+ pw.println(" attrField.setXmlName(" + Utils.getNewQName(attrName) + ");");
+ if (attrXmlType != null) {
+ pw.println(" attrField.setXmlType(" + Utils.getNewQName(attrXmlType) + ");");
+ }
+ pw.println(" typeDesc.addFieldDesc(attrField);");
+ }
+ }
+
+ if (elementMetaData != null) {
+ boolean wroteElemDecl = false;
+
+ for (int i = 0; i < elementMetaData.size(); i++) {
+ ElementDecl elem = (ElementDecl) elementMetaData.elementAt(i);
+
+ if (elem.getAnyElement()) {
+ continue;
+ }
+
+ String fieldName = getAsFieldName(elem.getName());
+ QName xmlName = elem.getQName();
+
+ // Some special handling for arrays.
+ TypeEntry elemType = elem.getType();
+ QName xmlType = null;
+
+ if (elemType.getDimensions().length() > 1 &&
+ (elemType.getClass() == DefinedType.class)) {
+ // If we have a DefinedType with dimensions, it must
+ // be a SOAP array derived type. In this case, use
+ // the refType's QName for the metadata.
+ xmlType = elemType.getRefType().getQName();
+ } else {
+ // Otherwise, use the type at the end of the ref
+ // chain.
+ while (elemType.getRefType() != null) {
+ elemType = elemType.getRefType();
+ }
+ xmlType = elemType.getQName();
+ }
+
+ pw.print(" ");
+ if (!wroteElemDecl) {
+ pw.print("org.apache.axis.description.ElementDesc ");
+ wroteElemDecl = true;
+ }
+ pw.println("elemField = new org.apache.axis.description.ElementDesc();");
+ pw.println(" elemField.setFieldName(\"" + fieldName + "\");");
+ pw.println(" elemField.setXmlName(" + Utils.getNewQName(xmlName) + ");");
+ if (xmlType != null) {
+ pw.println(" elemField.setXmlType(" + Utils.getNewQName(xmlType) + ");");
+ }
+ if (elem.getMinOccursIs0()) {
+ pw.println(" elemField.setMinOccurs(0);");
+ }
+ pw.println(" typeDesc.addFieldDesc(elemField);");
+ }
+ }
+ }
+
+ pw.println(" }");
+ pw.println();
+
+ pw.println(" /**");
+ pw.println(" * " + Messages.getMessage("returnTypeMeta"));
+ pw.println(" */");
+ pw.println(" public static org.apache.axis.description.TypeDesc getTypeDesc() {");
+ pw.println(" return typeDesc;");
+ pw.println(" }");
+ pw.println();
+ }
+
+ /**
+ * Utility function to get the bean property name (as will be returned
+ * by the Introspector) for a given field name. This just means
+ * we capitalize the first character if the second character is
+ * capitalized. Example: a field named "fOO" will turn into
+ * getter/setter methods "getFOO()/setFOO()". So when the Introspector
+ * looks at that bean, the property name will be "FOO", not "fOO" due
+ * to the rules in the JavaBeans spec. So this makes sure the
+ * metadata will match.
+ */
+ private String getAsFieldName(String fieldName) {
+ // If there's a second character, and it is uppercase, then the
+ // bean property name will have a capitalized first character
+ // (because setURL() maps to a property named "URL", not "uRL")
+ if (fieldName.length() > 1 &&
+ Character.isUpperCase(fieldName.charAt(1))) {
+ return Utils.capitalizeFirstChar(fieldName);
+ }
+
+ return fieldName;
+ }
+
+ /**
+ * write Serializer getter code and pass in meta data to avoid
+ * undo introspection.
+ */
+ protected void writeSerializer(PrintWriter pw) throws IOException {
+ String typeDesc = "typeDesc";
+ String ser = " org.apache.axis.encoding.ser.BeanSerializer";
+ if (type.isSimpleType()) {
+ ser = " org.apache.axis.encoding.ser.SimpleSerializer";
+ }
+ pw.println(" /**");
+ pw.println(" * Get Custom Serializer");
+ pw.println(" */");
+ pw.println(" public static org.apache.axis.encoding.Serializer getSerializer(");
+ pw.println(" java.lang.String mechType, ");
+ pw.println(" java.lang.Class _javaType, ");
+ pw.println(" javax.xml.namespace.QName _xmlType) {");
+ pw.println(" return ");
+ pw.println(" new " + ser + "(");
+ pw.println(" _javaType, _xmlType, " + typeDesc + ");");
+ pw.println(" }");
+ pw.println();
+ }
+
+ /**
+ * write Deserializer getter code and pass in meta data to avoid
+ * undo introspection.
+ */
+ protected void writeDeserializer(PrintWriter pw) throws IOException {
+ String typeDesc = "typeDesc";
+ String dser = " org.apache.axis.encoding.ser.BeanDeserializer";
+ if (type.isSimpleType()) {
+ dser = " org.apache.axis.encoding.ser.SimpleDeserializer";
+ }
+ pw.println(" /**");
+ pw.println(" * Get Custom Deserializer");
+ pw.println(" */");
+ pw.println(" public static org.apache.axis.encoding.Deserializer getDeserializer(");
+ pw.println(" java.lang.String mechType, ");
+ pw.println(" java.lang.Class _javaType, ");
+ pw.println(" javax.xml.namespace.QName _xmlType) {");
+ pw.println(" return ");
+ pw.println(" new " + dser + "(");
+ pw.println(" _javaType, _xmlType, " + typeDesc + ");");
+ pw.println(" }");
+ pw.println();
+ }
+} // class JavaBeanHelperWriter