diff options
author | cbrealey | 2007-05-09 21:11:47 +0000 |
---|---|---|
committer | cbrealey | 2007-05-09 21:11:47 +0000 |
commit | 864f03255b5da93cb091e73b003af62ac5513767 (patch) | |
tree | f61da3f17d91576284268a5f14912c3d28b4c5b5 /bundles/org.eclipse.wst.ws.explorer/wsexplorer/wsdl/forms/ReadOnlyFragmentsFormView.jsp | |
parent | b8e927f451358d9913d742ead4c74e0c78974a64 (diff) | |
download | webtools.webservices-864f03255b5da93cb091e73b003af62ac5513767.tar.gz webtools.webservices-864f03255b5da93cb091e73b003af62ac5513767.tar.xz webtools.webservices-864f03255b5da93cb091e73b003af62ac5513767.zip |
[176493] WSE: Make message/transport stack pluggable
Diffstat (limited to 'bundles/org.eclipse.wst.ws.explorer/wsexplorer/wsdl/forms/ReadOnlyFragmentsFormView.jsp')
-rw-r--r-- | bundles/org.eclipse.wst.ws.explorer/wsexplorer/wsdl/forms/ReadOnlyFragmentsFormView.jsp | 202 |
1 files changed, 45 insertions, 157 deletions
diff --git a/bundles/org.eclipse.wst.ws.explorer/wsexplorer/wsdl/forms/ReadOnlyFragmentsFormView.jsp b/bundles/org.eclipse.wst.ws.explorer/wsexplorer/wsdl/forms/ReadOnlyFragmentsFormView.jsp index 88a31d086..4be200bab 100644 --- a/bundles/org.eclipse.wst.ws.explorer/wsexplorer/wsdl/forms/ReadOnlyFragmentsFormView.jsp +++ b/bundles/org.eclipse.wst.ws.explorer/wsexplorer/wsdl/forms/ReadOnlyFragmentsFormView.jsp @@ -11,6 +11,7 @@ * yyyymmdd bug Email and other contact information * -------- -------- ----------------------------------------------------------- * 20070305 117034 makandre@ca.ibm.com - Andrew Mak, Web Services Explorer should support SOAP Headers + * 20070413 176493 makandre@ca.ibm.com - Andrew Mak, WSE: Make message/transport stack pluggable *******************************************************************************/ %> <%@ page contentType="text/html; charset=UTF-8" import="org.eclipse.wst.ws.internal.explorer.platform.wsdl.perspective.*, @@ -19,10 +20,12 @@ org.eclipse.wst.ws.internal.explorer.platform.wsdl.xsd.*, org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment.*, org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment.impl.*, + org.eclipse.wst.ws.internal.explorer.platform.wsdl.util.*, org.eclipse.wst.ws.internal.explorer.platform.constants.*, org.eclipse.wst.ws.internal.explorer.platform.perspective.Node, org.eclipse.wst.ws.internal.explorer.platform.perspective.*, org.eclipse.wst.ws.internal.explorer.platform.util.*, + org.eclipse.wst.ws.internal.explorer.transport.*, org.eclipse.wst.wsdl.binding.soap.SOAPHeader, org.w3c.dom.*, javax.wsdl.*, @@ -32,136 +35,6 @@ <jsp:useBean id="controller" class="org.eclipse.wst.ws.internal.explorer.platform.perspective.Controller" scope="session"/> <jsp:useBean id="fragID" class="java.lang.StringBuffer" scope="request"/> <jsp:useBean id="nodeID" class="java.lang.StringBuffer" scope="request"/> - -<%! -private Element soapResponse_ = null; -private boolean hasSOAPHeaders = false; - -private void checkSOAPHeaders() { - - NodeList nl = soapResponse_.getElementsByTagNameNS(FragmentConstants.URI_SOAP_ENV, FragmentConstants.QNAME_LOCAL_NAME_HEADER); - if (nl.getLength() == 0) - return; - - Element soapHeader = (Element) nl.item(0); - NodeList nodes = soapHeader.getChildNodes(); - - for (int i = 0; i < nodes.getLength(); i++) { - if (nodes.item(i) instanceof Element) { - hasSOAPHeaders = true; - return; - } - } -} - -private Element[] parseSOAPResponse(SOAPMessageQueue soapMessageQueue, WSDLOperationElement operElement) -{ - String messages = soapMessageQueue.getMessagesFromList(); - try - { - soapResponse_ = XMLUtils.stringToElement(messages, true); - checkSOAPHeaders(); - NodeList nl = soapResponse_.getElementsByTagNameNS(FragmentConstants.URI_SOAP_ENV, FragmentConstants.QNAME_LOCAL_NAME_BODY); - if (nl.getLength() > 0) - { - Element soapBody = (Element)nl.item(0); - NodeList soapFault = soapBody.getElementsByTagNameNS(FragmentConstants.URI_SOAP_ENV, FragmentConstants.QNAME_LOCAL_NAME_FAULT); - if (soapFault.getLength() > 0) - return new Element[0]; - NodeList instanceList; - if (operElement.isDocumentStyle()) - instanceList = soapBody.getChildNodes(); - else - { - NodeList rpcWrapper = soapBody.getElementsByTagNameNS("*", operElement.getOperation().getOutput().getMessage().getQName().getLocalPart()); - - /* - * HACK - Some of the web services out on the internet do not - * set their RPC wrapper properly. It should be set to the output - * message name of the selected operation. The hack is to - * assume the first element inside the body element is the - * RPC wrapper. - */ - if (rpcWrapper.getLength() <= 0) - rpcWrapper = soapBody.getElementsByTagNameNS("*", "*"); - - if (rpcWrapper.getLength() > 0) - instanceList = rpcWrapper.item(0).getChildNodes(); - else - return null; - } - return fixSOAPResponse(instanceList, operElement); - } - } - catch (Throwable t) { - t.printStackTrace(); - } - return null; -} - -/* -* HACK - The root element tag name of the instance document -* is ambiguous. It lands on a very grey area between the SOAP -* spec and the WSDL spec. The two specs do not explicitly define -* that the root element tag name must match the name of the -* WSDL part. The hack is to treat elements with different tag names -* as instances of the WSDL part. -*/ -private Element[] fixSOAPResponse(NodeList instanceList, WSDLOperationElement operElement) -{ - Vector instanceVector = new Vector(); - for (int i = 0; i < instanceList.getLength(); i++) - { - Object object = instanceList.item(i); - if (object != null && (object instanceof Element)) - instanceVector.add(object); - } - Element[] instanceDocuments = new Element[instanceVector.size()]; - Operation oper = operElement.getOperation(); - Map partsMap = oper.getOutput().getMessage().getParts(); - if (partsMap.size() == 1) - { - Iterator it = partsMap.values().iterator(); - IXSDFragment frag = operElement.getFragment((Part)it.next(), false); - for (int i = 0; i < instanceVector.size(); i++) - { - Element element = (Element)instanceVector.get(i); - if (!element.getTagName().equals(frag.getName())) - { - Document doc = element.getOwnerDocument(); - NodeList children = element.getChildNodes(); - NamedNodeMap attributes = element.getAttributes(); - element = doc.createElement(frag.getName()); - for (int j = 0; j < children.getLength(); j++) - { - if (children.item(j) != null) - { - element.appendChild(children.item(j)); - // When you append a node from one element to another, - // the original element will lose its reference to this node, - // therefore, the size of the node list will decrease by 1. - j--; - } - } - for (int j = 0; j < attributes.getLength(); j++) - { - Object attr = attributes.item(j); - if (attr != null && (attr instanceof Attr)) - { - Attr attribute = (Attr)attr; - element.setAttribute(attribute.getName(), attribute.getValue()); - } - } - } - instanceDocuments[i] = element; - } - } - else - instanceVector.copyInto(instanceDocuments); - return instanceDocuments; -} -%> - <% WSDLPerspective wsdlPerspective = controller.getWSDLPerspective(); wsdlPerspective.setStatusContentType(WSDLPerspective.STATUS_CONTENT_RESULT_FORM); @@ -184,14 +57,13 @@ if (oper.getOutput() == null) } else { + ISOAPMessage soapMessage = (ISOAPMessage) operElement.getPropertyAsObject(WSDLModelConstants.PROP_SOAP_RESPONSE); + Element[] headerContent = soapMessage.getHeaderContent();; + Element[] bodyContent = soapMessage.getBodyContent(); + boolean cached = ((Boolean)operElement.getPropertyAsObject(WSDLActionInputs.SOAP_RESPONSE_CACHED)).booleanValue(); - Element[] instanceDocuments = null; - if (!cached) - { - SOAPMessageQueue soapMessageQueue = wsdlPerspective.getSOAPResponseQueue(); - instanceDocuments = parseSOAPResponse(soapMessageQueue, operElement); - } - if (!cached && !hasSOAPHeaders && instanceDocuments == null) + + if (soapMessage.getBody(false) == null) // body is mandatory { %> <table width="95%" border=0 cellpadding=6 cellspacing=0> @@ -203,7 +75,8 @@ else </table> <% } - else if (!cached && !hasSOAPHeaders && instanceDocuments.length <= 0) + else if ((headerContent == null || headerContent.length == 0) && + (soapMessage.getFault() != null || bodyContent == null || bodyContent.length == 0)) { %> <table width="95%" border=0 cellpadding=6 cellspacing=0> @@ -237,31 +110,40 @@ else <div id="<%=headerDivId%>" class="fragarea"> <% - if (cached || hasSOAPHeaders) { - hasSOAPHeaders = false; + boolean hasSOAPHeaders = false; + if (headerContent != null && headerContent.length > 0) { + Iterator it = operElement.getSOAPHeaders(false).iterator(); - while (it.hasNext()) { - SOAPHeader soapHeader = (SOAPHeader) it.next(); - String ns = soapHeader.getEPart().getElementDeclaration().getTargetNamespace(); - IXSDFragment frag = operElement.getHeaderFragment(soapHeader, false); + int start = 0; + while (it.hasNext() && start < headerContent.length) { + SOAPHeader soapHeader = (SOAPHeader) it.next(); + IXSDFragment fragment = operElement.getHeaderFragment(soapHeader, false); - if (!cached) { - NodeList nl = soapResponse_.getElementsByTagNameNS(ns, frag.getName()); - if (nl.getLength() == 0) + if (!cached) { + int pos = SOAPMessageUtils.findFirstMatchingElement( + soapHeader.getEPart(), + headerContent, + soapMessage.getNamespaceTable(), + fragment.getName(), + start); + + if (pos == -1) continue; - Element element = (Element) nl.item(0); - if (!frag.setParameterValuesFromInstanceDocuments(new Element[] { element })) + Element element = headerContent[pos]; + start = pos + 1; + + if (!fragment.setParameterValuesFromInstanceDocuments(new Element[] { element })) continue; } - else if (!frag.validateAllParameterValues()) + else if (!fragment.validateAllParameterValues()) continue; hasSOAPHeaders = true; fragID.delete(0, fragID.length()); - fragID.append(frag.getID()); + fragID.append(fragment.getID()); %> - <jsp:include page="<%=frag.getReadFragment()%>" flush="true"/> + <jsp:include page="<%=fragment.getReadFragment()%>" flush="true"/> <% } } @@ -294,8 +176,9 @@ else <div id="<%=bodyDivId%>" class="fragarea"> <% - if (cached || (instanceDocuments != null && instanceDocuments.length > 0)) { - + boolean hasSOAPBody = false; + if (bodyContent != null && bodyContent.length > 0) { + Map partsMap = oper.getOutput().getMessage().getParts(); Iterator it = partsMap.values().iterator(); Hashtable uriReferences = null; @@ -307,11 +190,16 @@ else if (!operElement.isUseLiteral() && (fragment instanceof ISOAPEncodingWrapperFragment)) { if (uriReferences == null) - uriReferences = SOAPEncodingWrapperFragment.parseURIReferences(soapResponse_, true); + uriReferences = SOAPEncodingWrapperFragment.parseURIReferences(soapMessage.getEnvelope(true), true); ((ISOAPEncodingWrapperFragment)fragment).setURIReferences(uriReferences); } - fragment.setParameterValuesFromInstanceDocuments(instanceDocuments); + if (!fragment.setParameterValuesFromInstanceDocuments(bodyContent)) + continue; } + else if (!fragment.validateAllParameterValues()) + continue; + + hasSOAPBody = true; fragID.delete(0, fragID.length()); fragID.append(fragment.getID()); %> @@ -320,7 +208,7 @@ else } operElement.setPropertyAsObject(WSDLActionInputs.SOAP_RESPONSE_CACHED, new Boolean(true)); } - else { + if (!hasSOAPBody) { %> <table width="95%" border=0 cellpadding=6 cellspacing=0> <tr> |