gdaniels 2002/06/05 11:18:42
Modified: java/src/org/apache/axis/wsdl/fromJava Types.java
Emitter.java
Log:
Enable ?wsdl generation of more correct doc/lit WSDL.
In particular, we now generate <part element=""> for doc/lit instead of
<part type=""> - we use the QName metadata from the ParamDesc to
determine the right element name, and we also make sure to emit an
appropriate element declaration in the <schema> of the WSDL doc.
Revision Changes Path
1.32 +56 -32 xml-axis/java/src/org/apache/axis/wsdl/fromJava/Types.java
Index: Types.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/fromJava/Types.java,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- Types.java 4 Jun 2002 23:23:34 -0000 1.31
+++ Types.java 5 Jun 2002 18:18:41 -0000 1.32
@@ -58,6 +58,7 @@
import org.apache.axis.AxisFault;
import org.apache.axis.Constants;
+import org.apache.axis.wsdl.toJava.Utils;
import org.apache.axis.encoding.Serializer;
import org.apache.axis.encoding.SerializerFactory;
import org.apache.axis.encoding.SimpleType;
@@ -65,6 +66,8 @@
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import org.apache.axis.utils.JavaUtils;
import org.apache.axis.utils.XMLUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -90,6 +93,7 @@
* @author unascribed
*/
public class Types {
+ protected static Log log = LogFactory.getLog(Types.class.getName());
Definition def;
Namespaces namespaces = null;
@@ -140,16 +144,24 @@
* @param type <code>Class</code> to generate the XML Schema info for
* @return the QName of the generated Schema type, null if void
*/
- public QName writePartType(Class type) throws Exception {
+ public QName writePartType(Class type, javax.xml.rpc.namespace.QName qname)
throws Exception {
if (type.getName().equals("void"))
return null;
if (isSimpleType(type)) {
- javax.xml.rpc.namespace.QName qName = getTypeQName(type);
- return getWsdlQName(qName);
+ javax.xml.rpc.namespace.QName typeQName = getTypeQName(type);
+ // Still need to write any element declaration...
+ if (qname != null) {
+ String elementType = writeType(type);
+ Element element = createElementDecl(Utils.getWSDLQName(qname),
+ elementType, false);
+ if (element != null)
+ writeSchemaElement(Utils.getWSDLQName(qname),element);
+ }
+ return getWsdlQName(typeQName);
}else {
if (wsdlTypesElem == null)
writeWsdlTypesElement();
- return writeTypeAsElement(type);
+ return writeTypeAsElement(type, Utils.getWSDLQName(qname));
}
}
@@ -158,13 +170,16 @@
* @param type the class type
* @return the QName of the generated Element
*/
- private QName writeTypeAsElement(Class type) throws Exception {
- QName qName = writeTypeNamespace(type);
+ private QName writeTypeAsElement(Class type, QName qName) throws Exception {
+ QName typeQName = writeTypeNamespace(type);
+ if (qName == null) {
+ qName = typeQName;
+ }
String elementType = writeType(type);
if (elementType != null) {
- Element element = createRootElement(qName, elementType,
isNullable(type));
+ Element element = createElementDecl(qName, elementType,
isNullable(type));
if (element != null)
- writeSchemaElement(qName,element);
+ writeSchemaElement(typeQName,element);
return qName;
}
return null;
@@ -193,7 +208,7 @@
private javax.xml.rpc.namespace.QName getTypeQName(Class javaType) {
javax.xml.rpc.namespace.QName qName = null;
- // Use the typeMapping information to lookup the qName.
+ // Use the typeMapping information to lookup the qName.
javax.xml.rpc.namespace.QName dQName = null;
if (defaultTM != null) {
dQName = defaultTM.getTypeQName(javaType);
@@ -212,8 +227,8 @@
}
}
- // If the javaType is an array and the qName is
- // SOAP_ARRAY, construct the QName using the
+ // If the javaType is an array and the qName is
+ // SOAP_ARRAY, construct the QName using the
// QName of the component type
if (javaType.isArray() &&
qName != null &&
@@ -228,7 +243,7 @@
qName = new javax.xml.rpc.namespace.QName(
targetNamespace,
"ArrayOf" + cqName.getLocalPart());
- } else {
+ } else {
String pre = namespaces.getCreatePrefix(cqName.getNamespaceURI());
qName = new javax.xml.rpc.namespace.QName(
targetNamespace,
@@ -237,12 +252,12 @@
return qName;
}
- // If a qName was not found construct one using the
+ // If a qName was not found construct one using the
// class name information.
if (qName == null) {
String pkg = getPackageNameFromFullName(javaType.getName());
String lcl = getLocalNameFromFullName(javaType.getName());
-
+
String ns = namespaces.getCreate(pkg);
namespaces.getCreatePrefix(ns);
String localPart = lcl.replace('$', '_');
@@ -284,6 +299,14 @@
* @param element the Element to append to the Schema node
*/
public void writeSchemaElement(QName qName, Element element) {
+ if (wsdlTypesElem == null) {
+ try {
+ writeWsdlTypesElement();
+ } catch (Exception e) {
+ log.error(e);
+ return;
+ }
+ }
Element schemaElem = null;
NodeList nl = wsdlTypesElem.getChildNodes();
for (int i = 0; i < nl.getLength(); i++ ) {
@@ -300,7 +323,7 @@
wsdlTypesElem.appendChild(schemaElem);
schemaElem.setAttribute("xmlns", Constants.URI_DEFAULT_SCHEMA_XSD);
schemaElem.setAttribute("targetNamespace", qName.getNamespaceURI());
-
+
// Add SOAP-ENC namespace import
Element importElem = docHolder.createElement("import");
schemaElem.appendChild(importElem);
@@ -316,7 +339,7 @@
private void writeWsdlTypesElement() throws Exception {
if (wsdlTypesElem == null) {
// Create a <wsdl:types> element corresponding to the wsdl namespaces.
- wsdlTypesElem =
+ wsdlTypesElem =
docHolder.createElementNS(Constants.NS_URI_WSDL11, "types");
wsdlTypesElem.setPrefix(Constants.NS_PREFIX_WSDL);
}
@@ -334,7 +357,7 @@
* @throws Exception
*/
public String writeType(Class type) throws Exception {
-
+
// Quick return if schema type
if (isSimpleType(type)) {
QName qName = getWsdlQName(getTypeQName(type));
@@ -364,13 +387,13 @@
if (factory != null) {
ser = (Serializer)factory.getSerializerAs(Constants.AXIS_SAX);
}
-
+
// if we can't get a serializer, that is bad.
- if (ser == null) {
+ if (ser == null) {
throw new AxisFault(
JavaUtils.getMessage("NoSerializer00", type.getName()));
}
-
+
// Write the namespace
QName qName = writeTypeNamespace(type);
@@ -515,7 +538,7 @@
* @param nullable nillable attribute of the element
* @return the created Element
*/
- private Element createRootElement(QName qName,
+ private Element createElementDecl(QName qName,
String elementType,
boolean nullable) {
if (!addToElementsList(qName))
@@ -524,11 +547,8 @@
Element element = docHolder.createElement("element");
//Generate an element name that matches the type.
- // Previously a unique element name was generated.
- //String name = generateUniqueElementName(qName);
- String name = elementType.substring(elementType.lastIndexOf(":")+1);
- element.setAttribute("name", name);
+ element.setAttribute("name", qName.getLocalPart());
if (nullable)
element.setAttribute("nillable", "true");
element.setAttribute("type", elementType);
@@ -545,7 +565,7 @@
public Element createElement(String elementName,
String elementType,
boolean nullable,
- boolean omittable,
+ boolean omittable,
Document docHolder) {
Element element = docHolder.createElement("element");
element.setAttribute("name", elementName);
@@ -640,12 +660,12 @@
}
/**
- * Is the given class acceptable as an attribute
+ * Is the given class acceptable as an attribute
* @param type input Class
* @return true if the type is a simple, enum type or extends SimpleType
*/
public boolean isAcceptableAsAttribute(Class type) {
- return isSimpleType(type) ||
+ return isSimpleType(type) ||
isEnumClass(type) ||
implementsSimpleType(type);
}
@@ -735,6 +755,10 @@
* @return if the type is added returns true, else if the type is already
present returns false
*/
private boolean addToElementsList (QName qName) {
+ if (qName == null) {
+ return false;
+ }
+
boolean added = false;
ArrayList elements =
(ArrayList)schemaElementNames.get(qName.getNamespaceURI());
if (elements == null) {
@@ -754,7 +778,7 @@
/**
- * Determines if the field is nullable. All non-primitives except
+ * Determines if the field is nullable. All non-primitives except
* for byte[] are nillable.
*
* @param type input Class
@@ -764,12 +788,12 @@
if (type.isPrimitive() ||
(type.isArray() && type.getComponentType() == byte.class))
return false;
- else
+ else
return true;
}
- /** @todo ravi: Get rid of Doccument fragment and import node stuuf,
+ /** todo ravi: Get rid of Doccument fragment and import node stuuf,
* once I have a handle on the wsdl4j mechanism to get at types.
*
* Switch over notes: remove docHolder, docFragment in favor of wsdl4j Types
@@ -799,7 +823,7 @@
/**
* Return the list of classes that we should not emit WSDL for.
- */
+ */
public List getStopClasses() {
return stopClasses;
}
1.39 +27 -8 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.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- Emitter.java 31 May 2002 19:08:09 -0000 1.38
+++ Emitter.java 5 Jun 2002 18:18:42 -0000 1.39
@@ -66,6 +66,7 @@
import com.ibm.wsdl.extensions.soap.SOAPOperationImpl;
import org.apache.axis.Constants;
+import org.apache.axis.wsdl.toJava.Utils;
import org.apache.axis.description.OperationDesc;
import org.apache.axis.description.ServiceDesc;
import org.apache.axis.description.ParameterDesc;
@@ -635,10 +636,10 @@
/** Create a Message
*
- * @param Definition, the WSDL definition
- * @param Operation, the wsdl operation
- * @param OperationDesc, the Operation Description
- * @param BindingOperation, corresponding Binding Operation
+ * @param def Definition, the WSDL definition
+ * @param oper Operation, the wsdl operation
+ * @param desc OperationDesc, the Operation Description
+ * @param bindingOper BindingOperation, corresponding Binding Operation
* @throws Exception
*/
private void writeMessages(Definition def,
@@ -949,11 +950,29 @@
Part part = def.createPart();
// Write the type representing the parameter type
- javax.wsdl.QName typeQName = types.writePartType(param.getJavaType());
- if (typeQName != null) {
- part.setTypeName(typeQName);
+ QName elemQName = null;
+ if (mode != MODE_RPC)
+ elemQName = param.getQName();
+ javax.wsdl.QName typeQName = types.writePartType(param.getJavaType(),
+ elemQName);
+ if (mode == MODE_RPC) {
+ if (typeQName != null) {
+ part.setTypeName(typeQName);
+ part.setName(param.getName());
+ msg.addPart(part);
+ }
+ } else if (elemQName != null) {
+ String namespaceURI = elemQName.getNamespaceURI();
+ if (namespaceURI != null && !namespaceURI.equals("")) {
+ def.addNamespace(namespaces.getCreatePrefix(namespaceURI),
+ namespaceURI);
+ }
+ part.setElementName(Utils.getWSDLQName(elemQName));
part.setName(param.getName());
msg.addPart(part);
+ } else {
+ // ?? Throw an exception here? Must have an element if not
+ // RPC style?
}
return param.getName();
}
@@ -1393,7 +1412,7 @@
/**
* Sets the soapAction option value
- * @param must be DEFAULT, NONE, or OPERATION
+ * @param value must be DEFAULT, NONE, or OPERATION
*/
public void setSoapAction(String value) {
soapAction = value;