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