You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2012/05/24 19:16:24 UTC

svn commit: r1342347 - in /openejb/trunk/openejb: server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/ tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/

Author: rmannibucau
Date: Thu May 24 17:16:23 2012
New Revision: 1342347

URL: http://svn.apache.org/viewvc?rev=1342347&view=rev
Log:
ability to retreive soap webservices

Added:
    openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Service.java   (contents, props changed)
      - copied, changed from r1342259, openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/RestService.java
    openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Services.java   (contents, props changed)
      - copied, changed from r1342259, openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/RestServices.java
    openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/SoapService.java
Removed:
    openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/RestService.java
    openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/RestServices.java
Modified:
    openejb/trunk/openejb/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
    openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Application.java
    openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/WebServiceHelperImpl.java

Modified: openejb/trunk/openejb/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java?rev=1342347&r1=1342346&r2=1342347&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java (original)
+++ openejb/trunk/openejb/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java Thu May 24 17:16:23 2012
@@ -17,6 +17,7 @@
  */
 package org.apache.openejb.server.webservices;
 
+import javax.xml.namespace.QName;
 import org.apache.openejb.BeanContext;
 import org.apache.openejb.Injection;
 import org.apache.openejb.assembler.classic.AppInfo;
@@ -85,6 +86,7 @@ public abstract class WsService implemen
     private final Map<String,String> ejbLocations = new TreeMap<String,String>();
     private final Map<String,String> ejbAddresses = new TreeMap<String,String>();
     private final Map<String,String> servletAddresses = new TreeMap<String,String>();
+    private final Map<String, List<EndpointInfo>> addressesByApplication = new TreeMap<String, List<EndpointInfo>>();
 
     public WsService() {
         String format = SystemInstance.get().getOptions().get(WS_ADDRESS_FORMAT, "/{ejbDeploymentId}");
@@ -278,6 +280,7 @@ public abstract class WsService implemen
                                     portAddressRegistry.addPort(portInfo.serviceId, portInfo.wsdlService, portInfo.portId, portInfo.wsdlPort, portInfo.seiInterfaceName, address);
                                     logger.info("Webservice(wsdl=" + address + ", qname=" + port.getWsdlService() + ") --> Ejb(id=" + portInfo.portId + ")");
                                     ejbAddresses.put(bean.ejbDeploymentId, address);
+                                    addressesForApp(appInfo.appId).add(new EndpointInfo(address, port.getWsdlService(), beanContext.getBeanClass().getName()));
                                 }
                             }
                         } catch (Throwable e) {
@@ -292,6 +295,14 @@ public abstract class WsService implemen
         }
     }
 
+    private List<EndpointInfo> addressesForApp(String appId) {
+        if (!addressesByApplication.containsKey(appId)) {
+            addressesByApplication.put(appId, new ArrayList<EndpointInfo>());
+        }
+        return addressesByApplication.get(appId);
+    }
+
+
     public void afterApplicationCreated(WebAppInfo webApp) {
         WebContext webContext = containerSystem.getWebContext(webApp.moduleId);
         if (webContext == null) return;
@@ -336,6 +347,7 @@ public abstract class WsService implemen
                     portAddressRegistry.addPort(portInfo.serviceId, portInfo.wsdlService, portInfo.portId, portInfo.wsdlPort, portInfo.seiInterfaceName, address);
                     logger.info("Webservice(wsdl=" + address + ", qname=" + port.getWsdlService() + ") --> Pojo(id=" + portInfo.portId + ")");
                     servletAddresses.put(webApp.moduleId + "." + servlet.servletName, address);
+                    addressesForApp(webApp.moduleId).add(new EndpointInfo(address, port.getWsdlService(), target.getName()));
                 }
             } catch (Throwable e) {
                 logger.error("Error deploying CXF webservice for servlet " + portInfo.serviceLink, e);
@@ -359,6 +371,7 @@ public abstract class WsService implemen
 
                         // remove wsdl addresses from global registry
                         String address = ejbAddresses.remove(enterpriseBean.ejbDeploymentId);
+                        addressesForApp(appInfo.appId).remove(address);
                         if (address != null) {
                             portAddressRegistry.removePort(portInfo.serviceId, portInfo.wsdlService, portInfo.portId);
                         }
@@ -388,6 +401,7 @@ public abstract class WsService implemen
 
                     // remove wsdl addresses from global registry
                     String address = servletAddresses.remove(webApp.moduleId + "." + servlet.servletName);
+                    addressesForApp(webApp.moduleId).remove(address);
                     if (address != null) {
                         portAddressRegistry.removePort(portInfo.serviceId, portInfo.wsdlService, portInfo.portId);
                     }
@@ -444,4 +458,24 @@ public abstract class WsService implemen
     public void service(Socket socket) throws ServiceException, IOException {
         throw new UnsupportedOperationException("CxfService cannot be invoked directly");
     }
+
+    public Map<String, List<EndpointInfo>> getAddressesByApplication() {
+        return addressesByApplication;
+    }
+
+    public static class EndpointInfo {
+        public String address;
+        public String portName;
+        public String classname;
+
+        public EndpointInfo(String address, QName portName, String name) {
+            this.address = address;
+            this.classname = name;
+            if (portName != null) {
+                this.portName = portName.toString();
+            } else {
+                this.portName = "null";
+            }
+        }
+    }
 }

