You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2018/11/30 22:27:01 UTC
[17/34] tomee-site-generator git commit: Remove out-dated examples
They are now pulled in dynamically
http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/efed31f4/src/main/jbake/content/examples/dynamic-dao-implementation.adoc
----------------------------------------------------------------------
diff --git a/src/main/jbake/content/examples/dynamic-dao-implementation.adoc b/src/main/jbake/content/examples/dynamic-dao-implementation.adoc
deleted file mode 100755
index 40b7a96..0000000
--- a/src/main/jbake/content/examples/dynamic-dao-implementation.adoc
+++ /dev/null
@@ -1,384 +0,0 @@
-= Dynamic DAO Implementation
-:jbake-date: 2016-09-06
-:jbake-type: page
-:jbake-tomeepdf:
-:jbake-status: published
-
-Example dynamic-dao-implementation can be browsed at https://github.com/apache/tomee/tree/master/examples/dynamic-dao-implementation
-
-
-Many aspects of Data Access Objects (DAOs) are very repetitive and boiler plate. As a fun and experimental feature, TomEE supports dynamically implementing an interface
-that is seen to have standard DAO-style methods.
-
-The interface has to be annotated with @PersistenceContext to define which EntityManager to use.
-
-Methods should respect these conventions:
-
- * void save(Foo foo): persist foo
- * Foo update(Foo foo): merge foo
- * void delete(Foo foo): remove foo, if foo is detached it tries to attach it
- * Collection<Foo>|Foo namedQuery(String name[, Map<String, ?> params, int first, int max]): run the named query called name, params contains bindings, first and max are used for magination. Last three parameters are optionnals
- * Collection<Foo>|Foo nativeQuery(String name[, Map<String, ?> params, int first, int max]): run the native query called name, params contains bindings, first and max are used for magination. Last three parameters are optionnals
- * Collection<Foo>|Foo query(String value [, Map<String, ?> params, int first, int max]): run the query put as first parameter, params contains bindings, first and max are used for magination. Last three parameters are optionnals
- * Collection<Foo> findAll([int first, int max]): find all Foo, parameters are used for pagination
- * Collection<Foo> findByBar1AndBar2AndBar3(<bar 1 type> bar1, <bar 2 type> bar2, <bar3 type> bar3 [, int first, int max]): find all Foo with specified field values for bar1, bar2, bar3.
-
-Dynamic finder can have as much as you want field constraints. For String like is used and for other type equals is used.
-
-= Example
-
-== User
-
-
-[source,java]
-----
-package org.superbiz.dynamic;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-
-@Entity
-@NamedQueries({
- @NamedQuery(name = "dynamic-ejb-impl-test.query", query = "SELECT u FROM User AS u WHERE u.name LIKE :name"),
- @NamedQuery(name = "dynamic-ejb-impl-test.all", query = "SELECT u FROM User AS u")
-})
-public class User {
- @Id
- @GeneratedValue
- private long id;
- private String name;
- private int age;
-
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-}
-----
-
-
-== UserDao
-
-
-[source,java]
-----
-package org.superbiz.dynamic;
-
-
-import javax.ejb.Stateless;
-import javax.persistence.PersistenceContext;
-import java.util.Collection;
-import java.util.Map;
-
-@Stateless
-@PersistenceContext(name = "dynamic")
-public interface UserDao {
- User findById(long id);
-
- Collection<User> findByName(String name);
-
- Collection<User> findByNameAndAge(String name, int age);
-
- Collection<User> findAll();
-
- Collection<User> findAll(int first, int max);
-
- Collection<User> namedQuery(String name, Map<String, ?> params, int first, int max);
-
- Collection<User> namedQuery(String name, int first, int max, Map<String, ?> params);
-
- Collection<User> namedQuery(String name, Map<String, ?> params);
-
- Collection<User> namedQuery(String name);
-
- Collection<User> query(String value, Map<String, ?> params);
-
- void save(User u);
-
- void delete(User u);
-
- User update(User u);
-}
-----
-
-
-== persistence.xml
-
-
-[source,xml]
-----
-<persistence version="2.0"
- xmlns="http://java.sun.com/xml/ns/persistence"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="
- http://java.sun.com/xml/ns/persistence
- http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
- <persistence-unit name="dynamic" transaction-type="JTA">
- <jta-data-source>jdbc/dynamicDB</jta-data-source>
- <class>org.superbiz.dynamic.User</class>
- <properties>
- <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
- </properties>
- </persistence-unit>
-</persistence>
-----
-
-
-
-== DynamicUserDaoTest
-
-
-[source,java]
-----
-package org.superbiz.dynamic;
-
-import junit.framework.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import javax.ejb.EJBException;
-import javax.ejb.Stateless;
-import javax.ejb.embeddable.EJBContainer;
-import javax.naming.Context;
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertTrue;
-
-public class DynamicUserDaoTest {
- private static UserDao dao;
- private static Util util;
-
- @BeforeClass
- public static void init() throws Exception {
- final Properties p = new Properties();
- p.put("jdbc/dynamicDB", "new://Resource?type=DataSource");
- p.put("jdbc/dynamicDB.JdbcDriver", "org.hsqldb.jdbcDriver");
- p.put("jdbc/dynamicDB.JdbcUrl", "jdbc:hsqldb:mem:moviedb");
- p.put("jdbc/dynamicDB.UserName", "sa");
- p.put("jdbc/dynamicDB.Password", "");
-
- final Context context = EJBContainer.createEJBContainer(p).getContext();
- dao = (UserDao) context.lookup("java:global/dynamic-dao-implementation/UserDao");
- util = (Util) context.lookup("java:global/dynamic-dao-implementation/Util");
-
- util.init(); // init database
- }
-
- @Test
- public void simple() {
- User user = dao.findById(1);
- assertNotNull(user);
- assertEquals(1, user.getId());
- }
-
- @Test
- public void findAll() {
- Collection<User> users = dao.findAll();
- assertEquals(10, users.size());
- }
-
- @Test
- public void pagination() {
- Collection<User> users = dao.findAll(0, 5);
- assertEquals(5, users.size());
-
- users = dao.findAll(6, 1);
- assertEquals(1, users.size());
- assertEquals(7, users.iterator().next().getId());
- }
-
- @Test
- public void persist() {
- User u = new User();
- dao.save(u);
- assertNotNull(u.getId());
- util.remove(u);
- }
-
- @Test
- public void remove() {
- User u = new User();
- dao.save(u);
- assertNotNull(u.getId());
- dao.delete(u);
- try {
- dao.findById(u.getId());
- Assert.fail();
- } catch (EJBException ee) {
- assertTrue(ee.getCause() instanceof NoResultException);
- }
- }
-
- @Test
- public void merge() {
- User u = new User();
- u.setAge(1);
- dao.save(u);
- assertEquals(1, u.getAge());
- assertNotNull(u.getId());
-
- u.setAge(2);
- dao.update(u);
- assertEquals(2, u.getAge());
-
- dao.delete(u);
- }
-
- @Test
- public void oneCriteria() {
- Collection<User> users = dao.findByName("foo");
- assertEquals(4, users.size());
- for (User user : users) {
- assertEquals("foo", user.getName());
- }
- }
-
- @Test
- public void twoCriteria() {
- Collection<User> users = dao.findByNameAndAge("bar-1", 1);
- assertEquals(1, users.size());
-
- User user = users.iterator().next();
- assertEquals("bar-1", user.getName());
- assertEquals(1, user.getAge());
- }
-
- @Test
- public void query() {
- Map<String, Object> params = new HashMap<String, Object>();
- params.put("name", "foo");
-
- Collection<User> users = dao.namedQuery("dynamic-ejb-impl-test.query", params, 0, 100);
- assertEquals(4, users.size());
-
- users = dao.namedQuery("dynamic-ejb-impl-test.query", params);
- assertEquals(4, users.size());
-
- users = dao.namedQuery("dynamic-ejb-impl-test.query", params, 0, 2);
- assertEquals(2, users.size());
-
- users = dao.namedQuery("dynamic-ejb-impl-test.query", 0, 2, params);
- assertEquals(2, users.size());
-
- users = dao.namedQuery("dynamic-ejb-impl-test.all");
- assertEquals(10, users.size());
-
- params.remove("name");
- params.put("age", 1);
- users = dao.query("SELECT u FROM User AS u WHERE u.age = :age", params);
- assertEquals(3, users.size());
- }
-
- @Stateless
- public static class Util {
- @PersistenceContext
- private EntityManager em;
-
- public void remove(User o) {
- em.remove(em.find(User.class, o.getId()));
- }
-
- public void init() {
- for (int i = 0; i < 10; i++) {
- User u = new User();
- u.setAge(i % 4);
- if (i % 3 == 0) {
- u.setName("foo");
- } else {
- u.setName("bar-" + i);
- }
- em.persist(u);
- }
- }
- }
-}
-----
-
-
-= Running
-
-
-
-[source]
-----
--------------------------------------------------------
- T E S T S
--------------------------------------------------------
-Running org.superbiz.dynamic.DynamicUserDaoTest
-Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06
-http://tomee.apache.org/
-INFO - openejb.home = /Users/dblevins/examples/dynamic-dao-implementation
-INFO - openejb.base = /Users/dblevins/examples/dynamic-dao-implementation
-INFO - Using 'javax.ejb.embeddable.EJBContainer=true'
-INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
-INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
-INFO - Configuring Service(id=jdbc/dynamicDB, type=Resource, provider-id=Default JDBC Database)
-INFO - Found EjbModule in classpath: /Users/dblevins/examples/dynamic-dao-implementation/target/classes
-INFO - Found EjbModule in classpath: /Users/dblevins/examples/dynamic-dao-implementation/target/test-classes
-INFO - Beginning load: /Users/dblevins/examples/dynamic-dao-implementation/target/classes
-INFO - Beginning load: /Users/dblevins/examples/dynamic-dao-implementation/target/test-classes
-INFO - Configuring enterprise application: /Users/dblevins/examples/dynamic-dao-implementation
-INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container)
-INFO - Auto-creating a container for bean UserDao: Container(type=STATELESS, id=Default Stateless Container)
-INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
-INFO - Auto-creating a container for bean org.superbiz.dynamic.DynamicUserDaoTest: Container(type=MANAGED, id=Default Managed Container)
-INFO - Configuring PersistenceUnit(name=dynamic)
-INFO - Auto-creating a Resource with id 'jdbc/dynamicDBNonJta' of type 'DataSource for 'dynamic'.
-INFO - Configuring Service(id=jdbc/dynamicDBNonJta, type=Resource, provider-id=jdbc/dynamicDB)
-INFO - Adjusting PersistenceUnit dynamic <non-jta-data-source> to Resource ID 'jdbc/dynamicDBNonJta' from 'null'
-INFO - Enterprise application "/Users/dblevins/examples/dynamic-dao-implementation" loaded.
-INFO - Assembling app: /Users/dblevins/examples/dynamic-dao-implementation
-INFO - PersistenceUnit(name=dynamic, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 417ms
-INFO - Jndi(name="java:global/dynamic-dao-implementation/UserDao!org.superbiz.dynamic.UserDao")
-INFO - Jndi(name="java:global/dynamic-dao-implementation/UserDao")
-INFO - Jndi(name="java:global/dynamic-dao-implementation/Util!org.superbiz.dynamic.DynamicUserDaoTest$Util")
-INFO - Jndi(name="java:global/dynamic-dao-implementation/Util")
-INFO - Jndi(name="java:global/EjbModule346613126/org.superbiz.dynamic.DynamicUserDaoTest!org.superbiz.dynamic.DynamicUserDaoTest")
-INFO - Jndi(name="java:global/EjbModule346613126/org.superbiz.dynamic.DynamicUserDaoTest")
-INFO - Created Ejb(deployment-id=UserDao, ejb-name=UserDao, container=Default Stateless Container)
-INFO - Created Ejb(deployment-id=Util, ejb-name=Util, container=Default Stateless Container)
-INFO - Created Ejb(deployment-id=org.superbiz.dynamic.DynamicUserDaoTest, ejb-name=org.superbiz.dynamic.DynamicUserDaoTest, container=Default Managed Container)
-INFO - Started Ejb(deployment-id=UserDao, ejb-name=UserDao, container=Default Stateless Container)
-INFO - Started Ejb(deployment-id=Util, ejb-name=Util, container=Default Stateless Container)
-INFO - Started Ejb(deployment-id=org.superbiz.dynamic.DynamicUserDaoTest, ejb-name=org.superbiz.dynamic.DynamicUserDaoTest, container=Default Managed Container)
-INFO - Deployed Application(path=/Users/dblevins/examples/dynamic-dao-implementation)
-WARN - Meta class "org.superbiz.dynamic.User_" for entity class org.superbiz.dynamic.User can not be registered with following exception "java.security.PrivilegedActionException: java.lang.ClassNotFoundException: org.superbiz.dynamic.User_"
-WARN - Query "SELECT u FROM User AS u WHERE u.name LIKE :name" is removed from cache excluded permanently. Query "SELECT u FROM User AS u WHERE u.name LIKE :name" is not cached because it uses pagination..
-Tests run: 9, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.471 sec
-
-Results :
-
-Tests run: 9, Failures: 0, Errors: 0, Skipped: 0
-----
-
-
http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/efed31f4/src/main/jbake/content/examples/dynamic-datasource-routing.adoc
----------------------------------------------------------------------
diff --git a/src/main/jbake/content/examples/dynamic-datasource-routing.adoc b/src/main/jbake/content/examples/dynamic-datasource-routing.adoc
deleted file mode 100755
index 8b7a76e..0000000
--- a/src/main/jbake/content/examples/dynamic-datasource-routing.adoc
+++ /dev/null
@@ -1,473 +0,0 @@
-= Dynamic Datasource Routing
-:jbake-date: 2016-09-06
-:jbake-type: page
-:jbake-tomeepdf:
-:jbake-status: published
-
-Example dynamic-datasource-routing can be browsed at https://github.com/apache/tomee/tree/master/examples/dynamic-datasource-routing
-
-
-The TomEE dynamic datasource api aims to allow to use multiple data sources as one from an application point of view.
-
-It can be useful for technical reasons (load balancing for example) or more generally
-functionnal reasons (filtering, aggregation, enriching...). However please note you can choose
-only one datasource by transaction. It means the goal of this feature is not to switch more than
-once of datasource in a transaction. The following code will not work:
-
-
-[source,java]
-----
-@Stateless
-public class MyEJB {
- @Resource private MyRouter router;
- @PersistenceContext private EntityManager em;
-
- public void workWithDataSources() {
- router.setDataSource("ds1");
- em.persist(new MyEntity());
-
- router.setDataSource("ds2"); // same transaction -> this invocation doesn't work
- em.persist(new MyEntity());
- }
-}
-----
-
-
-In this example the implementation simply use a datasource from its name and needs to be set before using any JPA
-operation in the transaction (to keep the logic simple in the example).
-
-= The implementation of the Router
-
-Our router has two configuration parameters:
-* a list of jndi names representing datasources to use
-* a default datasource to use
-
-== Router implementation
-
-The interface Router (`org.apache.openejb.resource.jdbc.Router`) has only one method to implement, `public DataSource getDataSource()`
-
-Our `DeterminedRouter` implementation uses a ThreadLocal to manage the currently used datasource. Keep in mind JPA used more than once the getDatasource() method
-for one operation. To change the datasource in one transaction is dangerous and should be avoid.
-
-
-[source,java]
-----
-package org.superbiz.dynamicdatasourcerouting;
-
-import org.apache.openejb.resource.jdbc.AbstractRouter;
-
-import javax.naming.NamingException;
-import javax.sql.DataSource;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-public class DeterminedRouter extends AbstractRouter {
- private String dataSourceNames;
- private String defaultDataSourceName;
- private Map<String, DataSource> dataSources = null;
- private ThreadLocal<DataSource> currentDataSource = new ThreadLocal<DataSource>();
-
- /**
- * @param datasourceList datasource resource name, separator is a space
- */
- public void setDataSourceNames(String datasourceList) {
- dataSourceNames = datasourceList;
- }
-
- /**
- * lookup datasource in openejb resources
- */
- private void init() {
- dataSources = new ConcurrentHashMap<String, DataSource>();
- for (String ds : dataSourceNames.split(" ")) {
- try {
- Object o = getOpenEJBResource(ds);
- if (o instanceof DataSource) {
- dataSources.put(ds, DataSource.class.cast(o));
- }
- } catch (NamingException e) {
- // ignored
- }
- }
- }
-
- /**
- * @return the user selected data source if it is set
- * or the default one
- * @throws IllegalArgumentException if the data source is not found
- */
- @Override
- public DataSource getDataSource() {
- // lazy init of routed datasources
- if (dataSources == null) {
- init();
- }
-
- // if no datasource is selected use the default one
- if (currentDataSource.get() == null) {
- if (dataSources.containsKey(defaultDataSourceName)) {
- return dataSources.get(defaultDataSourceName);
-
- } else {
- throw new IllegalArgumentException("you have to specify at least one datasource");
- }
- }
-
- // the developper set the datasource to use
- return currentDataSource.get();
- }
-
- /**
- *
- * @param datasourceName data source name
- */
- public void setDataSource(String datasourceName) {
- if (dataSources == null) {
- init();
- }
- if (!dataSources.containsKey(datasourceName)) {
- throw new IllegalArgumentException("data source called " + datasourceName + " can't be found.");
- }
- DataSource ds = dataSources.get(datasourceName);
- currentDataSource.set(ds);
- }
-
- /**
- * reset the data source
- */
- public void clear() {
- currentDataSource.remove();
- }
-
- public void setDefaultDataSourceName(String name) {
- this.defaultDataSourceName = name;
- }
-}
-----
-
-
-== Declaring the implementation
-
-To be able to use your router as a resource you need to provide a service configuration. It is done in a file
-you can find in META-INF/org.router/ and called service-jar.xml
-(for your implementation you can of course change the package name).
-
-It contains the following code:
-
-
-[source,xml]
-----
-<ServiceJar>
- <ServiceProvider id="DeterminedRouter" <!-- the name you want to use -->
- service="Resource"
- type="org.apache.openejb.resource.jdbc.Router"
- class-name="org.superbiz.dynamicdatasourcerouting.DeterminedRouter"> <!-- implementation class -->
-
- # the parameters
-
- DataSourceNames
- DefaultDataSourceName
- </ServiceProvider>
-</ServiceJar>
-----
-
-
-
-= Using the Router
-
-Here we have a `RoutedPersister` stateless bean which uses our `DeterminedRouter`
-
-
-[source,java]
-----
-package org.superbiz.dynamicdatasourcerouting;
-
-import javax.annotation.Resource;
-import javax.ejb.Stateless;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-
-@Stateless
-public class RoutedPersister {
- @PersistenceContext(unitName = "router")
- private EntityManager em;
-
- @Resource(name = "My Router", type = DeterminedRouter.class)
- private DeterminedRouter router;
-
- public void persist(int id, String name, String ds) {
- router.setDataSource(ds);
- em.persist(new Person(id, name));
- }
-}
-----
-
-
-= The test
-
-In test mode and using property style configuration the foolowing configuration is used:
-
-
-[source,java]
-----
-public class DynamicDataSourceTest {
- @Test
- public void route() throws Exception {
- String[] databases = new String[]{"database1", "database2", "database3"};
-
- Properties properties = new Properties();
- properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, LocalInitialContextFactory.class.getName());
-
- // resources
- // datasources
- for (int i = 1; i <= databases.length; i++) {
- String dbName = databases[i - 1];
- properties.setProperty(dbName, "new://Resource?type=DataSource");
- dbName += ".";
- properties.setProperty(dbName + "JdbcDriver", "org.hsqldb.jdbcDriver");
- properties.setProperty(dbName + "JdbcUrl", "jdbc:hsqldb:mem:db" + i);
- properties.setProperty(dbName + "UserName", "sa");
- properties.setProperty(dbName + "Password", "");
- properties.setProperty(dbName + "JtaManaged", "true");
- }
-
- // router
- properties.setProperty("My Router", "new://Resource?provider=org.router:DeterminedRouter&type=" + DeterminedRouter.class.getName());
- properties.setProperty("My Router.DatasourceNames", "database1 database2 database3");
- properties.setProperty("My Router.DefaultDataSourceName", "database1");
-
- // routed datasource
- properties.setProperty("Routed Datasource", "new://Resource?provider=RoutedDataSource&type=" + Router.class.getName());
- properties.setProperty("Routed Datasource.Router", "My Router");
-
- Context ctx = EJBContainer.createEJBContainer(properties).getContext();
- RoutedPersister ejb = (RoutedPersister) ctx.lookup("java:global/dynamic-datasource-routing/RoutedPersister");
- for (int i = 0; i < 18; i++) {
- // persisting a person on database db -> kind of manual round robin
- String name = "record " + i;
- String db = databases[i % 3];
- ejb.persist(i, name, db);
- }
-
- // assert database records number using jdbc
- for (int i = 1; i <= databases.length; i++) {
- Connection connection = DriverManager.getConnection("jdbc:hsqldb:mem:db" + i, "sa", "");
- Statement st = connection.createStatement();
- ResultSet rs = st.executeQuery("select count(*) from PERSON");
- rs.next();
- assertEquals(6, rs.getInt(1));
- st.close();
- connection.close();
- }
-
- ctx.close();
- }
-}
-----
-
-
-= Configuration via openejb.xml
-
-The testcase above uses properties for configuration. The identical way to do it via the `conf/openejb.xml` is as follows:
-
-
-[source,xml]
-----
-<!-- Router and datasource -->
-<Resource id="My Router" type="org.apache.openejb.router.test.DynamicDataSourceTest$DeterminedRouter" provider="org.routertest:DeterminedRouter">
- DatasourceNames = database1 database2 database3
- DefaultDataSourceName = database1
-</Resource>
-----
-
-
-[source,xml]
-----
-<Resource id="Routed Datasource" type="org.apache.openejb.resource.jdbc.Router" provider="RoutedDataSource">
- Router = My Router
-</Resource>
-----
-
-
-
-[source,xml]
-----
-<!-- real datasources -->
-<Resource id="database1" type="DataSource">
- JdbcDriver = org.hsqldb.jdbcDriver
- JdbcUrl = jdbc:hsqldb:mem:db1
- UserName = sa
- Password
- JtaManaged = true
-</Resource>
-----
-
-
-[source,xml]
-----
-<Resource id="database2" type="DataSource">
- JdbcDriver = org.hsqldb.jdbcDriver
- JdbcUrl = jdbc:hsqldb:mem:db2
- UserName = sa
- Password
- JtaManaged = true
-</Resource>
-----
-
-
-[source,xml]
-----
-<Resource id="database3" type="DataSource">
- JdbcDriver = org.hsqldb.jdbcDriver
- JdbcUrl = jdbc:hsqldb:mem:db3
- UserName = sa
- Password
- JtaManaged = true
-</Resource>
-----
-
-
-
-
-
-== Some hack for OpenJPA
-
-Using more than one datasource behind one EntityManager means the databases are already created. If it is not the case,
-the JPA provider has to create the datasource at boot time.
-
-Hibernate do it so if you declare your databases it will work. However with OpenJPA
-(the default JPA provider for OpenEJB), the creation is lazy and it happens only once so when you'll switch of database
-it will no more work.
-
-Of course OpenEJB provides @Singleton and @Startup features of Java EE 6 and we can do a bean just making a simple find,
-even on none existing entities, just to force the database creation:
-
-
-[source,java]
-----
-@Startup
-@Singleton
-public class BoostrapUtility {
- // inject all real databases
-
- @PersistenceContext(unitName = "db1")
- private EntityManager em1;
-
- @PersistenceContext(unitName = "db2")
- private EntityManager em2;
-
- @PersistenceContext(unitName = "db3")
- private EntityManager em3;
-
- // force database creation
-
- @PostConstruct
- @TransactionAttribute(TransactionAttributeType.SUPPORTS)
- public void initDatabase() {
- em1.find(Person.class, 0);
- em2.find(Person.class, 0);
- em3.find(Person.class, 0);
- }
-}
-----
-
-
-== Using the routed datasource
-
-Now you configured the way you want to route your JPA operation, you registered the resources and you initialized
-your databases you can use it and see how it is simple:
-
-
-[source,java]
-----
-@Stateless
-public class RoutedPersister {
- // injection of the "proxied" datasource
- @PersistenceContext(unitName = "router")
- private EntityManager em;
-
- // injection of the router you need it to configured the database
- @Resource(name = "My Router", type = DeterminedRouter.class)
- private DeterminedRouter router;
-
- public void persist(int id, String name, String ds) {
- router.setDataSource(ds); // configuring the database for the current transaction
- em.persist(new Person(id, name)); // will use ds database automatically
- }
-}
-----
-
-
-= Running
-
-
-
-[source]
-----
--------------------------------------------------------
- T E S T S
--------------------------------------------------------
-Running org.superbiz.dynamicdatasourcerouting.DynamicDataSourceTest
-Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06
-http://tomee.apache.org/
-INFO - openejb.home = /Users/dblevins/examples/dynamic-datasource-routing
-INFO - openejb.base = /Users/dblevins/examples/dynamic-datasource-routing
-INFO - Using 'javax.ejb.embeddable.EJBContainer=true'
-INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
-INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
-INFO - Configuring Service(id=My Router, type=Resource, provider-id=DeterminedRouter)
-INFO - Configuring Service(id=database3, type=Resource, provider-id=Default JDBC Database)
-INFO - Configuring Service(id=database2, type=Resource, provider-id=Default JDBC Database)
-INFO - Configuring Service(id=Routed Datasource, type=Resource, provider-id=RoutedDataSource)
-INFO - Configuring Service(id=database1, type=Resource, provider-id=Default JDBC Database)
-INFO - Found EjbModule in classpath: /Users/dblevins/examples/dynamic-datasource-routing/target/classes
-INFO - Beginning load: /Users/dblevins/examples/dynamic-datasource-routing/target/classes
-INFO - Configuring enterprise application: /Users/dblevins/examples/dynamic-datasource-routing
-WARN - Method 'lookup' is not available for 'javax.annotation.Resource'. Probably using an older Runtime.
-INFO - Configuring Service(id=Default Singleton Container, type=Container, provider-id=Default Singleton Container)
-INFO - Auto-creating a container for bean BoostrapUtility: Container(type=SINGLETON, id=Default Singleton Container)
-INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container)
-INFO - Auto-creating a container for bean RoutedPersister: Container(type=STATELESS, id=Default Stateless Container)
-INFO - Auto-linking resource-ref 'java:comp/env/My Router' in bean RoutedPersister to Resource(id=My Router)
-INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
-INFO - Auto-creating a container for bean org.superbiz.dynamicdatasourcerouting.DynamicDataSourceTest: Container(type=MANAGED, id=Default Managed Container)
-INFO - Configuring PersistenceUnit(name=router)
-INFO - Configuring PersistenceUnit(name=db1)
-INFO - Auto-creating a Resource with id 'database1NonJta' of type 'DataSource for 'db1'.
-INFO - Configuring Service(id=database1NonJta, type=Resource, provider-id=database1)
-INFO - Adjusting PersistenceUnit db1 <non-jta-data-source> to Resource ID 'database1NonJta' from 'null'
-INFO - Configuring PersistenceUnit(name=db2)
-INFO - Auto-creating a Resource with id 'database2NonJta' of type 'DataSource for 'db2'.
-INFO - Configuring Service(id=database2NonJta, type=Resource, provider-id=database2)
-INFO - Adjusting PersistenceUnit db2 <non-jta-data-source> to Resource ID 'database2NonJta' from 'null'
-INFO - Configuring PersistenceUnit(name=db3)
-INFO - Auto-creating a Resource with id 'database3NonJta' of type 'DataSource for 'db3'.
-INFO - Configuring Service(id=database3NonJta, type=Resource, provider-id=database3)
-INFO - Adjusting PersistenceUnit db3 <non-jta-data-source> to Resource ID 'database3NonJta' from 'null'
-INFO - Enterprise application "/Users/dblevins/examples/dynamic-datasource-routing" loaded.
-INFO - Assembling app: /Users/dblevins/examples/dynamic-datasource-routing
-INFO - PersistenceUnit(name=router, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 504ms
-INFO - PersistenceUnit(name=db1, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 11ms
-INFO - PersistenceUnit(name=db2, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 7ms
-INFO - PersistenceUnit(name=db3, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 6ms
-INFO - Jndi(name="java:global/dynamic-datasource-routing/BoostrapUtility!org.superbiz.dynamicdatasourcerouting.BoostrapUtility")
-INFO - Jndi(name="java:global/dynamic-datasource-routing/BoostrapUtility")
-INFO - Jndi(name="java:global/dynamic-datasource-routing/RoutedPersister!org.superbiz.dynamicdatasourcerouting.RoutedPersister")
-INFO - Jndi(name="java:global/dynamic-datasource-routing/RoutedPersister")
-INFO - Jndi(name="java:global/EjbModule1519652738/org.superbiz.dynamicdatasourcerouting.DynamicDataSourceTest!org.superbiz.dynamicdatasourcerouting.DynamicDataSourceTest")
-INFO - Jndi(name="java:global/EjbModule1519652738/org.superbiz.dynamicdatasourcerouting.DynamicDataSourceTest")
-INFO - Created Ejb(deployment-id=RoutedPersister, ejb-name=RoutedPersister, container=Default Stateless Container)
-INFO - Created Ejb(deployment-id=org.superbiz.dynamicdatasourcerouting.DynamicDataSourceTest, ejb-name=org.superbiz.dynamicdatasourcerouting.DynamicDataSourceTest, container=Default Managed Container)
-INFO - Created Ejb(deployment-id=BoostrapUtility, ejb-name=BoostrapUtility, container=Default Singleton Container)
-INFO - Started Ejb(deployment-id=RoutedPersister, ejb-name=RoutedPersister, container=Default Stateless Container)
-INFO - Started Ejb(deployment-id=org.superbiz.dynamicdatasourcerouting.DynamicDataSourceTest, ejb-name=org.superbiz.dynamicdatasourcerouting.DynamicDataSourceTest, container=Default Managed Container)
-INFO - Started Ejb(deployment-id=BoostrapUtility, ejb-name=BoostrapUtility, container=Default Singleton Container)
-INFO - Deployed Application(path=/Users/dblevins/examples/dynamic-datasource-routing)
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.504 sec
-
-Results :
-
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
-----
-
-
http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/efed31f4/src/main/jbake/content/examples/dynamic-implementation.adoc
----------------------------------------------------------------------
diff --git a/src/main/jbake/content/examples/dynamic-implementation.adoc b/src/main/jbake/content/examples/dynamic-implementation.adoc
deleted file mode 100755
index 0ffff9c..0000000
--- a/src/main/jbake/content/examples/dynamic-implementation.adoc
+++ /dev/null
@@ -1,155 +0,0 @@
-= Dynamic Implementation
-:jbake-date: 2016-09-06
-:jbake-type: page
-:jbake-tomeepdf:
-:jbake-status: published
-
-Example dynamic-implementation can be browsed at https://github.com/apache/tomee/tree/master/examples/dynamic-implementation
-
-
-*Help us document this example! Click the blue pencil icon in the upper right to edit this page.*
-
-== SocialBean
-
-
-[source,java]
-----
-package org.superbiz.dynamic;
-
-import org.apache.openejb.api.Proxy;
-
-import javax.ejb.Singleton;
-import javax.interceptor.Interceptors;
-
-@Singleton
-@Proxy(SocialHandler.class)
-@Interceptors(SocialInterceptor.class)
-public interface SocialBean {
- public String facebookStatus();
-
- public String twitterStatus();
-
- public String status();
-}
-----
-
-
-== SocialHandler
-
-
-[source,java]
-----
-package org.superbiz.dynamic;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-
-public class SocialHandler implements InvocationHandler {
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- String mtd = method.getName();
- if (mtd.toLowerCase().contains("facebook")) {
- return "You think you have a life!";
- } else if (mtd.toLowerCase().contains("twitter")) {
- return "Wow, you eat pop corn!";
- }
- return "Hey, you have no virtual friend!";
- }
-}
-----
-
-
-== SocialInterceptor
-
-
-[source,java]
-----
-packagenull
-}
-----
-
-
-== SocialTest
-
-
-[source,java]
-----
-package org.superbiz.dynamic;
-
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import javax.ejb.embeddable.EJBContainer;
-
-import static junit.framework.Assert.assertTrue;
-
-public class SocialTest {
- private static SocialBean social;
- private static EJBContainer container;
-
- @BeforeClass
- public static void init() throws Exception {
- container = EJBContainer.createEJBContainer();
- social = (SocialBean) container.getContext().lookup("java:global/dynamic-implementation/SocialBean");
- }
-
- @AfterClass
- public static void close() {
- container.close();
- }
-
- @Test
- public void simple() {
- assertTrue(social.facebookStatus().contains("think"));
- assertTrue(social.twitterStatus().contains("eat"));
- assertTrue(social.status().contains("virtual"));
- }
-}
-----
-
-
-= Running
-
-
-
-[source]
-----
--------------------------------------------------------
- T E S T S
--------------------------------------------------------
-Running org.superbiz.dynamic.SocialTest
-Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06
-http://tomee.apache.org/
-INFO - openejb.home = /Users/dblevins/examples/dynamic-implementation
-INFO - openejb.base = /Users/dblevins/examples/dynamic-implementation
-INFO - Using 'javax.ejb.embeddable.EJBContainer=true'
-INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
-INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
-INFO - Found EjbModule in classpath: /Users/dblevins/examples/dynamic-implementation/target/classes
-INFO - Beginning load: /Users/dblevins/examples/dynamic-implementation/target/classes
-INFO - Configuring enterprise application: /Users/dblevins/examples/dynamic-implementation
-INFO - Configuring Service(id=Default Singleton Container, type=Container, provider-id=Default Singleton Container)
-INFO - Auto-creating a container for bean SocialBean: Container(type=SINGLETON, id=Default Singleton Container)
-INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
-INFO - Auto-creating a container for bean org.superbiz.dynamic.SocialTest: Container(type=MANAGED, id=Default Managed Container)
-INFO - Enterprise application "/Users/dblevins/examples/dynamic-implementation" loaded.
-INFO - Assembling app: /Users/dblevins/examples/dynamic-implementation
-INFO - Jndi(name="java:global/dynamic-implementation/SocialBean!org.superbiz.dynamic.SocialBean")
-INFO - Jndi(name="java:global/dynamic-implementation/SocialBean")
-INFO - Jndi(name="java:global/EjbModule236706648/org.superbiz.dynamic.SocialTest!org.superbiz.dynamic.SocialTest")
-INFO - Jndi(name="java:global/EjbModule236706648/org.superbiz.dynamic.SocialTest")
-INFO - Created Ejb(deployment-id=org.superbiz.dynamic.SocialTest, ejb-name=org.superbiz.dynamic.SocialTest, container=Default Managed Container)
-INFO - Created Ejb(deployment-id=SocialBean, ejb-name=SocialBean, container=Default Singleton Container)
-INFO - Started Ejb(deployment-id=org.superbiz.dynamic.SocialTest, ejb-name=org.superbiz.dynamic.SocialTest, container=Default Managed Container)
-INFO - Started Ejb(deployment-id=SocialBean, ejb-name=SocialBean, container=Default Singleton Container)
-INFO - Deployed Application(path=/Users/dblevins/examples/dynamic-implementation)
-INFO - Undeploying app: /Users/dblevins/examples/dynamic-implementation
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.107 sec
-
-Results :
-
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
-----
-
-
http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/efed31f4/src/main/jbake/content/examples/dynamic-proxy-to-access-mbean.adoc
----------------------------------------------------------------------
diff --git a/src/main/jbake/content/examples/dynamic-proxy-to-access-mbean.adoc b/src/main/jbake/content/examples/dynamic-proxy-to-access-mbean.adoc
deleted file mode 100755
index ae03587..0000000
--- a/src/main/jbake/content/examples/dynamic-proxy-to-access-mbean.adoc
+++ /dev/null
@@ -1,460 +0,0 @@
-= dynamic-proxy-to-access-mbean
-:jbake-date: 2016-09-06
-:jbake-type: page
-:jbake-tomeepdf:
-:jbake-status: published
-
-Example dynamic-proxy-to-access-mbean can be browsed at https://github.com/apache/tomee/tree/master/examples/dynamic-proxy-to-access-mbean
-
-
-*Help us document this example! Click the blue pencil icon in the upper right to edit this page.*
-
-== Example
-
-Acessing MBean is something simple through the JMX API but it is often technical and not very interesting.
-
-This example simplify this work simply doing it generically in a proxy.
-
-So from an user side you simple declare an interface to access your MBeans.
-
-Note: the example implementation uses a local MBeanServer but enhancing the example API
-it is easy to imagine a remote connection with user/password if needed.
-
-== ObjectName API (annotation)
-
-Simply an annotation to get the object
-
-
-[source,java]
-----
-package org.superbiz.dynamic.mbean;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-@Target({TYPE, METHOD})
-@Retention(RUNTIME)
-public @interface ObjectName {
- String value();
-
- // for remote usage only
- String url() default "";
- String user() default "";
- String password() default "";
-}
-----
-
-
-== DynamicMBeanHandler (thr proxy implementation)
-
-
-[source,java]
-----
-package org.superbiz.dynamic.mbean;
-
-import javax.annotation.PreDestroy;
-import javax.management.Attribute;
-import javax.management.MBeanAttributeInfo;
-import javax.management.MBeanInfo;
-import javax.management.MBeanServer;
-import javax.management.MBeanServerConnection;
-import javax.management.ObjectName;
-import javax.management.remote.JMXConnector;
-import javax.management.remote.JMXConnectorFactory;
-import javax.management.remote.JMXServiceURL;
-import java.io.IOException;
-import java.lang.management.ManagementFactory;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Need a @PreDestroy method to disconnect the remote host when used in remote mode.
- */
-public class DynamicMBeanHandler implements InvocationHandler {
- private final Map<Method, ConnectionInfo> infos = new ConcurrentHashMap<Method, ConnectionInfo>();
-
- @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- final String methodName = method.getName();
- if (method.getDeclaringClass().equals(Object.class) && "toString".equals(methodName)) {
- return getClass().getSimpleName() + " Proxy";
- }
- if (method.getAnnotation(PreDestroy.class) != null) {
- return destroy();
- }
-
- final ConnectionInfo info = getConnectionInfo(method);
- final MBeanInfo infos = info.getMBeanInfo();
- if (methodName.startsWith("set") && methodName.length() > 3 && args != null && args.length == 1
- && (Void.TYPE.equals(method.getReturnType()) || Void.class.equals(method.getReturnType()))) {
- final String attributeName = attributeName(infos, methodName, method.getParameterTypes()[0]);
- info.setAttribute(new Attribute(attributeName, args[0]));
- return null;
- } else if (methodName.startsWith("get") && (args == null || args.length == 0) && methodName.length() > 3) {
- final String attributeName = attributeName(infos, methodName, method.getReturnType());
- return info.getAttribute(attributeName);
- }
- // operation
- return info.invoke(methodName, args, getSignature(method));
- }
-
- public Object destroy() {
- for (ConnectionInfo info : infos.values()) {
- info.clean();
- }
- infos.clear();
- return null;
- }
-
- private String[] getSignature(Method method) {
- String[] args = new String[method.getParameterTypes().length];
- for (int i = 0; i < method.getParameterTypes().length; i++) {
- args[i] = method.getParameterTypes()[i].getName();
- }
- return args; // note: null should often work...
- }
-
- private String attributeName(MBeanInfo infos, String methodName, Class<?> type) {
- String found = null;
- String foundBackUp = null; // without checking the type
- final String attributeName = methodName.substring(3, methodName.length());
- final String lowerName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4, methodName.length());
-
- for (MBeanAttributeInfo attribute : infos.getAttributes()) {
- final String name = attribute.getName();
- if (attributeName.equals(name)) {
- foundBackUp = attributeName;
- if (attribute.getType().equals(type.getName())) {
- found = name;
- }
- } else if (found == null && ((lowerName.equals(name) && !attributeName.equals(name))
- || lowerName.equalsIgnoreCase(name))) {
- foundBackUp = name;
- if (attribute.getType().equals(type.getName())) {
- found = name;
- }
- }
- }
-
- if (found == null && foundBackUp == null) {
- throw new UnsupportedOperationException("cannot find attribute " + attributeName);
- }
-
- if (found != null) {
- return found;
- }
- return foundBackUp;
- }
-
- private synchronized ConnectionInfo getConnectionInfo(Method method) throws Exception {
- if (!infos.containsKey(method)) {
- synchronized (infos) {
- if (!infos.containsKey(method)) { // double check for synchro
- org.superbiz.dynamic.mbean.ObjectName on = method.getAnnotation(org.superbiz.dynamic.mbean.ObjectName.class);
- if (on == null) {
- Class<?> current = method.getDeclaringClass();
- do {
- on = method.getDeclaringClass().getAnnotation(org.superbiz.dynamic.mbean.ObjectName.class);
- current = current.getSuperclass();
- } while (on == null && current != null);
- if (on == null) {
- throw new UnsupportedOperationException("class or method should define the objectName to use for invocation: " + method.toGenericString());
- }
- }
- final ConnectionInfo info;
- if (on.url().isEmpty()) {
- info = new LocalConnectionInfo();
- ((LocalConnectionInfo) info).server = ManagementFactory.getPlatformMBeanServer(); // could use an id...
- } else {
- info = new RemoteConnectionInfo();
- final Map<String, String[]> environment = new HashMap<String, String[]>();
- if (!on.user().isEmpty()) {
- environment.put(JMXConnector.CREDENTIALS, new String[]{ on.user(), on.password() });
- }
- // ((RemoteConnectionInfo) info).connector = JMXConnectorFactory.newJMXConnector(new JMXServiceURL(on.url()), environment);
- ((RemoteConnectionInfo) info).connector = JMXConnectorFactory.connect(new JMXServiceURL(on.url()), environment);
-
- }
- info.objectName = new ObjectName(on.value());
-
- infos.put(method, info);
- }
- }
- }
- return infos.get(method);
- }
-
- private abstract static class ConnectionInfo {
- protected ObjectName objectName;
-
- public abstract void setAttribute(Attribute attribute) throws Exception;
- public abstract Object getAttribute(String attribute) throws Exception;
- public abstract Object invoke(String operationName, Object params[], String signature[]) throws Exception;
- public abstract MBeanInfo getMBeanInfo() throws Exception;
- public abstract void clean();
- }
-
- private static class LocalConnectionInfo extends ConnectionInfo {
- private MBeanServer server;
-
- @Override public void setAttribute(Attribute attribute) throws Exception {
- server.setAttribute(objectName, attribute);
- }
-
- @Override public Object getAttribute(String attribute) throws Exception {
- return server.getAttribute(objectName, attribute);
- }
-
- @Override
- public Object invoke(String operationName, Object[] params, String[] signature) throws Exception {
- return server.invoke(objectName, operationName, params, signature);
- }
-
- @Override public MBeanInfo getMBeanInfo() throws Exception {
- return server.getMBeanInfo(objectName);
- }
-
- @Override public void clean() {
- // no-op
- }
- }
-
- private static class RemoteConnectionInfo extends ConnectionInfo {
- private JMXConnector connector;
- private MBeanServerConnection connection;
-
- private void before() throws IOException {
- connection = connector.getMBeanServerConnection();
- }
-
- private void after() throws IOException {
- // no-op
- }
-
- @Override public void setAttribute(Attribute attribute) throws Exception {
- before();
- connection.setAttribute(objectName, attribute);
- after();
- }
-
- @Override public Object getAttribute(String attribute) throws Exception {
- before();
- try {
- return connection.getAttribute(objectName, attribute);
- } finally {
- after();
- }
- }
-
- @Override
- public Object invoke(String operationName, Object[] params, String[] signature) throws Exception {
- before();
- try {
- return connection.invoke(objectName, operationName, params, signature);
- } finally {
- after();
- }
- }
-
- @Override public MBeanInfo getMBeanInfo() throws Exception {
- before();
- try {
- return connection.getMBeanInfo(objectName);
- } finally {
- after();
- }
- }
-
- @Override public void clean() {
- try {
- connector.close();
- } catch (IOException e) {
- // no-op
- }
- }
- }
-}
-----
-
-
-== Dynamic Proxies
-
-=== DynamicMBeanClient (the dynamic JMX client)
-
- package org.superbiz.dynamic.mbean;
-
- import org.apache.openejb.api.Proxy;
- import org.superbiz.dynamic.mbean.DynamicMBeanHandler;
- import org.superbiz.dynamic.mbean.ObjectName;
-
- import javax.ejb.Singleton;
-
- /**
- * @author rmannibucau
- */
- @Singleton
- @Proxy(DynamicMBeanHandler.class)
- @ObjectName(DynamicMBeanClient.OBJECT_NAME)
- public interface DynamicMBeanClient {
- static final String OBJECT_NAME = "test:group=DynamicMBeanClientTest";
-
- int getCounter();
- void setCounter(int i);
- int length(String aString);
- }
-
-=== DynamicMBeanClient (the dynamic JMX client)
-
-[source,java]
-----
-package org.superbiz.dynamic.mbean;
-
-import org.apache.openejb.api.Proxy;
-
-import javax.annotation.PreDestroy;
-import javax.ejb.Singleton;
-
-
-@Singleton
-@Proxy(DynamicMBeanHandler.class)
-@ObjectName(value = DynamicRemoteMBeanClient.OBJECT_NAME, url = "service:jmx:rmi:///jndi/rmi://localhost:8243/jmxrmi")
-public interface DynamicRemoteMBeanClient {
- static final String OBJECT_NAME = "test:group=DynamicMBeanClientTest";
-
- int getCounter();
- void setCounter(int i);
- int length(String aString);
-
- @PreDestroy void clean();
-}
-----
-
-
-== The MBean used for the test
-
-=== SimpleMBean
-
- package org.superbiz.dynamic.mbean.simple;
-
- public interface SimpleMBean {
- int length(String s);
-
- int getCounter();
- void setCounter(int c);
- }
-
-== Simple
-
- package org.superbiz.dynamic.mbean.simple;
-
- public class Simple implements SimpleMBean {
- private int counter = 0;
-
- @Override public int length(String s) {
- if (s == null) {
- return 0;
- }
- return s.length();
- }
-
- @Override public int getCounter() {
- return counter;
- }
-
- @Override public void setCounter(int c) {
- counter = c;
- }
- }
-
-== DynamicMBeanClientTest (The test)
-
-
-[source,java]
-----
-package org.superbiz.dynamic.mbean;
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.superbiz.dynamic.mbean.simple.Simple;
-
-import javax.ejb.EJB;
-import javax.ejb.embeddable.EJBContainer;
-import javax.management.Attribute;
-import javax.management.ObjectName;
-import java.lang.management.ManagementFactory;
-
-import static junit.framework.Assert.assertEquals;
-
-public class DynamicMBeanClientTest {
- private static ObjectName objectName;
- private static EJBContainer container;
-
- @EJB private DynamicMBeanClient localClient;
- @EJB private DynamicRemoteMBeanClient remoteClient;
-
- @BeforeClass public static void start() {
- container = EJBContainer.createEJBContainer();
- }
-
- @Before public void injectAndRegisterMBean() throws Exception {
- container.getContext().bind("inject", this);
- objectName = new ObjectName(DynamicMBeanClient.OBJECT_NAME);
- ManagementFactory.getPlatformMBeanServer().registerMBean(new Simple(), objectName);
- }
-
- @After public void unregisterMBean() throws Exception {
- if (objectName != null) {
- ManagementFactory.getPlatformMBeanServer().unregisterMBean(objectName);
- }
- }
-
- @Test public void localGet() throws Exception {
- assertEquals(0, localClient.getCounter());
- ManagementFactory.getPlatformMBeanServer().setAttribute(objectName, new Attribute("Counter", 5));
- assertEquals(5, localClient.getCounter());
- }
-
- @Test public void localSet() throws Exception {
- assertEquals(0, ((Integer) ManagementFactory.getPlatformMBeanServer().getAttribute(objectName, "Counter")).intValue());
- localClient.setCounter(8);
- assertEquals(8, ((Integer) ManagementFactory.getPlatformMBeanServer().getAttribute(objectName, "Counter")).intValue());
- }
-
- @Test public void localOperation() {
- assertEquals(7, localClient.length("openejb"));
- }
-
- @Test public void remoteGet() throws Exception {
- assertEquals(0, remoteClient.getCounter());
- ManagementFactory.getPlatformMBeanServer().setAttribute(objectName, new Attribute("Counter", 5));
- assertEquals(5, remoteClient.getCounter());
- }
-
- @Test public void remoteSet() throws Exception {
- assertEquals(0, ((Integer) ManagementFactory.getPlatformMBeanServer().getAttribute(objectName, "Counter")).intValue());
- remoteClient.setCounter(8);
- assertEquals(8, ((Integer) ManagementFactory.getPlatformMBeanServer().getAttribute(objectName, "Counter")).intValue());
- }
-
- @Test public void remoteOperation() {
- assertEquals(7, remoteClient.length("openejb"));
- }
-
- @AfterClass public static void close() {
- if (container != null) {
- container.close();
- }
- }
-}
-----
-
-
http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/efed31f4/src/main/jbake/content/examples/ear-testing.adoc
----------------------------------------------------------------------
diff --git a/src/main/jbake/content/examples/ear-testing.adoc b/src/main/jbake/content/examples/ear-testing.adoc
deleted file mode 100755
index eac0b6d..0000000
--- a/src/main/jbake/content/examples/ear-testing.adoc
+++ /dev/null
@@ -1,244 +0,0 @@
-= EAR Testing
-:jbake-date: 2016-09-06
-:jbake-type: page
-:jbake-tomeepdf:
-:jbake-status: published
-
-Example ear-testing can be browsed at https://github.com/apache/tomee/tree/master/examples/ear-testing
-
-
-The goal of this example is to demonstrate how maven projects might be organized in a more real world style and how testing with OpenEJB can fit into that structure.
-
-This example takes the basic moviefun code we us in many of examples and splits it into two modules:
-
- - `business-logic`
- - `business-model`
-
-As the names imply, we keep our `@Entity` beans in the `business-model` module and our session beans in the `business-logic` model. The tests located and run from the business logic module.
-
- ear-testing
- ear-testing/business-logic
- ear-testing/business-logic/pom.xml
- ear-testing/business-logic/src/main/java/org/superbiz/logic/Movies.java
- ear-testing/business-logic/src/main/java/org/superbiz/logic/MoviesImpl.java
- ear-testing/business-logic/src/main/resources
- ear-testing/business-logic/src/main/resources/META-INF
- ear-testing/business-logic/src/main/resources/META-INF/ejb-jar.xml
- ear-testing/business-logic/src/test/java/org/superbiz/logic/MoviesTest.java
- ear-testing/business-model
- ear-testing/business-model/pom.xml
- ear-testing/business-model/src/main/java/org/superbiz/model/Movie.java
- ear-testing/business-model/src/main/resources/META-INF/persistence.xml
- ear-testing/pom.xml
-
-= Project configuration
-
-The parent pom, trimmed to the minimum, looks like so:
-
-
-[source,xml]
-----
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.superbiz</groupId>
- <artifactId>myear</artifactId>
- <version>1.1.0-SNAPSHOT</version>
-
- <packaging>pom</packaging>
-
- <modules>
- <module>business-model</module>
- <module>business-logic</module>
- </modules>
-
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>javaee-api</artifactId>
- <version>6.0-2</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.8.1</version>
- </dependency>
- </dependencies>
- </dependencyManagement>
-</project>
-----
-
-
-The `business-model/pom.xml` as follows:
-
-
-[source,xml]
-----
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <parent>
- <groupId>org.superbiz</groupId>
- <artifactId>myear</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
-
- <artifactId>business-model</artifactId>
- <packaging>jar</packaging>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>javaee-api</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
-
- </dependencies>
-
-</project>
-----
-
-
-And finally, the `business-logic/pom.xml` which is setup to support embedded testing with OpenEJB:
-
-
-[source,xml]
-----
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <parent>
- <groupId>org.superbiz</groupId>
- <artifactId>myear</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
-
- <artifactId>business-logic</artifactId>
- <packaging>jar</packaging>
-
- <dependencies>
- <dependency>
- <groupId>org.superbiz</groupId>
- <artifactId>business-model</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>javaee-api</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- <!--
- The <scope>test</scope> guarantees that non of your runtime
- code is dependent on any OpenEJB classes.
- -->
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-core</artifactId>
- <version>7.0.0-SNAPSHOT</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
-</project>
-----
-
-
-= TestCode
-
-The test code is the same as always:
-
-
-[source,java]
-----
-public class MoviesTest extends TestCase {
-
- public void test() throws Exception {
- Properties p = new Properties();
- p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.core.LocalInitialContextFactory");
-
- p.put("openejb.deployments.classpath.ear", "true");
-
- p.put("movieDatabase", "new://Resource?type=DataSource");
- p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");
- p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb");
-
- p.put("movieDatabaseUnmanaged", "new://Resource?type=DataSource");
- p.put("movieDatabaseUnmanaged.JdbcDriver", "org.hsqldb.jdbcDriver");
- p.put("movieDatabaseUnmanaged.JdbcUrl", "jdbc:hsqldb:mem:moviedb");
- p.put("movieDatabaseUnmanaged.JtaManaged", "false");
-
- Context context = new InitialContext(p);
-
- Movies movies = (Movies) context.lookup("MoviesLocal");
-
- movies.addMovie(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992));
- movies.addMovie(new Movie("Joel Coen", "Fargo", 1996));
- movies.addMovie(new Movie("Joel Coen", "The Big Lebowski", 1998));
-
- List<Movie> list = movies.getMovies();
- assertEquals("List.size()", 3, list.size());
-
- for (Movie movie : list) {
- movies.deleteMovie(movie);
- }
-
- assertEquals("Movies.getMovies()", 0, movies.getMovies().size());
- }
-}
-----
-
-
-
-= Running
-
-
-
-[source]
-----
--------------------------------------------------------
- T E S T S
--------------------------------------------------------
-Running org.superbiz.logic.MoviesTest
-Apache OpenEJB 7.0.0-SNAPSHOT build: 20111002-04:06
-http://tomee.apache.org/
-INFO - openejb.home = /Users/dblevins/examples/ear-testing/business-logic
-INFO - openejb.base = /Users/dblevins/examples/ear-testing/business-logic
-INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
-INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
-INFO - Configuring Service(id=movieDatabaseUnmanaged, type=Resource, provider-id=Default JDBC Database)
-INFO - Configuring Service(id=movieDatabase, type=Resource, provider-id=Default JDBC Database)
-INFO - Found PersistenceModule in classpath: /Users/dblevins/examples/ear-testing/business-model/target/business-model-1.0.jar
-INFO - Found EjbModule in classpath: /Users/dblevins/examples/ear-testing/business-logic/target/classes
-INFO - Using 'openejb.deployments.classpath.ear=true'
-INFO - Beginning load: /Users/dblevins/examples/ear-testing/business-model/target/business-model-1.0.jar
-INFO - Beginning load: /Users/dblevins/examples/ear-testing/business-logic/target/classes
-INFO - Configuring enterprise application: /Users/dblevins/examples/ear-testing/business-logic/classpath.ear
-INFO - Configuring Service(id=Default Stateful Container, type=Container, provider-id=Default Stateful Container)
-INFO - Auto-creating a container for bean Movies: Container(type=STATEFUL, id=Default Stateful Container)
-INFO - Configuring PersistenceUnit(name=movie-unit)
-INFO - Enterprise application "/Users/dblevins/examples/ear-testing/business-logic/classpath.ear" loaded.
-INFO - Assembling app: /Users/dblevins/examples/ear-testing/business-logic/classpath.ear
-INFO - PersistenceUnit(name=movie-unit, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 415ms
-INFO - Jndi(name=MoviesLocal) --> Ejb(deployment-id=Movies)
-INFO - Jndi(name=global/classpath.ear/business-logic/Movies!org.superbiz.logic.Movies) --> Ejb(deployment-id=Movies)
-INFO - Jndi(name=global/classpath.ear/business-logic/Movies) --> Ejb(deployment-id=Movies)
-INFO - Created Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container)
-INFO - Started Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container)
-INFO - Deployed Application(path=/Users/dblevins/examples/ear-testing/business-logic/classpath.ear)
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.393 sec
-
-Results :
-
-Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
-----
-