diff options
Diffstat (limited to 'sca-java-1.x/tags/java-stable-20060304/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/handler/WebServicePortMetaData.java')
-rw-r--r-- | sca-java-1.x/tags/java-stable-20060304/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/handler/WebServicePortMetaData.java | 362 |
1 files changed, 362 insertions, 0 deletions
diff --git a/sca-java-1.x/tags/java-stable-20060304/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/handler/WebServicePortMetaData.java b/sca-java-1.x/tags/java-stable-20060304/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/handler/WebServicePortMetaData.java new file mode 100644 index 0000000000..9ce85d3ca8 --- /dev/null +++ b/sca-java-1.x/tags/java-stable-20060304/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/handler/WebServicePortMetaData.java @@ -0,0 +1,362 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis.handler; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import javax.wsdl.Binding; +import javax.wsdl.BindingOperation; +import javax.wsdl.Definition; +import javax.wsdl.Port; +import javax.wsdl.PortType; +import javax.wsdl.Service; +import javax.wsdl.extensions.soap.SOAPAddress; +import javax.wsdl.extensions.soap.SOAPBinding; +import javax.xml.namespace.QName; +import javax.xml.soap.Name; +import javax.xml.soap.SOAPBodyElement; +import javax.xml.soap.SOAPElement; + +import org.apache.tuscany.model.types.wsdl.WSDLServiceContract; + +/** + * Metadata for a WSDL port + * + */ +public class WebServicePortMetaData { + + private final static String SOAP_ENCODING_URI = "http://schemas.xmlsoap.org/wsdl/soap/"; + + private Service wsdlService; + private QName wsdlServiceName; + private Port wsdlPort; + private Binding wsdlBinding; + private QName wsdlPortName; + private PortType wsdlPortType; + private QName wsdlPortTypeName; + private String endpoint; + private boolean managed; + private List allOperationMetaData; + private WSDLServiceContract interfaceType; + + /** + * Constructor + * + * @param wsdlDefinition + * @param portName + */ + public WebServicePortMetaData(Definition wsdlDefinition, Port wsdlPort, String endpoint, boolean managed) { + + // Lookup the named port + this.wsdlPort=wsdlPort; + wsdlPortName = new QName(wsdlDefinition.getTargetNamespace(), wsdlPort.getName()); + + Collection<Service> services=(Collection<Service>)wsdlDefinition.getServices().values(); + for (Service service : services) { + if (service.getPorts().containsValue(wsdlPort)) { + wsdlService = service; + wsdlServiceName = service.getQName(); + break; + } + } + + // Save the binding + wsdlBinding = wsdlPort.getBinding(); + if (wsdlBinding == null) { + throw new IllegalArgumentException("WSDL binding cannot be found for " + wsdlPortName); + } + + // Save the portType + wsdlPortType = wsdlBinding.getPortType(); + if (wsdlPortType == null) { + throw new IllegalArgumentException("WSDL portType cannot be found for " + wsdlPortName); + } + wsdlPortTypeName = wsdlPortType.getQName(); + + // Save the endpoint + this.endpoint = endpoint; + + // Track if this endpoint is managed or not + this.managed = managed; + } + + /** + * Constructor + * + * @param serviceName + * @param portName + * @param portType + */ + public WebServicePortMetaData(QName serviceName, String portName, QName portTypeName, String endpoint) { + wsdlServiceName = serviceName; + wsdlPortName = new QName(serviceName.getNamespaceURI(), portName); + wsdlPortTypeName = portTypeName; + this.endpoint = endpoint; + } + + /** + * @return Returns the wsdlPort. + */ + public javax.wsdl.Port getPort() { + return wsdlPort; + } + + /** + * @return Returns the wsdlService. + */ + public QName getServiceName() { + return wsdlServiceName; + } + + /** + * @return Returns the wsdlService. + */ + public javax.wsdl.Service getService() { + return wsdlService; + } + + /** + * @return Returns the wsdlPortType. + */ + public PortType getPortType() { + return wsdlPortType; + } + + /** + * @return Returns the wsdlPortType. + */ + public QName getPortTypeName() { + return wsdlPortTypeName; + } + + /** + * @return Returns the wsdlBinding. + */ + public Binding getBinding() { + return wsdlBinding; + } + + /** + * @return Returns the wsdlPortName. + */ + public QName getPortName() { + return wsdlPortName; + } + + /** + * Returns the endpoint of a given port. + * + * @param wsdlPort + * @return + */ + public String getEndpoint() { + + // Return the specified endpoint + if (endpoint != null) + return endpoint; + + // Find the target endpoint on the port + if (wsdlPort != null) { + final List wsdlPortExtensions = wsdlPort.getExtensibilityElements(); + for (Iterator i = wsdlPortExtensions.iterator(); i.hasNext();) { + final Object extension = i.next(); + if (extension instanceof SOAPAddress) { + final SOAPAddress address = (SOAPAddress) extension; + return address.getLocationURI(); + } + } + } + + return null; + } + + /** + * Returns the SOAP binding style. + * @return + */ + public String getStyle() { + + // Find the binding style + String style = null; + if (wsdlBinding != null) { + final List wsdlBindingExtensions = wsdlBinding.getExtensibilityElements(); + SOAPBinding soapBinding = (SOAPBinding) getExtensibilityElement(wsdlBindingExtensions, SOAPBinding.class); + if (soapBinding != null) + style = soapBinding.getStyle(); + } + + // Default to document + return (style == null) ? "document" : style; + } + + /** + * Returns the use attribute + * @return + */ + public String getUse() { + List list = getAllOperationMetaData(); + WebServiceOperationMetaData operationMetaData = (WebServiceOperationMetaData) list.get(0); + return operationMetaData.getUse(); + } + + /** + * Returns the encoding attribute + * @return + */ + public String getEncoding() { + List list = getAllOperationMetaData(); + WebServiceOperationMetaData operationMetaData = (WebServiceOperationMetaData) list.get(0); + return operationMetaData.getEncoding(); + } + + /** + * @return Returns true if this is a managed web service. + */ + public boolean isManaged() { + return managed; + } + + /** + * Returns the first extensibility element of the given type. + * @param elements + * @param type + * @return + */ + public static Object getExtensibilityElement(List elements, Class type) { + for (Iterator i = elements.iterator(); i.hasNext();) { + Object element = i.next(); + if (type.isInstance(element)) + return element; + } + return null; + } + + /** + * Returns the extensibility elements of the given type. + * @param elements + * @param type + * @return + */ + public static List getExtensibilityElements(List elements, Class type) { + List result = new ArrayList(); + for (Iterator i = elements.iterator(); i.hasNext();) { + Object element = i.next(); + if (type.isInstance(element)) + result.add(element); + } + return result; + } + + /** + * Get the operation signature from the SOAP Body + * @param body + * @return A list of QNames + */ + public static List getOperationSignature(javax.xml.soap.SOAPBody body) { + List signature = new ArrayList(); + for (Iterator i = body.getChildElements(); i.hasNext();) { + Object child = i.next(); + if (child instanceof SOAPBodyElement) { + Name name = ((SOAPBodyElement) child).getElementName(); + QName qname = new QName(name.getURI(), name.getLocalName(), name.getPrefix()); + signature.add(qname); + } + } + return signature; + } + + public static List getRPCOperationSignature(javax.xml.soap.SOAPBody body) { + List signature = new ArrayList(); + for (Iterator i = body.getChildElements(); i.hasNext();) { + Object child = i.next(); + if (child instanceof SOAPBodyElement) { + SOAPBodyElement op = ((SOAPBodyElement) child); + for (Iterator j = op.getChildElements(); j.hasNext();) { + Object part = i.next(); + if (part instanceof SOAPElement) { + SOAPElement p = (SOAPElement) part; + signature.add(p.getLocalName()); + } + } + } + } + return signature; + } + + public WebServiceOperationMetaData getOperationMetaData(javax.xml.soap.SOAPBody body) { + List s1 = getOperationSignature(body); + // List rpcParts = getRPCOperationSignature(body); + for (Iterator it = getAllOperationMetaData().iterator(); it.hasNext();) { + WebServiceOperationMetaData descriptor = (WebServiceOperationMetaData) it.next(); + + String style = descriptor.getStyle(); + + if (style.equals("document")) { + List s2 = descriptor.getOperationSignature(); + if (s1.equals(s2)) + return descriptor; + } else { + QName op1 = (QName) s1.get(0); + QName op2 = descriptor.getRPCOperationName(); + if (op1.equals(op2)) { + /* + * // FIXME: [rfeng] We don't support method overloading + * List partNames = getOperationSignature(binding, + * bindingOperation); if (rpcParts.equals(partNames)) + */ + return descriptor; + } + } + } + return null; + } + + public List getAllOperationMetaData() { + if (allOperationMetaData == null) { + allOperationMetaData = new ArrayList(); + for (Iterator it = wsdlBinding.getBindingOperations().iterator(); it.hasNext();) { + final BindingOperation bindingOperation = (BindingOperation) it.next(); + if (bindingOperation.getOperation() != null) + allOperationMetaData.add(new WebServiceOperationMetaData(wsdlBinding, bindingOperation)); + } + } + return allOperationMetaData; + } + + public WebServiceOperationMetaData getOperationMetaData(String operationName) { + for (Iterator it = getAllOperationMetaData().iterator(); it.hasNext();) { + WebServiceOperationMetaData descriptor = (WebServiceOperationMetaData) it.next(); + String opName = descriptor.getBindingOperation().getOperation().getName(); + + if (opName.equals(operationName)) + return descriptor; + } + return null; + } + + /** + * Returns the WSDL service contract + * @return + */ + public WSDLServiceContract getInterfaceType() { + return interfaceType; + } + +}
\ No newline at end of file |