diff options
Diffstat (limited to 'sca-java-2.x/trunk/modules/interface-wsdl/src')
4 files changed, 204 insertions, 0 deletions
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 } |