Modified: openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Application.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Application.java?rev=1342347&r1=1342346&r2=1342347&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Application.java (original)
+++ openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Application.java Thu May 24 17:16:23 2012
@@ -5,13 +5,13 @@ import java.util.List;
 
 public class Application {
     private String name;
-    private List<RestService> services = new ArrayList<RestService>();
+    private List<Service> services = new ArrayList<Service>();
 
-    public List<RestService> getServices() {
+    public List<Service> getServices() {
         return services;
     }
 
-    public void setServices(List<RestService> services) {
+    public void setServices(List<Service> services) {
         this.services = services;
     }
 

Copied: openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Service.java (from r1342259, openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/RestService.java)
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Service.java?p2=openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Service.java&p1=openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/RestService.java&r1=1342259&r2=1342347&rev=1342347&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/RestService.java (original)
+++ openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Service.java Thu May 24 17:16:23 2012
@@ -1,15 +1,15 @@
 package org.apache.tomee.webapp.helper.rest;
 
-public class RestService {
+public class Service {
     private String name;
-    private String wadl;
+    private String address;
 
-    public RestService(final String name, final String wadl) {
+    public Service(final String name, final String address) {
         this.name = name;
-        this.wadl = wadl;
+        this.address = address;
     }
 
-    public RestService() {
+    public Service() {
         // no-op
     }
 
@@ -21,11 +21,11 @@ public class RestService {
         this.name = name;
     }
 
-    public String getWadl() {
-        return wadl;
+    public String getAddress() {
+        return address;
     }
 
-    public void setWadl(String wadl) {
-        this.wadl = wadl;
+    public void setAddress(String address) {
+        this.address = address;
     }
 }

Propchange: openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Service.java
------------------------------------------------------------------------------
    svn:executable = *

Copied: openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Services.java (from r1342259, openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/RestServices.java)
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Services.java?p2=openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Services.java&p1=openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/RestServices.java&r1=1342259&r2=1342347&rev=1342347&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/RestServices.java (original)
+++ openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Services.java Thu May 24 17:16:23 2012
@@ -5,7 +5,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 @XmlRootElement
-public class RestServices {
+public class Services {
     private List<Application> applications = new ArrayList<Application>();
 
     public List<Application> getApplications() {
@@ -25,6 +25,7 @@ public class RestServices {
 
         final Application app = new Application();
         app.setName(name);
+        applications.add(app);
         return app;
     }
 }

Propchange: openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/Services.java
------------------------------------------------------------------------------
    svn:executable = *

Added: openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/SoapService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/SoapService.java?rev=1342347&view=auto
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/SoapService.java (added)
+++ openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/SoapService.java Thu May 24 17:16:23 2012
@@ -0,0 +1,22 @@
+package org.apache.tomee.webapp.helper.rest;
+
+public class SoapService extends Service {
+    private String port;
+
+    public SoapService(String name, String address, String port) {
+        super(name, address);
+        this.port = port;
+    }
+
+    public SoapService() {
+        // no-op
+    }
+
+    public String getPort() {
+        return port;
+    }
+
+    public void setPort(String port) {
+        this.port = port;
+    }
+}

Modified: openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/WebServiceHelperImpl.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/WebServiceHelperImpl.java?rev=1342347&r1=1342346&r2=1342347&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/WebServiceHelperImpl.java (original)
+++ openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/helper/rest/WebServiceHelperImpl.java Thu May 24 17:16:23 2012
@@ -1,14 +1,13 @@
 package org.apache.tomee.webapp.helper.rest;
 
+import java.util.List;
+import java.util.Map;
 import org.apache.openejb.server.ServerService;
 import org.apache.openejb.server.ServiceManager;
 import org.apache.openejb.server.SimpleServiceManager;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 
-import java.lang.reflect.Field;
-import java.util.List;
-
 public class WebServiceHelperImpl {
     public static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB_RS, WebServiceHelperImpl.class);
 
@@ -23,49 +22,95 @@ public class WebServiceHelperImpl {
     // we put it here and use reflection.
     // a better solution is to add a kind of spi for our webapps
     // to be able to add for each overlay new graphic part
-    public static RestServices restWebServices() {
-        final RestServices restServices = new RestServices();
+    public static Services restWebServices() {
+        final Services restServices = new Services();
 
+        final ServerService ss = serverService("org.apache.openejb.server.cxf.rs.CxfRSService");
+        if (ss == null) {
+            return restServices;
+        }
+
+        try {
+            final List<Object> services = (List<Object>) ss.getClass().getMethod("getServices").invoke(ss);
+            for (Object rsService : services) {
+                final Accessor accessor = new Accessor(rsService);
+                final String app = (String) accessor.value("webapp");
+                final String address = (String) accessor.value("address");
+                final String origin = (String) accessor.value("origin");
+                restServices.returnOrCreateApplication(app).getServices().add(new Service(origin, address + "?wadl"));
+            }
+        } catch (Exception e) {
+            LOGGER.warning("can't get rest services", e);
+            return restServices;
+        }
+
+        return restServices;
+    }
+
+    public static Services soapWebServices() {
+        final Services soapServices = new Services();
+
+        final ServerService ss = serverService("org.apache.openejb.server.cxf.CxfService");
+        if (ss == null) {
+            return soapServices;
+        }
+
+        try {
+            final Map<String, List<Object>> addressesByApp = (Map) ss.getClass().getMethod("getAddressesByApplication").invoke(ss);
+            for (Map.Entry<String, List<Object>> entry : addressesByApp.entrySet()) {
+                final Application app = soapServices.returnOrCreateApplication(entry.getKey());
+                for (Object soapService : entry.getValue()) {
+                    final Accessor accessor = new Accessor(soapService);
+                    final String wsdl = (String) accessor.value("address");
+                    final String port = (String) accessor.value("portName");
+                    final String classname = (String) accessor.value("classname");
+                    app.getServices().add(new SoapService(classname, wsdl + "?wsdl",port));
+                }
+            }
+        } catch (Exception e) {
+            LOGGER.warning("can't get soap services", e);
+            return soapServices;
+        }
+
+        return soapServices;
+    }
+
+    private static ServerService serverService(final String clazz) {
         final ServiceManager sm = ServiceManager.get();
         if (!(sm instanceof SimpleServiceManager)) { // we don't know
             LOGGER.warning("the service manager used is not a simple service manager so rest services can't be retrieved");
-            return restServices;
+            return null;
         }
 
         final SimpleServiceManager ssm = (SimpleServiceManager) sm;
         final ServerService[] serverServices = ssm.getDaemons();
         if (serverServices == null) {
             LOGGER.warning("no service started");
-            return restServices;
+            return null;
         }
 
         for (ServerService ss : serverServices) {
-            if ("org.apache.openejb.server.cxf.rs.CxfRSService".equals(ss.getClass().getName())) {
-                try {
-                    final List<Object> services = (List<Object>) ss.getClass().getMethod("getServices").invoke(ss);
-                    if (services.isEmpty()) {
-                        return restServices;
-                    }
-
-                    final Class<?> infoClass = services.iterator().next().getClass();
-                    final Field appNameAccessor = infoClass.getField("webapp");
-                    final Field addressAccessor = infoClass.getField("address");
-                    final Field originAccessor = infoClass.getField("origin");
-
-                    for (Object rsService : services) {
-                        final String app = (String) appNameAccessor.get(rsService);
-                        final String address = (String) addressAccessor.get(rsService);
-                        final String origin = (String) originAccessor.get(rsService);
-                        restServices.returnOrCreateApplication(app).getServices().add(new RestService(origin, address));
-                    }
-                } catch (Exception e) {
-                    LOGGER.warning("can't get rest services", e);
-                    return restServices;
-                }
-                break;
+            if (clazz.equals(ss.getClass().getName())) {
+                return ss;
             }
         }
 
-        return restServices;
+        return null;
+    }
+
+    private static class Accessor {
+        private Object o;
+
+        public Accessor(Object o) {
+            this.o = o;
+        }
+
+        public Object value(final String attr) {
+            try {
+                return o.getClass().getField(attr).get(o);
+            } catch (Exception e) {
+                return null;
+            }
+        }
     }
 }