You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jg...@apache.org on 2018/09/14 15:22:31 UTC

[01/12] tomee git commit: Adding some TODOs

Repository: tomee
Updated Branches:
  refs/heads/master 6ba7fc5f7 -> 250bdbec1


Adding some TODOs


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/e2879a9c
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/e2879a9c
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/e2879a9c

Branch: refs/heads/master
Commit: e2879a9c0f460d9e385011074bff4c271f1c1ad3
Parents: 92fb90f
Author: Jonathan Gallimore <jo...@jrg.me.uk>
Authored: Thu Aug 30 15:51:45 2018 +0100
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Thu Aug 30 15:51:45 2018 +0100

----------------------------------------------------------------------
 .../java/org/apache/openejb/assembler/classic/Assembler.java   | 6 ++++++
 1 file changed, 6 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/e2879a9c/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
index b013752..7e5094b 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
@@ -2835,6 +2835,9 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
         if (Container.class.isInstance(service) && LocalMBeanServer.isJMXActive()) {
             final ObjectName objectName = ObjectNameBuilder.uniqueName("containers", serviceInfo.id, service);
             try {
+
+                // TODO: is there anything further we want to include here?
+                // TODO: live state for MDB pool
                 LocalMBeanServer.get().registerMBean(new DynamicMBeanWrapper(new JMXContainer(serviceInfo, (Container) service)), objectName);
                 containerObjectNames.add(objectName);
             } catch (final Exception | NoClassDefFoundError e) {
@@ -3248,6 +3251,9 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
 
             // create the connection manager
             final ConnectionManager connectionManager = (ConnectionManager) connectionManagerRecipe.create();
+            // TODO: wrap GenericConnectionManager with something to provide stats via JMX
+
+
             if (connectionManager == null) {
                 throw new OpenEJBRuntimeException(messages.format("assembler.invalidConnectionManager", serviceInfo.id));
             }


[05/12] tomee git commit: Cleanup JMX object and add test

Posted by jg...@apache.org.
Cleanup JMX object and add test


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/d18fbc0d
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/d18fbc0d
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/d18fbc0d

Branch: refs/heads/master
Commit: d18fbc0ddf38a5c3023729f5426aa319d57c4047
Parents: 65768ea
Author: Jonathan Gallimore <jo...@jrg.me.uk>
Authored: Mon Sep 3 20:22:33 2018 +0100
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Mon Sep 3 20:22:33 2018 +0100

----------------------------------------------------------------------
 .../openejb/assembler/classic/Assembler.java    |  21 ++-
 .../monitoring/ConnectionFactoryMonitor.java    | 169 +++++++++++++++++++
 .../classic/ConnectionFactoryJMXTest.java       | 133 +++++++++++++++
 3 files changed, 320 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/d18fbc0d/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
index 76feebc..3b3d60f 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
@@ -2164,6 +2164,24 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
             } catch (final Exception e) {
                 logger.debug("Not processing resource on destroy: " + className, e);
             }
+
+            // remove associated JMX object
+            final ObjectNameBuilder jmxName = new ObjectNameBuilder("openejb.management");
+            jmxName.set("J2EEServer", "openejb");
+            jmxName.set("J2EEApplication", null);
+            jmxName.set("j2eeType", "");
+            jmxName.set("name",name);
+
+            final MBeanServer server = LocalMBeanServer.get();
+            try {
+                final ObjectName objectName = jmxName.set("j2eeType", "ConnectionFactory").build();
+                if (server.isRegistered(objectName)) {
+                    server.unregisterMBean(objectName);
+                }
+            } catch (final Exception e) {
+                logger.error("Unable to unregister MBean ", e);
+            }
+
         } else if (DestroyableResource.class.isInstance(object)) {
             try {
                 DestroyableResource.class.cast(object).destroyResource();
@@ -2834,9 +2852,6 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
         if (Container.class.isInstance(service) && LocalMBeanServer.isJMXActive()) {
             final ObjectName objectName = ObjectNameBuilder.uniqueName("containers", serviceInfo.id, service);
             try {
-
-                // TODO: is there anything further we want to include here?
-                // TODO: live state for MDB pool
                 LocalMBeanServer.get().registerMBean(new DynamicMBeanWrapper(new JMXContainer(serviceInfo, (Container) service)), objectName);
                 containerObjectNames.add(objectName);
             } catch (final Exception | NoClassDefFoundError e) {

http://git-wip-us.apache.org/repos/asf/tomee/blob/d18fbc0d/container/openejb-core/src/main/java/org/apache/openejb/monitoring/ConnectionFactoryMonitor.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/monitoring/ConnectionFactoryMonitor.java b/container/openejb-core/src/main/java/org/apache/openejb/monitoring/ConnectionFactoryMonitor.java
new file mode 100644
index 0000000..2f57f89
--- /dev/null
+++ b/container/openejb-core/src/main/java/org/apache/openejb/monitoring/ConnectionFactoryMonitor.java
@@ -0,0 +1,169 @@
+/*
+ * 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.monitoring;
+
+import org.apache.geronimo.connector.outbound.GenericConnectionManager;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.NoPool;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PartitionedPool;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PoolingSupport;
+import org.apache.geronimo.connector.outbound.connectionmanagerconfig.SinglePool;
+
+public class ConnectionFactoryMonitor {
+
+    private final String name;
+    private final GenericConnectionManager connectionManager;
+    private final String txSupport;
+
+    public ConnectionFactoryMonitor(final String name, final GenericConnectionManager connectionManager, final String txSupport) {
+        this.name = name;
+        this.connectionManager = connectionManager;
+        this.txSupport = txSupport;
+    }
+
+    private PoolingSupport getPooling() {
+        return connectionManager.getPooling();
+    }
+
+    @Managed
+    public int getMaxSize() {
+        final PoolingSupport pooling = getPooling();
+
+        if (PartitionedPool.class.isInstance(pooling)) {
+            return PartitionedPool.class.cast(pooling).getMaxSize();
+        } else if (SinglePool.class.isInstance(pooling)) {
+            return SinglePool.class.cast(pooling).getMaxSize();
+        } else if (NoPool.class.isInstance(pooling)) {
+            return 0;
+        } else {
+            return 0;
+        }
+    }
+
+    @Managed
+    public int getMinSize() {
+        final PoolingSupport pooling = getPooling();
+
+        if (PartitionedPool.class.isInstance(pooling)) {
+            return 0;
+        } else if (SinglePool.class.isInstance(pooling)) {
+            return SinglePool.class.cast(pooling).getMinSize();
+        } else if (NoPool.class.isInstance(pooling)) {
+            return 0;
+        } else {
+            return 0;
+        }
+    }
+
+    @Managed
+    public int getBlockingTimeoutMilliseconds() {
+        return connectionManager.getBlockingTimeoutMilliseconds();
+    }
+
+    @Managed
+    public int getIdleTimeoutMinutes() {
+        return connectionManager.getIdleTimeoutMinutes();
+    }
+
+    @Managed
+    public boolean isMatchAll() {
+        final PoolingSupport pooling = getPooling();
+
+        if (PartitionedPool.class.isInstance(pooling)) {
+            return PartitionedPool.class.cast(pooling).isMatchAll();
+        } else if (SinglePool.class.isInstance(pooling)) {
+            return SinglePool.class.cast(pooling).isMatchAll();
+        } else if (NoPool.class.isInstance(pooling)) {
+            return false;
+        } else {
+            return false;
+        }
+    }
+
+    @Managed
+    public String getPartitionStrategy() {
+        final PoolingSupport pooling = getPooling();
+
+        if (PartitionedPool.class.isInstance(pooling)) {
+            if (PartitionedPool.class.cast(pooling).isPartitionByConnectionRequestInfo()) {
+                return PartitionStrategy.BY_CONNECTOR_PROPERTIES.toString();
+            }
+
+            if (PartitionedPool.class.cast(pooling).isPartitionBySubject()) {
+                return PartitionStrategy.BY_SUBJECT.toString();
+            }
+
+            return PartitionStrategy.UNKNOWN.toString();
+        } else if (SinglePool.class.isInstance(pooling)) {
+            return PartitionStrategy.NONE.toString();
+        } else if (NoPool.class.isInstance(pooling)) {
+            return PartitionStrategy.NONE.toString();
+        } else {
+            return PartitionStrategy.NONE.toString();
+        }
+    }
+
+    @Managed
+    public String getTxSupport() {
+        return txSupport;
+    }
+
+    @Managed
+    public int getPartitionCount() {
+        return connectionManager.getPartitionCount();
+    }
+
+    @Managed
+    public int getPartitionMaxSize() {
+        return connectionManager.getPartitionMaxSize();
+    }
+
+    @Managed
+    public int getPartitionMinSize() {
+        return connectionManager.getPartitionMinSize();
+    }
+
+    @Managed
+    public int getIdleConnectionCount() {
+        return connectionManager.getIdleConnectionCount();
+    }
+
+    @Managed
+    public int getConnectionCount() {
+        return connectionManager.getConnectionCount();
+    }
+
+    @Managed
+    public String getName() {
+        return name;
+    }
+
+    public enum PartitionStrategy {
+        NONE("none"), BY_SUBJECT("by-subject"), BY_CONNECTOR_PROPERTIES("by-connector-properties"), UNKNOWN("unknown");
+
+        private final String name;
+
+        PartitionStrategy(String name) {
+            this.name = name;
+        }
+
+        @Override
+        public String toString() {
+            return name;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/tomee/blob/d18fbc0d/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/ConnectionFactoryJMXTest.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/ConnectionFactoryJMXTest.java b/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/ConnectionFactoryJMXTest.java
new file mode 100644
index 0000000..5490fa7
--- /dev/null
+++ b/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/ConnectionFactoryJMXTest.java
@@ -0,0 +1,133 @@
+/**
+ *
+ * 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.assembler.classic;
+
+import junit.framework.TestCase;
+import org.apache.openejb.OpenEJB;
+import org.apache.openejb.config.ConfigurationFactory;
+import org.apache.openejb.config.EjbModule;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.StatelessBean;
+import org.apache.openejb.client.LocalInitialContextFactory;
+import org.apache.openejb.monitoring.LocalMBeanServer;
+
+import javax.annotation.Resource;
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.management.AttributeNotFoundException;
+import javax.management.InstanceNotFoundException;
+import javax.management.IntrospectionException;
+import javax.management.MBeanException;
+import javax.management.ObjectName;
+import javax.management.ReflectionException;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import java.util.Properties;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ConnectionFactoryJMXTest extends TestCase {
+
+    public void test() throws Exception {
+        final ConfigurationFactory config = new ConfigurationFactory();
+        final Assembler assembler = new Assembler();
+
+        // System services
+        assembler.createProxyFactory(config.configureService(ProxyFactoryInfo.class));
+        assembler.createTransactionManager(config.configureService(TransactionServiceInfo.class));
+        assembler.createSecurityService(config.configureService(SecurityServiceInfo.class));
+
+        // Fake connection factory
+        assembler.createResource(config.configureService("Default JMS Resource Adapter", ResourceInfo.class));
+        final ResourceInfo resourceInfo = config.configureService("Default JMS Connection Factory", ResourceInfo.class);
+        resourceInfo.id = "CF";
+        resourceInfo.properties.setProperty("TransactionSupport", "xa");
+        resourceInfo.properties.setProperty("MaxConnections", "5");
+        assembler.createResource(resourceInfo);
+
+        // generate ejb jar application
+        final EjbJar ejbJar = new EjbJar();
+        ejbJar.addEnterpriseBean(new StatelessBean("fakeBean", FakeStatelessBean.class));
+        final EjbModule ejbModule = new EjbModule(getClass().getClassLoader(), "FakeEjbJar", "fake.jar", ejbJar, null);
+
+        // configure and deploy it
+        final EjbJarInfo info = config.configureApplication(ejbModule);
+        assembler.createEjbJar(info);
+
+        check(new ObjectName("openejb.management:J2EEServer=openejb,J2EEApplication=<empty>,j2eeType=ConnectionFactory,name=CF"), 0, 0);
+
+        final Properties p = new Properties();
+        p.setProperty(Context.INITIAL_CONTEXT_FACTORY, LocalInitialContextFactory.class.getName());
+        final FakeStateless fakeBeanLocal = (FakeStateless) new InitialContext(p).lookup("fakeBeanLocal");
+        fakeBeanLocal.doIt();
+
+        OpenEJB.destroy();
+
+        // ensure the bean is removed when the resource is undeployed
+        assertFalse(LocalMBeanServer.get().isRegistered(new ObjectName("openejb.management:J2EEServer=openejb,J2EEApplication=<empty>,j2eeType=ConnectionFactory,name=CF")));
+    }
+
+    private static void check(ObjectName on, final int connectionCount, final int idleCount) throws InstanceNotFoundException, IntrospectionException, ReflectionException, MBeanException, AttributeNotFoundException {
+        assertNotNull(LocalMBeanServer.get().getMBeanInfo(on));
+
+        assertEquals(5000, LocalMBeanServer.get().getAttribute(on, "BlockingTimeoutMilliseconds"));
+        assertEquals(connectionCount, LocalMBeanServer.get().getAttribute(on, "ConnectionCount"));
+        assertEquals(idleCount, LocalMBeanServer.get().getAttribute(on, "IdleConnectionCount"));
+        assertEquals(15, LocalMBeanServer.get().getAttribute(on, "IdleTimeoutMinutes"));
+        assertEquals(false, LocalMBeanServer.get().getAttribute(on, "MatchAll"));
+        assertEquals(10, LocalMBeanServer.get().getAttribute(on, "MaxSize"));
+        assertEquals(0, LocalMBeanServer.get().getAttribute(on, "MinSize"));
+        assertEquals("CF", LocalMBeanServer.get().getAttribute(on, "Name"));
+        assertEquals(1, LocalMBeanServer.get().getAttribute(on, "PartitionCount"));
+        assertEquals(10, LocalMBeanServer.get().getAttribute(on, "PartitionMaxSize"));
+        assertEquals(0, LocalMBeanServer.get().getAttribute(on, "PartitionMinSize"));
+        assertEquals("none", LocalMBeanServer.get().getAttribute(on, "PartitionStrategy"));
+        assertEquals("xa", LocalMBeanServer.get().getAttribute(on, "TxSupport"));
+    }
+
+    public interface FakeStateless {
+        public void doIt();
+    }
+
+    public static class FakeStatelessBean implements FakeStateless {
+
+        @Resource
+        private ConnectionFactory cf;
+
+        @Override
+        public void doIt() {
+            try {
+                final Connection connection = cf.createConnection();
+
+                // check we see the connection and it is not idle
+                check(
+                        new ObjectName("openejb.management:J2EEServer=openejb,J2EEApplication=<empty>,j2eeType=ConnectionFactory,name=CF"),
+                        1,
+                        0
+                );
+
+                connection.close();
+            } catch (Exception e) {
+                fail("Unexpected exception thrown " + e);
+            }
+
+
+        }
+    }
+}


[11/12] tomee git commit: Fix broken test where geronimo connector is not available (webprofile)

Posted by jg...@apache.org.
Fix broken test where geronimo connector is not available (webprofile)


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/daa274ca
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/daa274ca
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/daa274ca

Branch: refs/heads/master
Commit: daa274ca40808856fd8f2d040a1fd1950b9f29fe
Parents: 3d33727
Author: Jonathan Gallimore <jo...@jrg.me.uk>
Authored: Thu Sep 13 10:59:21 2018 +0100
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Thu Sep 13 10:59:21 2018 +0100

----------------------------------------------------------------------
 .../openejb/assembler/classic/Assembler.java    | 13 +++++----
 .../GeronimoConnectionManagerFactory.java       | 30 ++++++++++++++++++++
 2 files changed, 37 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/daa274ca/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
index 396f632..0f4801e 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
@@ -19,7 +19,6 @@ package org.apache.openejb.assembler.classic;
 
 import org.apache.geronimo.connector.GeronimoBootstrapContext;
 import org.apache.geronimo.connector.outbound.AbstractConnectionManager;
-import org.apache.geronimo.connector.outbound.GenericConnectionManager;
 import org.apache.geronimo.connector.work.GeronimoWorkManager;
 import org.apache.geronimo.connector.work.HintsContextHandler;
 import org.apache.geronimo.connector.work.TransactionContextHandler;
@@ -108,7 +107,12 @@ import org.apache.openejb.loader.JarLocation;
 import org.apache.openejb.loader.Options;
 import org.apache.openejb.loader.ProvisioningUtil;
 import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.monitoring.*;
+import org.apache.openejb.monitoring.ConnectionFactoryMonitor;
+import org.apache.openejb.monitoring.DynamicMBeanWrapper;
+import org.apache.openejb.monitoring.LocalMBeanServer;
+import org.apache.openejb.monitoring.MBeanPojoWrapper;
+import org.apache.openejb.monitoring.ManagedMBean;
+import org.apache.openejb.monitoring.ObjectNameBuilder;
 import org.apache.openejb.monitoring.remote.RemoteResourceMonitor;
 import org.apache.openejb.observer.Observes;
 import org.apache.openejb.persistence.JtaEntityManagerRegistry;
@@ -3278,7 +3282,7 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
             logger.getChildLogger("service").info("createResource.createConnectionManager", serviceInfo.id, service.getClass().getName());
 
             // create the connection manager
-            final GenericConnectionManager connectionManager = (GenericConnectionManager) connectionManagerRecipe.create();
+            final ConnectionManager connectionManager = (ConnectionManager) connectionManagerRecipe.create();
 
 
             String txSupport = "xa";
@@ -3292,9 +3296,6 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
                 txSupport = "xa";
             }
 
-            final ConnectionFactoryMonitor cfm = new ConnectionFactoryMonitor(serviceInfo.id, connectionManager, txSupport);
-            registerAsMBean(serviceInfo.id, "ConnectionFactory", new ManagedMBean(cfm));
-
             if (connectionManager == null) {
                 throw new OpenEJBRuntimeException(messages.format("assembler.invalidConnectionManager", serviceInfo.id));
             }

http://git-wip-us.apache.org/repos/asf/tomee/blob/daa274ca/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java b/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
index cebe9cc..852dc32 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
@@ -38,9 +38,17 @@ import org.apache.geronimo.connector.outbound.connectionmanagerconfig.XATransact
 import org.apache.geronimo.transaction.manager.NamedXAResourceFactory;
 import org.apache.geronimo.transaction.manager.RecoverableTransactionManager;
 import org.apache.openejb.OpenEJBRuntimeException;
+import org.apache.openejb.monitoring.ConnectionFactoryMonitor;
+import org.apache.openejb.monitoring.LocalMBeanServer;
+import org.apache.openejb.monitoring.ManagedMBean;
+import org.apache.openejb.monitoring.ObjectNameBuilder;
 import org.apache.openejb.util.Duration;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.reflection.Reflections;
 
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
 import javax.resource.ResourceException;
 import javax.resource.spi.ManagedConnection;
 import javax.resource.spi.ManagedConnectionFactory;
@@ -64,6 +72,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReadWriteLock;
 
 public class GeronimoConnectionManagerFactory {
+    private final Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, GeronimoConnectionManagerFactory.class);
     private String name;
     private ClassLoader classLoader;
 
@@ -260,6 +269,27 @@ public class GeronimoConnectionManagerFactory {
                     mcf, name, classLoader);
         }
 
+
+        final ConnectionFactoryMonitor cfm = new ConnectionFactoryMonitor(name, mgr, transactionSupport);
+        final MBeanServer server = LocalMBeanServer.get();
+
+        final ObjectNameBuilder jmxName = new ObjectNameBuilder("openejb.management");
+        jmxName.set("J2EEServer", "openejb");
+        jmxName.set("J2EEApplication", null);
+        jmxName.set("j2eeType", "");
+        jmxName.set("name", name);
+
+        try {
+            final ObjectName objectName = jmxName.set("j2eeType", "ConnectionFactory").build();
+            if (server.isRegistered(objectName)) {
+                server.unregisterMBean(objectName);
+            }
+
+            server.registerMBean(new ManagedMBean(cfm), objectName);
+        } catch (final Exception e) {
+            logger.error("Unable to register MBean ", e);
+        }
+
         return mgr;
     }
 


[12/12] tomee git commit: Checkstyle

Posted by jg...@apache.org.
Checkstyle


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/250bdbec
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/250bdbec
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/250bdbec

Branch: refs/heads/master
Commit: 250bdbec1196688e2a0378f822583bc9887d832d
Parents: daa274c
Author: Jonathan Gallimore <jo...@jrg.me.uk>
Authored: Thu Sep 13 11:57:31 2018 +0100
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Thu Sep 13 11:57:31 2018 +0100

----------------------------------------------------------------------
 .../main/java/org/apache/openejb/assembler/classic/Assembler.java  | 2 --
 1 file changed, 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/250bdbec/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
index 0f4801e..fb561c9 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
@@ -107,11 +107,9 @@ import org.apache.openejb.loader.JarLocation;
 import org.apache.openejb.loader.Options;
 import org.apache.openejb.loader.ProvisioningUtil;
 import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.monitoring.ConnectionFactoryMonitor;
 import org.apache.openejb.monitoring.DynamicMBeanWrapper;
 import org.apache.openejb.monitoring.LocalMBeanServer;
 import org.apache.openejb.monitoring.MBeanPojoWrapper;
-import org.apache.openejb.monitoring.ManagedMBean;
 import org.apache.openejb.monitoring.ObjectNameBuilder;
 import org.apache.openejb.monitoring.remote.RemoteResourceMonitor;
 import org.apache.openejb.observer.Observes;


[09/12] tomee git commit: Add test for resource adapter and resources

Posted by jg...@apache.org.
Add test for resource adapter and resources


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/612b7abe
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/612b7abe
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/612b7abe

Branch: refs/heads/master
Commit: 612b7abee616a2560d0c24dee59f02a061657dc3
Parents: 3efcdf2
Author: Jonathan Gallimore <jo...@jrg.me.uk>
Authored: Wed Sep 12 15:43:04 2018 +0100
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Wed Sep 12 15:43:04 2018 +0100

----------------------------------------------------------------------
 .../assembler/classic/ResourcesJMXTest.java     | 184 +++++++++++++++++++
 1 file changed, 184 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/612b7abe/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/ResourcesJMXTest.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/ResourcesJMXTest.java b/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/ResourcesJMXTest.java
new file mode 100644
index 0000000..15c86a5
--- /dev/null
+++ b/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/ResourcesJMXTest.java
@@ -0,0 +1,184 @@
+/**
+ *
+ * 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.assembler.classic;
+
+import junit.framework.TestCase;
+import org.apache.openejb.OpenEJB;
+import org.apache.openejb.config.ConfigurationFactory;
+import org.apache.openejb.monitoring.LocalMBeanServer;
+
+import javax.management.*;
+import javax.resource.ResourceException;
+import javax.resource.spi.*;
+import javax.resource.spi.endpoint.MessageEndpoint;
+import javax.resource.spi.endpoint.MessageEndpointFactory;
+import javax.transaction.xa.XAResource;
+import java.util.Properties;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ResourcesJMXTest extends TestCase {
+    public void test() throws Exception {
+        final ConfigurationFactory config = new ConfigurationFactory();
+        final Assembler assembler = new Assembler();
+
+        // System services
+        assembler.createProxyFactory(config.configureService(ProxyFactoryInfo.class));
+        assembler.createTransactionManager(config.configureService(TransactionServiceInfo.class));
+        assembler.createSecurityService(config.configureService(SecurityServiceInfo.class));
+
+        // FakeRA
+        final ResourceInfo resourceInfo = new ResourceInfo();
+        resourceInfo.service = "Resource";
+        resourceInfo.className = FakeRA.class.getName();
+        resourceInfo.id = "FakeRA";
+        resourceInfo.properties = new Properties();
+        assembler.createResource(resourceInfo);
+
+        // FakeRA container
+        final ContainerInfo containerInfo = config.configureService(MdbContainerInfo.class);
+        containerInfo.id = "FakeContainer";
+        containerInfo.displayName = "Fake Container";
+        containerInfo.properties.setProperty("ResourceAdapter", "FakeRA");
+        containerInfo.properties.setProperty("MessageListenerInterface", FakeMessageListener.class.getName());
+        containerInfo.properties.setProperty("ActivationSpecClass", FakeActivationSpec.class.getName());
+        assembler.createContainer(containerInfo);
+
+        final ResourceInfo testResource = new ResourceInfo();
+        testResource.id = "testResource";
+        testResource.className = FakeResouce.class.getName();
+
+        final Properties p = new Properties();
+        p.put("host", "localhost");
+        p.put("port", "12345");
+        p.put("parameter", "test param");
+        testResource.properties = p;
+
+        assembler.createResource(testResource);
+
+        {
+            ObjectName on = new ObjectName("openejb.management:J2EEServer=openejb,J2EEApplication=<empty>,j2eeType=ResourceAdapter,name=FakeRA");
+            assertNotNull(LocalMBeanServer.get().getMBeanInfo(on));
+            assertEquals("faketest", LocalMBeanServer.get().getAttribute(on, "name"));
+            assertEquals(10, LocalMBeanServer.get().getAttribute(on, "priority"));
+        }
+        {
+            ObjectName on = new ObjectName("openejb.management:J2EEServer=openejb,J2EEApplication=<empty>,j2eeType=Resource,name=testResource");
+            assertNotNull(LocalMBeanServer.get().getMBeanInfo(on));
+            assertEquals("localhost", LocalMBeanServer.get().getAttribute(on, "host"));
+            assertEquals(12345, LocalMBeanServer.get().getAttribute(on, "port"));
+            assertEquals("test param", LocalMBeanServer.get().getAttribute(on, "parameter"));
+        }
+
+        OpenEJB.destroy();
+
+        assertFalse(LocalMBeanServer.get().isRegistered(new ObjectName("openejb.management:J2EEServer=openejb,J2EEApplication=<empty>,j2eeType=ResourceAdapter,name=FakeRA")));
+        assertFalse(LocalMBeanServer.get().isRegistered(new ObjectName("openejb.management:J2EEServer=openejb,J2EEApplication=<empty>,j2eeType=Resource,name=testResource")));
+    }
+
+    public interface FakeMessageListener {
+        void doIt(Properties properties);
+    }
+
+    public static class FakeRA implements ResourceAdapter {
+
+        private String name = "faketest";
+        private int priority = 10;
+
+
+        public void start(final BootstrapContext bootstrapContext) throws ResourceAdapterInternalException {
+        }
+
+        public void stop() {
+        }
+
+        public void endpointActivation(final MessageEndpointFactory messageEndpointFactory, final ActivationSpec activationSpec) throws ResourceException {
+            final MessageEndpoint endpoint = messageEndpointFactory.createEndpoint(null);
+        }
+
+        public void endpointDeactivation(final MessageEndpointFactory messageEndpointFactory, final ActivationSpec activationSpec) {
+        }
+
+        public XAResource[] getXAResources(final ActivationSpec[] activationSpecs) throws ResourceException {
+            return new XAResource[0];
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public int getPriority() {
+            return priority;
+        }
+
+        public void setPriority(int priority) {
+            this.priority = priority;
+        }
+    }
+
+    public static class FakeActivationSpec implements ActivationSpec {
+        private FakeRA fakeRA;
+
+        public void validate() throws InvalidPropertyException {
+        }
+
+        public FakeRA getResourceAdapter() {
+            return fakeRA;
+        }
+
+        public void setResourceAdapter(final ResourceAdapter resourceAdapter) {
+            this.fakeRA = (FakeRA) resourceAdapter;
+        }
+    }
+
+    public static class FakeResouce {
+        private String host;
+        private int port;
+        private String parameter;
+
+        public String getHost() {
+            return host;
+        }
+
+        public void setHost(String host) {
+            this.host = host;
+        }
+
+        public int getPort() {
+            return port;
+        }
+
+        public void setPort(int port) {
+            this.port = port;
+        }
+
+        public String getParameter() {
+            return parameter;
+        }
+
+        public void setParameter(String parameter) {
+            this.parameter = parameter;
+        }
+    }
+
+}


[07/12] tomee git commit: Merge remote-tracking branch 'apache/master' into jmx-hacking

Posted by jg...@apache.org.
Merge remote-tracking branch 'apache/master' into jmx-hacking


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/a79159fc
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/a79159fc
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/a79159fc

Branch: refs/heads/master
Commit: a79159fca768f29d867af90c40ef0b57b4e05eff
Parents: c15931f 2d02748
Author: Jonathan Gallimore <jo...@jrg.me.uk>
Authored: Wed Sep 5 17:37:31 2018 +0100
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Wed Sep 5 17:37:31 2018 +0100

----------------------------------------------------------------------
 .../moviefun/DeployInWebAppsDirectoryTest.java  |   2 +-
 examples/connector-ear/pom.xml                  |  15 ++
 .../moviefun/DeployInWebAppsDirectoryTest.java  |   2 +-
 examples/simple-ear/pom.xml                     |   9 +
 pom.xml                                         |   4 +-
 tck/microprofile-tck/config/pom.xml             |   4 +
 .../main/resources/META-INF/microprofile/NOTICE | 163 +++++++++++++++++++
 .../src/main/resources/META-INF/NOTICE          |  79 +++++----
 8 files changed, 246 insertions(+), 32 deletions(-)
----------------------------------------------------------------------



[04/12] tomee git commit: Provide ConnectionFactory stats

Posted by jg...@apache.org.
Provide ConnectionFactory stats


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/65768eaf
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/65768eaf
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/65768eaf

Branch: refs/heads/master
Commit: 65768eaf3fea34b45472d1da6f5fea928e0a1361
Parents: 79ea0f8
Author: Jonathan Gallimore <jo...@jrg.me.uk>
Authored: Mon Sep 3 13:38:13 2018 +0100
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Mon Sep 3 13:38:13 2018 +0100

----------------------------------------------------------------------
 .../openejb/assembler/classic/Assembler.java    | 40 +++++++++++++++++---
 1 file changed, 35 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/65768eaf/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
index 91b3933..76feebc 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
@@ -19,6 +19,7 @@ package org.apache.openejb.assembler.classic;
 
 import org.apache.geronimo.connector.GeronimoBootstrapContext;
 import org.apache.geronimo.connector.outbound.AbstractConnectionManager;
+import org.apache.geronimo.connector.outbound.GenericConnectionManager;
 import org.apache.geronimo.connector.work.GeronimoWorkManager;
 import org.apache.geronimo.connector.work.HintsContextHandler;
 import org.apache.geronimo.connector.work.TransactionContextHandler;
@@ -107,9 +108,7 @@ import org.apache.openejb.loader.JarLocation;
 import org.apache.openejb.loader.Options;
 import org.apache.openejb.loader.ProvisioningUtil;
 import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.monitoring.DynamicMBeanWrapper;
-import org.apache.openejb.monitoring.LocalMBeanServer;
-import org.apache.openejb.monitoring.ObjectNameBuilder;
+import org.apache.openejb.monitoring.*;
 import org.apache.openejb.monitoring.remote.RemoteResourceMonitor;
 import org.apache.openejb.observer.Observes;
 import org.apache.openejb.persistence.JtaEntityManagerRegistry;
@@ -3250,10 +3249,41 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
             logger.getChildLogger("service").info("createResource.createConnectionManager", serviceInfo.id, service.getClass().getName());
 
             // create the connection manager
-            final ConnectionManager connectionManager = (ConnectionManager) connectionManagerRecipe.create();
-            // TODO: wrap GenericConnectionManager with something to provide stats via JMX
+            final GenericConnectionManager connectionManager = (GenericConnectionManager) connectionManagerRecipe.create();
 
 
+            String txSupport = "xa";
+            try {
+                txSupport = (String) connectionManagerRecipe.getProperty("transactionSupport");
+            } catch (Exception e) {
+                // ignore
+            }
+
+            if (txSupport == null || txSupport.trim().length() == 0) {
+                txSupport = "xa";
+            }
+
+            final ConnectionFactoryMonitor cfm = new ConnectionFactoryMonitor(serviceInfo.id, connectionManager, txSupport);
+
+            final MBeanServer server = LocalMBeanServer.get();
+
+            final ObjectNameBuilder jmxName = new ObjectNameBuilder("openejb.management");
+            jmxName.set("J2EEServer", "openejb");
+            jmxName.set("J2EEApplication", null);
+            jmxName.set("j2eeType", "");
+            jmxName.set("name",serviceInfo.id);
+
+            // register the invocation stats interceptor
+            try {
+                final ObjectName objectName = jmxName.set("j2eeType", "ConnectionFactory").build();
+                if (server.isRegistered(objectName)) {
+                    server.unregisterMBean(objectName);
+                }
+                server.registerMBean(new ManagedMBean(cfm), objectName);
+            } catch (final Exception e) {
+                logger.error("Unable to register MBean ", e);
+            }
+
             if (connectionManager == null) {
                 throw new OpenEJBRuntimeException(messages.format("assembler.invalidConnectionManager", serviceInfo.id));
             }


[03/12] tomee git commit: Merge branch 'master' into jmx-hacking

Posted by jg...@apache.org.
Merge branch 'master' into jmx-hacking


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/79ea0f89
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/79ea0f89
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/79ea0f89

Branch: refs/heads/master
Commit: 79ea0f89479ccc09f37adeafe85fc7fdd68d6326
Parents: dcbdd8d 4ea18ce
Author: Jonathan Gallimore <jo...@jrg.me.uk>
Authored: Fri Aug 31 12:18:48 2018 +0100
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Fri Aug 31 12:18:48 2018 +0100

----------------------------------------------------------------------
 server/openejb-cxf/pom.xml               | 6 +++++-
 tck/microprofile-tck/opentracing/pom.xml | 1 -
 2 files changed, 5 insertions(+), 2 deletions(-)
----------------------------------------------------------------------



[06/12] tomee git commit: Expose resource adapter and other resources, read-only, via JMX

Posted by jg...@apache.org.
Expose resource adapter and other resources, read-only, via JMX


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/c15931f2
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/c15931f2
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/c15931f2

Branch: refs/heads/master
Commit: c15931f2ad841709dbe98a994e99a6a1c05593a2
Parents: d18fbc0
Author: Jonathan Gallimore <jo...@jrg.me.uk>
Authored: Wed Sep 5 16:36:58 2018 +0100
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Wed Sep 5 16:36:58 2018 +0100

----------------------------------------------------------------------
 .../openejb/assembler/classic/Assembler.java    |  54 ++++---
 .../monitoring/ConnectionFactoryMonitor.java    |   2 -
 .../openejb/monitoring/MBeanPojoWrapper.java    | 162 +++++++++++++++++++
 3 files changed, 191 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/c15931f2/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
index 3b3d60f..1d45c08 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
@@ -178,11 +178,7 @@ import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.DefinitionException;
 import javax.enterprise.inject.spi.DeploymentException;
-import javax.management.InstanceNotFoundException;
-import javax.management.MBeanRegistrationException;
-import javax.management.MBeanServer;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
+import javax.management.*;
 import javax.naming.Binding;
 import javax.naming.Context;
 import javax.naming.InitialContext;
@@ -3238,6 +3234,7 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
             unset.remove("threadPoolSize");
             logUnusedProperties(unset, serviceInfo);
 
+            registerAsMBean(serviceInfo.id, "ResourceAdapter", resourceAdapter);
             service = new ResourceAdapterReference(resourceAdapter, threadPool, OPENEJB_RESOURCE_JNDI_PREFIX + serviceInfo.id);
         } else if (service instanceof ManagedConnectionFactory) {
             final ManagedConnectionFactory managedConnectionFactory = (ManagedConnectionFactory) service;
@@ -3279,25 +3276,7 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
             }
 
             final ConnectionFactoryMonitor cfm = new ConnectionFactoryMonitor(serviceInfo.id, connectionManager, txSupport);
-
-            final MBeanServer server = LocalMBeanServer.get();
-
-            final ObjectNameBuilder jmxName = new ObjectNameBuilder("openejb.management");
-            jmxName.set("J2EEServer", "openejb");
-            jmxName.set("J2EEApplication", null);
-            jmxName.set("j2eeType", "");
-            jmxName.set("name",serviceInfo.id);
-
-            // register the invocation stats interceptor
-            try {
-                final ObjectName objectName = jmxName.set("j2eeType", "ConnectionFactory").build();
-                if (server.isRegistered(objectName)) {
-                    server.unregisterMBean(objectName);
-                }
-                server.registerMBean(new ManagedMBean(cfm), objectName);
-            } catch (final Exception e) {
-                logger.error("Unable to register MBean ", e);
-            }
+            registerAsMBean(serviceInfo.id, "ConnectionFactory", new ManagedMBean(cfm));
 
             if (connectionManager == null) {
                 throw new OpenEJBRuntimeException(messages.format("assembler.invalidConnectionManager", serviceInfo.id));
@@ -3372,7 +3351,7 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
                 logUnusedProperties(serviceRecipe, serviceInfo);
             } // else wait post construct
 
-            // TODO: create something to expose the properties of the object readonly through JMX
+            registerAsMBean(serviceInfo.id, "Resource", service);
         }
 
         final ResourceCreated event = new ResourceCreated(service, serviceInfo.id);
@@ -3380,6 +3359,31 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
         return event.getReplacement() == null ? service : event.getReplacement();
     }
 
+    private void registerAsMBean(final String name, final String type, Object resource) {
+        final MBeanServer server = LocalMBeanServer.get();
+
+        final ObjectNameBuilder jmxName = new ObjectNameBuilder("openejb.management");
+        jmxName.set("J2EEServer", "openejb");
+        jmxName.set("J2EEApplication", null);
+        jmxName.set("j2eeType", "");
+        jmxName.set("name", name);
+
+        try {
+            final ObjectName objectName = jmxName.set("j2eeType", type).build();
+            if (server.isRegistered(objectName)) {
+                server.unregisterMBean(objectName);
+            }
+
+            if (DynamicMBean.class.isInstance(resource)) {
+                server.registerMBean(resource, objectName);
+            } else {
+                server.registerMBean(new MBeanPojoWrapper(name, resource), objectName);
+            }
+        } catch (final Exception e) {
+            logger.error("Unable to register MBean ", e);
+        }
+    }
+
     private void bindResource(final String id, final Object service, final boolean canReplace) throws OpenEJBException {
         final String name = OPENEJB_RESOURCE_JNDI_PREFIX + id;
         final Context jndiContext = containerSystem.getJNDIContext();

http://git-wip-us.apache.org/repos/asf/tomee/blob/c15931f2/container/openejb-core/src/main/java/org/apache/openejb/monitoring/ConnectionFactoryMonitor.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/monitoring/ConnectionFactoryMonitor.java b/container/openejb-core/src/main/java/org/apache/openejb/monitoring/ConnectionFactoryMonitor.java
index 2f57f89..3dad61f 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/monitoring/ConnectionFactoryMonitor.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/monitoring/ConnectionFactoryMonitor.java
@@ -86,8 +86,6 @@ public class ConnectionFactoryMonitor {
             return PartitionedPool.class.cast(pooling).isMatchAll();
         } else if (SinglePool.class.isInstance(pooling)) {
             return SinglePool.class.cast(pooling).isMatchAll();
-        } else if (NoPool.class.isInstance(pooling)) {
-            return false;
         } else {
             return false;
         }

http://git-wip-us.apache.org/repos/asf/tomee/blob/c15931f2/container/openejb-core/src/main/java/org/apache/openejb/monitoring/MBeanPojoWrapper.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/monitoring/MBeanPojoWrapper.java b/container/openejb-core/src/main/java/org/apache/openejb/monitoring/MBeanPojoWrapper.java
new file mode 100644
index 0000000..70367f86
--- /dev/null
+++ b/container/openejb-core/src/main/java/org/apache/openejb/monitoring/MBeanPojoWrapper.java
@@ -0,0 +1,162 @@
+package org.apache.openejb.monitoring;
+
+import org.apache.openejb.util.Duration;
+
+import javax.management.Attribute;
+import javax.management.AttributeList;
+import javax.management.AttributeNotFoundException;
+import javax.management.DynamicMBean;
+import javax.management.IntrospectionException;
+import javax.management.InvalidAttributeValueException;
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanException;
+import javax.management.MBeanInfo;
+import javax.management.MBeanNotificationInfo;
+import javax.management.MBeanOperationInfo;
+import javax.management.ReflectionException;
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/*
+ * This class attempts to wrap a given class by using Bean introspection to get a list of attributes.
+ * The intention of the MBean generated is to provide a read-only view of resources available in the server.
+ * At the present time, this wrapper does not provide write support for attributes, and does not support
+ * method invocation.
+ */
+public class MBeanPojoWrapper implements DynamicMBean {
+
+    private final Object delegate;
+    private final String name;
+    private MBeanInfo info;
+    private final Map<String, PropertyDescriptor> attributeMap = new HashMap<>();
+
+    private static final Set<Class<?>> SUPPORTED_PROPERTY_TYPES = new HashSet<Class<?>>() {
+        {
+            add(Integer.class);
+            add(Boolean.class);
+            add(Byte.class);
+            add(Short.class);
+            add(Float.class);
+            add(Long.class);
+            add(Double.class);
+            add(Integer.TYPE);
+            add(Boolean.TYPE);
+            add(Byte.TYPE);
+            add(Short.TYPE);
+            add(Float.TYPE);
+            add(Long.TYPE);
+            add(Double.TYPE);
+            add(String.class);
+            add(Duration.class);
+        }
+    };
+
+    public MBeanPojoWrapper(final String name, final Object delegate) {
+        this.name = name;
+        if (delegate == null) {
+            throw new NullPointerException("Delegate cannot be null");
+        }
+
+        this.delegate = delegate;
+        scan(delegate.getClass());
+    }
+
+    private void scan(Class clazz) {
+        final List<MBeanAttributeInfo> mBeanAttributeInfoList = new ArrayList<>();
+
+        try {
+            final BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
+
+            final PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
+
+            for (final PropertyDescriptor propertyDescriptor : propertyDescriptors) {
+                final String propertyName = propertyDescriptor.getName();
+                Class<?> propertyType = propertyDescriptor.getPropertyType();
+
+                if (! isSupported(propertyType)) {
+                    continue;
+                }
+
+                attributeMap.put(propertyName, propertyDescriptor);
+                try {
+                    mBeanAttributeInfoList.add(new MBeanAttributeInfo(propertyName, "", propertyDescriptor.getReadMethod(), null));
+                } catch (IntrospectionException e) {
+                    // no-op
+                }
+            }
+        } catch (java.beans.IntrospectionException e) {
+            // no-op
+        }
+
+        // default constructor is mandatory
+        info = new MBeanInfo(name,
+                "Auto-created by OpenEJB",
+                mBeanAttributeInfoList.toArray(new MBeanAttributeInfo[attributeMap.size()]),
+                null, // default constructor is mandatory
+                new MBeanOperationInfo[0],
+                new MBeanNotificationInfo[0]);
+    }
+
+    private static boolean isSupported(Class<?> type) {
+        return SUPPORTED_PROPERTY_TYPES.contains(type);
+    }
+
+
+    @Override
+    public Object getAttribute(final String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {
+        if (! attributeMap.containsKey(attribute)) {
+            throw new AttributeNotFoundException();
+        }
+
+        try {
+            return attributeMap.get(attribute).getReadMethod().invoke(delegate);
+        } catch (IllegalAccessException e) {
+            throw new MBeanException(e);
+        } catch (InvocationTargetException e) {
+            throw new MBeanException(e);
+        }
+    }
+
+    @Override
+    public void setAttribute(final Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException {
+        // no-op
+    }
+
+    @Override
+    public AttributeList getAttributes(final String[] attributes) {
+        final AttributeList list = new AttributeList();
+        for (final String attribute : attributes) {
+            try {
+                list.add(new Attribute(attribute, getAttribute(attribute)));
+            } catch (final Exception ignore) {
+                // no-op
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public AttributeList setAttributes(final AttributeList attributes) {
+        // no-op - not supported
+        return null;
+    }
+
+    @Override
+    public Object invoke(final String actionName, final Object[] params, final String[] signature) throws MBeanException, ReflectionException {
+        // no-op - not supported
+        return null;
+    }
+
+    @Override
+    public MBeanInfo getMBeanInfo() {
+        return info;
+    }
+}


[08/12] tomee git commit: Merge remote-tracking branch 'apache/master' into jmx-hacking

Posted by jg...@apache.org.
Merge remote-tracking branch 'apache/master' into jmx-hacking


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/3efcdf29
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/3efcdf29
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/3efcdf29

Branch: refs/heads/master
Commit: 3efcdf29fe69c87fb16cfcc583a88b484e664f0d
Parents: a79159f 6ba7fc5
Author: Jonathan Gallimore <jo...@jrg.me.uk>
Authored: Wed Sep 12 15:04:18 2018 +0100
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Wed Sep 12 15:04:18 2018 +0100

----------------------------------------------------------------------
 .../test/java/jug/rest/arquillian/SubjectServiceTomEETest.java | 5 +----
 .../org/apache/tomee/jul/handler/rotating/ArchivingTest.java   | 6 ------
 2 files changed, 1 insertion(+), 10 deletions(-)
----------------------------------------------------------------------



[02/12] tomee git commit: More TODO

Posted by jg...@apache.org.
More TODO


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/dcbdd8d0
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/dcbdd8d0
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/dcbdd8d0

Branch: refs/heads/master
Commit: dcbdd8d0db5a661ea4df87413bfda1179ab396be
Parents: e2879a9
Author: Jonathan Gallimore <jo...@jrg.me.uk>
Authored: Fri Aug 31 12:17:48 2018 +0100
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Fri Aug 31 12:17:48 2018 +0100

----------------------------------------------------------------------
 .../main/java/org/apache/openejb/assembler/classic/Assembler.java  | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/dcbdd8d0/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
index 7e5094b..91b3933 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
@@ -3326,6 +3326,8 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
             if (serviceInfo.unsetProperties == null || isTemplatizedResource(serviceInfo)) {
                 logUnusedProperties(serviceRecipe, serviceInfo);
             } // else wait post construct
+
+            // TODO: create something to expose the properties of the object readonly through JMX
         }
 
         final ResourceCreated event = new ResourceCreated(service, serviceInfo.id);


[10/12] tomee git commit: Cleanup JMX resources on destroy

Posted by jg...@apache.org.
Cleanup JMX resources on destroy


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/3d337273
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/3d337273
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/3d337273

Branch: refs/heads/master
Commit: 3d337273cb7fef328ce7cc4ca9fe2b369cae96c7
Parents: 612b7ab
Author: Jonathan Gallimore <jo...@jrg.me.uk>
Authored: Wed Sep 12 15:59:05 2018 +0100
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Wed Sep 12 15:59:05 2018 +0100

----------------------------------------------------------------------
 .../openejb/assembler/classic/Assembler.java    | 53 +++++++++++++-------
 .../assembler/classic/ResourcesJMXTest.java     |  4 +-
 2 files changed, 37 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/3d337273/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
index 1d45c08..396f632 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
@@ -2126,9 +2126,14 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
                     ExecutorService.class.cast(resourceAdapter.pool).shutdownNow();
                 }
                 resourceAdapter.ra.stop();
+
+                // remove associated JMX object
             } catch (final Throwable t) {
                 logger.fatal("ResourceAdapter Shutdown Failed: " + name, t);
             }
+
+            removeResourceMBean(name, "ResourceAdapter");
+
         } else if (object instanceof ResourceAdapter) {
             final ResourceAdapter resourceAdapter = (ResourceAdapter) object;
             try {
@@ -2142,6 +2147,9 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
             } catch (final Throwable t) {
                 logger.fatal("ResourceAdapter Shutdown Failed: " + name, t);
             }
+
+            removeResourceMBean(name, "ResourceAdapter");
+
         } else if (DataSourceFactory.knows(object)) {
             logger.info("Closing DataSource: " + name);
 
@@ -2161,22 +2169,7 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
                 logger.debug("Not processing resource on destroy: " + className, e);
             }
 
-            // remove associated JMX object
-            final ObjectNameBuilder jmxName = new ObjectNameBuilder("openejb.management");
-            jmxName.set("J2EEServer", "openejb");
-            jmxName.set("J2EEApplication", null);
-            jmxName.set("j2eeType", "");
-            jmxName.set("name",name);
-
-            final MBeanServer server = LocalMBeanServer.get();
-            try {
-                final ObjectName objectName = jmxName.set("j2eeType", "ConnectionFactory").build();
-                if (server.isRegistered(objectName)) {
-                    server.unregisterMBean(objectName);
-                }
-            } catch (final Exception e) {
-                logger.error("Unable to unregister MBean ", e);
-            }
+            removeResourceMBean(name, "ConnectionFactory");
 
         } else if (DestroyableResource.class.isInstance(object)) {
             try {
@@ -2184,8 +2177,32 @@ public class Assembler extends AssemblerTool implements org.apache.openejb.spi.A
             } catch (final RuntimeException e) {
                 logger.error(e.getMessage(), e);
             }
-        } else if (logger.isDebugEnabled() && !DataSource.class.isInstance(object)) {
-            logger.debug("Not processing resource on destroy: " + className);
+
+            removeResourceMBean(name, "Resource");
+        } else if (!DataSource.class.isInstance(object)) {
+            removeResourceMBean(name, "Resource");
+
+            if (logger.isDebugEnabled()) {
+                logger.debug("Not processing resource on destroy: " + className);
+            }
+        }
+    }
+
+    private void removeResourceMBean(String name, String type) {
+        final ObjectNameBuilder jmxName = new ObjectNameBuilder("openejb.management");
+        jmxName.set("J2EEServer", "openejb");
+        jmxName.set("J2EEApplication", null);
+        jmxName.set("j2eeType", "");
+        jmxName.set("name",name);
+
+        final MBeanServer server = LocalMBeanServer.get();
+        try {
+            final ObjectName objectName = jmxName.set("j2eeType", type).build();
+            if (server.isRegistered(objectName)) {
+                server.unregisterMBean(objectName);
+            }
+        } catch (final Exception e) {
+            logger.error("Unable to unregister MBean ", e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/tomee/blob/3d337273/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/ResourcesJMXTest.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/ResourcesJMXTest.java b/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/ResourcesJMXTest.java
index 15c86a5..6b81600 100644
--- a/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/ResourcesJMXTest.java
+++ b/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/ResourcesJMXTest.java
@@ -62,7 +62,7 @@ public class ResourcesJMXTest extends TestCase {
 
         final ResourceInfo testResource = new ResourceInfo();
         testResource.id = "testResource";
-        testResource.className = FakeResouce.class.getName();
+        testResource.className = FakeResource.class.getName();
 
         final Properties p = new Properties();
         p.put("host", "localhost");
@@ -151,7 +151,7 @@ public class ResourcesJMXTest extends TestCase {
         }
     }
 
-    public static class FakeResouce {
+    public static class FakeResource {
         private String host;
         private int port;
         private String parameter;