diff options
Diffstat (limited to 'bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/OperationSignature.java')
-rw-r--r-- | bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/OperationSignature.java | 788 |
1 files changed, 0 insertions, 788 deletions
diff --git a/bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/OperationSignature.java b/bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/OperationSignature.java deleted file mode 100644 index 639a3f209..000000000 --- a/bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/OperationSignature.java +++ /dev/null @@ -1,788 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2002-2005 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM - Initial API and implementation - *******************************************************************************/ -package org.eclipse.wst.wsi.internal.core.util; - -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -import javax.wsdl.Binding; -import javax.wsdl.BindingFault; -import javax.wsdl.BindingInput; -import javax.wsdl.BindingOperation; -import javax.wsdl.BindingOutput; -import javax.wsdl.Definition; -import javax.wsdl.Fault; -import javax.wsdl.Import; -import javax.wsdl.Input; -import javax.wsdl.Message; -import javax.wsdl.Operation; -import javax.wsdl.Output; -import javax.wsdl.Part; -import javax.wsdl.Port; -import javax.wsdl.PortType; -import javax.wsdl.Service; -import javax.wsdl.Types; -import javax.wsdl.extensions.ExtensibilityElement; -import javax.wsdl.extensions.soap.SOAPBinding; -import javax.wsdl.extensions.soap.SOAPBody; -import javax.wsdl.extensions.soap.SOAPFault; -import javax.wsdl.extensions.soap.SOAPHeader; -import javax.wsdl.extensions.soap.SOAPHeaderFault; -import javax.wsdl.extensions.soap.SOAPOperation; -import javax.xml.namespace.QName; - -import org.eclipse.wst.wsi.internal.core.WSIConstants; -import org.eclipse.wst.wsi.internal.core.WSITag; -import org.eclipse.wst.wsi.internal.core.wsdl.traversal.WSDLTraversal; -import org.eclipse.wst.wsi.internal.core.wsdl.traversal.WSDLTraversalContext; -import org.eclipse.wst.wsi.internal.core.wsdl.traversal.WSDLVisitor; -import org.eclipse.wst.wsi.internal.core.xml.XMLUtils; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; - -/** - * The class implements mechanism for creating unique signature of operation. - * - * @author Kulik - */ -public final class OperationSignature -{ - // the flag indicates whether the messages is represented as document style - // vice versa is not generally true - private boolean isDocumentStyle = false; - private boolean isCreated = false; - private boolean isFault = false; - - protected List signature = new LinkedList(); - private Element firstBody = null; - - /** - * Class operates as container for matched operation. - * @author Kulik - */ - public final static class OperationMatch - { - final private String style; - final private BindingOperation operation; - final private List signature; - - /** - * Constructor. - * @param style operation style. - * @param signature a signature. - * @param operation a binding operation. - */ - protected OperationMatch( - String style, - List signature, - BindingOperation operation) - { - this.style = style; - this.signature = signature; - this.operation = operation; - } - /** - * Gets operation style. - * @return operation style. - */ - public String getOperationStyle() - { - return style; - } - /** - * Gets WSDL binding operation object. - * @return WSDL binding operation object. - */ - public BindingOperation getOperation() - { - return operation; - } - - /** - * Gets operation signature as list. - * @return operation signature as list. - */ - public List getSignature() - { - return signature; - } - } - - /** - * The class searches BindingOperation by the given OperationSigbnature. - * @author Kulik - */ - public final class Visitor implements WSDLVisitor - { - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(javax.wsdl.Part, java.lang.Object, org.wsi.wsdl.traversal.WSDLTraversalContext) - */ - public void visit(Part obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(javax.wsdl.Service, java.lang.Object, org.wsi.wsdl.traversal.WSDLTraversalContext) - */ - public void visit(Service obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(javax.wsdl.Types, java.lang.Object, org.wsi.wsdl.traversal.WSDLTraversalContext) - */ - public void visit(Types obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(javax.wsdl.Operation, java.lang.Object, org.wsi.wsdl.traversal.WSDLTraversalContext) - */ - public void visit(Operation obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(javax.wsdl.Input, java.lang.Object, org.wsi.wsdl.traversal.WSDLTraversalContext) - */ - public void visit(Input obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(javax.wsdl.Output, java.lang.Object, org.wsi.wsdl.traversal.WSDLTraversalContext) - */ - public void visit(Output obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(javax.wsdl.Fault, java.lang.Object, org.wsi.wsdl.traversal.WSDLTraversalContext) - */ - public void visit(Fault obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(javax.wsdl.Binding, java.lang.Object, org.wsi.wsdl.traversal.WSDLTraversalContext) - */ - public void visit(Binding obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(javax.wsdl.BindingOperation, java.lang.Object, org.wsi.wsdl.traversal.WSDLTraversalContext) - */ - public void visit( - BindingOperation obj, - Object parent, - WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(javax.wsdl.BindingInput, java.lang.Object, org.wsi.wsdl.traversal.WSDLTraversalContext) - */ - public void visit( - BindingInput obj, - Object parent, - WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(javax.wsdl.BindingOutput, java.lang.Object, org.wsi.wsdl.traversal.WSDLTraversalContext) - */ - public void visit( - BindingOutput obj, - Object parent, - WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(BindingFault, Object, WSDLTraversalContext) - */ - public void visit( - BindingFault obj, - Object parent, - WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(Import, Object, WSDLTraversalContext) - */ - public void visit(Import obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(Element, Object, WSDLTraversalContext) - */ - public void visit(Element obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(Message, Object, WSDLTraversalContext) - */ - public void visit(Message obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(Port, Object, WSDLTraversalContext) - */ - public void visit(Port obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(PortType, Object, WSDLTraversalContext) - */ - public void visit(PortType obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(Definition, Object, WSDLTraversalContext) - */ - public void visit(Definition obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(ExtensibilityElement, Object, WSDLTraversalContext) - */ - public void visit( - ExtensibilityElement obj, - Object parent, - WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(SOAPHeader, Object, WSDLTraversalContext) - */ - public void visit(SOAPHeader obj, Object parent, WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(SOAPHeaderFault, Object, WSDLTraversalContext) - */ - public void visit( - SOAPHeaderFault obj, - Object parent, - WSDLTraversalContext ctx) - { - } - - /* (non-Javadoc) - * @see org.wsi.wsdl.traversal.WSDLVisitor#visit(SOAPFault, Object, WSDLTraversalContext) - */ - public void visit(SOAPFault obj, Object parent, WSDLTraversalContext ctx) - { - } - - private String requiredStyle = null; - private String soapAction = null; - private BindingOperation operation = null; - private TypesRegistry registry = null; - private boolean isSOAPActionRequired = false; - - /** - * Constructor. - */ - public Visitor() - { - super(); - // TODO Auto-generated constructor stub - } - - /** - * Constructor. - * @param requiredStyle required style. - * @param registry types registry. - */ - public Visitor(String requiredStyle, TypesRegistry registry) - { - this.requiredStyle = requiredStyle; - this.registry = registry; - } - - /** - * The method returns matched binding operation. - * @return BindingOperation - */ - public BindingOperation getMatchedOperation() - { - return operation; - } - - /** - * The method sets up required operation to be found. - * The possible values is rpc and document. - * @param requiredStyle operation style. - */ - public void setRequiredStyle(String requiredStyle) - { - this.requiredStyle = requiredStyle; - } - - /** - * The method indicates whether SOAP Action be included into operation. - * signature. - * @return true if SOAP Action isd required. - */ - public boolean isSOAPActionRequired() - { - return isSOAPActionRequired; - } - - /** - * Sets SOAP action to be included into signature. - */ - public void setSOAPActionRequired() - { - isSOAPActionRequired = true; - } - - /** - * internal method. - */ - public void visit( - SOAPBinding binding, - Object parent, - WSDLTraversalContext ctx) - { - String style = - (binding.getStyle() == null) - ? WSIConstants.ATTRVAL_SOAP_BIND_STYLE_DOC - : binding.getStyle(); - ctx.addParameter("style", style); - } - - /** - * internal method. - */ - public void visit( - SOAPOperation operation, - Object parent, - WSDLTraversalContext ctx) - { - soapAction = null; - String style = operation.getStyle(); - if (style == null) - style = (String) ctx.getParameter("style"); - if (!requiredStyle.equals(style)) - ctx.cancelBindingOperationProcessing(); - else - //if (isSOAPActionRequired) - soapAction = operation.getSoapActionURI(); - } - - /** - * internal method. - */ - public void visit(SOAPBody body, Object parent, WSDLTraversalContext ctx) - { - // assert parent instanceof BindingInput - BindingOperation bop = ctx.getBindingOperation(); - if (bop.getOperation() == null - || bop.getOperation().getInput() == null - || bop.getOperation().getInput().getMessage() == null) - return; - - Message msg = bop.getOperation().getInput().getMessage(); - List parts = - WSDLUtil.getParts(bop.getOperation(), msg, body, requiredStyle); - - QName additionalName = null; - // if operation is rpc, add to parts qname qith function name - if (WSIConstants.ATTRVAL_SOAP_BIND_STYLE_RPC.equals(requiredStyle)) - { - // found out target namespace - String namespace = body.getNamespaceURI(); - if (namespace == null || namespace.length() == 0) - // !! ATTENTION - // namespace should be retrieved from service target nameapce - namespace = ctx.getBinding().getQName().getNamespaceURI(); - - // insert operation name as first signature part - additionalName = - new QName(namespace, ctx.getBindingOperation().getName()); - } - - OperationSignature op = - new OperationSignature(parts, null, registry, false); - - if (additionalName != null) - op.getSignature().add(0, additionalName); - //if (isSOAPActionRequired) - //if (soapAction != null) - if (isSOAPActionRequired && soapAction != null) - op.getSignature().add(0, soapAction); - if (op.getSignature().equals(signature)) - { - // required operation is found - operation = ctx.getBindingOperation(); - ctx.cancelBindingOperationProcessing(); - ctx.cancelBindingProcessing(); - } - - else - { - op = new OperationSignature(parts, null, registry, true); - if (additionalName != null) - op.getSignature().add(0, additionalName); - - //if (isSOAPActionRequired) - //if (soapAction != null) - if (isSOAPActionRequired && soapAction != null) - op.getSignature().add(0, soapAction); - - if (op.getSignature().equals(signature)) - { - // required operation is found - operation = ctx.getBindingOperation(); - ctx.cancelBindingOperationProcessing(); - ctx.cancelBindingProcessing(); - } - } - } - } - - /** - * The constructor creates OperationSignature for SOAP message. - * @param doc a Document object. - */ - public OperationSignature(Document doc) - { - Element body = - XMLUtils.findChildElement( - doc.getDocumentElement(), - WSITag.ELEM_SOAP_BODY); - processParts(body, false); - isDocumentStyle |= (signature.size() > 1); - } - - /** - * The constructor creates OperationSIgnature for - * list of <code>Part</code> objects and given WSDL document within these - * parts are defined. - * - * @param parts a list of Part objects. - * @param wsdlDocument a WSDL document. - * @param registry a types registry. - * @param partial a partial status. - */ - public OperationSignature( - List parts, - Document wsdlDocument, - TypesRegistry registry, - boolean partial) - { - if (parts != null) - { - Iterator it = parts.iterator(); - - while (it.hasNext()) - { - Part part = (Part) it.next(); - String localName = (partial) ? part.getName() : null; - QName typeName = part.getTypeName(); - QName elementName = part.getElementName(); - - String namespace = ""; - - // If type name is not null, then a type element was used so it should be an RPC style signature - if (typeName != null) - { - // Part wrappers do not have namespaces - namespace = ""; - - if (localName == null) - localName = typeName.getLocalPart(); - } - - // If element name is not null, then it should be a document style signature - else if (elementName != null) - { - namespace = elementName.getNamespaceURI(); - - if (localName == null) - localName = elementName.getLocalPart(); - } - - signature.add(new QName(namespace, localName)); - } - } - - isCreated = true; - } - - /** - * The method recreates OperationSignature with assumption that operation is - * RPC. - */ - public void createRPCSignature() - { - isCreated = false; - if (firstBody == null) - return; - processParts(firstBody, true); - isDocumentStyle = false; - } - - /** - * Internal method processes WSDL parts and creates operation signature. - * @param parent - */ - private void processParts(Node parent, boolean processWrapper) - { - if (parent != null) - { - Node n = parent.getFirstChild(); - - // variable indicates that first tag is processed - boolean isFirst = true; - // iterate all bodies - while (n != null) - { - if (Node.ELEMENT_NODE == n.getNodeType()) - { - if (isFirst && firstBody == null) - { - isFirst = false; - firstBody = (Element) n; - // check soapenv:fault - if (XMLUtils.equals(n, WSITag.ELEM_SOAP_FAULT)) - { - isFault = true; - isCreated = false; - return; - } - } - - String namespace = n.getNamespaceURI(); - String localName = n.getLocalName(); - - /*I have no idea why this code is in here since it makes no sense at all, so I am commenting it out - // try to get xsi:tag - if (XMLUtils.getAttribute((Element) n, WSITag.ATTR_XSI_TYPE) != null) { - // we suppose that RPC style does not use xsi:type attribute - isDocumentStyle = true; - Attr xsiType = XMLUtils.getAttribute((Element) n, WSITag.ATTR_XSI_TYPE); - - String xsiValue = xsiType.getNodeValue(); - int i = xsiValue.indexOf(':'); - if (i != -1) - { - namespace = XMLUtils.findNamespaceURI(n, xsiValue.substring(0, i)); - localName = xsiValue.substring(i+1); - } - } - */ - - // If this is rpc-literal and processing a part (not the wrapper), then the part should not have a namespace - // And if it does, then one of the test assertions will detect it - if (!isDocumentStyle && processWrapper) - { - namespace = ""; - } - - if (namespace == null || namespace.length() == 0) - { - if (isDocumentStyle) - { - //Element firstChild = null; - Node it = n.getFirstChild(); - while (it != null && !(it instanceof Element)) - it = it.getNextSibling(); - if (it != null) - namespace = it.getNamespaceURI(); - } - } - - // normalize namespaces. All empty namespaces -> null - if (namespace != null && namespace.length() == 0) - namespace = null; - - // put part into signature - signature.add(new QName(namespace, localName)); - } - - n = n.getNextSibling(); - } - } - else - { - isCreated = false; // not found ? - return; - } - - isCreated = true; - } - - /** - * Indicates whether operation has document style or RPC. - * @return true if operation has document style. - */ - public boolean isDocumentStyle() - { - return isDocumentStyle; - } - - /** - * Indicates whether WSDL fault parts should be included into signature or - * not. - * @return true if WSDL fault parts should be included into signature. - */ - public boolean isFault() - { - return isFault; - } - - /** - * Indicates that operation signature was created. - * @return true if operation signature was created. - */ - public boolean isCreated() - { - return isCreated; - } - - /** - * Gets operation signature created for SOAP message. - * @return operation signature created for SOAP message. - */ - public List getSignature() - { - return signature; - } - - /** - * @see java.lang.Object#hashCode() - */ - public int hashCode() - { - return signature.hashCode(); - } - - /** - * @see java.lang.Object#equals(Object) - */ - public boolean equals(Object o) - { - if (o instanceof OperationSignature) - return signature.equals(((OperationSignature) o).getSignature()); - return false; - } - - /** - * The method matches operation based on the given SOAP message request, - * WSDL binding, and soapAction. - * - * @param inputMessage an SOAP message request. - * @param soapAction a soap action. - * @param binding a WSDL binding. - * @param registry a types registry. - * @return OperationMatch object. - */ - public static OperationMatch matchOperation( - Document inputMessage, - String soapAction, - Binding binding, - TypesRegistry registry) - { - return matchOperation(inputMessage, soapAction, binding, registry, true); - } - - /** - * The method matches operation based on the given SOAP message request, - * WSDL binding, and soapAction. - * - * @param inputMessage SOAP message request. - * @param soapAction a soap action. - * @param binding a WSDL binding. - * @param registry a types registry. - * @param soapActionRequired must process the soapAction value even if it is null - * @return OperationMatch object. - */ - public static OperationMatch matchOperation( - Document inputMessage, - String soapAction, - Binding binding, - TypesRegistry registry, - boolean soapActionRequired) - { - // Parse request message - OperationSignature signature = new OperationSignature(inputMessage); - if (!signature.isCreated()) - return null; - - // first of all looking for document style - // because rpc style is subset of document style - OperationSignature.Visitor resolver = - signature.new Visitor(WSIConstants.ATTRVAL_SOAP_BIND_STYLE_DOC, registry); - - // normalize SOAPAction - if (soapAction != null - && soapAction.length() > 1 - && soapAction.charAt(0) == '"' - && soapAction.charAt(soapAction.length() - 1) == '"') - soapAction = soapAction.substring(1, soapAction.length() - 1); - - // if soap action URI processing required - // if soap action URI processing required - // analyze SOAPAction after parts being processed - // put SOAPAction into signature - //if (soapAction != null && soapAction.length() > 0) { - if (soapAction != null) - { - signature.getSignature().add(0, soapAction); - } - - if (soapActionRequired) - resolver.setSOAPActionRequired(); - - WSDLTraversal traversal = new WSDLTraversal(); - //VisitorAdaptor.adapt(resolver); - traversal.setVisitor(resolver); - traversal.visitSOAPBinding(true); - traversal.visitSOAPBody(true); - traversal.visitSOAPOperation(true); - - traversal.ignoreReferences(); - traversal.ignoreBindingOutput(); - traversal.traverse(binding); - - BindingOperation operation = resolver.getMatchedOperation(); - if (operation == null && !signature.isDocumentStyle()) - { - resolver.setRequiredStyle(WSIConstants.ATTRVAL_SOAP_BIND_STYLE_RPC); - signature.createRPCSignature(); - traversal.traverse(binding); - operation = resolver.getMatchedOperation(); - if (operation == null) - return null; - } - - return new OperationMatch( - resolver.requiredStyle, - signature.getSignature(), - resolver.getMatchedOperation()); - } -} |