You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jl...@apache.org on 2013/10/02 21:14:23 UTC

svn commit: r1528597 - in /tomee/tomee/trunk/server/openejb-cxf/src: main/java/org/apache/openejb/server/cxf/CxfWsContainer.java main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java test/java/org/apache/openejb/server/cxf/WsJMXTest.java

Author: jlmonteiro
Date: Wed Oct  2 19:14:22 2013
New Revision: 1528597

URL: http://svn.apache.org/r1528597
Log:
OPENEJB-2040 OPENEJB-2041 Publish JMX information for JAX-RS and JAX-WS

Added:
    tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/WsJMXTest.java   (with props)
Modified:
    tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java
    tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java

Modified: tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java?rev=1528597&r1=1528596&r2=1528597&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java (original)
+++ tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java Wed Oct  2 19:14:22 2013
@@ -20,14 +20,21 @@ package org.apache.openejb.server.cxf;
 import org.apache.cxf.Bus;
 import org.apache.cxf.transport.http.AbstractHTTPDestination;
 import org.apache.cxf.transport.http.HTTPTransportFactory;
+import org.apache.openejb.api.internal.Internal;
+import org.apache.openejb.api.jmx.Description;
+import org.apache.openejb.api.jmx.MBean;
 import org.apache.openejb.assembler.classic.util.ServiceConfiguration;
 import org.apache.openejb.core.webservices.PortData;
+import org.apache.openejb.monitoring.LocalMBeanServer;
+import org.apache.openejb.monitoring.ObjectNameBuilder;
 import org.apache.openejb.server.cxf.transport.HttpTransportFactory;
 import org.apache.openejb.server.cxf.transport.util.CxfUtil;
 import org.apache.openejb.server.httpd.HttpListener;
 import org.apache.openejb.server.httpd.HttpRequest;
 import org.apache.openejb.server.httpd.HttpResponse;
 
+import javax.management.ObjectName;
+import javax.management.openmbean.TabularData;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -38,12 +45,14 @@ public abstract class CxfWsContainer imp
     protected CxfEndpoint endpoint;
     protected final HTTPTransportFactory httpTransportFactory;
     protected final ServiceConfiguration serviceConfiguration;
+    private ObjectName jmxName;
+
 
     public CxfWsContainer(final Bus bus, final PortData port, final ServiceConfiguration config) {
         this.bus = bus;
         this.port = port;
         this.serviceConfiguration = config;
-        
+
         final List<String> ids = new ArrayList<String>();
         ids.add("http://schemas.xmlsoap.org/wsdl/soap/");
 
@@ -55,19 +64,25 @@ public abstract class CxfWsContainer imp
         endpoint = createEndpoint();
         endpoint.publish("http://nopath");
         destination = (AbstractHTTPDestination) endpoint.getServer().getDestination();
+
+        // register an MBean for this endpoint
+        this.jmxName = registerMBean();
     }
 
     protected abstract CxfEndpoint createEndpoint();
+    protected abstract ObjectName registerMBean();
 
     public void destroy() {
+        unregisterMBean();
+
         if (endpoint != null) {
             endpoint.stop();
             endpoint = null;
         }
-        // if (destination != null) {
-        //    destination.shutdown();
-        //    destination = null;
-        // }
+    }
+
+    private void unregisterMBean() {
+        LocalMBeanServer.unregisterSilently(jmxName);
     }
 
     @Override
@@ -82,4 +97,5 @@ public abstract class CxfWsContainer imp
             }
         }
     }
+
 }

Modified: tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java?rev=1528597&r1=1528596&r2=1528597&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java (original)
+++ tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java Wed Oct  2 19:14:22 2013
@@ -18,11 +18,24 @@
 package org.apache.openejb.server.cxf.pojo;
 
 import org.apache.cxf.Bus;
+import org.apache.openejb.api.internal.Internal;
+import org.apache.openejb.api.jmx.Description;
+import org.apache.openejb.api.jmx.MBean;
+import org.apache.openejb.api.jmx.ManagedAttribute;
+import org.apache.openejb.api.jmx.ManagedOperation;
 import org.apache.openejb.assembler.classic.util.ServiceConfiguration;
+import org.apache.openejb.core.webservices.HandlerChainData;
+import org.apache.openejb.core.webservices.HandlerData;
 import org.apache.openejb.core.webservices.PortData;
+import org.apache.openejb.monitoring.LocalMBeanServer;
+import org.apache.openejb.monitoring.ObjectNameBuilder;
 import org.apache.openejb.server.cxf.CxfWsContainer;
 
