<%
/*******************************************************************************
 * Copyright (c) 2001, 2007 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 Corporation - initial API and implementation
 * 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
 * 20070507   185600 makandre@ca.ibm.com - Andrew Mak, WSE status pane's "header" twistie should not appear for responses without headers
 *******************************************************************************/
%>
<%@ page contentType="text/html; charset=UTF-8" import="org.eclipse.wst.ws.internal.explorer.platform.wsdl.perspective.*,
                                                        org.eclipse.wst.ws.internal.explorer.platform.wsdl.datamodel.*,
                                                        org.eclipse.wst.ws.internal.explorer.platform.wsdl.constants.*,
                                                        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.*,
                                                        javax.xml.parsers.*,
                                                        java.util.*" %>

<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"/>
<%
WSDLPerspective wsdlPerspective = controller.getWSDLPerspective();
wsdlPerspective.setStatusContentType(WSDLPerspective.STATUS_CONTENT_RESULT_FORM);
Node operNode = wsdlPerspective.getOperationNode();
nodeID.delete(0, nodeID.length());
nodeID.append(operNode.getNodeId());
WSDLOperationElement operElement = (WSDLOperationElement)operNode.getTreeElement();
Operation oper = operElement.getOperation();
if (oper.getOutput() == null)
{
%>
  <table width="95%" border=0 cellpadding=6 cellspacing=0>
    <tr>
      <td height=20 valign="bottom" align="left" class="labels">
        <%=wsdlPerspective.getMessage("FORM_LABEL_NOTHING_TO_DISPLAY_IN_FORM_VIEW")%>
      </td>
    </tr>
  </table>
<%
}
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();

  if (soapMessage.getBody(false) == null) // body is mandatory
  {
  %>
    <table width="95%" border=0 cellpadding=6 cellspacing=0>
      <tr>
        <td height=20 valign="bottom" align="left" class="labels">
          <%=wsdlPerspective.getMessage("FORM_LABEL_SOAP_RESPONSE_FAILED_VALIDATION_IN_FORM_VIEW")%>
        </td>
      </tr>
    </table>
  <%
  }
  else
  {
	if (headerContent != null && headerContent.length > 0) {		

		String headerDivId = "Header";
		String headerImgId = "xHeader";		
	    %>
	    <table border=0 cellpadding=6 cellspacing=0>
		  <tr>
		    <td height=20 valign="bottom" align="left" nowrap width=11><a href="javascript:twist('<%=headerDivId%>','<%=headerImgId%>')"><img name="<%=headerImgId%>" src="<%=response.encodeURL(controller.getPathWithContext("images/twistopened.gif"))%>" alt="<%=controller.getMessage("ALT_TWIST_OPENED")%>" class="twist"></a></td>
		    <td height=20 valign="bottom" align="left" nowrap class="labels"><strong><%=wsdlPerspective.getMessage("FORM_LABEL_HEADER")%></strong></td>
		  </tr>
		</table>
		
		<table width="95%" border=0 cellpadding=0 cellspacing=0>
		  <tr>
		    <td valign="top" height=10><img src="<%=response.encodeURL(controller.getPathWithContext("images/keyline.gif"))%>" height=2 width="100%"></td>
		  </tr>
		</table>
		
		<div id="<%=headerDivId%>" class="fragarea">
		<%
		boolean hasSOAPHeaders = false;		
		Iterator it = operElement.getSOAPHeaders(false).iterator();
		int start = 0;
		while (it.hasNext() && start < headerContent.length) {
			SOAPHeader soapHeader = (SOAPHeader) it.next();									
			IXSDFragment fragment = operElement.getHeaderFragment(soapHeader, false);
			
			if (!cached) {				
				int pos = SOAPMessageUtils.findFirstMatchingElement(
					soapHeader.getEPart(),
					headerContent,
					soapMessage.getNamespaceTable(),
					fragment.getName(),
					start);
				
				if (pos == -1)
					continue;
				
				Element element = headerContent[pos];
				start = pos + 1;
				
				if (!fragment.setParameterValuesFromInstanceDocuments(new Element[] { element }))
					continue;
			}
			else if (!fragment.validateAllParameterValues())
				continue;
			
			hasSOAPHeaders = true;				
			fragID.delete(0, fragID.length());
			fragID.append(fragment.getID());
			%>
			<jsp:include page="<%=fragment.getReadFragment()%>" flush="true"/>
			<%  
		}		
		if (!hasSOAPHeaders) {
			%>
			<table width="95%" border=0 cellpadding=6 cellspacing=0>
		      <tr>
		        <td height=20 valign="bottom" align="left" class="labels">
		          <%=wsdlPerspective.getMessage("FORM_LABEL_CANNOT_DISPLAY_HEADER_IN_FORM_VIEW")%>
		        </td>
		      </tr>
		    </table>
			<%
		}
		%>
		</div>
		<%   
	}
		
	String bodyDivId = "Body";
	String bodyImgId = "xBody";	  		
	%>			
	<table border=0 cellpadding=6 cellspacing=0>
	  <tr>
	    <td height=20 valign="bottom" align="left" nowrap width=11><a href="javascript:twist('<%=bodyDivId%>','<%=bodyImgId%>')"><img name="<%=bodyImgId%>" src="<%=response.encodeURL(controller.getPathWithContext("images/twistopened.gif"))%>" alt="<%=controller.getMessage("ALT_TWIST_OPENED")%>" class="twist"></a></td>
	    <td height=20 valign="bottom" align="left" nowrap class="labels"><strong><%=wsdlPerspective.getMessage("FORM_LABEL_BODY")%></strong></td>
	  </tr>
	</table> 
	
	<table width="95%" border=0 cellpadding=0 cellspacing=0>
	  <tr>
	    <td valign="top" height=10><img src="<%=response.encodeURL(controller.getPathWithContext("images/keyline.gif"))%>" height=2 width="100%"></td>
	  </tr>
	</table>
	
	<div id="<%=bodyDivId%>" class="fragarea">
	<%	
	boolean hasSOAPBody = false;
	if (bodyContent != null && bodyContent.length > 0) {				
		
	    Map partsMap = oper.getOutput().getMessage().getParts();
	    Iterator it = partsMap.values().iterator();
	    Hashtable uriReferences = null;
	    while (it.hasNext())
	    {
	      IXSDFragment fragment = operElement.getFragment((Part)it.next(), false);
	      if (!cached)
	      {
	        if (!operElement.isUseLiteral() && (fragment instanceof ISOAPEncodingWrapperFragment))
	        {
	          if (uriReferences == null)
	            uriReferences = SOAPEncodingWrapperFragment.parseURIReferences(soapMessage.getEnvelope(true), true);
	          ((ISOAPEncodingWrapperFragment)fragment).setURIReferences(uriReferences);
	        }
	        if (!fragment.setParameterValuesFromInstanceDocuments(bodyContent))
	        	continue;
	      }
	      else if (!fragment.validateAllParameterValues())
			continue;
			
		  hasSOAPBody = true;				
	      fragID.delete(0, fragID.length());
	      fragID.append(fragment.getID());
	      %>
	      <jsp:include page="<%=fragment.getReadFragment()%>" flush="true"/>
	      <%
	    }
	    operElement.setPropertyAsObject(WSDLActionInputs.SOAP_RESPONSE_CACHED, new Boolean(true));
	}
	
	if (soapMessage.getFault() == null && (bodyContent == null || bodyContent.length == 0)) {
		%>
		<table width="95%" border=0 cellpadding=6 cellspacing=0>
	      <tr>
	        <td height=20 valign="bottom" align="left" class="labels">
	          <%=wsdlPerspective.getMessage("FORM_LABEL_BODY_IS_EMPTY")%>
	        </td>
	      </tr>
	    </table>
		<%
    }
	else if (!hasSOAPBody) {
		%>
		<table width="95%" border=0 cellpadding=6 cellspacing=0>
	      <tr>
	        <td height=20 valign="bottom" align="left" class="labels">
	          <%=wsdlPerspective.getMessage("FORM_LABEL_CANNOT_DISPLAY_BODY_IN_FORM_VIEW")%>
	        </td>
	      </tr>
	    </table>
		<%
	} 
    %>
    </div>
    <%
  }
}
%>
