gdaniels 2003/02/22 08:49:16
Modified: java/src/org/apache/axis/wsdl/fromJava Types.java
Emitter.java
java/src/org/apache/axis/description OperationDesc.java
Log:
* Split what used to be writeWrapperForPart() in Types into
two pieces, writeWrapperElement() and writeWrappedParameter().
This enables us to correctly generate wrapper elements for
methods with no args/parts and makes the code much more
explicit about what's going on.
* Emitter now passes down its style when creating its own
ServiceDescs.
* Make wrapped generation in Emitter use the new Types
methods, clean up code some.
* Add getAll[In/Out]Params() to OperationDesc, needed by
wrapped WSDL generator.
Revision Changes Path
1.71 +63 -35 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.70
retrieving revision 1.71
diff -u -r1.70 -r1.71
--- Types.java 16 Jan 2003 18:43:06 -0000 1.70
+++ Types.java 22 Feb 2003 16:49:15 -0000 1.71
@@ -379,51 +379,81 @@
}
/**
- * Write wrapper for part.
+ * Write the element definition for a WRAPPED operation. This will
+ * write out any necessary namespace/schema declarations, an an element
+ * definition with an internal (anonymous) complexType. The name of the
+ * element will be *foo*Request or *foo*Response depending on whether the
+ * request boolean is true. If the operation contains parameters, then
+ * we also generate a >sequence< node underneath the complexType,
+ * and return it for later use by writeWrappedParameter() below.
*
- * @param wrapper <code>QName</code> of the wrapper element
- * @param name is the name of an element to add to the wrapper element.
- * @param type is the QName of the type of the element.
- * @return true if the wrapperQName was created, false if it already exists.
- */
- public boolean writeWrapperForPart(QName wrapper, String name, QName type,
Class javaType)
- throws AxisFault {
-
+ * @param qname the desired element QName
+ * @param request true if we're writing the request wrapper, false if
+ * writing the response.
+ * @param hasParams true if there are parameters, and thus a sequence
+ * node is needed
+ * @return a DOM Element for the sequence, inside which we'll write the
+ * parameters as elements, or null if there are no parameters
+ */
+ public Element writeWrapperElement(QName qname,
+ boolean request,
+ boolean hasParams) {
// Make sure a types section is present
if (wsdlTypesElem == null) {
writeWsdlTypesElement();
}
// Write the namespace definition for the wrapper
- writeTypeNamespace(wrapper);
-
- // See if the wrapper already exists.
- Element sequence = (Element) wrapperMap.get(wrapper);
- boolean isNew = (sequence == null);
-
- // Create a type if this is a new wrapper
- if (isNew) {
- // Create an <element> for the wrapper
- Element wrapperElement =
- docHolder.createElement("element");
- writeSchemaElement(wrapper, wrapperElement);
- wrapperElement.setAttribute("name",
- wrapper.getLocalPart());
-
- // Create an anonymous <complexType> for the wrapper
- Element complexType = docHolder.createElement("complexType");
- wrapperElement.appendChild(complexType);
-
- // Create a <sequence> under the complexType and save it.
- sequence = docHolder.createElement("sequence");
+ writeTypeNamespace(qname);
+
+ // Create an <element> for the wrapper
+ Element wrapperElement = docHolder.createElement("element");
+ writeSchemaElement(qname, wrapperElement);
+ wrapperElement.setAttribute("name", qname.getLocalPart());
+
+ // Create an anonymous <complexType> for the wrapper
+ Element complexType = docHolder.createElement("complexType");
+ wrapperElement.appendChild(complexType);
+
+ // If we have parameters in the operation, create a <sequence>
+ // under the complexType and return it.
+ if (hasParams) {
+ Element sequence = docHolder.createElement("sequence");
complexType.appendChild(sequence);
- wrapperMap.put(wrapper, sequence);
-
+ return sequence;
}
+
+ return null;
+ }
+
+ /**
+ * Write a parameter (a sub-element) into a sequence generated by
+ * writeWrapperElement() above.
+ *
+ * @param sequence the <sequence> in which we're writing
+ * @param name is the name of an element to add to the wrapper element.
+ * @param type is the QName of the type of the element.
+ */
+ public void writeWrappedParameter(Element sequence, String name,
+ QName type, Class javaType)
+ throws AxisFault {
+ if (javaType == void.class) {
+ return;
+ }
+
+ if (type == null) {
+ type = writeTypeForPart(javaType, type);
+ }
+
+ if (type == null) {
+ // throw an Exception!!
+ }
+
Element childElem;
if (isAnonymousType(type)) {
- childElem = createElementWithAnonymousType(name, javaType, false,
docHolder);
+ childElem = createElementWithAnonymousType(name, javaType,
+ false, docHolder);
} else {
// Create the child <element> and add it to the wrapper <sequence>
childElem = docHolder.createElement("element");
@@ -434,8 +464,6 @@
childElem.setAttribute("type", prefixedName);
}
sequence.appendChild(childElem);
-
- return isNew;
}
private boolean isAnonymousType(QName type) {
1.83 +106 -64 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.82
retrieving revision 1.83
diff -u -r1.82 -r1.83
--- Emitter.java 6 Jan 2003 22:25:00 -0000 1.82
+++ Emitter.java 22 Feb 2003 16:49:15 -0000 1.83
@@ -482,6 +482,7 @@
serviceDesc.setStopClasses(stopClasses);
serviceDesc.setAllowedMethods(allowedMethods);
serviceDesc.setDisallowedMethods(disallowedMethods);
+ serviceDesc.setStyle(style);
// If the class passed in is a portType,
// there may be an implClass that is used to
@@ -1084,7 +1085,7 @@
{
Message msg = def.createMessage();
- QName qName = createMessageName(def, oper.getName(), "Request");
+ QName qName = createMessageName(def, oper.getName() + "Request");
msg.setQName(qName);
msg.setUndefined(false);
@@ -1104,6 +1105,11 @@
part.setName("part");
part.setElementName(qname);
msg.addPart(part);
+ } else if (oper.getStyle() == Style.WRAPPED) {
+ // If we're WRAPPED, write the wrapper element first, and then
+ // fill in any params. If there aren't any params, we'll see
+ // an empty <complexType/> for the wrapper element.
+ writeWrapperPart(def, msg, oper, true);
} else {
// Otherwise, write parts for the parameters.
ArrayList parameters = oper.getParameters();
@@ -1115,7 +1121,79 @@
return msg;
}
-
+
+ private QName getRequestQName(OperationDesc oper) {
+ QName qname = oper.getElementQName();
+ if (qname == null) {
+ qname = new QName(oper.getName());
+ }
+ return qname;
+ }
+ private QName getResponseQName(OperationDesc oper) {
+ QName qname = oper.getElementQName();
+ if (qname == null) {
+ return new QName(oper.getName() + "Response");
+ }
+ return new QName(qname.getNamespaceURI(),
+ qname.getLocalPart() + "Response");
+ }
+ /**
+ * Write out the schema definition for a WRAPPED operation request or
+ * response.
+ *
+ * @param oper
+ * @param request
+ */
+ public void writeWrapperPart(Definition def, Message msg,
+ OperationDesc oper, boolean request)
+ throws AxisFault {
+ QName qname = request ? getRequestQName(oper) : getResponseQName(oper) ;
+ boolean hasParams = false;
+ if (request) {
+ hasParams = (oper.getNumInParams() > 0);
+ } else {
+ if (oper.getReturnClass() != void.class) {
+ hasParams = true;
+ } else {
+ hasParams = (oper.getNumOutParams() > 0);
+ }
+ }
+
+ // First write the wrapper element itself.
+ Element sequence = types.writeWrapperElement(qname, request, hasParams);
+
+ // If we got anything back above, there must be parameters in the
+ // operation, and it's a <sequence> node in which to write them...
+ if (sequence != null) {
+ ArrayList parameters = request ? oper.getAllInParams() :
+ oper.getAllOutParams();
+ if (!request) {
+ String retName;
+ if (oper.getReturnQName() == null) {
+ retName = oper.getName() + "Return";
+ } else {
+ retName = oper.getReturnQName().getLocalPart();
+ }
+ types.writeWrappedParameter(sequence, retName,
+ oper.getReturnType(),
+ oper.getReturnClass());
+ }
+ for(int i=0; i<parameters.size(); i++) {
+ ParameterDesc parameter = (ParameterDesc) parameters.get(i);
+ types.writeWrappedParameter(sequence,
+ parameter.getName(), // QName??
+ parameter.getTypeQName(),
+ parameter.getJavaType());
+ }
+ }
+
+ // Finally write the part itself
+ Part part = def.createPart();
+ part.setName("parameters"); // We always se "parameters"
+ part.setElementName(qname);
+ msg.addPart(part);
+ }
+
/** Create a Response Message
*
* @param def
@@ -1128,28 +1206,32 @@
{
Message msg = def.createMessage();
- QName qName = createMessageName(def, desc.getName(), "Response");
+ QName qName = createMessageName(def, desc.getName() + "Response");
msg.setQName(qName);
msg.setUndefined(false);
- // Write the part
- ParameterDesc retParam = new ParameterDesc();
- if (desc.getReturnQName() == null) {
- retParam.setName(desc.getName()+"Return");
+ if (desc.getStyle() == Style.WRAPPED) {
+ writeWrapperPart(def, msg, desc, false);
} else {
- retParam.setQName(desc.getReturnQName());
- }
- retParam.setTypeQName(desc.getReturnType());
- retParam.setMode(ParameterDesc.OUT);
- retParam.setIsReturn(true);
- retParam.setJavaType(desc.getReturnClass());
- writePartToMessage(def, msg, false, retParam);
-
- ArrayList parameters = desc.getParameters();
- for (Iterator i = parameters.iterator(); i.hasNext();) {
- ParameterDesc param = (ParameterDesc)i.next();
- writePartToMessage(def, msg, false, param);
+ // Write the part
+ ParameterDesc retParam = new ParameterDesc();
+ if (desc.getReturnQName() == null) {
+ retParam.setName(desc.getName()+"Return");
+ } else {
+ retParam.setQName(desc.getReturnQName());
+ }
+ retParam.setTypeQName(desc.getReturnType());
+ retParam.setMode(ParameterDesc.OUT);
+ retParam.setIsReturn(true);
+ retParam.setJavaType(desc.getReturnClass());
+ writePartToMessage(def, msg, false, retParam);
+
+ ArrayList parameters = desc.getAllOutParams();
+ for (Iterator i = parameters.iterator(); i.hasNext();) {
+ ParameterDesc param = (ParameterDesc)i.next();
+ writePartToMessage(def, msg, false, param);
+ }
}
return msg;
}
@@ -1180,7 +1262,7 @@
if (msg == null) {
msg = def.createMessage();
- QName qName = createMessageName(def, clsName, "");
+ QName qName = createMessageName(def, clsName);
msg.setQName(qName);
msg.setUndefined(false);
@@ -1244,43 +1326,7 @@
javaType = JavaUtils.getHolderValueType(javaType);
}
- if (style == Style.WRAPPED) {
- // Write type representing the param
- QName typeQName =
- types.writeTypeForPart(javaType,
- param.getTypeQName());
-
- // Get the QName of the wrapper element
- QName wrapperQName = null;
- if (request) {
- wrapperQName =
- new QName(
- msg.getQName().getNamespaceURI(),
- msg.getQName().getLocalPart().substring(0,
- msg.getQName().getLocalPart().indexOf("Request")));
- } else {
- wrapperQName = msg.getQName();
- }
-
- if (typeQName != null) {
- // Write/Get the wrapper element
- // and append a child element repesenting
- // the parameter
- if (types.writeWrapperForPart(wrapperQName,
- param.getName(),
- typeQName, javaType)) {
- // If wrapper element is written
- // add <part name="parameters" element=wrapper_elem />
- // Really shouldn't matter what name is used, but
- // .NET could be using "parameters" as an indication
- // that this is wrapped mode.
- part.setName("parameters");
- part.setElementName(wrapperQName);
- msg.addPart(part);
- }
- }
- } else if (use == Use.ENCODED ||
- style == Style.RPC) {
+ if (use == Use.ENCODED || style == Style.RPC) {
// Add the type representing the param
// For convenience, add an element for the param
// Write <part name=param_name type=param_type>
@@ -1315,18 +1361,14 @@
/*
* Return a message QName which has not already been defined in the WSDL
*/
- private QName createMessageName(Definition def,
- String methodName,
- String suffix) {
+ private QName createMessageName(Definition def, String methodName) {
- QName qName = new QName(intfNS,
- methodName.concat(suffix));
+ QName qName = new QName(intfNS, methodName);
// Check the make sure there isn't a message with this name already
int messageNumber = 1;
while (def.getMessage(qName) != null) {
- StringBuffer namebuf =
- new StringBuffer(methodName.concat(suffix));
+ StringBuffer namebuf = new StringBuffer(methodName);
namebuf.append(messageNumber);
qName = new QName(intfNS, namebuf.toString());
messageNumber++;
1.33 +55 -7 xml-axis/java/src/org/apache/axis/description/OperationDesc.java
Index: OperationDesc.java
===================================================================
RCS file:
/home/cvs/xml-axis/java/src/org/apache/axis/description/OperationDesc.java,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- OperationDesc.java 15 Jan 2003 23:11:18 -0000 1.32
+++ OperationDesc.java 22 Feb 2003 16:49:16 -0000 1.33
@@ -111,6 +111,8 @@
/** The number of "in" params (i.e. IN or INOUT) for this operation */
private int numInParams = 0;
+ /** The number of "out" params (i.e. OUT or INOUT) for this operation */
+ private int numOutParams = 0;
/** A unique SOAPAction value for this operation */
private String soapAction = null;
@@ -258,6 +260,10 @@
(param.getMode() == ParameterDesc.INOUT)) {
param.setOrder(numInParams++);
}
+ if ((param.getMode() == ParameterDesc.OUT) ||
+ (param.getMode() == ParameterDesc.INOUT)) {
+ numOutParams++;
+ }
log.debug("@" + Integer.toHexString(hashCode()) + " added parameter >" +
param + "@" + Integer.toHexString(param.hashCode()) + "<total parameters:"
+getNumParams());
}
@@ -291,19 +297,24 @@
* @param newParameters an ArrayList of ParameterDescs
*/
public void setParameters(ArrayList newParameters) {
- parameters = new ArrayList(); //Keep numInParams correct.
- numInParams = 0;
-
- for( java.util.ListIterator li= newParameters.listIterator();
- li.hasNext(); ){
- addParameter((ParameterDesc) li.next());
- }
+ parameters = new ArrayList(); //Keep numInParams correct.
+ numInParams = 0;
+ numOutParams = 0;
+
+ for( java.util.ListIterator li= newParameters.listIterator();
+ li.hasNext(); ){
+ addParameter((ParameterDesc) li.next());
+ }
}
public int getNumInParams() {
return numInParams;
}
+ public int getNumOutParams() {
+ return numOutParams;
+ }
+
public int getNumParams() {
return parameters.size();
}
@@ -380,6 +391,43 @@
return param;
}
+ /**
+ * Return a list of ALL "in" params (including INOUTs)
+ *
+ * Note: if we were sure the order went IN->INOUT->OUT, we could optimize
+ * this.
+ *
+ * @return
+ */
+ public ArrayList getAllInParams() {
+ ArrayList result = new ArrayList();
+ for (Iterator i = parameters.iterator(); i.hasNext();) {
+ ParameterDesc desc = (ParameterDesc) i.next();
+ if (desc.getMode() != ParameterDesc.OUT) {
+ result.add(desc);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Return a list of ALL "out" params (including INOUTs)
+ *
+ * Note: if we were sure the order went IN->INOUT->OUT, we could optimize
+ * this.
+ *
+ * @return
+ */
+ public ArrayList getAllOutParams() {
+ ArrayList result = new ArrayList();
+ for (Iterator i = parameters.iterator(); i.hasNext();) {
+ ParameterDesc desc = (ParameterDesc) i.next();
+ if (desc.getMode() != ParameterDesc.IN) {
+ result.add(desc);
+ }
+ }
+ return result;
+ }
/**
* Returns an ordered list of out params (NOT inouts)
*/