Author: keith
Date: Wed Apr 2 22:33:13 2008
New Revision: 15507
Log:
Adding support for the proposal by Jonathan in Mashup-702
Modified:
trunk/mashup/java/modules/hostobjects/src/org/wso2/mashup/hostobjects/wsrequest/WSRequestHostImpl.java
Modified:
trunk/mashup/java/modules/hostobjects/src/org/wso2/mashup/hostobjects/wsrequest/WSRequestHostImpl.java
==============================================================================
---
trunk/mashup/java/modules/hostobjects/src/org/wso2/mashup/hostobjects/wsrequest/WSRequestHostImpl.java
(original)
+++
trunk/mashup/java/modules/hostobjects/src/org/wso2/mashup/hostobjects/wsrequest/WSRequestHostImpl.java
Wed Apr 2 22:33:13 2008
@@ -35,6 +35,7 @@
import org.apache.axis2.transport.http.HttpTransportProperties;
import org.apache.axis2.transport.http.HttpTransportProperties.Authenticator;
import org.apache.axis2.util.JavaUtils;
+import org.apache.axis2.util.XMLUtils;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.neethi.Policy;
@@ -44,16 +45,30 @@
import org.wso2.javascript.xmlimpl.XML;
import org.wso2.mashup.MashupFault;
import org.wso2.mashup.utils.MashupUtils;
+import org.w3c.dom.Document;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
+import javax.wsdl.xml.WSDLReader;
+import javax.wsdl.factory.WSDLFactory;
+import javax.wsdl.Definition;
+import javax.wsdl.Service;
+import javax.wsdl.Port;
+import javax.wsdl.extensions.soap12.SOAP12Address;
+import javax.wsdl.extensions.soap.SOAPAddress;
+import javax.wsdl.extensions.http.HTTPAddress;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.StringReader;
+import java.io.InputStream;
+import java.io.IOException;
import java.net.URL;
import java.net.MalformedURLException;
+import java.util.Map;
+import java.util.Iterator;
+import java.util.List;
/**
* <p/>
@@ -92,6 +107,8 @@
private boolean wsdlMode = false;
+ private String targetNamespace;
+
/**
* Constructor for the use by Rhino
*/
@@ -338,6 +355,137 @@
options.setProperty(HTTPConstants.COOKIE_POLICY,
CookiePolicy.IGNORE_COOKIES);
wsRequest.sender.setOptions(options);
}
+ setCommonProperties(cx, wsRequest);
+ }
+
+ public static void jsFunction_openWSDL(Context cx, Scriptable thisObj,
Object[] arguments,
+ Function funObj) throws AxisFault {
+ WSRequestHostImpl wsRequest = checkInstance(thisObj);
+ if (wsRequest.readyState > 0 && wsRequest.readyState < 4) {
+ throw new Error("INVALID_STATE_EXCEPTION");
+ } else if (wsRequest.readyState == 4) {
+ // reset private variables if readyState equals 4
+ // readyState equals 4 means this object has been used earlier for
an invocation.
+ wsRequest.reset();
+ }
+
+ String wsdlURL = null;
+ switch (arguments.length) {
+ case 0:
+ throw Context.reportRuntimeError("INVALID_SYNTAX_EXCEPTION");
+ case 1:
+ throw Context.reportRuntimeError("INVALID_SYNTAX_EXCEPTION");
+ case 2:
+ if (arguments[0] instanceof String)
+ wsdlURL = (String) arguments[0];
+ else
+ throw
Context.reportRuntimeError("INVALID_SYNTAX_EXCEPTION");
+ if (arguments[1] instanceof Boolean)
+ wsRequest.async = ((Boolean) arguments[1]).booleanValue();
+ else
+ throw
Context.reportRuntimeError("INVALID_SYNTAX_EXCEPTION");
+ break;
+ }
+
+ try {
+ InputStream in = (new
URL(wsdlURL)).openConnection().getInputStream();
+ Document doc = XMLUtils.newDocument(in);
+ WSDLReader reader =
WSDLFactory.newInstance().newWSDLReader();
+ reader.setFeature("javax.wsdl.importDocuments", true);
+ Definition definition =
reader.readWSDL(getBaseURI(wsdlURL), doc);
+ Map services = definition.getServices();
+ Service service = null;
+ for (Iterator iter = services.values().iterator();
iter.hasNext();) {
+ service = (Service) iter.next();
+ if (service.getPorts().size() > 0) {
+ //i.e we have found a service with ports
+ break;
+ }
+ }
+ if (service == null) {
+ throw Context.reportRuntimeError("The WSDL given does not
contain any services " +
+ "that has ports");
+ }
+ Map ports = service.getPorts();
+ Port port;
+ Port returnPort = null;
+ for (Iterator portsIterator = ports.values().iterator();
portsIterator.hasNext();) {
+ port = (Port) portsIterator.next();
+ List extensibilityElements = port.getExtensibilityElements();
+ for (int i = 0; i < extensibilityElements.size(); i++) {
+ Object extElement = extensibilityElements.get(i);
+ if (extElement instanceof SOAP12Address) {
+ // SOAP 1.2 address found - keep this and loop until
http address is found
+ returnPort = port;
+ String location = ((SOAP12Address)
extElement).getLocationURI().trim();
+ if ((location != null) &&
location.startsWith("http:")) {
+ // i.e we have found an http port so return from
here
+ break;
+ }
+ }
+ }
+ }
+
+ if (returnPort == null) {
+ for (Iterator portsIterator = ports.values().iterator();
portsIterator
+ .hasNext();) {
+ port = (Port) portsIterator.next();
+ List extensibilityElements =
port.getExtensibilityElements();
+ for (int i = 0; i < extensibilityElements.size(); i++) {
+ Object extElement = extensibilityElements.get(i);
+ if (extElement instanceof SOAPAddress) {
+ // SOAP 1.1 address found - keep this and loop
until http address is found
+ returnPort = port;
+ String location = ((SOAPAddress)
extElement).getLocationURI().trim();
+ if ((location != null) &&
location.startsWith("http:")) {
+ // i.e we have found an http port so return
from here
+ break;
+ }
+ }
+ }
+ }
+
+ if (returnPort == null) {
+ for (Iterator portsIterator = ports.values().iterator();
portsIterator
+ .hasNext();) {
+ port = (Port) portsIterator.next();
+ List extensibilityElements =
port.getExtensibilityElements();
+ for (int i = 0; i < extensibilityElements.size(); i++)
{
+ Object extElement = extensibilityElements.get(i);
+ if (extElement instanceof HTTPAddress) {
+ // HTTP address found - keep this and loop
until http address is found
+ returnPort = port;
+ String location =
+ ((HTTPAddress)
extElement).getLocationURI().trim();
+ if ((location != null) &&
location.startsWith("http:")) {
+ // i.e we have found an http port so
return from here
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (returnPort == null) {
+ throw Context.reportRuntimeError("The WSDL given does not
contain any ports " +
+ "that use the http transport");
+ }
+ ConfigurationContext defaultConfigurationContext =
+
ConfigurationContextFactory.createDefaultConfigurationContext();
+ wsRequest.sender =
+ new ServiceClient(defaultConfigurationContext,
definition, service.getQName(),
+ returnPort.getName());
+ wsRequest.targetNamespace = definition.getTargetNamespace();
+ } catch (MalformedURLException e) {
+ throw new MashupFault(e);
+ } catch (Exception e) {
+ throw new MashupFault(e);
+ }
+ setCommonProperties(cx, wsRequest);
+ wsRequest.wsdlMode = true;
+ }
+
+ private static void setCommonProperties(Context cx, WSRequestHostImpl
wsRequest) {
// Axis2 used to support sending of multiple messages with single
// ServiceClient. Now it seems we need to set the following explicitly
// in order to do that.
@@ -355,6 +503,21 @@
}
}
+ private static String getBaseURI(String currentURI) {
+ try {
+ File file = new File(currentURI);
+ if (file.exists()) {
+ return
file.getCanonicalFile().getParentFile().toURI()
+ .toString();
+ }
+ String uriFragment = currentURI.substring(0, currentURI
+ .lastIndexOf("/"));
+ return uriFragment + (uriFragment.endsWith("/") ? "" :
"/");
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
/**
* <p/>
* This method invokes the Web service with the requested payload.
@@ -383,7 +546,13 @@
String uri = (String) qName.get("uri", qName);
String localName = (String) qName.get("localName", qName);
operationName = new QName(uri, localName);
- } else {
+ } else if (arguments[0] instanceof String) {
+ if (wsRequest.targetNamespace == null) {
+ throw new Error("INVALID_STATE_EXCEPTION");
+ }
+ String localName = (String) arguments[0];
+ operationName = new QName(wsRequest.targetNamespace,
localName);
+ }else {
throw new Error("INVALID_STATE_EXCEPTION");
}
payload = arguments[1];
_______________________________________________
Mashup-dev mailing list
[email protected]
http://www.wso2.org/cgi-bin/mailman/listinfo/mashup-dev