You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jl...@apache.org on 2019/01/02 21:18:18 UTC
[07/12] tomee git commit: converting and fixing group of jpa examples
http://git-wip-us.apache.org/repos/asf/tomee/blob/a68903e7/examples/multi-jpa-provider-testing/README.adoc
----------------------------------------------------------------------
diff --git a/examples/multi-jpa-provider-testing/README.adoc b/examples/multi-jpa-provider-testing/README.adoc
new file mode 100644
index 0000000..0472365
--- /dev/null
+++ b/examples/multi-jpa-provider-testing/README.adoc
@@ -0,0 +1,287 @@
+= Multiple JPA Providers Test
+:index-group: JPA
+:jbake-type: page
+:jbake-status: published
+
+This test shows how to use multiple JPA providers, Hibernate and Openjpa. Using JPA annotations the code can be easily used with different implementations. The @Entity class is straight forward, a Person POJO with an id and a name, the persistence.xml creates and drop Person table for both implementations. The examples and implementations dependency are inside test resources, in particularly: arquillian.xml for test purpose, hibernate-pom.xml loads hibernate-core dependencies and openjpa-pom.xml loads openjpa dependencies. The test inside JPATest.java class is executed twice, once for each implementation.
+
+== @Entity
+
+Simple POJO class that follows JPA standard
+
+....
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+public class Person {
+
+ @Id
+ @GeneratedValue
+ private long id;
+
+ private String name;
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
+....
+
+== persistence.xml
+
+Create and drop Person table
+
+....
+<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="jpa">
+ <jta-data-source>jdbc/jpa</jta-data-source>
+ <properties>
+ <!--
+ OpenJPA
+ -->
+ <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
+
+ <!--
+ Hibernate
+ -->
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ </properties>
+</persistence-unit>
+</persistence>
+....
+
+== JPA test
+
+The entity manager is injected through cdi and an Object Person is created and inserted into the inmemory database
+
+....
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.transaction.api.annotation.TransactionMode;
+import org.jboss.arquillian.transaction.api.annotation.Transactional;
+import org.jboss.shrinkwrap.api.ArchivePaths;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.ClassLoaderAsset;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.superbiz.model.Person;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import static org.junit.Assert.assertNotNull;
+
+@RunWith(Arquillian.class)
+public class JPATest {
+
+ @Deployment
+ public static WebArchive war() {
+ return ShrinkWrap.create(WebArchive.class)
+ .addClass(Person.class)
+ .addAsWebInfResource(new ClassLoaderAsset("META-INF/persistence.xml"), ArchivePaths.create("persistence.xml"));
+ }
+
+ @PersistenceContext
+ private EntityManager em;
+
+ @Test
+ @Transactional(TransactionMode.ROLLBACK)
+ public void persist() {
+ assertNotNull(em);
+
+ // do something with the em
+ final Person p = new Person();
+ p.setName("Apache OpenEJB");
+ em.persist(p);
+ }
+}
+....
+
+Inside the example there are no reference to the JPA implementations.
+
+== Test implementations
+
+The test classes inside org.superbiz.enricher package simply load the implementation libraries and the test runs twice as described inside the pom.xml, a system property variable is used to distinguish between Hibernate and OpenJPA.
+
+= Running
+
+Running the example can be done from maven with a simple 'mvn clean install' command run from the 'multi-jpa-provider-testing' directory.
+
+When run you should see output similar to the following.
+
+....
+-------------------------------------------------------
+T E S T S
+-------------------------------------------------------
+Running org.superbiz.JPATest
+INFO - ********************************************************************************
+INFO - OpenEJB http://tomee.apache.org/
+INFO - Startup: Wed Dec 26 17:55:31 CET 2018
+INFO - Copyright 1999-2018 (C) Apache OpenEJB Project, All Rights Reserved.
+INFO - Version: 8.0.0-SNAPSHOT
+INFO - Build date: 20181226
+INFO - Build time: 02:26
+INFO - ********************************************************************************
+INFO - openejb.home = /tomee/examples/multi-jpa-provider-testing
+INFO - openejb.base = /tomee/examples/multi-jpa-provider-testing
+INFO - Created new singletonService org.apache.openejb.cdi.ThreadSingletonServiceImpl@5db45159
+INFO - Succeeded in installing singleton service
+INFO - Cannot find the configuration file [conf/openejb.xml]. Will attempt to create one for the beans deployed.
+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 - Using 'openejb.deployments.classpath=false'
+INFO - Creating TransactionManager(id=Default Transaction Manager)
+INFO - Creating SecurityService(id=Default Security Service)
+INFO - Using 'openejb.classloader.forced-load=org.superbiz.model'
+INFO - Configuring enterprise application: /tomee/examples/multi-jpa-provider-testing/413724ac-4a44-48a3-ae4a-db190b95cc62.war
+INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
+INFO - Auto-creating a container for bean 413724ac-4a44-48a3-ae4a-db190b95cc62_org.superbiz.JPATest: Container(type=MANAGED, id=Default Managed Container)
+INFO - Creating Container(id=Default Managed Container)
+INFO - Using directory /tmp for stateful session passivation
+INFO - Configuring PersistenceUnit(name=jpa)
+INFO - Configuring Service(id=Default JDBC Database, type=Resource, provider-id=Default JDBC Database)
+INFO - Auto-creating a Resource with id 'Default JDBC Database' of type 'DataSource for 'jpa'.
+INFO - Creating Resource(id=Default JDBC Database)
+INFO - Configuring Service(id=Default Unmanaged JDBC Database, type=Resource, provider-id=Default Unmanaged JDBC Database)
+INFO - Auto-creating a Resource with id 'Default Unmanaged JDBC Database' of type 'DataSource for 'jpa'.
+INFO - Creating Resource(id=Default Unmanaged JDBC Database)
+INFO - Adjusting PersistenceUnit jpa <jta-data-source> to Resource ID 'Default JDBC Database' from 'jdbc/jpa'
+INFO - Adjusting PersistenceUnit jpa <non-jta-data-source> to Resource ID 'Default Unmanaged JDBC Database' from 'null'
+INFO - Using 'javax.persistence.provider=org.hibernate.ejb.HibernatePersistence'
+INFO - Enterprise application "/tomee/examples/multi-jpa-provider-testing/413724ac-4a44-48a3-ae4a-db190b95cc62.war" loaded.
+INFO - Assembling app: /tomee/examples/multi-jpa-provider-testing/413724ac-4a44-48a3-ae4a-db190b95cc62.war
+INFO - HCANN000001: Hibernate Commons Annotations {4.0.2.Final}
+INFO - HHH000412: Hibernate Core {4.2.18.Final}
+INFO - HHH000206: hibernate.properties not found
+INFO - HHH000021: Bytecode provider name : javassist
+INFO - HHH000204: Processing PersistenceUnitInfo [
+ name: jpa
+ ...]
+INFO - HHH000130: Instantiating explicit connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
+INFO - HHH000400: Using dialect: org.hibernate.dialect.HSQLDialect
+INFO - HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory
+INFO - HHH000397: Using ASTQueryTranslatorFactory
+INFO - HHH000227: Running hbm2ddl schema export
+INFO - HHH000230: Schema export complete
+INFO - PersistenceUnit(name=jpa, provider=org.hibernate.ejb.HibernatePersistence) - provider time 1053ms
+INFO - Existing thread singleton service in SystemInstance(): org.apache.openejb.cdi.ThreadSingletonServiceImpl@5db45159
+INFO - Some Principal APIs could not be loaded: org.eclipse.microprofile.jwt.JsonWebToken out of org.eclipse.microprofile.jwt.JsonWebToken not found
+INFO - OpenWebBeans Container is starting...
+INFO - Adding OpenWebBeansPlugin : [CdiPlugin]
+INFO - HV000001: Hibernate Validator 5.1.3.Final
+INFO - All injection points were validated successfully.
+INFO - OpenWebBeans Container has started, it took 194 ms.
+INFO - Deployed Application(path=/tomee/examples/multi-jpa-provider-testing/413724ac-4a44-48a3-ae4a-db190b95cc62.war)
+INFO - Undeploying app: /tomee/examples/multi-jpa-provider-testing/413724ac-4a44-48a3-ae4a-db190b95cc62.war
+INFO - HHH000227: Running hbm2ddl schema export
+INFO - HHH000230: Schema export complete
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.951 sec - in org.superbiz.JPATest
+INFO - Destroying container system
+INFO - Closing DataSource: Default JDBC Database
+INFO - Closing DataSource: Default Unmanaged JDBC Database
+
+Results :
+
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
+
+-------------------------------------------------------
+T E S T S
+-------------------------------------------------------
+SUREFIRE-859: 57 classpath-bootstrap INFO [main] openjpa.Enhance - You have enabled runtime enhancement, but have not specified the set of persistent classes. OpenJPA must look for metadata for every loaded class, which might increase class load times significantly.
+353 classpath-bootstrap INFO [main] openjpa.Runtime - OpenJPA dynamically loaded a validation provider.
+Running org.superbiz.JPATest
+INFO - ********************************************************************************
+INFO - OpenEJB http://tomee.apache.org/
+INFO - Startup: Wed Dec 26 17:55:35 CET 2018
+INFO - Copyright 1999-2018 (C) Apache OpenEJB Project, All Rights Reserved.
+INFO - Version: 8.0.0-SNAPSHOT
+INFO - Build date: 20181226
+INFO - Build time: 02:26
+INFO - ********************************************************************************
+INFO - openejb.home = /tomee/examples/multi-jpa-provider-testing
+INFO - openejb.base = /tomee/examples/multi-jpa-provider-testing
+INFO - Created new singletonService org.apache.openejb.cdi.ThreadSingletonServiceImpl@4a8a60bc
+INFO - Succeeded in installing singleton service
+INFO - Cannot find the configuration file [conf/openejb.xml]. Will attempt to create one for the beans deployed.
+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 - Using 'openejb.deployments.classpath=false'
+INFO - Creating TransactionManager(id=Default Transaction Manager)
+INFO - Creating SecurityService(id=Default Security Service)
+INFO - Configuring enterprise application: /tomee/examples/multi-jpa-provider-testing/450e397e-de39-49eb-837f-7b066fc9f248.war
+INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
+INFO - Auto-creating a container for bean 450e397e-de39-49eb-837f-7b066fc9f248_org.superbiz.JPATest: Container(type=MANAGED, id=Default Managed Container)
+INFO - Creating Container(id=Default Managed Container)
+INFO - Using directory /tmp for stateful session passivation
+INFO - Configuring PersistenceUnit(name=jpa)
+INFO - Configuring Service(id=Default JDBC Database, type=Resource, provider-id=Default JDBC Database)
+INFO - Auto-creating a Resource with id 'Default JDBC Database' of type 'DataSource for 'jpa'.
+INFO - Creating Resource(id=Default JDBC Database)
+INFO - Configuring Service(id=Default Unmanaged JDBC Database, type=Resource, provider-id=Default Unmanaged JDBC Database)
+INFO - Auto-creating a Resource with id 'Default Unmanaged JDBC Database' of type 'DataSource for 'jpa'.
+INFO - Creating Resource(id=Default Unmanaged JDBC Database)
+INFO - Adjusting PersistenceUnit jpa <jta-data-source> to Resource ID 'Default JDBC Database' from 'jdbc/jpa'
+INFO - Adjusting PersistenceUnit jpa <non-jta-data-source> to Resource ID 'Default Unmanaged JDBC Database' from 'null'
+INFO - Using 'javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl'
+INFO - Enterprise application "/tomee/examples/multi-jpa-provider-testing/450e397e-de39-49eb-837f-7b066fc9f248.war" loaded.
+INFO - Assembling app: /tomee/examples/multi-jpa-provider-testing/450e397e-de39-49eb-837f-7b066fc9f248.war
+INFO - OpenJPA dynamically loaded a validation provider.
+INFO - PersistenceUnit(name=jpa, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 116ms
+INFO - Existing thread singleton service in SystemInstance(): org.apache.openejb.cdi.ThreadSingletonServiceImpl@4a8a60bc
+INFO - Some Principal APIs could not be loaded: org.eclipse.microprofile.jwt.JsonWebToken out of org.eclipse.microprofile.jwt.JsonWebToken not found
+INFO - OpenWebBeans Container is starting...
+INFO - Adding OpenWebBeansPlugin : [CdiPlugin]
+INFO - HV000001: Hibernate Validator 5.1.3.Final
+INFO - All injection points were validated successfully.
+INFO - OpenWebBeans Container has started, it took 170 ms.
+INFO - Deployed Application(path=/tomee/examples/multi-jpa-provider-testing/450e397e-de39-49eb-837f-7b066fc9f248.war)
+INFO - Starting OpenJPA 3.0.0
+INFO - Using dictionary class "org.apache.openjpa.jdbc.sql.HSQLDictionary" (HSQL Database Engine 2.3.2 ,HSQL Database Engine Driver 2.3.2).
+INFO - Connected to HSQL Database Engine version 2.2 using JDBC driver HSQL Database Engine Driver version 2.3.2.
+INFO - Undeploying app: /tomee/examples/multi-jpa-provider-testing/450e397e-de39-49eb-837f-7b066fc9f248.war
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.666 sec - in org.superbiz.JPATest
+INFO - Destroying container system
+INFO - Closing DataSource: Default JDBC Database
+INFO - Closing DataSource: Default Unmanaged JDBC Database
+
+Results :
+
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
+....
+
+From the log you can see that both implementations are used: INFO - Using 'javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl', INFO - Using 'javax.persistence.provider=org.hibernate.ejb.HibernatePersistence'.
+
+== Inside the jar
+
+If we look at the jar built by maven, we'll see the application itself is quite small:
+
+ jar tvf multi-jpa-provider-testing-8.0.0-SNAPSHOT.jar
+ 0 Wed Dec 26 17:55:40 CET 2018 META-INF/
+ 134 Wed Dec 26 17:55:38 CET 2018 META-INF/MANIFEST.MF
+ 0 Wed Dec 26 17:55:30 CET 2018 org/
+ 0 Wed Dec 26 17:55:30 CET 2018 org/superbiz/
+ 0 Wed Dec 26 17:55:30 CET 2018 org/superbiz/model/
+ 780 Wed Dec 26 17:55:30 CET 2018 org/superbiz/model/Person.class
+ 1554 Wed Dec 26 17:55:30 CET 2018 META-INF/persistence.xml
+ 0 Wed Dec 26 17:55:40 CET 2018 META-INF/maven/
+ 0 Wed Dec 26 17:55:40 CET 2018 META-INF/maven/org.superbiz/
+ 0 Wed Dec 26 17:55:40 CET 2018 META-INF/maven/org.superbiz/multi-jpa-provider-testing/
+ 5696 Wed Dec 26 17:41:54 CET 2018 META-INF/maven/org.superbiz/multi-jpa-provider-testing/pom.xml
+ 132 Wed Dec 26 17:55:38 CET 2018 META-INF/maven/org.superbiz/multi-jpa-provider-testing/pom.properties
+
+Inside the resources package there is only a java class and the persistence.xml and the only dependency is javaee-api:8.0.
http://git-wip-us.apache.org/repos/asf/tomee/blob/a68903e7/examples/simple-remote-tomcatusers/README.adoc
----------------------------------------------------------------------
diff --git a/examples/simple-remote-tomcatusers/README.adoc b/examples/simple-remote-tomcatusers/README.adoc
index 2f65df7..642a2a0 100644
--- a/examples/simple-remote-tomcatusers/README.adoc
+++ b/examples/simple-remote-tomcatusers/README.adoc
@@ -1,106 +1,106 @@
-index-group=Unrevised
-type=page
-status=published
-
-= Simple Remote Tomcatusers
-
-This is an example on how to use JNDI with security restrictions in TomEE.
-
-
-== Contract
-
-In our example Contract is an interface annotated with @Remote which indicates that all methods of this interface can be accessed by client code.
-[source,java]
-----
-
- @Remote
- public interface Contract {
- String hi();
- }
-----
-== ContractImpl
-
-ContractImpl is a concrete implementation of the Contract interface restricting access to the hi method for users with role test.
-
-[source,java]
-----
-public class ContractImpl implements Contract {
- @Override
- @RolesAllowed("test")
- public String hi() {
- return "hi";
- }
-}
-----
-
-== ContractTest
-
-In this class we test the correctness of our application with Arquillian by creating a war with Contract and ContractImpl classes and deploying to
-an embedded TomEE server with the war name test.war. In arquillian.xml we specify that arquillian pick tomcat-users.xml from src/test/conf folder.
-In tomcat-users.xml there is a single user with username "tomcat", password="users" and role "test".
-
-To test we lookup for the ContractImpl and call the hi method using different usernames and passwords.
-
-
-[source,java]
-----
-@RunWith(Arquillian.class)
-public class ContractTest {
- @Deployment(testable = false)
- public static Archive<?> app() {
- return ShrinkWrap.create(WebArchive.class, "test.war")
- .addClasses(Contract.class, ContractImpl.class);
- }
-
- @ArquillianResource
- private URL base;
-
- @Test
- public void valid() throws NamingException {
- assertEquals("hi", hi(new Properties() {{
- setProperty(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName());
- setProperty(Context.PROVIDER_URL, String.format("http://localhost:%s/tomee/ejb", base.getPort()));
- setProperty(Context.SECURITY_PRINCIPAL, "tomcat");
- setProperty(Context.SECURITY_CREDENTIALS, "users");
- }}));
- }
-
- @Test
- public void invalid() throws NamingException {
- try {
- hi(new Properties() {{
- setProperty(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName());
- setProperty(Context.PROVIDER_URL, String.format("http://localhost:%s/tomee/ejb", base.getPort()));
- setProperty(Context.SECURITY_PRINCIPAL, "tomcat");
- setProperty(Context.SECURITY_CREDENTIALS, "wrong");
- }});
- fail();
- } catch (final AuthenticationException ae) {
- // ok
- }
- }
-
- @Test
- public void missingCredentials() throws NamingException {
- try {
- hi(new Properties() {{
- setProperty(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName());
- setProperty(Context.PROVIDER_URL, String.format("http://localhost:%s/tomee/ejb", base.getPort()));
- }});
- fail();
- } catch (final EJBAccessException eae) {
- // no-op
- }
- }
-
- private String hi(final Properties clientConfig) throws NamingException {
- return Contract.class.cast(new InitialContext(clientConfig).lookup("java:global/test/ContractImpl!org.superbiz.Contract")).hi();
- }
-}
-----
-
-== Run the application:
-
- mvn install
-
+index-group=Unrevised
+type=page
+status=published
+
+= Simple Remote Tomcatusers
+
+This is an example on how to use JNDI with security restrictions in TomEE.
+
+
+== Contract
+
+In our example Contract is an interface annotated with @Remote which indicates that all methods of this interface can be accessed by client code.
+[source,java]
+----
+
+ @Remote
+ public interface Contract {
+ String hi();
+ }
+----
+== ContractImpl
+
+ContractImpl is a concrete implementation of the Contract interface restricting access to the hi method for users with role test.
+
+[source,java]
+----
+public class ContractImpl implements Contract {
+ @Override
+ @RolesAllowed("test")
+ public String hi() {
+ return "hi";
+ }
+}
+----
+
+== ContractTest
+
+In this class we test the correctness of our application with Arquillian by creating a war with Contract and ContractImpl classes and deploying to
+an embedded TomEE server with the war name test.war. In arquillian.xml we specify that arquillian pick tomcat-users.xml from src/test/conf folder.
+In tomcat-users.xml there is a single user with username "tomcat", password="users" and role "test".
+
+To test we lookup for the ContractImpl and call the hi method using different usernames and passwords.
+
+
+[source,java]
+----
+@RunWith(Arquillian.class)
+public class ContractTest {
+ @Deployment(testable = false)
+ public static Archive<?> app() {
+ return ShrinkWrap.create(WebArchive.class, "test.war")
+ .addClasses(Contract.class, ContractImpl.class);
+ }
+
+ @ArquillianResource
+ private URL base;
+
+ @Test
+ public void valid() throws NamingException {
+ assertEquals("hi", hi(new Properties() {{
+ setProperty(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName());
+ setProperty(Context.PROVIDER_URL, String.format("http://localhost:%s/tomee/ejb", base.getPort()));
+ setProperty(Context.SECURITY_PRINCIPAL, "tomcat");
+ setProperty(Context.SECURITY_CREDENTIALS, "users");
+ }}));
+ }
+
+ @Test
+ public void invalid() throws NamingException {
+ try {
+ hi(new Properties() {{
+ setProperty(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName());
+ setProperty(Context.PROVIDER_URL, String.format("http://localhost:%s/tomee/ejb", base.getPort()));
+ setProperty(Context.SECURITY_PRINCIPAL, "tomcat");
+ setProperty(Context.SECURITY_CREDENTIALS, "wrong");
+ }});
+ fail();
+ } catch (final AuthenticationException ae) {
+ // ok
+ }
+ }
+
+ @Test
+ public void missingCredentials() throws NamingException {
+ try {
+ hi(new Properties() {{
+ setProperty(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName());
+ setProperty(Context.PROVIDER_URL, String.format("http://localhost:%s/tomee/ejb", base.getPort()));
+ }});
+ fail();
+ } catch (final EJBAccessException eae) {
+ // no-op
+ }
+ }
+
+ private String hi(final Properties clientConfig) throws NamingException {
+ return Contract.class.cast(new InitialContext(clientConfig).lookup("java:global/test/ContractImpl!org.superbiz.Contract")).hi();
+ }
+}
+----
+
+== Run the application:
+
+ mvn install
+
All test cases will pass.
\ No newline at end of file