You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@tomee.apache.org by bu...@apache.org on 2012/03/09 19:27:01 UTC

svn commit: r808012 - in /websites/staging/openejb/trunk: cgi-bin/ content/ content/examples-trunk/polling-parent/polling-core/src/main/java/jug/dao/ content/examples-trunk/polling-parent/polling-domain/src/main/java/jug/domain/ content/examples-trunk/...

Author: buildbot
Date: Fri Mar  9 18:27:00 2012
New Revision: 808012

Log:
Staging update by buildbot for openejb

Added:
    websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/routing/
    websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/routing/DataSourceInitializer.java
    websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/routing/PollingRouter.java
    websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/routing/RoutingFilter.java
    websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/resources/META-INF/jug.polling/
    websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/resources/META-INF/jug.polling/service-jar.xml
Modified:
    websites/staging/openejb/trunk/cgi-bin/   (props changed)
    websites/staging/openejb/trunk/content/   (props changed)
    websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-core/src/main/java/jug/dao/SubjectDao.java
    websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-core/src/main/java/jug/dao/VoteDao.java
    websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-domain/src/main/java/jug/domain/Subject.java
    websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-domain/src/main/resources/META-INF/persistence.xml
    websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/rest/SubjectService.java
    websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/resources/META-INF/resources.xml
    websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/test/java/jug/rest/SubjectServiceTest.java
    websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/test/java/jug/rest/arquillian/SubjectServiceTomEETest.java

Propchange: websites/staging/openejb/trunk/cgi-bin/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Fri Mar  9 18:27:00 2012
@@ -1 +1 @@
-1298814
+1298962

Propchange: websites/staging/openejb/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Fri Mar  9 18:27:00 2012
@@ -1 +1 @@
-1298814
+1298962

