Author: palin
Date: 2007-04-29 18:30:33 -0400 (Sun, 29 Apr 2007)
New Revision: 2948
Modified:
branches/JBWS-856/jbossws-core/src/java/org/jboss/ws/metadata/builder/jaxws/JAXWSWebServiceMetaDataBuilder.java
branches/JBWS-856/jbossws-core/src/java/org/jboss/ws/tools/wsdl/WSDL11Reader.java
branches/JBWS-856/jbossws-core/src/java/org/jboss/ws/tools/wsdl/WSDL11Writer.java
branches/JBWS-856/jbossws-tests/src/java/org/jboss/test/ws/common/wsdl11/WSDL11TestCase.java
Log:
Partial commit:
- Modified the marshalling of wsdl 1.1 from the unified wsdl structure in order to write
policies into the wsdl
- Minor issues fixed
Modified:
branches/JBWS-856/jbossws-core/src/java/org/jboss/ws/metadata/builder/jaxws/JAXWSWebServiceMetaDataBuilder.java
===================================================================
---
branches/JBWS-856/jbossws-core/src/java/org/jboss/ws/metadata/builder/jaxws/JAXWSWebServiceMetaDataBuilder.java 2007-04-27
18:55:01 UTC (rev 2947)
+++
branches/JBWS-856/jbossws-core/src/java/org/jboss/ws/metadata/builder/jaxws/JAXWSWebServiceMetaDataBuilder.java 2007-04-29
22:30:33 UTC (rev 2948)
@@ -407,7 +407,7 @@
}
- public void writeWsdl(ServiceMetaData serviceMetaData, WSDLDefinitions
wsdlDefinitions, EndpointMetaData epMetaData)
+ public void writeWsdl(ServiceMetaData serviceMetaData, WSDLDefinitions
wsdlDefinitions, EndpointMetaData epMetaData) throws IOException
{
// The RI uses upper case, and the TCK expects it, so we just mimic this even
though we don't really have to
String wsdlName =
ToolsUtils.firstLetterUpperCase(serviceMetaData.getServiceName().getLocalPart());
Modified:
branches/JBWS-856/jbossws-core/src/java/org/jboss/ws/tools/wsdl/WSDL11Reader.java
===================================================================
---
branches/JBWS-856/jbossws-core/src/java/org/jboss/ws/tools/wsdl/WSDL11Reader.java 2007-04-27
18:55:01 UTC (rev 2947)
+++
branches/JBWS-856/jbossws-core/src/java/org/jboss/ws/tools/wsdl/WSDL11Reader.java 2007-04-29
22:30:33 UTC (rev 2948)
@@ -109,6 +109,7 @@
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
/**
* A helper that translates a WSDL-1.1 object graph into a WSDL-2.0 object graph.
@@ -232,8 +233,9 @@
Element srcElement = ((UnknownExtensibilityElement)extElement).getElement();
if (Constants.URI_WS_POLICY.equals(srcElement.getNamespaceURI()))
{
+ //copy missing namespaces from the source element to our element
Element element = (Element)srcElement.cloneNode(true);
- copyParentNamespaceDeclarations(element,srcElement);
+ copyMissingNamespaceDeclarations(element, srcElement);
if (element.getLocalName().equals("Policy"))
{
dest.addExtensibilityElement(
@@ -350,6 +352,29 @@
parent = parent.getParentNode();
}
}
+
+ private void copyMissingNamespaceDeclarations(Element destElement, Element
srcElement)
+ {
+ String prefix = destElement.getPrefix();
+ if (prefix!=null && destElement.lookupNamespaceURI(prefix) == null)
+ destElement.setAttribute("xmlns:"+prefix,
srcElement.lookupNamespaceURI(prefix));
+
+ NamedNodeMap attributes = destElement.getAttributes();
+ for (int i = 0; i < attributes.getLength(); i++)
+ {
+ Attr attr = (Attr)attributes.item(i);
+ String attrPrefix = attr.getPrefix();
+ if (attrPrefix!=null && !attr.getName().startsWith("xmlns")
&& destElement.lookupNamespaceURI(attrPrefix) == null)
+ destElement.setAttribute("xmlns:"+attrPrefix,
srcElement.lookupNamespaceURI(attrPrefix));
+ }
+ NodeList childrenList = destElement.getChildNodes();
+ for (int i=0; i<childrenList.getLength(); i++)
+ {
+ Node node = childrenList.item(i);
+ if (node instanceof Element)
+ copyMissingNamespaceDeclarations((Element)node, srcElement);
+ }
+ }
private void processSchemaImport(WSDLTypes types, URL wsdlLoc, Element importEl)
throws IOException, WSDLException
{
Modified:
branches/JBWS-856/jbossws-core/src/java/org/jboss/ws/tools/wsdl/WSDL11Writer.java
===================================================================
---
branches/JBWS-856/jbossws-core/src/java/org/jboss/ws/tools/wsdl/WSDL11Writer.java 2007-04-27
18:55:01 UTC (rev 2947)
+++
branches/JBWS-856/jbossws-core/src/java/org/jboss/ws/tools/wsdl/WSDL11Writer.java 2007-04-29
22:30:33 UTC (rev 2948)
@@ -35,6 +35,7 @@
import org.jboss.ws.WSException;
import org.jboss.ws.core.utils.DOMUtils;
import org.jboss.ws.core.utils.DOMWriter;
+import org.jboss.ws.metadata.wsdl.Extendable;
import org.jboss.ws.metadata.wsdl.WSDLBinding;
import org.jboss.ws.metadata.wsdl.WSDLBindingMessageReference;
import org.jboss.ws.metadata.wsdl.WSDLBindingOperation;
@@ -42,6 +43,7 @@
import org.jboss.ws.metadata.wsdl.WSDLBindingOperationOutput;
import org.jboss.ws.metadata.wsdl.WSDLDefinitions;
import org.jboss.ws.metadata.wsdl.WSDLEndpoint;
+import org.jboss.ws.metadata.wsdl.WSDLExtensibilityElement;
import org.jboss.ws.metadata.wsdl.WSDLImport;
import org.jboss.ws.metadata.wsdl.WSDLInterface;
import org.jboss.ws.metadata.wsdl.WSDLInterfaceFault;
@@ -50,12 +52,17 @@
import org.jboss.ws.metadata.wsdl.WSDLInterfaceOperationInput;
import org.jboss.ws.metadata.wsdl.WSDLInterfaceOperationOutfault;
import org.jboss.ws.metadata.wsdl.WSDLInterfaceOperationOutput;
+import org.jboss.ws.metadata.wsdl.WSDLProperty;
import org.jboss.ws.metadata.wsdl.WSDLRPCPart;
import org.jboss.ws.metadata.wsdl.WSDLRPCSignatureItem;
import org.jboss.ws.metadata.wsdl.WSDLSOAPHeader;
import org.jboss.ws.metadata.wsdl.WSDLService;
import org.jboss.ws.metadata.wsdl.WSDLRPCSignatureItem.Direction;
+import org.w3c.dom.Attr;
import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
/**
* A WSDL Writer that writes a WSDL 1.1 file. It works off
@@ -158,12 +165,63 @@
writtenFaultMessages.clear();
appendTypes(builder, namespace);
+ appendUnknownExtensibilityElements(builder, wsdl);
appendMessages(builder, namespace);
appendInterfaces(builder, namespace);
appendBindings(builder, namespace);
appendServices(builder, namespace);
builder.append("</definitions>");
}
+
+ protected void appendUnknownExtensibilityElements(StringBuilder builder, Extendable
extendable)
+ {
+ for (WSDLExtensibilityElement ext : extendable.getAllExtensibilityElements())
+ {
+ appendPolicyElements(builder, ext);
+ //add processing of further extensibility element types below
+ }
+ }
+
+ private void appendPolicyElements(StringBuilder builder, WSDLExtensibilityElement
extElem)
+ {
+ if (Constants.WSDL_ELEMENT_POLICY.equalsIgnoreCase(extElem.getUri()) ||
+ Constants.WSDL_ELEMENT_POLICYREFERENCE.equalsIgnoreCase(extElem.getUri()))
+ {
+ appendElementSkippingKnownNs(builder, extElem.getElement());
+ }
+ }
+
+ private void appendElementSkippingKnownNs(StringBuilder builder, Element el)
+ {
+ builder.append("<"+el.getNodeName());
+ NamedNodeMap attributes = el.getAttributes();
+ for (int i = 0; i < attributes.getLength(); i++)
+ {
+ Attr attr = (Attr)attributes.item(i);
+ if (attr.getName().startsWith("xmlns:") &&
attr.getValue()!=null)
+ {
+ String prefix = attr.getName().substring(6);
+ if (attr.getValue().equalsIgnoreCase(wsdl.getNamespaceURI(prefix)))
+ continue;
+ }
+ builder.append("
"+attr.getName()+"='"+attr.getValue()+"'");
+ }
+ builder.append(">");
+ NodeList childrenList = el.getChildNodes();
+ for (int i=0; i<childrenList.getLength(); i++)
+ {
+ Node node = childrenList.item(i);
+ if (node instanceof Element)
+ {
+ appendElementSkippingKnownNs(builder, (Element)node);
+ }
+ else
+ {
+ builder.append(DOMWriter.printNode(node, false));
+ }
+ }
+ builder.append("</"+el.getNodeName()+">");
+ }
protected void appendMessages(StringBuilder buffer, String namespace)
{
@@ -195,7 +253,10 @@
String interfaceName = operation.getWsdlInterface().getName().getLocalPart();
buffer.append("<message name='" + interfaceName + "_" +
opname + "' >");
for (WSDLInterfaceOperationInput input : operation.getInputs())
+ {
+ appendUnknownExtensibilityElements(buffer, input); //only one may contain
extensibility elements
appendMessageParts(buffer, input);
+ }
buffer.append("</message>");
if (! Constants.WSDL20_PATTERN_IN_ONLY.equals(operation.getPattern()))
@@ -311,7 +372,20 @@
if (!namespace.equals(intf.getName().getNamespaceURI()))
continue;
- buffer.append("<portType name='" +
intf.getName().getLocalPart() + "'>");
+ buffer.append("<portType name='" +
intf.getName().getLocalPart() + "'");
+ WSDLProperty policyProp = intf.getProperty(Constants.WSDL_PROPERTY_POLICYURIS);
+ if (policyProp != null)
+ {
+ String prefix = wsdl.getPrefix(Constants.URI_WS_POLICY);
+ buffer.append(" ");
+ buffer.append(prefix);
+ buffer.append(":");
+ buffer.append(Constants.WSDL_ATTRIBUTE_WSP_POLICYURIS.getLocalPart());
+ buffer.append("='");
+ buffer.append(policyProp.getValue());
+ buffer.append("'");
+ }
+ buffer.append(">");
appendPortOperations(buffer, intf);
buffer.append("</portType>");
}
@@ -351,6 +425,7 @@
}
buffer.append(">");
+ appendUnknownExtensibilityElements(buffer, operation);
String opname = operation.getName().getLocalPart();
String interfaceName = operation.getWsdlInterface().getName().getLocalPart();
@@ -392,6 +467,7 @@
String style = "rpc";
if (wsdlStyle.equals(Constants.DOCUMENT_LITERAL))
style = "document";
+ appendUnknownExtensibilityElements(buffer, binding);
buffer.append("<" + soapPrefix + ":binding
transport='http://schemas.xmlsoap.org/soap/http' style='" + style +
"'/>");
appendBindingOperations(buffer, binding);
buffer.append("</binding>");
@@ -415,6 +491,7 @@
buffer.append("<operation name='" +
interfaceOperation.getName().getLocalPart() + "'>");
String soapAction = (operation.getSOAPAction() != null ?
operation.getSOAPAction() : "");
+ appendUnknownExtensibilityElements(buffer, operation);
buffer.append("<" + soapPrefix + ":operation
soapAction=\"" + soapAction + "\"/>");
WSDLBindingOperationInput[] inputs = operation.getInputs();
@@ -422,6 +499,7 @@
throw new WSException("WSDl 1.1 only supports In-Only, and In-Out
MEPS.");
buffer.append("<input>");
+ appendUnknownExtensibilityElements(buffer, inputs[0]);
appendSOAPBinding(buffer, wsdlInterface, operation, inputs);
buffer.append("</input>");
@@ -519,6 +597,7 @@
if (!namespace.equals(service.getName().getNamespaceURI()))
continue;
buffer.append("<service name='" +
service.getName().getLocalPart() + "'>");
+ appendUnknownExtensibilityElements(buffer, service);
WSDLEndpoint[] endpoints = service.getEndpoints();
int lenend = endpoints.length;
for (int j = 0; j < lenend; j++)
@@ -540,6 +619,7 @@
String ebname = prefix + ":" + endpointBinding.getLocalPart();
buffer.append("<port name='" + name + "'
binding='" + ebname + "'>");
buffer.append("<" + soapPrefix + ":address location='" +
endpoint.getAddress() + "'/>");
+ appendUnknownExtensibilityElements(buffer, endpoint);
buffer.append("</port>");
}
}
\ No newline at end of file
Modified:
branches/JBWS-856/jbossws-tests/src/java/org/jboss/test/ws/common/wsdl11/WSDL11TestCase.java
===================================================================
---
branches/JBWS-856/jbossws-tests/src/java/org/jboss/test/ws/common/wsdl11/WSDL11TestCase.java 2007-04-27
18:55:01 UTC (rev 2947)
+++
branches/JBWS-856/jbossws-tests/src/java/org/jboss/test/ws/common/wsdl11/WSDL11TestCase.java 2007-04-29
22:30:33 UTC (rev 2948)
@@ -22,12 +22,16 @@
package org.jboss.test.ws.common.wsdl11;
import java.io.File;
+import java.io.Writer;
import java.util.List;
import javax.xml.namespace.QName;
import org.jboss.test.ws.JBossWSTest;
+import org.jboss.test.ws.tools.validation.WSDLValidationHelper;
+import org.jboss.test.ws.tools.validation.WSDLValidator;
import org.jboss.ws.Constants;
+import org.jboss.ws.core.utils.IOUtils;
import org.jboss.ws.extensions.eventing.EventingConstants;
import org.jboss.ws.metadata.wsdl.WSDLBinding;
import org.jboss.ws.metadata.wsdl.WSDLDefinitions;
@@ -43,6 +47,7 @@
import org.jboss.ws.metadata.wsdl.WSDLTypes;
import org.jboss.ws.metadata.wsdl.WSDLUtils;
import org.jboss.ws.tools.wsdl.WSDLDefinitionsFactory;
+import org.jboss.ws.tools.wsdl.WSDLWriter;
import org.w3c.dom.Element;
/**
@@ -188,6 +193,11 @@
assertNotNull(wsdlDefinitions); // should throw an Exception when SWA parts are not
skipped
}
+
+ /**************************************************
+ * Test WSDL 1.1 marshal/unmarshal with policies *
+ **************************************************/
+
public void testPolicyAttachment() throws Exception
{
File wsdlFile = new
File("resources/common/wsdl11/PolicyAttachment.wsdl");
@@ -279,4 +289,29 @@
assertNotNull(el);
assertEquals(el.getAttributeNode("URI").getValue(),"#"+policyURI);
}
+
+ public void testPolicyAttachmentReadWrite() throws Exception
+ {
+ //Read wsdl containing policies from file and get the wsdl metadata model
+ WSDLDefinitionsFactory factory = WSDLDefinitionsFactory.newInstance();
+ WSDLDefinitions wsdlDefinitions = factory.parse(new
File("resources/common/wsdl11/PolicyAttachment.wsdl").toURL());
+ assertNotNull(wsdlDefinitions);
+ //set wsdlOneOne to null to force wsdl generation from metadata model
+ wsdlDefinitions.setWsdlOneOneDefinition(null);
+
+ //process the wsdl metadata model writing it back to another file
+ File wsdlDir = new File("./tools/wsdl-out");
+ if (!wsdlDir.exists()) wsdlDir.mkdirs();
+ Writer fw = IOUtils.getCharsetFileWriter(new
File(wsdlDir+"/GeneratedWsdlWithPolicies.wsdl"),
Constants.DEFAULT_XML_CHARSET);
+ new WSDLWriter(wsdlDefinitions).write(fw, Constants.DEFAULT_XML_CHARSET);
+ fw.close();
+
+ //parse the obtained file and validate the resulting wsdl metadata model against
the first one
+ WSDLDefinitions newWsdlDefinitions = factory.parse(new
File(wsdlDir+"/GeneratedWsdlWithPolicies.wsdl").toURL());
+ assertNotNull(newWsdlDefinitions);
+ WSDLValidator validator = new WSDLValidator();
+ //TODO!!! Modify the WSDLValidator to validate policy attachments too
+ assertTrue(validator.validate(wsdlDefinitions,newWsdlDefinitions));
+ }
+
}