You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by sa...@apache.org on 2003/06/19 01:01:53 UTC
cvs commit: xml-axis/java/test/wsdl/extensibility ExtensibilityQueryBindingImpl.java ExtensibilityQueryTestCase.java QueryTypes.wsdl server-deploy.wsdd
sandholm 2003/06/18 16:01:53
Modified: java/src/org/apache/axis/encoding
DeserializationContext.java
DeserializationContextImpl.java
DeserializerImpl.java SerializationContextImpl.java
java/src/org/apache/axis/encoding/ser ArrayDeserializer.java
BeanDeserializer.java SimpleDeserializer.java
java/src/org/apache/axis/message MessageElement.java
RPCHandler.java SOAPEnvelope.java SOAPHeader.java
java/src/org/apache/axis/utils XMLUtils.java
java/src/org/apache/axis/wsdl/fromJava Emitter.java
java/src/org/apache/axis/wsdl/symbolTable SchemaUtils.java
Utils.java
java/src/org/apache/axis/wsdl/toJava JavaBeanWriter.java
JavaEnumTypeWriter.java
java/test/wsdl/extensibility
ExtensibilityQueryBindingImpl.java
ExtensibilityQueryTestCase.java QueryTypes.wsdl
server-deploy.wsdd
Added: java/src/org/apache/axis/encoding AnyContentType.java
Log:
merge of dynamic deserialization branch into trunk
--------------------------------------------------
-added support for deserilizing types based on their meta data
-SOAPBody/Header dirty flag bug fix
-default Namespace support in XMLUtils
-fix to WSDL Emitter to handle default namespace in wrapped mode
-xsd:union memberType support
-mark any content types with interface
-added meta data generation for enum types
-updated extensibility test case to test new dynamic deserialization code
Revision Changes Path
1.54 +24 -0 xml-axis/java/src/org/apache/axis/encoding/DeserializationContext.java
Index: DeserializationContext.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializationContext.java,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -r1.53 -r1.54
--- DeserializationContext.java 22 Apr 2003 19:34:24 -0000 1.53
+++ DeserializationContext.java 18 Jun 2003 23:01:49 -0000 1.54
@@ -168,6 +168,30 @@
*/
public Deserializer getDeserializerForType(QName xmlType);
+ /**
+ * Convenience method to get the Deserializer for a specific
+ * java class from its meta data.
+ * @param cls is the Class used to find the deserializer
+ * @return Deserializer
+ */
+ public Deserializer getDeserializerForClass(Class cls);
+
+ /**
+ * Allows the destination class to be set so that downstream
+ * deserializers like ArrayDeserializer can pick it up when
+ * deserializing its components using getDeserializerForClass
+ * @param destClass is the Class of the component to be deserialized
+ */
+ public void setDestinationClass(Class destClass);
+
+ /**
+ * Allows the destination class to be retrieved so that downstream
+ * deserializers like ArrayDeserializer can pick it up when
+ * deserializing its components using getDeserializerForClass
+ * @return the Class of the component to be deserialized
+ */
+ public Class getDestinationClass();
+
/**
* Get the TypeMapping for this DeserializationContext
*/
1.76 +68 -0 xml-axis/java/src/org/apache/axis/encoding/DeserializationContextImpl.java
Index: DeserializationContextImpl.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializationContextImpl.java,v
retrieving revision 1.75
retrieving revision 1.76
diff -u -r1.75 -r1.76
--- DeserializationContextImpl.java 22 Apr 2003 17:39:55 -0000 1.75
+++ DeserializationContextImpl.java 18 Jun 2003 23:01:49 -0000 1.76
@@ -74,6 +74,7 @@
import org.apache.axis.utils.Messages;
import org.apache.axis.utils.NSStack;
import org.apache.axis.utils.XMLUtils;
+import org.apache.axis.description.TypeDesc;
import org.apache.commons.logging.Log;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
@@ -89,6 +90,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
+import java.lang.reflect.Method;
/**
* @author Glen Daniels (gdaniels@macromedia.com)
@@ -111,6 +113,10 @@
private Locator locator;
+ // Class used for deserialization using class metadata from
+ // downstream deserializers
+ private Class destClass;
+
// for performance reasons, keep the top of the stack separate from
// the remainder of the handlers, and therefore readily available.
private SOAPHandler topHandler = null;
@@ -136,6 +142,10 @@
private MessageElement curElement;
protected int startOfMappingsPos = -1;
+
+ private static final Class[] DESERIALIZER_CLASSES =
+ new Class[] {String.class, Class.class, QName.class};
+ private static final String DESERIALIZER_METHOD = "getDeserializer";
// This is a hack to associate the first schema namespace we see with
// the correct SchemaVersion. It assumes people won't often be mixing
@@ -469,6 +479,64 @@
}
}
return dser;
+ }
+
+ /**
+ * Convenience method to get the Deserializer for a specific
+ * java class from its meta data.
+ * @param cls is the Class used to find the deserializer
+ * @return Deserializer
+ */
+ public Deserializer getDeserializerForClass(Class cls) {
+ if (cls == null) {
+ cls = destClass;
+ }
+ if (cls == null) {
+ return null;
+ }
+ if (cls.isArray()) {
+ cls = cls.getComponentType();
+ }
+ if (javax.xml.rpc.holders.Holder.class.isAssignableFrom(cls)) {
+ try {
+ cls = cls.getField("value").getType();
+ } catch (Exception e) {
+ }
+ }
+ Deserializer dser = null;
+ try {
+ Method method = cls.getMethod(DESERIALIZER_METHOD, DESERIALIZER_CLASSES);
+ if (method != null) {
+ TypeDesc typedesc = TypeDesc.getTypeDescForClass(cls);
+ if (typedesc != null) {
+ dser = (Deserializer) method.invoke(null,
+ new Object[] {msgContext.getEncodingStyle(), cls, typedesc.getXmlType()});
+ }
+ }
+ } catch (Exception e) {
+ log.error(Messages.getMessage("noDeser00", cls.getName()));
+ }
+ return dser;
+ }
+
+ /**
+ * Allows the destination class to be set so that downstream
+ * deserializers like ArrayDeserializer can pick it up when
+ * deserializing its components using getDeserializerForClass
+ * @param destClass is the Class of the component to be deserialized
+ */
+ public void setDestinationClass(Class destClass) {
+ this.destClass = destClass;
+ }
+
+ /**
+ * Allows the destination class to be retrieved so that downstream
+ * deserializers like ArrayDeserializer can pick it up when
+ * deserializing its components using getDeserializerForClass
+ * @return the Class of the component to be deserialized
+ */
+ public Class getDestinationClass() {
+ return destClass;
}
/**
1.36 +3 -0 xml-axis/java/src/org/apache/axis/encoding/DeserializerImpl.java
Index: DeserializerImpl.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializerImpl.java,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- DeserializerImpl.java 28 May 2003 14:21:55 -0000 1.35
+++ DeserializerImpl.java 18 Jun 2003 23:01:49 -0000 1.36
@@ -471,6 +471,9 @@
// attribute type qname.
if (type != null) {
Deserializer dser = context.getDeserializerForType(type);
+ if (dser == null) {
+ dser = context.getDeserializerForClass(null);
+ }
if (dser != null) {
// Move the value targets to the new deserializer
dser.moveValueTargets(this);
1.93 +32 -19 xml-axis/java/src/org/apache/axis/encoding/SerializationContextImpl.java
Index: SerializationContextImpl.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/SerializationContextImpl.java,v
retrieving revision 1.92
retrieving revision 1.93
diff -u -r1.92 -r1.93
--- SerializationContextImpl.java 28 May 2003 14:21:55 -0000 1.92
+++ SerializationContextImpl.java 18 Jun 2003 23:01:49 -0000 1.93
@@ -132,8 +132,9 @@
private boolean pretty = false;
private static QName multirefQName = new QName("","multiRef");
- private static Class[] getSerializerClasses =
+ private static Class[] SERIALIZER_CLASSES =
new Class[] {String.class, Class.class, QName.class};
+ private static final String SERIALIZER_METHOD = "getSerializer";
/**
* Should I write out objects as multi-refs?
@@ -1258,32 +1259,40 @@
// if no serializer was configured try to find one dynamically using WSDLJava
// generated metadata
- try {
- Method method = value.getClass().getMethod(
- "getSerializer", getSerializerClasses);
- if (method != null) {
- Serializer serializer = (Serializer) method.invoke(value,
- new Object[] {"", value.getClass(), elemQName});
- TypeDesc typedesc = TypeDesc.getTypeDescForClass(value.getClass());
- if (typedesc != null) {
- QName qname = typedesc.getXmlType();
- if (qname != null) {
- attributes = setTypeAttribute(attributes,
- qname);
- }
+ Class cls = value.getClass();
+ Serializer serializer = getSerializerFromClass(cls, elemQName);
+ if (serializer != null) {
+ TypeDesc typedesc = TypeDesc.getTypeDescForClass(value.getClass());
+ if (typedesc != null) {
+ QName qname = typedesc.getXmlType();
+ if (qname != null) {
+ attributes = setTypeAttribute(attributes,
+ qname);
}
- serializer.serialize(elemQName, attributes, value, this);
- return;
}
- } catch (Exception e) {
+ serializer.serialize(elemQName, attributes, value, this);
+ return;
}
-
throw new IOException(Messages.getMessage("noSerializer00",
value.getClass().getName(), "" + tm));
}
// !!! Write out a generic null, or get type info from somewhere else?
}
+ private Serializer getSerializerFromClass(Class javaType, QName qname) {
+ Serializer serializer = null;
+ try {
+ Method method = javaType.getMethod(
+ SERIALIZER_METHOD, SERIALIZER_CLASSES);
+ if (method != null) {
+ serializer = (Serializer) method.invoke(null,
+ new Object[] {msgContext.getEncodingStyle(), javaType, qname});
+ }
+ } catch (Exception e) {
+ }
+ return serializer;
+ }
+
/**
* Get the currently prefered xmlType
* @return QName of xmlType or null
@@ -1375,7 +1384,11 @@
}
public String getValueAsString(Object value, QName xmlType) throws IOException {
- Serializer ser = getSerializer(value.getClass(), xmlType, null);
+ Class cls = value.getClass();
+ Serializer ser = getSerializer(cls, xmlType, null);
+ if (ser == null) {
+ ser = getSerializerFromClass(cls, xmlType);
+ }
if (!(ser instanceof SimpleValueSerializer)) {
throw new IOException(
Messages.getMessage("needSimpleValueSer",
1.2 +69 -0 xml-axis/java/src/org/apache/axis/encoding/AnyContentType.java
1.38 +3 -0 xml-axis/java/src/org/apache/axis/encoding/ser/ArrayDeserializer.java
Index: ArrayDeserializer.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/ArrayDeserializer.java,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -r1.37 -r1.38
--- ArrayDeserializer.java 22 Apr 2003 19:34:27 -0000 1.37
+++ ArrayDeserializer.java 18 Jun 2003 23:01:50 -0000 1.38
@@ -299,6 +299,9 @@
}
}
}
+ if (arrayClass == null) {
+ arrayClass = context.getDestinationClass();
+ }
if (arrayClass == null) {
throw new SAXException(
1.60 +14 -15 xml-axis/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java
Index: BeanDeserializer.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -r1.59 -r1.60
--- BeanDeserializer.java 20 Dec 2002 17:28:20 -0000 1.59
+++ BeanDeserializer.java 18 Jun 2003 23:01:50 -0000 1.60
@@ -284,18 +284,11 @@
// to deserialize something we have no clue about (no good xsi:type,
// no good metadata).
if (dSer == null) {
-
-// FIXME : Currently this doesn't throw an error solely to enable the
-// "terra" testcase to pass. We should, IMO, fix the test (either
-// to support <xsd:list> or to throw an error when we find such a thing
-// in the WSDL at WSDL2Java time). Once that's done, this should be
-// uncommented and the next two lines deleted.
-//
-// throw new SAXException(Messages.getMessage("noDeser00",
-// childXMLType.toString()));
-
- dSer = new DeserializerImpl();
- return (SOAPHandler)dSer;
+ dSer = context.getDeserializerForClass(propDesc.getType());
+ }
+ if (dSer == null) {
+ throw new SAXException(Messages.getMessage("noDeser00",
+ childXMLType.toString()));
}
// Register value target
@@ -340,8 +333,8 @@
public BeanPropertyDescriptor getAnyPropertyDesc() {
if (typeDesc == null)
return null;
-
- return typeDesc.getAnyDesc();
+
+ return typeDesc.getAnyDesc();
}
/**
@@ -398,7 +391,9 @@
// Get the Deserializer for the attribute
Deserializer dSer = getDeserializer(null, bpd.getType(),
null, context);
-
+ if (dSer == null) {
+ dSer = context.getDeserializerForClass(bpd.getType());
+ }
if (dSer == null)
throw new SAXException(
Messages.getMessage("unregistered00",
@@ -440,6 +435,9 @@
Class javaType,
String href,
DeserializationContext context) {
+ if (javaType.isArray()) {
+ context.setDestinationClass(javaType);
+ }
// See if we have a cached deserializer
if (cacheStringDSer != null) {
if (String.class.equals(javaType) &&
@@ -470,6 +468,7 @@
dSer = context.getDeserializer(javaType, defaultXMLType);
} else {
dSer = new DeserializerImpl();
+ context.setDestinationClass(javaType);
dSer.setDefaultType(defaultXMLType);
}
}
1.33 +8 -0 xml-axis/java/src/org/apache/axis/encoding/ser/SimpleDeserializer.java
Index: SimpleDeserializer.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/SimpleDeserializer.java,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- SimpleDeserializer.java 22 Apr 2003 19:34:30 -0000 1.32
+++ SimpleDeserializer.java 18 Jun 2003 23:01:50 -0000 1.33
@@ -277,6 +277,14 @@
return new Double(Double.NEGATIVE_INFINITY);
}
}
+ if (constructor == null) {
+ try {
+ constructor =
+ javaType.getDeclaredConstructor(new Class [] {String.class});
+ } catch (Exception e) {
+ return null;
+ }
+ }
return constructor.newInstance(new Object [] { source });
}
1.154 +27 -7 xml-axis/java/src/org/apache/axis/message/MessageElement.java
Index: MessageElement.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/MessageElement.java,v
retrieving revision 1.153
retrieving revision 1.154
diff -u -r1.153 -r1.154
--- MessageElement.java 20 May 2003 15:07:01 -0000 1.153
+++ MessageElement.java 18 Jun 2003 23:01:50 -0000 1.154
@@ -519,13 +519,24 @@
* Returns value of the node as an object of registered type.
* @return Object of proper type, or null if no mapping could be found.
*/
- public Object getObjectValue(){
+ public Object getObjectValue() {
+ Object obj = null;
+ try {
+ obj = getObjectValue(null);
+ } catch (Exception e) {
+ log.debug("getValue()", e);
+ }
+ return obj;
+ }
+
+ /**
+ * Returns value of the node as an object of registered type.
+ * @param cls Class that contains top level deserializer metadata
+ * @return Object of proper type, or null if no mapping could be found.
+ */
+ public Object getObjectValue(Class cls) throws Exception {
if (objectValue == null) {
- try {
- objectValue = getValueAsType(getType());
- } catch (Exception e) {
- log.debug("getValue()", e);
- }
+ objectValue = getValueAsType(getType(), cls);
}
return objectValue;
}
@@ -561,10 +572,19 @@
public Object getValueAsType(QName type) throws Exception
{
+ return getValueAsType(type, null);
+ }
+ public Object getValueAsType(QName type, Class cls) throws Exception
+ {
if (context == null)
throw new Exception(Messages.getMessage("noContext00"));
- Deserializer dser = context.getDeserializerForType(type);
+ Deserializer dser = null;
+ if (cls == null) {
+ dser = context.getDeserializerForType(type);
+ } else {
+ dser = context.getDeserializerForClass(cls);
+ }
if (dser == null)
throw new Exception(Messages.getMessage("noDeser00", "" + type));
1.72 +8 -3 xml-axis/java/src/org/apache/axis/message/RPCHandler.java
Index: RPCHandler.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/RPCHandler.java,v
retrieving revision 1.71
retrieving revision 1.72
diff -u -r1.71 -r1.72
--- RPCHandler.java 22 Apr 2003 19:35:15 -0000 1.71
+++ RPCHandler.java 18 Jun 2003 23:01:51 -0000 1.72
@@ -252,6 +252,9 @@
}
destClass = paramDesc.getJavaType();
+ if ((destClass != null) && (destClass.isArray())) {
+ context.setDestinationClass(destClass);
+ }
// Keep the association so we can use it later
// (see RPCProvider.processMessage())
@@ -299,6 +302,9 @@
}
if (dser == null) {
+ dser = context.getDeserializerForClass(destClass);
+ }
+ if (dser == null) {
throw new SAXException(Messages.getMessage(
"noDeser01", localName,"" + type));
}
@@ -313,10 +319,9 @@
}
}
} else {
- dser = new DeserializerImpl();
+ dser = context.getDeserializerForClass(destClass);
if (dser == null) {
- throw new SAXException(Messages.getMessage(
- "noDeser01", localName,"" + type));
+ dser = new DeserializerImpl();
}
}
}
1.91 +1 -0 xml-axis/java/src/org/apache/axis/message/SOAPEnvelope.java
Index: SOAPEnvelope.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPEnvelope.java,v
retrieving revision 1.90
retrieving revision 1.91
diff -u -r1.90 -r1.91
--- SOAPEnvelope.java 20 May 2003 15:07:01 -0000 1.90
+++ SOAPEnvelope.java 18 Jun 2003 23:01:51 -0000 1.91
@@ -563,6 +563,7 @@
public javax.xml.soap.SOAPBody addBody() throws SOAPException {
if (body == null) {
body = new SOAPBody(this, soapConstants);
+ _isDirty = true;
return body;
} else {
throw new SOAPException(Messages.getMessage("bodyPresent"));
1.74 +3 -1 xml-axis/java/src/org/apache/axis/message/SOAPHeader.java
Index: SOAPHeader.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPHeader.java,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -r1.73 -r1.74
--- SOAPHeader.java 22 Apr 2003 19:35:17 -0000 1.73
+++ SOAPHeader.java 18 Jun 2003 23:01:51 -0000 1.74
@@ -133,8 +133,10 @@
public javax.xml.soap.SOAPHeaderElement addHeaderElement(Name name)
throws SOAPException {
SOAPHeaderElement headerElement = new SOAPHeaderElement(name);
- headerElement.setEnvelope(getEnvelope());
+ SOAPEnvelope envelope = getEnvelope();
+ headerElement.setEnvelope(envelope);
addHeader(headerElement);
+ envelope.setDirty(true);
return headerElement;
}
1.81 +25 -2 xml-axis/java/src/org/apache/axis/utils/XMLUtils.java
Index: XMLUtils.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/XMLUtils.java,v
retrieving revision 1.80
retrieving revision 1.81
diff -u -r1.80 -r1.81
--- XMLUtils.java 14 May 2003 19:25:10 -0000 1.80
+++ XMLUtils.java 18 Jun 2003 23:01:51 -0000 1.81
@@ -508,8 +508,13 @@
public static String getNamespace(String prefix, Node e) {
while (e != null && (e.getNodeType() == Node.ELEMENT_NODE)) {
- Attr attr =
- ((Element)e).getAttributeNodeNS(Constants.NS_URI_XMLNS, prefix);
+ Attr attr = null;
+ if (prefix == null) {
+ attr = ((Element)e).getAttributeNode("xmlns");
+ } else {
+ attr = ((Element)e).getAttributeNodeNS(Constants.NS_URI_XMLNS,
+ prefix);
+ }
if (attr != null) return attr.getValue();
e = e.getParentNode();
}
@@ -523,6 +528,19 @@
* @return a QName generated from the given string representation
*/
public static QName getQNameFromString(String str, Node e) {
+ return getQNameFromString(str, e, false);
+ }
+ /**
+ * Return a QName when passed a string like "foo:bar" by mapping
+ * the "foo" prefix to a namespace in the context of the given Node.
+ * If default namespace is found it is returned as part of the QName.
+ *
+ * @return a QName generated from the given string representation
+ */
+ public static QName getFullQNameFromString(String str, Node e) {
+ return getQNameFromString(str, e, true);
+ }
+ private static QName getQNameFromString(String str, Node e, boolean defaultNS) {
if (str == null || e == null)
return null;
@@ -534,6 +552,11 @@
return null;
return new QName(ns, str.substring(idx + 1));
} else {
+ if (defaultNS) {
+ String ns = getNamespace(null, e);
+ if (ns != null)
+ return new QName(ns, str);
+ }
return new QName("", str);
}
}
1.91 +16 -0 xml-axis/java/src/org/apache/axis/wsdl/fromJava/Emitter.java
Index: Emitter.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/fromJava/Emitter.java,v
retrieving revision 1.90
retrieving revision 1.91
diff -u -r1.90 -r1.91
--- Emitter.java 28 Apr 2003 01:55:50 -0000 1.90
+++ Emitter.java 18 Jun 2003 23:01:51 -0000 1.91
@@ -1132,13 +1132,26 @@
}
protected QName getRequestQName(OperationDesc oper) {
+ qualifyOperation(oper);
QName qname = oper.getElementQName();
if (qname == null) {
qname = new QName(oper.getName());
}
return qname;
}
+ private void qualifyOperation(OperationDesc oper) {
+ if (style == Style.WRAPPED && use == Use.LITERAL) {
+ QName qname = oper.getElementQName();
+ if (qname != null) {
+ qname = new QName(intfNS, oper.getName());
+ } else if (qname.getNamespaceURI().equals("")) {
+ qname = new QName(intfNS,qname.getLocalPart());
+ }
+ oper.setElementQName(qname);
+ }
+ }
protected QName getResponseQName(OperationDesc oper) {
+ qualifyOperation(oper);
QName qname = oper.getElementQName();
if (qname == null) {
return new QName(oper.getName() + "Response");
@@ -1361,6 +1374,9 @@
// declaration whose name and type may be found in the
// ParameterDesc.
QName qname = param.getQName();
+ if (param.getTypeQName().getNamespaceURI().equals("")) {
+ param.setTypeQName(new QName(intfNS,param.getTypeQName().getLocalPart()));
+ }
Element el = types.createElementDecl(qname.getLocalPart(),
param.getJavaType(),
param.getTypeQName(),
1.24 +37 -14 xml-axis/java/src/org/apache/axis/wsdl/symbolTable/SchemaUtils.java
Index: SchemaUtils.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/symbolTable/SchemaUtils.java,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- SchemaUtils.java 22 Apr 2003 19:36:15 -0000 1.23
+++ SchemaUtils.java 18 Jun 2003 23:01:52 -0000 1.24
@@ -182,17 +182,26 @@
return v;
} else {
// This may be a simpleType, return the type with the name "value"
- QName simpleQName = getSimpleTypeBase(node);
+ QName[] simpleQName = getContainedSimpleTypes(node);
if (simpleQName != null) {
- TypeEntry simpleType = symbolTable.getType(simpleQName);
- if (simpleType != null) {
- Vector v = new Vector();
- ElementDecl elem = new ElementDecl();
- elem.setType(simpleType);
- elem.setName(new javax.xml.namespace.QName("", "value"));
- v.add(elem);
- return v;
- }
+ Vector v = null;
+ for (int i = 0; i < simpleQName.length; i++) {
+ TypeEntry simpleType = symbolTable.getType(simpleQName[i]);
+ if (simpleType != null) {
+ if (v == null) {
+ v = new Vector();
+ }
+ ElementDecl elem = new ElementDecl();
+ elem.setType(simpleType);
+ if (simpleQName.length > 1) {
+ elem.setName(new javax.xml.namespace.QName("", simpleQName[i].getLocalPart() + "Value"));
+ } else {
+ elem.setName(new javax.xml.namespace.QName("", "value"));
+ }
+ v.add(elem);
+ }
+ }
+ return v;
}
}
return null;
@@ -543,7 +552,14 @@
* the QName of the simpleType base is returned.
*/
public static QName getSimpleTypeBase(Node node) {
- QName baseQName = null;
+ QName[] qname = getContainedSimpleTypes(node);
+ if (qname != null && qname.length > 0) {
+ return qname[0];
+ }
+ return null;
+ }
+ public static QName[] getContainedSimpleTypes(Node node) {
+ QName[] baseQNames = null;
if (node == null) {
return null;
@@ -566,9 +582,12 @@
// (There may be other #text nodes, which we will ignore).
NodeList children = node.getChildNodes();
Node restrictionNode = null;
+ Node unionNode = null;
for (int j = 0; j < children.getLength() && restrictionNode == null; j++) {
if (isXSDNode(children.item(j), "restriction")) {
restrictionNode = children.item(j);
+ } else if (isXSDNode(children.item(j), "union")) {
+ unionNode = children.item(j);
}
}
@@ -576,11 +595,15 @@
// (the base attribute contains this type).
if (restrictionNode != null) {
- baseQName = Utils.getTypeQName(restrictionNode, new BooleanHolder(), false);
+ baseQNames = new QName[1];
+ baseQNames[0] = Utils.getTypeQName(restrictionNode, new BooleanHolder(), false);
+ }
+ if (unionNode != null) {
+ baseQNames = Utils.getMemberTypeQNames(unionNode);
}
// Look for enumeration elements underneath the restriction node
- if (baseQName != null && restrictionNode != null) {
+ if (baseQNames != null && restrictionNode != null && unionNode != null) {
NodeList enums = restrictionNode.getChildNodes();
for (int i=0; i < enums.getLength(); i++) {
if (isXSDNode(enums.item(i), "enumeration")) {
@@ -591,7 +614,7 @@
}
}
}
- return baseQName;
+ return baseQNames;
}
/**
1.28 +16 -0 xml-axis/java/src/org/apache/axis/wsdl/symbolTable/Utils.java
Index: Utils.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/symbolTable/Utils.java,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- Utils.java 22 Apr 2003 19:36:17 -0000 1.27
+++ Utils.java 18 Jun 2003 23:01:52 -0000 1.28
@@ -56,6 +56,7 @@
import org.apache.axis.Constants;
import org.apache.axis.utils.JavaUtils;
+import org.apache.axis.utils.XMLUtils;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
@@ -66,6 +67,7 @@
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;
+import java.util.StringTokenizer;
/**
* This class contains static utility methods for the emitter.
@@ -360,6 +362,20 @@
qName = getTypeQNameFromAttr(node, "base");
}
return qName;
+ }
+
+ public static QName[] getMemberTypeQNames(Node node) {
+ String attribute = getAttribute(node, "memberTypes");
+ if (attribute == null) {
+ return null;
+ }
+ StringTokenizer tokenizer = new StringTokenizer(attribute, " ");
+ QName[] memberTypes = new QName[tokenizer.countTokens()];
+ for (int i = 0; tokenizer.hasMoreElements(); i++) {
+ String element = (String) tokenizer.nextElement();
+ memberTypes[i] = XMLUtils.getFullQNameFromString(element, node);
+ }
+ return memberTypes;
}
/**
1.40 +116 -44 xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaBeanWriter.java
Index: JavaBeanWriter.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaBeanWriter.java,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -r1.39 -r1.40
--- JavaBeanWriter.java 22 Apr 2003 19:36:24 -0000 1.39
+++ JavaBeanWriter.java 18 Jun 2003 23:01:52 -0000 1.40
@@ -66,6 +66,8 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
+import java.util.ArrayList;
+import java.util.Iterator;
/**
* This is Wsdl2java's Complex Type Writer. It writes the <typeName>.java file.
@@ -77,7 +79,7 @@
private TypeEntry extendType;
protected JavaBeanHelperWriter helper;
protected Vector names = new Vector(); // even indices: types, odd: vars
- protected String simpleValueType = null; // name of type of simple value
+ protected ArrayList simpleValueTypes = new ArrayList(); // name of type of simple value
protected PrintWriter pw;
// The following fields can be set by extended classes
@@ -91,6 +93,8 @@
protected boolean enableEquals = true;
protected boolean enableHashCode = true;
+ protected boolean isAny = false;
+
/**
* Constructor.
* @param emitter
@@ -128,8 +132,9 @@
// 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.
- preprocess();
+ // a member name or type. Moved to implements callback in order
+ // to set any interface
+ // preprocess();
// Write Member Fields
writeMemberFields();
@@ -193,6 +198,7 @@
if (elem.getAnyElement()) {
typeName = "org.apache.axis.message.MessageElement []";
variableName = Constants.ANYCONTENT;
+ isAny = true;
} else {
String elemName = elem.getName().getLocalPart();
variableName = Utils.xmlNameToJava(elemName);
@@ -200,8 +206,8 @@
names.add(typeName);
names.add(variableName);
if (type.isSimpleType() &&
- variableName.equals("value")) {
- simpleValueType = typeName;
+ (variableName.endsWith("Value") || variableName.equals("value"))) {
+ simpleValueTypes.add(typeName);
}
}
}
@@ -215,8 +221,8 @@
names.add(typeName);
names.add(variableName);
if (type.isSimpleType() &&
- variableName.equals("value")) {
- simpleValueType = typeName;
+ (variableName.endsWith("Value") || variableName.equals("value"))) {
+ simpleValueTypes.add(typeName);
}
}
}
@@ -267,6 +273,13 @@
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;
}
@@ -276,6 +289,10 @@
*/
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);
@@ -310,6 +327,9 @@
* constructor.
*/
protected void writeFullConstructor() {
+ if (type.isSimpleType()) {
+ return;
+ }
// The constructor needs to consider all extended types
Vector extendList = new Vector();
extendList.add(type);
@@ -405,64 +425,78 @@
protected void writeSimpleConstructors() {
// If this is a simple type,need to emit a string
// constructor and a value construtor.
- if (type.isSimpleType() && simpleValueType != null) {
- if (!simpleValueType.equals("java.lang.String")) {
- pw.println(" public " + className + "(" +
- simpleValueType + " value) {");
- pw.println(" this.value = value;");
- pw.println(" }");
+ 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();
}
-
- pw.println(" // " + Messages.getMessage("needStringCtor"));
+ } 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(" this.value = new " + wrapper +
+ pw.println(" " + returnString + " new " + wrapper +
"(value)." + simpleValueType + "Value();");
} else {
if (simpleValueType.equals("byte[]")) {
- pw.println(" this.value = org.apache.axis.types.HexBinary.decode(value);");
+ pw.println(" " + returnString + " org.apache.axis.types.HexBinary.decode(value);");
}
else if (simpleValueType.equals("org.apache.axis.types.URI")) {
pw.println(" try {");
- pw.println(" this.value = new org.apache.axis.types.URI(value);");
+ pw.println(" " + returnString + " new org.apache.axis.types.URI(value);");
pw.println(" }");
pw.println(" catch (org.apache.axis.types.URI.MalformedURIException mue) {");
- pw.println(" this.value = new org.apache.axis.types.URI();");
+ pw.println(" " + returnString + " new org.apache.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(" " + 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 = 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(" }");
+ 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(" this.value = new " +
+ pw.println(" " + returnString + " new " +
simpleValueType + "(value);");
}
}
- pw.println(" }");
- pw.println();
- }
}
+ private boolean isUnion() {
+ return this.simpleValueTypes.size() > 1;
+ }
/**
* Writes the toString method
* Currently the toString method is only written for
@@ -470,21 +504,41 @@
*/
protected void writeToStringMethod() {
// If this is a simple type, emit a toString
- if (type.isSimpleType() && simpleValueType != null) {
- pw.println(" // " + Messages.getMessage("needToString"));
- String wrapper = JavaUtils.getWrapper(simpleValueType);
- pw.println(" public java.lang.String 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(simpleValueType.equals("byte[]")) {
+ 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();
+ }
+ 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();");
+ }
}
}
@@ -506,14 +560,24 @@
if (enableGetters) {
pw.println(" public " + typeName + " " +
get + capName + "() {");
- pw.println(" return " + name + ";");
+ if (isUnion()) {
+ writeSimpleTypeGetter(typeName, name, "return");
+ } else {
+ pw.println(" return " + name + ";");
+ }
pw.println(" }");
pw.println();
}
if (enableSetters) {
- pw.println(" public void set" + capName + "(" +
+ 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(" this." + name + " = " + name + ";");
+ }
pw.println(" }");
pw.println();
}
@@ -600,6 +664,9 @@
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) {
@@ -669,7 +736,12 @@
start = "super.hashCode()";
}
pw.println(" int _hashCode = " + start + ";");
- for (int i = 0; i < names.size(); i += 2) {
+ 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";
1.23 +37 -0 xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaEnumTypeWriter.java
Index: JavaEnumTypeWriter.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaEnumTypeWriter.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- JavaEnumTypeWriter.java 22 Apr 2003 19:36:25 -0000 1.22
+++ JavaEnumTypeWriter.java 18 Jun 2003 23:01:52 -0000 1.23
@@ -67,6 +67,7 @@
*/
public class JavaEnumTypeWriter extends JavaClassWriter {
private Vector elements;
+ private TypeEntry type;
/**
* Constructor.
@@ -76,6 +77,7 @@
TypeEntry type, Vector elements) {
super(emitter, type.getName(), "enumType");
this.elements = elements;
+ this.type = type;
} // ctor
/**
@@ -243,6 +245,41 @@
}
pw.println(" public java.lang.Object readResolve() throws java.io.ObjectStreamException { return fromValue(_value_);}");
+
+ 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 org.apache.axis.encoding.ser.EnumSerializer(");
+ pw.println(" _javaType, _xmlType);");
+ 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 org.apache.axis.encoding.ser.EnumDeserializer(");
+ pw.println(" _javaType, _xmlType);");
+ pw.println(" }");
+
+ 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(type.getName()) + ".class);");
+ pw.println();
+
+ pw.println(" static {");
+ pw.println(" typeDesc.setXmlType(" + Utils.getNewQName(type.getQName()) + ");");
+ 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();
+
} // writeFileBody
/**
1.18 +22 -48 xml-axis/java/test/wsdl/extensibility/ExtensibilityQueryBindingImpl.java
Index: ExtensibilityQueryBindingImpl.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/wsdl/extensibility/ExtensibilityQueryBindingImpl.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- ExtensibilityQueryBindingImpl.java 1 Mar 2003 01:31:03 -0000 1.17
+++ ExtensibilityQueryBindingImpl.java 18 Jun 2003 23:01:52 -0000 1.18
@@ -29,81 +29,55 @@
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
+import java.io.PrintWriter;
import java.rmi.RemoteException;
import java.util.Calendar;
import java.util.Vector;
-
+import org.apache.axis.components.logger.LogFactory;
+import org.apache.commons.logging.Log;
public class ExtensibilityQueryBindingImpl implements ExtensibilityQueryPortType {
private final static String[] books = new String[] { "The Grid", "The Oxford Dictionary" };
private final static String[] subjects = new String[] { "Computer Science", "English" };
+ protected static Log log =
+ LogFactory.getLog(ExtensibilityQueryBindingImpl.class.getName());
public ExtensibilityType query(ExtensibilityType query) throws RemoteException {
ExtensibilityType result = new ExtensibilityType();
- Object obj = query.get_any()[0].getObjectValue();
- if (obj instanceof _FindBooksQueryExpressionElement) {
- BookType bookQuery = ((_FindBooksQueryExpressionElement)obj).getBookQuery();
+ Object obj = null;
+ try {
+ obj = query.get_any()[0].getObjectValue(BookType.class);
+ } catch (Exception e) {
+ StringWriter writer = new StringWriter();
+ PrintWriter out = new PrintWriter(writer);
+ log.error("Error converting query: " + writer.toString());
+ throw new RemoteException(e.toString());
+ }
+ log.error("Incoming MessageContext " + obj + " : " + query.get_any()[0].toString());
+ if (obj instanceof BookType) {
+ BookType bookQuery = (BookType)obj;
String subject = bookQuery.getSubject();
if (!"all".equals(subject)) {
throw new RemoteException("ExtensibilityQueryBindingImpl: Book subject query should be all, instead was " + subject);
}
- _QueryResultElement resultElement = new _QueryResultElement();
ResultListType resultList = new ResultListType();
- resultElement.setResultList(resultList);
QueryResultType[] queryResult = new QueryResultType[books.length];
for (int i = 0; i < books.length; i++) {
queryResult[i] = new QueryResultType();
queryResult[i].setName(subjects[i]);
+ queryResult[i].setStatus(StatusType.MORE);
queryResult[i].setValue(books[i]);
queryResult[i].setTime(Calendar.getInstance());
queryResult[i].setQueryType(new QName("urn:QueryType","BookQuery"));
}
resultList.setResult(queryResult);
- MessageElement me = new MessageElement("foo", "bar", resultElement);
+ QName elementName = _QueryResultElement.getTypeDesc().getFields()[0].getXmlName();
+ MessageElement me = new MessageElement(elementName.getNamespaceURI(), elementName.getLocalPart(), resultList);
+ log.debug("Outgoing message: " + me.toString());
result.set_any(new MessageElement [] { me });
} else {
- throw new RemoteException("Failed to get FindBooksQueryExpressionElement. Got: " + obj.getClass().getName() + ":" + obj.toString());
+ throw new RemoteException("Failed to get FindBooksQueryExpressionElement. Got: " + obj);
}
return result;
- }
-}
-
-class ObjectSerializer {
- static Log logger =
- LogFactory.getLog(ObjectSerializer.class.getName());
-
- static Object toObject(Element element) throws Exception {
- MessageContext currentContext = MessageContext.getCurrentContext();
- MessageContext messageContext = new MessageContext(currentContext.getAxisEngine());
- messageContext.setTypeMappingRegistry(currentContext.getTypeMappingRegistry());
- messageContext.setEncodingStyle("");
- messageContext.setProperty(Call.SEND_TYPE_ATTR, Boolean.FALSE);
- SOAPEnvelope message = new SOAPEnvelope();
- Document doc = XMLUtils.newDocument();
- Element operationWrapper = doc.createElementNS("urn:operationNS","operation");
- doc.appendChild(operationWrapper);
- Node node = doc.importNode(element,true);
- operationWrapper.appendChild(node);
-
- message.addBodyElement(new SOAPBodyElement(operationWrapper));
-
- StringWriter stringWriter = new StringWriter();
- SerializationContext context = new SerializationContextImpl(stringWriter, messageContext);
- context.setDoMultiRefs(false);
- message.output(context);
- stringWriter.close();
- String messageString = stringWriter.getBuffer().toString();
- logger.debug(messageString);
- Reader reader = new StringReader(messageString);
- DeserializationContext deserializer = new DeserializationContextImpl(new InputSource(reader),
- messageContext,
- Message.REQUEST);
- deserializer.parse();
- SOAPEnvelope env = deserializer.getEnvelope();
-
- RPCElement rpcElem = (RPCElement)env.getFirstBody();
- Vector parameters = rpcElem.getParams();
- RPCParam param = (RPCParam) parameters.get(0);
- return param.getValue();
}
}
1.16 +12 -31 xml-axis/java/test/wsdl/extensibility/ExtensibilityQueryTestCase.java
Index: ExtensibilityQueryTestCase.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/wsdl/extensibility/ExtensibilityQueryTestCase.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- ExtensibilityQueryTestCase.java 1 Mar 2003 01:31:03 -0000 1.15
+++ ExtensibilityQueryTestCase.java 18 Jun 2003 23:01:52 -0000 1.16
@@ -37,7 +37,6 @@
try {
ExtensibilityQueryLocator locator = new ExtensibilityQueryLocator();
binding = locator.getExtensibilityQueryPort();
- addDynamicTypeMappings(locator.getEngine());
deployServer();
}
catch (javax.xml.rpc.ServiceException jre) {
@@ -53,60 +52,42 @@
try {
ExtensibilityType expression = new ExtensibilityType();
- _FindBooksQueryExpressionElement bookQuery = new _FindBooksQueryExpressionElement();
BookType book = new BookType();
book.setSubject("all");
- bookQuery.setBookQuery(book);
- MessageElement el = new MessageElement("foo", "Bar", bookQuery);
+ QName elementName = _FindBooksQueryExpressionElement.getTypeDesc().getFields()[0].getXmlName();
+ MessageElement el = new MessageElement(elementName.getNamespaceURI(), elementName.getLocalPart(), book);
expression.set_any(new MessageElement [] { el });
// call the operation
ExtensibilityType any = binding.query(expression);
// validate results
MessageElement [] anyContent = any.get_any();
assertEquals(1, anyContent.length);
- _QueryResultElement resEl = (_QueryResultElement )anyContent[0].getObjectValue();
- assertNotNull("QueryResultElement back from anyContent[0].getObjectValue()", resEl);
- ResultListType result = resEl.getResultList();
- assertNotNull("ResultListType back from getResultList()", result);
+ ResultListType result = (ResultListType)anyContent[0].getObjectValue(ResultListType.class);
+ root.debug("Message " + result + ": " + anyContent[0].toString());
+ assertNotNull("ResultListType back from getResultList() is null", result);
QueryResultType[] queryResult = result.getResult();
assertTrue(queryResult.length == 2);
isValid(queryResult[0], "Computer Science", "The Grid");
isValid(queryResult[1], "English", "The Oxford Dictionary");
}
- catch (java.rmi.RemoteException re) {
- throw new junit.framework.AssertionFailedError("Remote Exception caught: " + re);
+ catch (Exception e) {
+ e.printStackTrace();
+ throw new junit.framework.AssertionFailedError("Exception caught: " + e);
}
}
private void isValid(QueryResultType result, String name, String value) {
+ Logger root = Logger.getRootLogger();
+ root.debug("Name: " + result.getName());
+ root.debug("Value: " + result.getValue());
assertTrue(result.getName().equals(name));
assertTrue(result.getValue().equals(value));
+ assertTrue(result.getStatus().equals(StatusType.MORE));
Calendar now = Calendar.getInstance();
Calendar then = result.getTime();
assertTrue("Time check failed. Result time = " + then + ", current time = " + now, then.before(now));
assertTrue(result.getQueryType().getNamespaceURI().equals("urn:QueryType"));
assertTrue(result.getQueryType().getLocalPart().equals("BookQuery"));
- }
-
- private void addDynamicTypeMappings(AxisEngine engine) throws Exception {
- TypeMappingRegistry registry = engine.getTypeMappingRegistry();
- TypeMapping mapping = registry.createTypeMapping();
- addBeanMapping(mapping, "FindBooksQueryExpressionElement", _FindBooksQueryExpressionElement.class);
- addBeanMapping(mapping, "BookType", BookType.class);
- addBeanMapping(mapping, "ResultListType", ResultListType.class);
- addBeanMapping(mapping, "QueryResultType", QueryResultType.class);
- addBeanMapping(mapping, "QueryResultElement", _QueryResultElement.class);
- registry.register("",mapping);
- EngineConfiguration config = engine.getConfig();
- config.writeEngineConfig(engine);
- }
-
- private void addBeanMapping(TypeMapping mapping, String localName, Class javaClass) {
- QName qname = new QName("urn:QueryTypes", localName);
- mapping.register(javaClass,
- qname,
- new BeanSerializerFactory(javaClass, qname),
- new BeanDeserializerFactory(javaClass, qname));
}
private void deployServer() {
1.3 +8 -0 xml-axis/java/test/wsdl/extensibility/QueryTypes.wsdl
Index: QueryTypes.wsdl
===================================================================
RCS file: /home/cvs/xml-axis/java/test/wsdl/extensibility/QueryTypes.wsdl,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- QueryTypes.wsdl 8 May 2002 13:04:46 -0000 1.2
+++ QueryTypes.wsdl 18 Jun 2003 23:01:52 -0000 1.3
@@ -38,8 +38,16 @@
<xsd:attribute name="value" type="xsd:string"/>
<xsd:attribute name="time" type="xsd:dateTime"/>
<xsd:attribute name="queryType" type="xsd:QName"/>
+ <xsd:attribute name="status" type="tns:StatusType"/>
</xsd:complexType>
+ <xsd:simpleType name="StatusType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="MORE"/>
+ <xsd:enumeration value="LESS"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
</xsd:schema>
</types>
</definitions>
1.9 +0 -49 xml-axis/java/test/wsdl/extensibility/server-deploy.wsdd
Index: server-deploy.wsdd
===================================================================
RCS file: /home/cvs/xml-axis/java/test/wsdl/extensibility/server-deploy.wsdd,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- server-deploy.wsdd 2 Mar 2003 16:17:57 -0000 1.8
+++ server-deploy.wsdd 18 Jun 2003 23:01:52 -0000 1.9
@@ -16,55 +16,6 @@
<parameter name="className" value="test.wsdl.extensibility.ExtensibilityQueryBindingSkeleton"/>
<parameter name="allowedMethods" value="*"/>
<parameter name="scope" value="Session"/>
-
- <typeMapping
- xmlns:ns="urn:ExtensibilityQuery"
- qname="ns:ExtensibilityType"
- type="java:test.wsdl.extensibility.ExtensibilityType"
- serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
- deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
- encodingStyle=""
- />
-
- <typeMapping
- qname="query:QueryResultElement"
- type="java:test.wsdl.extensibility._QueryResultElement"
- serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
- deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
- encodingStyle=""
- />
-
- <typeMapping
- qname="query:QueryResultType"
- type="java:test.wsdl.extensibility.QueryResultType"
- serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
- deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
- encodingStyle=""
- />
-
- <typeMapping
- qname="query:ResultListType"
- type="java:test.wsdl.extensibility.ResultListType"
- serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
- deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
- encodingStyle=""
- />
-
- <typeMapping
- qname="query:BookType"
- type="java:test.wsdl.extensibility.BookType"
- serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
- deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
- encodingStyle=""
- />
-
- <typeMapping
- qname="query:FindBooksQueryExpressionElement"
- type="java:test.wsdl.extensibility._FindBooksQueryExpressionElement"
- serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
- deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
- encodingStyle=""
- />
</service>
Re: cvs commit: xml-axis/java/test/wsdl/extensibility ExtensibilityQueryBindingImpl.java ExtensibilityQueryTestCase.java QueryTypes.wsdl server-deploy.wsdd
Posted by Davanum Srinivas <di...@yahoo.com>.
:) Finally you got to merge it :)
-- dims
--- sandholm@apache.org wrote:
> sandholm 2003/06/18 16:01:53
>
> Modified: java/src/org/apache/axis/encoding
> DeserializationContext.java
> DeserializationContextImpl.java
> DeserializerImpl.java SerializationContextImpl.java
> java/src/org/apache/axis/encoding/ser ArrayDeserializer.java
> BeanDeserializer.java SimpleDeserializer.java
> java/src/org/apache/axis/message MessageElement.java
> RPCHandler.java SOAPEnvelope.java SOAPHeader.java
> java/src/org/apache/axis/utils XMLUtils.java
> java/src/org/apache/axis/wsdl/fromJava Emitter.java
> java/src/org/apache/axis/wsdl/symbolTable SchemaUtils.java
> Utils.java
> java/src/org/apache/axis/wsdl/toJava JavaBeanWriter.java
> JavaEnumTypeWriter.java
> java/test/wsdl/extensibility
> ExtensibilityQueryBindingImpl.java
> ExtensibilityQueryTestCase.java QueryTypes.wsdl
> server-deploy.wsdd
> Added: java/src/org/apache/axis/encoding AnyContentType.java
> Log:
> merge of dynamic deserialization branch into trunk
> --------------------------------------------------
> -added support for deserilizing types based on their meta data
> -SOAPBody/Header dirty flag bug fix
> -default Namespace support in XMLUtils
> -fix to WSDL Emitter to handle default namespace in wrapped mode
> -xsd:union memberType support
> -mark any content types with interface
> -added meta data generation for enum types
> -updated extensibility test case to test new dynamic deserialization code
>
> Revision Changes Path
> 1.54 +24 -0 xml-axis/java/src/org/apache/axis/encoding/DeserializationContext.java
>
> Index: DeserializationContext.java
> ===================================================================
> RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializationContext.java,v
> retrieving revision 1.53
> retrieving revision 1.54
> diff -u -r1.53 -r1.54
> --- DeserializationContext.java 22 Apr 2003 19:34:24 -0000 1.53
> +++ DeserializationContext.java 18 Jun 2003 23:01:49 -0000 1.54
> @@ -168,6 +168,30 @@
> */
> public Deserializer getDeserializerForType(QName xmlType);
>
> + /**
> + * Convenience method to get the Deserializer for a specific
> + * java class from its meta data.
> + * @param cls is the Class used to find the deserializer
> + * @return Deserializer
> + */
> + public Deserializer getDeserializerForClass(Class cls);
> +
> + /**
> + * Allows the destination class to be set so that downstream
> + * deserializers like ArrayDeserializer can pick it up when
> + * deserializing its components using getDeserializerForClass
> + * @param destClass is the Class of the component to be deserialized
> + */
> + public void setDestinationClass(Class destClass);
> +
> + /**
> + * Allows the destination class to be retrieved so that downstream
> + * deserializers like ArrayDeserializer can pick it up when
> + * deserializing its components using getDeserializerForClass
> + * @return the Class of the component to be deserialized
> + */
> + public Class getDestinationClass();
> +
> /**
> * Get the TypeMapping for this DeserializationContext
> */
>
>
>
> 1.76 +68 -0
> xml-axis/java/src/org/apache/axis/encoding/DeserializationContextImpl.java
>
> Index: DeserializationContextImpl.java
> ===================================================================
> RCS file:
> /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializationContextImpl.java,v
> retrieving revision 1.75
> retrieving revision 1.76
> diff -u -r1.75 -r1.76
> --- DeserializationContextImpl.java 22 Apr 2003 17:39:55 -0000 1.75
> +++ DeserializationContextImpl.java 18 Jun 2003 23:01:49 -0000 1.76
> @@ -74,6 +74,7 @@
> import org.apache.axis.utils.Messages;
> import org.apache.axis.utils.NSStack;
> import org.apache.axis.utils.XMLUtils;
> +import org.apache.axis.description.TypeDesc;
> import org.apache.commons.logging.Log;
> import org.xml.sax.Attributes;
> import org.xml.sax.InputSource;
> @@ -89,6 +90,7 @@
> import java.io.IOException;
> import java.util.ArrayList;
> import java.util.HashMap;
> +import java.lang.reflect.Method;
>
> /**
> * @author Glen Daniels (gdaniels@macromedia.com)
> @@ -111,6 +113,10 @@
>
> private Locator locator;
>
> + // Class used for deserialization using class metadata from
> + // downstream deserializers
> + private Class destClass;
> +
> // for performance reasons, keep the top of the stack separate from
> // the remainder of the handlers, and therefore readily available.
> private SOAPHandler topHandler = null;
> @@ -136,6 +142,10 @@
> private MessageElement curElement;
>
> protected int startOfMappingsPos = -1;
> +
> + private static final Class[] DESERIALIZER_CLASSES =
> + new Class[] {String.class, Class.class, QName.class};
> + private static final String DESERIALIZER_METHOD = "getDeserializer";
>
> // This is a hack to associate the first schema namespace we see with
> // the correct SchemaVersion. It assumes people won't often be mixing
> @@ -469,6 +479,64 @@
> }
> }
> return dser;
> + }
> +
> + /**
> + * Convenience method to get the Deserializer for a specific
> + * java class from its meta data.
> + * @param cls is the Class used to find the deserializer
> + * @return Deserializer
> + */
> + public Deserializer getDeserializerForClass(Class cls) {
> + if (cls == null) {
> + cls = destClass;
> + }
> + if (cls == null) {
> + return null;
> + }
> + if (cls.isArray()) {
> + cls = cls.getComponentType();
> + }
> + if (javax.xml.rpc.holders.Holder.class.isAssignableFrom(cls)) {
> + try {
> + cls = cls.getField("value").getType();
> + } catch (Exception e) {
> + }
> + }
> + Deserializer dser = null;
> + try {
> + Method method = cls.getMethod(DESERIALIZER_METHOD, DESERIALIZER_CLASSES);
> + if (method != null) {
> + TypeDesc typedesc = TypeDesc.getTypeDescForClass(cls);
> + if (typedesc != null) {
> + dser = (Deserializer) method.invoke(null,
> + new Object[] {msgContext.getEncodingStyle(), cls,
> typedesc.getXmlType()});
> + }
> + }
> + } catch (Exception e) {
> + log.error(Messages.getMessage("noDeser00", cls.getName()));
> + }
> + return dser;
> + }
> +
> + /**
> + * Allows the destination class to be set so that downstream
> + * deserializers like ArrayDeserializer can pick it up when
> + * deserializing its components using getDeserializerForClass
> + * @param destClass is the Class of the component to be deserialized
> + */
> + public void setDestinationClass(Class destClass) {
> + this.destClass = destClass;
> + }
> +
> + /**
> + * Allows the destination class to be retrieved so that downstream
> + * deserializers like ArrayDeserializer can pick it up when
> + * deserializing its components using getDeserializerForClass
> + * @return the Class of the component to be deserialized
> + */
> + public Class getDestinationClass() {
> + return destClass;
> }
>
> /**
>
>
>
> 1.36 +3 -0 xml-axis/java/src/org/apache/axis/encoding/DeserializerImpl.java
>
> Index: DeserializerImpl.java
> ===================================================================
>
=== message truncated ===
=====
Davanum Srinivas - http://webservices.apache.org/~dims/
__________________________________
Do you Yahoo!?
SBC Yahoo! DSL - Now only $29.95 per month!
http://sbc.yahoo.com