Modified: websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-core/src/main/java/jug/dao/SubjectDao.java
==============================================================================
--- websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-core/src/main/java/jug/dao/SubjectDao.java (original)
+++ websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-core/src/main/java/jug/dao/SubjectDao.java Fri Mar  9 18:27:00 2012
@@ -14,7 +14,7 @@ import java.util.Collection;
 @Singleton
 @Lock(LockType.READ)
 public class SubjectDao {
-    @PersistenceContext
+    @PersistenceContext(unitName = "polling")
     private EntityManager em;
 
     public Subject create(final String name, final String question) {

Modified: websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-core/src/main/java/jug/dao/VoteDao.java
==============================================================================
--- websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-core/src/main/java/jug/dao/VoteDao.java (original)
+++ websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-core/src/main/java/jug/dao/VoteDao.java Fri Mar  9 18:27:00 2012
@@ -12,7 +12,7 @@ import javax.persistence.PersistenceCont
 @Singleton
 @Lock(LockType.READ)
 public class VoteDao {
-    @PersistenceContext
+    @PersistenceContext(unitName = "polling")
     private EntityManager em;
 
     public Vote create(final Value voteValue) {

Modified: websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-domain/src/main/java/jug/domain/Subject.java
==============================================================================
--- websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-domain/src/main/java/jug/domain/Subject.java (original)
+++ websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-domain/src/main/java/jug/domain/Subject.java Fri Mar  9 18:27:00 2012
@@ -3,6 +3,7 @@ package jug.domain;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;

Modified: websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-domain/src/main/resources/META-INF/persistence.xml
==============================================================================
Binary files - no diff available.

Modified: websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/rest/SubjectService.java
==============================================================================
--- websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/rest/SubjectService.java (original)
+++ websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/rest/SubjectService.java Fri Mar  9 18:27:00 2012
@@ -48,7 +48,7 @@ public class SubjectService {
     @Path("create")
     public Subject create(final String question, @QueryParam("name") final String name) {
         if (blackList.contains(name)) {
-            throw new IllegalArgumentException("name blaclisted");
+            throw new IllegalArgumentException("name blacklisted");
         }
 
         final Subject subject = dao.create(name, question);

Added: websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/routing/DataSourceInitializer.java
==============================================================================
--- websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/routing/DataSourceInitializer.java (added)
+++ websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/routing/DataSourceInitializer.java Fri Mar  9 18:27:00 2012
@@ -0,0 +1,31 @@
+package jug.routing;
+
+import jug.domain.Subject;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+// hack for OpenJPA
+// it initializes lazily datasource (buildSchema) so simply call it here
+// for hibernate it works without this hack
+@ApplicationScoped
+public class DataSourceInitializer {
+    @PersistenceContext(unitName = "client1")
+    private EntityManager client1;
+
+    @PersistenceContext(unitName = "client2")
+    private EntityManager client2;
+
+    private boolean invoked = false;
+
+    public void init() {
+        if (invoked) {
+            return;
+        }
+
+        client1.find(Subject.class, 0);
+        client2.find(Subject.class, 0);
+        invoked = true;
+    }
+}

Added: websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/routing/PollingRouter.java
==============================================================================
--- websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/routing/PollingRouter.java (added)
+++ websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/routing/PollingRouter.java Fri Mar  9 18:27:00 2012
@@ -0,0 +1,63 @@
+package jug.routing;
+
+import org.apache.openejb.resource.jdbc.AbstractRouter;
+
+import javax.naming.NamingException;
+import javax.sql.DataSource;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+
+public class PollingRouter extends AbstractRouter {
+    private static final Logger LOGGER = Logger.getLogger(PollingRouter.class.getName());
+
+    private Map<String, DataSource> dataSources = null;
+    private ThreadLocal<DataSource> currentDataSource = new ThreadLocal<DataSource>() {
+        @Override
+        public DataSource initialValue() {
+            return dataSources.get("jdbc/client1");
+        }
+    };
+
+    private void init() {
+        dataSources = new HashMap<String, DataSource>();
+        for (String ds : Arrays.asList("jdbc/client1", "jdbc/client2")) {
+            try {
+                final Object o = getOpenEJBResource(ds);
+                if (o instanceof DataSource) {
+                    dataSources.put(ds, DataSource.class.cast(o));
+                }
+            } catch (NamingException e) {
+                // ignored
+            }
+        }
+    }
+
+    @Override
+    public DataSource getDataSource() {
+        if (dataSources == null) {
+            init();
+        }
+        final DataSource ds = currentDataSource.get();
+        LOGGER.info("using ds " + ds);
+        return ds;
+    }
+
+    public void setDataSource(final String client) {
+        if (dataSources == null) {
+            init();
+        }
+
+        final String datasourceName = "jdbc/" + client;
+        if (!dataSources.containsKey(datasourceName)) {
+            throw new IllegalArgumentException("data source called " + datasourceName + " can't be found.");
+        }
+        final DataSource ds = dataSources.get(datasourceName);
+        currentDataSource.set(ds);
+    }
+
+    public void clear() {
+        currentDataSource.remove();
+    }
+}

Added: websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/routing/RoutingFilter.java
==============================================================================
--- websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/routing/RoutingFilter.java (added)
+++ websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/java/jug/routing/RoutingFilter.java Fri Mar  9 18:27:00 2012
@@ -0,0 +1,52 @@
+package jug.routing;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.annotation.WebFilter;
+import java.io.IOException;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Logger;
+
+@WebFilter(displayName = "routing-filter", urlPatterns = { "/*" })
+public class RoutingFilter implements Filter {
+    private static final Logger LOGGER = Logger.getLogger(RoutingFilter.class.getName());
+    private static final AtomicInteger COUNTER = new AtomicInteger();
+
+    @Resource(name = "ClientRouter", type = PollingRouter.class)
+    private PollingRouter router;
+
+    @Inject
+    private DataSourceInitializer init;
+
+    @Override
+    public void init(final FilterConfig filterConfig) throws ServletException {
+        init.init();
+    }
+
+    @Override
+    public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {
+        final String client = getClient();
+        LOGGER.info("using client " + client);
+        router.setDataSource(client);
+        try {
+            filterChain.doFilter(servletRequest, servletResponse);
+        } finally {
+            router.clear();
+        }
+    }
+
+    private String getClient() {
+        return "client" +  (1 + COUNTER.getAndIncrement() % 2); // 2 clients
+    }
+
+    @Override
+    public void destroy() {
+        // no-op
+    }
+}

Added: websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/resources/META-INF/jug.polling/service-jar.xml
==============================================================================
--- websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/resources/META-INF/jug.polling/service-jar.xml (added)
+++ websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/resources/META-INF/jug.polling/service-jar.xml Fri Mar  9 18:27:00 2012
@@ -0,0 +1,4 @@
+<ServiceJar>
+  <ServiceProvider id="PollingRouter"
+      service="Resource" type="org.apache.openejb.resource.jdbc.Router" class-name="jug.routing.PollingRouter" />
+</ServiceJar>

Modified: websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/resources/META-INF/resources.xml
==============================================================================
--- websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/resources/META-INF/resources.xml (original)
+++ websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/main/resources/META-INF/resources.xml Fri Mar  9 18:27:00 2012
@@ -1,22 +1,46 @@
 <resources>
-  <Resource id="jdbc/polling" type="javax.sql.DataSource">
+  <!-- router -->
+  <Resource id="ClientRouter" type="jug.routing.PollingRouter" provider="jug.polling:PollingRouter" />
+
+  <!-- routed datasources -->
+  <Resource id="jdbc/polling" provider="RoutedDataSource" type="javax.sql.DataSource">
+    Router = ClientRouter
+  </Resource>
+
+  <!-- real datasources -->
+  <Resource id="jdbc/client1" type="javax.sql.DataSource">
     JdbcDriver org.hsqldb.jdbcDriver
-    JdbcUrl jdbc:hsqldb:mem:polling
+    JdbcUrl jdbc:hsqldb:mem:client1
     UserName sa
     Password
     JtaManaged true
   </Resource>
 
+  <Resource id="jdbc/client1-non-jta" type="javax.sql.DataSource">
+    JdbcDriver org.hsqldb.jdbcDriver
+    JdbcUrl jdbc:hsqldb:mem:client1
+    UserName sa
+    Password
+    JtaManaged false
+  </Resource>
+
+  <Resource id="jdbc/client2" type="javax.sql.DataSource">
+    JdbcDriver org.hsqldb.jdbcDriver
+    JdbcUrl jdbc:hsqldb:mem:client2
+    UserName sa
+    Password
+    JtaManaged true
+  </Resource>
 
-  <Resource id="jdbc/polling-non-jta" type="javax.sql.DataSource">
+  <Resource id="jdbc/client2-non-jta" type="javax.sql.DataSource">
     JdbcDriver org.hsqldb.jdbcDriver
-    JdbcUrl jdbc:hsqldb:mem:polling
+    JdbcUrl jdbc:hsqldb:mem:client2
     UserName sa
     Password
     JtaManaged false
   </Resource>
 
-  <!--
+  <!-- for remote ejb injection
   <Resource id="middle-server" type="org.apache.openejb.config.sys.JndiProvider">
     java.naming.factory.initial = org.apache.openejb.client.RemoteInitialContextFactory
     java.naming.provider.url = failover:ejb://192.168.1.20:4201,ejbd://192.168.1.30:4201

Modified: websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/test/java/jug/rest/SubjectServiceTest.java
==============================================================================
--- websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/test/java/jug/rest/SubjectServiceTest.java (original)
+++ websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/test/java/jug/rest/SubjectServiceTest.java Fri Mar  9 18:27:00 2012
@@ -1,5 +1,7 @@
 package jug.rest;
 
+import jug.routing.DataSourceInitializer;
+import jug.routing.PollingRouter;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.openejb.OpenEjbContainer;
 import org.apache.openejb.loader.IO;
@@ -8,7 +10,9 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import javax.annotation.Resource;
 import javax.ejb.embeddable.EJBContainer;
+import javax.inject.Inject;
 import javax.naming.NamingException;
 import javax.ws.rs.core.Response;
 import java.io.IOException;
@@ -20,6 +24,12 @@ import static org.junit.Assert.assertTru
 public class SubjectServiceTest {
     private static EJBContainer container;
 
+    @Inject
+    private DataSourceInitializer init;
+
+    @Resource(name = "ClientRouter", type = PollingRouter.class)
+    private PollingRouter router;
+
     @BeforeClass
     public static void start() {
         final Properties properties = new Properties();
@@ -31,6 +41,7 @@ public class SubjectServiceTest {
     @Before
     public void inject() throws NamingException {
         container.getContext().bind("inject", this);
+        init.init();
     }
 
     @AfterClass
@@ -45,6 +56,7 @@ public class SubjectServiceTest {
                                     .accept("application/json")
                                     .query("name", "TOMEE_JUG_JSON")
                                     .post("was it cool?");
-        assertTrue(IO.slurp((InputStream) response.getEntity()).contains("TOMEE_JUG_JSON"));
+        final String output = IO.slurp((InputStream) response.getEntity());
+        assertTrue("output doesn't contain TOMEE_JUG_JSON '" + output + "'", output.contains("TOMEE_JUG_JSON"));
     }
 }

Modified: websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/test/java/jug/rest/arquillian/SubjectServiceTomEETest.java
==============================================================================
--- websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/test/java/jug/rest/arquillian/SubjectServiceTomEETest.java (original)
+++ websites/staging/openejb/trunk/content/examples-trunk/polling-parent/polling-web/src/test/java/jug/rest/arquillian/SubjectServiceTomEETest.java Fri Mar  9 18:27:00 2012
@@ -4,6 +4,7 @@ import jug.dao.SubjectDao;
 import jug.domain.Subject;
 import jug.monitoring.VoteCounter;
 import jug.rest.SubjectService;
+import jug.routing.PollingRouter;
 import org.apache.commons.io.IOUtils;
 import org.apache.ziplock.JarLocation;
 import org.apache.ziplock.WebModule;
@@ -32,6 +33,7 @@ public class SubjectServiceTomEETest {
                 .addAsWebInfResource(new ClassLoaderAsset("META-INF/persistence.xml"), "persistence.xml")
                 .addAsWebInfResource(new ClassLoaderAsset("META-INF/env-entries.properties"), "env-entries.properties")
                 .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")
+                .addPackage(PollingRouter.class.getPackage()) // core
                 .addPackage(SubjectDao.class.getPackage()) // core
                 .addPackage(SubjectService.class.getPackage()) // front
                 .addAsLibrary(JarLocation.jarLocation(IOUtils.class)) // helper for client test