diff options
Diffstat (limited to '')
7 files changed, 252 insertions, 3 deletions
diff --git a/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/META-INF/MANIFEST.MF b/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/META-INF/MANIFEST.MF index c71dfdb8d8..43f305bcae 100644 --- a/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/META-INF/MANIFEST.MF +++ b/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/META-INF/MANIFEST.MF @@ -38,6 +38,7 @@ Import-Package: javax.jws;resolution:=optional, org.apache.tuscany.sca.contribution;version="2.0.0";resolution:=optional,
org.apache.tuscany.sca.contribution.resolver;version="2.0.0",
org.apache.tuscany.sca.core;version="2.0.0",
+ org.apache.tuscany.sca.definitions;version="2.0.0",
org.apache.tuscany.sca.databinding;version="2.0.0",
org.apache.tuscany.sca.databinding.jaxb;version="2.0.0",
org.apache.tuscany.sca.interfacedef;version="2.0.0",
diff --git a/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WebServiceBindingBuilder.java b/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WebServiceBindingBuilder.java index 2b24df92d2..08f8ce7cf4 100644 --- a/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WebServiceBindingBuilder.java +++ b/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WebServiceBindingBuilder.java @@ -27,6 +27,12 @@ import org.apache.tuscany.sca.assembly.builder.BindingBuilder; import org.apache.tuscany.sca.assembly.builder.BuilderContext; import org.apache.tuscany.sca.binding.ws.WebServiceBinding; import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.definitions.Definitions; +import org.apache.tuscany.sca.policy.BindingType; +import org.apache.tuscany.sca.policy.Intent; +import org.apache.tuscany.sca.policy.PolicyFactory; +import org.apache.tuscany.sca.policy.PolicySubject; /** * A factory for the calculated WSDL document needed by Web Service bindings. @@ -52,7 +58,46 @@ public class WebServiceBindingBuilder implements BindingBuilder<WebServiceBindin binding.setBindingInterfaceContract(null); binding.setGeneratedWSDLDocument(null); } + BindingWSDLGenerator.generateWSDL(component, contract, binding, extensionPoints, context.getMonitor()); + + /* + * Set the default mayProvides intent provided by the binding. For example, + * It mayProvides SOAP.v1_1 and SOAP.v1_2. If you don't specify any intents + * it implements SOAP.v1_1 by default and hence the default intent + * is SOAP.v1_1. Binding.ws doesn't allwaysProvide SOAP.v1_1 though as if the + * user specifies the SOAP.v1_2 the binding does SOAP.v1_2 instead of SOAP.v1_1 + */ + boolean addDefaultSOAPIntent = true; + + for(Intent intent : ((PolicySubject)binding).getRequiredIntents()){ + if (intent.getName().getLocalPart().equals("SOAP.v1_1")){ + addDefaultSOAPIntent = false; + break; + } + if (intent.getName().getLocalPart().equals("SOAP.v1_2")){ + addDefaultSOAPIntent = false; + break; + } + } + + if (addDefaultSOAPIntent){ + Definitions systemDefinitions = context.getDefinitions(); + if (systemDefinitions != null){ + BindingType bindingType = systemDefinitions.getBindingType(binding.getType()); + Intent defaultIntent = null; + for (Intent intent : bindingType.getMayProvidedIntents()){ + if (intent.getName().getLocalPart().equals("SOAP.v1_1")){ + defaultIntent = intent; + } + } + + if (defaultIntent != null){ + ((PolicySubject)binding).getRequiredIntents().add(0, defaultIntent); + } + } + } + } public QName getBindingType() { diff --git a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java index ea8d7aba9c..b0be5cb3e8 100644 --- a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java +++ b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java @@ -822,7 +822,7 @@ public class EndpointReferenceBinderImpl implements EndpointReferenceBinder { } // TUSCANY-3959 - something that's not explicitly stated in the spec. mayProvides intents don't - // don't lead to policy sets as the binding natively implements the intent. So + // lead to policy sets as the binding natively implements the intent. So // we need to check that these intents match explicitly between reference and service // sides if (eprMayProvideInterationIntents.size() > 0){ @@ -838,8 +838,7 @@ public class EndpointReferenceBinderImpl implements EndpointReferenceBinder { if (!match){ matchAudit.append("No match because the reference has a mayProvide intent that the service doesn't have " + eprIntent.getName()); matchAudit.appendSeperator(); - // Causing POL 4031 to fail - //return false; + return false; } } } diff --git a/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/RequiresExt.java b/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/RequiresExt.java new file mode 100644 index 0000000000..e72aa98420 --- /dev/null +++ b/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/RequiresExt.java @@ -0,0 +1,56 @@ +/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.interfacedef.wsdl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.xml.namespace.QName;
+
+/**
+ * A class to serve as the extensibility element for policy requires elements
+ */
+public class RequiresExt implements ExtensibilityElement {
+
+ private QName elementType = null;
+ private List<QName> intents = new ArrayList<QName>();
+
+ // -- methods required by the Extensibility Element interface
+ public QName getElementType() {
+ return elementType;
+ }
+
+ public Boolean getRequired() {
+ return true;
+ }
+
+ public void setElementType(QName theName ) {
+ elementType = theName;
+ }
+
+ public void setRequired(Boolean required) {
+ // intentionally left blank
+ }
+
+ // -- other methods
+ public List<QName> getIntents(){
+ return intents;
+ }
+}
diff --git a/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java b/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java index dd19407abe..642aa81179 100644 --- a/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java +++ b/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java @@ -25,11 +25,14 @@ import java.util.List; import java.util.Vector; import javax.wsdl.PortType; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.UnknownExtensibilityElement; import javax.xml.namespace.QName; import org.apache.tuscany.sca.contribution.resolver.ModelResolver; import org.apache.tuscany.sca.core.FactoryExtensionPoint; import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.interfacedef.wsdl.RequiresExt; import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory; import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface; @@ -38,6 +41,7 @@ import org.apache.tuscany.sca.monitor.Monitor; import org.apache.tuscany.sca.policy.Intent; import org.apache.tuscany.sca.policy.PolicyFactory; import org.apache.tuscany.sca.xsd.XSDFactory; +import org.w3c.dom.Element; /** * Introspector for creating WSDLInterface definitions from WSDL PortTypes. @@ -108,6 +112,8 @@ public class WSDLInterfaceIntrospectorImpl { } // end method processCallbackAttribute private void processIntents(WSDLInterface wsdlInterface, PortType portType) { + + // process @requires attribute Object o; try { o = portType.getExtensionAttribute(POLICY_REQUIRES); @@ -128,7 +134,22 @@ public class WSDLInterfaceIntrospectorImpl { wsdlInterface.getRequiredIntents().add(intent); } + } + + // process <sca:requires/> element + for(Object object : portType.getExtensibilityElements()){ + ExtensibilityElement element = (ExtensibilityElement)object; + if (element.getElementType().equals(POLICY_REQUIRES)){ + RequiresExt requires = ((RequiresExt)element); + + for (QName intentName : requires.getIntents()){ + Intent intent = policyFactory.createIntent(); + intent.setName(intentName); + + wsdlInterface.getRequiredIntents().add(intent); + } + } } } diff --git a/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/PolicyExtensionHandler.java b/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/PolicyExtensionHandler.java new file mode 100644 index 0000000000..937be6a57f --- /dev/null +++ b/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/PolicyExtensionHandler.java @@ -0,0 +1,119 @@ +/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.interfacedef.wsdl.xml;
+
+import java.io.PrintWriter;
+
+import javax.wsdl.Definition;
+import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.ExtensionDeserializer;
+import javax.wsdl.extensions.ExtensionRegistry;
+import javax.wsdl.extensions.ExtensionSerializer;
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.sca.interfacedef.wsdl.RequiresExt;
+import org.w3c.dom.Element;
+
+/**
+ * A WSDL extension processor for extension policy elements of the form:
+ *
+ * <sca:requires intents="sca:SOAP.v1_1"/>
+ *
+ */
+public class PolicyExtensionHandler implements ExtensionSerializer, ExtensionDeserializer {
+
+ /**
+ * Marshals the requires extension element to XML
+ * See (@link javax.wsdl.extensions.ExtensionSerializer)
+ */
+ @SuppressWarnings("unchecked")
+ public void marshall(Class parentType,
+ QName elementType,
+ ExtensibilityElement theElement,
+ PrintWriter writer,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException {
+
+ RequiresExt requires = (RequiresExt) theElement;
+ QName theType = requires.getElementType();
+
+ writer.println("<" + theType.toString() +
+ " intents=\"");
+
+ for(QName intentName : requires.getIntents()){
+ writer.println(intentName + " ");
+ }
+
+ writer.println("\">");
+ }
+
+ /**
+ * Unmarshals the requires extension element from XML
+ */
+ @SuppressWarnings("unchecked")
+ public ExtensibilityElement unmarshall(Class theClass,
+ QName elementType,
+ Element theElement,
+ Definition def,
+ ExtensionRegistry extReg)
+ throws WSDLException {
+
+ // Check that this elementType really is a requires element
+ if( !elementType.getLocalPart().equals("requires") ){
+ return null;
+ }
+
+ RequiresExt requires = new RequiresExt();
+ requires.setElementType(elementType);
+
+ String intents = theElement.getAttribute("intents");
+ String[] intentArray = intents.split(" +");
+
+ for (int i=0; i < intentArray.length; i++){
+ String intentNameString = intentArray[i];
+ QName intentQName = getQNameValue( def, intentNameString);
+ requires.getIntents().add(intentQName);
+ }
+
+ return requires;
+ }
+
+ /**
+ * Returns a QName from a string.
+ * @param definition - a WSDL Definition
+ * @param value - the String from which to form the QName in the form "pref:localName"
+ * @return
+ */
+ protected QName getQNameValue(Definition definition, String value) {
+ if (value != null && definition != null) {
+ int index = value.indexOf(':');
+ String prefix = index == -1 ? "" : value.substring(0, index);
+ String localName = index == -1 ? value : value.substring(index + 1);
+ String ns = definition.getNamespace(prefix);
+ if (ns == null) {
+ ns = "";
+ }
+ return new QName(ns, localName, prefix);
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java b/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java index fdb562b1b7..354cca8392 100644 --- a/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java +++ b/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java @@ -103,6 +103,7 @@ public class WSDLModelResolver implements ModelResolver { // ---- SCA Policy WSDL Attachments public static final QName Q_POLICY_ATTRIBUTE_EXTENSION = new QName("http://docs.oasis-open.org/ns/opencsa/sca/200912", "requires"); + public static final QName Q_POLICY_ELEMENT_EXTENSION = new QName("http://docs.oasis-open.org/ns/opencsa/sca/200912", "requires"); public static final QName Q_POLICY_END_CONVERSATION_ATTRIBUTE_EXTENSION = new QName("http://docs.oasis-open.org/ns/opencsa/sca/200912", "endsConversation"); // ---- SCA Callback WSDL Extension public static final QName Q_CALLBACK_ATTRIBUTE_EXTENSION = new QName("http://docs.oasis-open.org/ns/opencsa/sca/200912", "callback" ); @@ -134,6 +135,7 @@ public class WSDLModelResolver implements ModelResolver { this.xsdFactory = modelFactories.getFactory(XSDFactory.class); wsdlExtensionRegistry = this.wsdl4jFactory.newPopulatedExtensionRegistry(); + // REVIEW: [rfeng] Disable the schema extension for WSDL4J to avoid aggressive loading ExtensionDeserializer deserializer = new UnknownExtensionDeserializer(); ExtensionSerializer serializer = new UnknownExtensionSerializer(); @@ -141,11 +143,17 @@ public class WSDLModelResolver implements ModelResolver { wsdlExtensionRegistry.registerSerializer(Types.class, schema, serializer); wsdlExtensionRegistry.registerDeserializer(Types.class, schema, deserializer); } + // ---- Policy WSDL Extensions try { wsdlExtensionRegistry.registerExtensionAttributeType(PortType.class, Q_POLICY_ATTRIBUTE_EXTENSION, AttributeExtensible.LIST_OF_QNAMES_TYPE); wsdlExtensionRegistry.registerExtensionAttributeType(Operation.class, Q_POLICY_END_CONVERSATION_ATTRIBUTE_EXTENSION, AttributeExtensible.STRING_TYPE); wsdlExtensionRegistry.registerExtensionAttributeType(PortType.class, Q_CALLBACK_ATTRIBUTE_EXTENSION, AttributeExtensible.QNAME_TYPE); + + serializer = new PolicyExtensionHandler(); + deserializer = new PolicyExtensionHandler(); + wsdlExtensionRegistry.registerSerializer(PortType.class, Q_POLICY_ELEMENT_EXTENSION, serializer); + wsdlExtensionRegistry.registerDeserializer(PortType.class, Q_POLICY_ELEMENT_EXTENSION, deserializer); } catch (NoSuchMethodError e) { // That method does not exist on older WSDL4J levels } |