package org.jboss.axis.wsdl.toJava;
import org.jboss.axis.Constants;
import org.jboss.axis.message.SOAPElementAxisImpl;
import org.jboss.axis.utils.JavaUtils;
import org.jboss.axis.utils.Messages;
import org.jboss.axis.wsdl.symbolTable.ElementDecl;
import org.jboss.axis.wsdl.symbolTable.SchemaUtils;
import org.jboss.axis.wsdl.symbolTable.TypeEntry;
import org.w3c.dom.Node;
import javax.xml.namespace.QName;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
public class JavaBeanWriter extends JavaClassWriter
{
private TypeEntry type;
private Vector elements;
private Vector attributes;
private TypeEntry extendType;
protected JavaBeanHelperWriter helper;
protected Vector names = new Vector(); protected String simpleValueType = null; protected PrintWriter pw;
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 JavaBeanWriter(Emitter emitter,
TypeEntry type,
Vector elements,
TypeEntry extendType,
Vector attributes,
JavaWriter helper)
{
super(emitter, type.getName(), "complexType");
this.type = type;
this.elements = elements;
this.attributes = attributes;
this.extendType = extendType;
this.helper = (JavaBeanHelperWriter)helper;
if (type.isSimpleType())
{
enableSimpleConstructors = true;
enableToString = true;
}
}
protected void writeFileBody(PrintWriter pw) throws IOException
{
this.pw = pw;
preprocess();
writeMemberFields();
if (enableDefaultConstructor)
{
writeDefaultConstructor();
}
if (enableFullConstructor)
{
writeFullConstructor();
}
if (enableSimpleConstructors)
{
writeSimpleConstructors();
}
if (enableToString)
{
writeToStringMethod();
}
writeAccessMethods();
if (enableEquals)
{
writeEqualsMethod();
}
if (enableHashCode)
{
writeHashCodeMethod();
}
if (!emitter.isHelperWanted())
{
helper.setPrintWriter(pw);
}
helper.generate();
}
protected void preprocess()
{
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 = SOAPElementAxisImpl.class.getName() + "[]";
variableName = Constants.ANYCONTENT;
}
else
{
String elemName = elem.getName().getLocalPart();
variableName = Utils.xmlNameToJava(elemName);
}
names.add(typeName);
names.add(variableName);
if (type.isSimpleType() &&
variableName.equals("value"))
{
simpleValueType = typeName;
}
}
}
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.equals("value"))
{
simpleValueType = 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);
}
}
protected String getClassModifiers()
{
Node node = type.getNode();
if (node != null)
{
if (JavaUtils.isTrueExplicitly(Utils.getAttribute(node, "abstract")))
{
return super.getClassModifiers() + "abstract ";
}
}
return super.getClassModifiers();
}
protected String getExtendsText()
{
String extendsText = "";
if (extendType != null && !type.isSimpleType() && extendType.getDimensions().length() == 0)
{
extendsText = " extends " + extendType.getName() + " ";
}
return extendsText;
}
protected String getImplementsText()
{
String implementsText = " implements java.io.Serializable";
if (type.isSimpleType())
{
implementsText += ", org.jboss.axis.encoding.SimpleType";
}
implementsText += " ";
return implementsText;
}
protected void writeMemberFields()
{
for (int i = 0; i < names.size(); i += 2)
{
String typeName = (String)names.get(i);
String variable = (String)names.get(i + 1);
pw.print(" private " + typeName + " " + variable + ";");
if (elements == null || i >= (elements.size() * 2))
pw.println(" // attribute");
else
pw.println();
}
pw.println();
}
protected void writeDefaultConstructor()
{
pw.println(" public " + className + "() {");
pw.println(" }");
pw.println();
}
protected void writeFullConstructor()
{
Vector extendList = new Vector();
extendList.add(type);
TypeEntry parent = extendType;
while (parent != null)
{
extendList.add(parent);
parent = SchemaUtils.getComplexElementExtensionBase(parent.getNode(),
emitter.getSymbolTable());
}
Vector paramTypes = new Vector();
Vector paramNames = new Vector();
for (int i = extendList.size() - 1; i >= 0; i--)
{
TypeEntry te = (TypeEntry)extendList.elementAt(i);
String mangle = "";
if (i > 0)
{
mangle = "_" +
Utils.xmlNameToJava(te.getQName().getLocalPart()) +
"_";
}
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));
}
}
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()));
}
}
}
int localParams = paramTypes.size() - names.size() / 2;
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(") {");
}
}
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(");");
}
}
}
for (int j = localParams; j < paramNames.size(); j++)
{
pw.println(" this." + paramNames.elementAt(j) +
" = " + paramNames.elementAt(j) + ";");
}
pw.println(" }");
pw.println();
}
}
protected void writeSimpleConstructors()
{
if (type.isSimpleType() && simpleValueType != null)
{
if (!simpleValueType.equals("java.lang.String"))
{
pw.println(" public " + className + "(" +
simpleValueType + " value) {");
pw.println(" this.value = value;");
pw.println(" }");
pw.println();
}
pw.println(" // " + Messages.getMessage("needStringCtor"));
pw.println(" public " + className + "(java.lang.String value) {");
String wrapper = JavaUtils.getWrapper(simpleValueType);
if (wrapper != null)
{
pw.println(" this.value = new " + wrapper +
"(value)." + simpleValueType + "Value();");
}
else
{
if (simpleValueType.equals("byte[]"))
{
pw.println(" this.value = org.jboss.axis.types.HexBinary.decode(value);");
}
else if (simpleValueType.equals("org.jboss.axis.types.URI"))
{
pw.println(" try {");
pw.println(" this.value = new org.jboss.axis.types.URI(value);");
pw.println(" }");
pw.println(" catch (org.jboss.axis.types.URI.MalformedURIException mue) {");
pw.println(" this.value = new org.jboss.axis.types.URI();");
pw.println(" }");
}
else if (simpleValueType.equals("java.util.Date"))
{
pw.println(" try {");
pw.println(" this.value = (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 = java.util.Calendar.getInstance();");
pw.println(" try {");
pw.println(" java.util.Date dt = (java.text.DateFormat.getDateTimeInstance()).parse(value);");
pw.println(" cal.setTime(dt);");
pw.println(" this.value = cal;");
pw.println(" }");
pw.println(" catch (java.text.ParseException e){");
pw.println(" throw new java.lang.RuntimeException(e.toString());");
pw.println(" }");
}
else
{
pw.println(" this.value = new " +
simpleValueType + "(value);");
}
}
pw.println(" }");
pw.println();
}
}
protected void writeToStringMethod()
{
if (type.isSimpleType() && simpleValueType != null)
{
pw.println(" // " + Messages.getMessage("needToString"));
String wrapper = JavaUtils.getWrapper(simpleValueType);
pw.println(" public java.lang.String toString() {");
if (wrapper != null)
{
pw.println(" return new " + wrapper + "(value).toString();");
}
else
{
if (simpleValueType.equals("byte[]"))
{
pw.println(" return value == null ? null : org.jboss.axis.types.HexBinary.encode(value);");
}
else
{
pw.println(" return value == null ? null : value.toString();");
}
}
pw.println(" }");
pw.println();
}
}
protected void writeAccessMethods()
{
int j = 0;
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 + "() {");
pw.println(" return " + name + ";");
pw.println(" }");
pw.println();
}
if (enableSetters)
{
pw.println(" public void set" + capName + "(" +
typeName + " " + name + ") {");
pw.println(" this." + name + " = " + name + ";");
pw.println(" }");
pw.println();
}
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) {");
pw.println(" this." + name + "[i] = value;");
pw.println(" }");
pw.println();
}
}
}
}
}
protected void writeEqualsMethod()
{
pw.println(" private java.lang.Object __equalsCalc = null;");
pw.println(" public synchronized boolean equals(java.lang.Object obj) {");
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;");
pw.println(" if (__equalsCalc != null) {");
pw.println(" return (__equalsCalc == obj);");
pw.println(" }");
pw.println(" __equalsCalc = obj;");
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
{
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)
{
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("");
}
protected void writeHashCodeMethod()
{
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;");
String start = "1";
if (extendType != null && !type.isSimpleType())
{
start = "super.hashCode()";
}
pw.println(" int _hashCode = " + start + ";");
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("short") ||
variableType.equals("byte"))
{
pw.println(" _hashCode += " + get +
Utils.capitalizeFirstChar(variable) + "();");
}
else if (variableType.equals("boolean"))
{
pw.println(" _hashCode += new Boolean(" + get +
Utils.capitalizeFirstChar(variable) + "()).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)
{
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(" }");
}
}
pw.println(" __hashCodeCalc = false;");
pw.println(" return _hashCode;");
pw.println(" }");
pw.println("");
}
}