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

Reply via email to