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:04 UTC
cvs commit: ws-axis/contrib/ews/src/org/apache/geronimo/ews/jaxrpcmapping J2eeBeanWriter.java
ias 2004/08/31 10:37:04
Modified: contrib/ews/src/org/apache/geronimo/ews/jaxrpcmapping
J2eeBeanWriter.java
Log:
Fix - follow up Axis' element name concept introduced by Jongjin Choi.
Revision Changes Path
1.4 +821 -823 ws-axis/contrib/ews/src/org/apache/geronimo/ews/jaxrpcmapping/J2eeBeanWriter.java
Index: J2eeBeanWriter.java
===================================================================
RCS file: /home/cvs/ws-axis/contrib/ews/src/org/apache/geronimo/ews/jaxrpcmapping/J2eeBeanWriter.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- J2eeBeanWriter.java 11 Aug 2004 09:16:09 -0000 1.3
+++ J2eeBeanWriter.java 31 Aug 2004 17:37:03 -0000 1.4
@@ -1,823 +1,821 @@
-/*
-* 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.Constants;
-import org.apache.axis.utils.JavaUtils;
-import org.apache.axis.utils.Messages;
-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.JavaWriter;
-import org.apache.axis.wsdl.toJava.Utils;
-import org.w3c.dom.Node;
-
-import javax.xml.namespace.QName;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Vector;
-
-/**
- * This is Wsdl2java's Complex Type Writer. It writes the <typeName>.java file.
- *
- * @author Ias (iasandcb@tmax.co.kr)
- * @deprecated no more used by J2eeGeneratorFactory
- */
-public class J2eeBeanWriter extends J2eeClassWriter {
- private TypeEntry type;
- private Vector elements;
- private Vector attributes;
- private TypeEntry extendType;
- protected J2eeBeanHelperWriter helper;
- protected Vector names = new Vector(); // even indices: types, odd: vars
- protected ArrayList simpleValueTypes = new ArrayList(); // name of type of simple value
- protected PrintWriter pw;
-
- // The following fields can be set by extended classes
- // to control processing
- protected boolean enableDefaultConstructor = true;
- protected boolean enableFullConstructor = false;
- protected boolean enableSimpleConstructors = false;
- protected boolean enableToString = false;
- protected boolean enableSetters = true;
- protected boolean enableGetters = true;
- protected boolean enableEquals = true;
- protected boolean enableHashCode = true;
- protected boolean enableMemberFields = true;
-
- protected boolean isAny = false;
-
- /**
- * 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
- * @param helper Helper class writer
- */
- protected J2eeBeanWriter(J2eeEmitter emitter,
- TypeEntry type,
- Vector elements,
- TypeEntry extendType,
- Vector attributes,
- JavaWriter helper) {
- super(emitter, emitter.getJaxRpcMapper().getJavaType(type.getQName()), "complexType");
- this.type = type;
- this.elements = elements;
- this.attributes = attributes;
- this.extendType = extendType;
- this.helper = (J2eeBeanHelperWriter) helper;
- if (type.isSimpleType()) {
- enableSimpleConstructors = true;
- enableToString = true;
- } else {
- // is this a complex type that is derived from other types
- // by restriction? if so, do not emit instance variables
- // or accessor/mutator pairs as those are inherited from
- // the super type, which must be non-null.
- if (null != extendType
- && null != SchemaUtils.getComplexElementRestrictionBase(type.getNode(),
- emitter.getSymbolTable())) {
- enableMemberFields = false;
- enableGetters = false;
- enableSetters = false;
- enableEquals = false;
- enableHashCode = false;
- }
- }
- } // ctor
-
- /**
- * Generate the binding for the given complex type.
- */
- protected void writeFileBody(PrintWriter pw) throws IOException {
-
- this.pw = pw;
-
- // Populate Names Vector with the names and types of the members.
- // The write methods use the names vector whenever they need to get
- // a member name or type. Moved to implements callback in order
- // to set any interface
- // preprocess();
-
- // Write Member Fields
- if (enableMemberFields) {
- writeMemberFields();
- }
-
- // Write the default constructor
- if (enableDefaultConstructor) {
- writeDefaultConstructor();
- }
-
- // Write Full Constructor
- if (enableFullConstructor) {
- writeFullConstructor();
- }
-
- // Write SimpleConstructors
- if (enableSimpleConstructors) {
- writeSimpleConstructors();
- }
-
- // Write ToString method
- if (enableToString) {
- writeToStringMethod();
- }
-
- // Write accessor methods
- writeAccessMethods();
-
- // Write general purpose equals and hashCode methods
- if (enableEquals) {
- writeEqualsMethod();
- }
- if (enableHashCode) {
- writeHashCodeMethod();
- }
-
- // Write the meta data into a Helper class or
- // embed it in the bean class
- if (!emitter.isHelperWanted()) {
- // Write the helper info into the bean class
- helper.setPrintWriter(pw);
- }
- helper.generate();
- } // writeFileBody
-
- /**
- * Builds the names String vector.
- * The even indices are the java class names of the
- * member fields. The odd indices are the member variable
- * names.
- * Also sets the simpleValueType variable to the
- * java class name of the simple value if this bean represents
- * a simple type
- */
- protected void preprocess() {
- // Add element names
- if (elements != null) {
- for (int i = 0; i < elements.size(); i++) {
- ElementDecl elem = (ElementDecl) elements.get(i);
- String typeName = elem.getType().getName();
- String variableName;
- if (elem.getAnyElement()) {
- typeName = "org.apache.axis.message.MessageElement []";
- variableName = Constants.ANYCONTENT;
- isAny = true;
- } else {
- String elemName = elem.getName().getLocalPart();
- variableName = Utils.xmlNameToJava(elemName);
- }
- names.add(typeName);
- names.add(variableName);
- if (type.isSimpleType() &&
- (variableName.endsWith("Value") || variableName.equals("value"))) {
- simpleValueTypes.add(typeName);
- }
- }
- }
- // Add attribute names
- if (attributes != null) {
- for (int i = 0; i < attributes.size(); i += 2) {
- String typeName = ((TypeEntry) attributes.get(i)).getName();
- QName xmlName = (QName) attributes.get(i + 1);
- String variableName =
- Utils.xmlNameToJava(xmlName.getLocalPart());
- names.add(typeName);
- names.add(variableName);
- if (type.isSimpleType() &&
- (variableName.endsWith("Value") || variableName.equals("value"))) {
- simpleValueTypes.add(typeName);
- }
- }
- }
-
- if (extendType != null && extendType.getDimensions().equals("[]")) {
- String typeName = extendType.getName();
- String elemName = extendType.getQName().getLocalPart();
- String variableName = Utils.xmlNameToJava(elemName);
- names.add(typeName);
- names.add(variableName);
- }
- }
-
- /**
- * Returns the appropriate extends text
- *
- * @return "" or "abstract "
- */
- protected String getClassModifiers() {
- Node node = type.getNode();
- if (node != null) {
- if (JavaUtils.isTrueExplicitly(Utils.getAttribute(node, "abstract"))) {
- return super.getClassModifiers() + "abstract ";
- }
- }
- return super.getClassModifiers();
- } // getClassModifiers
-
- /**
- * Returns the appropriate extends text
- *
- * @return "" or " extends <class> "
- */
- protected String getExtendsText() {
- // See if this class extends another class
- String extendsText = "";
- if (extendType != null && !type.isSimpleType() && extendType.getDimensions().length() == 0) {
- extendsText = " extends " + extendType.getName() + " ";
- }
- return extendsText;
- }
-
- /**
- * Returns the appropriate implements text
- *
- * @return " implements <classes> "
- */
- protected String getImplementsText() {
- // See if this class extends another class
- String implementsText = " implements java.io.Serializable";
- if (type.isSimpleType()) {
- implementsText += ", org.apache.axis.encoding.SimpleType";
- }
-
- // need to call this to find out whether the type contains any elements
- preprocess();
-
- if (isAny) {
- implementsText += ", org.apache.axis.encoding.AnyContentType";
- }
- ;
- implementsText += " ";
- return implementsText;
- }
-
- /**
- * Writes the member fields.
- */
- protected void writeMemberFields() {
- // Define the member element of the bean
- if (isUnion()) {
- pw.println(" private java.lang.String value;");
- return;
- }
- for (int i = 0; i < names.size(); i += 2) {
- String typeName = (String) names.get(i);
- String variable = (String) names.get(i + 1);
-
- // Declare the bean element
- pw.print(" private " + typeName + " " + variable + ";");
-
- // label the attribute fields.
- if (elements == null || i >= (elements.size() * 2))
- pw.println(" // attribute");
- else
- pw.println();
- }
- pw.println();
- }
-
- /**
- * Writes the default constructor.
- */
- protected void writeDefaultConstructor() {
- // Define the default constructor
- pw.println(" public " + className + "() {");
- pw.println(" }");
- pw.println();
- }
-
- /**
- * Writes the full constructor.
- * Note that this class is not recommended for
- * JSR 101 compliant beans, but is provided for
- * extended classes which may wish to generate a full
- * constructor.
- */
- protected void writeFullConstructor() {
- if (type.isSimpleType()) {
- return;
- }
- // The constructor needs to consider all extended types
- Vector extendList = new Vector();
- extendList.add(type);
- TypeEntry parent = extendType;
- while (parent != null) {
- extendList.add(parent);
- parent = SchemaUtils.getComplexElementExtensionBase(parent.getNode(),
- emitter.getSymbolTable());
- }
-
- // Now generate a list of names and types starting with
- // the oldest parent. (Attrs are considered before elements).
- Vector paramTypes = new Vector();
- Vector paramNames = new Vector();
- for (int i = extendList.size() - 1; i >= 0; i--) {
- TypeEntry te = (TypeEntry) extendList.elementAt(i);
-
- // The names of the inherited parms are mangled
- // in case they interfere with local parms.
- String mangle = "";
- if (i > 0) {
- mangle = "_" +
- Utils.xmlNameToJava(te.getQName().getLocalPart()) +
- "_";
- }
- // Process the attributes
- Vector attributes = SchemaUtils.getContainedAttributeTypes(te.getNode(), emitter.getSymbolTable());
- if (attributes != null) {
- for (int j = 0; j < attributes.size(); j += 2) {
- paramTypes.add(((TypeEntry) attributes.get(j)).getName());
- String name = ((QName) attributes.get(j + 1)).getLocalPart();
- paramNames.add(mangle + Utils.xmlNameToJava(name));
- }
- }
- // Process the elements
- Vector elements = SchemaUtils.getContainedElementDeclarations(te.getNode(), emitter.getSymbolTable());
- if (elements != null) {
- for (int j = 0; j < elements.size(); j++) {
- ElementDecl elem = (ElementDecl) elements.get(j);
- paramTypes.add(elem.getType().getName());
- paramNames.add(mangle +
- Utils.xmlNameToJava(elem.getName().getLocalPart()));
- }
- }
- }
- // Set the index where the local params start
- int localParams = paramTypes.size() - names.size() / 2;
-
-
- // Now write the constructor signature
- if (paramTypes.size() > 0) {
- pw.println(" public " + className + "(");
- for (int i = 0; i < paramTypes.size(); i++) {
- pw.print(" " + paramTypes.elementAt(i) +
- " " + paramNames.elementAt(i));
- if ((i + 1) < paramTypes.size()) {
- pw.println(",");
- } else {
- pw.println(") {");
- }
- }
-
- // Call the extended constructor to set inherited fields
- if (extendType != null && localParams > 0) {
- pw.println(" super(");
- for (int j = 0; j < localParams; j++) {
- pw.print(" " + paramNames.elementAt(j));
- if ((j + 1) < localParams) {
- pw.println(",");
- } else {
- pw.println(");");
- }
- }
- }
- // Set local fields directly
- for (int j = localParams; j < paramNames.size(); j++) {
- pw.println(" this." + paramNames.elementAt(j) +
- " = " + paramNames.elementAt(j) + ";");
- }
- pw.println(" }");
- pw.println();
- }
- }
-
- /**
- * Writes the constructors for SimpleTypes.
- * Writes a constructor accepting a string and
- * a constructor accepting the simple java type.
- */
- protected void writeSimpleConstructors() {
- // If this is a simple type,need to emit a string
- // constructor and a value construtor.
- if (simpleValueTypes.size() == 0) {
- return;
- }
- pw.println(" // " + Messages.getMessage("needStringCtor"));
- if (isUnion() || simpleValueTypes.get(0).equals("java.lang.String")) {
- pw.println(" public " + className + "(java.lang.String value) {");
- pw.println(" this.value = value;");
- pw.println(" }");
- for (Iterator iterator = simpleValueTypes.iterator();
- iterator.hasNext();) {
- String typeName = (String) iterator.next();
- if (typeName.equals("java.lang.String")) {
- continue;
- }
- pw.println(" public " + className + "(" + typeName + " value) {");
- pw.println(" setValue(value);");
- pw.println(" }");
- pw.println();
- }
- } else if (simpleValueTypes.size() == 1) {
- pw.println(" public " + className + "(" + simpleValueTypes.get(0) + " value) {");
- pw.println(" this.value = value;");
- pw.println(" }");
- pw.println(" public " + className + "(java.lang.String value) {");
- writeSimpleTypeGetter((String) simpleValueTypes.get(0), null, "this.value =");
- pw.println(" }");
- pw.println();
- }
- }
-
- protected void writeSimpleTypeGetter(String simpleValueType, String name, String returnString) {
- // Make sure we wrap base types with its Object type
- String wrapper = JavaUtils.getWrapper(simpleValueType);
-
- if (wrapper != null) {
- pw.println(" " + returnString + " new " + wrapper +
- "(value)." + simpleValueType + "Value();");
- } else {
- if (simpleValueType.equals("byte[]")) {
- pw.println(" " + returnString + " org.apache.axis.types.HexBinary.decode(value);");
- } else if (simpleValueType.equals("org.apache.axis.types.URI")) {
- pw.println(" try {");
- pw.println(" " + returnString + " new org.apache.axis.types.URI(value);");
- pw.println(" }");
- pw.println(" catch (org.apache.axis.types.URI.MalformedURIException mue) {");
- pw.println(" " + returnString + " new org.apache.axis.types.URI();");
- pw.println(" }");
- } else if (simpleValueType.equals("java.util.Date")) {
- pw.println(" try {");
- pw.println(" " + returnString + " (java.text.DateFormat.getDateTimeInstance()).parse(value);");
- pw.println(" }");
- pw.println(" catch (java.text.ParseException e){");
- pw.println(" throw new java.lang.RuntimeException(e.toString());");
- pw.println(" }");
- } else if (simpleValueType.equals("java.util.Calendar")) {
- pw.println(" java.util.Calendar cal =");
- pw.println(" (java.util.Calendar) new org.apache.axis.encoding.ser.CalendarDeserializer(");
- pw.println(" java.lang.String.class, org.apache.axis.Constants.XSD_STRING).makeValue(value);");
- pw.println(" " + returnString + " cal;");
- } else {
- pw.println(" " + returnString + " new " +
- simpleValueType + "(value);");
- }
- }
- }
-
- private boolean isUnion() {
- return this.simpleValueTypes.size() > 1;
- }
-
- /**
- * Writes the toString method
- * Currently the toString method is only written for
- * simpleTypes.
- */
- protected void writeToStringMethod() {
- // If this is a simple type, emit a toString
- if (simpleValueTypes.size() == 0) {
- return;
- }
- pw.println(" // " + Messages.getMessage("needToString"));
- pw.println(" public java.lang.String toString() {");
- if (isUnion() || simpleValueTypes.get(0).equals("java.lang.String")) {
- pw.println(" return value;");
- } else {
- String wrapper = JavaUtils.getWrapper((String) simpleValueTypes.get(0));
- if (wrapper != null) {
- pw.println(" return new " + wrapper + "(value).toString();");
- } else {
- if (simpleValueTypes.get(0).equals("byte[]")) {
- pw.println(" return value == null ? null : org.apache.axis.types.HexBinary.encode(value);");
- } else {
- pw.println(" return value == null ? null : value.toString();");
- }
- }
- }
- pw.println(" }");
- pw.println();
- }
-
- protected void writeSimpleTypeSetter(String simpleValueType) {
- String wrapper = JavaUtils.getWrapper(simpleValueType);
- if (wrapper != null) {
- pw.println(" this.value = new " + wrapper + "(value).toString();");
- } else {
- if (simpleValueType.equals("byte[]")) {
- pw.println(" this.value = value == null ? null : org.apache.axis.types.HexBinary.encode(value);");
- } else if (simpleValueType.equals("java.util.Calendar")) {
- pw.println(" this.value = value == null ? null : new org.apache.axis.encoding.ser.CalendarSerializer().getValueAsString(value, null);");
- } else {
- pw.println(" this.value = value == null ? null : value.toString();");
- }
- }
- }
-
- /**
- * Writes the setter and getter methods
- */
- protected void writeAccessMethods() {
- int j = 0;
- // Define getters and setters for the bean elements
- for (int i = 0; i < names.size(); i += 2, j++) {
- String typeName = (String) names.get(i);
- String name = (String) names.get(i + 1);
- String capName = Utils.capitalizeFirstChar(name);
-
- String get = "get";
- if (typeName.equals("boolean"))
- get = "is";
-
- if (enableGetters) {
- pw.println(" public " + typeName + " " +
- get + capName + "() {");
- if (isUnion()) {
- writeSimpleTypeGetter(typeName, name, "return");
- } else {
- pw.println(" return " + name + ";");
- }
- pw.println(" }");
- pw.println();
- }
- if (enableSetters) {
- if (isUnion()) {
- pw.println(" public void setValue(" +
- typeName + " value) {");
- writeSimpleTypeSetter(typeName);
- } else {
- pw.println(" public void set" + capName + "(" +
- typeName + " " + name + ") {");
- pw.println(" this." + name + " = " + name + ";");
- }
- pw.println(" }");
- pw.println();
- }
-
- // If this is a special collection type, insert extra
- // java code so that the serializer/deserializer can recognize
- // the class. This is not JAX-RPC, and will be replaced with
- // compliant code when JAX-RPC determines how to deal with this case.
- // These signatures comply with Bean Indexed Properties which seems
- // like the reasonable approach to take for collection types.
- // (It may be more efficient to handle this with an ArrayList...but
- // for the initial support it was easier to use an actual array.)
- if (elements != null && j < elements.size()) {
- ElementDecl elem = (ElementDecl) elements.get(j);
- if (elem.getType().getQName().getLocalPart().indexOf("[") > 0) {
- String compName = typeName.substring(0, typeName.lastIndexOf("["));
- if (enableGetters) {
- pw.println(" public " + compName + " " + get + capName +
- "(int i) {");
- pw.println(" return " + name + "[i];");
- pw.println(" }");
- pw.println();
- }
- if (enableSetters) {
- pw.println(" public void set" + capName + "(int i, " +
- compName + " value) {");
- // According to the section 7.2 of the JavaBeans
- // specification, the indexed setter should not
- // establish or grow the array. Thus the following
- // code is not generated for compliance purposes.
- /*
- int bracketIndex = typeName.indexOf("[");
- String newingName = typeName.substring(0, bracketIndex + 1);
- String newingSuffix = typeName.substring(bracketIndex + 1);
-
- pw.println(" if (this." + name + " == null ||");
- pw.println(" this." + name + ".length <= i) {");
- pw.println(" " + typeName + " a = new " +
- newingName + "i + 1" + newingSuffix + ";");
- pw.println(" if (this." + name + " != null) {");
- pw.println(" for(int j = 0; j < this." + name +
- ".length; j++)");
- pw.println(" a[j] = this." + name + "[j];");
- pw.println(" }");
- pw.println(" this." + name + " = a;");
- pw.println(" }");
- */
- pw.println(" this." + name + "[i] = value;");
- pw.println(" }");
- pw.println();
- }
- }
- }
- }
- }
-
- /**
- * Writes a general purpose equals method
- */
- protected void writeEqualsMethod() {
-
- // The __equalsCalc field and synchronized method are necessary
- // in case the object has direct or indirect references to itself.
- pw.println(" private java.lang.Object __equalsCalc = null;");
- pw.println(" public synchronized boolean equals(java.lang.Object obj) {");
-
- // First do the general comparison checks
- pw.println(" if (!(obj instanceof " + className + ")) return false;");
- pw.println(" " + className + " other = (" + className + ") obj;");
- pw.println(" if (obj == null) return false;");
- pw.println(" if (this == obj) return true;");
-
- // Have we been here before ? return true if yes otherwise false
- pw.println(" if (__equalsCalc != null) {");
- pw.println(" return (__equalsCalc == obj);");
- pw.println(" }");
- pw.println(" __equalsCalc = obj;");
-
- // Before checking the elements, check equality of the super class
- String truth = "true";
- if (extendType != null && !type.isSimpleType()) {
- truth = "super.equals(obj)";
- }
- pw.println(" boolean _equals;");
- if (names.size() == 0) {
- pw.println(" _equals = " + truth + ";");
- } else if (isUnion()) {
- pw.println(" _equals = " + truth + " && " +
- " this.toString().equals(obj.toString());");
- } else {
- pw.println(" _equals = " + truth + " && ");
- for (int i = 0; i < names.size(); i += 2) {
- String variableType = (String) names.get(i);
- String variable = (String) names.get(i + 1);
- String get = "get";
-
- if (variableType.equals("boolean"))
- get = "is";
-
- if (variableType.equals("int") ||
- variableType.equals("long") ||
- variableType.equals("short") ||
- variableType.equals("float") ||
- variableType.equals("double") ||
- variableType.equals("boolean") ||
- variableType.equals("byte")) {
- pw.print(" this." + variable + " == other." + get +
- Utils.capitalizeFirstChar(variable) + "()");
- } else if (variableType.indexOf("[") >= 0) {
- // Use java.util.Arrays.equals to compare arrays.
- pw.println(" ((this." + variable +
- "==null && other." + get +
- Utils.capitalizeFirstChar(variable) + "()==null) || ");
- pw.println(" (this." + variable + "!=null &&");
- pw.print(" java.util.Arrays.equals(this." + variable +
- ", other." + get +
- Utils.capitalizeFirstChar(variable) + "())))");
-
- } else {
- pw.println(" ((this." + variable +
- "==null && other." + get +
- Utils.capitalizeFirstChar(variable) + "()==null) || ");
- pw.println(" (this." + variable + "!=null &&");
- pw.print(" this." + variable +
- ".equals(other." + get +
- Utils.capitalizeFirstChar(variable) + "())))");
- }
- if (i == (names.size() - 2))
- pw.println(";");
- else
- pw.println(" &&");
- }
- }
- pw.println(" __equalsCalc = null;");
- pw.println(" return _equals;");
- pw.println(" }");
- pw.println("");
- }
-
- /**
- * Writes a general purpose hashCode method.
- */
- protected void writeHashCodeMethod() {
- // The __hashCodeCalc field and synchronized method are necessary
- // in case the object has direct or indirect references to itself.
- pw.println(" private boolean __hashCodeCalc = false;");
- pw.println(" public synchronized int hashCode() {");
- pw.println(" if (__hashCodeCalc) {");
- pw.println(" return 0;");
- pw.println(" }");
- pw.println(" __hashCodeCalc = true;");
-
- // Get the hashCode of the super class
- String start = "1";
- if (extendType != null && !type.isSimpleType()) {
- start = "super.hashCode()";
- }
- pw.println(" int _hashCode = " + start + ";");
- if (isUnion()) {
- pw.println(" if (this.value != null) {");
- pw.println(" _hashCode += this.value.hashCode();");
- pw.println(" }");
- }
- for (int i = 0; !isUnion() && (i < names.size()); i += 2) {
- String variableType = (String) names.get(i);
- String variable = (String) names.get(i + 1);
- String get = "get";
-
- if (variableType.equals("boolean"))
- get = "is";
-
- if (variableType.equals("int") ||
- variableType.equals("short") ||
- variableType.equals("byte")) {
- pw.println(" _hashCode += " + get +
- Utils.capitalizeFirstChar(variable) + "();");
- } else if (variableType.equals("boolean")) {
- pw.println(" _hashCode += (" + get +
- Utils.capitalizeFirstChar(variable) + "() ? Boolean.TRUE : Boolean.FALSE).hashCode();");
- } else if (variableType.equals("long")) {
- pw.println(" _hashCode += new Long(" + get +
- Utils.capitalizeFirstChar(variable) + "()).hashCode();");
- } else if (variableType.equals("float")) {
- pw.println(" _hashCode += new Float(" + get +
- Utils.capitalizeFirstChar(variable) + "()).hashCode();");
- } else if (variableType.equals("double")) {
- pw.println(" _hashCode += new Double(" + get +
- Utils.capitalizeFirstChar(variable) + "()).hashCode();");
- } else if (variableType.indexOf("[") >= 0) {
- // The hashCode calculation for arrays is complicated.
- // Wish there was a hashCode method in java.utils.Arrays !
- // Get the hashCode for each element of the array which is not an array.
- pw.println(" if (" + get +
- Utils.capitalizeFirstChar(variable) + "() != null) {");
- pw.println(" for (int i=0;");
- pw.println(" i<java.lang.reflect.Array.getLength(" + get +
- Utils.capitalizeFirstChar(variable) + "());");
- pw.println(" i++) {");
- pw.println(" java.lang.Object obj = java.lang.reflect.Array.get(" +
- get +
- Utils.capitalizeFirstChar(variable) + "(), i);");
- pw.println(" if (obj != null &&");
- pw.println(" !obj.getClass().isArray()) {");
- pw.println(" _hashCode += obj.hashCode();");
- pw.println(" }");
- pw.println(" }");
- pw.println(" }");
- } else {
- pw.println(" if (" + get +
- Utils.capitalizeFirstChar(variable) + "() != null) {");
- pw.println(" _hashCode += " + get +
- Utils.capitalizeFirstChar(variable) + "().hashCode();");
- pw.println(" }");
- }
- }
- // Reset the __hashCodeCalc variable and return
- pw.println(" __hashCodeCalc = false;");
- pw.println(" return _hashCode;");
- pw.println(" }");
- pw.println("");
- }
-} // class JavaBeanWriter
+/*
+* 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.Constants;
+import org.apache.axis.utils.JavaUtils;
+import org.apache.axis.utils.Messages;
+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.JavaWriter;
+import org.apache.axis.wsdl.toJava.Utils;
+import org.w3c.dom.Node;
+
+import javax.xml.namespace.QName;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Vector;
+
+/**
+ * This is Wsdl2java's Complex Type Writer. It writes the <typeName>.java file.
+ *
+ * @author Ias (iasandcb@tmax.co.kr)
+ * @deprecated no more used by J2eeGeneratorFactory
+ */
+public class J2eeBeanWriter extends J2eeClassWriter {
+ private TypeEntry type;
+ private Vector elements;
+ private Vector attributes;
+ private TypeEntry extendType;
+ protected J2eeBeanHelperWriter helper;
+ protected Vector names = new Vector(); // even indices: types, odd: vars
+ protected ArrayList simpleValueTypes = new ArrayList(); // name of type of simple value
+ protected PrintWriter pw;
+
+ // The following fields can be set by extended classes
+ // to control processing
+ protected boolean enableDefaultConstructor = true;
+ protected boolean enableFullConstructor = false;
+ protected boolean enableSimpleConstructors = false;
+ protected boolean enableToString = false;
+ protected boolean enableSetters = true;
+ protected boolean enableGetters = true;
+ protected boolean enableEquals = true;
+ protected boolean enableHashCode = true;
+ protected boolean enableMemberFields = true;
+
+ protected boolean isAny = false;
+
+ /**
+ * 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
+ * @param helper Helper class writer
+ */
+ protected J2eeBeanWriter(J2eeEmitter emitter,
+ TypeEntry type,
+ Vector elements,
+ TypeEntry extendType,
+ Vector attributes,
+ JavaWriter helper) {
+ super(emitter, emitter.getJaxRpcMapper().getJavaType(type.getQName()), "complexType");
+ this.type = type;
+ this.elements = elements;
+ this.attributes = attributes;
+ this.extendType = extendType;
+ this.helper = (J2eeBeanHelperWriter) helper;
+ if (type.isSimpleType()) {
+ enableSimpleConstructors = true;
+ enableToString = true;
+ } else {
+ // is this a complex type that is derived from other types
+ // by restriction? if so, do not emit instance variables
+ // or accessor/mutator pairs as those are inherited from
+ // the super type, which must be non-null.
+ if (null != extendType
+ && null != SchemaUtils.getComplexElementRestrictionBase(type.getNode(),
+ emitter.getSymbolTable())) {
+ enableMemberFields = false;
+ enableGetters = false;
+ enableSetters = false;
+ enableEquals = false;
+ enableHashCode = false;
+ }
+ }
+ } // ctor
+
+ /**
+ * Generate the binding for the given complex type.
+ */
+ protected void writeFileBody(PrintWriter pw) throws IOException {
+
+ this.pw = pw;
+
+ // Populate Names Vector with the names and types of the members.
+ // The write methods use the names vector whenever they need to get
+ // a member name or type. Moved to implements callback in order
+ // to set any interface
+ // preprocess();
+
+ // Write Member Fields
+ if (enableMemberFields) {
+ writeMemberFields();
+ }
+
+ // Write the default constructor
+ if (enableDefaultConstructor) {
+ writeDefaultConstructor();
+ }
+
+ // Write Full Constructor
+ if (enableFullConstructor) {
+ writeFullConstructor();
+ }
+
+ // Write SimpleConstructors
+ if (enableSimpleConstructors) {
+ writeSimpleConstructors();
+ }
+
+ // Write ToString method
+ if (enableToString) {
+ writeToStringMethod();
+ }
+
+ // Write accessor methods
+ writeAccessMethods();
+
+ // Write general purpose equals and hashCode methods
+ if (enableEquals) {
+ writeEqualsMethod();
+ }
+ if (enableHashCode) {
+ writeHashCodeMethod();
+ }
+
+ // Write the meta data into a Helper class or
+ // embed it in the bean class
+ if (!emitter.isHelperWanted()) {
+ // Write the helper info into the bean class
+ helper.setPrintWriter(pw);
+ }
+ helper.generate();
+ } // writeFileBody
+
+ /**
+ * Builds the names String vector.
+ * The even indices are the java class names of the
+ * member fields. The odd indices are the member variable
+ * names.
+ * Also sets the simpleValueType variable to the
+ * java class name of the simple value if this bean represents
+ * a simple type
+ */
+ protected void preprocess() {
+ // Add element names
+ if (elements != null) {
+ for (int i = 0; i < elements.size(); i++) {
+ ElementDecl elem = (ElementDecl) elements.get(i);
+ String typeName = elem.getType().getName();
+ String variableName;
+ if (elem.getAnyElement()) {
+ typeName = "org.apache.axis.message.MessageElement []";
+ variableName = Constants.ANYCONTENT;
+ isAny = true;
+ } else {
+ variableName = elem.getName();
+ }
+ names.add(typeName);
+ names.add(variableName);
+ if (type.isSimpleType() &&
+ (variableName.endsWith("Value") || variableName.equals("value"))) {
+ simpleValueTypes.add(typeName);
+ }
+ }
+ }
+ // Add attribute names
+ if (attributes != null) {
+ for (int i = 0; i < attributes.size(); i += 2) {
+ String typeName = ((TypeEntry) attributes.get(i)).getName();
+ QName xmlName = (QName) attributes.get(i + 1);
+ String variableName =
+ Utils.xmlNameToJava(xmlName.getLocalPart());
+ names.add(typeName);
+ names.add(variableName);
+ if (type.isSimpleType() &&
+ (variableName.endsWith("Value") || variableName.equals("value"))) {
+ simpleValueTypes.add(typeName);
+ }
+ }
+ }
+
+ if (extendType != null && extendType.getDimensions().equals("[]")) {
+ String typeName = extendType.getName();
+ String elemName = extendType.getQName().getLocalPart();
+ String variableName = Utils.xmlNameToJava(elemName);
+ names.add(typeName);
+ names.add(variableName);
+ }
+ }
+
+ /**
+ * Returns the appropriate extends text
+ *
+ * @return "" or "abstract "
+ */
+ protected String getClassModifiers() {
+ Node node = type.getNode();
+ if (node != null) {
+ if (JavaUtils.isTrueExplicitly(Utils.getAttribute(node, "abstract"))) {
+ return super.getClassModifiers() + "abstract ";
+ }
+ }
+ return super.getClassModifiers();
+ } // getClassModifiers
+
+ /**
+ * Returns the appropriate extends text
+ *
+ * @return "" or " extends <class> "
+ */
+ protected String getExtendsText() {
+ // See if this class extends another class
+ String extendsText = "";
+ if (extendType != null && !type.isSimpleType() && extendType.getDimensions().length() == 0) {
+ extendsText = " extends " + extendType.getName() + " ";
+ }
+ return extendsText;
+ }
+
+ /**
+ * Returns the appropriate implements text
+ *
+ * @return " implements <classes> "
+ */
+ protected String getImplementsText() {
+ // See if this class extends another class
+ String implementsText = " implements java.io.Serializable";
+ if (type.isSimpleType()) {
+ implementsText += ", org.apache.axis.encoding.SimpleType";
+ }
+
+ // need to call this to find out whether the type contains any elements
+ preprocess();
+
+ if (isAny) {
+ implementsText += ", org.apache.axis.encoding.AnyContentType";
+ }
+ ;
+ implementsText += " ";
+ return implementsText;
+ }
+
+ /**
+ * Writes the member fields.
+ */
+ protected void writeMemberFields() {
+ // Define the member element of the bean
+ if (isUnion()) {
+ pw.println(" private java.lang.String value;");
+ return;
+ }
+ for (int i = 0; i < names.size(); i += 2) {
+ String typeName = (String) names.get(i);
+ String variable = (String) names.get(i + 1);
+
+ // Declare the bean element
+ pw.print(" private " + typeName + " " + variable + ";");
+
+ // label the attribute fields.
+ if (elements == null || i >= (elements.size() * 2))
+ pw.println(" // attribute");
+ else
+ pw.println();
+ }
+ pw.println();
+ }
+
+ /**
+ * Writes the default constructor.
+ */
+ protected void writeDefaultConstructor() {
+ // Define the default constructor
+ pw.println(" public " + className + "() {");
+ pw.println(" }");
+ pw.println();
+ }
+
+ /**
+ * Writes the full constructor.
+ * Note that this class is not recommended for
+ * JSR 101 compliant beans, but is provided for
+ * extended classes which may wish to generate a full
+ * constructor.
+ */
+ protected void writeFullConstructor() {
+ if (type.isSimpleType()) {
+ return;
+ }
+ // The constructor needs to consider all extended types
+ Vector extendList = new Vector();
+ extendList.add(type);
+ TypeEntry parent = extendType;
+ while (parent != null) {
+ extendList.add(parent);
+ parent = SchemaUtils.getComplexElementExtensionBase(parent.getNode(),
+ emitter.getSymbolTable());
+ }
+
+ // Now generate a list of names and types starting with
+ // the oldest parent. (Attrs are considered before elements).
+ Vector paramTypes = new Vector();
+ Vector paramNames = new Vector();
+ for (int i = extendList.size() - 1; i >= 0; i--) {
+ TypeEntry te = (TypeEntry) extendList.elementAt(i);
+
+ // The names of the inherited parms are mangled
+ // in case they interfere with local parms.
+ String mangle = "";
+ if (i > 0) {
+ mangle = "_" +
+ Utils.xmlNameToJava(te.getQName().getLocalPart()) +
+ "_";
+ }
+ // Process the attributes
+ Vector attributes = SchemaUtils.getContainedAttributeTypes(te.getNode(), emitter.getSymbolTable());
+ if (attributes != null) {
+ for (int j = 0; j < attributes.size(); j += 2) {
+ paramTypes.add(((TypeEntry) attributes.get(j)).getName());
+ String name = ((QName) attributes.get(j + 1)).getLocalPart();
+ paramNames.add(mangle + Utils.xmlNameToJava(name));
+ }
+ }
+ // Process the elements
+ Vector elements = SchemaUtils.getContainedElementDeclarations(te.getNode(), emitter.getSymbolTable());
+ if (elements != null) {
+ for (int j = 0; j < elements.size(); j++) {
+ ElementDecl elem = (ElementDecl) elements.get(j);
+ paramTypes.add(elem.getType().getName());
+ paramNames.add(mangle +elem.getName());
+ }
+ }
+ }
+ // Set the index where the local params start
+ int localParams = paramTypes.size() - names.size() / 2;
+
+
+ // Now write the constructor signature
+ if (paramTypes.size() > 0) {
+ pw.println(" public " + className + "(");
+ for (int i = 0; i < paramTypes.size(); i++) {
+ pw.print(" " + paramTypes.elementAt(i) +
+ " " + paramNames.elementAt(i));
+ if ((i + 1) < paramTypes.size()) {
+ pw.println(",");
+ } else {
+ pw.println(") {");
+ }
+ }
+
+ // Call the extended constructor to set inherited fields
+ if (extendType != null && localParams > 0) {
+ pw.println(" super(");
+ for (int j = 0; j < localParams; j++) {
+ pw.print(" " + paramNames.elementAt(j));
+ if ((j + 1) < localParams) {
+ pw.println(",");
+ } else {
+ pw.println(");");
+ }
+ }
+ }
+ // Set local fields directly
+ for (int j = localParams; j < paramNames.size(); j++) {
+ pw.println(" this." + paramNames.elementAt(j) +
+ " = " + paramNames.elementAt(j) + ";");
+ }
+ pw.println(" }");
+ pw.println();
+ }
+ }
+
+ /**
+ * Writes the constructors for SimpleTypes.
+ * Writes a constructor accepting a string and
+ * a constructor accepting the simple java type.
+ */
+ protected void writeSimpleConstructors() {
+ // If this is a simple type,need to emit a string
+ // constructor and a value construtor.
+ if (simpleValueTypes.size() == 0) {
+ return;
+ }
+ pw.println(" // " + Messages.getMessage("needStringCtor"));
+ if (isUnion() || simpleValueTypes.get(0).equals("java.lang.String")) {
+ pw.println(" public " + className + "(java.lang.String value) {");
+ pw.println(" this.value = value;");
+ pw.println(" }");
+ for (Iterator iterator = simpleValueTypes.iterator();
+ iterator.hasNext();) {
+ String typeName = (String) iterator.next();
+ if (typeName.equals("java.lang.String")) {
+ continue;
+ }
+ pw.println(" public " + className + "(" + typeName + " value) {");
+ pw.println(" setValue(value);");
+ pw.println(" }");
+ pw.println();
+ }
+ } else if (simpleValueTypes.size() == 1) {
+ pw.println(" public " + className + "(" + simpleValueTypes.get(0) + " value) {");
+ pw.println(" this.value = value;");
+ pw.println(" }");
+ pw.println(" public " + className + "(java.lang.String value) {");
+ writeSimpleTypeGetter((String) simpleValueTypes.get(0), null, "this.value =");
+ pw.println(" }");
+ pw.println();
+ }
+ }
+
+ protected void writeSimpleTypeGetter(String simpleValueType, String name, String returnString) {
+ // Make sure we wrap base types with its Object type
+ String wrapper = JavaUtils.getWrapper(simpleValueType);
+
+ if (wrapper != null) {
+ pw.println(" " + returnString + " new " + wrapper +
+ "(value)." + simpleValueType + "Value();");
+ } else {
+ if (simpleValueType.equals("byte[]")) {
+ pw.println(" " + returnString + " org.apache.axis.types.HexBinary.decode(value);");
+ } else if (simpleValueType.equals("org.apache.axis.types.URI")) {
+ pw.println(" try {");
+ pw.println(" " + returnString + " new org.apache.axis.types.URI(value);");
+ pw.println(" }");
+ pw.println(" catch (org.apache.axis.types.URI.MalformedURIException mue) {");
+ pw.println(" " + returnString + " new org.apache.axis.types.URI();");
+ pw.println(" }");
+ } else if (simpleValueType.equals("java.util.Date")) {
+ pw.println(" try {");
+ pw.println(" " + returnString + " (java.text.DateFormat.getDateTimeInstance()).parse(value);");
+ pw.println(" }");
+ pw.println(" catch (java.text.ParseException e){");
+ pw.println(" throw new java.lang.RuntimeException(e.toString());");
+ pw.println(" }");
+ } else if (simpleValueType.equals("java.util.Calendar")) {
+ pw.println(" java.util.Calendar cal =");
+ pw.println(" (java.util.Calendar) new org.apache.axis.encoding.ser.CalendarDeserializer(");
+ pw.println(" java.lang.String.class, org.apache.axis.Constants.XSD_STRING).makeValue(value);");
+ pw.println(" " + returnString + " cal;");
+ } else {
+ pw.println(" " + returnString + " new " +
+ simpleValueType + "(value);");
+ }
+ }
+ }
+
+ private boolean isUnion() {
+ return this.simpleValueTypes.size() > 1;
+ }
+
+ /**
+ * Writes the toString method
+ * Currently the toString method is only written for
+ * simpleTypes.
+ */
+ protected void writeToStringMethod() {
+ // If this is a simple type, emit a toString
+ if (simpleValueTypes.size() == 0) {
+ return;
+ }
+ pw.println(" // " + Messages.getMessage("needToString"));
+ pw.println(" public java.lang.String toString() {");
+ if (isUnion() || simpleValueTypes.get(0).equals("java.lang.String")) {
+ pw.println(" return value;");
+ } else {
+ String wrapper = JavaUtils.getWrapper((String) simpleValueTypes.get(0));
+ if (wrapper != null) {
+ pw.println(" return new " + wrapper + "(value).toString();");
+ } else {
+ if (simpleValueTypes.get(0).equals("byte[]")) {
+ pw.println(" return value == null ? null : org.apache.axis.types.HexBinary.encode(value);");
+ } else {
+ pw.println(" return value == null ? null : value.toString();");
+ }
+ }
+ }
+ pw.println(" }");
+ pw.println();
+ }
+
+ protected void writeSimpleTypeSetter(String simpleValueType) {
+ String wrapper = JavaUtils.getWrapper(simpleValueType);
+ if (wrapper != null) {
+ pw.println(" this.value = new " + wrapper + "(value).toString();");
+ } else {
+ if (simpleValueType.equals("byte[]")) {
+ pw.println(" this.value = value == null ? null : org.apache.axis.types.HexBinary.encode(value);");
+ } else if (simpleValueType.equals("java.util.Calendar")) {
+ pw.println(" this.value = value == null ? null : new org.apache.axis.encoding.ser.CalendarSerializer().getValueAsString(value, null);");
+ } else {
+ pw.println(" this.value = value == null ? null : value.toString();");
+ }
+ }
+ }
+
+ /**
+ * Writes the setter and getter methods
+ */
+ protected void writeAccessMethods() {
+ int j = 0;
+ // Define getters and setters for the bean elements
+ for (int i = 0; i < names.size(); i += 2, j++) {
+ String typeName = (String) names.get(i);
+ String name = (String) names.get(i + 1);
+ String capName = Utils.capitalizeFirstChar(name);
+
+ String get = "get";
+ if (typeName.equals("boolean"))
+ get = "is";
+
+ if (enableGetters) {
+ pw.println(" public " + typeName + " " +
+ get + capName + "() {");
+ if (isUnion()) {
+ writeSimpleTypeGetter(typeName, name, "return");
+ } else {
+ pw.println(" return " + name + ";");
+ }
+ pw.println(" }");
+ pw.println();
+ }
+ if (enableSetters) {
+ if (isUnion()) {
+ pw.println(" public void setValue(" +
+ typeName + " value) {");
+ writeSimpleTypeSetter(typeName);
+ } else {
+ pw.println(" public void set" + capName + "(" +
+ typeName + " " + name + ") {");
+ pw.println(" this." + name + " = " + name + ";");
+ }
+ pw.println(" }");
+ pw.println();
+ }
+
+ // If this is a special collection type, insert extra
+ // java code so that the serializer/deserializer can recognize
+ // the class. This is not JAX-RPC, and will be replaced with
+ // compliant code when JAX-RPC determines how to deal with this case.
+ // These signatures comply with Bean Indexed Properties which seems
+ // like the reasonable approach to take for collection types.
+ // (It may be more efficient to handle this with an ArrayList...but
+ // for the initial support it was easier to use an actual array.)
+ if (elements != null && j < elements.size()) {
+ ElementDecl elem = (ElementDecl) elements.get(j);
+ if (elem.getType().getQName().getLocalPart().indexOf("[") > 0) {
+ String compName = typeName.substring(0, typeName.lastIndexOf("["));
+ if (enableGetters) {
+ pw.println(" public " + compName + " " + get + capName +
+ "(int i) {");
+ pw.println(" return " + name + "[i];");
+ pw.println(" }");
+ pw.println();
+ }
+ if (enableSetters) {
+ pw.println(" public void set" + capName + "(int i, " +
+ compName + " value) {");
+ // According to the section 7.2 of the JavaBeans
+ // specification, the indexed setter should not
+ // establish or grow the array. Thus the following
+ // code is not generated for compliance purposes.
+ /*
+ int bracketIndex = typeName.indexOf("[");
+ String newingName = typeName.substring(0, bracketIndex + 1);
+ String newingSuffix = typeName.substring(bracketIndex + 1);
+
+ pw.println(" if (this." + name + " == null ||");
+ pw.println(" this." + name + ".length <= i) {");
+ pw.println(" " + typeName + " a = new " +
+ newingName + "i + 1" + newingSuffix + ";");
+ pw.println(" if (this." + name + " != null) {");
+ pw.println(" for(int j = 0; j < this." + name +
+ ".length; j++)");
+ pw.println(" a[j] = this." + name + "[j];");
+ pw.println(" }");
+ pw.println(" this." + name + " = a;");
+ pw.println(" }");
+ */
+ pw.println(" this." + name + "[i] = value;");
+ pw.println(" }");
+ pw.println();
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Writes a general purpose equals method
+ */
+ protected void writeEqualsMethod() {
+
+ // The __equalsCalc field and synchronized method are necessary
+ // in case the object has direct or indirect references to itself.
+ pw.println(" private java.lang.Object __equalsCalc = null;");
+ pw.println(" public synchronized boolean equals(java.lang.Object obj) {");
+
+ // First do the general comparison checks
+ pw.println(" if (!(obj instanceof " + className + ")) return false;");
+ pw.println(" " + className + " other = (" + className + ") obj;");
+ pw.println(" if (obj == null) return false;");
+ pw.println(" if (this == obj) return true;");
+
+ // Have we been here before ? return true if yes otherwise false
+ pw.println(" if (__equalsCalc != null) {");
+ pw.println(" return (__equalsCalc == obj);");
+ pw.println(" }");
+ pw.println(" __equalsCalc = obj;");
+
+ // Before checking the elements, check equality of the super class
+ String truth = "true";
+ if (extendType != null && !type.isSimpleType()) {
+ truth = "super.equals(obj)";
+ }
+ pw.println(" boolean _equals;");
+ if (names.size() == 0) {
+ pw.println(" _equals = " + truth + ";");
+ } else if (isUnion()) {
+ pw.println(" _equals = " + truth + " && " +
+ " this.toString().equals(obj.toString());");
+ } else {
+ pw.println(" _equals = " + truth + " && ");
+ for (int i = 0; i < names.size(); i += 2) {
+ String variableType = (String) names.get(i);
+ String variable = (String) names.get(i + 1);
+ String get = "get";
+
+ if (variableType.equals("boolean"))
+ get = "is";
+
+ if (variableType.equals("int") ||
+ variableType.equals("long") ||
+ variableType.equals("short") ||
+ variableType.equals("float") ||
+ variableType.equals("double") ||
+ variableType.equals("boolean") ||
+ variableType.equals("byte")) {
+ pw.print(" this." + variable + " == other." + get +
+ Utils.capitalizeFirstChar(variable) + "()");
+ } else if (variableType.indexOf("[") >= 0) {
+ // Use java.util.Arrays.equals to compare arrays.
+ pw.println(" ((this." + variable +
+ "==null && other." + get +
+ Utils.capitalizeFirstChar(variable) + "()==null) || ");
+ pw.println(" (this." + variable + "!=null &&");
+ pw.print(" java.util.Arrays.equals(this." + variable +
+ ", other." + get +
+ Utils.capitalizeFirstChar(variable) + "())))");
+
+ } else {
+ pw.println(" ((this." + variable +
+ "==null && other." + get +
+ Utils.capitalizeFirstChar(variable) + "()==null) || ");
+ pw.println(" (this." + variable + "!=null &&");
+ pw.print(" this." + variable +
+ ".equals(other." + get +
+ Utils.capitalizeFirstChar(variable) + "())))");
+ }
+ if (i == (names.size() - 2))
+ pw.println(";");
+ else
+ pw.println(" &&");
+ }
+ }
+ pw.println(" __equalsCalc = null;");
+ pw.println(" return _equals;");
+ pw.println(" }");
+ pw.println("");
+ }
+
+ /**
+ * Writes a general purpose hashCode method.
+ */
+ protected void writeHashCodeMethod() {
+ // The __hashCodeCalc field and synchronized method are necessary
+ // in case the object has direct or indirect references to itself.
+ pw.println(" private boolean __hashCodeCalc = false;");
+ pw.println(" public synchronized int hashCode() {");
+ pw.println(" if (__hashCodeCalc) {");
+ pw.println(" return 0;");
+ pw.println(" }");
+ pw.println(" __hashCodeCalc = true;");
+
+ // Get the hashCode of the super class
+ String start = "1";
+ if (extendType != null && !type.isSimpleType()) {
+ start = "super.hashCode()";
+ }
+ pw.println(" int _hashCode = " + start + ";");
+ if (isUnion()) {
+ pw.println(" if (this.value != null) {");
+ pw.println(" _hashCode += this.value.hashCode();");
+ pw.println(" }");
+ }
+ for (int i = 0; !isUnion() && (i < names.size()); i += 2) {
+ String variableType = (String) names.get(i);
+ String variable = (String) names.get(i + 1);
+ String get = "get";
+
+ if (variableType.equals("boolean"))
+ get = "is";
+
+ if (variableType.equals("int") ||
+ variableType.equals("short") ||
+ variableType.equals("byte")) {
+ pw.println(" _hashCode += " + get +
+ Utils.capitalizeFirstChar(variable) + "();");
+ } else if (variableType.equals("boolean")) {
+ pw.println(" _hashCode += (" + get +
+ Utils.capitalizeFirstChar(variable) + "() ? Boolean.TRUE : Boolean.FALSE).hashCode();");
+ } else if (variableType.equals("long")) {
+ pw.println(" _hashCode += new Long(" + get +
+ Utils.capitalizeFirstChar(variable) + "()).hashCode();");
+ } else if (variableType.equals("float")) {
+ pw.println(" _hashCode += new Float(" + get +
+ Utils.capitalizeFirstChar(variable) + "()).hashCode();");
+ } else if (variableType.equals("double")) {
+ pw.println(" _hashCode += new Double(" + get +
+ Utils.capitalizeFirstChar(variable) + "()).hashCode();");
+ } else if (variableType.indexOf("[") >= 0) {
+ // The hashCode calculation for arrays is complicated.
+ // Wish there was a hashCode method in java.utils.Arrays !
+ // Get the hashCode for each element of the array which is not an array.
+ pw.println(" if (" + get +
+ Utils.capitalizeFirstChar(variable) + "() != null) {");
+ pw.println(" for (int i=0;");
+ pw.println(" i<java.lang.reflect.Array.getLength(" + get +
+ Utils.capitalizeFirstChar(variable) + "());");
+ pw.println(" i++) {");
+ pw.println(" java.lang.Object obj = java.lang.reflect.Array.get(" +
+ get +
+ Utils.capitalizeFirstChar(variable) + "(), i);");
+ pw.println(" if (obj != null &&");
+ pw.println(" !obj.getClass().isArray()) {");
+ pw.println(" _hashCode += obj.hashCode();");
+ pw.println(" }");
+ pw.println(" }");
+ pw.println(" }");
+ } else {
+ pw.println(" if (" + get +
+ Utils.capitalizeFirstChar(variable) + "() != null) {");
+ pw.println(" _hashCode += " + get +
+ Utils.capitalizeFirstChar(variable) + "().hashCode();");
+ pw.println(" }");
+ }
+ }
+ // Reset the __hashCodeCalc variable and return
+ pw.println(" __hashCodeCalc = false;");
+ pw.println(" return _hashCode;");
+ pw.println(" }");
+ pw.println("");
+ }
+} // class JavaBeanWriter