diff options
Diffstat (limited to '')
-rw-r--r-- | sca-java-2.x/tags/2.0-Beta1-RC2/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/sca-java-2.x/tags/2.0-Beta1-RC2/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java b/sca-java-2.x/tags/2.0-Beta1-RC2/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java new file mode 100644 index 0000000000..dd19407abe --- /dev/null +++ b/sca-java-2.x/tags/2.0-Beta1-RC2/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceIntrospectorImpl.java @@ -0,0 +1,135 @@ +/* + * 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.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.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; + +/** + * 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<Operation> introspectOperations(PortType portType, WSDLDefinition wsdlDefinition, ModelResolver resolver, Monitor monitor) throws InvalidWSDLException { + List<Operation> operations = new ArrayList<Operation>(); + 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) { + 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<QName> policyAttributes = (Vector<QName>) o; + + Enumeration<QName> 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); + } + + } + } + +} |