From 132aa8a77685ec92bc90c03f987650d275a7b639 Mon Sep 17 00:00:00 2001 From: lresende Date: Mon, 30 Sep 2013 06:59:11 +0000 Subject: 2.0.1 RC1 release tag git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1527464 13f79535-47bb-0310-9956-ffa450edef68 --- .../wsdl/impl/WSDLInterfaceIntrospectorImpl.java | 156 +++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 sca-java-2.x/tags/2.0.1-RC1/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java (limited to 'sca-java-2.x/tags/2.0.1-RC1/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java') diff --git a/sca-java-2.x/tags/2.0.1-RC1/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java b/sca-java-2.x/tags/2.0.1-RC1/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java new file mode 100644 index 0000000000..642aa81179 --- /dev/null +++ b/sca-java-2.x/tags/2.0.1-RC1/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java @@ -0,0 +1,156 @@ +/* + * 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.impl; + +import java.util.ArrayList; +import java.util.Enumeration; +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; +import org.apache.tuscany.sca.interfacedef.wsdl.xml.WSDLInterfaceProcessor; +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. + * + * @version $Rev$ $Date$ + */ +public class WSDLInterfaceIntrospectorImpl { + private static final QName POLICY_REQUIRES = new QName("http://docs.oasis-open.org/ns/opencsa/sca/200912", "requires"); + + private static final QName CALLBACK_ATTRIBUTE = new QName("http://docs.oasis-open.org/ns/opencsa/sca/200912", "callback" ); + + private WSDLFactory wsdlFactory; + private XSDFactory xsdFactory; + private PolicyFactory policyFactory; + + public WSDLInterfaceIntrospectorImpl(FactoryExtensionPoint modelFactories, WSDLFactory wsdlFactory) { + this.xsdFactory = modelFactories.getFactory(XSDFactory.class); + this.policyFactory = modelFactories.getFactory(PolicyFactory.class); + this.wsdlFactory = wsdlFactory; + } + + // FIXME: Do we want to deal with document-literal wrapped style based on the JAX-WS Specification? + private List introspectOperations(PortType portType, WSDLDefinition wsdlDefinition, ModelResolver resolver, Monitor monitor) throws InvalidWSDLException { + List operations = new ArrayList(); + for (Object o : portType.getOperations()) { + javax.wsdl.Operation wsdlOp = (javax.wsdl.Operation)o; + Operation operation = getOperation(wsdlOp, wsdlDefinition, resolver, xsdFactory, monitor); + operations.add(operation); + } + return operations; + } + + public void introspectPortType(WSDLInterface wsdlInterface, PortType portType, WSDLDefinition wsdlDefinition, ModelResolver resolver, Monitor monitor) throws InvalidWSDLException { + processIntents(wsdlInterface, portType); + WSDLInterface callback = processCallbackAttribute( portType, resolver, monitor ); + wsdlInterface.setPortType(portType); + wsdlInterface.setCallbackInterface(callback); + wsdlInterface.getOperations().addAll(introspectOperations(portType, wsdlDefinition, resolver, monitor)); + } + + public static Operation getOperation(javax.wsdl.Operation wsdlOp, + WSDLDefinition wsdlDefinition, + ModelResolver resolver, + XSDFactory xsdFactory, + Monitor monitor) throws InvalidWSDLException { + WSDLOperationIntrospectorImpl op = new WSDLOperationIntrospectorImpl(xsdFactory, wsdlOp, wsdlDefinition, null, resolver, monitor); + return op.getOperation(); + } + + /** + * Process an extension @callback attribute on a WSDL portType declaration + * - the callback attribute must contain the QName of another portType + * @param portType the portType + * @return + */ + private WSDLInterface processCallbackAttribute( PortType portType, ModelResolver resolver, Monitor monitor ) { + Object o = portType.getExtensionAttribute(CALLBACK_ATTRIBUTE); + if(o != null && o instanceof QName) { + WSDLInterface wsdlInterface = wsdlFactory.createWSDLInterface(); + wsdlInterface.setUnresolved(true); + wsdlInterface.setName( (QName)o ); + wsdlInterface = WSDLInterfaceProcessor.resolveWSDLInterface( wsdlInterface, resolver, monitor, wsdlFactory ); + + return wsdlInterface; + } else { + return null; + } // end if + } // end method processCallbackAttribute + + private void processIntents(WSDLInterface wsdlInterface, PortType portType) { + + // process @requires attribute + Object o; + try { + o = portType.getExtensionAttribute(POLICY_REQUIRES); + } catch (NoSuchMethodError e) { + // That method does not exist on older WSDL4J levels + o = null; + } + if(o != null && o instanceof Vector) { + Vector policyAttributes = (Vector) o; + + Enumeration policyItents = policyAttributes.elements(); + while (policyItents.hasMoreElements()) { + QName intentName = policyItents.nextElement(); + + // Add each intent to the list + Intent intent = policyFactory.createIntent(); + intent.setName(intentName); + + wsdlInterface.getRequiredIntents().add(intent); + } + } + + // process 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); + } + } + } + } + +} -- cgit v1.2.3