+import javax.management.ObjectName;
+import javax.management.openmbean.TabularData;
 import javax.naming.Context;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 public class PojoWsContainer extends CxfWsContainer {
@@ -44,4 +57,94 @@ public class PojoWsContainer extends Cxf
     protected PojoEndpoint createEndpoint() {
         return new PojoEndpoint(loader, bus, port, context, target, httpTransportFactory, bindings, serviceConfiguration);
     }
+
+    @Override
+    protected ObjectName registerMBean() {
+        final ObjectName name = new ObjectNameBuilder("openejb.management")
+                .set("j2eeType", "JAX-WS")
+                .set("J2EEServer", "openejb")
+                .set("J2EEApplication", null)
+                .set("EndpointType", "POJO")
+                .set("name", target.getSimpleName())
+                .build();
+
+        final WsServiceMBean mbean = new WsServiceMBean(context, target, port);
+        LocalMBeanServer.registerDynamicWrapperSilently(mbean, name);
+        return name;
+    }
+
+    @MBean
+    @Description("JAX-WS Service information")
+    @Internal
+    public class WsServiceMBean {
+
+        private final Context context;
+        private final Class target;
+        private final PortData port;
+
+        public WsServiceMBean(final Context context, final Class target, final PortData port) {
+            this.context = context;
+            this.target = target;
+            this.port = port;
+        }
+
+        @ManagedOperation
+        @Description("")
+        public String getWsdl() {
+            return null;
+        }
+
+        @ManagedAttribute
+        @Description("The service port QName")
+        public String getPort() {
+            return port.getPortName().toString();
+        }
+
+        @ManagedAttribute
+        @Description("The service QName")
+        public String getService() {
+            return port.getServiceName().toString();
+        }
+
+        @ManagedAttribute
+        @Description("The handler list")
+        public TabularData getHandlers() {
+            final List<String> names = new ArrayList<String>();
+            final List<String> values = new ArrayList<String>();
+
+            for (final HandlerChainData handlerChainData : port.getHandlerChains()) {
+                for (final HandlerData handlerData : handlerChainData.getHandlers()) {
+                    names.add(handlerChainData.getServiceNamePattern().toString());
+                    values.add(handlerData.getHandlerClass().getName());
+                }
+            }
+
+            return LocalMBeanServer.tabularData(
+                    "handlers", "The list of handlers",
+                    names.toArray(new String[names.size()]), values.toArray(new String[values.size()]));
+        }
+
+        @ManagedAttribute
+        @Description("Is the service secured?")
+        public boolean getSecured() {
+            return port.isSecure();
+        }
+
+        @ManagedAttribute
+        @Description("Is MTOM enabled?")
+        public boolean getMtomEnabled() {
+            return port.isMtomEnabled();
+        }
+
+        @ManagedAttribute
+        @Description("Service configuration properties")
+        public TabularData getProperties() {
+            return LocalMBeanServer.tabularData(
+                    "properties",
+                    "Service configuration properties",
+                    "Service configuration properties",
+                    port.getProperties()
+            );
+        }
+    }
 }

Added: tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/WsJMXTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/WsJMXTest.java?rev=1528597&view=auto
==============================================================================
--- tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/WsJMXTest.java (added)
+++ tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/WsJMXTest.java Wed Oct  2 19:14:22 2013
@@ -0,0 +1,101 @@
+/*
+ *     Licensed to the Apache Software Foundation (ASF) under one or more
+ *     contributor license agreements.  See the NOTICE file distributed with
+ *     this work for additional information regarding copyright ownership.
+ *     The ASF licenses this file to You under the Apache License, Version 2.0
+ *     (the "License"); you may not use this file except in compliance with
+ *     the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+package org.apache.openejb.server.cxf;
+
+import org.apache.openejb.jee.Servlet;
+import org.apache.openejb.jee.ServletMapping;
+import org.apache.openejb.jee.WebApp;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.monitoring.LocalMBeanServer;
+import org.apache.openejb.testing.Classes;
+import org.apache.openejb.testing.EnableServices;
+import org.apache.openejb.testing.Module;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.ejb.Lock;
+import javax.ejb.LockType;
+import javax.ejb.Singleton;
+import javax.jws.WebService;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+@EnableServices("jax-ws")
+@RunWith(ApplicationComposer.class)
+public class WsJMXTest {
+    private static ObjectName name;
+
+    @Module
+    @Classes({AnEjbEndpoint.class, AnPojoEndpoint.class})
+    public WebApp war() {
+        final WebApp webapp = new WebApp().contextRoot("app");
+
+        Servlet servlet = new Servlet();
+        servlet.setServletName("toto");
+        servlet.setServletClass(AnPojoEndpoint.class.getName());
+
+        ServletMapping servletMapping = new ServletMapping();
+        servletMapping.setServletName("pojo");
+        servletMapping.getUrlPattern().add("/toto");
+
+        webapp.getServlet().add(servlet);
+        webapp.getServletMapping().add(servletMapping);
+
+        return webapp;
+    }
+
+    @BeforeClass
+    public static void before() throws MalformedObjectNameException {
+        name = new ObjectName("openejb.management:j2eeType=JAX-WS,J2EEServer=openejb,J2EEApplication=<empty>,EndpointType=EJB,name=" + AnEjbEndpoint.class.getName());
+    }
+
+    @Test
+    public void checkServiceWasDeployed() throws Exception {
+        Thread.currentThread().sleep(10000000000l);
+        assertTrue(LocalMBeanServer.get().isRegistered(name));
+    }
+
+    @AfterClass
+    public static void after() {
+        assertFalse(LocalMBeanServer.get().isRegistered(name));
+    }
+
+    @Singleton
+    @Lock(LockType.READ)
+    @WebService
+    public static class AnEjbEndpoint {
+
+        public String sayHello(final String me) {
+            return "Hello " + me;
+        }
+
+    }
+
+    @WebService
+    public static class AnPojoEndpoint {
+
+        public String sayHi(final String me) {
+            return "Hi " + me;
+        }
+
+    }
+}

Propchange: tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/WsJMXTest.java
------------------------------------------------------------------------------
    svn:executable = *