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 aj...@apache.org on 2005/10/15 05:59:01 UTC
svn commit: r321285 - in /webservices/axis2/trunk/java/modules/wsdl:
src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java
test-resources/BookQuote.wsdl
Author: ajith
Date: Fri Oct 14 20:58:50 2005
New Revision: 321285
URL: http://svn.apache.org/viewcvs?rev=321285&view=rev
Log:
Updated the writer to fix the per message schema generation. Also implemented the following wrapping algorithm
1. If parts are more than 1 wrap
2. If at least 1 part has a type entry, wrap
The naming convention is <op_name> , <op_name>Response for input and output respectively
Modified:
webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java
webservices/axis2/trunk/java/modules/wsdl/test-resources/BookQuote.wsdl
Modified: webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java?rev=321285&r1=321284&r2=321285&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java (original)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java Fri Oct 14 20:58:50 2005
@@ -54,22 +54,22 @@
private static final String XMLSCHEMA_NAMESPACE_URI = "http://www.w3.org/2001/XMLSchema";
private static final String XMLSCHEMA_NAMESPACE_PREFIX = "xs";
- private static final String XSD_SCHEMA_QUALIFIED_NAME =XMLSCHEMA_NAMESPACE_PREFIX + ":schema";
- private static final String XSD_SEQUENCE_QUALIFIED_NAME =XMLSCHEMA_NAMESPACE_PREFIX + ":sequence";
- private static final String XSD_COMPLEXTYPE_QUALIFIED_NAME = XMLSCHEMA_NAMESPACE_PREFIX + ":complexType";
- private static final String XSD_ELEMENT_QUALIFIED_NAME = XMLSCHEMA_NAMESPACE_PREFIX + ":element";
+ private static final String XML_SCHEMA_LOCAL_NAME = "schema";
+ private static final String XML_SCHEMA_SEQUENCE_LOCAL_NAME = "sequence";
+ private static final String XML_SCHEMA_COMPLEX_TYPE_LOCAL_NAME = "complexType";
+ private static final String XML_SCHEMA_ELEMENT_LOCAL_NAME = "element";
+ private static final String XSD_SCHEMA_QUALIFIED_NAME =XMLSCHEMA_NAMESPACE_PREFIX + ":"+XML_SCHEMA_LOCAL_NAME;
+ private static final String XSD_SEQUENCE_QUALIFIED_NAME =XMLSCHEMA_NAMESPACE_PREFIX + ":"+XML_SCHEMA_SEQUENCE_LOCAL_NAME;
+ private static final String XSD_COMPLEXTYPE_QUALIFIED_NAME = XMLSCHEMA_NAMESPACE_PREFIX + ":"+XML_SCHEMA_COMPLEX_TYPE_LOCAL_NAME;
+ private static final String XSD_ELEMENT_QUALIFIED_NAME = XMLSCHEMA_NAMESPACE_PREFIX + ":"+XML_SCHEMA_ELEMENT_LOCAL_NAME;
private static final String XSD_NAME = "name";
private static final String XSD_TARGETNAMESPACE = "targetNamespace";
private static final String XMLNS_AXIS2WRAPPED = "xmlns:axis2wrapped";
+ private static final String AXIS2WRAPPED = "axis2wrapped";
private static final String XSD_TYPE = "type";
private static final String BOUND_INTERFACE_NAME = "BoundInterface";
- //////////////////////////////////////////
- //this needs to be set by the code generator
- //however make it false by default to avoid nasty surprises
- private boolean wrap = false;
- //////////////////////////////////////////
private static int nsCount=0;
@@ -79,6 +79,7 @@
private WSDLComponentFactory wsdlComponentFactory;
+ private Map declaredNameSpaces=null;
private List resolvedMultipartMessageList = new LinkedList();
@@ -115,7 +116,8 @@
this.copyExtensibleElements(
wsdl4JDefinition.getExtensibilityElements(), wsdlDefinition, null);
-
+ //get the namespace map
+ this.declaredNameSpaces = wsdl4JDefinition.getNamespaces();
/////////////////////////////////////////////////////////////////////
// Order of the following items shouldn't be changed unless you //
@@ -258,13 +260,10 @@
while (wsdl4JOperationsIterator.hasNext()) {
wsdloperation = this.wsdlComponentFactory.createOperation();
wsdl4jOperation = (Operation) wsdl4JOperationsIterator.next();
- //find whether is's wrappable or not!
- boolean wrappable = findWrapppable(wsdl4jDefinition,wsdl4jPortType);
this.populateOperations(wsdloperation,
wsdl4jOperation,
- wsdl4jPortType.getQName().getNamespaceURI(),
- wrappable);
+ wsdl4jPortType.getQName().getNamespaceURI());
this.copyExtensibleElements(
wsdl4jOperation.getExtensibilityElements(), wsdloperation, null);
@@ -275,34 +274,31 @@
/**
*
- * @param wsdl4jDefinition
- * @param wsdl4jPortType
+
* @return
*/
- private boolean findWrapppable(Definition wsdl4jDefinition,PortType wsdl4jPortType) {
- //find the binding for this porttype
- Map bindings = wsdl4jDefinition.getBindings();
- Iterator bindingIterator= bindings.values().iterator();
- Binding b ;
- boolean rpcStatus = false;
- while (bindingIterator.hasNext()) {
- b = (Binding) bindingIterator.next();
- if (b.getPortType().equals(wsdl4jPortType)){
- //We found a binding that belongs to a particular porttype.
- //However it is possible to have multiple bindings per PT!
- //the ideal thing to do here is to go through each and every one and find
- //if at least one is having rpc style
- List extElements = b.getExtensibilityElements();
- for (int i = 0; i < extElements.size(); i++) {
- Object o = extElements.get(i);
- if(o instanceof SOAPBinding){
- rpcStatus = rpcStatus || ((SOAPBinding)o).getStyle().equals("rpc");
- }
- }
- }
+ private boolean findWrapppable(Message message) {
+// ********************************************************************************************
+// Note
+// We will not use the binding to set the wrappable/unwrappable state. instead we'll look at the
+// Messages for the following features
+// 1. Messages with multiple parts -> We have no choice but to wrap
+// 2. Messages with at least one part having a type attribute -> Again we have no choice but to
+// wrap
+
+// ********************************************************************************************
+ Map partsMap = message.getParts();
+ Iterator parts=partsMap.values().iterator();
+ boolean wrappable= partsMap.size()>1;
+ Part part;
+ while (!wrappable && parts.hasNext()) {
+ part = (Part) parts.next();
+ wrappable = wrappable || (part.getTypeName()!=null);
}
- return rpcStatus;
+
+
+ return wrappable;
}
/**
@@ -389,9 +385,9 @@
//////////////////////////// Internal Component Copying ///////////////////
public void populateOperations(WSDLOperation wsdlOperation,
Operation wsdl4jOperation,
- String nameSpaceOfTheOperation,
- boolean wrappable) {
- //Copy Name Attrebute
+ String nameSpaceOfTheOperation
+ ) {
+ //Copy Name Attribute
wsdlOperation.setName(new QName(nameSpaceOfTheOperation,
wsdl4jOperation.getName()));
@@ -399,6 +395,8 @@
//defined in the WSDL 2.0. eg like #any, #none
// Create the Input Message and add
Input wsdl4jInputMessage = wsdl4jOperation.getInput();
+ String wrappedInputName = wsdlOperation.getName().getLocalPart();
+ String wrappedOutputName = wrappedInputName + "Response";
if (null != wsdl4jInputMessage) {
MessageReference wsdlInputMessage = this.wsdlComponentFactory
@@ -410,8 +408,11 @@
Message message = wsdl4jInputMessage.getMessage();
if (null != message) {
+ //wrapping has to be done on per message basis
+
wsdlInputMessage.setElement(
- this.generateReferenceQname(message,wrappable));
+ this.generateReferenceQname(wrappedInputName
+ ,message,findWrapppable(message)));
this.copyExtensibleElements(
(message).getExtensibilityElements(),
wsdlInputMessage, null);
@@ -435,7 +436,7 @@
Message outputMessage = wsdl4jOutputMessage.getMessage();
if (null != outputMessage) {
wsdlOutputMessage.setElement(
- this.generateReferenceQname(outputMessage,wrappable));
+ this.generateReferenceQname(wrappedOutputName,outputMessage,findWrapppable(outputMessage)));
this.copyExtensibleElements(
(outputMessage).getExtensibilityElements(),
wsdlOutputMessage, null);
@@ -448,7 +449,7 @@
Map faults = wsdl4jOperation.getFaults();
Iterator faultKeyIterator = faults.keySet().iterator();
- WSDLFaultReference faultReference = null;
+ WSDLFaultReference faultReference;
while (faultKeyIterator.hasNext()) {
@@ -459,7 +460,9 @@
Message faultMessage = fault.getMessage();
if (null != faultMessage) {
faultReference.setRef(
- this.generateReferenceQname(faultMessage,wrappable));
+ this.generateReferenceQname(
+ faultMessage.getQName().getLocalPart(),
+ faultMessage,findWrapppable(faultMessage)));
}
wsdlOperation.addOutFault(faultReference);
this.copyExtensibilityAttribute(fault.getExtensionAttributes(),
@@ -479,19 +482,15 @@
* @param wsdl4jMessage
* @return
*/
- private QName generateReferenceQname(Message wsdl4jMessage,boolean isWrappable) {
+ private QName generateReferenceQname(String outerName,Message wsdl4jMessage,boolean isWrappable) {
QName referenceQName = null;
+ //find the xsd prefix
+ String xsdPrefix = findSchemaPrefix();
+
//do the wrapping if required
if (isWrappable) {
Map parts = wsdl4jMessage.getParts();
- // Iterator partsItertator = parts.keySet().iterator();
- // Part thisPart = (Part)(parts.get(partsItertator.next()));
- // if (thisPart.getElementName() != null) {
- // throw new RuntimeException(
- // "We don't support multiple element parts in a WSDL message");
- // }
-
// Multipart Message
// NOTE (gdaniels) : It appears this code is taking multiple
@@ -519,7 +518,7 @@
} else {
//Get the list of multiparts of the message and create a new Element
//out of it and add it to the schema.
- Element schemaElement = null;
+ Element schemaElement;
WSDLTypes types = womDefinition.getTypes();
//If types is null create a new one to be used for multipart
@@ -539,14 +538,14 @@
//add a schema DOM element
- DocumentBuilder documentBuilder = null;
+ DocumentBuilder documentBuilder;
try {
documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
} catch (ParserConfigurationException e) {
throw new RuntimeException(e);
}
Document newDoc = documentBuilder.newDocument();
- schemaElement = newDoc.createElementNS(XMLSCHEMA_NAMESPACE_URI, XSD_SCHEMA_QUALIFIED_NAME);
+ schemaElement = newDoc.createElementNS(XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"+XML_SCHEMA_LOCAL_NAME);
schemaExtensibilityElement.setElement(schemaElement);
//add this to the imported stack as well
@@ -560,20 +559,24 @@
targetNamespaceUri = getTemporaryNamespaceUri();
}
- schemaElement.setAttribute(XMLNS_AXIS2WRAPPED,
- targetNamespaceUri);
+ // Note - The DOM level2 API does not support getting a local name from Attrib Node!!
+ // And XmlSchema fails miserably with this "xmlns:" attribs so to avoid the problem
+ //i have no choice but to remove the NS declarations!
+
+ schemaElement.setAttribute(XMLNS_AXIS2WRAPPED,
+ targetNamespaceUri);
schemaElement.setAttribute(XSD_TARGETNAMESPACE,targetNamespaceUri);
- schemaElement.setAttribute("xmlns:"+XMLSCHEMA_NAMESPACE_PREFIX,XMLSCHEMA_NAMESPACE_URI);
+ //schemaElement.setAttribute("xmlns:"+XMLSCHEMA_NAMESPACE_PREFIX,XMLSCHEMA_NAMESPACE_URI);
//add the complex type
Document doc = schemaElement.getOwnerDocument();
String name = wsdl4jMessage.getQName().getLocalPart();
- Element newComplexType = doc.createElementNS(WSDLPump.XMLSCHEMA_NAMESPACE_URI, WSDLPump.XSD_COMPLEXTYPE_QUALIFIED_NAME);
+ Element newComplexType = doc.createElementNS(WSDLPump.XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"+ XML_SCHEMA_COMPLEX_TYPE_LOCAL_NAME);
newComplexType.setAttribute(WSDLPump.XSD_NAME, name);
// add the sequence
// Note - we model the complex type as a sequence!
- Element cmplxContentSequence = doc.createElementNS(WSDLPump.XMLSCHEMA_NAMESPACE_URI, WSDLPump.XSD_SEQUENCE_QUALIFIED_NAME);
+ Element cmplxContentSequence = doc.createElementNS(WSDLPump.XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"+ XML_SCHEMA_SEQUENCE_LOCAL_NAME);
Element child;
Element relaventElementInSchemaReferedByPart = null;
Iterator iterator = parts.keySet().iterator();
@@ -588,22 +591,22 @@
NodeList allSchemaElements = schemaElement.getChildNodes();
for(int idx = 0; idx < allSchemaElements.getLength(); idx++){
if(allSchemaElements.item(idx).getNodeType() == Node.ELEMENT_NODE &&
- allSchemaElements.item(idx).getLocalName().equals(WSDLPump.XSD_ELEMENT_QUALIFIED_NAME)
+ allSchemaElements.item(idx).getLocalName().equals(xsdPrefix + ":"+ XML_SCHEMA_ELEMENT_LOCAL_NAME)
&& elementName.equals(((Element)allSchemaElements.item(idx)).getAttribute(WSDLPump.XSD_NAME))){
relaventElementInSchemaReferedByPart = (Element)allSchemaElements.item(idx);
break;
}
}
- child = doc.createElementNS(WSDLPump.XMLSCHEMA_NAMESPACE_URI, WSDLPump.XSD_ELEMENT_QUALIFIED_NAME);
+ child = doc.createElementNS(XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"+ XML_SCHEMA_ELEMENT_LOCAL_NAME);
child.setAttribute(WSDLPump.XSD_NAME, elementName);
if(null != relaventElementInSchemaReferedByPart){
child.setAttribute(WSDLPump.XSD_TYPE,
relaventElementInSchemaReferedByPart.getAttribute(WSDLPump.XSD_TYPE));
}else{
- String prefix = null;
+ String prefix;
if (XMLSCHEMA_NAMESPACE_URI.equals(schemaTypeName.getNamespaceURI())){
- prefix = XMLSCHEMA_NAMESPACE_PREFIX;
+ prefix = xsdPrefix;
}else{
prefix = schemaTypeName.getPrefix();
}
@@ -617,17 +620,14 @@
schemaElement.appendChild(newComplexType);
- Element newElement = doc.createElementNS(WSDLPump.XMLSCHEMA_NAMESPACE_URI, WSDLPump.XSD_ELEMENT_QUALIFIED_NAME);
+ Element newElement = doc.createElementNS(XMLSCHEMA_NAMESPACE_URI, xsdPrefix + ":"+ XML_SCHEMA_ELEMENT_LOCAL_NAME);
newElement.setAttribute(WSDLPump.XSD_NAME,
- wsdl4jMessage.getQName().getLocalPart());
+ outerName);
newElement.setAttribute(WSDLPump.XSD_TYPE,
- "axis2wrapped:"+wsdl4jMessage.getQName().getLocalPart());
+ AXIS2WRAPPED +":"+//whats the prefix to put here!!!
+ wsdl4jMessage.getQName().getLocalPart());
schemaElement.appendChild(newElement);
- //////////////////////////////////////////////////////
- // System.out.println("schema = " + schemaElement);
- //////////////////////////////////////////////////////
-
//Now since a new type is created augmenting the parts add the QName
//of the newly created Element as the messageReference's name.
//coincidentally it'll be the messages QName!
@@ -656,7 +656,32 @@
}
}
}
+
return referenceQName;
+ }
+
+ /**
+ * Find the XML schema prefix
+ */
+ private String findSchemaPrefix() {
+ String xsdPrefix=null;
+ if (declaredNameSpaces.containsValue(XMLSCHEMA_NAMESPACE_URI)){
+ //loop and find the prefix
+ Iterator it = declaredNameSpaces.keySet().iterator();
+ String key;
+ while (it.hasNext()) {
+ key = (String)it.next();
+ if (XMLSCHEMA_NAMESPACE_URI.equals(declaredNameSpaces.get(key))){
+ xsdPrefix = key;
+ break;
+ }
+ }
+
+ }else{
+ xsdPrefix = XMLSCHEMA_NAMESPACE_PREFIX; //default prefix
+ }
+
+ return xsdPrefix;
}
/**
Modified: webservices/axis2/trunk/java/modules/wsdl/test-resources/BookQuote.wsdl
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/wsdl/test-resources/BookQuote.wsdl?rev=321285&r1=321284&r2=321285&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/test-resources/BookQuote.wsdl (original)
+++ webservices/axis2/trunk/java/modules/wsdl/test-resources/BookQuote.wsdl Fri Oct 14 20:58:50 2005
@@ -28,7 +28,7 @@
<operation name="getBookPrice">
<soap:operation />
<input>
- <soap:body use="literal" namespace="http://www.Monson-Haefel.com/jwsbook/BookQuote/BookQuote"/>
+ <soap:body use="literal" namespace="http://www.Monson-Haefel.com/jwsbook/BookQuote"/>
</input>
</operation>
</binding>