From 1f82b70f5e0b13d64e6f8fde1bcc262d16e11ea8 Mon Sep 17 00:00:00 2001 From: Juan Gonzalez Date: Fri, 4 Aug 2017 18:39:46 +0200 Subject: [PATCH 001/117] Unify CDI JarArchive to WebArchive. Arquillian does some transformation if using JavaArchive (transform to WAR and adding some beans.xml automatically, etc). In order to make the archive structure more explicit, unify to use WAR file for CDI cases, adding beans.xml in needed cases --- .../javaee7/cdi/bean/discovery/none/GreetingTest.java | 9 +++++++-- .../java/org/javaee7/cdi/nobeans/xml/ScopedBeanTest.java | 6 +++++- .../jaxrs/singleton/AnnotatedSingletonResourceTest.java | 4 +++- .../jta/transaction/scope/MyTransactionalBeanTest.java | 4 +++- .../MyTransactionalBeanWithUserTransactionTest.java | 5 ++++- .../jta/transactional/MyTransactionalTxTypeBeanTest.java | 4 +++- .../jta/user/transaction/UserTransactionTest.java | 5 +++-- 7 files changed, 28 insertions(+), 9 deletions(-) diff --git a/cdi/bean-discovery-none/src/test/java/org/javaee7/cdi/bean/discovery/none/GreetingTest.java b/cdi/bean-discovery-none/src/test/java/org/javaee7/cdi/bean/discovery/none/GreetingTest.java index ed0d226db..dbfe0044a 100644 --- a/cdi/bean-discovery-none/src/test/java/org/javaee7/cdi/bean/discovery/none/GreetingTest.java +++ b/cdi/bean-discovery-none/src/test/java/org/javaee7/cdi/bean/discovery/none/GreetingTest.java @@ -4,7 +4,9 @@ import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,9 +23,12 @@ public class GreetingTest { @Deployment public static Archive deploy() { - return ShrinkWrap.create(JavaArchive.class) + JavaArchive library = ShrinkWrap.create(JavaArchive.class) .addClasses(Greeting.class, FancyGreeting.class) - .addAsManifestResource("beans.xml"); + .addAsManifestResource("beans.xml"); + return ShrinkWrap.create(WebArchive.class). + addAsLibraries(library). + addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"); } @Inject diff --git a/cdi/nobeans-xml/src/test/java/org/javaee7/cdi/nobeans/xml/ScopedBeanTest.java b/cdi/nobeans-xml/src/test/java/org/javaee7/cdi/nobeans/xml/ScopedBeanTest.java index c12e9d661..781751bc8 100644 --- a/cdi/nobeans-xml/src/test/java/org/javaee7/cdi/nobeans/xml/ScopedBeanTest.java +++ b/cdi/nobeans-xml/src/test/java/org/javaee7/cdi/nobeans/xml/ScopedBeanTest.java @@ -5,6 +5,7 @@ import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,8 +22,11 @@ public class ScopedBeanTest { @Deployment public static Archive deploy() { - return ShrinkWrap.create(JavaArchive.class) + JavaArchive library = ShrinkWrap.create(JavaArchive.class) .addClass(ScopedBean.class); + + return ShrinkWrap.create(WebArchive.class). + addAsLibraries(library); } @Inject diff --git a/jaxrs/singleton/src/test/java/org/javaee7/jaxrs/singleton/AnnotatedSingletonResourceTest.java b/jaxrs/singleton/src/test/java/org/javaee7/jaxrs/singleton/AnnotatedSingletonResourceTest.java index 5fe73a1c4..a117d005f 100644 --- a/jaxrs/singleton/src/test/java/org/javaee7/jaxrs/singleton/AnnotatedSingletonResourceTest.java +++ b/jaxrs/singleton/src/test/java/org/javaee7/jaxrs/singleton/AnnotatedSingletonResourceTest.java @@ -5,6 +5,7 @@ import org.jboss.arquillian.junit.InSequence; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.After; import org.junit.Before; @@ -49,7 +50,8 @@ public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class) .addClasses( MyAnnotatedApplication.class, - AnnotatedSingletonResource.class); + AnnotatedSingletonResource.class) + .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"); } @Test diff --git a/jta/transactional/src/test/java/org/javaee7/jta/transaction/scope/MyTransactionalBeanTest.java b/jta/transactional/src/test/java/org/javaee7/jta/transaction/scope/MyTransactionalBeanTest.java index 2a5252117..e00c6c2da 100644 --- a/jta/transactional/src/test/java/org/javaee7/jta/transaction/scope/MyTransactionalBeanTest.java +++ b/jta/transactional/src/test/java/org/javaee7/jta/transaction/scope/MyTransactionalBeanTest.java @@ -5,6 +5,7 @@ import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; import org.junit.runner.RunWith; @@ -23,9 +24,10 @@ public class MyTransactionalBeanTest { @Deployment public static Archive deploy() { - return ShrinkWrap.create(JavaArchive.class) + JavaArchive library = ShrinkWrap.create(JavaArchive.class) .addClasses(MyTransactionalBean.class, MyTransactionScopedBean.class) .addAsManifestResource("beans.xml"); + return ShrinkWrap.create(WebArchive.class).addAsLibraries(library); } @Inject diff --git a/jta/transactional/src/test/java/org/javaee7/jta/transaction/scope/MyTransactionalBeanWithUserTransactionTest.java b/jta/transactional/src/test/java/org/javaee7/jta/transaction/scope/MyTransactionalBeanWithUserTransactionTest.java index ab543ce3b..9ddb1d47c 100644 --- a/jta/transactional/src/test/java/org/javaee7/jta/transaction/scope/MyTransactionalBeanWithUserTransactionTest.java +++ b/jta/transactional/src/test/java/org/javaee7/jta/transaction/scope/MyTransactionalBeanWithUserTransactionTest.java @@ -5,6 +5,7 @@ import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; import org.junit.runner.RunWith; @@ -24,9 +25,11 @@ public class MyTransactionalBeanWithUserTransactionTest { @Deployment public static Archive deploy() { - return ShrinkWrap.create(JavaArchive.class) + JavaArchive library = ShrinkWrap.create(JavaArchive.class) .addClasses(MyTransactionalBean.class, MyTransactionScopedBean.class) .addAsManifestResource("beans.xml"); + + return ShrinkWrap.create(WebArchive.class).addAsLibraries(library); } @Inject diff --git a/jta/transactional/src/test/java/org/javaee7/jta/transactional/MyTransactionalTxTypeBeanTest.java b/jta/transactional/src/test/java/org/javaee7/jta/transactional/MyTransactionalTxTypeBeanTest.java index 066599f03..c5668c8ca 100644 --- a/jta/transactional/src/test/java/org/javaee7/jta/transactional/MyTransactionalTxTypeBeanTest.java +++ b/jta/transactional/src/test/java/org/javaee7/jta/transactional/MyTransactionalTxTypeBeanTest.java @@ -5,6 +5,7 @@ import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,8 +19,9 @@ public class MyTransactionalTxTypeBeanTest { @Deployment public static Archive deploy() { - return ShrinkWrap.create(JavaArchive.class) + Archive library = ShrinkWrap.create(JavaArchive.class) .addClass(MyTransactionalTxTypeBean.class); + return ShrinkWrap.create(WebArchive.class).addAsLibraries(library); } @Inject diff --git a/jta/user-transaction/src/test/java/org/javaee7/jta/user/transaction/UserTransactionTest.java b/jta/user-transaction/src/test/java/org/javaee7/jta/user/transaction/UserTransactionTest.java index dcb3bb556..f5a2771a4 100644 --- a/jta/user-transaction/src/test/java/org/javaee7/jta/user/transaction/UserTransactionTest.java +++ b/jta/user-transaction/src/test/java/org/javaee7/jta/user/transaction/UserTransactionTest.java @@ -4,8 +4,8 @@ import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; import org.junit.runner.RunWith; @@ -22,8 +22,9 @@ public class UserTransactionTest { @Deployment public static Archive deploy() { - return ShrinkWrap.create(JavaArchive.class) + Archive library = ShrinkWrap.create(JavaArchive.class) .addAsManifestResource("beans.xml"); + return ShrinkWrap.create(WebArchive.class).addAsLibraries(library); } @Inject From 8f207e2f50c28f209cd4b40c5c7e6a4132b00e16 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 7 Sep 2017 00:31:44 +0200 Subject: [PATCH 002/117] Small amount of formatting in poms --- jaxrs/jsonp/pom.xml | 6 +++--- jaxrs/pom.xml | 5 +---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/jaxrs/jsonp/pom.xml b/jaxrs/jsonp/pom.xml index 8ac7dbf63..f7387998d 100644 --- a/jaxrs/jsonp/pom.xml +++ b/jaxrs/jsonp/pom.xml @@ -1,14 +1,14 @@ - - 4.0.0 +4.0.0 org.javaee7 jaxrs 1.0-SNAPSHOT - ../pom.xml + jaxrs-jsonp war Java EE 7 Sample: jaxrs - jsonp + diff --git a/jaxrs/pom.xml b/jaxrs/pom.xml index f758c6ac8..5ee96fa95 100644 --- a/jaxrs/pom.xml +++ b/jaxrs/pom.xml @@ -1,6 +1,5 @@ - - 4.0.0 + 4.0.0 org.javaee7 @@ -30,14 +29,12 @@ jsonp link mapping-exceptions - paramconverter readerwriter readerwriter-json request-binding resource-validation server-negotiation - singleton readerwriter-injection jaxrs-security-declarative From 4b9738ddf81a9e2111c16da1e0efaf0aa63ade58 Mon Sep 17 00:00:00 2001 From: Glenn Buckholtz Date: Fri, 13 Oct 2017 16:39:36 -0400 Subject: [PATCH 003/117] fixed some dependency problems arquillian-payara-server-4-managed seems to have moved to fish.payara.arquillian --- pom.xml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 7fc2472c7..adc47db13 100644 --- a/pom.xml +++ b/pom.xml @@ -173,22 +173,26 @@ org.jboss.arquillian.junit arquillian-junit-container + 1.1.7.Final test org.jboss.arquillian.protocol arquillian-protocol-servlet + 1.1.7.Final test org.jboss.shrinkwrap.resolver shrinkwrap-resolver-impl-maven + 2.1.1 test jar org.jboss.shrinkwrap.resolver shrinkwrap-resolver-impl-maven-archive + 2.1.1 test @@ -366,13 +370,12 @@ 2.25.1 test - - + + - org.omnifaces - arquillian-payara-server-4-managed - 1.0-beta-SNAPSHOT - test + fish.payara.arquillian + arquillian-payara-server-4-managed + 1.0.Beta2 @@ -1607,3 +1610,4 @@ + From b635b7635e0378abc0631a0a06a0269320c6a57f Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Thu, 26 Oct 2017 11:07:19 +0100 Subject: [PATCH 004/117] Updated JMS message receive timeouts to 10 seconds --- jms/send-receive/nbactions-payara-remote.xml | 12 +++++++++++ .../classic/ClassicMessageReceiver.java | 4 ++-- .../receive/simple/MessageReceiverSync.java | 8 ++++---- .../appmanaged/MessageReceiverAppManaged.java | 4 ++-- .../javaee7/jms/send/receive/SyncTest.java | 20 +++++++++---------- .../jms/send/receive/mdb/AsyncTest.java | 8 +++----- .../receive/mdb/ReceptionSynchronizer.java | 10 +++++----- .../mdb/ReceptionSynchronizerTest.java | 2 +- 8 files changed, 39 insertions(+), 29 deletions(-) create mode 100644 jms/send-receive/nbactions-payara-remote.xml diff --git a/jms/send-receive/nbactions-payara-remote.xml b/jms/send-receive/nbactions-payara-remote.xml new file mode 100644 index 000000000..d64120caa --- /dev/null +++ b/jms/send-receive/nbactions-payara-remote.xml @@ -0,0 +1,12 @@ + + + + test + + * + + + test + + + diff --git a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/classic/ClassicMessageReceiver.java b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/classic/ClassicMessageReceiver.java index e54c466e7..cc5f43474 100644 --- a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/classic/ClassicMessageReceiver.java +++ b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/classic/ClassicMessageReceiver.java @@ -64,7 +64,7 @@ public class ClassicMessageReceiver { @Resource(mappedName = Resources.CLASSIC_QUEUE) Queue demoQueue; - public String receiveMessage() { + public String receiveMessage(int timeoutInMillis) { String response = null; Connection connection = null; try { @@ -72,7 +72,7 @@ public String receiveMessage() { connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageConsumer messageConsumer = session.createConsumer(demoQueue); - Message message = messageConsumer.receive(5000); + Message message = messageConsumer.receive(timeoutInMillis); response = message.getBody(String.class); } catch (JMSException ex) { ex.printStackTrace(); diff --git a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageReceiverSync.java b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageReceiverSync.java index 975ddf2d7..6ab194142 100644 --- a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageReceiverSync.java +++ b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageReceiverSync.java @@ -64,17 +64,17 @@ public class MessageReceiverSync { @Resource(mappedName = Resources.SYNC_CONTAINER_MANAGED_QUEUE) Queue myQueue; - public String receiveMessage() { - return context.createConsumer(myQueue).receiveBody(String.class, 1000); + public String receiveMessage(int timeoutInMillis) { + return context.createConsumer(myQueue).receiveBody(String.class, timeoutInMillis); } - public void receiveAll() { + public void receiveAll(int timeoutInMillis) { System.out.println("--> Receiving redundant messages ..."); try { QueueBrowser browser = context.createBrowser(myQueue); while (browser.getEnumeration().hasMoreElements()) { System.out.println("--> here is one"); - context.createConsumer(myQueue).receiveBody(String.class, 1000); + context.createConsumer(myQueue).receiveBody(String.class, timeoutInMillis); } } catch (JMSException ex) { Logger.getLogger(MessageReceiverSync.class.getName()).log(Level.SEVERE, null, ex); diff --git a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/appmanaged/MessageReceiverAppManaged.java b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/appmanaged/MessageReceiverAppManaged.java index 031880e3a..d5398f15a 100644 --- a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/appmanaged/MessageReceiverAppManaged.java +++ b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/appmanaged/MessageReceiverAppManaged.java @@ -19,9 +19,9 @@ public class MessageReceiverAppManaged { @Resource(mappedName = Resources.SYNC_APP_MANAGED_QUEUE) Queue myQueue; - public String receiveMessage() { + public String receiveMessage(int timeoutInMillis) { try (JMSContext context = factory.createContext()) { - return context.createConsumer(myQueue).receiveBody(String.class, 1000); + return context.createConsumer(myQueue).receiveBody(String.class, timeoutInMillis); } } } diff --git a/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/SyncTest.java b/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/SyncTest.java index 77aadae2f..a0e1ea6a8 100644 --- a/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/SyncTest.java +++ b/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/SyncTest.java @@ -1,6 +1,5 @@ package org.javaee7.jms.send.receive; -import java.util.Arrays; import org.javaee7.jms.send.receive.classic.ClassicMessageSender; import org.javaee7.jms.send.receive.classic.ClassicMessageReceiver; import org.junit.Test; @@ -16,7 +15,6 @@ import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.WebArchive; -import org.junit.Before; import org.junit.runner.RunWith; /** @@ -42,13 +40,15 @@ public class SyncTest { @EJB MessageReceiverAppManaged appManagedReceiver; + + private final int messageReceiveTimeoutInMillis = 10000; @Test public void testClassicApi() { String message = "The test message over JMS 1.1 API"; classicSender.sendMessage(message); - assertEquals(message, classicReceiver.receiveMessage()); + assertEquals(message, classicReceiver.receiveMessage(messageReceiveTimeoutInMillis)); } @Test @@ -56,7 +56,7 @@ public void testContainerManagedJmsContext() { String message = "Test message over container-managed JMSContext"; simpleSender.sendMessage(message); - assertEquals(message, simpleReceiver.receiveMessage()); + assertEquals(message, simpleReceiver.receiveMessage(messageReceiveTimeoutInMillis)); } @Test @@ -64,21 +64,21 @@ public void testAppManagedJmsContext() { String message = "The test message over app-managed JMSContext"; appManagedSender.sendMessage(message); - assertEquals(message, appManagedReceiver.receiveMessage()); + assertEquals(message, appManagedReceiver.receiveMessage(messageReceiveTimeoutInMillis)); } @Test public void testMultipleSendAndReceive() { simpleSender.sendMessage("1"); simpleSender.sendMessage("2"); - assertEquals("1", simpleReceiver.receiveMessage()); - assertEquals("2", simpleReceiver.receiveMessage()); + assertEquals("1", simpleReceiver.receiveMessage(messageReceiveTimeoutInMillis)); + assertEquals("2", simpleReceiver.receiveMessage(messageReceiveTimeoutInMillis)); simpleSender.sendMessage("3"); simpleSender.sendMessage("4"); simpleSender.sendMessage("5"); - assertEquals("3", simpleReceiver.receiveMessage()); - assertEquals("4", simpleReceiver.receiveMessage()); - assertEquals("5", simpleReceiver.receiveMessage()); + assertEquals("3", simpleReceiver.receiveMessage(messageReceiveTimeoutInMillis)); + assertEquals("4", simpleReceiver.receiveMessage(messageReceiveTimeoutInMillis)); + assertEquals("5", simpleReceiver.receiveMessage(messageReceiveTimeoutInMillis)); } @Deployment diff --git a/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/AsyncTest.java b/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/AsyncTest.java index e7aae55f2..acddc4d7a 100644 --- a/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/AsyncTest.java +++ b/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/AsyncTest.java @@ -1,11 +1,7 @@ package org.javaee7.jms.send.receive.mdb; import org.javaee7.jms.send.receive.simple.MessageSenderAsync; -import org.javaee7.jms.send.receive.mdb.MessageReceiverAsync; -import org.javaee7.jms.send.receive.simple.MessageSenderSync; -import org.javaee7.jms.send.receive.simple.MessageReceiverSync; import org.junit.Test; -import static org.junit.Assert.*; import java.io.File; @@ -27,11 +23,13 @@ public class AsyncTest { @EJB MessageSenderAsync asyncSender; + + private final int messageReceiveTimeoutInMillis = 10000; @Test public void testAsync() throws Exception { asyncSender.sendMessage("Fire!"); - ReceptionSynchronizer.waitFor(MessageReceiverAsync.class, "onMessage"); + ReceptionSynchronizer.waitFor(MessageReceiverAsync.class, "onMessage" , messageReceiveTimeoutInMillis); // unless we timed out, the test passes } diff --git a/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/ReceptionSynchronizer.java b/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/ReceptionSynchronizer.java index 23554fb00..c7166de43 100644 --- a/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/ReceptionSynchronizer.java +++ b/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/ReceptionSynchronizer.java @@ -63,7 +63,7 @@ void registerInvocation(Method m) { } } - public static void waitFor(Class clazz, String methodName) throws InterruptedException { + public static void waitFor(Class clazz, String methodName, int timeoutInMillis) throws InterruptedException { Method method = null; for (Method declaredMethod : clazz.getDeclaredMethods()) { if (methodName.equals(declaredMethod.getName())) { @@ -77,10 +77,10 @@ public static void waitFor(Class clazz, String methodName) throws Interrupted if (method == null) { throw new IllegalArgumentException(methodName + " not found in " + clazz.getSimpleName()); } - waitFor(method); + waitFor(method, timeoutInMillis); } - private static void waitFor(Method method) throws InterruptedException { + private static void waitFor(Method method, int timeoutInMillis) throws InterruptedException { CountDownLatch latch; synchronized (barrier) { if (barrier.containsKey(method)) { @@ -95,8 +95,8 @@ private static void waitFor(Method method) throws InterruptedException { barrier.put(method, latch); } } - if (!latch.await(2, TimeUnit.SECONDS)) { - throw new AssertionError("Expected method has not been invoked"); + if (!latch.await(timeoutInMillis, TimeUnit.MILLISECONDS)) { + throw new AssertionError("Expected method has not been invoked in " + timeoutInMillis + "ms"); } } diff --git a/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/ReceptionSynchronizerTest.java b/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/ReceptionSynchronizerTest.java index 33cc45800..90886e779 100644 --- a/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/ReceptionSynchronizerTest.java +++ b/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/ReceptionSynchronizerTest.java @@ -26,7 +26,7 @@ public void run() { cut.registerInvocation(method); } }, 1, TimeUnit.SECONDS); - ReceptionSynchronizer.waitFor(ReceptionSynchronizerTest.class, "testWaiting"); + ReceptionSynchronizer.waitFor(ReceptionSynchronizerTest.class, "testWaiting", 2000); long waitTime = System.currentTimeMillis() - startTime; assertTrue("Waited more than 950ms", waitTime > 950); assertTrue("Waited no longer than 1050ms", waitTime < 1050); From 18c7efee43d26f4df29f8e706617b8604447e991 Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Thu, 26 Oct 2017 12:09:02 +0100 Subject: [PATCH 005/117] Made sure errors were correctly thrown, so that receivers don't wait the full duration if sending fails --- .../classic/ClassicMessageReceiver.java | 31 +++++++++------- .../receive/classic/ClassicMessageSender.java | 25 +++++-------- .../receive/mdb/MessageReceiverAsync.java | 6 +-- .../receive/simple/MessageReceiverSync.java | 37 ++++++++++++------- .../receive/simple/MessageSenderAsync.java | 21 ++++++++--- .../receive/simple/MessageSenderSync.java | 10 ++++- .../appmanaged/MessageReceiverAppManaged.java | 20 +++++++++- .../appmanaged/MessageSenderAppManaged.java | 14 +++++-- .../javaee7/jms/send/receive/SyncTest.java | 11 ++++-- .../jms/send/receive/mdb/AsyncTest.java | 2 +- 10 files changed, 116 insertions(+), 61 deletions(-) diff --git a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/classic/ClassicMessageReceiver.java b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/classic/ClassicMessageReceiver.java index cc5f43474..9b5055d71 100644 --- a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/classic/ClassicMessageReceiver.java +++ b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/classic/ClassicMessageReceiver.java @@ -39,6 +39,7 @@ */ package org.javaee7.jms.send.receive.classic; +import java.util.concurrent.TimeoutException; import javax.annotation.Resource; import javax.ejb.Stateless; import javax.jms.Connection; @@ -53,6 +54,7 @@ /** * Synchronized message receiver using classic API. + * * @author Arun Gupta */ @Stateless @@ -64,26 +66,27 @@ public class ClassicMessageReceiver { @Resource(mappedName = Resources.CLASSIC_QUEUE) Queue demoQueue; - public String receiveMessage(int timeoutInMillis) { + /** + * Waits to receive a message from the JMS queue. Times out after a given + * number of milliseconds. + * + * @param timeoutInMillis The number of milliseconds this method will wait + * before throwing an exception. + * @return The contents of the message. + * @throws JMSException if an error occurs in accessing the queue. + * @throws TimeoutException if the timeout is reached. + */ + public String receiveMessage(int timeoutInMillis) throws JMSException, TimeoutException { String response = null; - Connection connection = null; - try { - connection = connectionFactory.createConnection(); + try (Connection connection = connectionFactory.createConnection()) { connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageConsumer messageConsumer = session.createConsumer(demoQueue); Message message = messageConsumer.receive(timeoutInMillis); - response = message.getBody(String.class); - } catch (JMSException ex) { - ex.printStackTrace(); - } finally { - if (connection != null) { - try { - connection.close(); - } catch (JMSException ex) { - ex.printStackTrace(); - } + if (message == null) { + throw new TimeoutException("No message received after " + timeoutInMillis + "ms"); } + response = message.getBody(String.class); } return response; } diff --git a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/classic/ClassicMessageSender.java b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/classic/ClassicMessageSender.java index eea82a56a..d0aac2857 100644 --- a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/classic/ClassicMessageSender.java +++ b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/classic/ClassicMessageSender.java @@ -53,6 +53,7 @@ /** * Sending a message using classic JMS API. + * * @author Arun Gupta */ @Stateless @@ -64,25 +65,19 @@ public class ClassicMessageSender { @Resource(mappedName = Resources.CLASSIC_QUEUE) Queue demoQueue; - public void sendMessage(String payload) { - Connection connection = null; - try { - connection = connectionFactory.createConnection(); + /** + * Send a message to the JMS queue. + * + * @param payload the contents of the message. + * @throws JMSException if an error occurs in accessing the queue. + */ + public void sendMessage(String payload) throws JMSException { + try (Connection connection = connectionFactory.createConnection()) { connection.start(); - Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + Session session = connection.createSession(Session.AUTO_ACKNOWLEDGE); MessageProducer messageProducer = session.createProducer(demoQueue); TextMessage textMessage = session.createTextMessage(payload); messageProducer.send(textMessage); - } catch (JMSException ex) { - ex.printStackTrace(); - } finally { - if (connection != null) { - try { - connection.close(); - } catch (JMSException ex) { - ex.printStackTrace(); - } - } } } } diff --git a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/mdb/MessageReceiverAsync.java b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/mdb/MessageReceiverAsync.java index 4c426fd63..cb4162ec4 100644 --- a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/mdb/MessageReceiverAsync.java +++ b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/mdb/MessageReceiverAsync.java @@ -52,14 +52,14 @@ /** * A message driven bean with newly standardized activation config properties. + * * @author Arun Gupta */ @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationLookup", - propertyValue = Resources.ASYNC_QUEUE), + propertyValue = Resources.ASYNC_QUEUE), @ActivationConfigProperty(propertyName = "destinationType", - propertyValue = "javax.jms.Queue"), -}) + propertyValue = "javax.jms.Queue"),}) public class MessageReceiverAsync implements MessageListener { @Override diff --git a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageReceiverSync.java b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageReceiverSync.java index 6ab194142..2612dcabb 100644 --- a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageReceiverSync.java +++ b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageReceiverSync.java @@ -39,13 +39,13 @@ */ package org.javaee7.jms.send.receive.simple; -import java.util.logging.Level; -import java.util.logging.Logger; +import java.util.concurrent.TimeoutException; import javax.annotation.Resource; import javax.ejb.Stateless; import javax.inject.Inject; import javax.jms.JMSContext; import javax.jms.JMSException; +import javax.jms.JMSRuntimeException; import javax.jms.Queue; import javax.jms.QueueBrowser; @@ -53,6 +53,7 @@ /** * Synchronous message reception with container-managed JMSContext. + * * @author Arun Gupta */ @Stateless @@ -64,20 +65,30 @@ public class MessageReceiverSync { @Resource(mappedName = Resources.SYNC_CONTAINER_MANAGED_QUEUE) Queue myQueue; - public String receiveMessage(int timeoutInMillis) { - return context.createConsumer(myQueue).receiveBody(String.class, timeoutInMillis); + /** + * Waits to receive a message from the JMS queue. Times out after a given + * number of milliseconds. + * + * @param timeoutInMillis The number of milliseconds this method will wait + * before throwing an exception. + * @return The contents of the message. + * @throws JMSRuntimeException if an error occurs in accessing the queue. + * @throws TimeoutException if the timeout is reached. + */ + public String receiveMessage(int timeoutInMillis) throws JMSRuntimeException, TimeoutException { + String message = context.createConsumer(myQueue).receiveBody(String.class, timeoutInMillis); + if (message == null) { + throw new TimeoutException("No message received after " + timeoutInMillis + "ms"); + } + return message; } - public void receiveAll(int timeoutInMillis) { + public void receiveAll(int timeoutInMillis) throws JMSException { System.out.println("--> Receiving redundant messages ..."); - try { - QueueBrowser browser = context.createBrowser(myQueue); - while (browser.getEnumeration().hasMoreElements()) { - System.out.println("--> here is one"); - context.createConsumer(myQueue).receiveBody(String.class, timeoutInMillis); - } - } catch (JMSException ex) { - Logger.getLogger(MessageReceiverSync.class.getName()).log(Level.SEVERE, null, ex); + QueueBrowser browser = context.createBrowser(myQueue); + while (browser.getEnumeration().hasMoreElements()) { + System.out.println("--> here is one"); + context.createConsumer(myQueue).receiveBody(String.class, timeoutInMillis); } } } diff --git a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageSenderAsync.java b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageSenderAsync.java index 25dc37525..714eec784 100644 --- a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageSenderAsync.java +++ b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageSenderAsync.java @@ -47,6 +47,8 @@ import javax.jms.CompletionListener; import javax.jms.JMSContext; import javax.jms.JMSException; +import javax.jms.JMSProducer; +import javax.jms.JMSRuntimeException; import javax.jms.Message; import javax.jms.Queue; @@ -54,6 +56,7 @@ /** * Asynchronous message sending is not supported in Java EE 7. + * * @author Arun Gupta */ @Stateless @@ -66,9 +69,17 @@ public class MessageSenderAsync { @Resource(lookup = Resources.ASYNC_QUEUE) Queue asyncQueue; - public void sendMessage(String message) { + /** + * Send a message to the JMS queue. Prin + * + * @param message the contents of the message. + * @throws JMSRuntimeException if an error occurs in accessing the queue. + */ + public void sendMessage(String message) throws JMSRuntimeException { + JMSProducer producer = context.createProducer(); + try { - context.createProducer().setAsync(new CompletionListener() { + producer.setAsync(new CompletionListener() { @Override public void onCompletion(Message msg) { try { @@ -87,10 +98,10 @@ public void onException(Message msg, Exception e) { } } }); - } catch (RuntimeException e) { - System.out.println("Caught RuntimeException trying to invoke setAsync - not permitted in Java EE"); + } catch (JMSRuntimeException ex) { + System.out.println("Caught RuntimeException trying to invoke setAsync - not permitted in Java EE. Resorting to synchronous sending..."); } - context.createProducer().send(asyncQueue, message); + producer.send(asyncQueue, message); } } diff --git a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageSenderSync.java b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageSenderSync.java index 051f021e0..94a494bf0 100644 --- a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageSenderSync.java +++ b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/MessageSenderSync.java @@ -43,12 +43,14 @@ import javax.ejb.Stateless; import javax.inject.Inject; import javax.jms.JMSContext; +import javax.jms.JMSRuntimeException; import javax.jms.Queue; import org.javaee7.jms.send.receive.Resources; /** * Synchronous message sending with container-managed JMSContext. + * * @author Arun Gupta */ @Stateless @@ -61,7 +63,13 @@ public class MessageSenderSync { @Resource(mappedName = Resources.SYNC_CONTAINER_MANAGED_QUEUE) Queue syncQueue; - public void sendMessage(String message) { + /** + * Send a message to the JMS queue. + * + * @param message the contents of the message. + * @throws JMSRuntimeException if an error occurs in accessing the queue. + */ + public void sendMessage(String message) throws JMSRuntimeException { context.createProducer().send(syncQueue, message); } } diff --git a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/appmanaged/MessageReceiverAppManaged.java b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/appmanaged/MessageReceiverAppManaged.java index d5398f15a..90a2b3e27 100644 --- a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/appmanaged/MessageReceiverAppManaged.java +++ b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/appmanaged/MessageReceiverAppManaged.java @@ -1,9 +1,11 @@ package org.javaee7.jms.send.receive.simple.appmanaged; +import java.util.concurrent.TimeoutException; import javax.annotation.Resource; import javax.ejb.Stateless; import javax.jms.ConnectionFactory; import javax.jms.JMSContext; +import javax.jms.JMSRuntimeException; import javax.jms.Queue; import org.javaee7.jms.send.receive.Resources; @@ -19,9 +21,23 @@ public class MessageReceiverAppManaged { @Resource(mappedName = Resources.SYNC_APP_MANAGED_QUEUE) Queue myQueue; - public String receiveMessage(int timeoutInMillis) { + /** + * Waits to receive a message from the JMS queue. Times out after a given + * number of milliseconds. + * + * @param timeoutInMillis The number of milliseconds this method will wait + * before throwing an exception. + * @return The contents of the message. + * @throws JMSRuntimeException if an error occurs in accessing the queue. + * @throws TimeoutException if the timeout is reached. + */ + public String receiveMessage(int timeoutInMillis) throws JMSRuntimeException, TimeoutException { try (JMSContext context = factory.createContext()) { - return context.createConsumer(myQueue).receiveBody(String.class, timeoutInMillis); + String message = context.createConsumer(myQueue).receiveBody(String.class, timeoutInMillis); + if (message == null) { + throw new TimeoutException("No message received after " + timeoutInMillis + "ms"); + } + return message; } } } diff --git a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/appmanaged/MessageSenderAppManaged.java b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/appmanaged/MessageSenderAppManaged.java index a58693002..8b85c57fb 100644 --- a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/appmanaged/MessageSenderAppManaged.java +++ b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/simple/appmanaged/MessageSenderAppManaged.java @@ -4,13 +4,15 @@ import javax.ejb.Stateless; import javax.jms.ConnectionFactory; import javax.jms.JMSContext; +import javax.jms.JMSRuntimeException; import javax.jms.Queue; import org.javaee7.jms.send.receive.Resources; /** - * Synchronous message sending with app-managed JMSContext. - * JMSContext can be used with try-with-resources construct. + * Synchronous message sending with app-managed JMSContext. JMSContext can be + * used with try-with-resources construct. + * * @author Arun Gupta */ @Stateless @@ -22,7 +24,13 @@ public class MessageSenderAppManaged { @Resource(mappedName = Resources.SYNC_APP_MANAGED_QUEUE) Queue myQueue; - public void sendMessage(String message) { + /** + * Send a message to the JMS queue. + * + * @param message the contents of the message. + * @throws JMSRuntimeException if an error occurs in accessing the queue. + */ + public void sendMessage(String message) throws JMSRuntimeException { try (JMSContext context = factory.createContext()) { context.createProducer().send(myQueue, message); } diff --git a/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/SyncTest.java b/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/SyncTest.java index a0e1ea6a8..3264369a0 100644 --- a/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/SyncTest.java +++ b/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/SyncTest.java @@ -1,11 +1,14 @@ package org.javaee7.jms.send.receive; +import java.util.concurrent.TimeoutException; import org.javaee7.jms.send.receive.classic.ClassicMessageSender; import org.javaee7.jms.send.receive.classic.ClassicMessageReceiver; import org.junit.Test; import static org.junit.Assert.*; import javax.ejb.EJB; +import javax.jms.JMSException; +import javax.jms.JMSRuntimeException; import org.javaee7.jms.send.receive.simple.MessageReceiverSync; import org.javaee7.jms.send.receive.simple.MessageSenderSync; @@ -44,7 +47,7 @@ public class SyncTest { private final int messageReceiveTimeoutInMillis = 10000; @Test - public void testClassicApi() { + public void testClassicApi() throws JMSException, TimeoutException { String message = "The test message over JMS 1.1 API"; classicSender.sendMessage(message); @@ -52,7 +55,7 @@ public void testClassicApi() { } @Test - public void testContainerManagedJmsContext() { + public void testContainerManagedJmsContext() throws JMSRuntimeException, TimeoutException { String message = "Test message over container-managed JMSContext"; simpleSender.sendMessage(message); @@ -60,7 +63,7 @@ public void testContainerManagedJmsContext() { } @Test - public void testAppManagedJmsContext() { + public void testAppManagedJmsContext() throws JMSRuntimeException, TimeoutException { String message = "The test message over app-managed JMSContext"; appManagedSender.sendMessage(message); @@ -68,7 +71,7 @@ public void testAppManagedJmsContext() { } @Test - public void testMultipleSendAndReceive() { + public void testMultipleSendAndReceive() throws JMSRuntimeException, TimeoutException { simpleSender.sendMessage("1"); simpleSender.sendMessage("2"); assertEquals("1", simpleReceiver.receiveMessage(messageReceiveTimeoutInMillis)); diff --git a/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/AsyncTest.java b/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/AsyncTest.java index acddc4d7a..37c1fd926 100644 --- a/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/AsyncTest.java +++ b/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/AsyncTest.java @@ -27,7 +27,7 @@ public class AsyncTest { private final int messageReceiveTimeoutInMillis = 10000; @Test - public void testAsync() throws Exception { + public void testAsync() throws InterruptedException { asyncSender.sendMessage("Fire!"); ReceptionSynchronizer.waitFor(MessageReceiverAsync.class, "onMessage" , messageReceiveTimeoutInMillis); // unless we timed out, the test passes From d551d2dd61a496fb9a2c9f8e8d097e818fd9bf7e Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Thu, 26 Oct 2017 12:11:58 +0100 Subject: [PATCH 006/117] Made resources application scoped, so that they're correctly cleared after undeploy --- .../main/java/org/javaee7/jms/send/receive/Resources.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/Resources.java b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/Resources.java index 418cb9339..b5f21df23 100644 --- a/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/Resources.java +++ b/jms/send-receive/src/main/java/org/javaee7/jms/send/receive/Resources.java @@ -31,8 +31,8 @@ description = "My Sync Queue for Container-managed JMSContext") }) public class Resources { - public static final String SYNC_APP_MANAGED_QUEUE = "java:global/jms/mySyncAppQueue"; - public static final String SYNC_CONTAINER_MANAGED_QUEUE = "java:global/jms/mySyncContainerQueue"; - public static final String ASYNC_QUEUE = "java:global/jms/myAsyncQueue"; - public static final String CLASSIC_QUEUE = "java:global/jms/classicQueue"; + public static final String SYNC_APP_MANAGED_QUEUE = "java:app/jms/mySyncAppQueue"; + public static final String SYNC_CONTAINER_MANAGED_QUEUE = "java:app/jms/mySyncContainerQueue"; + public static final String ASYNC_QUEUE = "java:app/jms/myAsyncQueue"; + public static final String CLASSIC_QUEUE = "java:app/jms/classicQueue"; } From 865c9d4bb79e764277b2bb5059fd501b9ed1b38a Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Thu, 26 Oct 2017 12:17:25 +0100 Subject: [PATCH 007/117] Removed netbeans specific file --- jms/send-receive/nbactions-payara-remote.xml | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 jms/send-receive/nbactions-payara-remote.xml diff --git a/jms/send-receive/nbactions-payara-remote.xml b/jms/send-receive/nbactions-payara-remote.xml deleted file mode 100644 index d64120caa..000000000 --- a/jms/send-receive/nbactions-payara-remote.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - test - - * - - - test - - - From 94d253e70027867b23095ddb336c9c3f57aa7ec3 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 7 Nov 2017 22:11:19 +0100 Subject: [PATCH 008/117] Remove generated files --- .../javaee7/jaxws/client/gen/AddAppendix.java | 79 ------- .../jaxws/client/gen/AddAppendixResponse.java | 62 ----- .../org/javaee7/jaxws/client/gen/EBook.java | 134 ----------- .../javaee7/jaxws/client/gen/EBookStore.java | 97 -------- .../client/gen/EBookStoreImplService.java | 71 ------ .../javaee7/jaxws/client/gen/FindEBooks.java | 60 ----- .../jaxws/client/gen/FindEBooksResponse.java | 69 ------ .../jaxws/client/gen/ObjectFactory.java | 223 ------------------ .../javaee7/jaxws/client/gen/SaveBook.java | 60 ----- .../jaxws/client/gen/SaveBookResponse.java | 32 --- .../javaee7/jaxws/client/gen/TakeBook.java | 60 ----- .../jaxws/client/gen/TakeBookResponse.java | 62 ----- .../jaxws/client/gen/WelcomeMessage.java | 60 ----- .../client/gen/WelcomeMessageResponse.java | 62 ----- .../jaxws/client/gen/package-info.java | 2 - .../WEB-INF/wsdl/EBookStoreImplService.wsdl | 115 --------- .../wsdl/EBookStoreImplService_schema1.xsd | 92 -------- 17 files changed, 1340 deletions(-) delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/AddAppendix.java delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/AddAppendixResponse.java delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/EBook.java delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/EBookStore.java delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/EBookStoreImplService.java delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/FindEBooks.java delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/FindEBooksResponse.java delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/ObjectFactory.java delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/SaveBook.java delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/SaveBookResponse.java delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/TakeBook.java delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/TakeBookResponse.java delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/WelcomeMessage.java delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/WelcomeMessageResponse.java delete mode 100644 jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/package-info.java delete mode 100644 jaxws/jaxws-endpoint/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService.wsdl delete mode 100644 jaxws/jaxws-endpoint/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService_schema1.xsd diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/AddAppendix.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/AddAppendix.java deleted file mode 100644 index 31145f741..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/AddAppendix.java +++ /dev/null @@ -1,79 +0,0 @@ - -package org.javaee7.jaxws.client.gen; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for addAppendix complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="addAppendix">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="arg0" type="{http://endpoint.jaxws.javaee7.org/}eBook" minOccurs="0"/>
- *         <element name="arg1" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "addAppendix", propOrder = { - "arg0", - "arg1" -}) -public class AddAppendix { - - protected EBook arg0; - protected int arg1; - - /** - * Gets the value of the arg0 property. - * - * @return - * possible object is - * {@link EBook } - * - */ - public EBook getArg0() { - return arg0; - } - - /** - * Sets the value of the arg0 property. - * - * @param value - * allowed object is - * {@link EBook } - * - */ - public void setArg0(EBook value) { - this.arg0 = value; - } - - /** - * Gets the value of the arg1 property. - * - */ - public int getArg1() { - return arg1; - } - - /** - * Sets the value of the arg1 property. - * - */ - public void setArg1(int value) { - this.arg1 = value; - } - -} diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/AddAppendixResponse.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/AddAppendixResponse.java deleted file mode 100644 index ce71d9a38..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/AddAppendixResponse.java +++ /dev/null @@ -1,62 +0,0 @@ - -package org.javaee7.jaxws.client.gen; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for addAppendixResponse complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="addAppendixResponse">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="return" type="{http://endpoint.jaxws.javaee7.org/}eBook" minOccurs="0"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "addAppendixResponse", propOrder = { - "_return" -}) -public class AddAppendixResponse { - - @XmlElement(name = "return") - protected EBook _return; - - /** - * Gets the value of the return property. - * - * @return - * possible object is - * {@link EBook } - * - */ - public EBook getReturn() { - return _return; - } - - /** - * Sets the value of the return property. - * - * @param value - * allowed object is - * {@link EBook } - * - */ - public void setReturn(EBook value) { - this._return = value; - } - -} diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/EBook.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/EBook.java deleted file mode 100644 index b657c1af2..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/EBook.java +++ /dev/null @@ -1,134 +0,0 @@ - -package org.javaee7.jaxws.client.gen; - -import java.util.ArrayList; -import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for eBook complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="eBook">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="notes" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
- *         <element name="numPages" type="{http://www.w3.org/2001/XMLSchema}int"/>
- *         <element name="price" type="{http://www.w3.org/2001/XMLSchema}double"/>
- *         <element name="title" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "eBook", propOrder = { - "notes", - "numPages", - "price", - "title" -}) -public class EBook { - - @XmlElement(nillable = true) - protected List notes; - protected int numPages; - protected double price; - protected String title; - - /** - * Gets the value of the notes property. - * - *

- * This accessor method returns a reference to the live list, - * not a snapshot. Therefore any modification you make to the - * returned list will be present inside the JAXB object. - * This is why there is not a set method for the notes property. - * - *

- * For example, to add a new item, do as follows: - *

-     *    getNotes().add(newItem);
-     * 
- * - * - *

- * Objects of the following type(s) are allowed in the list - * {@link String } - * - * - */ - public List getNotes() { - if (notes == null) { - notes = new ArrayList(); - } - return this.notes; - } - - /** - * Gets the value of the numPages property. - * - */ - public int getNumPages() { - return numPages; - } - - /** - * Sets the value of the numPages property. - * - */ - public void setNumPages(int value) { - this.numPages = value; - } - - /** - * Gets the value of the price property. - * - */ - public double getPrice() { - return price; - } - - /** - * Sets the value of the price property. - * - */ - public void setPrice(double value) { - this.price = value; - } - - /** - * Gets the value of the title property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getTitle() { - return title; - } - - /** - * Sets the value of the title property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setTitle(String value) { - this.title = value; - } - -} diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/EBookStore.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/EBookStore.java deleted file mode 100644 index b9795bdaf..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/EBookStore.java +++ /dev/null @@ -1,97 +0,0 @@ - -package org.javaee7.jaxws.client.gen; - -import java.util.List; -import javax.jws.WebMethod; -import javax.jws.WebParam; -import javax.jws.WebResult; -import javax.jws.WebService; -import javax.xml.bind.annotation.XmlSeeAlso; -import javax.xml.ws.RequestWrapper; -import javax.xml.ws.ResponseWrapper; - - -/** - * This class was generated by the JAX-WS RI. - * JAX-WS RI 2.1.5-b03- - * Generated source version: 2.1 - * - */ -@WebService(name = "EBookStore", targetNamespace = "http://endpoint.jaxws.javaee7.org/") -@XmlSeeAlso({ - ObjectFactory.class -}) -public interface EBookStore { - - - /** - * - * @param arg0 - * @return - * returns java.lang.String - */ - @WebMethod - @WebResult(targetNamespace = "") - @RequestWrapper(localName = "welcomeMessage", targetNamespace = "http://endpoint.jaxws.javaee7.org/", className = "org.javaee7.jaxws.client.gen.WelcomeMessage") - @ResponseWrapper(localName = "welcomeMessageResponse", targetNamespace = "http://endpoint.jaxws.javaee7.org/", className = "org.javaee7.jaxws.client.gen.WelcomeMessageResponse") - public String welcomeMessage( - @WebParam(name = "arg0", targetNamespace = "") - String arg0); - - /** - * - * @param arg0 - * @return - * returns java.util.List - */ - @WebMethod - @WebResult(targetNamespace = "") - @RequestWrapper(localName = "findEBooks", targetNamespace = "http://endpoint.jaxws.javaee7.org/", className = "org.javaee7.jaxws.client.gen.FindEBooks") - @ResponseWrapper(localName = "findEBooksResponse", targetNamespace = "http://endpoint.jaxws.javaee7.org/", className = "org.javaee7.jaxws.client.gen.FindEBooksResponse") - public List findEBooks( - @WebParam(name = "arg0", targetNamespace = "") - String arg0); - - /** - * - * @param arg0 - * @return - * returns org.javaee7.jaxws.client.gen.EBook - */ - @WebMethod - @WebResult(targetNamespace = "") - @RequestWrapper(localName = "takeBook", targetNamespace = "http://endpoint.jaxws.javaee7.org/", className = "org.javaee7.jaxws.client.gen.TakeBook") - @ResponseWrapper(localName = "takeBookResponse", targetNamespace = "http://endpoint.jaxws.javaee7.org/", className = "org.javaee7.jaxws.client.gen.TakeBookResponse") - public EBook takeBook( - @WebParam(name = "arg0", targetNamespace = "") - String arg0); - - /** - * - * @param arg0 - */ - @WebMethod - @RequestWrapper(localName = "saveBook", targetNamespace = "http://endpoint.jaxws.javaee7.org/", className = "org.javaee7.jaxws.client.gen.SaveBook") - @ResponseWrapper(localName = "saveBookResponse", targetNamespace = "http://endpoint.jaxws.javaee7.org/", className = "org.javaee7.jaxws.client.gen.SaveBookResponse") - public void saveBook( - @WebParam(name = "arg0", targetNamespace = "") - EBook arg0); - - /** - * - * @param arg1 - * @param arg0 - * @return - * returns org.javaee7.jaxws.client.gen.EBook - */ - @WebMethod - @WebResult(targetNamespace = "") - @RequestWrapper(localName = "addAppendix", targetNamespace = "http://endpoint.jaxws.javaee7.org/", className = "org.javaee7.jaxws.client.gen.AddAppendix") - @ResponseWrapper(localName = "addAppendixResponse", targetNamespace = "http://endpoint.jaxws.javaee7.org/", className = "org.javaee7.jaxws.client.gen.AddAppendixResponse") - public EBook addAppendix( - @WebParam(name = "arg0", targetNamespace = "") - EBook arg0, - @WebParam(name = "arg1", targetNamespace = "") - int arg1); - -} diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/EBookStoreImplService.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/EBookStoreImplService.java deleted file mode 100644 index 96cc8490f..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/EBookStoreImplService.java +++ /dev/null @@ -1,71 +0,0 @@ - -package org.javaee7.jaxws.client.gen; - -import java.net.MalformedURLException; -import java.net.URL; -import java.util.logging.Logger; -import javax.xml.namespace.QName; -import javax.xml.ws.Service; -import javax.xml.ws.WebEndpoint; -import javax.xml.ws.WebServiceClient; -import javax.xml.ws.WebServiceFeature; - - -/** - * This class was generated by the JAX-WS RI. - * JAX-WS RI 2.1.5-b03- - * Generated source version: 2.1 - * - */ -@WebServiceClient(name = "EBookStoreImplService", targetNamespace = "http://endpoint.jaxws.javaee7.org/", wsdlLocation = "http://localhost:8080/jaxws-endpoint/EBookStoreImplService?wsdl") -public class EBookStoreImplService - extends Service -{ - - private final static URL EBOOKSTOREIMPLSERVICE_WSDL_LOCATION; - private final static Logger logger = Logger.getLogger(org.javaee7.jaxws.client.gen.EBookStoreImplService.class.getName()); - - static { - URL url = null; - try { - URL baseUrl; - baseUrl = org.javaee7.jaxws.client.gen.EBookStoreImplService.class.getResource("."); - url = new URL(baseUrl, "http://localhost:8080/jaxws-endpoint/EBookStoreImplService?wsdl"); - } catch (MalformedURLException e) { - logger.warning("Failed to create URL for the wsdl Location: 'http://localhost:8080/jaxws-endpoint/EBookStoreImplService?wsdl', retrying as a local file"); - logger.warning(e.getMessage()); - } - EBOOKSTOREIMPLSERVICE_WSDL_LOCATION = url; - } - - public EBookStoreImplService(URL wsdlLocation, QName serviceName) { - super(wsdlLocation, serviceName); - } - - public EBookStoreImplService() { - super(EBOOKSTOREIMPLSERVICE_WSDL_LOCATION, new QName("http://endpoint.jaxws.javaee7.org/", "EBookStoreImplService")); - } - - /** - * - * @return - * returns EBookStore - */ - @WebEndpoint(name = "EBookStoreImplPort") - public EBookStore getEBookStoreImplPort() { - return super.getPort(new QName("http://endpoint.jaxws.javaee7.org/", "EBookStoreImplPort"), EBookStore.class); - } - - /** - * - * @param features - * A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the features parameter will have their default values. - * @return - * returns EBookStore - */ - @WebEndpoint(name = "EBookStoreImplPort") - public EBookStore getEBookStoreImplPort(WebServiceFeature... features) { - return super.getPort(new QName("http://endpoint.jaxws.javaee7.org/", "EBookStoreImplPort"), EBookStore.class, features); - } - -} diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/FindEBooks.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/FindEBooks.java deleted file mode 100644 index 8b7341ae4..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/FindEBooks.java +++ /dev/null @@ -1,60 +0,0 @@ - -package org.javaee7.jaxws.client.gen; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for findEBooks complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="findEBooks">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "findEBooks", propOrder = { - "arg0" -}) -public class FindEBooks { - - protected String arg0; - - /** - * Gets the value of the arg0 property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getArg0() { - return arg0; - } - - /** - * Sets the value of the arg0 property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setArg0(String value) { - this.arg0 = value; - } - -} diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/FindEBooksResponse.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/FindEBooksResponse.java deleted file mode 100644 index 47ae75bd5..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/FindEBooksResponse.java +++ /dev/null @@ -1,69 +0,0 @@ - -package org.javaee7.jaxws.client.gen; - -import java.util.ArrayList; -import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for findEBooksResponse complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="findEBooksResponse">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="return" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "findEBooksResponse", propOrder = { - "_return" -}) -public class FindEBooksResponse { - - @XmlElement(name = "return") - protected List _return; - - /** - * Gets the value of the return property. - * - *

- * This accessor method returns a reference to the live list, - * not a snapshot. Therefore any modification you make to the - * returned list will be present inside the JAXB object. - * This is why there is not a set method for the return property. - * - *

- * For example, to add a new item, do as follows: - *

-     *    getReturn().add(newItem);
-     * 
- * - * - *

- * Objects of the following type(s) are allowed in the list - * {@link String } - * - * - */ - public List getReturn() { - if (_return == null) { - _return = new ArrayList(); - } - return this._return; - } - -} diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/ObjectFactory.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/ObjectFactory.java deleted file mode 100644 index 62097d4b8..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/ObjectFactory.java +++ /dev/null @@ -1,223 +0,0 @@ - -package org.javaee7.jaxws.client.gen; - -import javax.xml.bind.JAXBElement; -import javax.xml.bind.annotation.XmlElementDecl; -import javax.xml.bind.annotation.XmlRegistry; -import javax.xml.namespace.QName; - - -/** - * This object contains factory methods for each - * Java content interface and Java element interface - * generated in the org.javaee7.jaxws.client.gen package. - *

An ObjectFactory allows you to programatically - * construct new instances of the Java representation - * for XML content. The Java representation of XML - * content can consist of schema derived interfaces - * and classes representing the binding of schema - * type definitions, element declarations and model - * groups. Factory methods for each of these are - * provided in this class. - * - */ -@XmlRegistry -public class ObjectFactory { - - private final static QName _SaveBook_QNAME = new QName("http://endpoint.jaxws.javaee7.org/", "saveBook"); - private final static QName _AddAppendix_QNAME = new QName("http://endpoint.jaxws.javaee7.org/", "addAppendix"); - private final static QName _FindEBooksResponse_QNAME = new QName("http://endpoint.jaxws.javaee7.org/", "findEBooksResponse"); - private final static QName _TakeBook_QNAME = new QName("http://endpoint.jaxws.javaee7.org/", "takeBook"); - private final static QName _AddAppendixResponse_QNAME = new QName("http://endpoint.jaxws.javaee7.org/", "addAppendixResponse"); - private final static QName _WelcomeMessageResponse_QNAME = new QName("http://endpoint.jaxws.javaee7.org/", "welcomeMessageResponse"); - private final static QName _FindEBooks_QNAME = new QName("http://endpoint.jaxws.javaee7.org/", "findEBooks"); - private final static QName _WelcomeMessage_QNAME = new QName("http://endpoint.jaxws.javaee7.org/", "welcomeMessage"); - private final static QName _SaveBookResponse_QNAME = new QName("http://endpoint.jaxws.javaee7.org/", "saveBookResponse"); - private final static QName _TakeBookResponse_QNAME = new QName("http://endpoint.jaxws.javaee7.org/", "takeBookResponse"); - - /** - * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.javaee7.jaxws.client.gen - * - */ - public ObjectFactory() { - } - - /** - * Create an instance of {@link EBook } - * - */ - public EBook createEBook() { - return new EBook(); - } - - /** - * Create an instance of {@link FindEBooksResponse } - * - */ - public FindEBooksResponse createFindEBooksResponse() { - return new FindEBooksResponse(); - } - - /** - * Create an instance of {@link TakeBookResponse } - * - */ - public TakeBookResponse createTakeBookResponse() { - return new TakeBookResponse(); - } - - /** - * Create an instance of {@link TakeBook } - * - */ - public TakeBook createTakeBook() { - return new TakeBook(); - } - - /** - * Create an instance of {@link SaveBookResponse } - * - */ - public SaveBookResponse createSaveBookResponse() { - return new SaveBookResponse(); - } - - /** - * Create an instance of {@link SaveBook } - * - */ - public SaveBook createSaveBook() { - return new SaveBook(); - } - - /** - * Create an instance of {@link WelcomeMessageResponse } - * - */ - public WelcomeMessageResponse createWelcomeMessageResponse() { - return new WelcomeMessageResponse(); - } - - /** - * Create an instance of {@link AddAppendixResponse } - * - */ - public AddAppendixResponse createAddAppendixResponse() { - return new AddAppendixResponse(); - } - - /** - * Create an instance of {@link FindEBooks } - * - */ - public FindEBooks createFindEBooks() { - return new FindEBooks(); - } - - /** - * Create an instance of {@link WelcomeMessage } - * - */ - public WelcomeMessage createWelcomeMessage() { - return new WelcomeMessage(); - } - - /** - * Create an instance of {@link AddAppendix } - * - */ - public AddAppendix createAddAppendix() { - return new AddAppendix(); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link SaveBook }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://endpoint.jaxws.javaee7.org/", name = "saveBook") - public JAXBElement createSaveBook(SaveBook value) { - return new JAXBElement(_SaveBook_QNAME, SaveBook.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link AddAppendix }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://endpoint.jaxws.javaee7.org/", name = "addAppendix") - public JAXBElement createAddAppendix(AddAppendix value) { - return new JAXBElement(_AddAppendix_QNAME, AddAppendix.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link FindEBooksResponse }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://endpoint.jaxws.javaee7.org/", name = "findEBooksResponse") - public JAXBElement createFindEBooksResponse(FindEBooksResponse value) { - return new JAXBElement(_FindEBooksResponse_QNAME, FindEBooksResponse.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link TakeBook }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://endpoint.jaxws.javaee7.org/", name = "takeBook") - public JAXBElement createTakeBook(TakeBook value) { - return new JAXBElement(_TakeBook_QNAME, TakeBook.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link AddAppendixResponse }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://endpoint.jaxws.javaee7.org/", name = "addAppendixResponse") - public JAXBElement createAddAppendixResponse(AddAppendixResponse value) { - return new JAXBElement(_AddAppendixResponse_QNAME, AddAppendixResponse.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link WelcomeMessageResponse }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://endpoint.jaxws.javaee7.org/", name = "welcomeMessageResponse") - public JAXBElement createWelcomeMessageResponse(WelcomeMessageResponse value) { - return new JAXBElement(_WelcomeMessageResponse_QNAME, WelcomeMessageResponse.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link FindEBooks }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://endpoint.jaxws.javaee7.org/", name = "findEBooks") - public JAXBElement createFindEBooks(FindEBooks value) { - return new JAXBElement(_FindEBooks_QNAME, FindEBooks.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link WelcomeMessage }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://endpoint.jaxws.javaee7.org/", name = "welcomeMessage") - public JAXBElement createWelcomeMessage(WelcomeMessage value) { - return new JAXBElement(_WelcomeMessage_QNAME, WelcomeMessage.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link SaveBookResponse }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://endpoint.jaxws.javaee7.org/", name = "saveBookResponse") - public JAXBElement createSaveBookResponse(SaveBookResponse value) { - return new JAXBElement(_SaveBookResponse_QNAME, SaveBookResponse.class, null, value); - } - - /** - * Create an instance of {@link JAXBElement }{@code <}{@link TakeBookResponse }{@code >}} - * - */ - @XmlElementDecl(namespace = "http://endpoint.jaxws.javaee7.org/", name = "takeBookResponse") - public JAXBElement createTakeBookResponse(TakeBookResponse value) { - return new JAXBElement(_TakeBookResponse_QNAME, TakeBookResponse.class, null, value); - } - -} diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/SaveBook.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/SaveBook.java deleted file mode 100644 index 8a9f064d4..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/SaveBook.java +++ /dev/null @@ -1,60 +0,0 @@ - -package org.javaee7.jaxws.client.gen; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for saveBook complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="saveBook">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="arg0" type="{http://endpoint.jaxws.javaee7.org/}eBook" minOccurs="0"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "saveBook", propOrder = { - "arg0" -}) -public class SaveBook { - - protected EBook arg0; - - /** - * Gets the value of the arg0 property. - * - * @return - * possible object is - * {@link EBook } - * - */ - public EBook getArg0() { - return arg0; - } - - /** - * Sets the value of the arg0 property. - * - * @param value - * allowed object is - * {@link EBook } - * - */ - public void setArg0(EBook value) { - this.arg0 = value; - } - -} diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/SaveBookResponse.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/SaveBookResponse.java deleted file mode 100644 index 81fd89a00..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/SaveBookResponse.java +++ /dev/null @@ -1,32 +0,0 @@ - -package org.javaee7.jaxws.client.gen; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for saveBookResponse complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="saveBookResponse">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "saveBookResponse") -public class SaveBookResponse { - - -} diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/TakeBook.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/TakeBook.java deleted file mode 100644 index db0250e7b..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/TakeBook.java +++ /dev/null @@ -1,60 +0,0 @@ - -package org.javaee7.jaxws.client.gen; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for takeBook complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="takeBook">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "takeBook", propOrder = { - "arg0" -}) -public class TakeBook { - - protected String arg0; - - /** - * Gets the value of the arg0 property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getArg0() { - return arg0; - } - - /** - * Sets the value of the arg0 property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setArg0(String value) { - this.arg0 = value; - } - -} diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/TakeBookResponse.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/TakeBookResponse.java deleted file mode 100644 index 1fd362bb9..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/TakeBookResponse.java +++ /dev/null @@ -1,62 +0,0 @@ - -package org.javaee7.jaxws.client.gen; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for takeBookResponse complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="takeBookResponse">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="return" type="{http://endpoint.jaxws.javaee7.org/}eBook" minOccurs="0"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "takeBookResponse", propOrder = { - "_return" -}) -public class TakeBookResponse { - - @XmlElement(name = "return") - protected EBook _return; - - /** - * Gets the value of the return property. - * - * @return - * possible object is - * {@link EBook } - * - */ - public EBook getReturn() { - return _return; - } - - /** - * Sets the value of the return property. - * - * @param value - * allowed object is - * {@link EBook } - * - */ - public void setReturn(EBook value) { - this._return = value; - } - -} diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/WelcomeMessage.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/WelcomeMessage.java deleted file mode 100644 index 082d055d3..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/WelcomeMessage.java +++ /dev/null @@ -1,60 +0,0 @@ - -package org.javaee7.jaxws.client.gen; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for welcomeMessage complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="welcomeMessage">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "welcomeMessage", propOrder = { - "arg0" -}) -public class WelcomeMessage { - - protected String arg0; - - /** - * Gets the value of the arg0 property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getArg0() { - return arg0; - } - - /** - * Sets the value of the arg0 property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setArg0(String value) { - this.arg0 = value; - } - -} diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/WelcomeMessageResponse.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/WelcomeMessageResponse.java deleted file mode 100644 index 914774648..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/WelcomeMessageResponse.java +++ /dev/null @@ -1,62 +0,0 @@ - -package org.javaee7.jaxws.client.gen; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for welcomeMessageResponse complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="welcomeMessageResponse">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="return" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "welcomeMessageResponse", propOrder = { - "_return" -}) -public class WelcomeMessageResponse { - - @XmlElement(name = "return") - protected String _return; - - /** - * Gets the value of the return property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getReturn() { - return _return; - } - - /** - * Sets the value of the return property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setReturn(String value) { - this._return = value; - } - -} diff --git a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/package-info.java b/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/package-info.java deleted file mode 100644 index c229cce93..000000000 --- a/jaxws/jaxws-client/src/main/java/org/javaee7/jaxws/client/gen/package-info.java +++ /dev/null @@ -1,2 +0,0 @@ -@javax.xml.bind.annotation.XmlSchema(namespace = "http://endpoint.jaxws.javaee7.org/") -package org.javaee7.jaxws.client.gen; diff --git a/jaxws/jaxws-endpoint/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService.wsdl b/jaxws/jaxws-endpoint/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService.wsdl deleted file mode 100644 index 6c2534bbc..000000000 --- a/jaxws/jaxws-endpoint/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService.wsdl +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/jaxws/jaxws-endpoint/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService_schema1.xsd b/jaxws/jaxws-endpoint/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService_schema1.xsd deleted file mode 100644 index 1e31552ee..000000000 --- a/jaxws/jaxws-endpoint/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService_schema1.xsd +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From d44e4dedefe96d722020f9c4e364e91ff46988e3 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 7 Nov 2017 22:23:37 +0100 Subject: [PATCH 009/117] Ignoring additional generated files folder --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 791ac3870..eada49815 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ libs/ tmp/ node_modules/ jaxws/jaxws-client/src/main/ +jaxws/jaxws-endpoint/src/main/webapp/WEB-INF/wsdl/ # OS Files # .DS_Store From 182debd0b56d9c4c33be32bb6124916971544677 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Wed, 8 Nov 2017 15:02:10 +0100 Subject: [PATCH 010/117] Added sample for adding dynamic interceptor via extension --- cdi/decorators/pom.xml | 7 +- cdi/dynamic-interceptor/pom.xml | 12 +++ .../cdi/dynamic/interceptor/MyBean.java | 16 ++++ .../interceptor/extension/CdiExtension.java | 35 ++++++++ .../extension/DynamicHelloInterceptor.java | 52 ++++++++++++ .../extension/DynamicInterceptorBase.java | 84 +++++++++++++++++++ .../dynamic/interceptor/extension/Hello.java | 19 +++++ .../extension/HelloInterceptorEnabler.java | 16 ++++ .../javax.enterprise.inject.spi.Extension | 1 + .../interceptor/DynamicInterceptorTest.java | 51 +++++++++++ .../src/test/resources/beans.xml | 10 +++ cdi/pom.xml | 1 + 12 files changed, 299 insertions(+), 5 deletions(-) create mode 100644 cdi/dynamic-interceptor/pom.xml create mode 100644 cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/MyBean.java create mode 100644 cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/CdiExtension.java create mode 100644 cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/DynamicHelloInterceptor.java create mode 100644 cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/DynamicInterceptorBase.java create mode 100644 cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/Hello.java create mode 100644 cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/HelloInterceptorEnabler.java create mode 100644 cdi/dynamic-interceptor/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension create mode 100644 cdi/dynamic-interceptor/src/test/java/org/javaee7/cdi/dynamic/interceptor/DynamicInterceptorTest.java create mode 100644 cdi/dynamic-interceptor/src/test/resources/beans.xml diff --git a/cdi/decorators/pom.xml b/cdi/decorators/pom.xml index cffd056dc..4c06f8b9f 100644 --- a/cdi/decorators/pom.xml +++ b/cdi/decorators/pom.xml @@ -1,16 +1,13 @@ - - 4.0.0 + 4.0.0 org.javaee7 cdi 1.0-SNAPSHOT - ../pom.xml - org.javaee7 + cdi-decorators - 1.0-SNAPSHOT war Java EE 7 Sample: cdi - decorators diff --git a/cdi/dynamic-interceptor/pom.xml b/cdi/dynamic-interceptor/pom.xml new file mode 100644 index 000000000..a0be2ddf4 --- /dev/null +++ b/cdi/dynamic-interceptor/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + + + org.javaee7 + cdi + 1.0-SNAPSHOT + + + dynamic-interceptor + Java EE 7 sample: cdi - dynamic interceptor + diff --git a/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/MyBean.java b/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/MyBean.java new file mode 100644 index 000000000..a33993fcc --- /dev/null +++ b/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/MyBean.java @@ -0,0 +1,16 @@ +package org.javaee7.cdi.dynamic.interceptor; + +import org.javaee7.cdi.dynamic.interceptor.extension.Hello; + +/** + * + * @author Arjan Tijms + * + */ +public class MyBean { + + @Hello + public String getName() { + return "John"; + } +} diff --git a/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/CdiExtension.java b/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/CdiExtension.java new file mode 100644 index 000000000..a34cbeb3b --- /dev/null +++ b/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/CdiExtension.java @@ -0,0 +1,35 @@ +package org.javaee7.cdi.dynamic.interceptor.extension; + +import javax.enterprise.event.Observes; +import javax.enterprise.inject.spi.AfterBeanDiscovery; +import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.BeforeBeanDiscovery; +import javax.enterprise.inject.spi.Extension; + +/** + * + * @author Arjan Tijms + * + * This class installs the dynamic interceptor + * + */ +public class CdiExtension implements Extension { + + /** + * This method registers the (annotated) class that enables the interceptor and sets its priority + * + */ + public void register(@Observes BeforeBeanDiscovery beforeBean, BeanManager beanManager) { + beforeBean.addAnnotatedType( + beanManager.createAnnotatedType(HelloInterceptorEnabler.class), + "CdiExtension" + HelloInterceptorEnabler.class); + } + + /** + * This method registers the actual dynamic interceptor + */ + public void afterBean(final @Observes AfterBeanDiscovery afterBeanDiscovery) { + afterBeanDiscovery.addBean(new DynamicHelloInterceptor()); + } + +} diff --git a/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/DynamicHelloInterceptor.java b/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/DynamicHelloInterceptor.java new file mode 100644 index 000000000..1c8ca94c4 --- /dev/null +++ b/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/DynamicHelloInterceptor.java @@ -0,0 +1,52 @@ +package org.javaee7.cdi.dynamic.interceptor.extension; + +import static java.util.Collections.singleton; +import static javax.enterprise.inject.spi.InterceptionType.AROUND_INVOKE; + +import java.lang.annotation.Annotation; +import java.util.Set; + +import javax.enterprise.inject.spi.InterceptionType; +import javax.enterprise.util.AnnotationLiteral; +import javax.interceptor.InvocationContext; + +public class DynamicHelloInterceptor extends DynamicInterceptorBase { + + @SuppressWarnings("all") + public static class HelloAnnotationLiteral extends AnnotationLiteral implements Hello { + private static final long serialVersionUID = 1L; + } + + /** + * The Intercept binding this dynamic interceptor is doing its work for + */ + public Set getInterceptorBindings() { + return singleton((Annotation) new HelloAnnotationLiteral()); + } + + /** + * The type of intercepting being done, corresponds to @AroundInvoke etc on + * "static" interceptors + */ + public boolean intercepts(InterceptionType type) { + return AROUND_INVOKE.equals(type); + } + + /** + * The annotated class that contains the priority and causes the interceptor to be enabled + */ + public Class getBeanClass() { + return HelloInterceptorEnabler.class; + } + + public Object intercept(InterceptionType type, HelloInterceptorEnabler enabler, InvocationContext ctx) { + try { + return "Hello, " + ctx.proceed(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + +} diff --git a/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/DynamicInterceptorBase.java b/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/DynamicInterceptorBase.java new file mode 100644 index 000000000..6fd78ca8a --- /dev/null +++ b/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/DynamicInterceptorBase.java @@ -0,0 +1,84 @@ +package org.javaee7.cdi.dynamic.interceptor.extension; + +import static java.util.Arrays.asList; +import static java.util.Collections.emptySet; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.util.HashSet; +import java.util.Set; + +import javax.enterprise.context.Dependent; +import javax.enterprise.context.spi.CreationalContext; +import javax.enterprise.inject.spi.InjectionPoint; +import javax.enterprise.inject.spi.Interceptor; +import javax.enterprise.inject.spi.PassivationCapable; + +/** + * Default implementation of the Interceptor interface with all the boring defaults + * + * @author Arjan Tijms + * + */ +public abstract class DynamicInterceptorBase implements Interceptor, PassivationCapable { + + @Override + public Set getQualifiers() { + return emptySet(); + } + + @Override + public Class getScope() { + return Dependent.class; + } + + @Override + public Set> getStereotypes() { + return emptySet(); + } + + @Override + public Set getInjectionPoints() { + return emptySet(); + } + + @Override + public boolean isAlternative() { + return false; + } + + @Override + public boolean isNullable() { + return false; + } + + @Override + public String getName() { + return null; + } + + @SuppressWarnings("unchecked") + @Override + public T create(CreationalContext creationalContext) { + try { + return (T) getBeanClass().newInstance(); + } catch (Exception e) { + throw new RuntimeException("Error creating an instance of " + getBeanClass()); + } + } + + @Override + public Set getTypes() { + return new HashSet(asList(getBeanClass(), Object.class)); + } + + @Override + public void destroy(T instance, CreationalContext creationalContext) { + creationalContext.release(); + } + + @Override + public String getId() { + return toString(); + } +} \ No newline at end of file diff --git a/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/Hello.java b/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/Hello.java new file mode 100644 index 000000000..f8244f311 --- /dev/null +++ b/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/Hello.java @@ -0,0 +1,19 @@ +package org.javaee7.cdi.dynamic.interceptor.extension; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.interceptor.InterceptorBinding; + + +@Inherited +@InterceptorBinding +@Retention(RUNTIME) +@Target( {METHOD, TYPE} ) +public @interface Hello { +} \ No newline at end of file diff --git a/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/HelloInterceptorEnabler.java b/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/HelloInterceptorEnabler.java new file mode 100644 index 000000000..2cc68a497 --- /dev/null +++ b/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/HelloInterceptorEnabler.java @@ -0,0 +1,16 @@ +package org.javaee7.cdi.dynamic.interceptor.extension; + +import javax.annotation.Priority; +import javax.interceptor.Interceptor; + +/** + * Class used to enable (activate) the dynamic interceptor and sets its priority + * + * @author Arjan Tijms + * + */ +@Interceptor +@Priority(200) +public class HelloInterceptorEnabler { + +} \ No newline at end of file diff --git a/cdi/dynamic-interceptor/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension b/cdi/dynamic-interceptor/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension new file mode 100644 index 000000000..c7dfa7a1d --- /dev/null +++ b/cdi/dynamic-interceptor/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension @@ -0,0 +1 @@ +org.javaee7.cdi.dynamic.interceptor.extension.CdiExtension \ No newline at end of file diff --git a/cdi/dynamic-interceptor/src/test/java/org/javaee7/cdi/dynamic/interceptor/DynamicInterceptorTest.java b/cdi/dynamic-interceptor/src/test/java/org/javaee7/cdi/dynamic/interceptor/DynamicInterceptorTest.java new file mode 100644 index 000000000..ff757f38a --- /dev/null +++ b/cdi/dynamic-interceptor/src/test/java/org/javaee7/cdi/dynamic/interceptor/DynamicInterceptorTest.java @@ -0,0 +1,51 @@ +package org.javaee7.cdi.dynamic.interceptor; + +import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import static org.junit.Assert.assertEquals; + +import javax.inject.Inject; + +import org.javaee7.cdi.dynamic.interceptor.MyBean; +import org.javaee7.cdi.dynamic.interceptor.extension.CdiExtension; +import org.javaee7.cdi.dynamic.interceptor.extension.DynamicHelloInterceptor; +import org.javaee7.cdi.dynamic.interceptor.extension.DynamicInterceptorBase; +import org.javaee7.cdi.dynamic.interceptor.extension.Hello; +import org.javaee7.cdi.dynamic.interceptor.extension.HelloInterceptorEnabler; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * + * @author Arjan Tijms + * + */ +@RunWith(Arquillian.class) +public class DynamicInterceptorTest { + + @Deployment + public static WebArchive deploy() { + WebArchive war = create(WebArchive.class) + .addClasses(MyBean.class) + .addAsLibraries( + create(JavaArchive.class) + .addClasses(CdiExtension.class, DynamicHelloInterceptor.class, DynamicInterceptorBase.class, Hello.class, HelloInterceptorEnabler.class) + .addAsResource("META-INF/services/javax.enterprise.inject.spi.Extension")) + .addAsWebInfResource("beans.xml"); + + System.out.println(war.toString(true)); + + return war; + } + + @Inject + private MyBean myBean; + + @Test + public void test() { + assertEquals("Hello, John", myBean.getName()); + } +} diff --git a/cdi/dynamic-interceptor/src/test/resources/beans.xml b/cdi/dynamic-interceptor/src/test/resources/beans.xml new file mode 100644 index 000000000..73429273c --- /dev/null +++ b/cdi/dynamic-interceptor/src/test/resources/beans.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/cdi/pom.xml b/cdi/pom.xml index cad40efd8..6e196f67d 100644 --- a/cdi/pom.xml +++ b/cdi/pom.xml @@ -18,6 +18,7 @@ vetoed pkg-level decorators + dynamic-interceptor bean-discovery-all bean-discovery-annotated bean-discovery-none From e163a60da1025802cafa877b91ad94d32ed8a605 Mon Sep 17 00:00:00 2001 From: Juan Gonzalez Date: Fri, 10 Nov 2017 11:15:36 +0100 Subject: [PATCH 011/117] Partial revert of 39f0b461b62d459f42179156047ca1082bdb22a4 . Setting version for these artifacts aren't needed (already defined in arquillian bom). Additionally, it causes all tests failing when using Wildfly Swarm --- pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pom.xml b/pom.xml index adc47db13..dee8720e3 100644 --- a/pom.xml +++ b/pom.xml @@ -173,26 +173,22 @@ org.jboss.arquillian.junit arquillian-junit-container - 1.1.7.Final test org.jboss.arquillian.protocol arquillian-protocol-servlet - 1.1.7.Final test org.jboss.shrinkwrap.resolver shrinkwrap-resolver-impl-maven - 2.1.1 test jar org.jboss.shrinkwrap.resolver shrinkwrap-resolver-impl-maven-archive - 2.1.1 test From 361f55a456a425dbd7136fde67e346e55f2fae23 Mon Sep 17 00:00:00 2001 From: Juan Gonzalez Date: Fri, 17 Nov 2017 16:27:53 +0100 Subject: [PATCH 012/117] Fix some failures using wildfly-swarm profile by upgrading upgrading arquillian and wildfly swarm version. Additionally, cut the dependency from test-utils to parent to avoid unwanted added dependencies --- pom.xml | 7 ++++--- test-utils/pom.xml | 30 +++++++++++++++++++++++------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index dee8720e3..6231da94f 100644 --- a/pom.xml +++ b/pom.xml @@ -10,6 +10,7 @@ Java EE 7 Sample: javaee7-samples + 1.1.14.Final 1.7 3.0.0 UTF-8 @@ -30,7 +31,7 @@ 4.1.1 16.0.0.3 10.1.0.Final - 2017.4.0 + 2017.11.0 7.0.1 8.5.6 @@ -106,14 +107,14 @@ org.jboss.arquillian arquillian-bom - 1.1.11.Final + ${arquillian.version} import pom org.jboss.arquillian.container arquillian-container-test-api - 1.1.11.Final + ${arquillian.version} org.javaee7 diff --git a/test-utils/pom.xml b/test-utils/pom.xml index 1c445fd06..686e0b2b2 100644 --- a/test-utils/pom.xml +++ b/test-utils/pom.xml @@ -2,16 +2,32 @@ 4.0.0 - - - samples-parent - org.javaee7 - 1.0-SNAPSHOT - + + 1.1.14.Final + UTF-8 + UTF-8 + 1.7 + 1.7 + + + org.javaee7 test-utils + 1.0-SNAPSHOT Java EE 7 Sample: javaee7-samples - test-utils + + + + org.jboss.arquillian + arquillian-bom + ${arquillian.version} + import + pom + + + + junit @@ -28,4 +44,4 @@ - \ No newline at end of file + From 2257940f9a6c38ab6eb19cf097e09f4abdf1be66 Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Wed, 17 Jan 2018 10:00:08 +0000 Subject: [PATCH 013/117] Added Payara Micro container (#425) * Added micro container * Added -DskipJMS flag. Defaults to true in Payara Micro profile and false otherwise. --- jms/pom.xml | 11 ++++++++++ pom.xml | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/jms/pom.xml b/jms/pom.xml index c207414a8..8a11eabab 100644 --- a/jms/pom.xml +++ b/jms/pom.xml @@ -28,6 +28,17 @@ ${project.version} + + + + + maven-surefire-plugin + + ${skipJMS} + + + + diff --git a/pom.xml b/pom.xml index 6231da94f..897f27b1a 100644 --- a/pom.xml +++ b/pom.xml @@ -22,12 +22,14 @@ ${skipTests} ${skipTests} ${skipTests} + ${skipTests} 4.1.2.173 + 5.Beta1 4.1.1 16.0.0.3 10.1.0.Final @@ -421,6 +423,63 @@ + + + payara-micro-managed + + + true + + + + + + fish.payara.arquillian + arquillian-payara-micro-4-managed + 1.0.Beta2 + test + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + process-test-classes + + copy + + + + + fish.payara.extras + payara-micro + ${payara.micro.version} + false + ${session.executionRootDirectory}/target/ + payara-micro-${payara.micro.version}.jar + + + + + + + + + maven-surefire-plugin + + + ${session.executionRootDirectory}/target/payara-micro-${payara.micro.version}.jar + + + + + + payara-embedded From f61c3217e7a9bd5ce9349c1273098b0f83b1cbc9 Mon Sep 17 00:00:00 2001 From: lprimak Date: Sat, 27 Jan 2018 21:53:49 -0600 Subject: [PATCH 014/117] fixed a race condition when the method is invoked too quickly and is never registered as being run, thus making the test wait forever --- .../jms/send/receive/mdb/ReceptionSynchronizer.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/ReceptionSynchronizer.java b/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/ReceptionSynchronizer.java index c7166de43..242be9b5e 100644 --- a/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/ReceptionSynchronizer.java +++ b/jms/send-receive/src/test/java/org/javaee7/jms/send/receive/mdb/ReceptionSynchronizer.java @@ -56,6 +56,8 @@ void registerInvocation(Method m) { synchronized (barrier) { if (barrier.containsKey(m)) { latch = barrier.get(m); + } else { + barrier.put(m, new CountDownLatch(0)); } } if (latch != null) { @@ -85,11 +87,6 @@ private static void waitFor(Method method, int timeoutInMillis) throws Interrupt synchronized (barrier) { if (barrier.containsKey(method)) { latch = barrier.get(method); - if (latch.getCount() == 0) { - throw new IllegalStateException("The invocation already happened"); - } else { - throw new IllegalStateException("Sorry, I only serve the first one"); - } } else { latch = new CountDownLatch(1); barrier.put(method, latch); @@ -99,5 +96,4 @@ private static void waitFor(Method method, int timeoutInMillis) throws Interrupt throw new AssertionError("Expected method has not been invoked in " + timeoutInMillis + "ms"); } } - } From 82f56bda87d5595f1c22da0a355815ae356fd4f4 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Sat, 3 Feb 2018 22:18:47 +0100 Subject: [PATCH 015/117] Updated Arquillian connector for Payara, fixing classpath bugs --- pom.xml | 149 +++++++++++++++++++------------------------------------- 1 file changed, 49 insertions(+), 100 deletions(-) diff --git a/pom.xml b/pom.xml index 897f27b1a..8ceec0680 100644 --- a/pom.xml +++ b/pom.xml @@ -28,8 +28,8 @@ Application Server versions (these are downloaded and installed in these versions by Maven for the CI profiles) --> - 4.1.2.173 - 5.Beta1 + 4.1.2.174 + 5.Beta2 4.1.1 16.0.0.3 10.1.0.Final @@ -57,6 +57,20 @@ + + payara-milestones + Payara Milestones + + https://raw.github.com/payara/Payara_PatchedProjects/master + + + true + + + false + + + ossrh Sonatype-snapshot @@ -130,6 +144,12 @@ h2 1.4.195 + + fish.payara.arquillian + payara-client-ee7 + 1.0.Beta3-m1 + test + @@ -341,40 +361,17 @@ - - - org.glassfish.tyrus - tyrus-client - 1.13 - test - - - org.glassfish.tyrus - tyrus-container-grizzly-client - 1.13 - test - - - - - - org.glassfish.jersey.media - jersey-media-json-jackson - 2.25.1 - test - - - org.glassfish.jersey.media - jersey-media-json-processing - 2.25.1 - test - + + + fish.payara.arquillian + payara-client-ee7 + - + fish.payara.arquillian arquillian-payara-server-4-managed - 1.0.Beta2 + 1.0.Beta3-m1 @@ -432,11 +429,17 @@ + + + fish.payara.arquillian + payara-client-ee7 + + fish.payara.arquillian - arquillian-payara-micro-4-managed - 1.0.Beta2 + arquillian-payara-micro-5-managed + 1.0.Beta3-m1 test @@ -484,36 +487,11 @@ payara-embedded - - fish.payara.extras - payara-embedded-all - ${payara.version} - test - - - org.glassfish - javax.json - 1.0.4 - test - - - org.glassfish.tyrus - tyrus-client - 1.13 - test - - - org.glassfish.tyrus - tyrus-container-grizzly-client - 1.13 - test - - - org.glassfish.jersey.core - jersey-client - 2.25 - test - + + + fish.payara.arquillian + payara-client-ee7 + org.jboss.arquillian.container @@ -540,46 +518,17 @@ payara-remote - - org.glassfish - javax.json - 1.0.4 - test - - - - - org.glassfish.tyrus - tyrus-client - 1.13 - test - - - org.glassfish.tyrus - tyrus-container-grizzly-client - 1.13 - test - - - - - org.glassfish.jersey.media - jersey-media-json-jackson - 2.25.1 - test - - - org.glassfish.jersey.media - jersey-media-json-processing - 2.25.1 - test - + + + fish.payara.arquillian + payara-client-ee7 + - org.omnifaces + fish.payara.arquillian arquillian-payara-server-4-remote - 1.0-beta-SNAPSHOT + 1.0.Beta3-m1 test From 6ef3cb1bb5f005b472c5de875e14ab04bed2d73e Mon Sep 17 00:00:00 2001 From: Andrew Pielage Date: Tue, 6 Feb 2018 17:08:05 +0000 Subject: [PATCH 016/117] PAYARA-2399 Add Tyrus client dependencies to Micro profile, and use @RunAsClient --- pom.xml | 14 ++++++++++++++ .../websocket/binary/test/MyEndpointTest.java | 6 +++++- .../java/org/javaee7/websocket/chat/ChatTest.java | 4 +++- .../websocket/encoder/client/MyClientTest.java | 4 +++- .../encoder/programmatic/MyClientTest.java | 4 +++- .../websocket/encoder/EncoderEndpointTest.java | 5 ++++- .../endpoint/async/MyAsyncEndpointTest.java | 5 ++++- .../endpoint/programmatic/MyEndpointTest.java | 5 ++++- .../javaee7/websocket/endpoint/MyEndpointTest.java | 7 ++++++- 9 files changed, 46 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 8ceec0680..7cec28875 100644 --- a/pom.xml +++ b/pom.xml @@ -442,6 +442,20 @@ 1.0.Beta3-m1 test + + + + org.glassfish.tyrus + tyrus-client + 1.13 + test + + + org.glassfish.tyrus + tyrus-container-grizzly-client + 1.13 + test + diff --git a/websocket/binary/src/test/java/org/javaee7/websocket/binary/test/MyEndpointTest.java b/websocket/binary/src/test/java/org/javaee7/websocket/binary/test/MyEndpointTest.java index fb6ca9856..b3288d4c7 100644 --- a/websocket/binary/src/test/java/org/javaee7/websocket/binary/test/MyEndpointTest.java +++ b/websocket/binary/src/test/java/org/javaee7/websocket/binary/test/MyEndpointTest.java @@ -20,6 +20,7 @@ import org.javaee7.websocket.binary.MyEndpointClient; import org.javaee7.websocket.binary.MyEndpointInputStream; import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; @@ -43,7 +44,7 @@ public class MyEndpointTest { * Arquillian specific method for creating a file which can be deployed * while executing the test. */ - @Deployment(testable = false) + @Deployment public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class) .addClasses(MyEndpointByteBuffer.class, @@ -60,6 +61,7 @@ public static WebArchive createDeployment() { * @throws IOException */ @Test + @RunAsClient public void testEndpointByteBuffer() throws URISyntaxException, DeploymentException, IOException, InterruptedException { MyEndpointClient.latch = new CountDownLatch(1); Session session = connectToServer("bytebuffer"); @@ -79,6 +81,7 @@ public void testEndpointByteBuffer() throws URISyntaxException, DeploymentExcept * @throws URISyntaxException */ @Test + @RunAsClient public void testEndpointByteArray() throws DeploymentException, IOException, URISyntaxException, InterruptedException { MyEndpointClient.latch = new CountDownLatch(1); Session session = connectToServer("bytearray"); @@ -98,6 +101,7 @@ public void testEndpointByteArray() throws DeploymentException, IOException, URI * @throws URISyntaxException */ @Test + @RunAsClient public void testEndpointInputStream() throws DeploymentException, IOException, URISyntaxException, InterruptedException { MyEndpointClient.latch = new CountDownLatch(1); Session session = connectToServer("inputstream"); diff --git a/websocket/chat/src/test/java/org/javaee7/websocket/chat/ChatTest.java b/websocket/chat/src/test/java/org/javaee7/websocket/chat/ChatTest.java index fdc55fbf5..0adc8f9a3 100644 --- a/websocket/chat/src/test/java/org/javaee7/websocket/chat/ChatTest.java +++ b/websocket/chat/src/test/java/org/javaee7/websocket/chat/ChatTest.java @@ -10,6 +10,7 @@ import javax.websocket.Session; import javax.websocket.WebSocketContainer; import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; @@ -27,7 +28,7 @@ public class ChatTest { @ArquillianResource URI base; - @Deployment(testable = false) + @Deployment() public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class) .addClasses(ChatEndpoint.class, @@ -36,6 +37,7 @@ public static WebArchive createDeployment() { } @Test + @RunAsClient public void testConnect() throws URISyntaxException, DeploymentException, IOException, InterruptedException { ChatClientEndpoint1.latch = new CountDownLatch(1); final Session session1 = connectToServer(ChatClientEndpoint1.class); diff --git a/websocket/encoder-client/src/test/java/org/javaee7/websocket/encoder/client/MyClientTest.java b/websocket/encoder-client/src/test/java/org/javaee7/websocket/encoder/client/MyClientTest.java index 5d7600449..fa809c02e 100644 --- a/websocket/encoder-client/src/test/java/org/javaee7/websocket/encoder/client/MyClientTest.java +++ b/websocket/encoder-client/src/test/java/org/javaee7/websocket/encoder/client/MyClientTest.java @@ -15,6 +15,7 @@ import javax.websocket.WebSocketContainer; import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; @@ -34,7 +35,7 @@ public class MyClientTest { * Arquillian specific method for creating a file which can be deployed * while executing the test. */ - @Deployment(testable = false) + @Deployment public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class) .addClasses(MyEndpoint.class, @@ -44,6 +45,7 @@ public static WebArchive createDeployment() { } @Test + @RunAsClient public void testEndpoint() throws URISyntaxException, DeploymentException, IOException, InterruptedException { String JSON = "{\"apple\":\"red\",\"banana\":\"yellow\"}"; Session session = connectToServer(MyClient.class); diff --git a/websocket/encoder-programmatic/src/test/java/org/javaee7/websocket/encoder/programmatic/MyClientTest.java b/websocket/encoder-programmatic/src/test/java/org/javaee7/websocket/encoder/programmatic/MyClientTest.java index 2f17b8e65..897f6add7 100644 --- a/websocket/encoder-programmatic/src/test/java/org/javaee7/websocket/encoder/programmatic/MyClientTest.java +++ b/websocket/encoder-programmatic/src/test/java/org/javaee7/websocket/encoder/programmatic/MyClientTest.java @@ -15,6 +15,7 @@ import javax.websocket.WebSocketContainer; import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; @@ -30,7 +31,7 @@ public class MyClientTest { @ArquillianResource URI base; - @Deployment(testable = false) + @Deployment public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class) .addClasses(MyEndpoint.class, @@ -41,6 +42,7 @@ public static WebArchive createDeployment() { } @Test + @RunAsClient public void testEndpoint() throws URISyntaxException, DeploymentException, IOException, InterruptedException { final String JSON = "{\"apple\":\"red\",\"banana\":\"yellow\"}"; Session session = connectToServer(MyClient.class); diff --git a/websocket/encoder/src/test/java/org/javaee7/websocket/encoder/EncoderEndpointTest.java b/websocket/encoder/src/test/java/org/javaee7/websocket/encoder/EncoderEndpointTest.java index 00f17133e..22ef9c937 100644 --- a/websocket/encoder/src/test/java/org/javaee7/websocket/encoder/EncoderEndpointTest.java +++ b/websocket/encoder/src/test/java/org/javaee7/websocket/encoder/EncoderEndpointTest.java @@ -15,6 +15,7 @@ import javax.websocket.WebSocketContainer; import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; @@ -36,7 +37,7 @@ public class EncoderEndpointTest { * Arquillian specific method for creating a file which can be deployed * while executing the test. */ - @Deployment(testable = false) + @Deployment public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class) .addClasses(MyEndpoint.class, @@ -46,6 +47,7 @@ public static WebArchive createDeployment() { } @Test + @RunAsClient public void testEndpointEmptyJSONArray() throws URISyntaxException, DeploymentException, IOException, InterruptedException { final Session session = connectToServer(MyEndpointClientEmptyJSONArray.class); assertNotNull(session); @@ -54,6 +56,7 @@ public void testEndpointEmptyJSONArray() throws URISyntaxException, DeploymentEx } @Test + @RunAsClient public void testEndpointEmptyJSONObject() throws URISyntaxException, DeploymentException, IOException, InterruptedException { String JSON = "{\"apple\":\"red\",\"banana\":\"yellow\"}"; Session session = connectToServer(MyEndpointClientJSONObject.class); diff --git a/websocket/endpoint-async/src/test/java/org/javaee7/websocket/endpoint/async/MyAsyncEndpointTest.java b/websocket/endpoint-async/src/test/java/org/javaee7/websocket/endpoint/async/MyAsyncEndpointTest.java index 8a409a8a3..b658c67ec 100644 --- a/websocket/endpoint-async/src/test/java/org/javaee7/websocket/endpoint/async/MyAsyncEndpointTest.java +++ b/websocket/endpoint-async/src/test/java/org/javaee7/websocket/endpoint/async/MyAsyncEndpointTest.java @@ -19,6 +19,7 @@ import static com.jayway.awaitility.Awaitility.*; import static org.hamcrest.Matchers.*; import static org.hamcrest.MatcherAssert.*; +import org.jboss.arquillian.container.test.api.RunAsClient; /** * @@ -32,7 +33,7 @@ public class MyAsyncEndpointTest { @ArquillianResource private URL base; - @Deployment(testable = false) + @Deployment public static WebArchive deploy() throws URISyntaxException { return ShrinkWrap.create(WebArchive.class) .addClass(MyAsyncEndpointText.class) @@ -40,6 +41,7 @@ public static WebArchive deploy() throws URISyntaxException { } @Test + @RunAsClient public void shouldReceiveAsyncTextMessage() throws URISyntaxException, IOException, DeploymentException { MyAsyncEndpointTextClient endpoint = new MyAsyncEndpointTextClient(); Session session = connectToEndpoint(endpoint, "text"); @@ -50,6 +52,7 @@ public void shouldReceiveAsyncTextMessage() throws URISyntaxException, IOExcepti } @Test + @RunAsClient public void shouldReceiveAsyncByteBufferMessage() throws URISyntaxException, IOException, DeploymentException { final ByteBuffer buffer = ByteBuffer.wrap(TEST_MESSAGE.getBytes()); MyAsyncEndpointByteBufferClient endpoint = new MyAsyncEndpointByteBufferClient(); diff --git a/websocket/endpoint-programmatic/src/test/java/org/javaee7/websocket/endpoint/programmatic/MyEndpointTest.java b/websocket/endpoint-programmatic/src/test/java/org/javaee7/websocket/endpoint/programmatic/MyEndpointTest.java index 388db9dfc..d4ef723d2 100644 --- a/websocket/endpoint-programmatic/src/test/java/org/javaee7/websocket/endpoint/programmatic/MyEndpointTest.java +++ b/websocket/endpoint-programmatic/src/test/java/org/javaee7/websocket/endpoint/programmatic/MyEndpointTest.java @@ -12,6 +12,7 @@ import javax.websocket.Session; import javax.websocket.WebSocketContainer; import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; @@ -31,7 +32,7 @@ public class MyEndpointTest { @ArquillianResource URI base; - @Deployment(testable = false) + @Deployment public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class) .addClasses(MyEndpoint.class, @@ -41,6 +42,7 @@ public static WebArchive createDeployment() { } @Test + @RunAsClient public void testTextEndpoint() throws URISyntaxException, DeploymentException, IOException, InterruptedException { MyEndpointTextClient.latch = new CountDownLatch(1); final String TEXT = "Hello World!"; @@ -56,6 +58,7 @@ public void onMessage(String text) { } @Test + @RunAsClient public void testBinaryEndpoint() throws URISyntaxException, DeploymentException, IOException, InterruptedException { MyEndpointBinaryClient.latch = new CountDownLatch(1); final String TEXT = "Hello World!"; diff --git a/websocket/endpoint/src/test/java/org/javaee7/websocket/endpoint/MyEndpointTest.java b/websocket/endpoint/src/test/java/org/javaee7/websocket/endpoint/MyEndpointTest.java index eb89f7350..b26f58414 100644 --- a/websocket/endpoint/src/test/java/org/javaee7/websocket/endpoint/MyEndpointTest.java +++ b/websocket/endpoint/src/test/java/org/javaee7/websocket/endpoint/MyEndpointTest.java @@ -17,6 +17,7 @@ import javax.websocket.WebSocketContainer; import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; @@ -34,7 +35,7 @@ public class MyEndpointTest { @ArquillianResource URI base; - @Deployment(testable = false) + @Deployment public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class) .addClasses(MyEndpointText.class, @@ -48,6 +49,7 @@ public static WebArchive createDeployment() { } @Test + @RunAsClient public void testTextEndpoint() throws URISyntaxException, DeploymentException, IOException, InterruptedException { MyEndpointTextClient.latch = new CountDownLatch(1); Session session = connectToServer(MyEndpointTextClient.class, "text"); @@ -57,6 +59,7 @@ public void testTextEndpoint() throws URISyntaxException, DeploymentException, I } @Test + @RunAsClient public void testEndpointByteBuffer() throws URISyntaxException, DeploymentException, IOException, InterruptedException { MyEndpointByteBufferClient.latch = new CountDownLatch(1); Session session = connectToServer(MyEndpointByteBufferClient.class, "bytebuffer"); @@ -66,6 +69,7 @@ public void testEndpointByteBuffer() throws URISyntaxException, DeploymentExcept } @Test + @RunAsClient public void testEndpointByteArray() throws DeploymentException, IOException, URISyntaxException, InterruptedException { MyEndpointByteArrayClient.latch = new CountDownLatch(1); Session session = connectToServer(MyEndpointByteArrayClient.class, "bytearray"); @@ -76,6 +80,7 @@ public void testEndpointByteArray() throws DeploymentException, IOException, URI } @Test + @RunAsClient public void testEndpointInputStream() throws DeploymentException, IOException, URISyntaxException, InterruptedException { MyEndpointInputStreamClient.latch = new CountDownLatch(1); Session session = connectToServer(MyEndpointInputStreamClient.class, "inputstream"); From 1bd16d032a646a45b496861c45b2b128fac8ac37 Mon Sep 17 00:00:00 2001 From: Andrew Pielage Date: Tue, 6 Feb 2018 17:09:42 +0000 Subject: [PATCH 017/117] Change @Remote interface to @Local --- .../src/main/java/org/javaee7/ejb/stateful/remote/Cart.java | 4 ++-- .../main/java/org/javaee7/ejb/stateless/remote/Account.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ejb/stateful/src/main/java/org/javaee7/ejb/stateful/remote/Cart.java b/ejb/stateful/src/main/java/org/javaee7/ejb/stateful/remote/Cart.java index e9387c35e..ebecd12b5 100644 --- a/ejb/stateful/src/main/java/org/javaee7/ejb/stateful/remote/Cart.java +++ b/ejb/stateful/src/main/java/org/javaee7/ejb/stateful/remote/Cart.java @@ -40,12 +40,12 @@ package org.javaee7.ejb.stateful.remote; import java.util.List; -import javax.ejb.Remote; +import javax.ejb.Local; /** * @author Arun Gupta */ -@Remote +@Local public interface Cart { public void addItem(String item); diff --git a/ejb/stateless/src/main/java/org/javaee7/ejb/stateless/remote/Account.java b/ejb/stateless/src/main/java/org/javaee7/ejb/stateless/remote/Account.java index bcb236e2f..969daff56 100644 --- a/ejb/stateless/src/main/java/org/javaee7/ejb/stateless/remote/Account.java +++ b/ejb/stateless/src/main/java/org/javaee7/ejb/stateless/remote/Account.java @@ -39,12 +39,12 @@ */ package org.javaee7.ejb.stateless.remote; -import javax.ejb.Remote; +import javax.ejb.Local; /** * @author Arun Gupta */ -@Remote +@Local public interface Account { public String withdraw(float amount); From 922abc251d886656514a26d07bd658443b5f8206 Mon Sep 17 00:00:00 2001 From: Andrew Pielage Date: Thu, 1 Feb 2018 14:13:34 +0000 Subject: [PATCH 018/117] Skip JAXWS for Micro --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 8ceec0680..b58484aeb 100644 --- a/pom.xml +++ b/pom.xml @@ -426,6 +426,7 @@ true + true From 26fa5212ddc9f67d8424b491f74634f8ca2ddc0d Mon Sep 17 00:00:00 2001 From: Arjan Tijms Date: Tue, 6 Feb 2018 18:25:59 +0100 Subject: [PATCH 019/117] Fix tabs/spaces in pom.xml and resolve unnoticed merge conflict (#432) --- .../dynamic/interceptor/extension/Hello.java | 3 +- pom.xml | 89 ++++++++----------- 2 files changed, 38 insertions(+), 54 deletions(-) diff --git a/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/Hello.java b/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/Hello.java index f8244f311..a0b4f1960 100644 --- a/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/Hello.java +++ b/cdi/dynamic-interceptor/src/main/java/org/javaee7/cdi/dynamic/interceptor/extension/Hello.java @@ -1,7 +1,6 @@ package org.javaee7.cdi.dynamic.interceptor.extension; import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Inherited; @@ -14,6 +13,6 @@ @Inherited @InterceptorBinding @Retention(RUNTIME) -@Target( {METHOD, TYPE} ) +@Target(METHOD) public @interface Hello { } \ No newline at end of file diff --git a/pom.xml b/pom.xml index 071953e05..3c206d6e5 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ Java EE 7 Sample: javaee7-samples - 1.1.14.Final + 1.1.14.Final 1.7 3.0.0 UTF-8 @@ -57,19 +57,19 @@ - - payara-milestones - Payara Milestones - - https://raw.github.com/payara/Payara_PatchedProjects/master - - - true - - - false - - + + payara-milestones + Payara Milestones + + https://raw.github.com/payara/Payara_PatchedProjects/master + + + true + + + false + + ossrh @@ -145,11 +145,11 @@ 1.4.195 - fish.payara.arquillian - payara-client-ee7 - 1.0.Beta3-m1 - test - + fish.payara.arquillian + payara-client-ee7 + 1.0.Beta3-m1 + test + @@ -360,12 +360,11 @@ - - - fish.payara.arquillian - payara-client-ee7 - + + fish.payara.arquillian + payara-client-ee7 + @@ -430,11 +429,11 @@ - - - fish.payara.arquillian - payara-client-ee7 - + + + fish.payara.arquillian + payara-client-ee7 + @@ -443,20 +442,6 @@ 1.0.Beta3-m1 test - - - - org.glassfish.tyrus - tyrus-client - 1.13 - test - - - org.glassfish.tyrus - tyrus-container-grizzly-client - 1.13 - test - @@ -503,10 +488,10 @@ payara-embedded - - fish.payara.arquillian - payara-client-ee7 - + + fish.payara.arquillian + payara-client-ee7 + org.jboss.arquillian.container @@ -533,11 +518,11 @@ payara-remote - - - fish.payara.arquillian - payara-client-ee7 - + + + fish.payara.arquillian + payara-client-ee7 + From 70364e5b8cb2336e4aa0c18dd0e9d6e8071dc4f9 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Fri, 9 Feb 2018 18:00:52 +0100 Subject: [PATCH 020/117] Updated several versions of application servers --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 3c206d6e5..ed9ab86ce 100644 --- a/pom.xml +++ b/pom.xml @@ -28,14 +28,14 @@ Application Server versions (these are downloaded and installed in these versions by Maven for the CI profiles) --> - 4.1.2.174 + 4.1.2.181 5.Beta2 4.1.1 - 16.0.0.3 - 10.1.0.Final + 16.0.0.4 + 11.0.0.Final 2017.11.0 - 7.0.1 - 8.5.6 + 7.0.2 + 9.0.4 From d5ba540d776963cb2ad581ec8f2d30da196135b9 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Fri, 23 Feb 2018 16:58:38 +0100 Subject: [PATCH 021/117] Skipping JAX-WS tests for Micro and updating versions --- jaxws/pom.xml | 18 ++++++++++++++---- pom.xml | 5 +++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/jaxws/pom.xml b/jaxws/pom.xml index e4a744df1..7099a2360 100644 --- a/jaxws/pom.xml +++ b/jaxws/pom.xml @@ -1,13 +1,12 @@ - - 4.0.0 + 4.0.0 org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml + org.javaee7 jaxws pom @@ -17,7 +16,7 @@ jaxws-endpoint jaxws-client - + org.javaee7 @@ -25,4 +24,15 @@ ${project.version} + + + + + maven-surefire-plugin + + ${skipJAXWS} + + + + diff --git a/pom.xml b/pom.xml index ed9ab86ce..332ab67cb 100644 --- a/pom.xml +++ b/pom.xml @@ -23,13 +23,14 @@ ${skipTests} ${skipTests} ${skipTests} + ${skipTests} 4.1.2.181 - 5.Beta2 + 5.181-SNAPSHOT 4.1.1 16.0.0.4 11.0.0.Final @@ -439,7 +440,7 @@ fish.payara.arquillian arquillian-payara-micro-5-managed - 1.0.Beta3-m1 + 1.0.Beta3-m2 test From 2b54f0feca1073dca60417dcb86472191ec6d62c Mon Sep 17 00:00:00 2001 From: arjantijms Date: Mon, 26 Feb 2018 17:59:44 +0100 Subject: [PATCH 022/117] Added files to add security test users to Payara Micro Signed-off-by: arjantijms --- ejb/stateful/pom.xml | 25 +++++++++++++-- ejb/timer/pom.xml | 18 +++++++++++ jaxrs/jaxrs-security-declarative/pom.xml | 24 ++++++++++++++ .../src/test/resources/addUsersPayara.txt | 1 + pom.xml | 6 ++-- servlet/security-annotated/pom.xml | 27 ++++++++++++++-- .../src/test/resources/addUsersPayara.txt | 1 + servlet/security-basicauth-omission/pom.xml | 30 +++++++++++++++-- .../src/test/resources/addUsersPayara.txt | 1 + servlet/security-basicauth/pom.xml | 27 ++++++++++++++-- .../src/test/resources/addUsersPayara.txt | 1 + servlet/security-deny-uncovered/pom.xml | 32 +++++++++++++++++-- .../src/test/resources/addUsersPayara.txt | 1 + servlet/security-form-based/pom.xml | 31 +++++++++++++++--- .../src/test/resources/addUsersPayara.txt | 1 + servlet/security-programmatic/pom.xml | 28 +++++++++++++++- .../src/test/resources/addUsersPayara.txt | 1 + 17 files changed, 233 insertions(+), 22 deletions(-) create mode 100644 jaxrs/jaxrs-security-declarative/src/test/resources/addUsersPayara.txt create mode 100644 servlet/security-annotated/src/test/resources/addUsersPayara.txt create mode 100644 servlet/security-basicauth-omission/src/test/resources/addUsersPayara.txt create mode 100644 servlet/security-basicauth/src/test/resources/addUsersPayara.txt create mode 100644 servlet/security-deny-uncovered/src/test/resources/addUsersPayara.txt create mode 100644 servlet/security-form-based/src/test/resources/addUsersPayara.txt create mode 100644 servlet/security-programmatic/src/test/resources/addUsersPayara.txt diff --git a/ejb/stateful/pom.xml b/ejb/stateful/pom.xml index 93ae142cb..e772d02b3 100644 --- a/ejb/stateful/pom.xml +++ b/ejb/stateful/pom.xml @@ -1,16 +1,35 @@ - - 4.0.0 + 4.0.0 org.javaee7 ejb 1.0-SNAPSHOT - ../pom.xml + org.javaee7 ejb-stateful 1.0-SNAPSHOT + war Java EE 7 Sample: ejb - stateful + + + + payara-micro-managed + + + + maven-surefire-plugin + + + true + + + + + + + + diff --git a/ejb/timer/pom.xml b/ejb/timer/pom.xml index 05c145e9d..c98aaefb2 100644 --- a/ejb/timer/pom.xml +++ b/ejb/timer/pom.xml @@ -11,5 +11,23 @@ ejb-timer war Java EE 7 Sample: ejb - timer + + + + payara-micro-managed + + + + maven-surefire-plugin + + + true + + + + + + + diff --git a/jaxrs/jaxrs-security-declarative/pom.xml b/jaxrs/jaxrs-security-declarative/pom.xml index 45f0c5d20..25bb0783c 100644 --- a/jaxrs/jaxrs-security-declarative/pom.xml +++ b/jaxrs/jaxrs-security-declarative/pom.xml @@ -12,4 +12,28 @@ war Java EE 7 Sample: jaxrs - jaxrs-security-declarative + + + + payara-micro-managed + + + + src/test/resources + true + + + + + maven-surefire-plugin + + + --postdeploycommandfile ${project.build.directory}/test-classes/addUsersPayara.txt + + + + + + +
diff --git a/jaxrs/jaxrs-security-declarative/src/test/resources/addUsersPayara.txt b/jaxrs/jaxrs-security-declarative/src/test/resources/addUsersPayara.txt new file mode 100644 index 000000000..037cdbd6f --- /dev/null +++ b/jaxrs/jaxrs-security-declarative/src/test/resources/addUsersPayara.txt @@ -0,0 +1 @@ +create-file-user --groups g1 --passwordfile ${project.build.directory}/test-classes/password.txt u1 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 332ab67cb..125e90ee1 100644 --- a/pom.xml +++ b/pom.xml @@ -476,9 +476,9 @@ maven-surefire-plugin - - ${session.executionRootDirectory}/target/payara-micro-${payara.micro.version}.jar - + + ${session.executionRootDirectory}/target/payara-micro-${payara.micro.version}.jar + diff --git a/servlet/security-annotated/pom.xml b/servlet/security-annotated/pom.xml index fe285deb9..6b4c5877e 100644 --- a/servlet/security-annotated/pom.xml +++ b/servlet/security-annotated/pom.xml @@ -1,6 +1,5 @@ - - 4.0.0 + 4.0.0 org.javaee7 @@ -12,4 +11,28 @@ war Java EE 7 Sample: servlet - security-annotated + + + + payara-micro-managed + + + + src/test/resources + true + + + + + maven-surefire-plugin + + + --postdeploycommandfile ${project.build.directory}/test-classes/addUsersPayara.txt + + + + + + + diff --git a/servlet/security-annotated/src/test/resources/addUsersPayara.txt b/servlet/security-annotated/src/test/resources/addUsersPayara.txt new file mode 100644 index 000000000..037cdbd6f --- /dev/null +++ b/servlet/security-annotated/src/test/resources/addUsersPayara.txt @@ -0,0 +1 @@ +create-file-user --groups g1 --passwordfile ${project.build.directory}/test-classes/password.txt u1 \ No newline at end of file diff --git a/servlet/security-basicauth-omission/pom.xml b/servlet/security-basicauth-omission/pom.xml index d482ae584..64d2f4e6b 100644 --- a/servlet/security-basicauth-omission/pom.xml +++ b/servlet/security-basicauth-omission/pom.xml @@ -1,14 +1,38 @@ - - 4.0.0 + 4.0.0 org.javaee7 servlet 1.0-SNAPSHOT - ../pom.xml + servlet-security-basicauth-omission war Java EE 7 Sample: servlet - security-basicauth-omission + + + + payara-micro-managed + + + + src/test/resources + true + + + + + maven-surefire-plugin + + + --postdeploycommandfile ${project.build.directory}/test-classes/addUsersPayara.txt + + + + + + + + diff --git a/servlet/security-basicauth-omission/src/test/resources/addUsersPayara.txt b/servlet/security-basicauth-omission/src/test/resources/addUsersPayara.txt new file mode 100644 index 000000000..037cdbd6f --- /dev/null +++ b/servlet/security-basicauth-omission/src/test/resources/addUsersPayara.txt @@ -0,0 +1 @@ +create-file-user --groups g1 --passwordfile ${project.build.directory}/test-classes/password.txt u1 \ No newline at end of file diff --git a/servlet/security-basicauth/pom.xml b/servlet/security-basicauth/pom.xml index bd3a0c5e1..de632d638 100644 --- a/servlet/security-basicauth/pom.xml +++ b/servlet/security-basicauth/pom.xml @@ -1,6 +1,5 @@ - - 4.0.0 + 4.0.0 org.javaee7 @@ -12,4 +11,28 @@ war Java EE 7 Sample: servlet - security-basicauth + + + + payara-micro-managed + + + + src/test/resources + true + + + + + maven-surefire-plugin + + + --postdeploycommandfile ${project.build.directory}/test-classes/addUsersPayara.txt + + + + + + + diff --git a/servlet/security-basicauth/src/test/resources/addUsersPayara.txt b/servlet/security-basicauth/src/test/resources/addUsersPayara.txt new file mode 100644 index 000000000..037cdbd6f --- /dev/null +++ b/servlet/security-basicauth/src/test/resources/addUsersPayara.txt @@ -0,0 +1 @@ +create-file-user --groups g1 --passwordfile ${project.build.directory}/test-classes/password.txt u1 \ No newline at end of file diff --git a/servlet/security-deny-uncovered/pom.xml b/servlet/security-deny-uncovered/pom.xml index 55f7fa606..d3dd691a0 100644 --- a/servlet/security-deny-uncovered/pom.xml +++ b/servlet/security-deny-uncovered/pom.xml @@ -1,14 +1,40 @@ - - 4.0.0 + 4.0.0 org.javaee7 servlet 1.0-SNAPSHOT - ../pom.xml + servlet-security-deny-uncovered war + Java EE 7 Sample: servlet - security-deny-uncovered + + + + payara-micro-managed + + + + src/test/resources + true + + + + + maven-surefire-plugin + + + --postdeploycommandfile ${project.build.directory}/test-classes/addUsersPayara.txt + + + + + + + + + diff --git a/servlet/security-deny-uncovered/src/test/resources/addUsersPayara.txt b/servlet/security-deny-uncovered/src/test/resources/addUsersPayara.txt new file mode 100644 index 000000000..037cdbd6f --- /dev/null +++ b/servlet/security-deny-uncovered/src/test/resources/addUsersPayara.txt @@ -0,0 +1 @@ +create-file-user --groups g1 --passwordfile ${project.build.directory}/test-classes/password.txt u1 \ No newline at end of file diff --git a/servlet/security-form-based/pom.xml b/servlet/security-form-based/pom.xml index 51c542a34..d0e4dabe8 100644 --- a/servlet/security-form-based/pom.xml +++ b/servlet/security-form-based/pom.xml @@ -1,16 +1,37 @@ - - 4.0.0 + 4.0.0 org.javaee7 servlet 1.0-SNAPSHOT - ../pom.xml - org.javaee7 + servlet-security-form-based - 1.0-SNAPSHOT war Java EE 7 Sample: servlet - security-form-based + + + + payara-micro-managed + + + + src/test/resources + true + + + + + maven-surefire-plugin + + + --postdeploycommandfile ${project.build.directory}/test-classes/addUsersPayara.txt + + + + + + + diff --git a/servlet/security-form-based/src/test/resources/addUsersPayara.txt b/servlet/security-form-based/src/test/resources/addUsersPayara.txt new file mode 100644 index 000000000..037cdbd6f --- /dev/null +++ b/servlet/security-form-based/src/test/resources/addUsersPayara.txt @@ -0,0 +1 @@ +create-file-user --groups g1 --passwordfile ${project.build.directory}/test-classes/password.txt u1 \ No newline at end of file diff --git a/servlet/security-programmatic/pom.xml b/servlet/security-programmatic/pom.xml index 29bf850de..87df3cf45 100644 --- a/servlet/security-programmatic/pom.xml +++ b/servlet/security-programmatic/pom.xml @@ -6,9 +6,35 @@ org.javaee7 servlet 1.0-SNAPSHOT - ../pom.xml + servlet-security-programmatic war + Java EE 7 Sample: servlet - security-programmatic + + + + payara-micro-managed + + + + src/test/resources + true + + + + + maven-surefire-plugin + + + --postdeploycommandfile ${project.build.directory}/test-classes/addUsersPayara.txt + + + + + + + + diff --git a/servlet/security-programmatic/src/test/resources/addUsersPayara.txt b/servlet/security-programmatic/src/test/resources/addUsersPayara.txt new file mode 100644 index 000000000..037cdbd6f --- /dev/null +++ b/servlet/security-programmatic/src/test/resources/addUsersPayara.txt @@ -0,0 +1 @@ +create-file-user --groups g1 --passwordfile ${project.build.directory}/test-classes/password.txt u1 \ No newline at end of file From dd55a70e320311d59563575ea9fccd92e63ca871 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Mon, 26 Feb 2018 20:22:27 +0100 Subject: [PATCH 023/117] Update Arquillian connectors for Payara to m3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 125e90ee1..3fcc1a621 100644 --- a/pom.xml +++ b/pom.xml @@ -440,7 +440,7 @@ fish.payara.arquillian arquillian-payara-micro-5-managed - 1.0.Beta3-m2 + 1.0.Beta3-m3 test From e200bd8653d021081d6243b5a58620950123b993 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 27 Feb 2018 16:46:49 +0100 Subject: [PATCH 024/117] Cleaning up several tests --- jca/README.md | 1 + jca/connector-simple/connector/pom.xml | 14 -------------- jca/connector-simple/pom.xml | 15 ++++----------- .../simple/connector/MyResoureAdapter.java | 0 .../connector/cci/MyInteractionSpec.java | 0 .../simple/connector/cci/MyOrderRecord.java | 0 .../simple/connector/cci/MyResponseRecord.java | 0 .../connector/outbound/MyConnection.java | 0 .../outbound/MyConnectionFactory.java | 0 .../connector/outbound/MyInteraction.java | 0 .../outbound/MyManagedConnection.java | 0 .../outbound/MyManagedConnectionFactory.java | 0 .../connector/simple/connector/AppTest.java | 0 jca/mdb-filewatcher/pom.xml | 17 ++++++++++++++--- .../pom.xml | 16 ++++++++++++++-- .../src/main/resources/application-ejb.xml | 2 +- ...ourceDefinitionApplicationXMLPuEJBTest.java | 18 +++++++----------- ...ourceDefinitionApplicationXMLPuWebTest.java | 8 ++++---- jpa/schema-gen-index/pom.xml | 6 +++--- .../main/resources/META-INF/persistence.xml | 4 ++-- .../javaee7/jpa/index/SchemaGenIndexTest.java | 4 ++-- pom.xml | 3 +++ 22 files changed, 55 insertions(+), 53 deletions(-) delete mode 100644 jca/connector-simple/connector/pom.xml rename jca/connector-simple/{connector => }/src/main/java/org/javaee7/jca/connector/simple/connector/MyResoureAdapter.java (100%) rename jca/connector-simple/{connector => }/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyInteractionSpec.java (100%) rename jca/connector-simple/{connector => }/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyOrderRecord.java (100%) rename jca/connector-simple/{connector => }/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyResponseRecord.java (100%) rename jca/connector-simple/{connector => }/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyConnection.java (100%) rename jca/connector-simple/{connector => }/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyConnectionFactory.java (100%) rename jca/connector-simple/{connector => }/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyInteraction.java (100%) rename jca/connector-simple/{connector => }/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyManagedConnection.java (100%) rename jca/connector-simple/{connector => }/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyManagedConnectionFactory.java (100%) rename jca/connector-simple/{connector => }/src/test/java/org/javaee7/jca/connector/simple/connector/AppTest.java (100%) diff --git a/jca/README.md b/jca/README.md index 51a881afc..4b3480579 100644 --- a/jca/README.md +++ b/jca/README.md @@ -5,6 +5,7 @@ The [JSR 322](https://jcp.org/en/jsr/detail?id=322) defines a standard architect ## Samples ## - connector-simple + - mdb-filewatcher ## How to run diff --git a/jca/connector-simple/connector/pom.xml b/jca/connector-simple/connector/pom.xml deleted file mode 100644 index 4f2edd7fa..000000000 --- a/jca/connector-simple/connector/pom.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - 4.0.0 - - org.javaee7 - jca-connector-simple - 1.0-SNAPSHOT - - org.javaee7 - jca-connector-simple-connector - 1.0-SNAPSHOT - Java EE 7 Sample: connector - http://maven.apache.org - diff --git a/jca/connector-simple/pom.xml b/jca/connector-simple/pom.xml index d092c34f3..9429306b7 100644 --- a/jca/connector-simple/pom.xml +++ b/jca/connector-simple/pom.xml @@ -1,20 +1,13 @@ - - 4.0.0 + 4.0.0 jca org.javaee7 1.0-SNAPSHOT - ../pom.xml - org.javaee7 - jca-connector-simple - 1.0-SNAPSHOT - pom - Java EE 7 Sample: jca - connector-simple - - connector - + jca-connector-simple-connector + Java EE 7 Sample: jca - Connector simple + diff --git a/jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/MyResoureAdapter.java b/jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/MyResoureAdapter.java similarity index 100% rename from jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/MyResoureAdapter.java rename to jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/MyResoureAdapter.java diff --git a/jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyInteractionSpec.java b/jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyInteractionSpec.java similarity index 100% rename from jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyInteractionSpec.java rename to jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyInteractionSpec.java diff --git a/jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyOrderRecord.java b/jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyOrderRecord.java similarity index 100% rename from jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyOrderRecord.java rename to jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyOrderRecord.java diff --git a/jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyResponseRecord.java b/jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyResponseRecord.java similarity index 100% rename from jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyResponseRecord.java rename to jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/cci/MyResponseRecord.java diff --git a/jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyConnection.java b/jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyConnection.java similarity index 100% rename from jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyConnection.java rename to jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyConnection.java diff --git a/jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyConnectionFactory.java b/jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyConnectionFactory.java similarity index 100% rename from jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyConnectionFactory.java rename to jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyConnectionFactory.java diff --git a/jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyInteraction.java b/jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyInteraction.java similarity index 100% rename from jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyInteraction.java rename to jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyInteraction.java diff --git a/jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyManagedConnection.java b/jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyManagedConnection.java similarity index 100% rename from jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyManagedConnection.java rename to jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyManagedConnection.java diff --git a/jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyManagedConnectionFactory.java b/jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyManagedConnectionFactory.java similarity index 100% rename from jca/connector-simple/connector/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyManagedConnectionFactory.java rename to jca/connector-simple/src/main/java/org/javaee7/jca/connector/simple/connector/outbound/MyManagedConnectionFactory.java diff --git a/jca/connector-simple/connector/src/test/java/org/javaee7/jca/connector/simple/connector/AppTest.java b/jca/connector-simple/src/test/java/org/javaee7/jca/connector/simple/connector/AppTest.java similarity index 100% rename from jca/connector-simple/connector/src/test/java/org/javaee7/jca/connector/simple/connector/AppTest.java rename to jca/connector-simple/src/test/java/org/javaee7/jca/connector/simple/connector/AppTest.java diff --git a/jca/mdb-filewatcher/pom.xml b/jca/mdb-filewatcher/pom.xml index e867fa77a..e9705b354 100644 --- a/jca/mdb-filewatcher/pom.xml +++ b/jca/mdb-filewatcher/pom.xml @@ -1,6 +1,5 @@ - - 4.0.0 + 4.0.0 jca @@ -9,6 +8,18 @@ mdb-filewatcher - Java EE 7 Sample: mdb-filewatcher + Java EE 7 Sample: jca - MDB file watcher + + + + + org.apache.maven.plugins + maven-surefire-plugin + + ${skipEAR} + + + + diff --git a/jpa/datasourcedefinition-applicationxml-pu/pom.xml b/jpa/datasourcedefinition-applicationxml-pu/pom.xml index 00dcc6883..793d455f0 100644 --- a/jpa/datasourcedefinition-applicationxml-pu/pom.xml +++ b/jpa/datasourcedefinition-applicationxml-pu/pom.xml @@ -1,12 +1,12 @@ - - 4.0.0 + 4.0.0 org.javaee7 jpa 1.0-SNAPSHOT + jpa-datasourcedefinition-applicationxml-pu war Java EE 7 Sample: jpa - datasourcedefinition-applicationxml-pu @@ -18,4 +18,16 @@ 1.3.173 + + + + + org.apache.maven.plugins + maven-surefire-plugin + + ${skipEAR} + + + + diff --git a/jpa/datasourcedefinition-applicationxml-pu/src/main/resources/application-ejb.xml b/jpa/datasourcedefinition-applicationxml-pu/src/main/resources/application-ejb.xml index 0039c9a9b..32ee3fd1a 100644 --- a/jpa/datasourcedefinition-applicationxml-pu/src/main/resources/application-ejb.xml +++ b/jpa/datasourcedefinition-applicationxml-pu/src/main/resources/application-ejb.xml @@ -10,7 +10,7 @@ - test.jar + testEJB.jar diff --git a/jpa/datasourcedefinition-applicationxml-pu/src/test/java/org/javaee7/jpa/datasourcedefinition_applicationxml_pu/DataSourceDefinitionApplicationXMLPuEJBTest.java b/jpa/datasourcedefinition-applicationxml-pu/src/test/java/org/javaee7/jpa/datasourcedefinition_applicationxml_pu/DataSourceDefinitionApplicationXMLPuEJBTest.java index f3c81c144..bb2616bb5 100644 --- a/jpa/datasourcedefinition-applicationxml-pu/src/test/java/org/javaee7/jpa/datasourcedefinition_applicationxml_pu/DataSourceDefinitionApplicationXMLPuEJBTest.java +++ b/jpa/datasourcedefinition-applicationxml-pu/src/test/java/org/javaee7/jpa/datasourcedefinition_applicationxml_pu/DataSourceDefinitionApplicationXMLPuEJBTest.java @@ -7,17 +7,13 @@ import java.util.List; -import javax.ejb.EJB; import javax.enterprise.inject.spi.CDI; -import javax.inject.Inject; import org.javaee7.jpa.datasourcedefinition_applicationxml_pu.entity.TestEntity; import org.javaee7.jpa.datasourcedefinition_applicationxml_pu.service.TestService; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.Archive; -import org.jboss.shrinkwrap.api.ArchivePaths; -import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.shrinkwrap.api.spec.WebArchive; @@ -26,14 +22,14 @@ import org.junit.runner.RunWith; /** - * This tests that a data source defined via the data-source element in an EAR's application.xml can be used by JPA. + * This tests that a data source defined via the data-source element in an EAR's application.xml can be used by JPA. *

* In this test the persistence unit is defined inside an EJB module (.jar) - * + * *

* The actual JPA code being run is not specifically relevant; any kind of JPA operation that - * uses the data source is okay here. - * + * uses the data source is okay here. + * * @author Arjan Tijms */ @RunWith(Arquillian.class) @@ -43,7 +39,7 @@ public class DataSourceDefinitionApplicationXMLPuEJBTest { public static Archive deploy() { return // EAR archive - create(EnterpriseArchive.class, "test.ear") + create(EnterpriseArchive.class, "testEAR.ear") // Data-source is defined here .setApplicationXML("application-ejb.xml") @@ -57,7 +53,7 @@ public static Archive deploy() { // EJB module .addAsModule( - create(JavaArchive.class, "test.jar") + create(JavaArchive.class, "testEJB.jar") // Persistence unit is defined here, references data source .addAsResource("META-INF/persistence.xml") @@ -79,7 +75,7 @@ public static Archive deploy() { @Test public void insertAndQueryEntity() throws Exception { - + TestService testService = CDI.current().select(TestService.class).get(); testService.saveNewEntity(); diff --git a/jpa/datasourcedefinition-applicationxml-pu/src/test/java/org/javaee7/jpa/datasourcedefinition_applicationxml_pu/DataSourceDefinitionApplicationXMLPuWebTest.java b/jpa/datasourcedefinition-applicationxml-pu/src/test/java/org/javaee7/jpa/datasourcedefinition_applicationxml_pu/DataSourceDefinitionApplicationXMLPuWebTest.java index 9cd175582..a4410ac4c 100644 --- a/jpa/datasourcedefinition-applicationxml-pu/src/test/java/org/javaee7/jpa/datasourcedefinition_applicationxml_pu/DataSourceDefinitionApplicationXMLPuWebTest.java +++ b/jpa/datasourcedefinition-applicationxml-pu/src/test/java/org/javaee7/jpa/datasourcedefinition_applicationxml_pu/DataSourceDefinitionApplicationXMLPuWebTest.java @@ -22,11 +22,11 @@ * This tests that a data source defined via the data-source element in an EAR's application.xml can be used by JPA. *

* In this test the persistence unit is defined inside a web module (.war) - * + * *

* The actual JPA code being run is not specifically relevant; any kind of JPA operation that - * uses the data source is okay here. - * + * uses the data source is okay here. + * * @author Arjan Tijms */ @RunWith(Arquillian.class) @@ -39,7 +39,7 @@ public class DataSourceDefinitionApplicationXMLPuWebTest { public static Archive deploy() { return // EAR archive - create(EnterpriseArchive.class, "test.ear") + create(EnterpriseArchive.class, "testEAR.ear") // Data-source is defined here .setApplicationXML("application-web.xml") diff --git a/jpa/schema-gen-index/pom.xml b/jpa/schema-gen-index/pom.xml index 992de1869..8a867f644 100644 --- a/jpa/schema-gen-index/pom.xml +++ b/jpa/schema-gen-index/pom.xml @@ -1,14 +1,14 @@ - - 4.0.0 + 4.0.0 org.javaee7 jpa 1.0-SNAPSHOT - ../pom.xml + jpa-schema-gen-index + war Java EE 7 Sample: jpa - schema-gen-index diff --git a/jpa/schema-gen-index/src/main/resources/META-INF/persistence.xml b/jpa/schema-gen-index/src/main/resources/META-INF/persistence.xml index b5bbf1244..248a7f14e 100644 --- a/jpa/schema-gen-index/src/main/resources/META-INF/persistence.xml +++ b/jpa/schema-gen-index/src/main/resources/META-INF/persistence.xml @@ -7,8 +7,8 @@ - - + + diff --git a/jpa/schema-gen-index/src/test/java/org/javaee7/jpa/index/SchemaGenIndexTest.java b/jpa/schema-gen-index/src/test/java/org/javaee7/jpa/index/SchemaGenIndexTest.java index 62a907de3..1bac64f9d 100644 --- a/jpa/schema-gen-index/src/test/java/org/javaee7/jpa/index/SchemaGenIndexTest.java +++ b/jpa/schema-gen-index/src/test/java/org/javaee7/jpa/index/SchemaGenIndexTest.java @@ -34,10 +34,10 @@ public static WebArchive createDeployment() { @Test public void testSchemaGenIndex() throws Exception { - Path create = Paths.get("/tmp/create.sql"); + Path create = Paths.get("/tmp/index-create.sql"); assertTrue(exists(create)); - Path drop = Paths.get("/tmp/drop.sql"); + Path drop = Paths.get("/tmp/index-drop.sql"); assertTrue(exists(create)); String line; diff --git a/pom.xml b/pom.xml index 3fcc1a621..317247444 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,7 @@ ${skipTests} ${skipTests} ${skipTests} + ${skipTests} + true From 66eff5f4a37df1858db3e6acfcfb82887470b346 Mon Sep 17 00:00:00 2001 From: Arjan Tijms Date: Tue, 10 Apr 2018 14:23:51 +0100 Subject: [PATCH 025/117] Update README.md Added survey link --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 1c9b78a6c..b0f645209 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,15 @@ # Java EE 7 Samples # +


+ +## Java EE / Jakarta EE Survey ## + +Have an opinion on what Java EE.Next / Jakarta EE should look like? + +:white_check_mark: Let your voice be heard and [take the survey](https://www.surveymonkey.co.uk/r/jakartaee-2018-omnifaces)! :punch: + +
+ This workspace consists of Java EE 7 Samples and unit tests. They are categorized in different directories, one for each Technology/JSR. Some samples/tests have documentation, otherwise read the code. The [Java EE 7 Essentials](http://www.amazon.com/Java-EE-Essentials-Arun-Gupta/dp/1449370179/) book refers to most of these samples and provides an explanation. Feel free to add docs and send a pull request. From 32f8b545202928c8baedd16a9a82cc9c9491e6d8 Mon Sep 17 00:00:00 2001 From: Arjan Tijms Date: Tue, 15 May 2018 17:08:50 +0200 Subject: [PATCH 026/117] Initial JAX-RPC sample, for historical purposes only (#434) Initial JAX-RPC sample, for historical purposes only --- jaxrpc/README.md | 15 +++ jaxrpc/jaxrpc-endpoint/build.xml | 31 +++++ jaxrpc/jaxrpc-endpoint/pom.xml | 108 ++++++++++++++++++ .../javaee7/jaxrpc/endpoint/HelloService.java | 8 ++ .../jaxrpc/endpoint/HelloServiceImpl.java | 8 ++ .../src/main/resources/HelloService.xml | 7 ++ .../src/main/resources/config.xml | 3 + .../src/main/webapp/WEB-INF/.gitignore | 1 + .../src/main/webapp/WEB-INF/README.md | 1 + .../src/main/webapp/WEB-INF/web.xml | 12 ++ .../src/main/webapp/WEB-INF/webservices.xml | 20 ++++ .../src/main/webapp/WEB-INF/wsdl/.gitignore | 1 + .../src/main/webapp/WEB-INF/wsdl/README.md | 1 + .../javaee7/jaxrpc/endpoint/HelloTest.java | 38 ++++++ jaxrpc/pom.xml | 25 ++++ 15 files changed, 279 insertions(+) create mode 100644 jaxrpc/README.md create mode 100644 jaxrpc/jaxrpc-endpoint/build.xml create mode 100644 jaxrpc/jaxrpc-endpoint/pom.xml create mode 100644 jaxrpc/jaxrpc-endpoint/src/main/java/org/javaee7/jaxrpc/endpoint/HelloService.java create mode 100644 jaxrpc/jaxrpc-endpoint/src/main/java/org/javaee7/jaxrpc/endpoint/HelloServiceImpl.java create mode 100644 jaxrpc/jaxrpc-endpoint/src/main/resources/HelloService.xml create mode 100644 jaxrpc/jaxrpc-endpoint/src/main/resources/config.xml create mode 100644 jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/.gitignore create mode 100644 jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/README.md create mode 100644 jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/web.xml create mode 100644 jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/webservices.xml create mode 100644 jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/wsdl/.gitignore create mode 100644 jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/wsdl/README.md create mode 100644 jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java create mode 100644 jaxrpc/pom.xml diff --git a/jaxrpc/README.md b/jaxrpc/README.md new file mode 100644 index 000000000..f4fda517d --- /dev/null +++ b/jaxrpc/README.md @@ -0,0 +1,15 @@ +# Java EE 7 Samples: JAX-RPC 1.1# + +The [JSR 109](https://jcp.org/en/jsr/detail?id=109) specification is the old generation web services API predating JAX-WS + +JAX-RPC is **pruned** from Java EE, and **should not be used** anymore. This sample is only provided for historical purposes. + +## Samples ## + + - jaxrpc-endpoint + +## How to run + +More information on how to run can be found at: + + diff --git a/jaxrpc/jaxrpc-endpoint/build.xml b/jaxrpc/jaxrpc-endpoint/build.xml new file mode 100644 index 000000000..9554ac5f5 --- /dev/null +++ b/jaxrpc/jaxrpc-endpoint/build.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + hello + + + + + \ No newline at end of file diff --git a/jaxrpc/jaxrpc-endpoint/pom.xml b/jaxrpc/jaxrpc-endpoint/pom.xml new file mode 100644 index 000000000..01a216eba --- /dev/null +++ b/jaxrpc/jaxrpc-endpoint/pom.xml @@ -0,0 +1,108 @@ + + + 4.0.0 + + + org.javaee7 + jaxrpc + 1.0-SNAPSHOT + + + jaxrpc-endpoint + war + Java EE 7 Sample: jaxrpc - jaxrpc-endpoint + + + + com.sun.xml.rpc + jaxrpc-impl + 1.1.4_01 + + + org.apache.ant + ant-launcher + 1.10.3 + + + + + + jaxrpc-endpoint + + + org.apache.maven.plugins + maven-antrun-plugin + 1.1 + + + process-classes + + run + + + + + + + + + + + + + + + + + + + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.0.0 + + + generate-sources + generate-sources + + add-source + + + + ${project.build.directory}/generated-sources/antrun + + + + + + + + diff --git a/jaxrpc/jaxrpc-endpoint/src/main/java/org/javaee7/jaxrpc/endpoint/HelloService.java b/jaxrpc/jaxrpc-endpoint/src/main/java/org/javaee7/jaxrpc/endpoint/HelloService.java new file mode 100644 index 000000000..7582c9274 --- /dev/null +++ b/jaxrpc/jaxrpc-endpoint/src/main/java/org/javaee7/jaxrpc/endpoint/HelloService.java @@ -0,0 +1,8 @@ +package org.javaee7.jaxrpc.endpoint; + +import java.rmi.Remote; +import java.rmi.RemoteException; + +public interface HelloService extends Remote { + String sayHello(String s) throws RemoteException; +} \ No newline at end of file diff --git a/jaxrpc/jaxrpc-endpoint/src/main/java/org/javaee7/jaxrpc/endpoint/HelloServiceImpl.java b/jaxrpc/jaxrpc-endpoint/src/main/java/org/javaee7/jaxrpc/endpoint/HelloServiceImpl.java new file mode 100644 index 000000000..41e7b4db6 --- /dev/null +++ b/jaxrpc/jaxrpc-endpoint/src/main/java/org/javaee7/jaxrpc/endpoint/HelloServiceImpl.java @@ -0,0 +1,8 @@ +package org.javaee7.jaxrpc.endpoint; + +public class HelloServiceImpl implements HelloService { + + public String sayHello(String input) { + return "Hello " + input; + } +} \ No newline at end of file diff --git a/jaxrpc/jaxrpc-endpoint/src/main/resources/HelloService.xml b/jaxrpc/jaxrpc-endpoint/src/main/resources/HelloService.xml new file mode 100644 index 000000000..c5784d379 --- /dev/null +++ b/jaxrpc/jaxrpc-endpoint/src/main/resources/HelloService.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/jaxrpc/jaxrpc-endpoint/src/main/resources/config.xml b/jaxrpc/jaxrpc-endpoint/src/main/resources/config.xml new file mode 100644 index 000000000..b18ed4045 --- /dev/null +++ b/jaxrpc/jaxrpc-endpoint/src/main/resources/config.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/.gitignore b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/.gitignore new file mode 100644 index 000000000..b712eed59 --- /dev/null +++ b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/.gitignore @@ -0,0 +1 @@ +/mapping.xml diff --git a/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/README.md b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/README.md new file mode 100644 index 000000000..0d111dc41 --- /dev/null +++ b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/README.md @@ -0,0 +1 @@ +Generated file `mapping.xml` will be saved here. \ No newline at end of file diff --git a/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/web.xml b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..34524f0f2 --- /dev/null +++ b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,12 @@ + + + + HelloServiceServlet + org.javaee7.jaxrpc.endpoint.HelloServiceImpl + + + HelloServiceServlet + /hello + + \ No newline at end of file diff --git a/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/webservices.xml b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/webservices.xml new file mode 100644 index 000000000..d3005b007 --- /dev/null +++ b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/webservices.xml @@ -0,0 +1,20 @@ + + + + MyHelloService + + WEB-INF/wsdl/MyHelloService.wsdl + WEB-INF/mapping.xml + + + HelloService + my:HelloServicePort + org.javaee7.jaxrpc.endpoint.HelloService + + HelloServiceServlet + + + + + \ No newline at end of file diff --git a/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/wsdl/.gitignore b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/wsdl/.gitignore new file mode 100644 index 000000000..b60d9c3aa --- /dev/null +++ b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/wsdl/.gitignore @@ -0,0 +1 @@ +/MyHelloService.wsdl diff --git a/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/wsdl/README.md b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/wsdl/README.md new file mode 100644 index 000000000..5bc6bea50 --- /dev/null +++ b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/wsdl/README.md @@ -0,0 +1 @@ +Generated file `MyHelloService.wsdl` will be saved here. \ No newline at end of file diff --git a/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java b/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java new file mode 100644 index 000000000..746b2d20d --- /dev/null +++ b/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java @@ -0,0 +1,38 @@ +package org.javaee7.jaxrpc.endpoint; + +//import static org.junit.Assert.assertEquals; + +import java.net.MalformedURLException; +import java.net.URL; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(Arquillian.class) +public class HelloTest { + + @ArquillianResource + private URL url; + + @Deployment(testable = false) + public static WebArchive createDeployment() { + return ShrinkWrap.create(WebArchive.class). + addPackage("org.javaee7.jaxrpc.endpoint"); + } + + @Before + public void setupClass() throws MalformedURLException { + } + + @Test + public void testHello() throws MalformedURLException { + } + + +} diff --git a/jaxrpc/pom.xml b/jaxrpc/pom.xml new file mode 100644 index 000000000..605d90608 --- /dev/null +++ b/jaxrpc/pom.xml @@ -0,0 +1,25 @@ + + 4.0.0 + + + org.javaee7 + samples-parent + 1.0-SNAPSHOT + + + jaxrpc + pom + Java EE 7 Sample: jaxrpc + + + jaxrpc-endpoint + + + + + org.javaee7 + test-utils + ${project.version} + + + From 16a738243fef6eb7416e12493e027c43d8f9ea23 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 15 May 2018 22:08:42 +0200 Subject: [PATCH 027/117] Created actual test archive in test for JAX-RPC --- .../javaee7/jaxrpc/endpoint/HelloTest.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java b/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java index 746b2d20d..c3e44b47c 100644 --- a/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java +++ b/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java @@ -1,5 +1,9 @@ package org.javaee7.jaxrpc.endpoint; +import static org.jboss.shrinkwrap.api.ShrinkWrap.create; + +import java.io.File; + //import static org.junit.Assert.assertEquals; import java.net.MalformedURLException; @@ -8,7 +12,6 @@ import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; -import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Before; import org.junit.Test; @@ -17,13 +20,27 @@ @RunWith(Arquillian.class) public class HelloTest { + private static final String WEBAPP_SRC = "src/main/webapp"; + @ArquillianResource private URL url; - + @Deployment(testable = false) public static WebArchive createDeployment() { - return ShrinkWrap.create(WebArchive.class). - addPackage("org.javaee7.jaxrpc.endpoint"); + System.out.println("************************************************************"); + + WebArchive war = + create(WebArchive.class) + .addClasses(HelloService.class, HelloServiceImpl.class) + .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF", "mapping.xml")) + .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF", "web.xml")) + .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF", "webservices.xml")) + .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF/wsdl", "MyHelloService.wsdl"), "wsdl/MyHelloService.wsdl"); + + System.out.println(war.toString(true)); + System.out.println("************************************************************"); + + return war; } @Before @@ -34,5 +51,5 @@ public void setupClass() throws MalformedURLException { public void testHello() throws MalformedURLException { } - + } From a291e9ffdcff264c53b6b625c6b7bbee0a72b151 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 15 May 2018 22:09:15 +0200 Subject: [PATCH 028/117] Resource ordering for JAX-RPC test --- .../src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java b/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java index c3e44b47c..4b7b825fd 100644 --- a/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java +++ b/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java @@ -32,10 +32,11 @@ public static WebArchive createDeployment() { WebArchive war = create(WebArchive.class) .addClasses(HelloService.class, HelloServiceImpl.class) + .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF/wsdl", "MyHelloService.wsdl"), "wsdl/MyHelloService.wsdl") .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF", "mapping.xml")) - .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF", "web.xml")) .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF", "webservices.xml")) - .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF/wsdl", "MyHelloService.wsdl"), "wsdl/MyHelloService.wsdl"); + .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF", "web.xml")) + ; System.out.println(war.toString(true)); System.out.println("************************************************************"); From f11ff2de594b1630d1c5950eccd11a53586030da Mon Sep 17 00:00:00 2001 From: arjantijms Date: Wed, 16 May 2018 20:29:47 +0200 Subject: [PATCH 029/117] Added actual test methods for JAX-RPC --- jaxrpc/jaxrpc-endpoint/build.xml | 1 - .../services/javax.xml.soap.MessageFactory | 1 + .../src/main/webapp/WEB-INF/web.xml | 6 +- .../javaee7/jaxrpc/endpoint/HelloTest.java | 59 ++++++++++++++++--- 4 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 jaxrpc/jaxrpc-endpoint/src/main/resources/META-INF/services/javax.xml.soap.MessageFactory diff --git a/jaxrpc/jaxrpc-endpoint/build.xml b/jaxrpc/jaxrpc-endpoint/build.xml index 9554ac5f5..03076b251 100644 --- a/jaxrpc/jaxrpc-endpoint/build.xml +++ b/jaxrpc/jaxrpc-endpoint/build.xml @@ -11,7 +11,6 @@ keep = "true" base = "target" nonClassDir = "target" - features = "rpcliteral" config = "./src/main/resources/HelloService.xml"> diff --git a/jaxrpc/jaxrpc-endpoint/src/main/resources/META-INF/services/javax.xml.soap.MessageFactory b/jaxrpc/jaxrpc-endpoint/src/main/resources/META-INF/services/javax.xml.soap.MessageFactory new file mode 100644 index 000000000..82cade269 --- /dev/null +++ b/jaxrpc/jaxrpc-endpoint/src/main/resources/META-INF/services/javax.xml.soap.MessageFactory @@ -0,0 +1 @@ +com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl \ No newline at end of file diff --git a/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/web.xml b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/web.xml index 34524f0f2..c6f61fd4c 100644 --- a/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/web.xml +++ b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/web.xml @@ -1,5 +1,7 @@ - + + HelloServiceServlet diff --git a/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java b/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java index 4b7b825fd..c8d62cb26 100644 --- a/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java +++ b/jaxrpc/jaxrpc-endpoint/src/test/java/org/javaee7/jaxrpc/endpoint/HelloTest.java @@ -1,19 +1,26 @@ package org.javaee7.jaxrpc.endpoint; +import static javax.xml.rpc.Call.SOAPACTION_URI_PROPERTY; +import static javax.xml.rpc.Call.SOAPACTION_USE_PROPERTY; +import static javax.xml.rpc.ParameterMode.IN; import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import static org.junit.Assert.assertEquals; import java.io.File; - -//import static org.junit.Assert.assertEquals; - import java.net.MalformedURLException; import java.net.URL; +import java.rmi.RemoteException; + +import javax.xml.namespace.QName; +import javax.xml.rpc.Call; +import javax.xml.rpc.ServiceException; +import javax.xml.rpc.ServiceFactory; import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.spec.WebArchive; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,13 +28,16 @@ public class HelloTest { private static final String WEBAPP_SRC = "src/main/webapp"; + private static final String ENCODING_STYLE_PROPERTY = "javax.xml.rpc.encodingstyle.namespace.uri"; + private static final String NS_XSD = "http://www.w3.org/2001/XMLSchema"; @ArquillianResource private URL url; + @Deployment(testable = false) public static WebArchive createDeployment() { - System.out.println("************************************************************"); + System.out.println("************** DEPLOYING ************************************"); WebArchive war = create(WebArchive.class) @@ -44,13 +54,46 @@ public static WebArchive createDeployment() { return war; } - @Before - public void setupClass() throws MalformedURLException { + @Test + @RunAsClient + public void testHelloProxy() throws MalformedURLException, ServiceException, RemoteException { + HelloService helloService = (HelloService) + ServiceFactory.newInstance() + .createService( + new URL(url, "hello?wsdl"), + new QName("urn:sample", "MyHelloService")) + .getPort( + new QName("urn:sample", "HelloServicePort"), + HelloService.class); + + String result = helloService.sayHello("Sailor"); + + assertEquals("Hello Sailor", result); } @Test - public void testHello() throws MalformedURLException { + @RunAsClient + public void testHelloDII() throws MalformedURLException, ServiceException, RemoteException { + Call call = ServiceFactory.newInstance() + .createService(new QName("MyHelloService")) + .createCall(new QName("HelloServicePort")); + + call.setTargetEndpointAddress(url + "hello"); + + call.setProperty(SOAPACTION_USE_PROPERTY, true); + call.setProperty(SOAPACTION_URI_PROPERTY, ""); + call.setProperty(ENCODING_STYLE_PROPERTY, "http://schemas.xmlsoap.org/soap/encoding/"); + + call.setReturnType(new QName(NS_XSD, "string")); + call.setOperationName(new QName("urn:sample", "sayHello")); + call.addParameter("String_1", new QName(NS_XSD, "string"), IN); + + String result = (String) call.invoke(new String[] { "Captain" }); + + assertEquals("Hello Captain", result); } + + } From fb0cc91e565ebe7e44036d2468faf4312da08097 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Wed, 16 May 2018 20:31:32 +0200 Subject: [PATCH 030/117] Survey has ended --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index b0f645209..e0cba4877 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,5 @@ # Java EE 7 Samples # -
- -## Java EE / Jakarta EE Survey ## - -Have an opinion on what Java EE.Next / Jakarta EE should look like? - -:white_check_mark: Let your voice be heard and [take the survey](https://www.surveymonkey.co.uk/r/jakartaee-2018-omnifaces)! :punch: - -
This workspace consists of Java EE 7 Samples and unit tests. They are categorized in different directories, one for each Technology/JSR. From a737e8596d964712db8b00a2c6cd589287cf5abd Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 29 May 2018 00:56:52 +0200 Subject: [PATCH 031/117] Added test for JAX-RPC security End point secured with requirement for encrypted username/password --- jaxrpc/jaxrpc-endpoint/build.xml | 16 +- jaxrpc/jaxrpc-endpoint/pom.xml | 25 +-- .../src/main/webapp/WEB-INF/web.xml | 6 + jaxrpc/jaxrpc-security/build.xml | 39 +++++ jaxrpc/jaxrpc-security/pom.xml | 162 ++++++++++++++++++ .../javaee7/jaxrpc/security/HelloService.java | 20 +++ .../jaxrpc/security/HelloServiceImpl.java | 16 ++ .../resources/wscompile-server-config.xml | 15 ++ .../src/main/webapp/WEB-INF/.gitignore | 1 + .../src/main/webapp/WEB-INF/README.md | 1 + .../src/main/webapp/WEB-INF/sun-web.xml | 36 ++++ .../src/main/webapp/WEB-INF/web.xml | 20 +++ .../src/main/webapp/WEB-INF/webservices.xml | 27 +++ .../src/main/webapp/WEB-INF/wsdl/.gitignore | 1 + .../src/main/webapp/WEB-INF/wsdl/README.md | 1 + .../security/ClientTestCallbackHandler.java | 84 +++++++++ .../javaee7/jaxrpc/security/HelloTest.java | 102 +++++++++++ .../src/test/java/stub/.gitignore | 11 ++ .../src/test/java/stub/package-info.java | 5 + .../src/test/resources/addUsersPayara.txt | 1 + .../src/test/resources/client-security.xml | 55 ++++++ .../src/test/resources/password.txt | 1 + .../src/test/resources/s1as.cert | 22 +++ .../resources/wscompile-client-config.xml | 14 ++ jaxrpc/pom.xml | 1 + pom.xml | 2 +- 26 files changed, 646 insertions(+), 38 deletions(-) create mode 100644 jaxrpc/jaxrpc-security/build.xml create mode 100644 jaxrpc/jaxrpc-security/pom.xml create mode 100644 jaxrpc/jaxrpc-security/src/main/java/org/javaee7/jaxrpc/security/HelloService.java create mode 100644 jaxrpc/jaxrpc-security/src/main/java/org/javaee7/jaxrpc/security/HelloServiceImpl.java create mode 100644 jaxrpc/jaxrpc-security/src/main/resources/wscompile-server-config.xml create mode 100644 jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/.gitignore create mode 100644 jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/README.md create mode 100644 jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/sun-web.xml create mode 100644 jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/web.xml create mode 100644 jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/webservices.xml create mode 100644 jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/wsdl/.gitignore create mode 100644 jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/wsdl/README.md create mode 100644 jaxrpc/jaxrpc-security/src/test/java/org/javaee7/jaxrpc/security/ClientTestCallbackHandler.java create mode 100644 jaxrpc/jaxrpc-security/src/test/java/org/javaee7/jaxrpc/security/HelloTest.java create mode 100644 jaxrpc/jaxrpc-security/src/test/java/stub/.gitignore create mode 100644 jaxrpc/jaxrpc-security/src/test/java/stub/package-info.java create mode 100644 jaxrpc/jaxrpc-security/src/test/resources/addUsersPayara.txt create mode 100644 jaxrpc/jaxrpc-security/src/test/resources/client-security.xml create mode 100644 jaxrpc/jaxrpc-security/src/test/resources/password.txt create mode 100644 jaxrpc/jaxrpc-security/src/test/resources/s1as.cert create mode 100644 jaxrpc/jaxrpc-security/src/test/resources/wscompile-client-config.xml diff --git a/jaxrpc/jaxrpc-endpoint/build.xml b/jaxrpc/jaxrpc-endpoint/build.xml index 03076b251..609bf4e59 100644 --- a/jaxrpc/jaxrpc-endpoint/build.xml +++ b/jaxrpc/jaxrpc-endpoint/build.xml @@ -1,5 +1,5 @@ - + @@ -14,17 +14,5 @@ config = "./src/main/resources/HelloService.xml"> - - - hello - - - - + \ No newline at end of file diff --git a/jaxrpc/jaxrpc-endpoint/pom.xml b/jaxrpc/jaxrpc-endpoint/pom.xml index 01a216eba..39048b97f 100644 --- a/jaxrpc/jaxrpc-endpoint/pom.xml +++ b/jaxrpc/jaxrpc-endpoint/pom.xml @@ -41,7 +41,7 @@ run - + @@ -57,28 +57,7 @@ - - - - - - + diff --git a/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/web.xml b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/web.xml index c6f61fd4c..9254611e9 100644 --- a/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/web.xml +++ b/jaxrpc/jaxrpc-endpoint/src/main/webapp/WEB-INF/web.xml @@ -1,4 +1,10 @@ + diff --git a/jaxrpc/jaxrpc-security/build.xml b/jaxrpc/jaxrpc-security/build.xml new file mode 100644 index 000000000..ac43ff1d3 --- /dev/null +++ b/jaxrpc/jaxrpc-security/build.xml @@ -0,0 +1,39 @@ + + + + + + + + wscompile server + + + + + + wscompile client + + + + + \ No newline at end of file diff --git a/jaxrpc/jaxrpc-security/pom.xml b/jaxrpc/jaxrpc-security/pom.xml new file mode 100644 index 000000000..dcc9c6c31 --- /dev/null +++ b/jaxrpc/jaxrpc-security/pom.xml @@ -0,0 +1,162 @@ + + 4.0.0 + + + org.javaee7 + jaxrpc + 1.0-SNAPSHOT + + + jaxrpc-security + war + Java EE 7 Sample: jaxrpc - jaxrpc-security + + + + + + org.glassfish.metro + webservices-rt + 2.4.0 + + + + + + org.apache.ant + ant + 1.7.0 + + + + org.apache.ant + ant-launcher + 1.10.3 + + + + + + jaxrpc-security + + + org.apache.maven.plugins + maven-antrun-plugin + 1.8 + + + process-classes + + run + + + + + + + + + + + + + Copying generated .wsdl and mapping.xml files + + + + + + + + + + + + + + + + Copying generated stub sources + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + + true + -XDignore.symbol.file + + + + + default-compile + compile + + compile + + + + + compile-generated + generate-test-sources + + compile + + + + + + + maven-enforcer-plugin + + + + $1.8 + + + + + + + enforce + + + + + + + diff --git a/jaxrpc/jaxrpc-security/src/main/java/org/javaee7/jaxrpc/security/HelloService.java b/jaxrpc/jaxrpc-security/src/main/java/org/javaee7/jaxrpc/security/HelloService.java new file mode 100644 index 000000000..9b33c4b87 --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/main/java/org/javaee7/jaxrpc/security/HelloService.java @@ -0,0 +1,20 @@ +/** Copyright Payara Services Limited **/ + +package org.javaee7.jaxrpc.security; + +import java.rmi.Remote; +import java.rmi.RemoteException; + +/** + * The mandated interface for a JAX-RPC remote web service. + * + *

+ * Note the mandated extension from the {@link Remote} interface + * and the service method having to throw a {@link RemoteException}. + * + * @author Arjan Tijms + * + */ +public interface HelloService extends Remote { + String sayHello(String input) throws RemoteException; +} \ No newline at end of file diff --git a/jaxrpc/jaxrpc-security/src/main/java/org/javaee7/jaxrpc/security/HelloServiceImpl.java b/jaxrpc/jaxrpc-security/src/main/java/org/javaee7/jaxrpc/security/HelloServiceImpl.java new file mode 100644 index 000000000..1f3637e1d --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/main/java/org/javaee7/jaxrpc/security/HelloServiceImpl.java @@ -0,0 +1,16 @@ +/** Copyright Payara Services Limited **/ + +package org.javaee7.jaxrpc.security; + +/** + * Implementation class for the JAX-RPC remote web service. + * + * @author Arjan Tijms + * + */ +public class HelloServiceImpl implements HelloService { + + public String sayHello(String input) { + return "Hello " + input; + } +} \ No newline at end of file diff --git a/jaxrpc/jaxrpc-security/src/main/resources/wscompile-server-config.xml b/jaxrpc/jaxrpc-security/src/main/resources/wscompile-server-config.xml new file mode 100644 index 000000000..46af7b63d --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/main/resources/wscompile-server-config.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/.gitignore b/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/.gitignore new file mode 100644 index 000000000..b712eed59 --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/.gitignore @@ -0,0 +1 @@ +/mapping.xml diff --git a/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/README.md b/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/README.md new file mode 100644 index 000000000..0d111dc41 --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/README.md @@ -0,0 +1 @@ +Generated file `mapping.xml` will be saved here. \ No newline at end of file diff --git a/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/sun-web.xml b/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/sun-web.xml new file mode 100644 index 000000000..39bf241ca --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/sun-web.xml @@ -0,0 +1,36 @@ + + + + + + HelloServiceServlet + + HelloService + hello + + + + + + + + + + + + \ No newline at end of file diff --git a/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/web.xml b/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..bb5e6c139 --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,20 @@ + + + + + + HelloServiceServlet + org.javaee7.jaxrpc.security.HelloServiceImpl + + + HelloServiceServlet + /hello + + \ No newline at end of file diff --git a/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/webservices.xml b/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/webservices.xml new file mode 100644 index 000000000..a7e159800 --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/webservices.xml @@ -0,0 +1,27 @@ + + + + + + MyHelloService + + WEB-INF/wsdl/MyHelloService.wsdl + WEB-INF/mapping.xml + + + HelloService + my:HelloServicePort + org.javaee7.jaxrpc.security.HelloService + + HelloServiceServlet + + + + + \ No newline at end of file diff --git a/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/wsdl/.gitignore b/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/wsdl/.gitignore new file mode 100644 index 000000000..b60d9c3aa --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/wsdl/.gitignore @@ -0,0 +1 @@ +/MyHelloService.wsdl diff --git a/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/wsdl/README.md b/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/wsdl/README.md new file mode 100644 index 000000000..5bc6bea50 --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/main/webapp/WEB-INF/wsdl/README.md @@ -0,0 +1 @@ +Generated file `MyHelloService.wsdl` will be saved here. \ No newline at end of file diff --git a/jaxrpc/jaxrpc-security/src/test/java/org/javaee7/jaxrpc/security/ClientTestCallbackHandler.java b/jaxrpc/jaxrpc-security/src/test/java/org/javaee7/jaxrpc/security/ClientTestCallbackHandler.java new file mode 100644 index 000000000..329912e85 --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/test/java/org/javaee7/jaxrpc/security/ClientTestCallbackHandler.java @@ -0,0 +1,84 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.jaxrpc.security; + +import static javax.xml.rpc.Stub.PASSWORD_PROPERTY; +import static javax.xml.rpc.Stub.USERNAME_PROPERTY; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.logging.Logger; + +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.UnsupportedCallbackException; + +import com.sun.xml.wss.impl.callback.EncryptionKeyCallback; +import com.sun.xml.wss.impl.callback.EncryptionKeyCallback.AliasX509CertificateRequest; +import com.sun.xml.wss.impl.callback.PasswordCallback; +import com.sun.xml.wss.impl.callback.UsernameCallback; + +/** + * Callback handler that's used by the generated client stubs to obtain the + * username and password to insert into the request, and the x.509 certificate + * to encrypt said username and password. + * + *

+ * Note that this only really gets the X.509 certificate from the file src/test/resources/s1as.cert. + * The username and password already come from the callback and are just being given back to it + * (for some reason this is required). + * + * @author Arjan Tijms + * + */ +public class ClientTestCallbackHandler implements CallbackHandler { + + private static Logger log = Logger.getLogger(ClientTestCallbackHandler.class.getName()); + + public ClientTestCallbackHandler() throws Exception { + log.info("Instantiating ClientTestCallbackHandler"); + } + + public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { + + for (Callback callback : callbacks) { + + log.info("Processing " + callback); + + if (callback instanceof UsernameCallback) { + UsernameCallback usernameCallback = (UsernameCallback) callback; + + usernameCallback.setUsername((String) (usernameCallback.getRuntimeProperties().get(USERNAME_PROPERTY))); + } else if (callback instanceof PasswordCallback) { + PasswordCallback passwordCallback = (PasswordCallback) callback; + + passwordCallback.setPassword((String) (passwordCallback.getRuntimeProperties().get(PASSWORD_PROPERTY))); + } else if (callback instanceof EncryptionKeyCallback) { + EncryptionKeyCallback encryptionKeyCallback = (EncryptionKeyCallback) callback; + + AliasX509CertificateRequest request = (AliasX509CertificateRequest) encryptionKeyCallback.getRequest(); + request.setX509Certificate(getCertificate()); + } + + } + } + + private X509Certificate getCertificate() throws FileNotFoundException, IOException { + try (InputStream inStream = getClass().getClassLoader().getResource("s1as.cert").openStream()) { + X509Certificate certificate = (X509Certificate) + CertificateFactory.getInstance("X.509") + .generateCertificate(inStream); + + log.info("\nCertificate : " + certificate + "\n"); + + return certificate; + + } catch (CertificateException e) { + throw new RuntimeException(e); + } + } + +} \ No newline at end of file diff --git a/jaxrpc/jaxrpc-security/src/test/java/org/javaee7/jaxrpc/security/HelloTest.java b/jaxrpc/jaxrpc-security/src/test/java/org/javaee7/jaxrpc/security/HelloTest.java new file mode 100644 index 000000000..ebbc6068b --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/test/java/org/javaee7/jaxrpc/security/HelloTest.java @@ -0,0 +1,102 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.jaxrpc.security; + +import static javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY; +import static javax.xml.rpc.Stub.PASSWORD_PROPERTY; +import static javax.xml.rpc.Stub.USERNAME_PROPERTY; +import static org.javaee7.ServerOperations.addUsersToContainerIdentityStore; +import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.rmi.RemoteException; + +import javax.xml.rpc.ServiceException; +import javax.xml.rpc.Stub; + +import org.javaee7.jaxrpc.security.HelloService; +import org.javaee7.jaxrpc.security.HelloServiceImpl; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Test; +import org.junit.runner.RunWith; + +import stub.MyHelloService_Impl; + + +/** + * This test demonstrates doing a SOAP request using client side generated stubs to a remote + * JAX-RPC SOAP service that is protected by an authentication mechanism that requires an + * encrypted username/password credential. + * + * @author Arjan Tijms + * + */ +@RunWith(Arquillian.class) +public class HelloTest { + + private static final String WEBAPP_SRC = "src/main/webapp"; + + @ArquillianResource + private URL url; + + + @Deployment(testable = false) + public static WebArchive createDeployment() { + System.out.println("************** DEPLOYING ************************************"); + + System.out.println("Adding test user u1 with group g1"); + + addUsersToContainerIdentityStore(); + + WebArchive war = + create(WebArchive.class) + .addClasses(HelloService.class, HelloServiceImpl.class) + + // The wsdl describes the HelloService.class in xml. The .wsdl is generated from HelloService by the wscompile tool + // (see build.xml). + .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF/wsdl", "MyHelloService.wsdl"), "wsdl/MyHelloService.wsdl") + + // The mapping.xml more precisely describes the HelloService.class in xml. + // It's also generated from it by the wscompile tool + .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF", "mapping.xml")) + + // webservices.xml is the entry file for webservices that links to the .wsdl and mapping.xml + // mentioned above, and to a (virtual) servlet class. + .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF", "webservices.xml")) + + // Maps the (virtual) servlet class introduced in webservices.xml to a URL pattern + // This thus effectively gives the webservice a path, e.g. localhost:8080/ourapp/path. + .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF", "web.xml")) + + // Maps (in a SUN specific way) SOAP security constraints to the webservice. + .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF", "sun-web.xml")) + ; + + System.out.println(war.toString(true)); + System.out.println("************************************************************"); + + return war; + } + + @Test + @RunAsClient + public void testHelloStaticStub() throws MalformedURLException, ServiceException, RemoteException { + + stub.HelloService helloService = new MyHelloService_Impl().getHelloServicePort(); + + ((Stub) helloService)._setProperty(USERNAME_PROPERTY, "u1"); + ((Stub) helloService)._setProperty(PASSWORD_PROPERTY, "p1"); + ((Stub) helloService)._setProperty(ENDPOINT_ADDRESS_PROPERTY, url + "hello"); + + String result = helloService.sayHello("Sailor"); + + assertEquals("Hello Sailor", result); + } + +} diff --git a/jaxrpc/jaxrpc-security/src/test/java/stub/.gitignore b/jaxrpc/jaxrpc-security/src/test/java/stub/.gitignore new file mode 100644 index 000000000..d38d7117f --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/test/java/stub/.gitignore @@ -0,0 +1,11 @@ +/HelloService.java +/HelloService_Stub.java +/HelloService_sayHello_RequestStruct.java +/HelloService_sayHello_RequestStruct_SOAPBuilder.java +/HelloService_sayHello_RequestStruct_SOAPSerializer.java +/HelloService_sayHello_ResponseStruct.java +/HelloService_sayHello_ResponseStruct_SOAPBuilder.java +/HelloService_sayHello_ResponseStruct_SOAPSerializer.java +/MyHelloService.java +/MyHelloService_Impl.java +/MyHelloService_SerializerRegistry.java diff --git a/jaxrpc/jaxrpc-security/src/test/java/stub/package-info.java b/jaxrpc/jaxrpc-security/src/test/java/stub/package-info.java new file mode 100644 index 000000000..b5d90e5a7 --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/test/java/stub/package-info.java @@ -0,0 +1,5 @@ +/** + * Generated Client Stubs will appear in this package after the Maven build is executed. + * The test {@link org.javaee7.jaxrpc.security.HelloTest} depends on these stubs. + */ +package stub; \ No newline at end of file diff --git a/jaxrpc/jaxrpc-security/src/test/resources/addUsersPayara.txt b/jaxrpc/jaxrpc-security/src/test/resources/addUsersPayara.txt new file mode 100644 index 000000000..037cdbd6f --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/test/resources/addUsersPayara.txt @@ -0,0 +1 @@ +create-file-user --groups g1 --passwordfile ${project.build.directory}/test-classes/password.txt u1 \ No newline at end of file diff --git a/jaxrpc/jaxrpc-security/src/test/resources/client-security.xml b/jaxrpc/jaxrpc-security/src/test/resources/client-security.xml new file mode 100644 index 000000000..8dfce3bcf --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/test/resources/client-security.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + {http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}UsernameToken + + + + + + + org.javaee7.jaxrpc.security.ClientTestCallbackHandler + + + \ No newline at end of file diff --git a/jaxrpc/jaxrpc-security/src/test/resources/password.txt b/jaxrpc/jaxrpc-security/src/test/resources/password.txt new file mode 100644 index 000000000..c00bb4cac --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/test/resources/password.txt @@ -0,0 +1 @@ +AS_ADMIN_USERPASSWORD=p1 diff --git a/jaxrpc/jaxrpc-security/src/test/resources/s1as.cert b/jaxrpc/jaxrpc-security/src/test/resources/s1as.cert new file mode 100644 index 000000000..ddeb066af --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/test/resources/s1as.cert @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDnTCCAoWgAwIBAgIEXvcwLTANBgkqhkiG9w0BAQsFADB/MQswCQYDVQQGEwJV +SzEXMBUGA1UECBMOV29yY2VzdGVyc2hpcmUxFjAUBgNVBAcTDUdyZWF0IE1hbHZl +cm4xGjAYBgNVBAoTEVBheWFyYSBGb3VuZGF0aW9uMQ8wDQYDVQQLEwZQYXlhcmEx +EjAQBgNVBAMTCWxvY2FsaG9zdDAeFw0xODA1MjAxODU4MjBaFw0yODA1MTcxODU4 +MjBaMH8xCzAJBgNVBAYTAlVLMRcwFQYDVQQIEw5Xb3JjZXN0ZXJzaGlyZTEWMBQG +A1UEBxMNR3JlYXQgTWFsdmVybjEaMBgGA1UEChMRUGF5YXJhIEZvdW5kYXRpb24x +DzANBgNVBAsTBlBheWFyYTESMBAGA1UEAxMJbG9jYWxob3N0MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjWQpZBdLfVeIPlvqyDAQElJ3fdipdVX+PkZi +jAQF0ob3USho1Z/1gfNb60u1V4i1JBFYVkuLa5foB9NibMOU1NoDmdaSTlAdxJj2 +CrenI0u6PrBToc/wYSTXrY3XkiCmWq4PKEAyPJMKhFdqzw2dzgsuXIciW62MEKII +wGZWNZB+EcLDLKcnq2lhjJJqa9G9Vf13JGkOFko5W6t1ZWCD7S3GHvtok6woBy5q +5UsXNayB7j7Ikc1WYMHWyHpxGp3tFzvVusbBcYpszdZ5o+m/ngZ96xkeKFmi/Id3 +1+Y8y8DeovOjFkdbXzk48iMuw7oXRSyUkXJXZazDHfNMW50gfwIDAQABoyEwHzAd +BgNVHQ4EFgQUX39J70I96D9VCrS3Y7sW/3v2ZucwDQYJKoZIhvcNAQELBQADggEB +ABB0mOmyF3T96WEj2oCbFaJUYU4i9Oe+58rq5+ktIt0BYwNm1OCEIzm3sQHCnNOT +/uibHP/bSVndsoC7FtbHmIyyPIOYnFGrLZYOkHfset6y3aCxCZ4fDRLhTu1EmScX +bY/BEFA46I7Y1ae47wWX0QuQ9j4d4N1DzpG5nhXHp6vDMpT4cS28yOBRwCn5ZnY+ +Qh87xk1QqNrHw0TNa2cBLiSItUGLH42iPL+B+rOnWvK3ky5WR+bcdRnOIxNIYzer +UmqTi8TKrZTX61Bvj6nWMfnnrpON0DEaHYVzqlhyXhe2ftTY0hJSgfDJYdVDBlVh +cCOLpj4QFF7S4x+G5gbLRH0= +-----END CERTIFICATE----- diff --git a/jaxrpc/jaxrpc-security/src/test/resources/wscompile-client-config.xml b/jaxrpc/jaxrpc-security/src/test/resources/wscompile-client-config.xml new file mode 100644 index 000000000..66455fd5b --- /dev/null +++ b/jaxrpc/jaxrpc-security/src/test/resources/wscompile-client-config.xml @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/jaxrpc/pom.xml b/jaxrpc/pom.xml index 605d90608..0e508e6e8 100644 --- a/jaxrpc/pom.xml +++ b/jaxrpc/pom.xml @@ -13,6 +13,7 @@ jaxrpc-endpoint + jaxrpc-security diff --git a/pom.xml b/pom.xml index 317247444..a1019ad6e 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ 1.1.14.Final - 1.7 + 1.8 3.0.0 UTF-8 From 7a3202bba0d0d0e34025d30991e3f99811a426a0 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 29 May 2018 01:11:40 +0200 Subject: [PATCH 032/117] Updated readme --- jaxrpc/README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/jaxrpc/README.md b/jaxrpc/README.md index f4fda517d..4ef93cd6c 100644 --- a/jaxrpc/README.md +++ b/jaxrpc/README.md @@ -1,12 +1,14 @@ # Java EE 7 Samples: JAX-RPC 1.1# -The [JSR 109](https://jcp.org/en/jsr/detail?id=109) specification is the old generation web services API predating JAX-WS +The [JSR 101](https://jcp.org/en/jsr/detail?id=101) specification is the old generation web services API predating JAX-WS, which in fact was +to become JAX-RPC 2.0, -JAX-RPC is **pruned** from Java EE, and **should not be used** anymore. This sample is only provided for historical purposes. +JAX-RPC 1.x is **pruned** from Java EE, and **should not be used** anymore. This sample is only provided for historical purposes. ## Samples ## - - jaxrpc-endpoint + - **jaxrpc-endpoint** - *Defines a very basic hello endpoint (as all classical JAX-RPC examples did), generates the required .wsdl and mapping files, deploys the service, and calls it via two client side approaches: dynamic proxy and DII.* + - **jaxrpc-security** - *Like `jaxrpc-endpoint`, but the service is protected and requires SOAP message level authentication via an encrypted username/password credential in the security header, and calls it via generated Stubs. (to keep the sample somewhat restricted in size does not sign the message)* ## How to run From 65fc6a734d7e7859003deac0824fa400483dad76 Mon Sep 17 00:00:00 2001 From: Arjan Tijms Date: Tue, 29 May 2018 01:12:35 +0200 Subject: [PATCH 033/117] Update README.md Fixed typo --- jaxrpc/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jaxrpc/README.md b/jaxrpc/README.md index 4ef93cd6c..ea694ea67 100644 --- a/jaxrpc/README.md +++ b/jaxrpc/README.md @@ -1,7 +1,7 @@ -# Java EE 7 Samples: JAX-RPC 1.1# +# Java EE 7 Samples: JAX-RPC 1.1 # The [JSR 101](https://jcp.org/en/jsr/detail?id=101) specification is the old generation web services API predating JAX-WS, which in fact was -to become JAX-RPC 2.0, +to become JAX-RPC 2.0. JAX-RPC 1.x is **pruned** from Java EE, and **should not be used** anymore. This sample is only provided for historical purposes. From 3d7073728ac480844e165062eef472d4eea181e4 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 29 May 2018 11:42:06 +0200 Subject: [PATCH 034/117] Some cleanups --- .../org/javaee7/jaxws/endpoint/EBook.java | 7 +- .../javaee7/jaxws/endpoint/EBookStore.java | 3 +- .../jaxws/endpoint/EBookStoreImpl.java | 6 +- .../jpa/defaultdatasource/Employee.java | 15 ++-- .../jpa/defaultdatasource/EmployeeBean.java | 24 ------ .../defaultdatasource/EmployeeService.java | 26 ++++++ .../src/main/resources/META-INF/load.sql | 16 ++-- .../main/resources/META-INF/persistence.xml | 18 ++-- .../defaultdatasource/EmployeeBeanTest.java | 49 ----------- .../EmployeeServiceTest.java | 82 +++++++++++++++++++ 10 files changed, 142 insertions(+), 104 deletions(-) delete mode 100644 jpa/default-datasource/src/main/java/org/javaee7/jpa/defaultdatasource/EmployeeBean.java create mode 100644 jpa/default-datasource/src/main/java/org/javaee7/jpa/defaultdatasource/EmployeeService.java delete mode 100644 jpa/default-datasource/src/test/java/org/javaee7/jpa/defaultdatasource/EmployeeBeanTest.java create mode 100644 jpa/default-datasource/src/test/java/org/javaee7/jpa/defaultdatasource/EmployeeServiceTest.java diff --git a/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBook.java b/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBook.java index a21d22f84..76550b9e9 100644 --- a/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBook.java +++ b/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBook.java @@ -4,20 +4,17 @@ import java.util.List; /** - * + * * @author Fermin Gallego * */ public class EBook { + private String title; private int numPages; private double price; private List notes; - public EBook() { - super(); - } - public String getTitle() { return title; } diff --git a/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStore.java b/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStore.java index e0f3643cb..3ca54e02d 100644 --- a/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStore.java +++ b/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStore.java @@ -6,12 +6,13 @@ import javax.jws.WebService; /** - * + * * @author Fermin Gallego * */ @WebService public interface EBookStore { + @WebMethod public String welcomeMessage(String name); diff --git a/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStoreImpl.java b/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStoreImpl.java index a33494c67..d029daaff 100644 --- a/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStoreImpl.java +++ b/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStoreImpl.java @@ -7,11 +7,12 @@ import javax.jws.WebService; /** - * + * * @author Fermin Gallego * */ -@WebService(endpointInterface = "org.javaee7.jaxws.endpoint.EBookStore", +@WebService( + endpointInterface = "org.javaee7.jaxws.endpoint.EBookStore", serviceName = "EBookStoreImplService") public class EBookStoreImpl implements EBookStore { @@ -41,7 +42,6 @@ public EBook takeBook(String title) { @Override public void saveBook(EBook eBook) { eBookCollection.put(eBook.getTitle(), eBook); - } @Override diff --git a/jpa/default-datasource/src/main/java/org/javaee7/jpa/defaultdatasource/Employee.java b/jpa/default-datasource/src/main/java/org/javaee7/jpa/defaultdatasource/Employee.java index 488e3b508..f3726e20a 100644 --- a/jpa/default-datasource/src/main/java/org/javaee7/jpa/defaultdatasource/Employee.java +++ b/jpa/default-datasource/src/main/java/org/javaee7/jpa/defaultdatasource/Employee.java @@ -1,10 +1,12 @@ package org.javaee7.jpa.defaultdatasource; +import static javax.persistence.GenerationType.IDENTITY; + import java.io.Serializable; + import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; @@ -15,13 +17,16 @@ */ @Entity @Table(name = "EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE") -@NamedQueries({ - @NamedQuery(name = "Employee.findAll", query = "SELECT e FROM Employee e") -}) +@NamedQueries( + @NamedQuery( + name = "Employee.findAll", + query = "SELECT e FROM Employee e") ) public class Employee implements Serializable { + private static final long serialVersionUID = 1L; + @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = IDENTITY) private int id; @Column(length = 40) diff --git a/jpa/default-datasource/src/main/java/org/javaee7/jpa/defaultdatasource/EmployeeBean.java b/jpa/default-datasource/src/main/java/org/javaee7/jpa/defaultdatasource/EmployeeBean.java deleted file mode 100644 index ce9484389..000000000 --- a/jpa/default-datasource/src/main/java/org/javaee7/jpa/defaultdatasource/EmployeeBean.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.javaee7.jpa.defaultdatasource; - -import java.util.List; -import javax.ejb.Stateless; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; - -/** - * @author Arun Gupta - */ -@Stateless -public class EmployeeBean { - - @PersistenceContext - EntityManager em; - - public void persist(Employee e) { - em.persist(e); - } - - public List get() { - return em.createNamedQuery("Employee.findAll", Employee.class).getResultList(); - } -} diff --git a/jpa/default-datasource/src/main/java/org/javaee7/jpa/defaultdatasource/EmployeeService.java b/jpa/default-datasource/src/main/java/org/javaee7/jpa/defaultdatasource/EmployeeService.java new file mode 100644 index 000000000..6472745fc --- /dev/null +++ b/jpa/default-datasource/src/main/java/org/javaee7/jpa/defaultdatasource/EmployeeService.java @@ -0,0 +1,26 @@ +package org.javaee7.jpa.defaultdatasource; + +import java.util.List; + +import javax.ejb.Stateless; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +/** + * @author Arun Gupta + */ +@Stateless +public class EmployeeService { + + @PersistenceContext + EntityManager entityManager; + + public void persist(Employee employee) { + entityManager.persist(employee); + } + + public List findAll() { + return entityManager.createNamedQuery("Employee.findAll", Employee.class) + .getResultList(); + } +} diff --git a/jpa/default-datasource/src/main/resources/META-INF/load.sql b/jpa/default-datasource/src/main/resources/META-INF/load.sql index 5894adca3..ad7820c2f 100644 --- a/jpa/default-datasource/src/main/resources/META-INF/load.sql +++ b/jpa/default-datasource/src/main/resources/META-INF/load.sql @@ -1,8 +1,8 @@ -INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("ID", "NAME") VALUES (1, 'Penny') -INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("ID", "NAME") VALUES (2, 'Sheldon') -INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("ID", "NAME") VALUES (3, 'Amy') -INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("ID", "NAME") VALUES (4, 'Leonard') -INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("ID", "NAME") VALUES (5, 'Bernadette') -INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("ID", "NAME") VALUES (6, 'Raj') -INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("ID", "NAME") VALUES (7, 'Howard') -INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("ID", "NAME") VALUES (8, 'Priya') \ No newline at end of file +INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("NAME") VALUES ('Penny') +INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("NAME") VALUES ('Sheldon') +INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("NAME") VALUES ('Amy') +INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("NAME") VALUES ('Leonard') +INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("NAME") VALUES ('Bernadette') +INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("NAME") VALUES ('Raj') +INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("NAME") VALUES ('Howard') +INSERT INTO EMPLOYEE_SCHEMA_DEFAULT_DATASOURCE("NAME") VALUES ('Priya') \ No newline at end of file diff --git a/jpa/default-datasource/src/main/resources/META-INF/persistence.xml b/jpa/default-datasource/src/main/resources/META-INF/persistence.xml index b97b52702..069558e6f 100644 --- a/jpa/default-datasource/src/main/resources/META-INF/persistence.xml +++ b/jpa/default-datasource/src/main/resources/META-INF/persistence.xml @@ -1,15 +1,15 @@ - - + + - - - - + + + + + diff --git a/jpa/default-datasource/src/test/java/org/javaee7/jpa/defaultdatasource/EmployeeBeanTest.java b/jpa/default-datasource/src/test/java/org/javaee7/jpa/defaultdatasource/EmployeeBeanTest.java deleted file mode 100644 index 500e9a271..000000000 --- a/jpa/default-datasource/src/test/java/org/javaee7/jpa/defaultdatasource/EmployeeBeanTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.javaee7.jpa.defaultdatasource; - -import org.javaee7.jpa.defaultdatasource.Employee; -import org.javaee7.jpa.defaultdatasource.EmployeeBean; -import java.util.List; -import javax.inject.Inject; -import org.jboss.arquillian.container.test.api.Deployment; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.spec.WebArchive; -import org.junit.Test; -import static org.junit.Assert.*; -import org.junit.runner.RunWith; - -/** - * @author Arun Gupta - */ -@RunWith(Arquillian.class) -public class EmployeeBeanTest { - - @Inject - EmployeeBean bean; - - @Deployment - public static WebArchive createDeployment() { - return ShrinkWrap.create(WebArchive.class) - .addClasses(Employee.class, - EmployeeBean.class) - .addAsResource("META-INF/persistence.xml") - .addAsResource("META-INF/load.sql"); - } - - @Test - public void testGet() throws Exception { - assertNotNull(bean); - List list = bean.get(); - assertNotNull(list); - assertEquals(8, list.size()); - assertFalse(list.contains(new Employee("Penny"))); - assertFalse(list.contains(new Employee("Sheldon"))); - assertFalse(list.contains(new Employee("Amy"))); - assertFalse(list.contains(new Employee("Leonard"))); - assertFalse(list.contains(new Employee("Bernadette"))); - assertFalse(list.contains(new Employee("Raj"))); - assertFalse(list.contains(new Employee("Howard"))); - assertFalse(list.contains(new Employee("Priya"))); - } - -} diff --git a/jpa/default-datasource/src/test/java/org/javaee7/jpa/defaultdatasource/EmployeeServiceTest.java b/jpa/default-datasource/src/test/java/org/javaee7/jpa/defaultdatasource/EmployeeServiceTest.java new file mode 100644 index 000000000..d7eaab08e --- /dev/null +++ b/jpa/default-datasource/src/test/java/org/javaee7/jpa/defaultdatasource/EmployeeServiceTest.java @@ -0,0 +1,82 @@ +package org.javaee7.jpa.defaultdatasource; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.runners.MethodSorters.NAME_ASCENDING; + +import java.util.List; + +import javax.inject.Inject; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * @author Arun Gupta + */ +@RunWith(Arquillian.class) +@FixMethodOrder(NAME_ASCENDING) +public class EmployeeServiceTest { + + @Inject + EmployeeService employeeService; + + @Deployment + public static WebArchive createDeployment() { + return ShrinkWrap.create(WebArchive.class) + .addClasses( + Employee.class, + EmployeeService.class) + .addAsResource("META-INF/persistence.xml") + .addAsResource("META-INF/load.sql"); + } + + @Test + public void T1_testGet() throws Exception { + assertNotNull(employeeService); + + List employees = employeeService.findAll(); + + assertNotNull(employees); + assertEquals(8, employees.size()); + + assertFalse(employees.contains(new Employee("Penny"))); + assertFalse(employees.contains(new Employee("Sheldon"))); + assertFalse(employees.contains(new Employee("Amy"))); + assertFalse(employees.contains(new Employee("Leonard"))); + assertFalse(employees.contains(new Employee("Bernadette"))); + assertFalse(employees.contains(new Employee("Raj"))); + assertFalse(employees.contains(new Employee("Howard"))); + assertFalse(employees.contains(new Employee("Priya"))); + } + + @Test + public void T2_testPersist() throws Exception { + + Employee newEmployee = new Employee("Reza"); + + employeeService.persist(newEmployee); + + List employees = employeeService.findAll(); + assertNotNull(employees); + assertEquals(9, employees.size()); + + boolean rezaInList = false; + for (Employee employee : employees) { + if (employee.getName().equals("Reza")) { + rezaInList = true; + break; + } + } + + assertTrue(rezaInList); + } + +} From c20bf7361ad4245621614c5a8d257b6aad0f2f80 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 21 Jun 2018 22:53:56 +0200 Subject: [PATCH 035/117] Added test for Servlet client-cert authentication --- pom.xml | 2 +- servlet/security-clientcert/.gitignore | 2 + servlet/security-clientcert/pom.xml | 54 ++++ .../security/clientcert/SecureServlet.java | 25 ++ .../src/main/webapp/WEB-INF/glassfish-web.xml | 14 + .../src/main/webapp/WEB-INF/web.xml | 29 ++ .../clientcert/SecureServletTest.java | 269 ++++++++++++++++++ .../java/org/javaee7/ServerOperations.java | 181 ++++++++++++ 8 files changed, 575 insertions(+), 1 deletion(-) create mode 100644 servlet/security-clientcert/.gitignore create mode 100644 servlet/security-clientcert/pom.xml create mode 100644 servlet/security-clientcert/src/main/java/org/javaee7/servlet/security/clientcert/SecureServlet.java create mode 100644 servlet/security-clientcert/src/main/webapp/WEB-INF/glassfish-web.xml create mode 100644 servlet/security-clientcert/src/main/webapp/WEB-INF/web.xml create mode 100644 servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java diff --git a/pom.xml b/pom.xml index a1019ad6e..08ef31cf0 100644 --- a/pom.xml +++ b/pom.xml @@ -238,7 +238,7 @@ net.sourceforge.htmlunit htmlunit - 2.13 + 2.31 test diff --git a/servlet/security-clientcert/.gitignore b/servlet/security-clientcert/.gitignore new file mode 100644 index 000000000..28a1a0681 --- /dev/null +++ b/servlet/security-clientcert/.gitignore @@ -0,0 +1,2 @@ +/clientKeyStore.jks +/clientTrustStore.jks diff --git a/servlet/security-clientcert/pom.xml b/servlet/security-clientcert/pom.xml new file mode 100644 index 000000000..ce0a8bd2c --- /dev/null +++ b/servlet/security-clientcert/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + + org.javaee7 + servlet + 1.0-SNAPSHOT + + + servlet-security-clientcert + war + + Java EE 7 Sample: servlet - security-clientcert + + + + org.bouncycastle + bcprov-jdk15on + 1.59 + + + + org.bouncycastle + bcpkix-jdk15on + 1.59 + + + + + + payara-micro-managed + + + + src/test/resources + true + + + + + maven-surefire-plugin + + + --postdeploycommandfile ${project.build.directory}/test-classes/addUsersPayara.txt + + + + + + + + diff --git a/servlet/security-clientcert/src/main/java/org/javaee7/servlet/security/clientcert/SecureServlet.java b/servlet/security-clientcert/src/main/java/org/javaee7/servlet/security/clientcert/SecureServlet.java new file mode 100644 index 000000000..3d4624f5d --- /dev/null +++ b/servlet/security-clientcert/src/main/java/org/javaee7/servlet/security/clientcert/SecureServlet.java @@ -0,0 +1,25 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.servlet.security.clientcert; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Arjan Tijms + */ +@WebServlet(urlPatterns = { "/SecureServlet" }) +public class SecureServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.getWriter().print("principal " + request.getUserPrincipal() + " in role g1:" + request.isUserInRole("g1")); + } + +} diff --git a/servlet/security-clientcert/src/main/webapp/WEB-INF/glassfish-web.xml b/servlet/security-clientcert/src/main/webapp/WEB-INF/glassfish-web.xml new file mode 100644 index 000000000..19158e6cc --- /dev/null +++ b/servlet/security-clientcert/src/main/webapp/WEB-INF/glassfish-web.xml @@ -0,0 +1,14 @@ + + + + + + + g1 + g1 + C=UK, ST=lak, L=zak, O=kaz, OU=bar, CN=lfoo + + + diff --git a/servlet/security-clientcert/src/main/webapp/WEB-INF/web.xml b/servlet/security-clientcert/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..899e73beb --- /dev/null +++ b/servlet/security-clientcert/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,29 @@ + + + + + + + SecureServlet + /SecureServlet + GET + POST + + + g1 + + + + + CLIENT-CERT + + + + g1 + + diff --git a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java new file mode 100644 index 000000000..199ea4840 --- /dev/null +++ b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java @@ -0,0 +1,269 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.servlet.security.clientcert; + +import static java.math.BigInteger.ONE; +import static java.time.Instant.now; +import static java.time.temporal.ChronoUnit.DAYS; +import static org.javaee7.ServerOperations.addCertificateToContainerTrustStore; +import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URL; +import java.security.KeyManagementException; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.KeyStore; +import java.security.KeyStore.PasswordProtection; +import java.security.KeyStore.PrivateKeyEntry; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.PrivateKey; +import java.security.Provider; +import java.security.Security; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.logging.Logger; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import org.bouncycastle.asn1.x500.X500Name; +import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; +import org.bouncycastle.cert.X509v3CertificateBuilder; +import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.operator.OperatorCreationException; +import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; +import org.javaee7.ServerOperations; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.gargoylesoftware.htmlunit.TextPage; +import com.gargoylesoftware.htmlunit.WebClient; + +/** + * @author Arjan Tijms + */ +@RunWith(Arquillian.class) +public class SecureServletTest { + + private static Logger log = Logger.getLogger(SecureServletTest.class.getName()); + + private static final String WEBAPP_SRC = "src/main/webapp"; + + @ArquillianResource + private URL base; + + private URL baseHttps; + + WebClient webClient; + + @Deployment(testable = false) + public static WebArchive createDeployment() throws FileNotFoundException, IOException { + + Provider provider = new BouncyCastleProvider(); + Security.addProvider(provider); + + // Enable to get detailed logging about the SSL handshake + // System.setProperty("javax.net.debug", "ssl:handshake"); + + System.out.println("################################################################"); + + // ### Generate keys for the client, create a certificate, and add those to a new local key store + + // Generate a Private/Public key pair for the client + KeyPair clientKeyPair = generateRandomKeys(); + + // Create a certificate containing the public key and signed with the private key + X509Certificate clientCertificate = createSelfSignedCertificate(clientKeyPair); + + // Create a new local key store containing the private key and the certificate + createKeyStore(clientKeyPair.getPrivate(), clientCertificate); + + addCertificateToContainerTrustStore(clientCertificate); + + return create(WebArchive.class) + .addClass(SecureServlet.class) + .addAsWebInfResource((new File(WEBAPP_SRC + "/WEB-INF", "web.xml"))) + .addAsWebInfResource((new File(WEBAPP_SRC + "/WEB-INF", "glassfish-web.xml"))); + } + + @Before + public void setup() throws FileNotFoundException, IOException { + + webClient = new WebClient(); + + // Server -> client : the trust store certificates are used to validate the certificate sent + // by the server + webClient.getOptions().setSSLTrustStore(new File("clientTrustStore.jks").toURI().toURL(), "changeit", "jks"); + + // Client -> Server : the key store private keys and certificates are used to sign + // and sent a reply to the server + webClient.getOptions().setSSLClientCertificate(new File("clientKeyStore.jks").toURI().toURL(), "changeit", "jks"); + + } + + @After + public void tearDown() { + webClient.getCookieManager().clearCookies(); + webClient.close(); + } + + @Test + public void testGetWithCorrectCredentials() throws Exception { + // ### Ask the server for its certificate and add that to a new local trust store + + // First get the HTTPS url for which the server is listening + baseHttps = ServerOperations.toContainerHttps(base); + + if (baseHttps != null) { + X509Certificate[] serverCertificateChain = getCertificateChainFromServer(baseHttps.getHost(), baseHttps.getPort()); + createTrustStore(serverCertificateChain); + } else { + log.severe("No https URL could be created from " + base); + } + + TextPage page = webClient.getPage(baseHttps + "SecureServlet"); + + log.info(page.getContent()); + + assertTrue("my GET", page.getContent().contains("principal C=UK, ST=lak, L=zak, O=kaz, OU=bar, CN=lfoo")); + } + + + // Private methods + + // TODO: may move these to utility class + + private static X509Certificate[] getCertificateChainFromServer(String host, int port) { + + List X509Certificates = new ArrayList<>(); + + try { + SSLContext context = SSLContext.getInstance("TLS"); + + TrustManager interceptingTrustManager = new X509TrustManager() { + + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[] {}; + } + + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + System.out.println("**** intercepting checkServerTrusted chain" + chain + " authType " + authType); + X509Certificates.add(chain); + } + }; + + context.init(null, new TrustManager[] { interceptingTrustManager }, null); + + SSLSocketFactory factory = context.getSocketFactory(); + + try (SSLSocket socket = (SSLSocket) factory.createSocket(host, port)) { + socket.setSoTimeout(15000); + socket.startHandshake(); + socket.close(); + } + + } catch (NoSuchAlgorithmException | KeyManagementException | IOException e) { + e.printStackTrace(); + } + + if (!X509Certificates.isEmpty()) { + X509Certificate[] x509Certificates = X509Certificates.get(0); + + for (X509Certificate certificate : x509Certificates) { + System.out.println("\n**** Server presented certificate:" + certificate + " \n"); + } + + return x509Certificates; + } + + return null; + } + + public static X509Certificate createSelfSignedCertificate(KeyPair keys) { + try { + Provider provider = new BouncyCastleProvider(); + Security.addProvider(provider); + return new JcaX509CertificateConverter() + .setProvider(provider) + .getCertificate( + new X509v3CertificateBuilder( + new X500Name("CN=lfoo, OU=bar, O=kaz, L=zak, ST=lak, C=UK"), + ONE, + Date.from(now()), + Date.from(now().plus(1, DAYS)), + new X500Name("CN=lfoo, OU=bar, O=kaz, L=zak, ST=lak, C=UK"), + SubjectPublicKeyInfo.getInstance(keys.getPublic().getEncoded())) + .build( + new JcaContentSignerBuilder("SHA256WithRSA") + .setProvider(provider) + .build(keys.getPrivate()))); + } catch (CertificateException | OperatorCreationException e) { + throw new IllegalStateException(e); + } + } + + private static KeyPair generateRandomKeys() { + try { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC"); + keyPairGenerator.initialize(2048); + + return keyPairGenerator.generateKeyPair(); + } catch (NoSuchAlgorithmException | NoSuchProviderException e) { + throw new IllegalStateException(e); + } + } + + private static void createKeyStore(PrivateKey privateKey, X509Certificate certificate) { + try { + KeyStore keyStore = KeyStore.getInstance("jks"); + keyStore.load(null, null); + + keyStore.setEntry( + "clientKey", + new PrivateKeyEntry(privateKey, new Certificate[] { certificate }), + new PasswordProtection("changeit".toCharArray())); + + keyStore.store(new FileOutputStream("clientKeyStore.jks"), "changeit".toCharArray()); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + private static void createTrustStore(X509Certificate[] certificates) { + try { + KeyStore keyStore = KeyStore.getInstance("jks"); + keyStore.load(null, null); + + for (int i = 0; i < certificates.length; i++) { + keyStore.setCertificateEntry("serverCert" + i, certificates[i]); + } + + keyStore.store(new FileOutputStream("clientTrustStore.jks"), "changeit".toCharArray()); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + +} diff --git a/test-utils/src/main/java/org/javaee7/ServerOperations.java b/test-utils/src/main/java/org/javaee7/ServerOperations.java index 30f9c619b..e2325a903 100644 --- a/test-utils/src/main/java/org/javaee7/ServerOperations.java +++ b/test-utils/src/main/java/org/javaee7/ServerOperations.java @@ -1,8 +1,22 @@ package org.javaee7; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.file.Path; import java.nio.file.Paths; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Various high level Java EE 7 samples specific operations to execute against @@ -12,6 +26,8 @@ * */ public class ServerOperations { + + private static final Logger logger = Logger.getLogger(ServerOperations.class.getName()); /** * Add the default test user and credentials to the identity store of @@ -52,4 +68,169 @@ public static void addUsersToContainerIdentityStore() { // WildFly ./bin/add-user.sh -a -u u1 -p p1 -g g1 } + public static void addCertificateToContainerTrustStore(Certificate clientCertificate) { + + String javaEEServer = System.getProperty("javaEEServer"); + + if ("glassfish-remote".equals(javaEEServer) || "payara-remote".equals(javaEEServer)) { + + String gfHome = System.getProperty("glassfishRemote_gfHome"); + if (gfHome == null) { + logger.info("glassfishRemote_gfHome not specified"); + return; + } + + Path gfHomePath = Paths.get(gfHome); + if (!gfHomePath.toFile().exists()) { + logger.severe("glassfishRemote_gfHome at " + gfHome + " does not exists"); + return; + } + + if (!gfHomePath.toFile().isDirectory()) { + logger.severe("glassfishRemote_gfHome at " + gfHome + " is not a directory"); + return; + } + + // TODO: support current domain + Path cacertsPath = gfHomePath.resolve("glassfish/domains/domain1/config/cacerts.jks"); + + if (!cacertsPath.toFile().exists()) { + logger.severe("The trust store at " + cacertsPath.toAbsolutePath() + " does not exists"); + return; + } + + logger.info("*** Adding certificate to: " + cacertsPath.toAbsolutePath()); + + KeyStore keyStore = null; + try (InputStream in = new FileInputStream(cacertsPath.toAbsolutePath().toFile())) { + keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); + keyStore.load(in, "changeit".toCharArray()); + + keyStore.setCertificateEntry("arquillianClientTestCert", clientCertificate); + + keyStore.store(new FileOutputStream(cacertsPath.toAbsolutePath().toFile()), "changeit".toCharArray()); + } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException | IOException e) { + throw new IllegalStateException(e); + } + } else { + if (javaEEServer == null) { + System.out.println("javaEEServer not specified"); + } else { + System.out.println(javaEEServer + " not supported"); + } + } + + restartContainer(); + } + + public static URL toContainerHttps(URL url) { + if ("https".equals(url.getProtocol())) { + return url; + } + + String javaEEServer = System.getProperty("javaEEServer"); + + // String protocol, String host, int port, String file + + if ("glassfish-remote".equals(javaEEServer) || "payara-remote".equals(javaEEServer)) { + + try { + URL httpsUrl = new URL( + "https", + url.getHost(), + 8181, + url.getFile() + ); + + logger.info("Returning " + httpsUrl + " for " + url); + + return httpsUrl; + + } catch (MalformedURLException e) { + logger.log(Level.SEVERE, "Failure creating HTTPS URL", e); + } + + } else { + if (javaEEServer == null) { + System.out.println("javaEEServer not specified"); + } else { + System.out.println(javaEEServer + " not supported"); + } + } + + return null; + } + + public static void restartContainer() { + // Arquillian connectors can stop/start already, but not on demand by code + + String javaEEServer = System.getProperty("javaEEServer"); + + if ("glassfish-remote".equals(javaEEServer) || "payara-remote".equals(javaEEServer)) { + + System.out.println("Restarting domain"); + + List cmd = new ArrayList<>(); + + cmd.add("restart-domain"); + + CliCommands.payaraGlassFish(cmd); + + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } else { + if (javaEEServer == null) { + System.out.println("javaEEServer not specified"); + } else { + System.out.println(javaEEServer + " not supported"); + } + } + } + + public static void restartContainerDebug() { + // Arquillian connectors can stop/start already, but not on demand by code + + String javaEEServer = System.getProperty("javaEEServer"); + + if ("glassfish-remote".equals(javaEEServer) || "payara-remote".equals(javaEEServer)) { + + System.out.println("Stopping domain"); + + List cmd = new ArrayList<>(); + + cmd.add("stop-domain"); + + CliCommands.payaraGlassFish(cmd); + + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + System.out.println("Starting domain"); + + cmd = new ArrayList<>(); + + cmd.add("start-domain"); + + CliCommands.payaraGlassFish(cmd); + + System.out.println("Command returned"); + + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + System.out.println("After sleep"); + } + + } + } From 18700e8910fb83e4d100bb2d1f706d2340ea7b8e Mon Sep 17 00:00:00 2001 From: arjantijms Date: Fri, 22 Jun 2018 09:16:38 +0200 Subject: [PATCH 036/117] Removed usage of closeAllWindows() method --- jaspic/common/pom.xml | 3 +-- .../main/java/org/javaee7/jaspic/common/ArquillianBase.java | 2 +- .../org/javaee7/jaxrs/security/declarative/MyResourceTest.java | 2 +- .../javaee7/servlet/security/annotated/SecureServletTest.java | 2 +- .../servlet/security/basicauth/omission/SecureServletTest.java | 2 +- .../javaee7/servlet/security/basicauth/SecureServletTest.java | 2 +- .../servlet/security/deny/uncovered/SecureServletTest.java | 2 +- .../java/org/javaee7/servlet/security/form/based/FormTest.java | 2 +- 8 files changed, 8 insertions(+), 9 deletions(-) diff --git a/jaspic/common/pom.xml b/jaspic/common/pom.xml index ff71707d5..ed3a7ca7b 100644 --- a/jaspic/common/pom.xml +++ b/jaspic/common/pom.xml @@ -10,7 +10,6 @@ org.javaee7 jaspic 1.0-SNAPSHOT - ../pom.xml jaspic-common @@ -33,7 +32,7 @@ net.sourceforge.htmlunit htmlunit - 2.13 + 2.31 provided diff --git a/jaspic/common/src/main/java/org/javaee7/jaspic/common/ArquillianBase.java b/jaspic/common/src/main/java/org/javaee7/jaspic/common/ArquillianBase.java index 732b3fa15..2771fc4b5 100644 --- a/jaspic/common/src/main/java/org/javaee7/jaspic/common/ArquillianBase.java +++ b/jaspic/common/src/main/java/org/javaee7/jaspic/common/ArquillianBase.java @@ -119,7 +119,7 @@ public void setUp() { @After public void tearDown() { webClient.getCookieManager().clearCookies(); - webClient.closeAllWindows(); + webClient.close(); } diff --git a/jaxrs/jaxrs-security-declarative/src/test/java/org/javaee7/jaxrs/security/declarative/MyResourceTest.java b/jaxrs/jaxrs-security-declarative/src/test/java/org/javaee7/jaxrs/security/declarative/MyResourceTest.java index 8a1ba57b1..6236138ff 100644 --- a/jaxrs/jaxrs-security-declarative/src/test/java/org/javaee7/jaxrs/security/declarative/MyResourceTest.java +++ b/jaxrs/jaxrs-security-declarative/src/test/java/org/javaee7/jaxrs/security/declarative/MyResourceTest.java @@ -53,7 +53,7 @@ public void setup() { @After public void tearDown() { - webClient.closeAllWindows(); + webClient.close(); } @Deployment(testable = false) diff --git a/servlet/security-annotated/src/test/java/org/javaee7/servlet/security/annotated/SecureServletTest.java b/servlet/security-annotated/src/test/java/org/javaee7/servlet/security/annotated/SecureServletTest.java index 3ec331b00..79694789b 100644 --- a/servlet/security-annotated/src/test/java/org/javaee7/servlet/security/annotated/SecureServletTest.java +++ b/servlet/security-annotated/src/test/java/org/javaee7/servlet/security/annotated/SecureServletTest.java @@ -56,7 +56,7 @@ public void setup() { @After public void tearDown() { webClient.getCookieManager().clearCookies(); - webClient.closeAllWindows(); + webClient.close(); } @Test diff --git a/servlet/security-basicauth-omission/src/test/java/org/javaee7/servlet/security/basicauth/omission/SecureServletTest.java b/servlet/security-basicauth-omission/src/test/java/org/javaee7/servlet/security/basicauth/omission/SecureServletTest.java index 7772c483b..0b4fcf5cf 100644 --- a/servlet/security-basicauth-omission/src/test/java/org/javaee7/servlet/security/basicauth/omission/SecureServletTest.java +++ b/servlet/security-basicauth-omission/src/test/java/org/javaee7/servlet/security/basicauth/omission/SecureServletTest.java @@ -60,7 +60,7 @@ public void setup() { @After public void tearDown() { webClient.getCookieManager().clearCookies(); - webClient.closeAllWindows(); + webClient.close(); } @Test diff --git a/servlet/security-basicauth/src/test/java/org/javaee7/servlet/security/basicauth/SecureServletTest.java b/servlet/security-basicauth/src/test/java/org/javaee7/servlet/security/basicauth/SecureServletTest.java index d2ddd3f2b..8edcc2ce3 100644 --- a/servlet/security-basicauth/src/test/java/org/javaee7/servlet/security/basicauth/SecureServletTest.java +++ b/servlet/security-basicauth/src/test/java/org/javaee7/servlet/security/basicauth/SecureServletTest.java @@ -62,7 +62,7 @@ public void setup() { @After public void tearDown() { webClient.getCookieManager().clearCookies(); - webClient.closeAllWindows(); + webClient.close(); } @Test diff --git a/servlet/security-deny-uncovered/src/test/java/org/javaee7/servlet/security/deny/uncovered/SecureServletTest.java b/servlet/security-deny-uncovered/src/test/java/org/javaee7/servlet/security/deny/uncovered/SecureServletTest.java index 7466c723a..5b197cb75 100644 --- a/servlet/security-deny-uncovered/src/test/java/org/javaee7/servlet/security/deny/uncovered/SecureServletTest.java +++ b/servlet/security-deny-uncovered/src/test/java/org/javaee7/servlet/security/deny/uncovered/SecureServletTest.java @@ -63,7 +63,7 @@ public void setup() { @After public void tearDown() { webClient.getCookieManager().clearCookies(); - webClient.closeAllWindows(); + webClient.close(); } @Test diff --git a/servlet/security-form-based/src/test/java/org/javaee7/servlet/security/form/based/FormTest.java b/servlet/security-form-based/src/test/java/org/javaee7/servlet/security/form/based/FormTest.java index 5fae84683..ec0893939 100644 --- a/servlet/security-form-based/src/test/java/org/javaee7/servlet/security/form/based/FormTest.java +++ b/servlet/security-form-based/src/test/java/org/javaee7/servlet/security/form/based/FormTest.java @@ -59,7 +59,7 @@ public void setup() throws IOException { public void tearDown() { WebClient webClient = loginForm.getPage().getWebClient(); webClient.getCookieManager().clearCookies(); - webClient.closeAllWindows(); + webClient.close(); } @Test From 9b8de71751b2db8bfe0de38ea3d924e27455ff46 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 5 Jul 2018 17:05:30 +0200 Subject: [PATCH 037/117] Added tests for CDI decorators --- cdi/decorators-builtin-beans/pom.xml | 13 ++++ .../decorators/builtin/RequestDecorator.java | 32 ++++++++++ .../src/main/webapp/WEB-INF/beans.xml | 48 ++++++++++++++ .../cdi/decorators/builtin/DecoratorTest.java | 38 +++++++++++ cdi/decorators-priority/pom.xml | 13 ++++ .../cdi/decorators/priority/Greeting.java | 47 ++++++++++++++ .../cdi/decorators/priority/MyDecorator.java | 63 +++++++++++++++++++ .../decorators/priority/SimpleGreeting.java | 52 +++++++++++++++ .../src/main/webapp/WEB-INF/beans.xml | 48 ++++++++++++++ .../decorators/priority/DecoratorTest.java | 39 ++++++++++++ .../org/javaee7/cdi/decorators/Greeting.java | 2 +- cdi/pom.xml | 2 + pom.xml | 6 +- 13 files changed, 399 insertions(+), 4 deletions(-) create mode 100644 cdi/decorators-builtin-beans/pom.xml create mode 100644 cdi/decorators-builtin-beans/src/main/java/org/javaee7/cdi/decorators/builtin/RequestDecorator.java create mode 100644 cdi/decorators-builtin-beans/src/main/webapp/WEB-INF/beans.xml create mode 100644 cdi/decorators-builtin-beans/src/test/java/org/javaee7/cdi/decorators/builtin/DecoratorTest.java create mode 100644 cdi/decorators-priority/pom.xml create mode 100644 cdi/decorators-priority/src/main/java/org/javaee7/cdi/decorators/priority/Greeting.java create mode 100644 cdi/decorators-priority/src/main/java/org/javaee7/cdi/decorators/priority/MyDecorator.java create mode 100644 cdi/decorators-priority/src/main/java/org/javaee7/cdi/decorators/priority/SimpleGreeting.java create mode 100644 cdi/decorators-priority/src/main/webapp/WEB-INF/beans.xml create mode 100644 cdi/decorators-priority/src/test/java/org/javaee7/cdi/decorators/priority/DecoratorTest.java diff --git a/cdi/decorators-builtin-beans/pom.xml b/cdi/decorators-builtin-beans/pom.xml new file mode 100644 index 000000000..7dacaa53f --- /dev/null +++ b/cdi/decorators-builtin-beans/pom.xml @@ -0,0 +1,13 @@ + + 4.0.0 + + + org.javaee7 + cdi + 1.0-SNAPSHOT + + + cdi-decorators-builtin-beans + war + Java EE 7 Sample: cdi - decorators - built-in beans + diff --git a/cdi/decorators-builtin-beans/src/main/java/org/javaee7/cdi/decorators/builtin/RequestDecorator.java b/cdi/decorators-builtin-beans/src/main/java/org/javaee7/cdi/decorators/builtin/RequestDecorator.java new file mode 100644 index 000000000..3b54fe1aa --- /dev/null +++ b/cdi/decorators-builtin-beans/src/main/java/org/javaee7/cdi/decorators/builtin/RequestDecorator.java @@ -0,0 +1,32 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.cdi.decorators.builtin; + +import java.io.Serializable; + +import javax.annotation.Priority; +import javax.decorator.Decorator; +import javax.decorator.Delegate; +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; + +@Decorator +@Priority(100) +public abstract class RequestDecorator implements HttpServletRequest, Serializable { + + private static final long serialVersionUID = 1L; + + @Inject + @Delegate + private HttpServletRequest request; + + @Override + public String getParameter(String name) { + + if ("decorated".equals(name)) { + return "true"; + } + + return request.getParameter(name); + } + +} diff --git a/cdi/decorators-builtin-beans/src/main/webapp/WEB-INF/beans.xml b/cdi/decorators-builtin-beans/src/main/webapp/WEB-INF/beans.xml new file mode 100644 index 000000000..dedeab946 --- /dev/null +++ b/cdi/decorators-builtin-beans/src/main/webapp/WEB-INF/beans.xml @@ -0,0 +1,48 @@ + + + + + diff --git a/cdi/decorators-builtin-beans/src/test/java/org/javaee7/cdi/decorators/builtin/DecoratorTest.java b/cdi/decorators-builtin-beans/src/test/java/org/javaee7/cdi/decorators/builtin/DecoratorTest.java new file mode 100644 index 000000000..8d8fc54d0 --- /dev/null +++ b/cdi/decorators-builtin-beans/src/test/java/org/javaee7/cdi/decorators/builtin/DecoratorTest.java @@ -0,0 +1,38 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.cdi.decorators.builtin; + +import static org.hamcrest.core.Is.is; +import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import static org.junit.Assert.assertThat; + +import java.io.File; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; + +import org.javaee7.cdi.decorators.builtin.RequestDecorator; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(Arquillian.class) +public class DecoratorTest { + + @Inject + private HttpServletRequest request; + + @Deployment + public static Archive deploy() { + return create(JavaArchive.class) + .addAsManifestResource(new File("src/main/webapp/WEB-INF/beans.xml"), "beans.xml") + .addPackage(RequestDecorator.class.getPackage()); + } + + @Test + public void test() { + assertThat(request.getParameter("decorated"), is("true")); + } +} diff --git a/cdi/decorators-priority/pom.xml b/cdi/decorators-priority/pom.xml new file mode 100644 index 000000000..d6194745f --- /dev/null +++ b/cdi/decorators-priority/pom.xml @@ -0,0 +1,13 @@ + + 4.0.0 + + + org.javaee7 + cdi + 1.0-SNAPSHOT + + + cdi-decorators-priority + war + Java EE 7 Sample: cdi - decorators priority + diff --git a/cdi/decorators-priority/src/main/java/org/javaee7/cdi/decorators/priority/Greeting.java b/cdi/decorators-priority/src/main/java/org/javaee7/cdi/decorators/priority/Greeting.java new file mode 100644 index 000000000..8b9fb2650 --- /dev/null +++ b/cdi/decorators-priority/src/main/java/org/javaee7/cdi/decorators/priority/Greeting.java @@ -0,0 +1,47 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + * or packager/legal/LICENSE.txt. See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at packager/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * Oracle designates this particular file as subject to the "Classpath" + * exception as provided by Oracle in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +package org.javaee7.cdi.decorators.priority; + +/** + * @author Arun Gupta + */ +public interface Greeting { + String greet(String name); +} diff --git a/cdi/decorators-priority/src/main/java/org/javaee7/cdi/decorators/priority/MyDecorator.java b/cdi/decorators-priority/src/main/java/org/javaee7/cdi/decorators/priority/MyDecorator.java new file mode 100644 index 000000000..4d67f111c --- /dev/null +++ b/cdi/decorators-priority/src/main/java/org/javaee7/cdi/decorators/priority/MyDecorator.java @@ -0,0 +1,63 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + * or packager/legal/LICENSE.txt. See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at packager/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * Oracle designates this particular file as subject to the "Classpath" + * exception as provided by Oracle in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +package org.javaee7.cdi.decorators.priority; + +import javax.annotation.Priority; +import javax.decorator.Decorator; +import javax.decorator.Delegate; +import javax.inject.Inject; + +/** + * @author Arun Gupta + */ +@Decorator +@Priority(100) +public class MyDecorator implements Greeting { + + @Inject + @Delegate + private Greeting greeting; + + @Override + public String greet(String name) { + return greeting.greet(name + " very much!"); + } + +} diff --git a/cdi/decorators-priority/src/main/java/org/javaee7/cdi/decorators/priority/SimpleGreeting.java b/cdi/decorators-priority/src/main/java/org/javaee7/cdi/decorators/priority/SimpleGreeting.java new file mode 100644 index 000000000..7ef29cdeb --- /dev/null +++ b/cdi/decorators-priority/src/main/java/org/javaee7/cdi/decorators/priority/SimpleGreeting.java @@ -0,0 +1,52 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + * or packager/legal/LICENSE.txt. See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at packager/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * Oracle designates this particular file as subject to the "Classpath" + * exception as provided by Oracle in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +package org.javaee7.cdi.decorators.priority; + +/** + * @author Arun Gupta + */ +public class SimpleGreeting implements Greeting { + + @Override + public String greet(String name) { + return "Hello " + name; + } + +} diff --git a/cdi/decorators-priority/src/main/webapp/WEB-INF/beans.xml b/cdi/decorators-priority/src/main/webapp/WEB-INF/beans.xml new file mode 100644 index 000000000..dedeab946 --- /dev/null +++ b/cdi/decorators-priority/src/main/webapp/WEB-INF/beans.xml @@ -0,0 +1,48 @@ + + + + + diff --git a/cdi/decorators-priority/src/test/java/org/javaee7/cdi/decorators/priority/DecoratorTest.java b/cdi/decorators-priority/src/test/java/org/javaee7/cdi/decorators/priority/DecoratorTest.java new file mode 100644 index 000000000..19efe4f00 --- /dev/null +++ b/cdi/decorators-priority/src/test/java/org/javaee7/cdi/decorators/priority/DecoratorTest.java @@ -0,0 +1,39 @@ +package org.javaee7.cdi.decorators.priority; + +import static org.hamcrest.core.Is.is; +import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import static org.junit.Assert.assertThat; + +import java.io.File; +import java.net.URISyntaxException; + +import javax.inject.Inject; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * @author Korneliusz Rabczak + */ +@RunWith(Arquillian.class) +public class DecoratorTest { + + @Inject + private Greeting greeting; + + @Deployment + public static Archive deploy() throws URISyntaxException { + return create(JavaArchive.class) + .addAsManifestResource(new File("src/main/webapp/WEB-INF/beans.xml"), "beans.xml") + .addPackage(SimpleGreeting.class.getPackage()); + } + + @Test + public void test() { + assertThat(greeting.greet("Duke"), is("Hello Duke very much!")); + } +} diff --git a/cdi/decorators/src/main/java/org/javaee7/cdi/decorators/Greeting.java b/cdi/decorators/src/main/java/org/javaee7/cdi/decorators/Greeting.java index 72df89fa0..82c61a6ec 100644 --- a/cdi/decorators/src/main/java/org/javaee7/cdi/decorators/Greeting.java +++ b/cdi/decorators/src/main/java/org/javaee7/cdi/decorators/Greeting.java @@ -43,5 +43,5 @@ * @author Arun Gupta */ public interface Greeting { - public String greet(String name); + String greet(String name); } diff --git a/cdi/pom.xml b/cdi/pom.xml index 6e196f67d..b5c3da65b 100644 --- a/cdi/pom.xml +++ b/cdi/pom.xml @@ -18,6 +18,8 @@ vetoed pkg-level decorators + decorators-priority + decorators-builtin-beans dynamic-interceptor bean-discovery-all bean-discovery-annotated diff --git a/pom.xml b/pom.xml index a1019ad6e..48377d44d 100644 --- a/pom.xml +++ b/pom.xml @@ -31,10 +31,10 @@ (these are downloaded and installed in these versions by Maven for the CI profiles) --> 4.1.2.181 - 5.181-SNAPSHOT + 5.182 4.1.1 16.0.0.4 - 11.0.0.Final + 13.0.0.Final 2017.11.0 7.0.2 9.0.4 @@ -443,7 +443,7 @@ fish.payara.arquillian arquillian-payara-micro-5-managed - 1.0.Beta3-m3 + 1.0.Beta3 test From 04783f8a63f10c83e4e793d6520d947ae90df346 Mon Sep 17 00:00:00 2001 From: Juan Gonzalez Date: Thu, 2 Aug 2018 15:09:46 +0200 Subject: [PATCH 038/117] Update to new wildfly-swarm name and artifacts --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 8373d4298..5a7a8c30b 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ 4.1.1 16.0.0.4 13.0.0.Final - 2017.11.0 + 2.0.0.Final 7.0.2 9.0.4 @@ -1030,7 +1030,7 @@ - org.wildfly.swarm + io.thorntail arquillian ${wildfly.swarm.version} test From 4ecf368549f23c98f0c636e77288f942f9312721 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 9 Aug 2018 21:58:20 +0200 Subject: [PATCH 039/117] Added a very simple example for a JAX-RS GET request --- jaxrs/pom.xml | 4 +- jaxrs/simple-get/pom.xml | 15 ++++ .../jaxrs/simple/get/JaxRsActivator.java | 16 ++++ .../javaee7/jaxrs/simple/get/Resource.java | 27 +++++++ .../jaxrs/simple/get/JAXRSSimpleGetTest.java | 74 +++++++++++++++++++ 5 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 jaxrs/simple-get/pom.xml create mode 100644 jaxrs/simple-get/src/main/java/org/javaee7/jaxrs/simple/get/JaxRsActivator.java create mode 100644 jaxrs/simple-get/src/main/java/org/javaee7/jaxrs/simple/get/Resource.java create mode 100644 jaxrs/simple-get/src/test/java/org/javaee7/jaxrs/simple/get/JAXRSSimpleGetTest.java diff --git a/jaxrs/pom.xml b/jaxrs/pom.xml index 5ee96fa95..f1d37011d 100644 --- a/jaxrs/pom.xml +++ b/jaxrs/pom.xml @@ -17,6 +17,7 @@ beanvalidation beanparam client-negotiation + db-access dynamicfilter fileupload filter @@ -35,10 +36,11 @@ request-binding resource-validation server-negotiation + simple-get singleton readerwriter-injection jaxrs-security-declarative - db-access + diff --git a/jaxrs/simple-get/pom.xml b/jaxrs/simple-get/pom.xml new file mode 100644 index 000000000..a70d4ac67 --- /dev/null +++ b/jaxrs/simple-get/pom.xml @@ -0,0 +1,15 @@ + + 4.0.0 + + + org.javaee7 + jaxrs + 1.0-SNAPSHOT + + + simple-get + war + + Java EE 7 Sample: jaxrs - simple-get + + diff --git a/jaxrs/simple-get/src/main/java/org/javaee7/jaxrs/simple/get/JaxRsActivator.java b/jaxrs/simple-get/src/main/java/org/javaee7/jaxrs/simple/get/JaxRsActivator.java new file mode 100644 index 000000000..b1b94888e --- /dev/null +++ b/jaxrs/simple-get/src/main/java/org/javaee7/jaxrs/simple/get/JaxRsActivator.java @@ -0,0 +1,16 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.jaxrs.simple.get; + +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.core.Application; + +/** + * This class activates JAX-RS and sets the base path to "/rest". + * + * @author Arjan Tijms + * + */ +@ApplicationPath("/rest") +public class JaxRsActivator extends Application { + +} diff --git a/jaxrs/simple-get/src/main/java/org/javaee7/jaxrs/simple/get/Resource.java b/jaxrs/simple-get/src/main/java/org/javaee7/jaxrs/simple/get/Resource.java new file mode 100644 index 000000000..244d2ae87 --- /dev/null +++ b/jaxrs/simple-get/src/main/java/org/javaee7/jaxrs/simple/get/Resource.java @@ -0,0 +1,27 @@ +/** Copyright Payara Services Limited **/ + +package org.javaee7.jaxrs.simple.get; + +import static javax.ws.rs.core.MediaType.TEXT_PLAIN; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +/** + * A very simple JAX-RS resource class that just returns the string "hi!" + * + * @author Arjan Tijms + * + */ +@Path("/resource") +@Produces(TEXT_PLAIN) +public class Resource { + + @GET + @Path("hi") + public String hi() { + return "hi!"; + } + +} diff --git a/jaxrs/simple-get/src/test/java/org/javaee7/jaxrs/simple/get/JAXRSSimpleGetTest.java b/jaxrs/simple-get/src/test/java/org/javaee7/jaxrs/simple/get/JAXRSSimpleGetTest.java new file mode 100644 index 000000000..8ea8546f8 --- /dev/null +++ b/jaxrs/simple-get/src/test/java/org/javaee7/jaxrs/simple/get/JAXRSSimpleGetTest.java @@ -0,0 +1,74 @@ +/** Copyright Payara Services Limited **/ + +package org.javaee7.jaxrs.simple.get; + +import static javax.ws.rs.client.ClientBuilder.newClient; +import static javax.ws.rs.core.MediaType.TEXT_PLAIN; +import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.net.URI; +import java.net.URL; + +import org.javaee7.jaxrs.simple.get.JaxRsActivator; +import org.javaee7.jaxrs.simple.get.Resource; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * This sample tests one of the simplest possible JAX-RS resources; one that only + * has a single method responding to a GET request and returning a (small) string. + * + * @author Arjan Tijms + */ +@RunWith(Arquillian.class) +public class JAXRSSimpleGetTest { + + @ArquillianResource + private URL base; + + @Deployment(testable = false) + public static WebArchive createDeployment() { + WebArchive archive = + create(WebArchive.class) + .addClasses( + JaxRsActivator.class, + Resource.class + ); + + System.out.println("************************************************************"); + System.out.println(archive.toString(true)); + System.out.println("************************************************************"); + + return archive; + } + + @Test + @RunAsClient + public void testGet() throws IOException { + + String response = + newClient() + .target( + URI.create(new URL(base, "rest/resource/hi").toExternalForm())) + .request(TEXT_PLAIN) + .get(String.class); + + System.out.println("-------------------------------------------------------------------------"); + System.out.println("Response: \n\n" + response); + System.out.println("-------------------------------------------------------------------------"); + + assertTrue( + response.contains("hi") + ); + } + + + +} From f1a8fb6f6dafcd05d44b240ed81968bd09a5f73e Mon Sep 17 00:00:00 2001 From: arjantijms Date: Wed, 15 Aug 2018 23:01:35 +0100 Subject: [PATCH 040/117] Added sample for Servlet DIGEST authentication --- pom.xml | 69 ++++++++- servlet/pom.xml | 4 + servlet/security-clientcert/pom.xml | 35 ++--- servlet/security-digest/pom.xml | 64 +++++++++ .../security/digest/DatabaseSetup.java | 77 ++++++++++ .../security/digest/SecureServlet.java | 67 +++++++++ .../src/main/webapp/WEB-INF/glassfish-web.xml | 51 +++++++ .../src/main/webapp/WEB-INF/web.xml | 69 +++++++++ .../security/digest/SecureServletTest.java | 134 ++++++++++++++++++ .../java/org/javaee7/ServerOperations.java | 43 +++++- 10 files changed, 585 insertions(+), 28 deletions(-) create mode 100644 servlet/security-digest/pom.xml create mode 100644 servlet/security-digest/src/main/java/org/javaee7/servlet/security/digest/DatabaseSetup.java create mode 100644 servlet/security-digest/src/main/java/org/javaee7/servlet/security/digest/SecureServlet.java create mode 100644 servlet/security-digest/src/main/webapp/WEB-INF/glassfish-web.xml create mode 100644 servlet/security-digest/src/main/webapp/WEB-INF/web.xml create mode 100644 servlet/security-digest/src/test/java/org/javaee7/servlet/security/digest/SecureServletTest.java diff --git a/pom.xml b/pom.xml index 5a7a8c30b..9dcce4ed6 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,8 @@ ${skipTests} ${skipTests} + ${skipTests + @@ -426,10 +424,15 @@ payara-micro-managed + true true + true + + + true @@ -490,6 +493,12 @@ payara-embedded + + + + true + + @@ -566,6 +575,12 @@ glassfish-embedded + + + + true + + org.glassfish.main.extras @@ -694,9 +709,12 @@ wildfly-embedded + standalone-full.xml ${project.build.directory}/wildfly-${wildfly.version} + + true + true + + true + + + true + + true + + + org.apache.tomee @@ -1125,6 +1164,11 @@ tomee-ci-managed + + + true + + apache.snapshots @@ -1234,6 +1278,11 @@ liberty-managed + + + true + + org.jboss.arquillian.container @@ -1290,6 +1339,11 @@ liberty-ci-managed + + + + true + @@ -1387,6 +1441,9 @@ myserver + + + true @@ -1429,6 +1486,8 @@ true true true + + true @@ -1463,6 +1522,8 @@ true true true + + true diff --git a/servlet/pom.xml b/servlet/pom.xml index d7b8a3c14..365fd69bf 100644 --- a/servlet/pom.xml +++ b/servlet/pom.xml @@ -30,7 +30,11 @@ security-basicauth + security-digest security-form-based + security-clientcert + + security-programmatic security-deny-uncovered security-annotated diff --git a/servlet/security-clientcert/pom.xml b/servlet/security-clientcert/pom.xml index ce0a8bd2c..30da71b38 100644 --- a/servlet/security-clientcert/pom.xml +++ b/servlet/security-clientcert/pom.xml @@ -28,27 +28,16 @@ - - - payara-micro-managed - - - - src/test/resources - true - - - - - maven-surefire-plugin - - - --postdeploycommandfile ${project.build.directory}/test-classes/addUsersPayara.txt - - - - - - - + + + + org.apache.maven.plugins + maven-surefire-plugin + + ${skipServletClientCertificate} + + + + + diff --git a/servlet/security-digest/pom.xml b/servlet/security-digest/pom.xml new file mode 100644 index 000000000..bd3e6878b --- /dev/null +++ b/servlet/security-digest/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + + + org.javaee7 + servlet + 1.0-SNAPSHOT + + + servlet-security-digest + war + + Java EE 7 Sample: servlet - security-digest + + + + + org.apache.maven.plugins + maven-surefire-plugin + + ${skipServletClientCertificate} + + org.apache.commons.logging.impl.SimpleLog + true + DEBUG + ERROR + + + + + + + + + commons-codec + commons-codec + 1.11 + + + + + + payara-micro-managed + + + + src/test/resources + true + + + + + maven-surefire-plugin + + + --postdeploycommandfile ${project.build.directory}/test-classes/addUsersPayara.txt + + + + + + + + diff --git a/servlet/security-digest/src/main/java/org/javaee7/servlet/security/digest/DatabaseSetup.java b/servlet/security-digest/src/main/java/org/javaee7/servlet/security/digest/DatabaseSetup.java new file mode 100644 index 000000000..c78d4f2c1 --- /dev/null +++ b/servlet/security-digest/src/main/java/org/javaee7/servlet/security/digest/DatabaseSetup.java @@ -0,0 +1,77 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.servlet.security.digest; + +import static org.apache.commons.codec.digest.DigestUtils.md5Hex; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import javax.annotation.Resource; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.annotation.WebListener; +import javax.sql.DataSource; + + +/** + * + * @author Arjan Tijms + * + */ +@WebListener +public class DatabaseSetup implements ServletContextListener { + + @Resource + private DataSource dataSource; + + @Override + public void contextInitialized(ServletContextEvent sce) { + System.out.println("Creating DB tables"); + + // Note "eesamplesdigestrealm" is the name of the realm as defined in web.xml: + // + // + // DIGEST + // eesamplesdigestrealm + // + + String ha1 = md5Hex("u1" + ":" + "eesamplesdigestrealm" + ":" + "p1"); + + System.out.println("ha1=" + ha1); + + execute(dataSource, "DROP TABLE IF EXISTS usertable"); + execute(dataSource, "DROP TABLE IF EXISTS grouptable"); + + System.out.println("Adding user u1 with group g1 to database"); + + execute(dataSource, "CREATE TABLE IF NOT EXISTS usertable(username VARCHAR(32) PRIMARY KEY, password VARCHAR(127))"); + execute(dataSource, "CREATE TABLE IF NOT EXISTS grouptable(username VARCHAR(64), groupname VARCHAR(64))"); + + execute(dataSource, "INSERT INTO usertable VALUES('u1', '" + ha1 + "')"); + + execute(dataSource, "INSERT INTO grouptable VALUES('u1', 'g1')"); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + try { + execute(dataSource, "DROP TABLE IF EXISTS usertable"); + execute(dataSource, "DROP TABLE IF EXISTS grouptable"); + } catch (Exception e) { + } + + } + + private void execute(DataSource dataSource, String query) { + try ( + Connection connection = dataSource.getConnection(); + PreparedStatement statement = connection.prepareStatement(query); + ) { + statement.executeUpdate(); + } catch (SQLException e) { + throw new IllegalStateException(e); + } + } + +} diff --git a/servlet/security-digest/src/main/java/org/javaee7/servlet/security/digest/SecureServlet.java b/servlet/security-digest/src/main/java/org/javaee7/servlet/security/digest/SecureServlet.java new file mode 100644 index 000000000..c9b56bbdb --- /dev/null +++ b/servlet/security-digest/src/main/java/org/javaee7/servlet/security/digest/SecureServlet.java @@ -0,0 +1,67 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + * or packager/legal/LICENSE.txt. See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at packager/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * Oracle designates this particular file as subject to the "Classpath" + * exception as provided by Oracle in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +package org.javaee7.servlet.security.digest; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Arun Gupta + */ +@WebServlet(urlPatterns = { "/SecureServlet" }) +public class SecureServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.getWriter().print("my GET"); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.getWriter().print("my POST"); + } +} diff --git a/servlet/security-digest/src/main/webapp/WEB-INF/glassfish-web.xml b/servlet/security-digest/src/main/webapp/WEB-INF/glassfish-web.xml new file mode 100644 index 000000000..0ef896eaa --- /dev/null +++ b/servlet/security-digest/src/main/webapp/WEB-INF/glassfish-web.xml @@ -0,0 +1,51 @@ + + + + + + + + g1 + g1 + + diff --git a/servlet/security-digest/src/main/webapp/WEB-INF/web.xml b/servlet/security-digest/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..27b0d0c7e --- /dev/null +++ b/servlet/security-digest/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,69 @@ + + + + + + + + SecureServlet + /SecureServlet + GET + POST + + + g1 + + + + + DIGEST + eesamplesdigestrealm + + + + g1 + + diff --git a/servlet/security-digest/src/test/java/org/javaee7/servlet/security/digest/SecureServletTest.java b/servlet/security-digest/src/test/java/org/javaee7/servlet/security/digest/SecureServletTest.java new file mode 100644 index 000000000..d49030d36 --- /dev/null +++ b/servlet/security-digest/src/test/java/org/javaee7/servlet/security/digest/SecureServletTest.java @@ -0,0 +1,134 @@ +/** Portions Copyright Payara Services Limited **/ +package org.javaee7.servlet.security.digest; + +import static com.gargoylesoftware.htmlunit.HttpMethod.POST; +import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + +import java.io.File; +import java.net.URL; + +import org.javaee7.ServerOperations; +import org.javaee7.servlet.security.digest.DatabaseSetup; +import org.javaee7.servlet.security.digest.SecureServlet; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.jboss.shrinkwrap.resolver.api.maven.Maven; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider; +import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; +import com.gargoylesoftware.htmlunit.TextPage; +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.WebRequest; + +/** + * @author Arun Gupta + */ +@RunWith(Arquillian.class) +public class SecureServletTest { + + private static final String WEBAPP_SRC = "src/main/webapp"; + + @ArquillianResource + private URL base; + + WebClient webClient; + DefaultCredentialsProvider correctCreds = new DefaultCredentialsProvider(); + DefaultCredentialsProvider incorrectCreds = new DefaultCredentialsProvider(); + + @Deployment(testable = false) + public static WebArchive createDeployment() { + + ServerOperations.setupContainerJDBCIDigestIdentityStore(); + + return create(WebArchive.class) + .addClasses( + SecureServlet.class, + DatabaseSetup.class) // Adds test user and credential + .addAsWebInfResource( + new File(WEBAPP_SRC + "/WEB-INF", "web.xml")) + .addAsLibraries(Maven.resolver() + .loadPomFromFile("pom.xml") + .resolve("commons-codec:commons-codec") + .withTransitivity() + .as(JavaArchive.class)); + } + + @Before + public void setup() { + webClient = new WebClient(); + correctCreds.addCredentials("u1", "p1"); + incorrectCreds.addCredentials("random", "random"); + } + + @After + public void tearDown() { + webClient.getCookieManager().clearCookies(); + webClient.close(); + } + + @Test + public void testGetWithCorrectCredentials() throws Exception { + System.out.println("\n\n\nStarting testGetWithCorrectCredentials\n\n"); + + webClient.setCredentialsProvider(correctCreds); + TextPage page = webClient.getPage(base + "/SecureServlet"); + + assertEquals("my GET", page.getContent()); + } + + @Test + public void testGetWithIncorrectCredentials() throws Exception { + System.out.println("\n\n\nStarting testGetWithIncorrectCredentials\n\n"); + + webClient.setCredentialsProvider(incorrectCreds); + + try { + webClient.getPage(base + "/SecureServlet"); + } catch (FailingHttpStatusCodeException e) { + assertNotNull(e); + assertEquals(401, e.getStatusCode()); + return; + } + + fail("/SecureServlet could be accessed without proper security credentials"); + } + + @Test + public void testPostWithCorrectCredentials() throws Exception { + System.out.println("\n\n\nStarting testPostWithCorrectCredentials\n\n"); + + webClient.setCredentialsProvider(correctCreds); + WebRequest request = new WebRequest(new URL(base + "/SecureServlet"), POST); + TextPage page = webClient.getPage(request); + + assertEquals("my POST", page.getContent()); + } + + @Test + public void testPostWithIncorrectCredentials() throws Exception { + System.out.println("\n\n\nStarting testPostWithIncorrectCredentials\n\n"); + + webClient.setCredentialsProvider(incorrectCreds); + WebRequest request = new WebRequest(new URL(base + "/SecureServlet"), POST); + + try { + webClient.getPage(request); + } catch (FailingHttpStatusCodeException e) { + assertNotNull(e); + assertEquals(401, e.getStatusCode()); + return; + } + + fail("/SecureServlet could be accessed without proper security credentials"); + } +} diff --git a/test-utils/src/main/java/org/javaee7/ServerOperations.java b/test-utils/src/main/java/org/javaee7/ServerOperations.java index e2325a903..e29d09782 100644 --- a/test-utils/src/main/java/org/javaee7/ServerOperations.java +++ b/test-utils/src/main/java/org/javaee7/ServerOperations.java @@ -1,3 +1,4 @@ +/** Portions Copyright Payara Services Limited **/ package org.javaee7; import java.io.FileInputStream; @@ -230,7 +231,47 @@ public static void restartContainerDebug() { System.out.println("After sleep"); } - } + public static void setupContainerJDBCIDigestIdentityStore() { + + String javaEEServer = System.getProperty("javaEEServer"); + + if ("glassfish-remote".equals(javaEEServer) || "payara-remote".equals(javaEEServer)) { + + System.out.println("Setting up container JDBC identity store for " + javaEEServer); + + List cmd = new ArrayList<>(); + + cmd.add("create-auth-realm"); + cmd.add("--classname"); + cmd.add("com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm"); + cmd.add("--property"); + cmd.add( + "jaas-context=jdbcDigestRealm:" + + "encoding=HASHED:" + + "password-column=password:" + + "datasource-jndi=java\\:comp/DefaultDataSource:" + + "group-table=grouptable:"+ + "charset=UTF-8:" + + "user-table=usertable:" + + "group-name-column=groupname:" + + "digest-algorithm=None:" + + "user-name-column=username"); + + cmd.add("eesamplesdigestrealm"); + + CliCommands.payaraGlassFish(cmd); + } else { + if (javaEEServer == null) { + System.out.println("javaEEServer not specified"); + } else { + System.out.println(javaEEServer + " not supported"); + } + } + + // TODO: support other servers than Payara and GlassFish + + // WildFly ./bin/add-user.sh -a -u u1 -p p1 -g g1 + } } From e6e86c9821699d19ff6440b6ada389c161cbf120 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Wed, 15 Aug 2018 23:01:57 +0100 Subject: [PATCH 041/117] Updated readme.md for new samples --- servlet/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/servlet/README.md b/servlet/README.md index 2827d0cac..56713ff07 100644 --- a/servlet/README.md +++ b/servlet/README.md @@ -1,6 +1,6 @@ # Java EE 7 Samples: Servlet 3.1# -The [JSR 340](https://jcp.org/en/jsr/detail?id=340) specifies the next version of Java Servlets - Java Servlets 3.1. +The [JSR 340](https://jcp.org/en/jsr/detail?id=340) specifies the previous version of Java Servlets - Java Servlets 3.1. ## Samples ## @@ -17,6 +17,8 @@ The [JSR 340](https://jcp.org/en/jsr/detail?id=340) specifies the next version o - web-fragment - security-basicauth - security-form-based + - security-digest + - security-clientcert - security-programmatic - security-deny-uncovered - security-basicauth-omission From a70e3ba2ea2974e62da4104ef38e1f01ad413451 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 16 Aug 2018 00:10:44 +0100 Subject: [PATCH 042/117] Restored default server profile --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index 9dcce4ed6..4ce3e149b 100644 --- a/pom.xml +++ b/pom.xml @@ -359,6 +359,10 @@ payara-ci-managed + + true + + From 24dd78da3297c829a82e4bd382d19d803aaf4cc9 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 16 Aug 2018 15:00:02 +0100 Subject: [PATCH 043/117] Used SQL that's more universal for several DBs in DBSetup --- .../security/digest/DatabaseSetup.java | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/servlet/security-digest/src/main/java/org/javaee7/servlet/security/digest/DatabaseSetup.java b/servlet/security-digest/src/main/java/org/javaee7/servlet/security/digest/DatabaseSetup.java index c78d4f2c1..395bf616f 100644 --- a/servlet/security-digest/src/main/java/org/javaee7/servlet/security/digest/DatabaseSetup.java +++ b/servlet/security-digest/src/main/java/org/javaee7/servlet/security/digest/DatabaseSetup.java @@ -40,27 +40,23 @@ public void contextInitialized(ServletContextEvent sce) { System.out.println("ha1=" + ha1); - execute(dataSource, "DROP TABLE IF EXISTS usertable"); - execute(dataSource, "DROP TABLE IF EXISTS grouptable"); + tryDropTables(); System.out.println("Adding user u1 with group g1 to database"); - execute(dataSource, "CREATE TABLE IF NOT EXISTS usertable(username VARCHAR(32) PRIMARY KEY, password VARCHAR(127))"); - execute(dataSource, "CREATE TABLE IF NOT EXISTS grouptable(username VARCHAR(64), groupname VARCHAR(64))"); + execute(dataSource, "CREATE TABLE usertable(username VARCHAR(32) PRIMARY KEY, password VARCHAR(127))"); + execute(dataSource, "CREATE TABLE grouptable(username VARCHAR(64), groupname VARCHAR(64))"); execute(dataSource, "INSERT INTO usertable VALUES('u1', '" + ha1 + "')"); execute(dataSource, "INSERT INTO grouptable VALUES('u1', 'g1')"); + + System.out.println("Done creating DB tables"); } @Override public void contextDestroyed(ServletContextEvent sce) { - try { - execute(dataSource, "DROP TABLE IF EXISTS usertable"); - execute(dataSource, "DROP TABLE IF EXISTS grouptable"); - } catch (Exception e) { - } - + tryDropTables(); } private void execute(DataSource dataSource, String query) { @@ -74,4 +70,18 @@ private void execute(DataSource dataSource, String query) { } } + private void tryDropTables() { + try { + execute(dataSource, "DROP TABLE IF EXISTS usertable"); + execute(dataSource, "DROP TABLE IF EXISTS grouptable"); + } catch (Exception e) { + try { + execute(dataSource, "DROP TABLE usertable"); + execute(dataSource, "DROP TABLE grouptable"); + } catch (Exception ee) { + } + } + + } + } From c47bf21551a174354a3cd7a0f9ff280e86d70620 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Fri, 17 Aug 2018 16:08:16 +0100 Subject: [PATCH 044/117] Fixed typo and somewhat take Payara domain into account --- pom.xml | 6 +++++- test-utils/src/main/java/org/javaee7/ServerOperations.java | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4ce3e149b..9957fe918 100644 --- a/pom.xml +++ b/pom.xml @@ -26,13 +26,14 @@ ${skipTests} ${skipTests} - ${skipTests + ${skipTests} 4.1.2.181 + payaradomain 5.182 4.1.1 16.0.0.4 @@ -391,6 +392,8 @@ unpack + ${session.executionRootDirectory}/target + ${session.executionRootDirectory}/target/dependency-maven-plugin-markers fish.payara.distributions @@ -416,6 +419,7 @@ ${session.executionRootDirectory}/target/payara41 payara-remote + ${payara_domain} payara diff --git a/test-utils/src/main/java/org/javaee7/ServerOperations.java b/test-utils/src/main/java/org/javaee7/ServerOperations.java index e29d09782..a920fd7cd 100644 --- a/test-utils/src/main/java/org/javaee7/ServerOperations.java +++ b/test-utils/src/main/java/org/javaee7/ServerOperations.java @@ -93,7 +93,9 @@ public static void addCertificateToContainerTrustStore(Certificate clientCertifi } // TODO: support current domain - Path cacertsPath = gfHomePath.resolve("glassfish/domains/domain1/config/cacerts.jks"); + String domain = System.getProperty("payara_domain", "domain1"); + + Path cacertsPath = gfHomePath.resolve("glassfish/domains/" + domain + "/config/cacerts.jks"); if (!cacertsPath.toFile().exists()) { logger.severe("The trust store at " + cacertsPath.toAbsolutePath() + " does not exists"); @@ -175,6 +177,8 @@ public static void restartContainer() { cmd.add("restart-domain"); + cmd.add(System.getProperty("payara_domain", "domain1")); + CliCommands.payaraGlassFish(cmd); try { From 578560a74e7d2ed471cbe7a520e441d3c13bff3c Mon Sep 17 00:00:00 2001 From: arjantijms Date: Sat, 18 Aug 2018 22:25:31 +0200 Subject: [PATCH 045/117] Fixed ordering of trust store creation and added logging for client-cert --- servlet/security-clientcert/pom.xml | 3 + .../clientcert/SecureServletTest.java | 64 +++++++++++++------ .../java/org/javaee7/ServerOperations.java | 3 + 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/servlet/security-clientcert/pom.xml b/servlet/security-clientcert/pom.xml index 30da71b38..f7f899b20 100644 --- a/servlet/security-clientcert/pom.xml +++ b/servlet/security-clientcert/pom.xml @@ -35,6 +35,9 @@ maven-surefire-plugin ${skipServletClientCertificate} + + ${project.build.directory} + diff --git a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java index 199ea4840..e7d742a23 100644 --- a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java +++ b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java @@ -107,16 +107,39 @@ public static WebArchive createDeployment() throws FileNotFoundException, IOExce @Before public void setup() throws FileNotFoundException, IOException { + + // ### Ask the server for its certificate and add that to a new local trust store + + // First get the HTTPS url for which the server is listening + baseHttps = ServerOperations.toContainerHttps(base); + + System.out.println("***************************************"); + + if (baseHttps != null) { + System.out.println("Created " + baseHttps); + X509Certificate[] serverCertificateChain = getCertificateChainFromServer(baseHttps.getHost(), baseHttps.getPort()); + createTrustStore(serverCertificateChain); + } else { + System.out.println("No https URL could be created from " + base); + } + webClient = new WebClient(); // Server -> client : the trust store certificates are used to validate the certificate sent // by the server - webClient.getOptions().setSSLTrustStore(new File("clientTrustStore.jks").toURI().toURL(), "changeit", "jks"); + + String trustStorePath = System.getProperty("buildDirectory", "") + "/clientTrustStore.jks"; + System.out.println("Reading trust store from: " + trustStorePath); + + webClient.getOptions().setSSLTrustStore(new File(trustStorePath).toURI().toURL(), "changeit", "jks"); + + String keyStorePath = System.getProperty("buildDirectory", "") + "/clientKeyStore.jks"; + System.out.println("Reading key store from: " + keyStorePath); // Client -> Server : the key store private keys and certificates are used to sign // and sent a reply to the server - webClient.getOptions().setSSLClientCertificate(new File("clientKeyStore.jks").toURI().toURL(), "changeit", "jks"); + webClient.getOptions().setSSLClientCertificate(new File(keyStorePath).toURI().toURL(), "changeit", "jks"); } @@ -128,23 +151,16 @@ public void tearDown() { @Test public void testGetWithCorrectCredentials() throws Exception { - // ### Ask the server for its certificate and add that to a new local trust store - - // First get the HTTPS url for which the server is listening - baseHttps = ServerOperations.toContainerHttps(base); - - if (baseHttps != null) { - X509Certificate[] serverCertificateChain = getCertificateChainFromServer(baseHttps.getHost(), baseHttps.getPort()); - createTrustStore(serverCertificateChain); - } else { - log.severe("No https URL could be created from " + base); + try { + TextPage page = webClient.getPage(baseHttps + "SecureServlet"); + + log.info(page.getContent()); + + assertTrue("my GET", page.getContent().contains("principal C=UK, ST=lak, L=zak, O=kaz, OU=bar, CN=lfoo")); + } catch (Exception e) { + e.printStackTrace(); + throw e; } - - TextPage page = webClient.getPage(baseHttps + "SecureServlet"); - - log.info(page.getContent()); - - assertTrue("my GET", page.getContent().contains("principal C=UK, ST=lak, L=zak, O=kaz, OU=bar, CN=lfoo")); } @@ -244,8 +260,12 @@ private static void createKeyStore(PrivateKey privateKey, X509Certificate certif "clientKey", new PrivateKeyEntry(privateKey, new Certificate[] { certificate }), new PasswordProtection("changeit".toCharArray())); + + String path = System.getProperty("buildDirectory", "") + "/clientKeyStore.jks"; + + System.out.println("Storing key store at: " + path); - keyStore.store(new FileOutputStream("clientKeyStore.jks"), "changeit".toCharArray()); + keyStore.store(new FileOutputStream(path), "changeit".toCharArray()); } catch (Exception ex) { ex.printStackTrace(); } @@ -259,8 +279,12 @@ private static void createTrustStore(X509Certificate[] certificates) { for (int i = 0; i < certificates.length; i++) { keyStore.setCertificateEntry("serverCert" + i, certificates[i]); } + + String path = System.getProperty("buildDirectory", "") + "/clientTrustStore.jks"; + + System.out.println("Storing trust store at: " + path); - keyStore.store(new FileOutputStream("clientTrustStore.jks"), "changeit".toCharArray()); + keyStore.store(new FileOutputStream(path), "changeit".toCharArray()); } catch (Exception ex) { ex.printStackTrace(); } diff --git a/test-utils/src/main/java/org/javaee7/ServerOperations.java b/test-utils/src/main/java/org/javaee7/ServerOperations.java index a920fd7cd..f44bcd3e6 100644 --- a/test-utils/src/main/java/org/javaee7/ServerOperations.java +++ b/test-utils/src/main/java/org/javaee7/ServerOperations.java @@ -145,11 +145,14 @@ public static URL toContainerHttps(URL url) { url.getFile() ); + System.out.println("Returning " + httpsUrl + " for " + url); logger.info("Returning " + httpsUrl + " for " + url); return httpsUrl; } catch (MalformedURLException e) { + System.out.println("Failure creating HTTPS URL"); + e.printStackTrace(); logger.log(Level.SEVERE, "Failure creating HTTPS URL", e); } From 97e615ea296c1b7b5f70d80ca75c81f76cb7e872 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Sun, 19 Aug 2018 21:42:42 +0200 Subject: [PATCH 046/117] Moved only class in second util module to first util module Removed second util module and references to it. --- batch/batch-listeners/pom.xml | 12 +--- batch/batchlet-simple/pom.xml | 14 +---- batch/chunk-checkpoint/pom.xml | 14 +---- batch/chunk-csv-database/pom.xml | 13 +---- batch/chunk-exception/pom.xml | 9 +-- batch/chunk-mapper/pom.xml | 11 +--- batch/chunk-optional-processor/pom.xml | 13 +---- batch/chunk-partition/pom.xml | 8 +-- batch/chunk-simple-nobeans/pom.xml | 10 +--- batch/chunk-simple/pom.xml | 12 +--- batch/decision/pom.xml | 11 +--- batch/flow/pom.xml | 11 +--- batch/multiple-steps/pom.xml | 11 +--- batch/scheduling/pom.xml | 3 +- batch/split/pom.xml | 11 +--- jms/jms-batch/pom.xml | 11 +--- jms/pom.xml | 7 +-- pom.xml | 56 ++++++++----------- test-utils/pom.xml | 14 +++-- .../org/javaee7/util/BatchTestHelper.java | 0 util/pom.xml | 14 ----- 21 files changed, 70 insertions(+), 195 deletions(-) rename {util => test-utils}/src/main/java/org/javaee7/util/BatchTestHelper.java (100%) delete mode 100644 util/pom.xml diff --git a/batch/batch-listeners/pom.xml b/batch/batch-listeners/pom.xml index c1a82a82e..fd883d2f4 100644 --- a/batch/batch-listeners/pom.xml +++ b/batch/batch-listeners/pom.xml @@ -1,22 +1,16 @@ - - 4.0.0 + 4.0.0 org.javaee7 batch 1.0-SNAPSHOT - ../pom.xml + batch-batch-listeners war + Java EE 7 Sample: batch - batch-listeners Batch Listeners - Applying Listeners to Job, Chunk, Step, Reader, Processor and Writer - - - org.javaee7 - util - - diff --git a/batch/batchlet-simple/pom.xml b/batch/batchlet-simple/pom.xml index d27ea609e..9d594d8a8 100644 --- a/batch/batchlet-simple/pom.xml +++ b/batch/batchlet-simple/pom.xml @@ -1,23 +1,15 @@ - - - 4.0.0 + 4.0.0 org.javaee7 batch 1.0-SNAPSHOT - ../pom.xml + batch-batchlet-simple war Java EE 7 Sample: batch - batchlet-simple Batchlet Simple - Execute a task oriented step - - - - org.javaee7 - util - - + diff --git a/batch/chunk-checkpoint/pom.xml b/batch/chunk-checkpoint/pom.xml index 63ac45876..9960b30cc 100644 --- a/batch/chunk-checkpoint/pom.xml +++ b/batch/chunk-checkpoint/pom.xml @@ -1,23 +1,15 @@ - - - 4.0.0 + 4.0.0 org.javaee7 batch 1.0-SNAPSHOT - ../pom.xml + batch-chunk-checkpoint war Java EE 7 Sample: batch - chunk-checkpoint Chunk Checkpoint - Custom Checkpoint Policy - - - - org.javaee7 - util - - + diff --git a/batch/chunk-csv-database/pom.xml b/batch/chunk-csv-database/pom.xml index f10a70564..0b338bbe7 100644 --- a/batch/chunk-csv-database/pom.xml +++ b/batch/chunk-csv-database/pom.xml @@ -1,26 +1,17 @@ - - - 4.0.0 + 4.0.0 org.javaee7 batch 1.0-SNAPSHOT - ../pom.xml + batch-chunk-csv-database war Java EE 7 Sample: batch - chunk-csv-database Chunk Processing - Read, Process, Write to a Database - - - org.javaee7 - util - - - wildfly-swarm diff --git a/batch/chunk-exception/pom.xml b/batch/chunk-exception/pom.xml index 38408903f..10df6f6cc 100644 --- a/batch/chunk-exception/pom.xml +++ b/batch/chunk-exception/pom.xml @@ -1,6 +1,5 @@ - - 4.0.0 + 4.0.0 org.javaee7 @@ -14,10 +13,4 @@ Java EE 7 Sample: batch - chunk-exception Chunk Exception Handling - Retrying and Skipping - - - org.javaee7 - util - - diff --git a/batch/chunk-mapper/pom.xml b/batch/chunk-mapper/pom.xml index 6e53e2040..ede5e8e80 100644 --- a/batch/chunk-mapper/pom.xml +++ b/batch/chunk-mapper/pom.xml @@ -1,22 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 batch 1.0-SNAPSHOT - ../pom.xml + batch-chunk-mapper war Java EE 7 Sample: batch - chunk-mapper Chunk Processing - Read, Process, Write in multiple Threads - - - org.javaee7 - util - - diff --git a/batch/chunk-optional-processor/pom.xml b/batch/chunk-optional-processor/pom.xml index 5deea8fcc..de82b6215 100644 --- a/batch/chunk-optional-processor/pom.xml +++ b/batch/chunk-optional-processor/pom.xml @@ -1,22 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 batch 1.0-SNAPSHOT - ../pom.xml + batch-chunk-optional-processor war Java EE 7 Sample: batch - chunk-optional-processor Chunk Processing - Read and Write - - - - org.javaee7 - util - - + diff --git a/batch/chunk-partition/pom.xml b/batch/chunk-partition/pom.xml index 4901d51db..f617f11bb 100644 --- a/batch/chunk-partition/pom.xml +++ b/batch/chunk-partition/pom.xml @@ -6,17 +6,11 @@ org.javaee7 batch 1.0-SNAPSHOT - ../pom.xml + batch-chunk-partition war Java EE 7 Sample: batch - chunk-partition Chunk Processing - Read, Process, Write in multiple Threads - - - org.javaee7 - util - - diff --git a/batch/chunk-simple-nobeans/pom.xml b/batch/chunk-simple-nobeans/pom.xml index 14fa1c00e..a06d8424a 100644 --- a/batch/chunk-simple-nobeans/pom.xml +++ b/batch/chunk-simple-nobeans/pom.xml @@ -1,21 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 batch 1.0-SNAPSHOT + batch-chunk-simple-nobeans war Java EE 7 Sample: batch - chunk-simple-nobeans Chunk Processing - Read, Process, Write - - - org.javaee7 - util - - diff --git a/batch/chunk-simple/pom.xml b/batch/chunk-simple/pom.xml index 26d264088..0f4dfa7ff 100644 --- a/batch/chunk-simple/pom.xml +++ b/batch/chunk-simple/pom.xml @@ -1,23 +1,15 @@ - - - 4.0.0 + 4.0.0 org.javaee7 batch 1.0-SNAPSHOT - ../pom.xml + batch-chunk-simple war Java EE 7 Sample: batch - chunk-simple Chunk Processing - Read, Process, Write - - - org.javaee7 - util - - diff --git a/batch/decision/pom.xml b/batch/decision/pom.xml index 13133b66d..fbf62f3a2 100644 --- a/batch/decision/pom.xml +++ b/batch/decision/pom.xml @@ -1,22 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 batch 1.0-SNAPSHOT - ../pom.xml + batch-decision war Java EE 7 Sample: batch - decision Batch DSL - Decision - - - org.javaee7 - util - - diff --git a/batch/flow/pom.xml b/batch/flow/pom.xml index 026703b74..599bd5189 100644 --- a/batch/flow/pom.xml +++ b/batch/flow/pom.xml @@ -1,22 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 batch 1.0-SNAPSHOT - ../pom.xml + batch-flow war Java EE 7 Sample: batch - flow Batch DSL - Flow - - - org.javaee7 - util - - diff --git a/batch/multiple-steps/pom.xml b/batch/multiple-steps/pom.xml index 0503728cb..0269381d4 100644 --- a/batch/multiple-steps/pom.xml +++ b/batch/multiple-steps/pom.xml @@ -1,22 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 batch 1.0-SNAPSHOT - ../pom.xml + batch-multiple-steps war Java EE 7 Sample: batch - multiple-steps Batch JSL - Executing Multiple Steps - - - org.javaee7 - util - - diff --git a/batch/scheduling/pom.xml b/batch/scheduling/pom.xml index b3adb4842..92ee63e96 100644 --- a/batch/scheduling/pom.xml +++ b/batch/scheduling/pom.xml @@ -1,6 +1,5 @@ - - 4.0.0 + 4.0.0 org.javaee7 diff --git a/batch/split/pom.xml b/batch/split/pom.xml index ba2e680c5..0668e7ccc 100644 --- a/batch/split/pom.xml +++ b/batch/split/pom.xml @@ -1,22 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 batch 1.0-SNAPSHOT - ../pom.xml + batch-split war Java EE 7 Sample: batch - split Batch JSL - Splitting Steps - - - org.javaee7 - util - - diff --git a/jms/jms-batch/pom.xml b/jms/jms-batch/pom.xml index 424ce35ef..4495af21c 100644 --- a/jms/jms-batch/pom.xml +++ b/jms/jms-batch/pom.xml @@ -1,20 +1,13 @@ - - 4.0.0 + 4.0.0 org.javaee7 jms 1.0-SNAPSHOT + jms-jms-batch Java EE 7 Sample: jms - jms-batch ItemReader reading from durable subscription - - - - org.javaee7 - util - - diff --git a/jms/pom.xml b/jms/pom.xml index 8a11eabab..2d4408fbc 100644 --- a/jms/pom.xml +++ b/jms/pom.xml @@ -1,17 +1,16 @@ - - 4.0.0 + 4.0.0 org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml - org.javaee7 + jms 1.0-SNAPSHOT pom + Java EE 7 Sample: jms diff --git a/pom.xml b/pom.xml index 9957fe918..9aa3ac4af 100644 --- a/pom.xml +++ b/pom.xml @@ -98,28 +98,27 @@ are helper modules. --> - test-utils - batch - cdi - concurrency - ejb - el - interceptor - javamail - jaspic - jacc - jaxrs - jaxws - jca - jms - jpa - jta - jsf - json - servlet - validation - websocket - util + test-utils + batch + cdi + concurrency + ejb + el + interceptor + javamail + jaspic + jacc + jaxrs + jaxws + jca + jms + jpa + jta + jsf + json + servlet + validation + websocket @@ -137,13 +136,6 @@ arquillian-container-test-api ${arquillian.version} - - org.javaee7 - util - 1.0-SNAPSHOT - jar - test - com.h2database h2 @@ -151,9 +143,9 @@ fish.payara.arquillian - payara-client-ee7 - 1.0.Beta3-m1 - test + payara-client-ee7 + 1.0.Beta3-m1 + test diff --git a/test-utils/pom.xml b/test-utils/pom.xml index 686e0b2b2..ca0100e77 100644 --- a/test-utils/pom.xml +++ b/test-utils/pom.xml @@ -2,15 +2,15 @@ 4.0.0 - + - 1.1.14.Final + 1.1.14.Final UTF-8 UTF-8 1.7 1.7 - + org.javaee7 test-utils 1.0-SNAPSHOT @@ -29,6 +29,12 @@ + + javax + javaee-api + 7.0 + provided + junit junit @@ -43,5 +49,5 @@ shrinkwrap-resolver-api-maven - + diff --git a/util/src/main/java/org/javaee7/util/BatchTestHelper.java b/test-utils/src/main/java/org/javaee7/util/BatchTestHelper.java similarity index 100% rename from util/src/main/java/org/javaee7/util/BatchTestHelper.java rename to test-utils/src/main/java/org/javaee7/util/BatchTestHelper.java diff --git a/util/pom.xml b/util/pom.xml deleted file mode 100644 index 778ad79d1..000000000 --- a/util/pom.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - 4.0.0 - - - org.javaee7 - samples-parent - 1.0-SNAPSHOT - ../pom.xml - - util - 1.0-SNAPSHOT - Java EE 7 Sample: javaee7-samples - util - From 383a070a5ad06c5bd6e55b3302c60f0961124e10 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Sun, 26 Aug 2018 20:35:10 +0200 Subject: [PATCH 047/117] Added remote EJB sample with Payara/GlassFish concrete impl --- ejb/README.md | 1 + ejb/pom.xml | 6 +- ejb/remote/pom.xml | 20 +++++ ejb/remote/roles-allowed/pom.xml | 52 +++++++++++++ .../org/javaee7/ejb/remote/remote/Bean.java | 20 +++++ .../javaee7/ejb/remote/remote/BeanRemote.java | 9 +++ .../javaee7/ejb/remote/RemoteBeanTest.java | 78 +++++++++++++++++++ .../src/test/resources/addUsersPayara.txt | 1 + .../src/test/resources/password.txt | 1 + ejb/remote/vendor/README.md | 12 +++ ejb/remote/vendor/payara-glassfish/README.md | 9 +++ ejb/remote/vendor/payara-glassfish/pom.xml | 32 ++++++++ .../org/javaee7/PayaraEJBContextProvider.java | 46 +++++++++++ .../org.javaee7.RemoteEJBContextProvider | 1 + ejb/remote/vendor/pom.xml | 41 ++++++++++ .../org/javaee7/RemoteEJBContextFactory.java | 23 ++++++ .../org/javaee7/RemoteEJBContextProvider.java | 9 +++ 17 files changed, 358 insertions(+), 3 deletions(-) create mode 100644 ejb/remote/pom.xml create mode 100644 ejb/remote/roles-allowed/pom.xml create mode 100644 ejb/remote/roles-allowed/src/main/java/org/javaee7/ejb/remote/remote/Bean.java create mode 100644 ejb/remote/roles-allowed/src/main/java/org/javaee7/ejb/remote/remote/BeanRemote.java create mode 100644 ejb/remote/roles-allowed/src/test/java/org/javaee7/ejb/remote/RemoteBeanTest.java create mode 100644 ejb/remote/roles-allowed/src/test/resources/addUsersPayara.txt create mode 100644 ejb/remote/roles-allowed/src/test/resources/password.txt create mode 100644 ejb/remote/vendor/README.md create mode 100644 ejb/remote/vendor/payara-glassfish/README.md create mode 100644 ejb/remote/vendor/payara-glassfish/pom.xml create mode 100644 ejb/remote/vendor/payara-glassfish/src/main/java/org/javaee7/PayaraEJBContextProvider.java create mode 100644 ejb/remote/vendor/payara-glassfish/src/main/resources/META-INF/services/org.javaee7.RemoteEJBContextProvider create mode 100644 ejb/remote/vendor/pom.xml create mode 100644 test-utils/src/main/java/org/javaee7/RemoteEJBContextFactory.java create mode 100644 test-utils/src/main/java/org/javaee7/RemoteEJBContextProvider.java diff --git a/ejb/README.md b/ejb/README.md index 013ec8a23..d6d0c0b3d 100644 --- a/ejb/README.md +++ b/ejb/README.md @@ -6,6 +6,7 @@ The [JSR 345](https://jcp.org/en/jsr/detail?id=345) is an architecture for the d - embeddable - lifecycle + - remote - singleton - stateful - stateless diff --git a/ejb/pom.xml b/ejb/pom.xml index 48a1624e5..122149f76 100644 --- a/ejb/pom.xml +++ b/ejb/pom.xml @@ -6,17 +6,17 @@ org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml - org.javaee7 + ejb - 1.0-SNAPSHOT pom + Java EE 7 Sample: ejb embeddable lifecycle + remote singleton stateful stateless diff --git a/ejb/remote/pom.xml b/ejb/remote/pom.xml new file mode 100644 index 000000000..c17c33b37 --- /dev/null +++ b/ejb/remote/pom.xml @@ -0,0 +1,20 @@ + + 4.0.0 + + + org.javaee7 + ejb + 1.0-SNAPSHOT + + + ejb-remote + pom + + Java EE 7 Sample: ejb - remote + + + vendor + roles-allowed + + + diff --git a/ejb/remote/roles-allowed/pom.xml b/ejb/remote/roles-allowed/pom.xml new file mode 100644 index 000000000..f927ad6ea --- /dev/null +++ b/ejb/remote/roles-allowed/pom.xml @@ -0,0 +1,52 @@ + + + + + 4.0.0 + + + org.javaee7 + ejb-remote + 1.0-SNAPSHOT + + + ejb-remote-roles-allowed + war + + Java EE 7 Sample: ejb - remote - Roles Allowed + + + + payara-ci-managed + + + org.javaee7.ejb.remote + ejb.remote.payara-glassfish + 1.0-SNAPSHOT + + + + + + payara-remote + + + org.javaee7.ejb.remote + ejb.remote.payara-glassfish + 1.0-SNAPSHOT + + + + + + + + org.javaee7.ejb.remote + ejb.remote.payara-glassfish + 1.0-SNAPSHOT + + + + + + diff --git a/ejb/remote/roles-allowed/src/main/java/org/javaee7/ejb/remote/remote/Bean.java b/ejb/remote/roles-allowed/src/main/java/org/javaee7/ejb/remote/remote/Bean.java new file mode 100644 index 000000000..97d9003f5 --- /dev/null +++ b/ejb/remote/roles-allowed/src/main/java/org/javaee7/ejb/remote/remote/Bean.java @@ -0,0 +1,20 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.ejb.remote.remote; + +import java.io.Serializable; + +import javax.annotation.security.RolesAllowed; +import javax.ejb.Stateless; + +@Stateless +public class Bean implements BeanRemote, Serializable { + + private static final long serialVersionUID = 1L; + + @Override + @RolesAllowed("g1") + public String method() { + return "method"; + } + +} diff --git a/ejb/remote/roles-allowed/src/main/java/org/javaee7/ejb/remote/remote/BeanRemote.java b/ejb/remote/roles-allowed/src/main/java/org/javaee7/ejb/remote/remote/BeanRemote.java new file mode 100644 index 000000000..94432c4a3 --- /dev/null +++ b/ejb/remote/roles-allowed/src/main/java/org/javaee7/ejb/remote/remote/BeanRemote.java @@ -0,0 +1,9 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.ejb.remote.remote; + +import javax.ejb.Remote; + +@Remote +public interface BeanRemote { + String method(); +} diff --git a/ejb/remote/roles-allowed/src/test/java/org/javaee7/ejb/remote/RemoteBeanTest.java b/ejb/remote/roles-allowed/src/test/java/org/javaee7/ejb/remote/RemoteBeanTest.java new file mode 100644 index 000000000..477ce5435 --- /dev/null +++ b/ejb/remote/roles-allowed/src/test/java/org/javaee7/ejb/remote/RemoteBeanTest.java @@ -0,0 +1,78 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.ejb.remote; + +import static org.javaee7.ServerOperations.addUsersToContainerIdentityStore; +import static org.jboss.shrinkwrap.api.asset.EmptyAsset.INSTANCE; +import static org.junit.Assert.assertEquals; +import static org.junit.Assume.assumeTrue; + +import javax.naming.Context; +import javax.naming.NamingException; + +import org.javaee7.RemoteEJBContextFactory; +import org.javaee7.RemoteEJBContextProvider; +import org.javaee7.ejb.remote.remote.Bean; +import org.javaee7.ejb.remote.remote.BeanRemote; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * This class demonstrates and tests how to request an EJB bean from a remote server. + * + *

+ * {@link RemoteEJBContextProvider} is used, which is a test artifact abstracting the different + * ways this is done for different servers. + * + * @author Arjan Tijms + * + */ +@RunWith(Arquillian.class) +public class RemoteBeanTest { + + private RemoteEJBContextProvider remoteEJBContextProvider; + + @Deployment + public static Archive deployment() { + + // Add user u1 with password p1 and group g1 to the container's native identity store + addUsersToContainerIdentityStore(); + + return ShrinkWrap.create(JavaArchive.class) + .addClasses(Bean.class, BeanRemote.class) + .addAsManifestResource(INSTANCE, "beans.xml"); + } + + @Before + public void before() { + remoteEJBContextProvider = RemoteEJBContextFactory.getProvider(); + assumeTrue( + "No RemoteEJBContextProvider available in current profile", + remoteEJBContextProvider != null); + } + + @After + public void after() { + remoteEJBContextProvider.releaseContext(); + } + + @Test + @RunAsClient + public void callProtectedRemoteBean() throws NamingException { + + // Obtain the JNDI naming context in a vendor specific way. + Context ejbRemoteContext = remoteEJBContextProvider.getContextWithCredentialsSet("u1", "p1"); + + BeanRemote beanRemote = (BeanRemote) ejbRemoteContext.lookup("java:global/test/Bean"); + + assertEquals("method", beanRemote.method()); + } + +} \ No newline at end of file diff --git a/ejb/remote/roles-allowed/src/test/resources/addUsersPayara.txt b/ejb/remote/roles-allowed/src/test/resources/addUsersPayara.txt new file mode 100644 index 000000000..037cdbd6f --- /dev/null +++ b/ejb/remote/roles-allowed/src/test/resources/addUsersPayara.txt @@ -0,0 +1 @@ +create-file-user --groups g1 --passwordfile ${project.build.directory}/test-classes/password.txt u1 \ No newline at end of file diff --git a/ejb/remote/roles-allowed/src/test/resources/password.txt b/ejb/remote/roles-allowed/src/test/resources/password.txt new file mode 100644 index 000000000..c00bb4cac --- /dev/null +++ b/ejb/remote/roles-allowed/src/test/resources/password.txt @@ -0,0 +1 @@ +AS_ADMIN_USERPASSWORD=p1 diff --git a/ejb/remote/vendor/README.md b/ejb/remote/vendor/README.md new file mode 100644 index 000000000..fb90f61af --- /dev/null +++ b/ejb/remote/vendor/README.md @@ -0,0 +1,12 @@ +# Java EE 7 Samples: EJB - Remote - Vendor # + +This module contains vendor specific implementations to obtain the JNDI context from where remote EJB beans can be requested +from with a username/password credential. + +## Implementations ## + + - payara-glassfish - An implementation that works for both Payara and GlassFish + + + + diff --git a/ejb/remote/vendor/payara-glassfish/README.md b/ejb/remote/vendor/payara-glassfish/README.md new file mode 100644 index 000000000..b1a3a57bb --- /dev/null +++ b/ejb/remote/vendor/payara-glassfish/README.md @@ -0,0 +1,9 @@ +# Java EE 7 Samples: EJB - Remote - Vendor - Payara and GlassFish # + +This modules contains a class that returns a JNDI context suitable for remote lookups against the default URL +for a remote Payara or GlassFish server (localhost). It sets the provided credentials +in a Payara/GlassFish specific way and puts the required client jar on the classpath. + + + + diff --git a/ejb/remote/vendor/payara-glassfish/pom.xml b/ejb/remote/vendor/payara-glassfish/pom.xml new file mode 100644 index 000000000..c4623942b --- /dev/null +++ b/ejb/remote/vendor/payara-glassfish/pom.xml @@ -0,0 +1,32 @@ + + + + + 4.0.0 + + + UTF-8 + UTF-8 + 1.7 + 1.7 + + + org.javaee7.ejb.remote + ejb.remote.payara-glassfish + 1.0-SNAPSHOT + + Java EE 7 Sample: EJB - remote - vendor - Payara and GlassFish Remote EJB Provider + + + + org.javaee7 + test-utils + 1.0-SNAPSHOT + + + org.glassfish.main.appclient + gf-client + 5.0 + + + diff --git a/ejb/remote/vendor/payara-glassfish/src/main/java/org/javaee7/PayaraEJBContextProvider.java b/ejb/remote/vendor/payara-glassfish/src/main/java/org/javaee7/PayaraEJBContextProvider.java new file mode 100644 index 000000000..0703f5f25 --- /dev/null +++ b/ejb/remote/vendor/payara-glassfish/src/main/java/org/javaee7/PayaraEJBContextProvider.java @@ -0,0 +1,46 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7; + +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; +import javax.security.auth.Subject; + +import com.sun.enterprise.security.auth.login.common.PasswordCredential; +import com.sun.enterprise.security.common.ClientSecurityContext; + +/** + * This class returns a JNDI context suitable for remote lookups against the default URL + * for a remote Payara or GlassFish server (localhost). It sets the provided credentials + * in a Payara/GlassFish specific way. + * + * @author Arjan Tijms + * + */ +public class PayaraEJBContextProvider implements RemoteEJBContextProvider { + + @Override + public Context getContextWithCredentialsSet(String username, String password) { + + // Create a new subject with a password credential + Subject subject = new Subject(); + subject.getPrivateCredentials().add(new PasswordCredential(username, password.toCharArray(), "default")); + + // Store this subject into a global variable where the CORBA/IIOP code will pick it up. + ClientSecurityContext.setCurrent(new ClientSecurityContext(username, subject)); + + // Note: no need for setting "java.naming.factory.initial", since this is already defined + // by jndi.properties in the glassfish-naming.jar on the classpath. + try { + return new InitialContext(); + } catch (NamingException e) { + throw new IllegalStateException(e); + } + } + + @Override + public void releaseContext() { + ClientSecurityContext.setCurrent(null); + } + +} diff --git a/ejb/remote/vendor/payara-glassfish/src/main/resources/META-INF/services/org.javaee7.RemoteEJBContextProvider b/ejb/remote/vendor/payara-glassfish/src/main/resources/META-INF/services/org.javaee7.RemoteEJBContextProvider new file mode 100644 index 000000000..29c9e6aed --- /dev/null +++ b/ejb/remote/vendor/payara-glassfish/src/main/resources/META-INF/services/org.javaee7.RemoteEJBContextProvider @@ -0,0 +1 @@ +org.javaee7.PayaraEJBContextProvider \ No newline at end of file diff --git a/ejb/remote/vendor/pom.xml b/ejb/remote/vendor/pom.xml new file mode 100644 index 000000000..cc2b3cefd --- /dev/null +++ b/ejb/remote/vendor/pom.xml @@ -0,0 +1,41 @@ + + + + + 4.0.0 + + + org.javaee7 + ejb + 1.0-SNAPSHOT + + + remote + pom + + Java EE 7 Sample: ejb - remote - vendor + + + + payara-ci-managed + + payara-glassfish + + + + + payara-remote + + payara-glassfish + + + + + glassfish-remote + + payara-glassfish + + + + + diff --git a/test-utils/src/main/java/org/javaee7/RemoteEJBContextFactory.java b/test-utils/src/main/java/org/javaee7/RemoteEJBContextFactory.java new file mode 100644 index 000000000..8e4c360d6 --- /dev/null +++ b/test-utils/src/main/java/org/javaee7/RemoteEJBContextFactory.java @@ -0,0 +1,23 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7; + +import java.util.Iterator; +import java.util.ServiceLoader; + +public class RemoteEJBContextFactory { + + public static RemoteEJBContextProvider getProvider() { + + ServiceLoader loader = ServiceLoader.load(RemoteEJBContextProvider.class); + + Iterator providers = loader.iterator(); + + if (!providers.hasNext()) { + return null; + } + + return providers.next(); + + } + +} diff --git a/test-utils/src/main/java/org/javaee7/RemoteEJBContextProvider.java b/test-utils/src/main/java/org/javaee7/RemoteEJBContextProvider.java new file mode 100644 index 000000000..a70cd4538 --- /dev/null +++ b/test-utils/src/main/java/org/javaee7/RemoteEJBContextProvider.java @@ -0,0 +1,9 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7; + +import javax.naming.Context; + +public interface RemoteEJBContextProvider { + Context getContextWithCredentialsSet(String username, String password); + void releaseContext(); +} From 39b70518b57928c1f4333e4e7b0cdafc7aa241de Mon Sep 17 00:00:00 2001 From: arjantijms Date: Mon, 27 Aug 2018 00:20:05 +0200 Subject: [PATCH 048/117] Adjusted ejb/remote maven sub-module coordinates --- ejb/remote/roles-allowed/pom.xml | 17 ++++++++--------- ejb/remote/vendor/payara-glassfish/pom.xml | 6 +++--- ejb/remote/vendor/pom.xml | 4 ++-- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/ejb/remote/roles-allowed/pom.xml b/ejb/remote/roles-allowed/pom.xml index f927ad6ea..9d4c87aef 100644 --- a/ejb/remote/roles-allowed/pom.xml +++ b/ejb/remote/roles-allowed/pom.xml @@ -1,7 +1,4 @@ - - - 4.0.0 @@ -20,8 +17,8 @@ payara-ci-managed - org.javaee7.ejb.remote - ejb.remote.payara-glassfish + org.javaee7.ejb.remote.vendor + ejb.remote.vendor.payara-glassfish 1.0-SNAPSHOT @@ -31,22 +28,24 @@ payara-remote - org.javaee7.ejb.remote - ejb.remote.payara-glassfish + org.javaee7.ejb.remote.vendor + ejb.remote.vendor.payara-glassfish 1.0-SNAPSHOT + glassfish-remote - org.javaee7.ejb.remote - ejb.remote.payara-glassfish + org.javaee7.ejb.remote.vendor + ejb.remote.vendor.payara-glassfish 1.0-SNAPSHOT + diff --git a/ejb/remote/vendor/payara-glassfish/pom.xml b/ejb/remote/vendor/payara-glassfish/pom.xml index c4623942b..825d068fc 100644 --- a/ejb/remote/vendor/payara-glassfish/pom.xml +++ b/ejb/remote/vendor/payara-glassfish/pom.xml @@ -11,11 +11,11 @@ 1.7 - org.javaee7.ejb.remote - ejb.remote.payara-glassfish + org.javaee7.ejb.remote.vendor + ejb.remote.vendor.payara-glassfish 1.0-SNAPSHOT - Java EE 7 Sample: EJB - remote - vendor - Payara and GlassFish Remote EJB Provider + Java EE 7 Sample: ejb - remote - vendor - Payara and GlassFish Remote EJB Provider diff --git a/ejb/remote/vendor/pom.xml b/ejb/remote/vendor/pom.xml index cc2b3cefd..6d71db463 100644 --- a/ejb/remote/vendor/pom.xml +++ b/ejb/remote/vendor/pom.xml @@ -6,11 +6,11 @@ org.javaee7 - ejb + ejb-remote 1.0-SNAPSHOT - remote + ejb-remote-vendor pom Java EE 7 Sample: ejb - remote - vendor From 5d2fbe1b99b11dff8a46d61696bbd4cbbce58365 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Fri, 31 Aug 2018 10:52:07 +0200 Subject: [PATCH 049/117] Revert to JDK 7, as EE 7 samples should have that as minimum --- pom.xml | 2 +- .../clientcert/SecureServletTest.java | 45 ++++++++++--------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 9aa3ac4af..92183d391 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ 1.1.14.Final - 1.8 + 1.7 3.0.0 UTF-8 diff --git a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java index e7d742a23..31ee45f08 100644 --- a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java +++ b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java @@ -107,12 +107,12 @@ public static WebArchive createDeployment() throws FileNotFoundException, IOExce @Before public void setup() throws FileNotFoundException, IOException { - + // ### Ask the server for its certificate and add that to a new local trust store - + // First get the HTTPS url for which the server is listening baseHttps = ServerOperations.toContainerHttps(base); - + System.out.println("***************************************"); if (baseHttps != null) { @@ -122,18 +122,18 @@ public void setup() throws FileNotFoundException, IOException { } else { System.out.println("No https URL could be created from " + base); } - + webClient = new WebClient(); // Server -> client : the trust store certificates are used to validate the certificate sent // by the server - + String trustStorePath = System.getProperty("buildDirectory", "") + "/clientTrustStore.jks"; System.out.println("Reading trust store from: " + trustStorePath); - + webClient.getOptions().setSSLTrustStore(new File(trustStorePath).toURI().toURL(), "changeit", "jks"); - + String keyStorePath = System.getProperty("buildDirectory", "") + "/clientKeyStore.jks"; System.out.println("Reading key store from: " + keyStorePath); @@ -153,9 +153,9 @@ public void tearDown() { public void testGetWithCorrectCredentials() throws Exception { try { TextPage page = webClient.getPage(baseHttps + "SecureServlet"); - + log.info(page.getContent()); - + assertTrue("my GET", page.getContent().contains("principal C=UK, ST=lak, L=zak, O=kaz, OU=bar, CN=lfoo")); } catch (Exception e) { e.printStackTrace(); @@ -163,27 +163,30 @@ public void testGetWithCorrectCredentials() throws Exception { } } - + // Private methods - + // TODO: may move these to utility class - + private static X509Certificate[] getCertificateChainFromServer(String host, int port) { - List X509Certificates = new ArrayList<>(); + final List X509Certificates = new ArrayList<>(); try { SSLContext context = SSLContext.getInstance("TLS"); TrustManager interceptingTrustManager = new X509TrustManager() { + @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[] {}; } + @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } + @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { System.out.println("**** intercepting checkServerTrusted chain" + chain + " authType " + authType); X509Certificates.add(chain); @@ -225,10 +228,10 @@ public static X509Certificate createSelfSignedCertificate(KeyPair keys) { .setProvider(provider) .getCertificate( new X509v3CertificateBuilder( - new X500Name("CN=lfoo, OU=bar, O=kaz, L=zak, ST=lak, C=UK"), + new X500Name("CN=lfoo, OU=bar, O=kaz, L=zak, ST=lak, C=UK"), ONE, - Date.from(now()), - Date.from(now().plus(1, DAYS)), + Date.from(now()), + Date.from(now().plus(1, DAYS)), new X500Name("CN=lfoo, OU=bar, O=kaz, L=zak, ST=lak, C=UK"), SubjectPublicKeyInfo.getInstance(keys.getPublic().getEncoded())) .build( @@ -257,12 +260,12 @@ private static void createKeyStore(PrivateKey privateKey, X509Certificate certif keyStore.load(null, null); keyStore.setEntry( - "clientKey", + "clientKey", new PrivateKeyEntry(privateKey, new Certificate[] { certificate }), new PasswordProtection("changeit".toCharArray())); - + String path = System.getProperty("buildDirectory", "") + "/clientKeyStore.jks"; - + System.out.println("Storing key store at: " + path); keyStore.store(new FileOutputStream(path), "changeit".toCharArray()); @@ -279,9 +282,9 @@ private static void createTrustStore(X509Certificate[] certificates) { for (int i = 0; i < certificates.length; i++) { keyStore.setCertificateEntry("serverCert" + i, certificates[i]); } - + String path = System.getProperty("buildDirectory", "") + "/clientTrustStore.jks"; - + System.out.println("Storing trust store at: " + path); keyStore.store(new FileOutputStream(path), "changeit".toCharArray()); From daf9f8761b5d6d4a490e736e2bbe9c7bfb369033 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 18 Oct 2018 16:00:48 +0200 Subject: [PATCH 050/117] Principal name to comply with Payara 5.184 string version of X500 name --- .../src/main/webapp/WEB-INF/glassfish-web.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/servlet/security-clientcert/src/main/webapp/WEB-INF/glassfish-web.xml b/servlet/security-clientcert/src/main/webapp/WEB-INF/glassfish-web.xml index 19158e6cc..8e2aab6c6 100644 --- a/servlet/security-clientcert/src/main/webapp/WEB-INF/glassfish-web.xml +++ b/servlet/security-clientcert/src/main/webapp/WEB-INF/glassfish-web.xml @@ -8,7 +8,11 @@ g1 g1 + C=UK, ST=lak, L=zak, O=kaz, OU=bar, CN=lfoo + + + C=UK,ST=lak,L=zak,O=kaz,OU=bar,CN=lfoo From 98389106ed88230f8c08b5a5e3735c7dde29f096 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 23 Oct 2018 13:51:50 +0200 Subject: [PATCH 051/117] GlassFish client (for remote EJB) now a setting Signed-off-by: arjantijms --- ejb/remote/vendor/payara-glassfish/pom.xml | 13 ++++++------- pom.xml | 1 + 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ejb/remote/vendor/payara-glassfish/pom.xml b/ejb/remote/vendor/payara-glassfish/pom.xml index 825d068fc..e6e0449d8 100644 --- a/ejb/remote/vendor/payara-glassfish/pom.xml +++ b/ejb/remote/vendor/payara-glassfish/pom.xml @@ -4,12 +4,11 @@ 4.0.0 - - UTF-8 - UTF-8 - 1.7 - 1.7 - + + org.javaee7 + ejb-remote + 1.0-SNAPSHOT + org.javaee7.ejb.remote.vendor ejb.remote.vendor.payara-glassfish @@ -26,7 +25,7 @@ org.glassfish.main.appclient gf-client - 5.0 + ${glassfish.client.version} diff --git a/pom.xml b/pom.xml index 92183d391..5f972aca4 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,7 @@ 4.1.2.181 payaradomain 5.182 + 5.0 4.1.1 16.0.0.4 13.0.0.Final From 390fd75e934b4e54da1bd12e78ae0acb97d27a6d Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 23 Oct 2018 13:54:15 +0200 Subject: [PATCH 052/117] Put TLS handshake logging for client/cert behind a switch Signed-off-by: arjantijms --- .../clientcert/SecureServletTest.java | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java index 31ee45f08..d9d10856c 100644 --- a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java +++ b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java @@ -4,6 +4,7 @@ import static java.math.BigInteger.ONE; import static java.time.Instant.now; import static java.time.temporal.ChronoUnit.DAYS; +import static java.util.logging.Level.FINEST; import static org.javaee7.ServerOperations.addCertificateToContainerTrustStore; import static org.jboss.shrinkwrap.api.ShrinkWrap.create; import static org.junit.Assert.assertTrue; @@ -38,6 +39,9 @@ import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.logging.impl.Jdk14Logger; import org.bouncycastle.asn1.x500.X500Name; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.bouncycastle.cert.X509v3CertificateBuilder; @@ -82,7 +86,13 @@ public static WebArchive createDeployment() throws FileNotFoundException, IOExce Security.addProvider(provider); // Enable to get detailed logging about the SSL handshake - // System.setProperty("javax.net.debug", "ssl:handshake"); + + // For an explanation of the TLS handshake see: https://tls.ulfheim.net + + if (System.getProperty("ssl.debug") != null) { + enableSSLDebug(); + } + System.out.println("################################################################"); @@ -91,12 +101,14 @@ public static WebArchive createDeployment() throws FileNotFoundException, IOExce // Generate a Private/Public key pair for the client KeyPair clientKeyPair = generateRandomKeys(); - // Create a certificate containing the public key and signed with the private key + // Create a certificate containing the client public key and signed with the private key X509Certificate clientCertificate = createSelfSignedCertificate(clientKeyPair); - // Create a new local key store containing the private key and the certificate + // Create a new local key store containing the client private key and the certificate createKeyStore(clientKeyPair.getPrivate(), clientCertificate); + // Add the client certificate that we just generated to the trust store of the server. + // That way the server will trust our certificate. addCertificateToContainerTrustStore(clientCertificate); return create(WebArchive.class) @@ -125,7 +137,7 @@ public void setup() throws FileNotFoundException, IOException { webClient = new WebClient(); - + // Server -> client : the trust store certificates are used to validate the certificate sent // by the server @@ -141,6 +153,7 @@ public void setup() throws FileNotFoundException, IOException { // and sent a reply to the server webClient.getOptions().setSSLClientCertificate(new File(keyStorePath).toURI().toURL(), "changeit", "jks"); + } @After @@ -198,7 +211,7 @@ public void checkServerTrusted(X509Certificate[] chain, String authType) throws SSLSocketFactory factory = context.getSocketFactory(); try (SSLSocket socket = (SSLSocket) factory.createSocket(host, port)) { - socket.setSoTimeout(15000); + socket.setSoTimeout(0); socket.startHandshake(); socket.close(); } @@ -292,5 +305,18 @@ private static void createTrustStore(X509Certificate[] certificates) { ex.printStackTrace(); } } + + private static void enableSSLDebug() { + System.setProperty("javax.net.debug", "ssl:handshake"); + + System.getProperties().put("org.apache.commons.logging.simplelog.defaultlog", "debug"); + Logger.getLogger("com.gargoylesoftware.htmlunit.httpclient.HtmlUnitSSLConnectionSocketFactory").setLevel(FINEST); + Logger.getLogger("org.apache.http.conn.ssl.SSLConnectionSocketFactory").setLevel(FINEST); + Log logger = LogFactory.getLog(org.apache.http.conn.ssl.SSLConnectionSocketFactory.class); + ((Jdk14Logger) logger).getLogger().setLevel(FINEST); + logger = LogFactory.getLog(com.gargoylesoftware.htmlunit.httpclient.HtmlUnitSSLConnectionSocketFactory.class); + ((Jdk14Logger) logger).getLogger().setLevel(FINEST); + Logger.getGlobal().getParent().getHandlers()[0].setLevel(FINEST); + } } From 60ca1e0ddb6d4b37049f09635b2a38417a9ca0aa Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 25 Oct 2018 22:51:36 +0200 Subject: [PATCH 053/117] Added test for permissions.xml based on GF QuickLook test --- jacc/permissions-xml/pom.xml | 161 ++++++++++++++ .../javaee7/jacc/contexts/bean/BeanLeaf.java | 71 ++++++ .../jacc/contexts/bean/BeanMessage.java | 72 +++++++ .../contexts/bean/BeanMessageInterface.java | 53 +++++ .../javaee7/jacc/contexts/bean/BeanRoot.java | 122 +++++++++++ .../jacc/contexts/bean/BeanRootInterface.java | 49 +++++ .../jacc/contexts/servlet/TestServlet.java | 203 ++++++++++++++++++ .../main/resources/META-INF/application.xml | 61 ++++++ .../main/resources/META-INF/permissions.xml | 71 ++++++ .../src/main/webapp/WEB-INF/web.xml | 56 +++++ .../permissionsxml/PermissionsXMLEarTest.java | 120 +++++++++++ .../PermissionsXMLServletTest.java | 93 ++++++++ jacc/pom.xml | 9 +- pom.xml | 1 + 14 files changed, 1137 insertions(+), 5 deletions(-) create mode 100644 jacc/permissions-xml/pom.xml create mode 100644 jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanLeaf.java create mode 100644 jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanMessage.java create mode 100644 jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanMessageInterface.java create mode 100644 jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanRoot.java create mode 100644 jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanRootInterface.java create mode 100644 jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/servlet/TestServlet.java create mode 100644 jacc/permissions-xml/src/main/resources/META-INF/application.xml create mode 100644 jacc/permissions-xml/src/main/resources/META-INF/permissions.xml create mode 100644 jacc/permissions-xml/src/main/webapp/WEB-INF/web.xml create mode 100644 jacc/permissions-xml/src/test/java/org/javaee7/jacc/permissionsxml/PermissionsXMLEarTest.java create mode 100644 jacc/permissions-xml/src/test/java/org/javaee7/jacc/permissionsxml/PermissionsXMLServletTest.java diff --git a/jacc/permissions-xml/pom.xml b/jacc/permissions-xml/pom.xml new file mode 100644 index 000000000..a63d329d9 --- /dev/null +++ b/jacc/permissions-xml/pom.xml @@ -0,0 +1,161 @@ + + 4.0.0 + + + org.javaee7 + jacc + 1.0-SNAPSHOT + + + jacc-permissions-xml + war + Java EE 7 Sample: jacc - permissions.xml + + + + org.glassfish.grizzly + grizzly-framework + 2.4.3.payara-p5 + provided + + + + org.glassfish.grizzly + grizzly-http + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-http-server + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-http-servlet + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-portunif + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-http-ajp + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-websockets + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-http2 + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-comet + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-http-server-multipart + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-http-server-jaxws + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-http-servlet-extras + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + tls-sni + 2.4.3.payara-p5provided + + + org.glassfish.grizzly.osgi + grizzly-httpservice + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-framework-monitoring + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-http-monitoring + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-http-server-monitoring + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-core + provided + 2.4.3.payara-p5 + + + org.glassfish.grizzly + grizzly-http-server-core + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-http-all + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-http-servlet-server + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-websockets-server + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly + grizzly-comet-server + 2.4.3.payara-p5 + provided + + + org.glassfish.grizzly.osgi + grizzly-httpservice-bundle + 2.4.3.payara-p5 + provided + + + + diff --git a/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanLeaf.java b/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanLeaf.java new file mode 100644 index 000000000..8478a0992 --- /dev/null +++ b/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanLeaf.java @@ -0,0 +1,71 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + * or packager/legal/LICENSE.txt. See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at packager/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * Oracle designates this particular file as subject to the "Classpath" + * exception as provided by Oracle in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +// Portions Copyright [2018] [Payara Foundation and/or its affiliates] +package org.javaee7.jacc.contexts.bean; + +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.ejb.Singleton; + +@Singleton +public class BeanLeaf { + + private static final String MESSAGE_POST = "PostBeanLeaf"; + private static final String MESSAGE_HELLO = "HelloBeanLeaf"; + + @EJB + private BeanMessageInterface msg; + + @PostConstruct + public void afterConstruct() { + if (msg != null && !msg.getMessage().contains(MESSAGE_POST)) { + msg.appendMessage(MESSAGE_POST); + } + } + + public String sayHello() { + if (msg != null && !msg.getMessage().contains(MESSAGE_HELLO)) { + msg.appendMessage(MESSAGE_HELLO); + } + + return "Hello from: " + this.getClass().getName() + "; " + System.identityHashCode(this); + } + +} diff --git a/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanMessage.java b/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanMessage.java new file mode 100644 index 000000000..6bbfaf8b5 --- /dev/null +++ b/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanMessage.java @@ -0,0 +1,72 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + * or packager/legal/LICENSE.txt. See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at packager/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * Oracle designates this particular file as subject to the "Classpath" + * exception as provided by Oracle in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +// Portions Copyright [2018] [Payara Foundation and/or its affiliates] +package org.javaee7.jacc.contexts.bean; + +import javax.ejb.Singleton; + +@Singleton +public class BeanMessage implements BeanMessageInterface { + + private String message = ""; + + @Override + public String getMessage() { + return message; + } + + @Override + public void setMessage(String message) { + this.message = message; + System.out.println("BeanMessage: setMessage=" + this.message); + } + + @Override + public void appendMessage(String message) { + this.message += message; + System.out.println("BeanMessage: appendMessage=" + this.message); + } + + @Override + public String sayHello() { + return "Hello from: " + this.getClass().getName() + "; " + System.identityHashCode(this); + } + +} diff --git a/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanMessageInterface.java b/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanMessageInterface.java new file mode 100644 index 000000000..0a99b92dd --- /dev/null +++ b/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanMessageInterface.java @@ -0,0 +1,53 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + * or packager/legal/LICENSE.txt. See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at packager/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * Oracle designates this particular file as subject to the "Classpath" + * exception as provided by Oracle in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +// Portions Copyright [2018] [Payara Foundation and/or its affiliates] +package org.javaee7.jacc.contexts.bean; + +public interface BeanMessageInterface { + + String getMessage(); + + void setMessage(String message); + + void appendMessage(String message); + + String sayHello(); + +} diff --git a/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanRoot.java b/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanRoot.java new file mode 100644 index 000000000..e75ac0fe1 --- /dev/null +++ b/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanRoot.java @@ -0,0 +1,122 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + * or packager/legal/LICENSE.txt. See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at packager/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * Oracle designates this particular file as subject to the "Classpath" + * exception as provided by Oracle in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +// Portions Copyright [2018] [Payara Foundation and/or its affiliates] +package org.javaee7.jacc.contexts.bean; + +import java.io.FilePermission; +import java.security.AccessControlException; +import java.security.AccessController; + +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.ejb.Singleton; +import javax.ejb.Startup; + +@Singleton +@Startup +public class BeanRoot implements BeanRootInterface { + + @EJB + private BeanLeaf bl; + + @EJB + private BeanMessageInterface msg; + + String MESSAGE_POST = "PostBeanRoot"; + String MESSAGE_HELLO = "HelloBeanRoot"; + + @Override + @PostConstruct + public void afterConstruct() { + if (msg != null && !msg.getMessage().contains(MESSAGE_POST)) { + msg.appendMessage(MESSAGE_POST); + } + String h = bl.sayHello(); + System.out.println("** BeanRoot: Hello from beanLeaf: " + h); + } + + @Override + public String sayHello() { + if (msg != null && !msg.getMessage().contains(MESSAGE_HELLO)) { + msg.appendMessage(MESSAGE_HELLO); + } + + StringBuffer check = new StringBuffer(" -EJB test-"); + + FilePermission fp = new FilePermission("/scratch/spei/bug/test/war.txt", "delete"); + try { + if (System.getSecurityManager() != null) { + AccessController.checkPermission(fp); + check.append("BeanRoot - success for WAR.txt; "); + } else + check.append("BeanRoot - bypass for WAR.txt; "); + } catch (AccessControlException e) { + check.append("BeanRoot - failed for WAR.txt; "); + } + + fp = new FilePermission("/scratch/spei/bug/test/ear.txt", "delete"); + try { + if (System.getSecurityManager() != null) { + AccessController.checkPermission(fp); + check.append("BeanRoot - success for EAR.txt; "); + } else + check.append("BeanRoot - bypass for EAR.txt; "); + } catch (AccessControlException e) { + check.append("BeanRoot - failed for EAR.txt; "); + } + + fp = new FilePermission("/scratch/spei/bug/test/ejb.txt", "delete"); + final FilePermission p1 = fp; + try { + if (System.getSecurityManager() != null) { + AccessController.checkPermission(p1); + check.append("BeanRoot - success for EJB.txt; "); + } else + check.append("BeanRoot - bypass for EJB.txt; "); + } catch (AccessControlException e) { + check.append("BeanRoot - failed for EJB.txt; " + e.getMessage()); + } + + return "Hello from: " + this.getClass().getName() + "; " + + check.toString() + " , code= " + + System.identityHashCode(this); + } + +} diff --git a/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanRootInterface.java b/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanRootInterface.java new file mode 100644 index 000000000..f1dec1ae1 --- /dev/null +++ b/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/bean/BeanRootInterface.java @@ -0,0 +1,49 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + * or packager/legal/LICENSE.txt. See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at packager/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * Oracle designates this particular file as subject to the "Classpath" + * exception as provided by Oracle in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +// Portions Copyright [2018] [Payara Foundation and/or its affiliates] +package org.javaee7.jacc.contexts.bean; + +public interface BeanRootInterface { + + void afterConstruct(); + + String sayHello(); + +} diff --git a/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/servlet/TestServlet.java b/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/servlet/TestServlet.java new file mode 100644 index 000000000..379321d8d --- /dev/null +++ b/jacc/permissions-xml/src/main/java/org/javaee7/jacc/contexts/servlet/TestServlet.java @@ -0,0 +1,203 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + * or packager/legal/LICENSE.txt. See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at packager/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * Oracle designates this particular file as subject to the "Classpath" + * exception as provided by Oracle in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +// Portions Copyright [2018] [Payara Foundation and/or its affiliates] +package org.javaee7.jacc.contexts.servlet; + +import java.io.FilePermission; +import java.io.IOException; +import java.io.PrintWriter; +import java.security.AccessControlException; +import java.security.AccessController; + +import javax.ejb.EJB; +import javax.naming.InitialContext; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.javaee7.jacc.contexts.bean.BeanMessageInterface; +import org.javaee7.jacc.contexts.bean.BeanRootInterface; + +public class TestServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @EJB + private BeanRootInterface root; + + @EJB + private BeanMessageInterface msg; + + private String message; + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + message = msg.getMessage(); + System.out.println("servlet init: message=" + message); + } + + protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setContentType("text/plain"); + PrintWriter out = response.getWriter(); + String EXPECTED_RESULT = "PostBeanRootPostBeanLeafHelloBeanLeaf"; + boolean status = false; + + try { + + String testcase = request.getParameter("tc"); + out.println("testcase = " + testcase); + out.println("TestServlet"); + out.println("contextPath=" + request.getContextPath()); + + if (testcase != null) { + + if ("InjectLookup".equals(testcase)) { + // EJB injection check + // out.println("injected root: " + root); + String hello = root.sayHello(); + out.println("Hello from injected bean: " + hello); + + // EJB lookup check + InitialContext initialContext = new InitialContext(); + + + String EJBlookupName = null; + if (request.getParameter("web") == null) { + + // For war inside ears: + + // "java"glabal[/]//" + // app-name -- name of ear file (option) + // module-name -- name of war or jar file + // bean-name -- name of ejb + + EJBlookupName = "java:global/appperms/apppermsEJB/BeanRoot"; + } else { + // For standalone war: + EJBlookupName = "java:module/BeanRoot"; + } + + BeanRootInterface root2 = (BeanRootInterface) initialContext.lookup(EJBlookupName); + + // out.println("global root: " + root2); + String hello2 = root2.sayHello(); + out.println("Hello from lookup bean: " + hello2); + + StringBuffer checkReport = new StringBuffer(" -Servlet test- "); + FilePermission filePermission = new FilePermission("/scratch/spei/bug/test/war.txt", "delete"); + try { + if (System.getSecurityManager() != null) { + AccessController.checkPermission(filePermission); + checkReport.append("servlet - success for WAR.txt; "); + } else + checkReport.append("servlet - bypass for WAR.txt; "); + + } catch (AccessControlException e) { + checkReport.append("servlet - failed for WAR.txt; "); + } + + filePermission = new FilePermission("/scratch/spei/bug/test/ear.txt", "delete"); + try { + if (System.getSecurityManager() != null) { + AccessController.checkPermission(filePermission); + checkReport.append("servlet - success for EAR.txt; "); + } else + checkReport.append("servlet - bypass for EAR.txt; "); + } catch (AccessControlException e) { + checkReport.append("servlet - failed for EAR.txt; "); + } + + filePermission = new FilePermission("/scratch/spei/bug/test/ejb.txt", "delete"); + try { + if (System.getSecurityManager() != null) { + AccessController.checkPermission(filePermission); + checkReport.append("servlet - success for EJB.txt; "); + } else + checkReport.append("servlet - bypass for EJB.txt; "); + } catch (AccessControlException e) { + checkReport.append("servlet - failed for EJB.txt; "); + } + + String checkReportString = checkReport.toString(); + out.println("test: " + checkReportString); + + if (hello.equals(hello2) && !checkReportString.contains("failed") && !hello.contains("failed")) { + status = true; + } + } else if ("Startup".equals(testcase)) { + // Deployment check for startup + out.println("message by deployment: " + message); + if (message != null && message.equals(EXPECTED_RESULT)) { + status = true; + } + } + } + + } catch (Throwable th) { + th.printStackTrace(out); + } finally { + if (status) { + out.println("Test:Pass"); + } else { + out.println("Test:Fail"); + } + out.close(); + } + } + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + processRequest(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + processRequest(request, response); + } + + @Override + public String getServletInfo() { + return "Short description"; + } + +} diff --git a/jacc/permissions-xml/src/main/resources/META-INF/application.xml b/jacc/permissions-xml/src/main/resources/META-INF/application.xml new file mode 100644 index 000000000..8557113cc --- /dev/null +++ b/jacc/permissions-xml/src/main/resources/META-INF/application.xml @@ -0,0 +1,61 @@ + + + + + + app-perms + + + apppermsEJB.jar + + + + + apppermsWeb.war + appperms + + + + diff --git a/jacc/permissions-xml/src/main/resources/META-INF/permissions.xml b/jacc/permissions-xml/src/main/resources/META-INF/permissions.xml new file mode 100644 index 000000000..f32a0f756 --- /dev/null +++ b/jacc/permissions-xml/src/main/resources/META-INF/permissions.xml @@ -0,0 +1,71 @@ + + + + + + + java.io.FilePermission + /scratch/spei/bug/test/ear.txt + read,write,delete + + + + java.io.FilePermission + /scratch/spei/bug/test/war.txt + read,write,delete + + + + java.io.FilePermission + /scratch/spei/bug/test/ejb.txt + read,write,delete + + + + java.lang.RuntimePermission + createClassLoader + + + \ No newline at end of file diff --git a/jacc/permissions-xml/src/main/webapp/WEB-INF/web.xml b/jacc/permissions-xml/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..e49a81f4e --- /dev/null +++ b/jacc/permissions-xml/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,56 @@ + + + + + + TestServlet + org.javaee7.jacc.contexts.servlet.TestServlet + + + TestServlet + /test/* + + diff --git a/jacc/permissions-xml/src/test/java/org/javaee7/jacc/permissionsxml/PermissionsXMLEarTest.java b/jacc/permissions-xml/src/test/java/org/javaee7/jacc/permissionsxml/PermissionsXMLEarTest.java new file mode 100644 index 000000000..831de61bf --- /dev/null +++ b/jacc/permissions-xml/src/test/java/org/javaee7/jacc/permissionsxml/PermissionsXMLEarTest.java @@ -0,0 +1,120 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.jacc.permissionsxml; + +import static javax.ws.rs.client.ClientBuilder.newClient; +import static javax.ws.rs.core.MediaType.TEXT_PLAIN; +import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import static org.junit.Assert.assertTrue; +import static org.junit.runners.MethodSorters.NAME_ASCENDING; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; + +import javax.ws.rs.core.Response; + +import org.javaee7.jacc.contexts.bean.BeanRoot; +import org.javaee7.jacc.contexts.servlet.TestServlet; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * This tests demonstrates the usage of a permissions.xml file inside + * an ear which contains both a web module and an EJB module. + * + * @author Arjan Tijms + * + */ +@RunWith(Arquillian.class) +@FixMethodOrder(NAME_ASCENDING) +public class PermissionsXMLEarTest { + + private static final String WEBAPP_SRC = "src/main/webapp"; + + @ArquillianResource + private URL base; + + @Deployment + public static Archive deploy() { + if (System.getProperty("skipEAR") != null) { + return create(WebArchive.class); + } + + return + // EAR module + create(EnterpriseArchive.class, "appperms.ear") + + // Add permissions.xml, which is the main file we're testing + .addAsResource("META-INF/permissions.xml") + .setApplicationXML("META-INF/application.xml") + + // EJB module + .addAsModule( + create(JavaArchive.class, "apppermsEJB.jar") + + // Java classes containing the actual permission tests + // They are in the EJB module so we test the permissions work there + .addPackage(BeanRoot.class.getPackage()) + ) + + // Web module + .addAsModule( + create(WebArchive.class, "apppermsWeb.war") + .addAsWebInfResource((new File(WEBAPP_SRC + "/WEB-INF", "web.xml"))) + + // This class kicks off the EJB tests, but also contains tests of its own. + // These own tests are there to test if the permissions also work in a web module + .addClass(TestServlet.class) + ); + } + + + @Test + @RunAsClient + public void test1Startup() throws IOException, URISyntaxException { + if (System.getProperty("skipEAR") != null) { + return; + } + + System.out.println("Testing Servlet from war from ear deployed at " + new URL(base, "test").toExternalForm()); + + Response response = + newClient() + .target(new URL(base, "test").toURI()) + .queryParam("tc", "Startup") + .request(TEXT_PLAIN) + .get(); + + assertTrue(response.readEntity(String.class).contains("Test:Pass")); + } + + @Test + @RunAsClient + public void test2PermissionsXML() throws IOException, URISyntaxException { + if (System.getProperty("skipEAR") != null) { + return; + } + + System.out.println("Running actual permissions.xml test"); + + Response response = + newClient() + .target(new URL(base, "test").toURI()) + .queryParam("tc", "InjectLookup") + .request(TEXT_PLAIN) + .get(); + + assertTrue(response.readEntity(String.class).contains("Test:Pass")); + } + +} \ No newline at end of file diff --git a/jacc/permissions-xml/src/test/java/org/javaee7/jacc/permissionsxml/PermissionsXMLServletTest.java b/jacc/permissions-xml/src/test/java/org/javaee7/jacc/permissionsxml/PermissionsXMLServletTest.java new file mode 100644 index 000000000..22bd960d2 --- /dev/null +++ b/jacc/permissions-xml/src/test/java/org/javaee7/jacc/permissionsxml/PermissionsXMLServletTest.java @@ -0,0 +1,93 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.jacc.permissionsxml; + +import static javax.ws.rs.client.ClientBuilder.newClient; +import static javax.ws.rs.core.MediaType.TEXT_PLAIN; +import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import static org.junit.Assert.assertTrue; +import static org.junit.runners.MethodSorters.NAME_ASCENDING; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; + +import javax.ws.rs.core.Response; + +import org.javaee7.jacc.contexts.bean.BeanRoot; +import org.javaee7.jacc.contexts.servlet.TestServlet; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * This tests demonstrates the usage of a permissions.xml file inside + * a standalone war + * + * @author Arjan Tijms + * + */ +@RunWith(Arquillian.class) +@FixMethodOrder(NAME_ASCENDING) +public class PermissionsXMLServletTest { + + private static final String WEBAPP_SRC = "src/main/webapp"; + + @ArquillianResource + private URL base; + + @Deployment + public static Archive deploy() { + + return + create(WebArchive.class) + // Add permissions.xml, which is the main file we're testing + .addAsResource("META-INF/permissions.xml") + .addAsWebInfResource((new File(WEBAPP_SRC + "/WEB-INF", "web.xml"))) + + // This class kicks off the EJB tests (which reside with the web module), + // but also contains tests of its own + .addClass(TestServlet.class) + .addPackage(BeanRoot.class.getPackage()) + ; + } + + + @Test + @RunAsClient + public void test1Startup() throws IOException, URISyntaxException { + System.out.println("Testing Servlet from war deployed at " + new URL(base, "test")); + + Response response = + newClient() + .target(new URL(base, "test").toURI()) + .queryParam("tc", "Startup") + .request(TEXT_PLAIN) + .get(); + + assertTrue(response.readEntity(String.class).contains("Test:Pass")); + } + + @Test + @RunAsClient + public void test2PermissionsXML() throws IOException, URISyntaxException { + System.out.println("Running actual permissions.xml test"); + + Response response = + newClient() + .target(new URL(base, "test").toURI()) + .queryParam("tc", "InjectLookup") + .queryParam("web", "true") + .request(TEXT_PLAIN) + .get(); + + assertTrue(response.readEntity(String.class).contains("Test:Pass")); + } + +} \ No newline at end of file diff --git a/jacc/pom.xml b/jacc/pom.xml index 332609e23..494ad6cf8 100644 --- a/jacc/pom.xml +++ b/jacc/pom.xml @@ -1,21 +1,20 @@ - - 4.0.0 - + 4.0.0 org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml + org.javaee7 jacc - 1.0-SNAPSHOT + pom Java EE 7 Sample: jacc contexts + permissions-xml diff --git a/pom.xml b/pom.xml index 5f972aca4..56d9f344c 100644 --- a/pom.xml +++ b/pom.xml @@ -484,6 +484,7 @@ maven-surefire-plugin + ${skipEAR} ${session.executionRootDirectory}/target/payara-micro-${payara.micro.version}.jar From 240cdf3a63d4a37fab72ea3d06a66dd131dd890c Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 30 Oct 2018 13:57:48 +0100 Subject: [PATCH 054/117] Fixed wrong parent in pom --- ejb/remote/vendor/payara-glassfish/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ejb/remote/vendor/payara-glassfish/pom.xml b/ejb/remote/vendor/payara-glassfish/pom.xml index e6e0449d8..7ddb5b747 100644 --- a/ejb/remote/vendor/payara-glassfish/pom.xml +++ b/ejb/remote/vendor/payara-glassfish/pom.xml @@ -6,7 +6,7 @@ org.javaee7 - ejb-remote + ejb-remote-vendor 1.0-SNAPSHOT From a2cd03701ddddb620b48c00525135235e0d27069 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 30 Oct 2018 14:07:49 +0100 Subject: [PATCH 055/117] Set timeout back to reasonable value --- .../javaee7/servlet/security/clientcert/SecureServletTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java index d9d10856c..9dff764e9 100644 --- a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java +++ b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java @@ -211,7 +211,7 @@ public void checkServerTrusted(X509Certificate[] chain, String authType) throws SSLSocketFactory factory = context.getSocketFactory(); try (SSLSocket socket = (SSLSocket) factory.createSocket(host, port)) { - socket.setSoTimeout(0); + socket.setSoTimeout(15000); socket.startHandshake(); socket.close(); } From b8cbb0c2fca35b8beefa961406d2cc1b413fb40f Mon Sep 17 00:00:00 2001 From: arjantijms Date: Wed, 31 Oct 2018 22:19:09 +0100 Subject: [PATCH 056/117] Added domain support to payara remote connector --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 56d9f344c..31fc2c22b 100644 --- a/pom.xml +++ b/pom.xml @@ -548,16 +548,17 @@ - + maven-surefire-plugin payara-remote + ${payara_domain} - + src/test/resources From c724aa4e674ad4568b9314b68e98a41391c55094 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 1 Nov 2018 12:15:25 +0100 Subject: [PATCH 057/117] Added option for client-cert to use host from obtained cert --- .../clientcert/SecureServletTest.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java index 9dff764e9..795cb42fe 100644 --- a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java +++ b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java @@ -13,6 +13,7 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; +import java.net.MalformedURLException; import java.net.URL; import java.security.KeyManagementException; import java.security.KeyPair; @@ -31,6 +32,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.logging.Level; import java.util.logging.Logger; import javax.net.ssl.SSLContext; @@ -131,6 +133,41 @@ public void setup() throws FileNotFoundException, IOException { System.out.println("Created " + baseHttps); X509Certificate[] serverCertificateChain = getCertificateChainFromServer(baseHttps.getHost(), baseHttps.getPort()); createTrustStore(serverCertificateChain); + + if (System.getProperty("use.cnHost") != null) { + if (serverCertificateChain != null && serverCertificateChain.length > 0) { + X509Certificate firstCert = serverCertificateChain[0]; + String name = firstCert.getIssuerX500Principal().getName(); + System.out.println("Full certificate issuer name " + name); + String[] names = name.split(","); + // cn should be first + if (names != null && names.length > 0) { + String cnNameString = names[0]; + String cn = cnNameString.substring(cnNameString.indexOf('=') + 1).trim(); + System.out.println("Issuer CN name " + cn); + + try { + URL httpsUrl = new URL( + baseHttps.getProtocol(), + cn, + baseHttps.getPort(), + baseHttps.getFile() + ); + + System.out.println("Changing to " + httpsUrl + " from " + baseHttps); + + baseHttps = httpsUrl; + + } catch (MalformedURLException e) { + System.out.println("Failure creating HTTPS URL"); + e.printStackTrace(); + } + + } + + } + } + } else { System.out.println("No https URL could be created from " + base); } From a8d68c3d11f550177517d92d4b7638d29840f76f Mon Sep 17 00:00:00 2001 From: arjantijms Date: Sat, 3 Nov 2018 01:22:18 +0100 Subject: [PATCH 058/117] Cleaned-up logging for client-cert test --- .../clientcert/SecureServletTest.java | 137 ++++++++++-------- .../java/org/javaee7/ServerOperations.java | 8 +- 2 files changed, 84 insertions(+), 61 deletions(-) diff --git a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java index 795cb42fe..607b99c7b 100644 --- a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java +++ b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java @@ -32,7 +32,6 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.logging.Level; import java.util.logging.Logger; import javax.net.ssl.SSLContext; @@ -84,6 +83,8 @@ public class SecureServletTest { @Deployment(testable = false) public static WebArchive createDeployment() throws FileNotFoundException, IOException { + System.out.println("\n*********** DEPLOYMENT START ***************************"); + Provider provider = new BouncyCastleProvider(); Security.addProvider(provider); @@ -114,93 +115,78 @@ public static WebArchive createDeployment() throws FileNotFoundException, IOExce addCertificateToContainerTrustStore(clientCertificate); return create(WebArchive.class) - .addClass(SecureServlet.class) + .addClasses(SecureServlet.class) .addAsWebInfResource((new File(WEBAPP_SRC + "/WEB-INF", "web.xml"))) .addAsWebInfResource((new File(WEBAPP_SRC + "/WEB-INF", "glassfish-web.xml"))); } @Before public void setup() throws FileNotFoundException, IOException { + + System.out.println("\n*********** SETUP START ***************************"); + + webClient = new WebClient(); - // ### Ask the server for its certificate and add that to a new local trust store - - // First get the HTTPS url for which the server is listening + // First get the HTTPS URL for which the server is listening baseHttps = ServerOperations.toContainerHttps(base); + if (baseHttps == null) { + throw new IllegalStateException("No https URL could be created from " + base); + } - System.out.println("***************************************"); - - if (baseHttps != null) { - System.out.println("Created " + baseHttps); - X509Certificate[] serverCertificateChain = getCertificateChainFromServer(baseHttps.getHost(), baseHttps.getPort()); + + + // ### Ask the server for its certificate and add that to a new local trust store + + // Server -> client : the trust store certificates are used to validate the certificate sent + // by the server + X509Certificate[] serverCertificateChain = getCertificateChainFromServer(baseHttps.getHost(), baseHttps.getPort()); + + if (serverCertificateChain != null && serverCertificateChain.length > 0) { + + System.out.println("Obtained certificate from server. Storing it in client trust store"); + createTrustStore(serverCertificateChain); + + String trustStorePath = System.getProperty("buildDirectory", "") + "/clientTrustStore.jks"; + System.out.println("Reading trust store from: " + trustStorePath); + + webClient.getOptions().setSSLTrustStore(new File(trustStorePath).toURI().toURL(), "changeit", "jks"); + // If the use.cnHost property is we try to extract the host from the server + // certificate and use exactly that host for our requests. + // This is needed if a server is listening to multiple host names, for instance + // localhost and example.com. If the certificate is for example.com, we can't + // localhost for the request, as that will not be accepted. if (System.getProperty("use.cnHost") != null) { - if (serverCertificateChain != null && serverCertificateChain.length > 0) { - X509Certificate firstCert = serverCertificateChain[0]; - String name = firstCert.getIssuerX500Principal().getName(); - System.out.println("Full certificate issuer name " + name); - String[] names = name.split(","); - // cn should be first - if (names != null && names.length > 0) { - String cnNameString = names[0]; - String cn = cnNameString.substring(cnNameString.indexOf('=') + 1).trim(); - System.out.println("Issuer CN name " + cn); - - try { - URL httpsUrl = new URL( - baseHttps.getProtocol(), - cn, - baseHttps.getPort(), - baseHttps.getFile() - ); - - System.out.println("Changing to " + httpsUrl + " from " + baseHttps); - - baseHttps = httpsUrl; - - } catch (MalformedURLException e) { - System.out.println("Failure creating HTTPS URL"); - e.printStackTrace(); - } - - } - - } + System.out.println("use.cnHost set. Trying to grab CN from certificate and use as host for requests."); + baseHttps = getHostFromCertificate(serverCertificateChain, baseHttps); } - } else { - System.out.println("No https URL could be created from " + base); + System.out.println("Could not obtain certificates from server. Continuing without custom truststore"); } - - - webClient = new WebClient(); - - // Server -> client : the trust store certificates are used to validate the certificate sent - // by the server - - String trustStorePath = System.getProperty("buildDirectory", "") + "/clientTrustStore.jks"; - System.out.println("Reading trust store from: " + trustStorePath); - - webClient.getOptions().setSSLTrustStore(new File(trustStorePath).toURI().toURL(), "changeit", "jks"); - + String keyStorePath = System.getProperty("buildDirectory", "") + "/clientKeyStore.jks"; System.out.println("Reading key store from: " + keyStorePath); // Client -> Server : the key store private keys and certificates are used to sign // and sent a reply to the server webClient.getOptions().setSSLClientCertificate(new File(keyStorePath).toURI().toURL(), "changeit", "jks"); - + System.out.println("*********** SETUP DONE ***************************\n"); } @After public void tearDown() { webClient.getCookieManager().clearCookies(); webClient.close(); + System.out.println("\n*********** TEST END ***************************\n"); } @Test public void testGetWithCorrectCredentials() throws Exception { + + System.out.println("\n*********** TEST START ***************************\n"); + try { TextPage page = webClient.getPage(baseHttps + "SecureServlet"); @@ -316,7 +302,7 @@ private static void createKeyStore(PrivateKey privateKey, X509Certificate certif String path = System.getProperty("buildDirectory", "") + "/clientKeyStore.jks"; - System.out.println("Storing key store at: " + path); + System.out.println("Storing client key store at: " + path); keyStore.store(new FileOutputStream(path), "changeit".toCharArray()); } catch (Exception ex) { @@ -343,6 +329,43 @@ private static void createTrustStore(X509Certificate[] certificates) { } } + private static URL getHostFromCertificate(X509Certificate[] serverCertificateChain, URL existingURL) { + X509Certificate firstCert = serverCertificateChain[0]; + String name = firstCert.getIssuerX500Principal().getName(); + System.out.println("Full certificate issuer name " + name); + + String[] names = name.split(","); + + // cn should be first + if (names != null && names.length > 0) { + String cnNameString = names[0]; + String cn = cnNameString.substring(cnNameString.indexOf('=') + 1).trim(); + System.out.println("Issuer CN name: \"" + cn + "\""); + + try { + URL httpsUrl = new URL( + existingURL.getProtocol(), + cn, + existingURL.getPort(), + existingURL.getFile() + ); + + System.out.println("Changing base URL from " + existingURL + " into " + httpsUrl + "\n"); + + return httpsUrl; + + } catch (MalformedURLException e) { + System.out.println("Failure creating HTTPS URL"); + e.printStackTrace(); + } + + } + + System.out.println("FAILED to get CN. Using existing URL: " + existingURL); + + return existingURL; + } + private static void enableSSLDebug() { System.setProperty("javax.net.debug", "ssl:handshake"); diff --git a/test-utils/src/main/java/org/javaee7/ServerOperations.java b/test-utils/src/main/java/org/javaee7/ServerOperations.java index f44bcd3e6..bd7e1163c 100644 --- a/test-utils/src/main/java/org/javaee7/ServerOperations.java +++ b/test-utils/src/main/java/org/javaee7/ServerOperations.java @@ -98,11 +98,12 @@ public static void addCertificateToContainerTrustStore(Certificate clientCertifi Path cacertsPath = gfHomePath.resolve("glassfish/domains/" + domain + "/config/cacerts.jks"); if (!cacertsPath.toFile().exists()) { - logger.severe("The trust store at " + cacertsPath.toAbsolutePath() + " does not exists"); + logger.severe("The container trust store at " + cacertsPath.toAbsolutePath() + " does not exists"); + logger.severe("Is the domain \"" + domain + "\" correct?"); return; } - logger.info("*** Adding certificate to: " + cacertsPath.toAbsolutePath()); + logger.info("*** Adding certificate to container trust store: " + cacertsPath.toAbsolutePath()); KeyStore keyStore = null; try (InputStream in = new FileInputStream(cacertsPath.toAbsolutePath().toFile())) { @@ -145,8 +146,7 @@ public static URL toContainerHttps(URL url) { url.getFile() ); - System.out.println("Returning " + httpsUrl + " for " + url); - logger.info("Returning " + httpsUrl + " for " + url); + System.out.println("Changing base URL from " + url + " into " + httpsUrl); return httpsUrl; From d86c786caafb71deb38ed3fa39ca6789c1507d1e Mon Sep 17 00:00:00 2001 From: arjantijms Date: Sat, 3 Nov 2018 12:50:50 +0100 Subject: [PATCH 059/117] Added server side SSL debug for client-cert test --- .../clientcert/SecureServletTest.java | 10 +++++++- .../java/org/javaee7/ServerOperations.java | 23 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java index 607b99c7b..6d5965ed1 100644 --- a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java +++ b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java @@ -6,6 +6,7 @@ import static java.time.temporal.ChronoUnit.DAYS; import static java.util.logging.Level.FINEST; import static org.javaee7.ServerOperations.addCertificateToContainerTrustStore; +import static org.javaee7.ServerOperations.addContainerSystemProperty; import static org.jboss.shrinkwrap.api.ShrinkWrap.create; import static org.junit.Assert.assertTrue; @@ -88,7 +89,7 @@ public static WebArchive createDeployment() throws FileNotFoundException, IOExce Provider provider = new BouncyCastleProvider(); Security.addProvider(provider); - // Enable to get detailed logging about the SSL handshake + // Enable to get detailed logging about the SSL handshake on the client // For an explanation of the TLS handshake see: https://tls.ulfheim.net @@ -109,6 +110,13 @@ public static WebArchive createDeployment() throws FileNotFoundException, IOExce // Create a new local key store containing the client private key and the certificate createKeyStore(clientKeyPair.getPrivate(), clientCertificate); + + // Enable to get detailed logging about the SSL handshake on the server + + if (System.getProperty("ssl.debug") != null) { + System.out.println("Setting server SSL debug on"); + addContainerSystemProperty("javax.net.debug", "ssl:handshake"); + } // Add the client certificate that we just generated to the trust store of the server. // That way the server will trust our certificate. diff --git a/test-utils/src/main/java/org/javaee7/ServerOperations.java b/test-utils/src/main/java/org/javaee7/ServerOperations.java index bd7e1163c..7853430e6 100644 --- a/test-utils/src/main/java/org/javaee7/ServerOperations.java +++ b/test-utils/src/main/java/org/javaee7/ServerOperations.java @@ -167,6 +167,29 @@ public static URL toContainerHttps(URL url) { return null; } + public static void addContainerSystemProperty(String key, String value) { + String javaEEServer = System.getProperty("javaEEServer"); + + if ("glassfish-remote".equals(javaEEServer) || "payara-remote".equals(javaEEServer)) { + + System.out.println("Adding system property"); + + List cmd = new ArrayList<>(); + + cmd.add("create-jvm-options"); + cmd.add("-D" + key + "=" + value); + + CliCommands.payaraGlassFish(cmd); + + } else { + if (javaEEServer == null) { + System.out.println("javaEEServer not specified"); + } else { + System.out.println(javaEEServer + " not supported"); + } + } + } + public static void restartContainer() { // Arquillian connectors can stop/start already, but not on demand by code From e768eff65355b6d08711af6fbdcc65d56a731846 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Mon, 5 Nov 2018 22:18:57 +0100 Subject: [PATCH 060/117] Initial commit for remote EJB SSL test --- ejb/remote/roles-allowed-ssl/pom.xml | 51 ++++++++++++ .../java/org/javaee7/ejb/remote/ssl/Bean.java | 20 +++++ .../javaee7/ejb/remote/ssl/BeanRemote.java | 9 +++ .../resources/META-INF/glassfish-ejb-jar.xml | 25 ++++++ .../ejb/remote/ssl/RemoteBeanTest.java | 78 +++++++++++++++++++ .../src/test/resources/addUsersPayara.txt | 1 + .../src/test/resources/password.txt | 1 + ejb/remote/vendor/pom.xml | 12 +-- 8 files changed, 191 insertions(+), 6 deletions(-) create mode 100644 ejb/remote/roles-allowed-ssl/pom.xml create mode 100644 ejb/remote/roles-allowed-ssl/src/main/java/org/javaee7/ejb/remote/ssl/Bean.java create mode 100644 ejb/remote/roles-allowed-ssl/src/main/java/org/javaee7/ejb/remote/ssl/BeanRemote.java create mode 100644 ejb/remote/roles-allowed-ssl/src/main/resources/META-INF/glassfish-ejb-jar.xml create mode 100644 ejb/remote/roles-allowed-ssl/src/test/java/org/javaee7/ejb/remote/ssl/RemoteBeanTest.java create mode 100644 ejb/remote/roles-allowed-ssl/src/test/resources/addUsersPayara.txt create mode 100644 ejb/remote/roles-allowed-ssl/src/test/resources/password.txt diff --git a/ejb/remote/roles-allowed-ssl/pom.xml b/ejb/remote/roles-allowed-ssl/pom.xml new file mode 100644 index 000000000..3fba38fc6 --- /dev/null +++ b/ejb/remote/roles-allowed-ssl/pom.xml @@ -0,0 +1,51 @@ + + 4.0.0 + + + org.javaee7 + ejb-remote + 1.0-SNAPSHOT + + + ejb-remote-roles-allowed-ssl + war + + Java EE 7 Sample: ejb - remote - Roles Allowed + + + + payara-ci-managed + + + org.javaee7.ejb.remote.vendor + ejb.remote.vendor.payara-glassfish + 1.0-SNAPSHOT + + + + + + payara-remote + + + org.javaee7.ejb.remote.vendor + ejb.remote.vendor.payara-glassfish + 1.0-SNAPSHOT + + + + + + glassfish-remote + + + org.javaee7.ejb.remote.vendor + ejb.remote.vendor.payara-glassfish + 1.0-SNAPSHOT + + + + + + + diff --git a/ejb/remote/roles-allowed-ssl/src/main/java/org/javaee7/ejb/remote/ssl/Bean.java b/ejb/remote/roles-allowed-ssl/src/main/java/org/javaee7/ejb/remote/ssl/Bean.java new file mode 100644 index 000000000..f9d17c74d --- /dev/null +++ b/ejb/remote/roles-allowed-ssl/src/main/java/org/javaee7/ejb/remote/ssl/Bean.java @@ -0,0 +1,20 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.ejb.remote.ssl; + +import java.io.Serializable; + +import javax.annotation.security.RolesAllowed; +import javax.ejb.Stateless; + +@Stateless +public class Bean implements BeanRemote, Serializable { + + private static final long serialVersionUID = 1L; + + @Override + @RolesAllowed("g1") + public String method() { + return "method"; + } + +} diff --git a/ejb/remote/roles-allowed-ssl/src/main/java/org/javaee7/ejb/remote/ssl/BeanRemote.java b/ejb/remote/roles-allowed-ssl/src/main/java/org/javaee7/ejb/remote/ssl/BeanRemote.java new file mode 100644 index 000000000..62b4e21b9 --- /dev/null +++ b/ejb/remote/roles-allowed-ssl/src/main/java/org/javaee7/ejb/remote/ssl/BeanRemote.java @@ -0,0 +1,9 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.ejb.remote.ssl; + +import javax.ejb.Remote; + +@Remote +public interface BeanRemote { + String method(); +} diff --git a/ejb/remote/roles-allowed-ssl/src/main/resources/META-INF/glassfish-ejb-jar.xml b/ejb/remote/roles-allowed-ssl/src/main/resources/META-INF/glassfish-ejb-jar.xml new file mode 100644 index 000000000..887ef5c2a --- /dev/null +++ b/ejb/remote/roles-allowed-ssl/src/main/resources/META-INF/glassfish-ejb-jar.xml @@ -0,0 +1,25 @@ + + + + + + Bean + + + REQUIRED + REQUIRED + SUPPORTED + SUPPORTED + + + USERNAME_PASSWORD + default + true + + + REQUIRED + + + + + diff --git a/ejb/remote/roles-allowed-ssl/src/test/java/org/javaee7/ejb/remote/ssl/RemoteBeanTest.java b/ejb/remote/roles-allowed-ssl/src/test/java/org/javaee7/ejb/remote/ssl/RemoteBeanTest.java new file mode 100644 index 000000000..0d9a13989 --- /dev/null +++ b/ejb/remote/roles-allowed-ssl/src/test/java/org/javaee7/ejb/remote/ssl/RemoteBeanTest.java @@ -0,0 +1,78 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.ejb.remote.ssl; + +import static org.javaee7.ServerOperations.addUsersToContainerIdentityStore; +import static org.jboss.shrinkwrap.api.asset.EmptyAsset.INSTANCE; +import static org.junit.Assert.assertEquals; +import static org.junit.Assume.assumeTrue; + +import javax.naming.Context; +import javax.naming.NamingException; + +import org.javaee7.RemoteEJBContextFactory; +import org.javaee7.RemoteEJBContextProvider; +import org.javaee7.ejb.remote.ssl.Bean; +import org.javaee7.ejb.remote.ssl.BeanRemote; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * This class demonstrates and tests how to request an EJB bean from a remote server. + * + *

+ * {@link RemoteEJBContextProvider} is used, which is a test artifact abstracting the different + * ways this is done for different servers. + * + * @author Arjan Tijms + * + */ +@RunWith(Arquillian.class) +public class RemoteBeanTest { + + private RemoteEJBContextProvider remoteEJBContextProvider; + + @Deployment + public static Archive deployment() { + + // Add user u1 with password p1 and group g1 to the container's native identity store + addUsersToContainerIdentityStore(); + + return ShrinkWrap.create(JavaArchive.class) + .addClasses(Bean.class, BeanRemote.class) + .addAsManifestResource(INSTANCE, "beans.xml"); + } + + @Before + public void before() { + remoteEJBContextProvider = RemoteEJBContextFactory.getProvider(); + assumeTrue( + "No RemoteEJBContextProvider available in current profile", + remoteEJBContextProvider != null); + } + + @After + public void after() { + remoteEJBContextProvider.releaseContext(); + } + + @Test + @RunAsClient + public void callProtectedRemoteBean() throws NamingException { + + // Obtain the JNDI naming context in a vendor specific way. + Context ejbRemoteContext = remoteEJBContextProvider.getContextWithCredentialsSet("u1", "p1"); + + BeanRemote beanRemote = (BeanRemote) ejbRemoteContext.lookup("java:global/test/Bean"); + + assertEquals("method", beanRemote.method()); + } + +} \ No newline at end of file diff --git a/ejb/remote/roles-allowed-ssl/src/test/resources/addUsersPayara.txt b/ejb/remote/roles-allowed-ssl/src/test/resources/addUsersPayara.txt new file mode 100644 index 000000000..037cdbd6f --- /dev/null +++ b/ejb/remote/roles-allowed-ssl/src/test/resources/addUsersPayara.txt @@ -0,0 +1 @@ +create-file-user --groups g1 --passwordfile ${project.build.directory}/test-classes/password.txt u1 \ No newline at end of file diff --git a/ejb/remote/roles-allowed-ssl/src/test/resources/password.txt b/ejb/remote/roles-allowed-ssl/src/test/resources/password.txt new file mode 100644 index 000000000..c00bb4cac --- /dev/null +++ b/ejb/remote/roles-allowed-ssl/src/test/resources/password.txt @@ -0,0 +1 @@ +AS_ADMIN_USERPASSWORD=p1 diff --git a/ejb/remote/vendor/pom.xml b/ejb/remote/vendor/pom.xml index 6d71db463..cd94c328a 100644 --- a/ejb/remote/vendor/pom.xml +++ b/ejb/remote/vendor/pom.xml @@ -3,16 +3,16 @@ 4.0.0 - - - org.javaee7 - ejb-remote - 1.0-SNAPSHOT - + org.javaee7 ejb-remote-vendor + 1.0-SNAPSHOT pom + + 5.0 + + Java EE 7 Sample: ejb - remote - vendor From 3d1fc6d9126e4b75d4fc5897f66dccc3da0e09ca Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 6 Nov 2018 14:16:41 +0100 Subject: [PATCH 061/117] Using EAR to deploy EJB, since Arquillian can't/won't deploy ejb jars. --- ejb/remote/roles-allowed-ssl/pom.xml | 2 +- .../ejb/remote/ssl/RemoteBeanTest.java | 35 ++++++++++++++++--- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/ejb/remote/roles-allowed-ssl/pom.xml b/ejb/remote/roles-allowed-ssl/pom.xml index 3fba38fc6..446ccc584 100644 --- a/ejb/remote/roles-allowed-ssl/pom.xml +++ b/ejb/remote/roles-allowed-ssl/pom.xml @@ -8,7 +8,7 @@ ejb-remote-roles-allowed-ssl - war + jar Java EE 7 Sample: ejb - remote - Roles Allowed diff --git a/ejb/remote/roles-allowed-ssl/src/test/java/org/javaee7/ejb/remote/ssl/RemoteBeanTest.java b/ejb/remote/roles-allowed-ssl/src/test/java/org/javaee7/ejb/remote/ssl/RemoteBeanTest.java index 0d9a13989..dbc9dedf3 100644 --- a/ejb/remote/roles-allowed-ssl/src/test/java/org/javaee7/ejb/remote/ssl/RemoteBeanTest.java +++ b/ejb/remote/roles-allowed-ssl/src/test/java/org/javaee7/ejb/remote/ssl/RemoteBeanTest.java @@ -2,6 +2,7 @@ package org.javaee7.ejb.remote.ssl; import static org.javaee7.ServerOperations.addUsersToContainerIdentityStore; +import static org.jboss.shrinkwrap.api.ShrinkWrap.create; import static org.jboss.shrinkwrap.api.asset.EmptyAsset.INSTANCE; import static org.junit.Assert.assertEquals; import static org.junit.Assume.assumeTrue; @@ -18,7 +19,9 @@ import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -40,14 +43,36 @@ public class RemoteBeanTest { private RemoteEJBContextProvider remoteEJBContextProvider; @Deployment - public static Archive deployment() { - + public static Archive deployment() { + try { // Add user u1 with password p1 and group g1 to the container's native identity store addUsersToContainerIdentityStore(); + + Archive archive = + // EAR module + create(EnterpriseArchive.class, "my.ear") + .setApplicationXML("META-INF/application.xml") + + // EJB module + .addAsModule( + create(JavaArchive.class, "myEJB.jar") + .addClasses(Bean.class, BeanRemote.class) + .addAsResource("META-INF/glassfish-ejb-jar.xml") + .addAsManifestResource(INSTANCE, "beans.xml") + ) - return ShrinkWrap.create(JavaArchive.class) - .addClasses(Bean.class, BeanRemote.class) - .addAsManifestResource(INSTANCE, "beans.xml"); + // Web module + .addAsModule( + create(WebArchive.class, "test.war") + ); + + System.out.println(archive.toString(true)); + + return archive; + } catch (Exception e) { + e.printStackTrace(); + throw e; + } } @Before From 3ec0551562e59fcbdb1eedf43247cb7afcd5df9b Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 6 Nov 2018 14:17:10 +0100 Subject: [PATCH 062/117] application.xml for the remote ejb ssl test --- .../main/resources/META-INF/application.xml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 ejb/remote/roles-allowed-ssl/src/main/resources/META-INF/application.xml diff --git a/ejb/remote/roles-allowed-ssl/src/main/resources/META-INF/application.xml b/ejb/remote/roles-allowed-ssl/src/main/resources/META-INF/application.xml new file mode 100644 index 000000000..d90462368 --- /dev/null +++ b/ejb/remote/roles-allowed-ssl/src/main/resources/META-INF/application.xml @@ -0,0 +1,20 @@ + + + + + myapp + + + myEJB.jar + + + + + test.war + /test + + + + From 1d23c9c69d8e54580aa5f881082c409480242fcc Mon Sep 17 00:00:00 2001 From: arjantijms Date: Mon, 19 Nov 2018 17:08:36 +0100 Subject: [PATCH 063/117] Added trust store handling for remote EJB with SSL sample --- .../ejb/remote/ssl/RemoteBeanTest.java | 50 ++++- pom.xml | 21 +- .../clientcert/SecureServletTest.java | 206 ++++-------------- 3 files changed, 87 insertions(+), 190 deletions(-) diff --git a/ejb/remote/roles-allowed-ssl/src/test/java/org/javaee7/ejb/remote/ssl/RemoteBeanTest.java b/ejb/remote/roles-allowed-ssl/src/test/java/org/javaee7/ejb/remote/ssl/RemoteBeanTest.java index dbc9dedf3..8773c5803 100644 --- a/ejb/remote/roles-allowed-ssl/src/test/java/org/javaee7/ejb/remote/ssl/RemoteBeanTest.java +++ b/ejb/remote/roles-allowed-ssl/src/test/java/org/javaee7/ejb/remote/ssl/RemoteBeanTest.java @@ -1,24 +1,30 @@ /** Copyright Payara Services Limited **/ package org.javaee7.ejb.remote.ssl; +import static javax.naming.Context.SECURITY_PROTOCOL; import static org.javaee7.ServerOperations.addUsersToContainerIdentityStore; import static org.jboss.shrinkwrap.api.ShrinkWrap.create; import static org.jboss.shrinkwrap.api.asset.EmptyAsset.INSTANCE; import static org.junit.Assert.assertEquals; import static org.junit.Assume.assumeTrue; +import static org.omnifaces.utils.security.Certificates.createTempJKSTrustStore; +import static org.omnifaces.utils.security.Certificates.getCertificateChainFromServer; +import static org.omnifaces.utils.security.Certificates.getHostFromCertificate; +import static org.omnifaces.utils.security.Certificates.setSystemTrustStore; + +import java.net.URL; +import java.security.cert.X509Certificate; import javax.naming.Context; import javax.naming.NamingException; import org.javaee7.RemoteEJBContextFactory; import org.javaee7.RemoteEJBContextProvider; -import org.javaee7.ejb.remote.ssl.Bean; -import org.javaee7.ejb.remote.ssl.BeanRemote; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.Archive; -import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.shrinkwrap.api.spec.WebArchive; @@ -39,6 +45,9 @@ */ @RunWith(Arquillian.class) public class RemoteBeanTest { + + @ArquillianResource + private URL base; private RemoteEJBContextProvider remoteEJBContextProvider; @@ -66,7 +75,7 @@ public static Archive deployment() { create(WebArchive.class, "test.war") ); - System.out.println(archive.toString(true)); + System.out.println("\n**** Deploying archive: " + archive.toString(true) + " \n"); return archive; } catch (Exception e) { @@ -94,8 +103,37 @@ public void callProtectedRemoteBean() throws NamingException { // Obtain the JNDI naming context in a vendor specific way. Context ejbRemoteContext = remoteEJBContextProvider.getContextWithCredentialsSet("u1", "p1"); - - BeanRemote beanRemote = (BeanRemote) ejbRemoteContext.lookup("java:global/test/Bean"); + + ejbRemoteContext.addToEnvironment(SECURITY_PROTOCOL, "ssl"); + + System.out.println("\n**** Quering server for its certificate at " + base.getHost() + ":" + "3920" + "\n"); + + // Get the certificate from the server, using the EJB SSL port + X509Certificate[] serverCertificateChain = getCertificateChainFromServer(base.getHost(), 3920); + + for (X509Certificate certificate : serverCertificateChain) { + System.out.println("\n**** Server presented certificate:" + certificate + " \n"); + } + + // Create a trust store on disk containing the servers's certificates + String trustStorePath = createTempJKSTrustStore(serverCertificateChain); + + System.out.println("\n**** Temp trust store with server certificates created at: " + trustStorePath + " \n"); + + // Set the newly created trust store as the system wide trust store + setSystemTrustStore(trustStorePath); + + // Get the host name from the certificate the server presented, and use that for the host + // to ultimately do our SSL request to. + String host = getHostFromCertificate(serverCertificateChain); + ejbRemoteContext.addToEnvironment("org.omg.CORBA.ORBInitialHost", host); + + System.out.println("\n**** Obtained host \"" + host + "\" from server certificate and will use that for request \n"); + + // Do the actual request to the server for our remote EJB + BeanRemote beanRemote = (BeanRemote) ejbRemoteContext.lookup("java:global/my/myEJB/Bean"); + + System.out.println("\n**** Remote EJB obtained via SSL: " + beanRemote + " \n"); assertEquals("method", beanRemote.method()); } diff --git a/pom.xml b/pom.xml index 31fc2c22b..30a3543b4 100644 --- a/pom.xml +++ b/pom.xml @@ -76,21 +76,6 @@ false - - - ossrh - Sonatype-snapshot - - https://oss.sonatype.org/content/repositories/snapshots - - - false - - - true - always - - @@ -255,6 +240,12 @@ 1.6.0 test + + org.omnifaces + omniutils + 0.10 + test + diff --git a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java index 6d5965ed1..f36e6e57e 100644 --- a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java +++ b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java @@ -9,38 +9,25 @@ import static org.javaee7.ServerOperations.addContainerSystemProperty; import static org.jboss.shrinkwrap.api.ShrinkWrap.create; import static org.junit.Assert.assertTrue; +import static org.omnifaces.utils.Lang.isEmpty; +import static org.omnifaces.utils.security.Certificates.createTempJKSKeyStore; +import static org.omnifaces.utils.security.Certificates.createTempJKSTrustStore; +import static org.omnifaces.utils.security.Certificates.generateRandomRSAKeys; +import static org.omnifaces.utils.security.Certificates.getCertificateChainFromServer; import java.io.File; import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; -import java.security.KeyManagementException; import java.security.KeyPair; -import java.security.KeyPairGenerator; -import java.security.KeyStore; -import java.security.KeyStore.PasswordProtection; -import java.security.KeyStore.PrivateKeyEntry; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; -import java.security.PrivateKey; import java.security.Provider; import java.security.Security; -import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; -import java.util.ArrayList; import java.util.Date; -import java.util.List; import java.util.logging.Logger; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.impl.Jdk14Logger; @@ -60,6 +47,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.omnifaces.utils.security.Certificates; import com.gargoylesoftware.htmlunit.TextPage; import com.gargoylesoftware.htmlunit.WebClient; @@ -78,21 +66,18 @@ public class SecureServletTest { private URL base; private URL baseHttps; - - WebClient webClient; + private WebClient webClient; + private static String clientKeyStorePath; @Deployment(testable = false) public static WebArchive createDeployment() throws FileNotFoundException, IOException { System.out.println("\n*********** DEPLOYMENT START ***************************"); - Provider provider = new BouncyCastleProvider(); - Security.addProvider(provider); + Security.addProvider(new BouncyCastleProvider()); // Enable to get detailed logging about the SSL handshake on the client - // For an explanation of the TLS handshake see: https://tls.ulfheim.net - if (System.getProperty("ssl.debug") != null) { enableSSLDebug(); } @@ -103,13 +88,13 @@ public static WebArchive createDeployment() throws FileNotFoundException, IOExce // ### Generate keys for the client, create a certificate, and add those to a new local key store // Generate a Private/Public key pair for the client - KeyPair clientKeyPair = generateRandomKeys(); + KeyPair clientKeyPair = generateRandomRSAKeys(); // Create a certificate containing the client public key and signed with the private key X509Certificate clientCertificate = createSelfSignedCertificate(clientKeyPair); // Create a new local key store containing the client private key and the certificate - createKeyStore(clientKeyPair.getPrivate(), clientCertificate); + clientKeyStorePath = createTempJKSKeyStore(clientKeyPair.getPrivate(), clientCertificate); // Enable to get detailed logging about the SSL handshake on the server @@ -120,6 +105,7 @@ public static WebArchive createDeployment() throws FileNotFoundException, IOExce // Add the client certificate that we just generated to the trust store of the server. // That way the server will trust our certificate. + // Set the actual domain used with -Dpayara_domain=[domain name] addCertificateToContainerTrustStore(clientCertificate); return create(WebArchive.class) @@ -140,22 +126,20 @@ public void setup() throws FileNotFoundException, IOException { if (baseHttps == null) { throw new IllegalStateException("No https URL could be created from " + base); } - - // ### Ask the server for its certificate and add that to a new local trust store // Server -> client : the trust store certificates are used to validate the certificate sent // by the server + X509Certificate[] serverCertificateChain = getCertificateChainFromServer(baseHttps.getHost(), baseHttps.getPort()); - if (serverCertificateChain != null && serverCertificateChain.length > 0) { + if (!isEmpty(serverCertificateChain)) { System.out.println("Obtained certificate from server. Storing it in client trust store"); - createTrustStore(serverCertificateChain); + String trustStorePath = createTempJKSTrustStore(serverCertificateChain); - String trustStorePath = System.getProperty("buildDirectory", "") + "/clientTrustStore.jks"; System.out.println("Reading trust store from: " + trustStorePath); webClient.getOptions().setSSLTrustStore(new File(trustStorePath).toURI().toURL(), "changeit", "jks"); @@ -173,12 +157,11 @@ public void setup() throws FileNotFoundException, IOException { System.out.println("Could not obtain certificates from server. Continuing without custom truststore"); } - String keyStorePath = System.getProperty("buildDirectory", "") + "/clientKeyStore.jks"; - System.out.println("Reading key store from: " + keyStorePath); + System.out.println("Using client key store from: " + clientKeyStorePath); - // Client -> Server : the key store private keys and certificates are used to sign + // Client -> Server : the key store's private keys and certificates are used to sign // and sent a reply to the server - webClient.getOptions().setSSLClientCertificate(new File(keyStorePath).toURI().toURL(), "changeit", "jks"); + webClient.getOptions().setSSLClientCertificate(new File(clientKeyStorePath).toURI().toURL(), "changeit", "jks"); System.out.println("*********** SETUP DONE ***************************\n"); } @@ -212,59 +195,7 @@ public void testGetWithCorrectCredentials() throws Exception { // TODO: may move these to utility class - private static X509Certificate[] getCertificateChainFromServer(String host, int port) { - - final List X509Certificates = new ArrayList<>(); - - try { - SSLContext context = SSLContext.getInstance("TLS"); - - TrustManager interceptingTrustManager = new X509TrustManager() { - - @Override - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[] {}; - } - - @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { - } - - @Override - public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { - System.out.println("**** intercepting checkServerTrusted chain" + chain + " authType " + authType); - X509Certificates.add(chain); - } - }; - - context.init(null, new TrustManager[] { interceptingTrustManager }, null); - - SSLSocketFactory factory = context.getSocketFactory(); - - try (SSLSocket socket = (SSLSocket) factory.createSocket(host, port)) { - socket.setSoTimeout(15000); - socket.startHandshake(); - socket.close(); - } - - } catch (NoSuchAlgorithmException | KeyManagementException | IOException e) { - e.printStackTrace(); - } - - if (!X509Certificates.isEmpty()) { - X509Certificate[] x509Certificates = X509Certificates.get(0); - - for (X509Certificate certificate : x509Certificates) { - System.out.println("\n**** Server presented certificate:" + certificate + " \n"); - } - - return x509Certificates; - } - - return null; - } - - public static X509Certificate createSelfSignedCertificate(KeyPair keys) { + private static X509Certificate createSelfSignedCertificate(KeyPair keys) { try { Provider provider = new BouncyCastleProvider(); Security.addProvider(provider); @@ -286,92 +217,29 @@ public static X509Certificate createSelfSignedCertificate(KeyPair keys) { throw new IllegalStateException(e); } } - - private static KeyPair generateRandomKeys() { - try { - KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC"); - keyPairGenerator.initialize(2048); - - return keyPairGenerator.generateKeyPair(); - } catch (NoSuchAlgorithmException | NoSuchProviderException e) { - throw new IllegalStateException(e); - } - } - - private static void createKeyStore(PrivateKey privateKey, X509Certificate certificate) { - try { - KeyStore keyStore = KeyStore.getInstance("jks"); - keyStore.load(null, null); - - keyStore.setEntry( - "clientKey", - new PrivateKeyEntry(privateKey, new Certificate[] { certificate }), - new PasswordProtection("changeit".toCharArray())); - - String path = System.getProperty("buildDirectory", "") + "/clientKeyStore.jks"; - - System.out.println("Storing client key store at: " + path); - - keyStore.store(new FileOutputStream(path), "changeit".toCharArray()); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - private static void createTrustStore(X509Certificate[] certificates) { - try { - KeyStore keyStore = KeyStore.getInstance("jks"); - keyStore.load(null, null); - - for (int i = 0; i < certificates.length; i++) { - keyStore.setCertificateEntry("serverCert" + i, certificates[i]); - } - - String path = System.getProperty("buildDirectory", "") + "/clientTrustStore.jks"; - - System.out.println("Storing trust store at: " + path); - - keyStore.store(new FileOutputStream(path), "changeit".toCharArray()); - } catch (Exception ex) { - ex.printStackTrace(); - } - } + private static URL getHostFromCertificate(X509Certificate[] serverCertificateChain, URL existingURL) { - X509Certificate firstCert = serverCertificateChain[0]; - String name = firstCert.getIssuerX500Principal().getName(); - System.out.println("Full certificate issuer name " + name); - - String[] names = name.split(","); - - // cn should be first - if (names != null && names.length > 0) { - String cnNameString = names[0]; - String cn = cnNameString.substring(cnNameString.indexOf('=') + 1).trim(); - System.out.println("Issuer CN name: \"" + cn + "\""); + try { + URL httpsUrl = new URL( + existingURL.getProtocol(), + Certificates.getHostFromCertificate(serverCertificateChain), + existingURL.getPort(), + existingURL.getFile() + ); - try { - URL httpsUrl = new URL( - existingURL.getProtocol(), - cn, - existingURL.getPort(), - existingURL.getFile() - ); - - System.out.println("Changing base URL from " + existingURL + " into " + httpsUrl + "\n"); - - return httpsUrl; - - } catch (MalformedURLException e) { - System.out.println("Failure creating HTTPS URL"); - e.printStackTrace(); - } + System.out.println("Changing base URL from " + existingURL + " into " + httpsUrl + "\n"); + + return httpsUrl; + + } catch (MalformedURLException e) { + System.out.println("Failure creating HTTPS URL"); + e.printStackTrace(); + System.out.println("FAILED to get CN. Using existing URL: " + existingURL); + + return existingURL; } - - System.out.println("FAILED to get CN. Using existing URL: " + existingURL); - - return existingURL; } private static void enableSSLDebug() { From 0dd07dd8b9fc992a81b9dfd95ca729a893f2ba5c Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 29 Nov 2018 16:10:43 +0100 Subject: [PATCH 064/117] Added sample of client-cert using JCE --- servlet/pom.xml | 1 + servlet/security-clientcert-jce/pom.xml | 46 +++ .../clientcert/jce/BouncyServlet.java | 38 +++ .../jce/MyJCECertificateFactory.java | 33 +++ .../clientcert/jce/MyJCEX509Certificate.java | 185 ++++++++++++ .../clientcert/jce/SecureServlet.java | 29 ++ .../src/main/webapp/WEB-INF/glassfish-web.xml | 14 + .../src/main/webapp/WEB-INF/web.xml | 29 ++ .../clientcert/jce/SecureServletTest.java | 276 ++++++++++++++++++ 9 files changed, 651 insertions(+) create mode 100644 servlet/security-clientcert-jce/pom.xml create mode 100644 servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/BouncyServlet.java create mode 100644 servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/MyJCECertificateFactory.java create mode 100644 servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/MyJCEX509Certificate.java create mode 100644 servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/SecureServlet.java create mode 100644 servlet/security-clientcert-jce/src/main/webapp/WEB-INF/glassfish-web.xml create mode 100644 servlet/security-clientcert-jce/src/main/webapp/WEB-INF/web.xml create mode 100644 servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java diff --git a/servlet/pom.xml b/servlet/pom.xml index 365fd69bf..55131c441 100644 --- a/servlet/pom.xml +++ b/servlet/pom.xml @@ -33,6 +33,7 @@ security-digest security-form-based security-clientcert + security-clientcert-jce security-programmatic diff --git a/servlet/security-clientcert-jce/pom.xml b/servlet/security-clientcert-jce/pom.xml new file mode 100644 index 000000000..f8164227e --- /dev/null +++ b/servlet/security-clientcert-jce/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + + org.javaee7 + servlet + 1.0-SNAPSHOT + + + servlet-security-clientcert-jce + war + + Java EE 7 Sample: servlet - security-clientcert-jce + + + + org.bouncycastle + bcprov-jdk15on + 1.59 + + + + org.bouncycastle + bcpkix-jdk15on + 1.59 + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + ${skipServletClientCertificate} + + ${project.build.directory} + + + + + + + diff --git a/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/BouncyServlet.java b/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/BouncyServlet.java new file mode 100644 index 000000000..54889717a --- /dev/null +++ b/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/BouncyServlet.java @@ -0,0 +1,38 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.servlet.security.clientcert.jce; + +import java.io.IOException; +import java.security.Security; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +/** + * This Servlet is used to set our custom JCE provider. + * + * @author Arjan Tijms + */ +@WebServlet(urlPatterns = { "/BouncyServlet" }) +public class BouncyServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + BouncyCastleProvider provider = new BouncyCastleProvider(); + provider.put("CertificateFactory.X.509", MyJCECertificateFactory.class.getName()); + + // Installs the JCE provider + int pos = Security.insertProviderAt(provider, 1); + + // Returns the position of the JCE provider, this should be 1. + response.getWriter().print("pos:" + pos); + } + +} diff --git a/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/MyJCECertificateFactory.java b/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/MyJCECertificateFactory.java new file mode 100644 index 000000000..51c37a3bf --- /dev/null +++ b/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/MyJCECertificateFactory.java @@ -0,0 +1,33 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.servlet.security.clientcert.jce; + +import java.io.InputStream; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +import org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory; + +/** + * Our own custom CertificateFactory based on the bouncy castle one. + * + *

+ * We use this to provide a customized certificate, based on the certificate + * instance created by bouncy castle. + * + * @author Arjan Tijms + */ +public class MyJCECertificateFactory extends CertificateFactory { + + @Override + public Certificate engineGenerateCertificate(InputStream in) throws CertificateException { + Certificate certificate = super.engineGenerateCertificate(in); + + if (certificate instanceof X509Certificate == false) { + return certificate; + } + + return new MyJCEX509Certificate((X509Certificate) certificate); + } + +} diff --git a/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/MyJCEX509Certificate.java b/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/MyJCEX509Certificate.java new file mode 100644 index 000000000..a9504e90f --- /dev/null +++ b/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/MyJCEX509Certificate.java @@ -0,0 +1,185 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.servlet.security.clientcert.jce; + +import java.math.BigInteger; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.Principal; +import java.security.PublicKey; +import java.security.SignatureException; +import java.security.cert.CertificateEncodingException; +import java.security.cert.CertificateException; +import java.security.cert.CertificateExpiredException; +import java.security.cert.CertificateNotYetValidException; +import java.security.cert.X509Certificate; +import java.util.Date; +import java.util.Set; + +import javax.security.auth.x500.X500Principal; + +/** + * @author Arjan Tijms + */ +public class MyJCEX509Certificate extends X509Certificate { + + private final X509Certificate certificate; + + public MyJCEX509Certificate(X509Certificate certificate) { + this.certificate = certificate; + } + + @Override + public X500Principal getSubjectX500Principal() { + + X500Principal principal = certificate.getSubjectX500Principal(); + + if ("C=UK,ST=lak,L=zak,O=kaz,OU=bar,CN=lfoo".equals(principal.getName())) { + return new X500Principal("CN=u1"); + } + + return principal; + } + + @Override + public Principal getSubjectDN() { + + Principal principal = certificate.getSubjectDN(); + + if ("CN=lfoo,OU=bar,O=kaz,L=zak,ST=lak,C=UK".equals(principal.getName())) { + // Doesn't have to be X500 but keep it for simplicity + return new X500Principal("CN=u1"); + } + + return principal; + } + + @Override + public boolean hasUnsupportedCriticalExtension() { + return certificate.hasUnsupportedCriticalExtension(); + } + + @Override + public Set getCriticalExtensionOIDs() { + return certificate.getCriticalExtensionOIDs(); + } + + @Override + public Set getNonCriticalExtensionOIDs() { + return certificate.getCriticalExtensionOIDs(); + } + + @Override + public byte[] getExtensionValue(String oid) { + return certificate.getExtensionValue(oid); + } + + @Override + public void checkValidity() throws CertificateExpiredException, CertificateNotYetValidException { + certificate.checkValidity(); + + } + + @Override + public void checkValidity(Date date) throws CertificateExpiredException, CertificateNotYetValidException { + certificate.checkValidity(date); + } + + @Override + public int getVersion() { + return certificate.getVersion(); + } + + @Override + public BigInteger getSerialNumber() { + return certificate.getSerialNumber(); + } + + @Override + public Principal getIssuerDN() { + return certificate.getIssuerDN(); + } + + @Override + public Date getNotBefore() { + return certificate.getNotBefore(); + } + + @Override + public Date getNotAfter() { + return certificate.getNotAfter(); + } + + @Override + public byte[] getTBSCertificate() throws CertificateEncodingException { + return certificate.getTBSCertificate(); + } + + @Override + public byte[] getSignature() { + return certificate.getSignature(); + } + + @Override + public String getSigAlgName() { + return certificate.getSigAlgName(); + } + + @Override + public String getSigAlgOID() { + return certificate.getSigAlgOID(); + } + + @Override + public byte[] getSigAlgParams() { + return certificate.getSigAlgParams(); + } + + @Override + public boolean[] getIssuerUniqueID() { + return certificate.getIssuerUniqueID(); + } + + @Override + public boolean[] getSubjectUniqueID() { + return certificate.getSubjectUniqueID(); + } + + @Override + public boolean[] getKeyUsage() { + return certificate.getKeyUsage(); + } + + @Override + public int getBasicConstraints() { + return certificate.getBasicConstraints(); + } + + @Override + public byte[] getEncoded() throws CertificateEncodingException { + return certificate.getEncoded(); + } + + @Override + public void verify(PublicKey key) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, SignatureException { + certificate.verify(key); + + } + + @Override + public void verify(PublicKey key, String sigProvider) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, SignatureException { + certificate.verify(key, sigProvider); + + } + + @Override + public String toString() { + return certificate.toString(); + } + + @Override + public PublicKey getPublicKey() { + return certificate.getPublicKey(); + } + +} diff --git a/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/SecureServlet.java b/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/SecureServlet.java new file mode 100644 index 000000000..4b9e72ac3 --- /dev/null +++ b/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/SecureServlet.java @@ -0,0 +1,29 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.servlet.security.clientcert.jce; + +import java.io.IOException; +import java.security.Security; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +/** + * @author Arjan Tijms + */ +@WebServlet(urlPatterns = { "/SecureServlet" }) +public class SecureServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + response.getWriter().print("principal " + request.getUserPrincipal() + " in role g1:" + request.isUserInRole("g1")); + } + +} diff --git a/servlet/security-clientcert-jce/src/main/webapp/WEB-INF/glassfish-web.xml b/servlet/security-clientcert-jce/src/main/webapp/WEB-INF/glassfish-web.xml new file mode 100644 index 000000000..e78edc96a --- /dev/null +++ b/servlet/security-clientcert-jce/src/main/webapp/WEB-INF/glassfish-web.xml @@ -0,0 +1,14 @@ + + + + + + + g1 + g1 + CN=u1 + + + diff --git a/servlet/security-clientcert-jce/src/main/webapp/WEB-INF/web.xml b/servlet/security-clientcert-jce/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..899e73beb --- /dev/null +++ b/servlet/security-clientcert-jce/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,29 @@ + + + + + + + SecureServlet + /SecureServlet + GET + POST + + + g1 + + + + + CLIENT-CERT + + + + g1 + + diff --git a/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java b/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java new file mode 100644 index 000000000..aae7680b5 --- /dev/null +++ b/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java @@ -0,0 +1,276 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.servlet.security.clientcert.jce; + +import static java.math.BigInteger.ONE; +import static java.time.Instant.now; +import static java.time.temporal.ChronoUnit.DAYS; +import static java.util.logging.Level.FINEST; +import static org.javaee7.ServerOperations.addCertificateToContainerTrustStore; +import static org.javaee7.ServerOperations.addContainerSystemProperty; +import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import static org.junit.Assert.assertTrue; +import static org.omnifaces.utils.Lang.isEmpty; +import static org.omnifaces.utils.security.Certificates.createTempJKSKeyStore; +import static org.omnifaces.utils.security.Certificates.createTempJKSTrustStore; +import static org.omnifaces.utils.security.Certificates.generateRandomRSAKeys; +import static org.omnifaces.utils.security.Certificates.getCertificateChainFromServer; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.security.KeyPair; +import java.security.Provider; +import java.security.Security; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.Date; +import java.util.logging.Logger; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.logging.impl.Jdk14Logger; +import org.bouncycastle.asn1.x500.X500Name; +import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; +import org.bouncycastle.cert.X509v3CertificateBuilder; +import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.operator.OperatorCreationException; +import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; +import org.javaee7.ServerOperations; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.jboss.shrinkwrap.resolver.api.maven.Maven; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.omnifaces.utils.security.Certificates; + +import com.gargoylesoftware.htmlunit.TextPage; +import com.gargoylesoftware.htmlunit.WebClient; + +/** + * @author Arjan Tijms + */ +@RunWith(Arquillian.class) +public class SecureServletTest { + + private static Logger log = Logger.getLogger(SecureServletTest.class.getName()); + + private static final String WEBAPP_SRC = "src/main/webapp"; + + @ArquillianResource + private URL base; + + private URL baseHttps; + private WebClient webClient; + private static String clientKeyStorePath; + + @Deployment(testable = false) + public static WebArchive createDeployment() throws FileNotFoundException, IOException { + + System.out.println("\n*********** DEPLOYMENT START ***************************"); + + Security.addProvider(new BouncyCastleProvider()); + + // Enable to get detailed logging about the SSL handshake on the client + // For an explanation of the TLS handshake see: https://tls.ulfheim.net + if (System.getProperty("ssl.debug") != null) { + enableSSLDebug(); + } + + + System.out.println("################################################################"); + + // ### Generate keys for the client, create a certificate, and add those to a new local key store + + // Generate a Private/Public key pair for the client + KeyPair clientKeyPair = generateRandomRSAKeys(); + + // Create a certificate containing the client public key and signed with the private key + X509Certificate clientCertificate = createSelfSignedCertificate(clientKeyPair); + + // Create a new local key store containing the client private key and the certificate + clientKeyStorePath = createTempJKSKeyStore(clientKeyPair.getPrivate(), clientCertificate); + + // Enable to get detailed logging about the SSL handshake on the server + + if (System.getProperty("ssl.debug") != null) { + System.out.println("Setting server SSL debug on"); + addContainerSystemProperty("javax.net.debug", "ssl:handshake"); + } + + // Add the client certificate that we just generated to the trust store of the server. + // That way the server will trust our certificate. + // Set the actual domain used with -Dpayara_domain=[domain name] + addCertificateToContainerTrustStore(clientCertificate); + + return create(WebArchive.class) + .addAsLibraries(Maven.resolver() + .loadPomFromFile("pom.xml") + .resolve("org.bouncycastle:bcprov-jdk15on", "org.bouncycastle:bcpkix-jdk15on") + .withTransitivity() + .as(JavaArchive.class)) + .addClass(BouncyServlet.class) + .addClasses(SecureServlet.class) + .addClasses(MyJCECertificateFactory.class, MyJCEX509Certificate.class) + .addAsWebInfResource((new File(WEBAPP_SRC + "/WEB-INF", "web.xml"))) + .addAsWebInfResource((new File(WEBAPP_SRC + "/WEB-INF", "glassfish-web.xml"))); + } + + @Before + public void setup() throws FileNotFoundException, IOException { + + System.out.println("\n*********** SETUP START ***************************"); + + webClient = new WebClient(); + + // First get the HTTPS URL for which the server is listening + baseHttps = ServerOperations.toContainerHttps(base); + if (baseHttps == null) { + throw new IllegalStateException("No https URL could be created from " + base); + } + + // ### Ask the server for its certificate and add that to a new local trust store + + // Server -> client : the trust store certificates are used to validate the certificate sent + // by the server + + X509Certificate[] serverCertificateChain = getCertificateChainFromServer(baseHttps.getHost(), baseHttps.getPort()); + + if (!isEmpty(serverCertificateChain)) { + + System.out.println("Obtained certificate from server. Storing it in client trust store"); + + String trustStorePath = createTempJKSTrustStore(serverCertificateChain); + + System.out.println("Reading trust store from: " + trustStorePath); + + webClient.getOptions().setSSLTrustStore(new File(trustStorePath).toURI().toURL(), "changeit", "jks"); + + // If the use.cnHost property is we try to extract the host from the server + // certificate and use exactly that host for our requests. + // This is needed if a server is listening to multiple host names, for instance + // localhost and example.com. If the certificate is for example.com, we can't + // localhost for the request, as that will not be accepted. + if (System.getProperty("use.cnHost") != null) { + System.out.println("use.cnHost set. Trying to grab CN from certificate and use as host for requests."); + baseHttps = getHostFromCertificate(serverCertificateChain, baseHttps); + } + } else { + System.out.println("Could not obtain certificates from server. Continuing without custom truststore"); + } + + System.out.println("Using client key store from: " + clientKeyStorePath); + + // Client -> Server : the key store's private keys and certificates are used to sign + // and sent a reply to the server + webClient.getOptions().setSSLClientCertificate(new File(clientKeyStorePath).toURI().toURL(), "changeit", "jks"); + + System.out.println("*********** SETUP DONE ***************************\n"); + } + + @After + public void tearDown() { + webClient.getCookieManager().clearCookies(); + webClient.close(); + System.out.println("\n*********** TEST END ***************************\n"); + } + + @Test + public void testGetWithCorrectCredentials() throws Exception { + + System.out.println("\n*********** TEST START ***************************\n"); + + try { + + // First do a request to install Bouncy Castle as provider + // This is a normal HTTP request and doesn't use certificate authentication + TextPage pageb = webClient.getPage(base + "BouncyServlet"); + + log.info("Bouncy Castle provider inserted at position: " + pageb.getContent()); + + // With Bouncy Castle installed, do the request via HTTPS to the secured + // Servlet + TextPage page = webClient.getPage(baseHttps + "SecureServlet"); + + log.info(page.getContent()); + + assertTrue("my GET", page.getContent().contains("principal CN=u1")); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + + + // Private methods + + // TODO: may move these to utility class + + private static X509Certificate createSelfSignedCertificate(KeyPair keys) { + try { + Provider provider = new BouncyCastleProvider(); + Security.addProvider(provider); + return new JcaX509CertificateConverter() + .setProvider(provider) + .getCertificate( + new X509v3CertificateBuilder( + new X500Name("CN=lfoo, OU=bar, O=kaz, L=zak, ST=lak, C=UK"), + ONE, + Date.from(now()), + Date.from(now().plus(1, DAYS)), + new X500Name("CN=lfoo, OU=bar, O=kaz, L=zak, ST=lak, C=UK"), + SubjectPublicKeyInfo.getInstance(keys.getPublic().getEncoded())) + .build( + new JcaContentSignerBuilder("SHA256WithRSA") + .setProvider(provider) + .build(keys.getPrivate()))); + } catch (CertificateException | OperatorCreationException e) { + throw new IllegalStateException(e); + } + } + + + private static URL getHostFromCertificate(X509Certificate[] serverCertificateChain, URL existingURL) { + try { + URL httpsUrl = new URL( + existingURL.getProtocol(), + Certificates.getHostFromCertificate(serverCertificateChain), + existingURL.getPort(), + existingURL.getFile() + ); + + System.out.println("Changing base URL from " + existingURL + " into " + httpsUrl + "\n"); + + return httpsUrl; + + } catch (MalformedURLException e) { + System.out.println("Failure creating HTTPS URL"); + e.printStackTrace(); + + System.out.println("FAILED to get CN. Using existing URL: " + existingURL); + + return existingURL; + } + } + + private static void enableSSLDebug() { + System.setProperty("javax.net.debug", "ssl:handshake"); + + System.getProperties().put("org.apache.commons.logging.simplelog.defaultlog", "debug"); + Logger.getLogger("com.gargoylesoftware.htmlunit.httpclient.HtmlUnitSSLConnectionSocketFactory").setLevel(FINEST); + Logger.getLogger("org.apache.http.conn.ssl.SSLConnectionSocketFactory").setLevel(FINEST); + Log logger = LogFactory.getLog(org.apache.http.conn.ssl.SSLConnectionSocketFactory.class); + ((Jdk14Logger) logger).getLogger().setLevel(FINEST); + logger = LogFactory.getLog(com.gargoylesoftware.htmlunit.httpclient.HtmlUnitSSLConnectionSocketFactory.class); + ((Jdk14Logger) logger).getLogger().setLevel(FINEST); + Logger.getGlobal().getParent().getHandlers()[0].setLevel(FINEST); + } + +} From 072c2ee4aa28663bccedcced982cab6c8a56a502 Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Tue, 11 Dec 2018 12:14:45 +0000 Subject: [PATCH 065/117] Use the maven specified payara domain. --- test-utils/pom.xml | 42 +++++++------------- test-utils/src/main/resources/arquillian.xml | 2 +- 2 files changed, 16 insertions(+), 28 deletions(-) diff --git a/test-utils/pom.xml b/test-utils/pom.xml index ca0100e77..9aa154533 100644 --- a/test-utils/pom.xml +++ b/test-utils/pom.xml @@ -3,42 +3,21 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - 1.1.14.Final - UTF-8 - UTF-8 - 1.7 - 1.7 - + + org.javaee7 + samples-parent + 1.0-SNAPSHOT + org.javaee7 test-utils - 1.0-SNAPSHOT Java EE 7 Sample: javaee7-samples - test-utils - - - - org.jboss.arquillian - arquillian-bom - ${arquillian.version} - import - pom - - - - - - javax - javaee-api - 7.0 - provided - junit junit - 4.11 + 4.12 org.jboss.arquillian.container @@ -50,4 +29,13 @@ + + + + src/main/resources + true + + + + diff --git a/test-utils/src/main/resources/arquillian.xml b/test-utils/src/main/resources/arquillian.xml index 2553915b7..99181b426 100644 --- a/test-utils/src/main/resources/arquillian.xml +++ b/test-utils/src/main/resources/arquillian.xml @@ -7,7 +7,7 @@ - payaradomain + ${payara_domain} From 61883528fac68c8337c74792da508d56914410e2 Mon Sep 17 00:00:00 2001 From: Andrew Pielage Date: Wed, 12 Dec 2018 09:59:16 +0000 Subject: [PATCH 066/117] Property already at top level --- ejb/remote/vendor/pom.xml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ejb/remote/vendor/pom.xml b/ejb/remote/vendor/pom.xml index cd94c328a..06310934d 100644 --- a/ejb/remote/vendor/pom.xml +++ b/ejb/remote/vendor/pom.xml @@ -8,11 +8,7 @@ ejb-remote-vendor 1.0-SNAPSHOT pom - - - 5.0 - - + Java EE 7 Sample: ejb - remote - vendor From 6a994fe23490b69ac51dabd1fcf7dfa90cd3e0cc Mon Sep 17 00:00:00 2001 From: Andrew Pielage Date: Wed, 12 Dec 2018 09:55:09 +0000 Subject: [PATCH 067/117] Formatting & Cleanup --- .../resources/META-INF/glassfish-ejb-jar.xml | 42 +++++++++---------- pom.xml | 10 +++++ servlet/security-clientcert-jce/pom.xml | 2 - servlet/security-clientcert/pom.xml | 2 - 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/ejb/remote/roles-allowed-ssl/src/main/resources/META-INF/glassfish-ejb-jar.xml b/ejb/remote/roles-allowed-ssl/src/main/resources/META-INF/glassfish-ejb-jar.xml index 887ef5c2a..6c114b352 100644 --- a/ejb/remote/roles-allowed-ssl/src/main/resources/META-INF/glassfish-ejb-jar.xml +++ b/ejb/remote/roles-allowed-ssl/src/main/resources/META-INF/glassfish-ejb-jar.xml @@ -1,25 +1,25 @@ - - - Bean - - - REQUIRED - REQUIRED - SUPPORTED - SUPPORTED - - - USERNAME_PASSWORD - default - true - - - REQUIRED - - - - + + + Bean + + + REQUIRED + REQUIRED + SUPPORTED + SUPPORTED + + + USERNAME_PASSWORD + default + true + + + REQUIRED + + + + diff --git a/pom.xml b/pom.xml index 30a3543b4..e59b28046 100644 --- a/pom.xml +++ b/pom.xml @@ -133,6 +133,16 @@ 1.0.Beta3-m1 test + + org.bouncycastle + bcprov-jdk15on + 1.59 + + + org.bouncycastle + bcpkix-jdk15on + 1.59 + diff --git a/servlet/security-clientcert-jce/pom.xml b/servlet/security-clientcert-jce/pom.xml index f8164227e..860c1ce6c 100644 --- a/servlet/security-clientcert-jce/pom.xml +++ b/servlet/security-clientcert-jce/pom.xml @@ -18,13 +18,11 @@ org.bouncycastle bcprov-jdk15on - 1.59 org.bouncycastle bcpkix-jdk15on - 1.59 diff --git a/servlet/security-clientcert/pom.xml b/servlet/security-clientcert/pom.xml index f7f899b20..cc15ea24b 100644 --- a/servlet/security-clientcert/pom.xml +++ b/servlet/security-clientcert/pom.xml @@ -18,13 +18,11 @@ org.bouncycastle bcprov-jdk15on - 1.59 org.bouncycastle bcpkix-jdk15on - 1.59 From a6c24e9d583dc90c92825f454c90baae77b628d8 Mon Sep 17 00:00:00 2001 From: Andrew Pielage Date: Wed, 12 Dec 2018 11:26:59 +0000 Subject: [PATCH 068/117] Add parent --- ejb/remote/vendor/pom.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ejb/remote/vendor/pom.xml b/ejb/remote/vendor/pom.xml index 06310934d..bb49b39ed 100644 --- a/ejb/remote/vendor/pom.xml +++ b/ejb/remote/vendor/pom.xml @@ -4,9 +4,13 @@ 4.0.0 - org.javaee7 + + org.javaee7 + ejb-remote + 1.0-SNAPSHOT + + ejb-remote-vendor - 1.0-SNAPSHOT pom Java EE 7 Sample: ejb - remote - vendor From 29c1a533a47dd53a0f084b3b1647d37ca43d36f3 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 18 Dec 2018 20:41:50 +0100 Subject: [PATCH 069/117] Removed parent from test utility lib and set scope to test This should fix the inability to resume and run individual test folders. --- batch/pom.xml | 2 ++ cdi/pom.xml | 8 +++---- concurrency/pom.xml | 9 ++++---- ejb/pom.xml | 4 ++-- el/pom.xml | 9 ++++---- interceptor/pom.xml | 9 ++++---- jacc/pom.xml | 4 ++-- jaspic/pom.xml | 5 ++--- javamail/pom.xml | 9 ++++---- jaxrpc/pom.xml | 1 + jaxrs/pom.xml | 2 ++ jaxws/pom.xml | 1 + jca/pom.xml | 6 +++--- jms/pom.xml | 1 + jpa/pom.xml | 5 ++--- jsf/pom.xml | 5 ++--- json/pom.xml | 9 ++++---- jta/pom.xml | 9 ++++---- pom.xml | 4 +++- servlet/pom.xml | 6 ++---- test-utils/pom.xml | 47 ++++++++++++++++++++++++++++++++++-------- validation/pom.xml | 9 ++++---- websocket/chat/pom.xml | 9 +++----- websocket/pom.xml | 11 ++++------ 24 files changed, 102 insertions(+), 82 deletions(-) diff --git a/batch/pom.xml b/batch/pom.xml index ac693fd4b..37ae2723b 100644 --- a/batch/pom.xml +++ b/batch/pom.xml @@ -35,10 +35,12 @@ org.javaee7 test-utils ${project.version} + test org.jboss.shrinkwrap.descriptors shrinkwrap-descriptors-impl-javaee + test diff --git a/cdi/pom.xml b/cdi/pom.xml index b5c3da65b..a6582af07 100644 --- a/cdi/pom.xml +++ b/cdi/pom.xml @@ -1,16 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml + org.javaee7 cdi - 1.0-SNAPSHOT + pom Java EE 7 Sample: cdi @@ -48,6 +47,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/concurrency/pom.xml b/concurrency/pom.xml index 2cbbd8120..dd3b5f47b 100644 --- a/concurrency/pom.xml +++ b/concurrency/pom.xml @@ -1,17 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml - org.javaee7 + concurrency - 1.0-SNAPSHOT pom + Java EE 7 Sample: concurrency @@ -26,6 +24,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/ejb/pom.xml b/ejb/pom.xml index 122149f76..049259e47 100644 --- a/ejb/pom.xml +++ b/ejb/pom.xml @@ -1,6 +1,5 @@ - - 4.0.0 + 4.0.0 org.javaee7 @@ -29,6 +28,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/el/pom.xml b/el/pom.xml index 0e9548643..2cd702e23 100644 --- a/el/pom.xml +++ b/el/pom.xml @@ -1,17 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml - org.javaee7 + el - 1.0-SNAPSHOT pom + Java EE 7 Sample: el @@ -23,6 +21,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/interceptor/pom.xml b/interceptor/pom.xml index bb3a574f9..d0767aa76 100644 --- a/interceptor/pom.xml +++ b/interceptor/pom.xml @@ -1,17 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml - org.javaee7 + interceptor - 1.0-SNAPSHOT pom + Java EE 7 Sample: interceptor @@ -23,6 +21,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/jacc/pom.xml b/jacc/pom.xml index 494ad6cf8..eeb4171f3 100644 --- a/jacc/pom.xml +++ b/jacc/pom.xml @@ -6,10 +6,9 @@ 1.0-SNAPSHOT - org.javaee7 jacc - pom + Java EE 7 Sample: jacc @@ -22,6 +21,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/jaspic/pom.xml b/jaspic/pom.xml index 06abedd7c..fe046c0b3 100644 --- a/jaspic/pom.xml +++ b/jaspic/pom.xml @@ -1,12 +1,10 @@ - - 4.0.0 + 4.0.0 org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml jaspic @@ -83,6 +81,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/javamail/pom.xml b/javamail/pom.xml index 4f4fd1611..428c8e563 100644 --- a/javamail/pom.xml +++ b/javamail/pom.xml @@ -1,17 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml - org.javaee7 + javamail - 1.0-SNAPSHOT pom + Java EE 7 Sample: javamail @@ -23,6 +21,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/jaxrpc/pom.xml b/jaxrpc/pom.xml index 0e508e6e8..fee49f706 100644 --- a/jaxrpc/pom.xml +++ b/jaxrpc/pom.xml @@ -21,6 +21,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/jaxrs/pom.xml b/jaxrs/pom.xml index f1d37011d..9b8a7fe46 100644 --- a/jaxrs/pom.xml +++ b/jaxrs/pom.xml @@ -9,6 +9,7 @@ jaxrs pom + Java EE 7 Sample: jaxrs @@ -48,6 +49,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/jaxws/pom.xml b/jaxws/pom.xml index 7099a2360..f7a1e6d1f 100644 --- a/jaxws/pom.xml +++ b/jaxws/pom.xml @@ -22,6 +22,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/jca/pom.xml b/jca/pom.xml index e4af5f93f..148d44f40 100644 --- a/jca/pom.xml +++ b/jca/pom.xml @@ -1,7 +1,5 @@ - - 4.0.0 + 4.0.0 org.javaee7 @@ -11,6 +9,7 @@ jca pom + Java EE 7 Sample: jca @@ -23,6 +22,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/jms/pom.xml b/jms/pom.xml index 2d4408fbc..01119e5d3 100644 --- a/jms/pom.xml +++ b/jms/pom.xml @@ -25,6 +25,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/jpa/pom.xml b/jpa/pom.xml index 42f5e5697..22dadcbf3 100644 --- a/jpa/pom.xml +++ b/jpa/pom.xml @@ -1,12 +1,10 @@ - - 4.0.0 + 4.0.0 org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml jpa @@ -50,6 +48,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/jsf/pom.xml b/jsf/pom.xml index 733f580a6..63f33f4c3 100644 --- a/jsf/pom.xml +++ b/jsf/pom.xml @@ -1,6 +1,5 @@ - - 4.0.0 + 4.0.0 org.javaee7 @@ -9,7 +8,6 @@ jsf - 1.0-SNAPSHOT pom Java EE 7 Sample: jsf @@ -40,6 +38,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/json/pom.xml b/json/pom.xml index 83ceb12aa..db0a5703c 100644 --- a/json/pom.xml +++ b/json/pom.xml @@ -1,17 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml - org.javaee7 + json - 1.0-SNAPSHOT pom + Java EE 7 Sample: json @@ -26,6 +24,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/jta/pom.xml b/jta/pom.xml index 4edfaf1c8..1aed93aea 100644 --- a/jta/pom.xml +++ b/jta/pom.xml @@ -1,17 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml - org.javaee7 + jta - 1.0-SNAPSHOT pom + Java EE 7 Sample: jta @@ -25,6 +23,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/pom.xml b/pom.xml index 30a3543b4..ce09ab618 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ Java EE 7 Sample: javaee7-samples - 1.1.14.Final + 1.1.14.Final 1.7 3.0.0 UTF-8 @@ -251,12 +251,14 @@ ${project.artifactId} + src/test/resources true + org.apache.maven.plugins diff --git a/servlet/pom.xml b/servlet/pom.xml index 55131c441..802416e4f 100644 --- a/servlet/pom.xml +++ b/servlet/pom.xml @@ -1,6 +1,5 @@ - - 4.0.0 + 4.0.0 org.javaee7 @@ -34,8 +33,6 @@ security-form-based security-clientcert security-clientcert-jce - - security-programmatic security-deny-uncovered security-annotated @@ -47,6 +44,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/test-utils/pom.xml b/test-utils/pom.xml index 9aa154533..1a596a1f6 100644 --- a/test-utils/pom.xml +++ b/test-utils/pom.xml @@ -1,19 +1,37 @@ - - 4.0.0 - - - org.javaee7 - samples-parent - 1.0-SNAPSHOT - + 4.0.0 org.javaee7 test-utils + 1.0-SNAPSHOT + Java EE 7 Sample: javaee7-samples - test-utils + + UTF-8 + 1.1.14.Final + 1.7 + + + + + + org.jboss.arquillian + arquillian-bom + ${arquillian.version} + import + pom + + + + + + javax + javaee-api + 7.0 + provided + junit junit @@ -36,6 +54,17 @@ true + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + ${java.min.version} + ${java.min.version} + + + diff --git a/validation/pom.xml b/validation/pom.xml index 77243943e..4b7e1bf4a 100644 --- a/validation/pom.xml +++ b/validation/pom.xml @@ -1,17 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml - org.javaee7 + validation - 1.0-SNAPSHOT pom + Java EE 7 Sample: validation @@ -24,6 +22,7 @@ org.javaee7 test-utils ${project.version} + test diff --git a/websocket/chat/pom.xml b/websocket/chat/pom.xml index a84dc1d3c..4b63b856e 100644 --- a/websocket/chat/pom.xml +++ b/websocket/chat/pom.xml @@ -1,17 +1,14 @@ - - - 4.0.0 - + 4.0.0 org.javaee7 websocket 1.0-SNAPSHOT - ../pom.xml + org.javaee7 websocket-chat - 1.0-SNAPSHOT + war Java EE 7 Sample: websocket - chat diff --git a/websocket/pom.xml b/websocket/pom.xml index a2224ae33..1db267456 100644 --- a/websocket/pom.xml +++ b/websocket/pom.xml @@ -1,16 +1,15 @@ - - 4.0.0 + 4.0.0 org.javaee7 samples-parent 1.0-SNAPSHOT - ../pom.xml - org.javaee7 + websocket pom + Java EE 7 Sample: websocket @@ -21,13 +20,11 @@ endpoint endpoint-async endpoint-javatypes - endpoint-config endpoint-programmatic endpoint-programmatic-async endpoint-programmatic-config endpoint-programmatic-injection - endpoint-security httpsession injection @@ -45,7 +42,6 @@ whiteboard endpoint-singleton websocket-vs-rest-payload - @@ -53,6 +49,7 @@ org.javaee7 test-utils ${project.version} + test From 51f6f62a14991378d89e66e9115510a38d546e4e Mon Sep 17 00:00:00 2001 From: Gaurav Gupta Date: Fri, 22 Feb 2019 13:48:05 +0530 Subject: [PATCH 070/117] QA-183 Remove BouncyCastle provider from javaee7-samples/security-clientcert-jce after execution --- .../clientcert/jce/BouncyServlet.java | 5 ++++ .../clientcert/jce/SecureServletTest.java | 24 ++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/BouncyServlet.java b/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/BouncyServlet.java index 54889717a..8411a4d82 100644 --- a/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/BouncyServlet.java +++ b/servlet/security-clientcert-jce/src/main/java/org/javaee7/servlet/security/clientcert/jce/BouncyServlet.java @@ -35,4 +35,9 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t response.getWriter().print("pos:" + pos); } + @Override + protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME); + } + } diff --git a/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java b/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java index aae7680b5..4f49577ab 100644 --- a/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java +++ b/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java @@ -26,6 +26,7 @@ import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.Date; +import static java.util.logging.Level.INFO; import java.util.logging.Logger; import org.apache.commons.logging.Log; @@ -51,8 +52,10 @@ import org.junit.runner.RunWith; import org.omnifaces.utils.security.Certificates; +import com.gargoylesoftware.htmlunit.HttpMethod; import com.gargoylesoftware.htmlunit.TextPage; import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.WebRequest; /** * @author Arjan Tijms @@ -172,11 +175,20 @@ public void setup() throws FileNotFoundException, IOException { // and sent a reply to the server webClient.getOptions().setSSLClientCertificate(new File(clientKeyStorePath).toURI().toURL(), "changeit", "jks"); + // First do a request to install Bouncy Castle as provider + // This is a normal HTTP request and doesn't use certificate authentication + TextPage pageb = webClient.getPage(base + "BouncyServlet"); + log.log(INFO, "Bouncy Castle provider inserted at position: {0}", pageb.getContent()); + System.out.println("*********** SETUP DONE ***************************\n"); } @After - public void tearDown() { + public void tearDown() throws IOException { + // Remove Bouncy Castle as provider + TextPage pageb = webClient.getPage(new WebRequest(new URL(base + "BouncyServlet"), HttpMethod.DELETE)); + log.log(INFO, "Bouncy Castle provider removed: {0}", pageb.getContent()); + webClient.getCookieManager().clearCookies(); webClient.close(); System.out.println("\n*********** TEST END ***************************\n"); @@ -184,17 +196,11 @@ public void tearDown() { @Test public void testGetWithCorrectCredentials() throws Exception { - + System.out.println("\n*********** TEST START ***************************\n"); - + try { - - // First do a request to install Bouncy Castle as provider - // This is a normal HTTP request and doesn't use certificate authentication - TextPage pageb = webClient.getPage(base + "BouncyServlet"); - log.info("Bouncy Castle provider inserted at position: " + pageb.getContent()); - // With Bouncy Castle installed, do the request via HTTPS to the secured // Servlet TextPage page = webClient.getPage(baseHttps + "SecureServlet"); From ba7f1ef8b0931478fafeea9cee3fbb1559b2644f Mon Sep 17 00:00:00 2001 From: Gaurav Gupta Date: Thu, 28 Feb 2019 12:29:44 +0530 Subject: [PATCH 071/117] QA-187 Upgrade Java EE 7 Samples dependencies --- pom.xml | 48 +++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index ce09ab618..b4ef546b1 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ Java EE 7 Sample: javaee7-samples - 1.1.14.Final + 1.4.1.Final 1.7 3.0.0 UTF-8 @@ -125,7 +125,7 @@ com.h2database h2 - 1.4.195 + 1.4.197 fish.payara.arquillian @@ -160,13 +160,13 @@ org.hamcrest hamcrest-core - 1.3 + 2.1 test org.hamcrest hamcrest-library - 1.3 + 2.1 test @@ -200,13 +200,13 @@ xmlunit xmlunit - 1.5 + 1.6 test org.skyscreamer jsonassert - 1.2.1 + 1.5.0 test @@ -219,32 +219,42 @@ net.sourceforge.htmlunit htmlunit - 2.31 + 2.33 test rhino js - 1.7R1 + 1.7R2 test org.json json - 20131018 + 20180813 test com.jayway.awaitility awaitility - 1.6.0 + 1.7.0 + test + + + org.omnifaces + omniutils + 0.11 test - org.omnifaces - omniutils - 0.10 - test + jakarta.xml.bind + jakarta.xml.bind-api + 2.3.2 + + + org.glassfish.jaxb + jaxb-runtime + 2.3.2 @@ -263,7 +273,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.6.1 + 3.8.0 ${java.min.version} ${java.min.version} @@ -272,7 +282,7 @@ org.apache.maven.plugins maven-surefire-report-plugin - 2.19.1 + 3.0.0-M3 true true @@ -281,7 +291,7 @@ org.apache.maven.plugins maven-war-plugin - 3.0.0 + 3.2.2 true false @@ -322,12 +332,12 @@ org.apache.maven.plugins maven-enforcer-plugin - 1.3.1 + 3.0.0-M2 org.apache.maven.plugins maven-surefire-plugin - 2.19.1 + 3.0.0-M3 From 75a1e5b419394c29f235dea01fe2defbf15a3815 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Fri, 1 Mar 2019 14:26:18 +0100 Subject: [PATCH 072/117] Set minimal Java version for vendor EJB plug-ins --- ejb/remote/vendor/pom.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ejb/remote/vendor/pom.xml b/ejb/remote/vendor/pom.xml index cd94c328a..95cd16e31 100644 --- a/ejb/remote/vendor/pom.xml +++ b/ejb/remote/vendor/pom.xml @@ -11,9 +11,24 @@ 5.0 + 1.7 Java EE 7 Sample: ejb - remote - vendor + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${java.min.version} + ${java.min.version} + + + + From 74f5146fec873331f079880261a4d4dacb495307 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Fri, 1 Mar 2019 15:08:30 +0100 Subject: [PATCH 073/117] Updated JAX-WS Maven plug-in --- jaxws/jaxws-endpoint/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jaxws/jaxws-endpoint/pom.xml b/jaxws/jaxws-endpoint/pom.xml index 3067161f3..3894fbcc9 100644 --- a/jaxws/jaxws-endpoint/pom.xml +++ b/jaxws/jaxws-endpoint/pom.xml @@ -17,9 +17,9 @@ - org.jvnet.jax-ws-commons - jaxws-maven-plugin - 2.3 + com.helger.maven + jaxws-maven-plugin + 2.6 process-classes From 53e7772ef92f16c183450945ea7bef2b1987cd45 Mon Sep 17 00:00:00 2001 From: arjan Date: Mon, 4 Mar 2019 01:02:47 -0800 Subject: [PATCH 074/117] Set TLS to v1.2 for the EE 7 tests for now. Added auto-discovery of domain for Payara and GlassFish --- pom.xml | 2 +- .../clientcert/jce/SecureServletTest.java | 3 ++ .../clientcert/SecureServletTest.java | 3 ++ .../main/java/org/javaee7/CliCommands.java | 15 ++++-- .../java/org/javaee7/ServerOperations.java | 52 +++++++++++++++++-- 5 files changed, 66 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index b4ef546b1..aba4ea0fb 100644 --- a/pom.xml +++ b/pom.xml @@ -219,7 +219,7 @@ net.sourceforge.htmlunit htmlunit - 2.33 + 2.34.0 test diff --git a/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java b/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java index 4f49577ab..72c6aa4e8 100644 --- a/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java +++ b/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java @@ -101,6 +101,9 @@ public static WebArchive createDeployment() throws FileNotFoundException, IOExce // Create a new local key store containing the client private key and the certificate clientKeyStorePath = createTempJKSKeyStore(clientKeyPair.getPrivate(), clientCertificate); + // Only test TLS v1.2 for now + System.setProperty("jdk.tls.client.protocols", "TLSv1.2"); + // Enable to get detailed logging about the SSL handshake on the server if (System.getProperty("ssl.debug") != null) { diff --git a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java index f36e6e57e..0445d6e7c 100644 --- a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java +++ b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java @@ -102,6 +102,9 @@ public static WebArchive createDeployment() throws FileNotFoundException, IOExce System.out.println("Setting server SSL debug on"); addContainerSystemProperty("javax.net.debug", "ssl:handshake"); } + + // Only test TLS v1.2 for now + System.setProperty("jdk.tls.client.protocols", "TLSv1.2"); // Add the client certificate that we just generated to the trust store of the server. // That way the server will trust our certificate. diff --git a/test-utils/src/main/java/org/javaee7/CliCommands.java b/test-utils/src/main/java/org/javaee7/CliCommands.java index 1540800b9..ee1604726 100644 --- a/test-utils/src/main/java/org/javaee7/CliCommands.java +++ b/test-utils/src/main/java/org/javaee7/CliCommands.java @@ -21,8 +21,12 @@ public class CliCommands { private static final Logger logger = Logger.getLogger(CliCommands.class.getName()); private static final String OS = System.getProperty("os.name").toLowerCase(); - + public static int payaraGlassFish(List cliCommands) { + return payaraGlassFish(cliCommands, null); + } + + public static int payaraGlassFish(List cliCommands, List output) { String gfHome = System.getProperty("glassfishRemote_gfHome"); if (gfHome == null) { @@ -60,6 +64,7 @@ public static int payaraGlassFish(List cliCommands) { return waitToFinish( readAllInput( + output, destroyAtShutDown( processBuilder.start()))); } catch (IOException e) { @@ -86,11 +91,15 @@ public void run() { return process; } - public static Process readAllInput(Process process) { + public static Process readAllInput(List output, Process process) { // Read any output from the process try (Scanner scanner = new Scanner(process.getInputStream())) { while (scanner.hasNextLine()) { - System.out.println(scanner.nextLine()); + String nextLine = scanner.nextLine(); + System.out.println(nextLine); + if (output != null) { + output.add(nextLine); + } } } diff --git a/test-utils/src/main/java/org/javaee7/ServerOperations.java b/test-utils/src/main/java/org/javaee7/ServerOperations.java index 7853430e6..adcbd85c6 100644 --- a/test-utils/src/main/java/org/javaee7/ServerOperations.java +++ b/test-utils/src/main/java/org/javaee7/ServerOperations.java @@ -91,9 +91,12 @@ public static void addCertificateToContainerTrustStore(Certificate clientCertifi logger.severe("glassfishRemote_gfHome at " + gfHome + " is not a directory"); return; } - - // TODO: support current domain + String domain = System.getProperty("payara_domain", "domain1"); + if (domain != null) { + domain = getPayaraDomainFromServer(); + logger.info("Using domain \"" + domain + "\" obtained from server. If this is not correct use -Dpayara_domain to override."); + } Path cacertsPath = gfHomePath.resolve("glassfish/domains/" + domain + "/config/cacerts.jks"); @@ -116,6 +119,8 @@ public static void addCertificateToContainerTrustStore(Certificate clientCertifi } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException | IOException e) { throw new IllegalStateException(e); } + + restartContainer(domain); } else { if (javaEEServer == null) { System.out.println("javaEEServer not specified"); @@ -124,7 +129,6 @@ public static void addCertificateToContainerTrustStore(Certificate clientCertifi } } - restartContainer(); } public static URL toContainerHttps(URL url) { @@ -167,6 +171,31 @@ public static URL toContainerHttps(URL url) { return null; } + private static String getPayaraDomainFromServer() { + System.out.println("Getting Payara domaain from server"); + + List output = new ArrayList<>(); + List cmd = new ArrayList<>(); + + cmd.add("list-domains"); + + CliCommands.payaraGlassFish(cmd, output); + + String domain = null; + for (String line : output) { + if (line.contains(" not running")) { + continue; + } + + if (line.endsWith(" running")) { + domain = line.substring(0, line.lastIndexOf(" running")); + break; + } + } + + return domain; + } + public static void addContainerSystemProperty(String key, String value) { String javaEEServer = System.getProperty("javaEEServer"); @@ -177,7 +206,7 @@ public static void addContainerSystemProperty(String key, String value) { List cmd = new ArrayList<>(); cmd.add("create-jvm-options"); - cmd.add("-D" + key + "=" + value); + cmd.add("-D" + key + "=\"" + value + "\""); CliCommands.payaraGlassFish(cmd); @@ -191,6 +220,10 @@ public static void addContainerSystemProperty(String key, String value) { } public static void restartContainer() { + restartContainer(null); + } + + public static void restartContainer(String domain) { // Arquillian connectors can stop/start already, but not on demand by code String javaEEServer = System.getProperty("javaEEServer"); @@ -203,7 +236,16 @@ public static void restartContainer() { cmd.add("restart-domain"); - cmd.add(System.getProperty("payara_domain", "domain1")); + String restartDomain = domain; + if (restartDomain == null) { + restartDomain = System.getProperty("payara_domain"); + } + + if (restartDomain == null) { + restartDomain = getPayaraDomainFromServer(); + } + + cmd.add(restartDomain); CliCommands.payaraGlassFish(cmd); From b938c99a3f512b25b0362d649dd81583e5c0c43a Mon Sep 17 00:00:00 2001 From: Patrik Dudits Date: Mon, 25 Mar 2019 15:44:23 +0100 Subject: [PATCH 075/117] Add converter to jpa-listeners-injection, as that breaks older versions of eclipselink --- .../org/javaee7/jpa/listeners/Language.java | 8 ++++ .../jpa/listeners/LanguageConverter.java | 40 +++++++++++++++++++ .../java/org/javaee7/jpa/listeners/Movie.java | 2 + .../src/main/resources/META-INF/create.sql | 2 +- 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 jpa/listeners-injection/src/main/java/org/javaee7/jpa/listeners/Language.java create mode 100644 jpa/listeners-injection/src/main/java/org/javaee7/jpa/listeners/LanguageConverter.java diff --git a/jpa/listeners-injection/src/main/java/org/javaee7/jpa/listeners/Language.java b/jpa/listeners-injection/src/main/java/org/javaee7/jpa/listeners/Language.java new file mode 100644 index 000000000..3bd675da9 --- /dev/null +++ b/jpa/listeners-injection/src/main/java/org/javaee7/jpa/listeners/Language.java @@ -0,0 +1,8 @@ +package org.javaee7.jpa.listeners; + +/** + * @author Patrik Dudits + */ +public enum Language { + ENGLISH, GERMAN; +} diff --git a/jpa/listeners-injection/src/main/java/org/javaee7/jpa/listeners/LanguageConverter.java b/jpa/listeners-injection/src/main/java/org/javaee7/jpa/listeners/LanguageConverter.java new file mode 100644 index 000000000..8ffdf949d --- /dev/null +++ b/jpa/listeners-injection/src/main/java/org/javaee7/jpa/listeners/LanguageConverter.java @@ -0,0 +1,40 @@ +package org.javaee7.jpa.listeners; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + +/** + * The presence of a converter causes injection to fail in Eclipselink 2.7.4 + * @author Patrik Dudits + */ +@Converter(autoApply = true) +public class LanguageConverter implements AttributeConverter { + @Override + public String convertToDatabaseColumn(Language attribute) { + if (attribute == null) { + return "Unknown"; + } + switch (attribute) { + case ENGLISH: + return "en"; + case GERMAN: + return "de"; + } + return null; + } + + @Override + public Language convertToEntityAttribute(String dbData) { + if (dbData == null) { + return null; + } + switch (dbData) { + case "en": + return Language.ENGLISH; + case "de": + return Language.GERMAN; + default: + return null; + } + } +} diff --git a/jpa/listeners-injection/src/main/java/org/javaee7/jpa/listeners/Movie.java b/jpa/listeners-injection/src/main/java/org/javaee7/jpa/listeners/Movie.java index b3b7e5d7d..54d2373b5 100644 --- a/jpa/listeners-injection/src/main/java/org/javaee7/jpa/listeners/Movie.java +++ b/jpa/listeners-injection/src/main/java/org/javaee7/jpa/listeners/Movie.java @@ -41,6 +41,8 @@ public class Movie implements Serializable { @Transient private Integer rating; + private Language language; + public Movie() { } diff --git a/jpa/listeners-injection/src/main/resources/META-INF/create.sql b/jpa/listeners-injection/src/main/resources/META-INF/create.sql index 00a37e63a..ac2ac3210 100644 --- a/jpa/listeners-injection/src/main/resources/META-INF/create.sql +++ b/jpa/listeners-injection/src/main/resources/META-INF/create.sql @@ -1,2 +1,2 @@ -CREATE TABLE MOVIE_LISTENER("ID" INTEGER not null primary key, "NAME" VARCHAR(50) not null, "ACTORS" VARCHAR(200) not null) +CREATE TABLE MOVIE_LISTENER("ID" INTEGER not null primary key, "NAME" VARCHAR(50) not null, "ACTORS" VARCHAR(200) not null, "LANGUAGE" VARCHAR(12)) CREATE TABLE MOVIE_RATINGS("ID" INTEGER not null primary key, "NAME" VARCHAR(50) not null, "RATING" INTEGER not null) \ No newline at end of file From 05d4406548e2c1fca2e668b472abecdc6c8a4c74 Mon Sep 17 00:00:00 2001 From: Gaurav Gupta Date: Mon, 1 Apr 2019 22:51:22 +0530 Subject: [PATCH 076/117] PAYARA-3484 Add JAX-WS components --- jaxws/jaxws-client/pom.xml | 3 +-- jaxws/jaxws-endpoint/pom.xml | 3 +-- jaxws/pom.xml | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/jaxws/jaxws-client/pom.xml b/jaxws/jaxws-client/pom.xml index 8865e592b..ff847b7e3 100644 --- a/jaxws/jaxws-client/pom.xml +++ b/jaxws/jaxws-client/pom.xml @@ -17,9 +17,8 @@ - org.codehaus.mojo + com.helger.maven jaxws-maven-plugin - 1.11 generate-sources diff --git a/jaxws/jaxws-endpoint/pom.xml b/jaxws/jaxws-endpoint/pom.xml index 3894fbcc9..ad04ce619 100644 --- a/jaxws/jaxws-endpoint/pom.xml +++ b/jaxws/jaxws-endpoint/pom.xml @@ -18,8 +18,7 @@ com.helger.maven - jaxws-maven-plugin - 2.6 + jaxws-maven-plugin process-classes diff --git a/jaxws/pom.xml b/jaxws/pom.xml index f7a1e6d1f..bd4a806cf 100644 --- a/jaxws/pom.xml +++ b/jaxws/pom.xml @@ -24,9 +24,29 @@ ${project.version} test + + javax.xml.ws + jaxws-api + 2.3.1 + + + com.sun.xml.ws + jaxws-rt + 2.3.2 + + + + + com.helger.maven + jaxws-maven-plugin + 2.6 + + + + maven-surefire-plugin From ef22b2843e29437a66ba77fd9e61754b76e93caa Mon Sep 17 00:00:00 2001 From: Gaurav Gupta Date: Mon, 1 Apr 2019 23:00:31 +0530 Subject: [PATCH 077/117] PAYARA-3484 Polish EJB Remote - Vendor pom --- ejb/remote/vendor/pom.xml | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/ejb/remote/vendor/pom.xml b/ejb/remote/vendor/pom.xml index 95cd16e31..4d40903bd 100644 --- a/ejb/remote/vendor/pom.xml +++ b/ejb/remote/vendor/pom.xml @@ -2,33 +2,19 @@ - 4.0.0 + + 4.0.0 - org.javaee7 + + org.javaee7 + ejb-remote + 1.0-SNAPSHOT + + ejb-remote-vendor - 1.0-SNAPSHOT pom - - 5.0 - 1.7 - - Java EE 7 Sample: ejb - remote - vendor - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.0 - - ${java.min.version} - ${java.min.version} - - - - From 8c678511bf5496f7176258bb107188f888541c0f Mon Sep 17 00:00:00 2001 From: Gaurav Gupta Date: Wed, 17 Apr 2019 18:42:08 +0530 Subject: [PATCH 078/117] PAYARA-3484 jaxws-client testcase fix --- jaxws/pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jaxws/pom.xml b/jaxws/pom.xml index bd4a806cf..716c0c15c 100644 --- a/jaxws/pom.xml +++ b/jaxws/pom.xml @@ -28,11 +28,13 @@ javax.xml.ws jaxws-api 2.3.1 + test com.sun.xml.ws jaxws-rt 2.3.2 + test From 126e410d327c906788d7fc9f7467442b5b3fb655 Mon Sep 17 00:00:00 2001 From: Gaurav Gupta Date: Wed, 24 Apr 2019 16:40:02 +0530 Subject: [PATCH 079/117] PAYARA-3484 fix ci failure --- .gitignore | 2 +- jaxws/jaxws-client/pom.xml | 2 +- .../WEB-INF/wsdl/EBookStoreImplService.wsdl | 115 ++++++++++++++++++ .../wsdl/EBookStoreImplService_schema1.xsd | 92 ++++++++++++++ 4 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 jaxws/jaxws-client/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService.wsdl create mode 100644 jaxws/jaxws-client/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService_schema1.xsd diff --git a/.gitignore b/.gitignore index eada49815..ab19d6c16 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ target/ libs/ tmp/ node_modules/ -jaxws/jaxws-client/src/main/ +jaxws/jaxws-client/src/main/java jaxws/jaxws-endpoint/src/main/webapp/WEB-INF/wsdl/ # OS Files # diff --git a/jaxws/jaxws-client/pom.xml b/jaxws/jaxws-client/pom.xml index ff847b7e3..578d6cf70 100644 --- a/jaxws/jaxws-client/pom.xml +++ b/jaxws/jaxws-client/pom.xml @@ -28,7 +28,7 @@ org.javaee7.jaxws.client.gen - ../../../jaxws-endpoint/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService.wsdl + ${basedir}/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService.wsdl http://localhost:8080/jaxws-endpoint/EBookStoreImplService?wsdl true diff --git a/jaxws/jaxws-client/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService.wsdl b/jaxws/jaxws-client/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService.wsdl new file mode 100644 index 000000000..b90f97e63 --- /dev/null +++ b/jaxws/jaxws-client/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService.wsdl @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jaxws/jaxws-client/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService_schema1.xsd b/jaxws/jaxws-client/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService_schema1.xsd new file mode 100644 index 000000000..b18b382cd --- /dev/null +++ b/jaxws/jaxws-client/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService_schema1.xsd @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 127aaba07606f11dcd2626b7a99e1041229973cc Mon Sep 17 00:00:00 2001 From: Juan Gonzalez Date: Thu, 25 Apr 2019 12:48:32 +0200 Subject: [PATCH 080/117] Upgrade Thorntail with JDK 11 support --- .../main/webapp/WEB-INF/jboss-deployment-structure.xml | 10 ++++++++++ .../org/javaee7/ejb/timer/AutomaticTimerBeanTest.java | 5 ++++- .../ejb/timer/MultipleScheduleTimerBeanTest.java | 5 ++++- .../javaee7/ejb/timer/ProgrammaticTimerBeanTest.java | 6 +++++- .../org/javaee7/ejb/timer/SchedulesTimerBeanTest.java | 5 ++++- pom.xml | 2 +- 6 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 ejb/timer/src/main/webapp/WEB-INF/jboss-deployment-structure.xml diff --git a/ejb/timer/src/main/webapp/WEB-INF/jboss-deployment-structure.xml b/ejb/timer/src/main/webapp/WEB-INF/jboss-deployment-structure.xml new file mode 100644 index 000000000..6d8132afe --- /dev/null +++ b/ejb/timer/src/main/webapp/WEB-INF/jboss-deployment-structure.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/ejb/timer/src/test/java/org/javaee7/ejb/timer/AutomaticTimerBeanTest.java b/ejb/timer/src/test/java/org/javaee7/ejb/timer/AutomaticTimerBeanTest.java index de0c732e6..5d89a49e4 100644 --- a/ejb/timer/src/test/java/org/javaee7/ejb/timer/AutomaticTimerBeanTest.java +++ b/ejb/timer/src/test/java/org/javaee7/ejb/timer/AutomaticTimerBeanTest.java @@ -7,6 +7,8 @@ import static org.hamcrest.Matchers.is; import static org.javaee7.ejb.timer.WithinWindowMatcher.withinWindow; +import java.io.File; + import javax.inject.Inject; import org.jboss.arquillian.container.test.api.Deployment; @@ -35,7 +37,8 @@ public static WebArchive deploy() { .addAsLibraries(Maven.resolver().loadPomFromFile("pom.xml") .resolve("com.jayway.awaitility:awaitility") .withTransitivity().asFile()) - .addClasses(WithinWindowMatcher.class, Ping.class, PingsListener.class, AutomaticTimerBean.class); + .addClasses(WithinWindowMatcher.class, Ping.class, PingsListener.class, AutomaticTimerBean.class) + .addAsWebInfResource(new File("src/main/webapp/WEB-INF/jboss-deployment-structure.xml")); } @Test diff --git a/ejb/timer/src/test/java/org/javaee7/ejb/timer/MultipleScheduleTimerBeanTest.java b/ejb/timer/src/test/java/org/javaee7/ejb/timer/MultipleScheduleTimerBeanTest.java index ee10bd953..2adbff5af 100644 --- a/ejb/timer/src/test/java/org/javaee7/ejb/timer/MultipleScheduleTimerBeanTest.java +++ b/ejb/timer/src/test/java/org/javaee7/ejb/timer/MultipleScheduleTimerBeanTest.java @@ -9,6 +9,8 @@ import static org.javaee7.ejb.timer.WithinWindowMatcher.withinWindow; import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import java.io.File; + import javax.inject.Inject; import org.jboss.arquillian.container.test.api.Deployment; @@ -36,7 +38,8 @@ public static WebArchive deploy() { .addAsLibraries(Maven.resolver().loadPomFromFile("pom.xml") .resolve("com.jayway.awaitility:awaitility") .withTransitivity().asFile()) - .addClasses(WithinWindowMatcher.class, Ping.class, PingsListener.class, MultipleScheduleTimerBean.class); + .addClasses(WithinWindowMatcher.class, Ping.class, PingsListener.class, MultipleScheduleTimerBean.class) + .addAsWebInfResource(new File("src/main/webapp/WEB-INF/jboss-deployment-structure.xml")); } @Test diff --git a/ejb/timer/src/test/java/org/javaee7/ejb/timer/ProgrammaticTimerBeanTest.java b/ejb/timer/src/test/java/org/javaee7/ejb/timer/ProgrammaticTimerBeanTest.java index 6c8d1a8a7..d039f6bf1 100644 --- a/ejb/timer/src/test/java/org/javaee7/ejb/timer/ProgrammaticTimerBeanTest.java +++ b/ejb/timer/src/test/java/org/javaee7/ejb/timer/ProgrammaticTimerBeanTest.java @@ -8,6 +8,8 @@ import static org.javaee7.ejb.timer.WithinWindowMatcher.withinWindow; import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import java.io.File; + import javax.inject.Inject; import org.jboss.arquillian.container.test.api.Deployment; @@ -40,7 +42,9 @@ public static WebArchive deploy() { WithinWindowMatcher.class, Ping.class, PingsListener.class, - ProgrammaticTimerBean.class); + ProgrammaticTimerBean.class) + .addAsWebInfResource(new File("src/main/webapp/WEB-INF/jboss-deployment-structure.xml")); + } @Test diff --git a/ejb/timer/src/test/java/org/javaee7/ejb/timer/SchedulesTimerBeanTest.java b/ejb/timer/src/test/java/org/javaee7/ejb/timer/SchedulesTimerBeanTest.java index dd7788952..125515db4 100644 --- a/ejb/timer/src/test/java/org/javaee7/ejb/timer/SchedulesTimerBeanTest.java +++ b/ejb/timer/src/test/java/org/javaee7/ejb/timer/SchedulesTimerBeanTest.java @@ -9,6 +9,8 @@ import static org.javaee7.ejb.timer.WithinWindowMatcher.withinWindow; import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import java.io.File; + import javax.inject.Inject; import org.jboss.arquillian.container.test.api.Deployment; @@ -36,7 +38,8 @@ public static WebArchive deploy() { .addAsLibraries(Maven.resolver().loadPomFromFile("pom.xml") .resolve("com.jayway.awaitility:awaitility") .withTransitivity().asFile()) - .addClasses(WithinWindowMatcher.class, Ping.class, PingsListener.class, SchedulesTimerBean.class); + .addClasses(WithinWindowMatcher.class, Ping.class, PingsListener.class, SchedulesTimerBean.class) + .addAsWebInfResource(new File("src/main/webapp/WEB-INF/jboss-deployment-structure.xml")); } @Test diff --git a/pom.xml b/pom.xml index 9c292fe9f..13cf5d104 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ 4.1.1 16.0.0.4 13.0.0.Final - 2.0.0.Final + 2.4.0.Final 7.0.2 9.0.4 From 26f4a2585a5d78eb1120efb46918df8c50e186cb Mon Sep 17 00:00:00 2001 From: Alan Date: Mon, 29 Apr 2019 11:54:31 +0100 Subject: [PATCH 081/117] Removed payara.micro.version --- pom.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 13cf5d104..550719832 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,6 @@ --> 4.1.2.181 payaradomain - 5.182 5.0 4.1.1 16.0.0.4 @@ -482,10 +481,10 @@ fish.payara.extras payara-micro - ${payara.micro.version} + ${payara.version} false ${session.executionRootDirectory}/target/ - payara-micro-${payara.micro.version}.jar + payara-micro-${payara.version}.jar @@ -498,7 +497,7 @@ ${skipEAR} - ${session.executionRootDirectory}/target/payara-micro-${payara.micro.version}.jar + ${session.executionRootDirectory}/target/payara-micro-${payara.version}.jar From ad7dd9451cd5f028da6bb751944c7c02a5096203 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 30 Apr 2019 12:17:00 +0200 Subject: [PATCH 082/117] Suppport both RFC 2253 and 1779 as EE doesn't describe one. --- .../servlet/security/clientcert/SecureServletTest.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java index 0445d6e7c..858e11c46 100644 --- a/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java +++ b/servlet/security-clientcert/src/test/java/org/javaee7/servlet/security/clientcert/SecureServletTest.java @@ -186,7 +186,13 @@ public void testGetWithCorrectCredentials() throws Exception { log.info(page.getContent()); - assertTrue("my GET", page.getContent().contains("principal C=UK, ST=lak, L=zak, O=kaz, OU=bar, CN=lfoo")); + assertTrue("my GET", + // RFC 1779 + page.getContent().contains("principal C=UK, ST=lak, L=zak, O=kaz, OU=bar, CN=lfoo") || + + // RFC 2253 + page.getContent().contains("principal C=UK,ST=lak,L=zak,O=kaz,OU=bar,CN=lfoo") + ); } catch (Exception e) { e.printStackTrace(); throw e; From 17484fe4b296ae589793c64c4968e892045a11b5 Mon Sep 17 00:00:00 2001 From: arjan Date: Fri, 3 May 2019 22:31:07 +0200 Subject: [PATCH 083/117] Updates and comments for running on JDK 11 --- pom.xml | 6 +- .../clientcert/jce/SecureServletTest.java | 64 +++++++++++++++++++ .../java/org/javaee7/ServerOperations.java | 10 ++- 3 files changed, 74 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 13cf5d104..bdce149a0 100644 --- a/pom.xml +++ b/pom.xml @@ -136,12 +136,12 @@ org.bouncycastle bcprov-jdk15on - 1.59 + 1.61 org.bouncycastle bcpkix-jdk15on - 1.59 + 1.61 @@ -229,7 +229,7 @@ net.sourceforge.htmlunit htmlunit - 2.34.0 + 2.35.0 test diff --git a/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java b/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java index 72c6aa4e8..e93f0dfff 100644 --- a/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java +++ b/servlet/security-clientcert-jce/src/test/java/org/javaee7/servlet/security/clientcert/jce/SecureServletTest.java @@ -66,6 +66,10 @@ public class SecureServletTest { private static Logger log = Logger.getLogger(SecureServletTest.class.getName()); private static final String WEBAPP_SRC = "src/main/webapp"; + +// static { +// Security.insertProviderAt(new BouncyCastleProvider(), 1); +// } @ArquillianResource private URL base; @@ -76,6 +80,31 @@ public class SecureServletTest { @Deployment(testable = false) public static WebArchive createDeployment() throws FileNotFoundException, IOException { + + // Note for JDK 11+, the server needs to be run with a sufficiently new version of JDK 11 or 12. + // Older versions throw this exception: + + // java.lang.UnsupportedOperationException: Not supported yet. + // at java.base/sun.security.ssl.HandshakeHash$CloneableHash.archived(HandshakeHash.java:616) + // at java.base/sun.security.ssl.HandshakeHash$T12HandshakeHash.archived(HandshakeHash.java:546) + // at java.base/sun.security.ssl.HandshakeHash.archived(HandshakeHash.java:188) + // at java.base/sun.security.ssl.CertificateVerify$T12CertificateVerifyMessage.(CertificateVerify.java:650) + // at java.base/sun.security.ssl.CertificateVerify$T12CertificateVerifyConsumer.consume(CertificateVerify.java:771) + // at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392) + // at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:448) + // at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1065) + // at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1052) + // at java.base/java.security.AccessController.doPrivileged(Native Method) + // at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:999) + + // See https://bugs.openjdk.java.net/browse/JDK-8214098 + + // Works: + // OpenJDK Runtime Environment Zulu11.31+11-CA (build 11.0.3+7-LTS) + + // Doesn't work: + // openjdk version "11.0.3" 2019-04-16 + // OpenJDK Runtime Environment (build 11.0.3+7-Ubuntu-1ubuntu1) System.out.println("\n*********** DEPLOYMENT START ***************************"); @@ -134,6 +163,12 @@ public void setup() throws FileNotFoundException, IOException { System.out.println("\n*********** SETUP START ***************************"); + String algorithms = Security.getProperty("jdk.tls.disabledAlgorithms"); + + // PSS can't be used with JDK11 and 12, will likely be fixed in JDK13 + // See https://bugs.openjdk.java.net/browse/JDK-8216039 + Security.setProperty("jdk.tls.disabledAlgorithms", algorithms + " ,RSASSA-PSS"); + webClient = new WebClient(); // First get the HTTPS URL for which the server is listening @@ -177,6 +212,8 @@ public void setup() throws FileNotFoundException, IOException { // Client -> Server : the key store's private keys and certificates are used to sign // and sent a reply to the server webClient.getOptions().setSSLClientCertificate(new File(clientKeyStorePath).toURI().toURL(), "changeit", "jks"); + webClient.getOptions().setTimeout(0); + // First do a request to install Bouncy Castle as provider // This is a normal HTTP request and doesn't use certificate authentication @@ -193,6 +230,31 @@ public void tearDown() throws IOException { log.log(INFO, "Bouncy Castle provider removed: {0}", pageb.getContent()); webClient.getCookieManager().clearCookies(); + + // Internally throws: + // + // TransportContext.java:313|Fatal (INTERNAL_ERROR): closing inbound before receiving peer's close_notify ( + // "throwable" : { + // javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify + // at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:133) + // at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117) + // at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:308) + // at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264) + // at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:255) + // at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:645) + // at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:624) + // at org.apache.http.impl.BHttpConnectionBase.close(BHttpConnectionBase.java:325) + // at org.apache.http.impl.conn.LoggingManagedHttpClientConnection.close(LoggingManagedHttpClientConnection.java:81) + // at org.apache.http.impl.conn.CPoolEntry.closeConnection(CPoolEntry.java:70) + // at org.apache.http.impl.conn.CPoolEntry.close(CPoolEntry.java:96) + // at org.apache.http.pool.AbstractConnPool.shutdown(AbstractConnPool.java:148) + // at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.shutdown(PoolingHttpClientConnectionManager.java:411) + // at com.gargoylesoftware.htmlunit.HttpWebConnection.close(HttpWebConnection.java:1011) + // + // Visible when -Dssl.debug is used + // + // Should be fixed in JDK11.03, but isn't? + // See https://stackoverflow.com/questions/52016415/jdk-11-ssl-error-on-valid-certificate-working-in-previous-versions webClient.close(); System.out.println("\n*********** TEST END ***************************\n"); } @@ -201,6 +263,8 @@ public void tearDown() throws IOException { public void testGetWithCorrectCredentials() throws Exception { System.out.println("\n*********** TEST START ***************************\n"); + + Security.insertProviderAt(new BouncyCastleProvider(), 1); try { diff --git a/test-utils/src/main/java/org/javaee7/ServerOperations.java b/test-utils/src/main/java/org/javaee7/ServerOperations.java index adcbd85c6..714d1fe19 100644 --- a/test-utils/src/main/java/org/javaee7/ServerOperations.java +++ b/test-utils/src/main/java/org/javaee7/ServerOperations.java @@ -110,7 +110,7 @@ public static void addCertificateToContainerTrustStore(Certificate clientCertifi KeyStore keyStore = null; try (InputStream in = new FileInputStream(cacertsPath.toAbsolutePath().toFile())) { - keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); + keyStore = KeyStore.getInstance("JKS"); keyStore.load(in, "changeit".toCharArray()); keyStore.setCertificateEntry("arquillianClientTestCert", clientCertificate); @@ -172,7 +172,7 @@ public static URL toContainerHttps(URL url) { } private static String getPayaraDomainFromServer() { - System.out.println("Getting Payara domaain from server"); + System.out.println("Getting Payara domain from server"); List output = new ArrayList<>(); List cmd = new ArrayList<>(); @@ -187,12 +187,16 @@ private static String getPayaraDomainFromServer() { continue; } - if (line.endsWith(" running")) { + if (line.contains(" running")) { domain = line.substring(0, line.lastIndexOf(" running")); break; } } + if (domain == null) { + throw new IllegalStateException("Running domain could not be obtained for target Payara. Please specify explicitly using -Dpayara_domain"); + } + return domain; } From bd91605542baef5c78c180110ffa0abd7e250e4b Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 16 May 2019 15:45:30 +0200 Subject: [PATCH 084/117] Clarified and updated JAX-WS samples and added EJB variant Signed-off-by: arjantijms --- jaxws/jaxws-client/README.md | 2 + jaxws/jaxws-client/pom.xml | 24 ++++++- .../client/EBookStoreClientSampleTest.java | 26 +++----- jaxws/jaxws-endpoint-ejb/pom.xml | 36 +++++++++++ .../jaxws/endpoint/ejb/EBookStore.java | 22 +++++++ .../jaxws/endpoint/ejb/EBookStoreImpl.java | 22 +++++++ .../javaee7/jaxws/endpoint/ejb/SomeEJB.java | 18 ++++++ .../jaxws/endpoint/ejb/EBookStoreTest.java | 64 +++++++++++++++++++ jaxws/jaxws-endpoint/pom.xml | 25 +------- .../javaee7/jaxws/endpoint/EBookStore.java | 10 +-- .../jaxws/endpoint/EBookStoreImpl.java | 3 +- .../jaxws/endpoint/EBookStoreTest.java | 24 +++---- jaxws/pom.xml | 2 +- 13 files changed, 214 insertions(+), 64 deletions(-) create mode 100644 jaxws/jaxws-client/README.md create mode 100644 jaxws/jaxws-endpoint-ejb/pom.xml create mode 100644 jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/EBookStore.java create mode 100644 jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreImpl.java create mode 100644 jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/SomeEJB.java create mode 100644 jaxws/jaxws-endpoint-ejb/src/test/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreTest.java diff --git a/jaxws/jaxws-client/README.md b/jaxws/jaxws-client/README.md new file mode 100644 index 000000000..bf6b5ca41 --- /dev/null +++ b/jaxws/jaxws-client/README.md @@ -0,0 +1,2 @@ +This JAX-WS sample generated Java service class from a .wsdl file, deploys the endpoint war generated by javaee7-samples/jaxws/jaxws-endpoint +and then tests against that. \ No newline at end of file diff --git a/jaxws/jaxws-client/pom.xml b/jaxws/jaxws-client/pom.xml index 578d6cf70..94b71f3be 100644 --- a/jaxws/jaxws-client/pom.xml +++ b/jaxws/jaxws-client/pom.xml @@ -1,13 +1,12 @@ - - 4.0.0 + 4.0.0 org.javaee7 jaxws 1.0-SNAPSHOT - ../pom.xml + jaxws-jaxws-client war Java EE 7 Sample: jaxws - jaxws-client @@ -23,14 +22,33 @@ generate-sources + wsimport org.javaee7.jaxws.client.gen + + + + + ${basedir}/src/main/webapp/WEB-INF/wsdl/EBookStoreImplService.wsdl + http://localhost:8080/jaxws-endpoint/EBookStoreImplService?wsdl + true ${basedir}/src/main/java 2.1 diff --git a/jaxws/jaxws-client/src/test/java/org/javaee7/jaxws/client/EBookStoreClientSampleTest.java b/jaxws/jaxws-client/src/test/java/org/javaee7/jaxws/client/EBookStoreClientSampleTest.java index 471fe053a..9d63e4ff7 100644 --- a/jaxws/jaxws-client/src/test/java/org/javaee7/jaxws/client/EBookStoreClientSampleTest.java +++ b/jaxws/jaxws-client/src/test/java/org/javaee7/jaxws/client/EBookStoreClientSampleTest.java @@ -1,6 +1,7 @@ package org.javaee7.jaxws.client; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.runners.MethodSorters.NAME_ASCENDING; import java.net.MalformedURLException; import java.net.URL; @@ -12,35 +13,29 @@ import org.javaee7.jaxws.client.gen.EBook; import org.javaee7.jaxws.client.gen.EBookStore; import org.javaee7.jaxws.client.gen.EBookStoreImplService; - import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; -import org.jboss.shrinkwrap.resolver.api.maven.archive.importer.MavenImporter; -import org.jboss.shrinkwrap.api.spec.WebArchive; -import org.jboss.shrinkwrap.api.ArchivePaths; import org.jboss.shrinkwrap.api.ShrinkWrap; - +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.jboss.shrinkwrap.resolver.api.maven.archive.importer.MavenImporter; import org.junit.Before; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; /** * @author Fermin Gallego */ @RunWith(Arquillian.class) -@FixMethodOrder(MethodSorters.NAME_ASCENDING) +@FixMethodOrder(NAME_ASCENDING) public class EBookStoreClientSampleTest { + + @ArquillianResource + private URL url; + private static EBookStoreImplService eBookStoreService; - /** - * Method for creating and deploying the war file from 'jaxws-endpoint' project, - * which contains the web service to be tested. - * - * @return a war file - */ @Deployment(testable = false) public static WebArchive createDeployment() { return ShrinkWrap.create(MavenImporter.class) @@ -49,9 +44,6 @@ public static WebArchive createDeployment() { .as(WebArchive.class); } - @ArquillianResource - private URL url; - @Before public void setUp() throws Exception { eBookStoreService = new EBookStoreImplService( diff --git a/jaxws/jaxws-endpoint-ejb/pom.xml b/jaxws/jaxws-endpoint-ejb/pom.xml new file mode 100644 index 000000000..16e0c9db2 --- /dev/null +++ b/jaxws/jaxws-endpoint-ejb/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + + + org.javaee7 + jaxws + 1.0-SNAPSHOT + + + jaxws-jaxws-endpoint-ejb + war + Java EE 7 Sample: jaxws - jaxws-endpoint - EJB + + + jaxws-endpoint-ejb + + + + + org.eclipse.microprofile.opentracing + microprofile-opentracing-api + 1.0 + provided + + + + io.opentracing + opentracing-api + 0.30.0 + provided + + + diff --git a/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/EBookStore.java b/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/EBookStore.java new file mode 100644 index 000000000..26900d4fe --- /dev/null +++ b/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/EBookStore.java @@ -0,0 +1,22 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.jaxws.endpoint.ejb; + +import static javax.jws.soap.SOAPBinding.Style.RPC; + +import javax.jws.WebMethod; +import javax.jws.WebService; +import javax.jws.soap.SOAPBinding; + +/** + * + * @author Fermin Gallego + * @author Arjan Tijms + * + */ +@WebService +@SOAPBinding(style = RPC) +public interface EBookStore { + + @WebMethod + String welcomeMessage(String name); +} diff --git a/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreImpl.java b/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreImpl.java new file mode 100644 index 000000000..29a2ebb66 --- /dev/null +++ b/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreImpl.java @@ -0,0 +1,22 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.jaxws.endpoint.ejb; + +import javax.ejb.Stateless; +import javax.jws.WebService; + +/** + * + * @author Fermin Gallego + * @author Arjan Tijms + * + */ +@Stateless +@WebService(endpointInterface = "org.javaee7.jaxws.endpoint.EBookStore") +public class EBookStoreImpl implements EBookStore { + + @Override + public String welcomeMessage(String name) { + return "Welcome to EBookStore WebService, Mr/Mrs " + name; + } + +} diff --git a/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/SomeEJB.java b/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/SomeEJB.java new file mode 100644 index 000000000..0c191b60c --- /dev/null +++ b/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/SomeEJB.java @@ -0,0 +1,18 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.jaxws.endpoint.ejb; + +import javax.ejb.Stateless; + +/** + * + * @author Arjan Tijms + * + */ +@Stateless +public class SomeEJB { + + public void someMethod() { + + } + +} diff --git a/jaxws/jaxws-endpoint-ejb/src/test/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreTest.java b/jaxws/jaxws-endpoint-ejb/src/test/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreTest.java new file mode 100644 index 000000000..42c3fc3b6 --- /dev/null +++ b/jaxws/jaxws-endpoint-ejb/src/test/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreTest.java @@ -0,0 +1,64 @@ +/** Copyright Payara Services Limited **/ +package org.javaee7.jaxws.endpoint.ejb; + +import static org.junit.Assert.assertEquals; +import static org.junit.runners.MethodSorters.NAME_ASCENDING; + +import java.net.MalformedURLException; +import java.net.URL; + +import javax.xml.namespace.QName; +import javax.xml.ws.Service; + +import org.javaee7.jaxws.endpoint.ejb.EBookStore; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Before; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * @author Fermin Gallego + * @author Arjan Tijms + */ +@RunWith(Arquillian.class) +@FixMethodOrder(NAME_ASCENDING) +public class EBookStoreTest { + + @ArquillianResource + private URL url; + + private URL rootUrl; + + private static Service eBookStoreService; + + @Deployment(testable = false) + public static WebArchive createDeployment() { + return ShrinkWrap.create(WebArchive.class). + addPackage("org.javaee7.jaxws.endpoint"); + } + + @Before + public void setupClass() throws MalformedURLException { + rootUrl = new URL(url.getProtocol(), url.getHost(), url.getPort(), ""); + + eBookStoreService = Service.create( + // The WSDL file used to create this service is fetched from the application we deployed + // above using the createDeployment() method. + new URL(rootUrl, "EBookStoreImplService/EBookStoreImpl?wsdl"), + new QName("http://endpoint.jaxws.javaee7.org/", "EBookStoreImplService")); + } + + @Test + public void test1WelcomeMessage() throws MalformedURLException { + assertEquals( + "Welcome to EBookStore WebService, Mr/Mrs Johnson", + eBookStoreService.getPort(EBookStore.class).welcomeMessage("Johnson")); + } + + +} diff --git a/jaxws/jaxws-endpoint/pom.xml b/jaxws/jaxws-endpoint/pom.xml index ad04ce619..7bd2d39fc 100644 --- a/jaxws/jaxws-endpoint/pom.xml +++ b/jaxws/jaxws-endpoint/pom.xml @@ -1,38 +1,17 @@ - - 4.0.0 + 4.0.0 org.javaee7 jaxws 1.0-SNAPSHOT - ../pom.xml + jaxws-jaxws-endpoint war Java EE 7 Sample: jaxws - jaxws-endpoint jaxws-endpoint - - - - com.helger.maven - jaxws-maven-plugin - - - process-classes - - wsgen - - - org.javaee7.jaxws.endpoint.EBookStoreImpl - true - ${basedir}/src/main/webapp/WEB-INF/wsdl - - - - - diff --git a/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStore.java b/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStore.java index 3ca54e02d..76f47b2de 100644 --- a/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStore.java +++ b/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStore.java @@ -14,17 +14,17 @@ public interface EBookStore { @WebMethod - public String welcomeMessage(String name); + String welcomeMessage(String name); @WebMethod - public List findEBooks(String text); + List findEBooks(String text); @WebMethod - public EBook takeBook(String title); + EBook takeBook(String title); @WebMethod - public void saveBook(EBook eBook); + void saveBook(EBook eBook); @WebMethod - public EBook addAppendix(EBook eBook, int appendixPages); + EBook addAppendix(EBook eBook, int appendixPages); } diff --git a/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStoreImpl.java b/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStoreImpl.java index d029daaff..fd3b2bd5c 100644 --- a/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStoreImpl.java +++ b/jaxws/jaxws-endpoint/src/main/java/org/javaee7/jaxws/endpoint/EBookStoreImpl.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.jws.WebService; @@ -16,7 +17,7 @@ serviceName = "EBookStoreImplService") public class EBookStoreImpl implements EBookStore { - private HashMap eBookCollection = new HashMap(); + private Map eBookCollection = new HashMap<>(); @Override public String welcomeMessage(String name) { diff --git a/jaxws/jaxws-endpoint/src/test/java/org/javaee7/jaxws/endpoint/EBookStoreTest.java b/jaxws/jaxws-endpoint/src/test/java/org/javaee7/jaxws/endpoint/EBookStoreTest.java index ac383c12f..12c93e940 100644 --- a/jaxws/jaxws-endpoint/src/test/java/org/javaee7/jaxws/endpoint/EBookStoreTest.java +++ b/jaxws/jaxws-endpoint/src/test/java/org/javaee7/jaxws/endpoint/EBookStoreTest.java @@ -1,6 +1,8 @@ package org.javaee7.jaxws.endpoint; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.runners.MethodSorters.NAME_ASCENDING; import java.net.MalformedURLException; import java.net.URL; @@ -9,8 +11,6 @@ import javax.xml.namespace.QName; import javax.xml.ws.Service; -import org.javaee7.jaxws.endpoint.EBook; -import org.javaee7.jaxws.endpoint.EBookStore; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; @@ -20,35 +20,30 @@ import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; /** * @author Fermin Gallego */ @RunWith(Arquillian.class) -@FixMethodOrder(MethodSorters.NAME_ASCENDING) +@FixMethodOrder(NAME_ASCENDING) public class EBookStoreTest { + + @ArquillianResource + private URL url; private static Service eBookStoreService; - /** - * Arquillian specific method for creating a file which can be deployed - * while executing the test. - * - * @return a war file - */ @Deployment(testable = false) public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class). addPackage("org.javaee7.jaxws.endpoint"); } - @ArquillianResource - private URL url; - @Before public void setupClass() throws MalformedURLException { eBookStoreService = Service.create( + // The WSDL file used to create this service is fetched from the application we deployed + // above using the createDeployment() method. new URL(url, "EBookStoreImplService?wsdl"), new QName("http://endpoint.jaxws.javaee7.org/", "EBookStoreImplService")); } @@ -63,6 +58,7 @@ public void test1WelcomeMessage() throws MalformedURLException { @Test public void test2SaveAndTakeBook() throws MalformedURLException { EBookStore eBookStore = eBookStoreService.getPort(EBookStore.class); + EBook eBook = new EBook(); eBook.setTitle("The Lord of the Rings"); eBook.setNumPages(1178); diff --git a/jaxws/pom.xml b/jaxws/pom.xml index 716c0c15c..84686e4cb 100644 --- a/jaxws/pom.xml +++ b/jaxws/pom.xml @@ -7,13 +7,13 @@ 1.0-SNAPSHOT - org.javaee7 jaxws pom Java EE 7 Sample: jaxws jaxws-endpoint + jaxws-endpoint-ejb jaxws-client From 526118a5e2e0fcb6f5243cef51aeb4b711a5f01b Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 16 May 2019 23:26:43 +0200 Subject: [PATCH 085/117] Adjusted package name references for JAX-WS EJB sample Signed-off-by: arjantijms --- .../jaxws/endpoint/ejb/EBookStoreImpl.java | 2 +- .../javaee7/jaxws/endpoint/ejb/SomeEJB.java | 18 --------------- .../jaxws/endpoint/ejb/EBookStoreTest.java | 4 ++-- .../jaxws/endpoint/EBookStoreTest.java | 22 +++++++++---------- 4 files changed, 14 insertions(+), 32 deletions(-) delete mode 100644 jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/SomeEJB.java diff --git a/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreImpl.java b/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreImpl.java index 29a2ebb66..426996f75 100644 --- a/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreImpl.java +++ b/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreImpl.java @@ -11,7 +11,7 @@ * */ @Stateless -@WebService(endpointInterface = "org.javaee7.jaxws.endpoint.EBookStore") +@WebService(endpointInterface = "org.javaee7.jaxws.endpoint.ejb.EBookStore") public class EBookStoreImpl implements EBookStore { @Override diff --git a/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/SomeEJB.java b/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/SomeEJB.java deleted file mode 100644 index 0c191b60c..000000000 --- a/jaxws/jaxws-endpoint-ejb/src/main/java/org/javaee7/jaxws/endpoint/ejb/SomeEJB.java +++ /dev/null @@ -1,18 +0,0 @@ -/** Copyright Payara Services Limited **/ -package org.javaee7.jaxws.endpoint.ejb; - -import javax.ejb.Stateless; - -/** - * - * @author Arjan Tijms - * - */ -@Stateless -public class SomeEJB { - - public void someMethod() { - - } - -} diff --git a/jaxws/jaxws-endpoint-ejb/src/test/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreTest.java b/jaxws/jaxws-endpoint-ejb/src/test/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreTest.java index 42c3fc3b6..269d8653f 100644 --- a/jaxws/jaxws-endpoint-ejb/src/test/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreTest.java +++ b/jaxws/jaxws-endpoint-ejb/src/test/java/org/javaee7/jaxws/endpoint/ejb/EBookStoreTest.java @@ -39,7 +39,7 @@ public class EBookStoreTest { @Deployment(testable = false) public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class). - addPackage("org.javaee7.jaxws.endpoint"); + addPackage("org.javaee7.jaxws.endpoint.ejb"); } @Before @@ -50,7 +50,7 @@ public void setupClass() throws MalformedURLException { // The WSDL file used to create this service is fetched from the application we deployed // above using the createDeployment() method. new URL(rootUrl, "EBookStoreImplService/EBookStoreImpl?wsdl"), - new QName("http://endpoint.jaxws.javaee7.org/", "EBookStoreImplService")); + new QName("http://ejb.endpoint.jaxws.javaee7.org/", "EBookStoreImplService")); } @Test diff --git a/jaxws/jaxws-endpoint/src/test/java/org/javaee7/jaxws/endpoint/EBookStoreTest.java b/jaxws/jaxws-endpoint/src/test/java/org/javaee7/jaxws/endpoint/EBookStoreTest.java index 12c93e940..08f5e3f61 100644 --- a/jaxws/jaxws-endpoint/src/test/java/org/javaee7/jaxws/endpoint/EBookStoreTest.java +++ b/jaxws/jaxws-endpoint/src/test/java/org/javaee7/jaxws/endpoint/EBookStoreTest.java @@ -85,15 +85,15 @@ public void test3FindEbooks() { assertEquals("The Lord of the Rings", titleList.get(0)); } - @Test - public void test4AddAppendix() { - EBookStore eBookStore = eBookStoreService.getPort(EBookStore.class); - EBook eBook = eBookStore.takeBook("Oliver Twist"); - - assertEquals(268, eBook.getNumPages()); - EBook eBookResponse = eBookStore.addAppendix(eBook, 5); - - assertEquals(268, eBook.getNumPages()); - assertEquals(273, eBookResponse.getNumPages()); - } +// @Test +// public void test4AddAppendix() { +// EBookStore eBookStore = eBookStoreService.getPort(EBookStore.class); +// EBook eBook = eBookStore.takeBook("Oliver Twist"); +// +// assertEquals(268, eBook.getNumPages()); +// EBook eBookResponse = eBookStore.addAppendix(eBook, 5); +// +// assertEquals(268, eBook.getNumPages()); +// assertEquals(273, eBookResponse.getNumPages()); +// } } From e443e15b4c53175595fb69354c5e82345b7744d0 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Fri, 14 Jun 2019 00:42:26 +0200 Subject: [PATCH 086/117] Moved to Google Docs/JavaFx sample to Javaee-extra project Signed-off-by: arjantijms --- websocket/google-docs/client/pom.xml | 78 ---------------- .../googledocs/client/GoogleDocClient.java | 90 ------------------- websocket/google-docs/pom.xml | 20 ----- websocket/google-docs/readme.asciidoc | 7 -- websocket/google-docs/server/pom.xml | 15 ---- .../googledocs/server/GoogleDocServer.java | 35 -------- .../server/src/main/webapp/index.html | 16 ---- 7 files changed, 261 deletions(-) delete mode 100644 websocket/google-docs/client/pom.xml delete mode 100644 websocket/google-docs/client/src/main/java/org/javaee7/websocket/googledocs/client/GoogleDocClient.java delete mode 100644 websocket/google-docs/pom.xml delete mode 100644 websocket/google-docs/readme.asciidoc delete mode 100644 websocket/google-docs/server/pom.xml delete mode 100644 websocket/google-docs/server/src/main/java/org/javaee7/websocket/googledocs/server/GoogleDocServer.java delete mode 100644 websocket/google-docs/server/src/main/webapp/index.html diff --git a/websocket/google-docs/client/pom.xml b/websocket/google-docs/client/pom.xml deleted file mode 100644 index f7f78de86..000000000 --- a/websocket/google-docs/client/pom.xml +++ /dev/null @@ -1,78 +0,0 @@ - - 4.0.0 - - org.javaee7.websocket.google-docs - google-docs-sample - 1.0-SNAPSHOT - ../pom.xml - - - org.javaee7.websocket.google-docs - client - 1.0-SNAPSHOT - jar - - - 1.8-ea-b123 - ${java.home}/lib/jfxrt.jar - - - - - io.undertow - undertow-core - 1.0.16.Final - - - io.undertow - undertow-websockets-jsr - 1.0.16.Final - - - javax - javaee-api - 7.0 - - - com.oracle - javafx - ${javafx.version} - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - 2.5 - - - - true - org.javaee7.websocket.googledocs.client.GoogleDocClient - - - - - - org.codehaus.mojo - exec-maven-plugin - 1.2.1 - - - test - - java - - - org.javaee7.websocket.googledocs.client.GoogleDocClient - - - - - - - diff --git a/websocket/google-docs/client/src/main/java/org/javaee7/websocket/googledocs/client/GoogleDocClient.java b/websocket/google-docs/client/src/main/java/org/javaee7/websocket/googledocs/client/GoogleDocClient.java deleted file mode 100644 index beaf3ecca..000000000 --- a/websocket/google-docs/client/src/main/java/org/javaee7/websocket/googledocs/client/GoogleDocClient.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.javaee7.websocket.googledocs.client; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.logging.Level; -import java.util.logging.Logger; -import javafx.application.Application; -import javafx.application.Platform; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; -import javafx.scene.Scene; -import javafx.scene.control.TextArea; -import javafx.stage.Stage; - -import javax.websocket.ClientEndpoint; -import javax.websocket.ContainerProvider; -import javax.websocket.DeploymentException; -import javax.websocket.OnMessage; -import javax.websocket.OnOpen; -import javax.websocket.Session; -import javax.websocket.WebSocketContainer; - -/** - * @author Arun Gupta - */ -@ClientEndpoint -public class GoogleDocClient extends Application { - - static TextArea textarea; - - public static void main(String[] args) { - launch(args); - } - - @Override - public void start(Stage stage) throws Exception { - final Session session = connectToServer(); - System.out.println("Connected to server: " + session.getId()); - stage.setTitle("Google Docs Emulator using WebSocket"); - textarea = new TextArea(); - textarea.textProperty().addListener( - new ChangeListener() { - - @Override - public void changed(ObservableValue observable, String oldValue, String newValue) { - System.out.println("New value: " + newValue); - - try { - session.getBasicRemote().sendText(newValue); - } catch (IOException ex) { - Logger.getLogger(GoogleDocClient.class.getName()).log(Level.SEVERE, null, ex); - } - } - - } - ); - - textarea.setPrefSize(500, 300); - textarea.setWrapText(true); - Scene scene = new Scene(textarea); - stage.setScene(scene); - stage.show(); - } - - @OnOpen - public void onOpen(Session session) { - System.out.println("Connected to endpoint: " + session.getBasicRemote()); - } - - @OnMessage - public void onMessage(String message, Session session) throws IOException { - final String newMessage = message; - System.out.println("Received message in client: " + message); - Platform.runLater(new Runnable() { - @Override - public void run() { - textarea.setText(newMessage); - textarea.positionCaret(newMessage.length()); - } - }); - - } - - private Session connectToServer() throws URISyntaxException, DeploymentException, IOException { - WebSocketContainer container = ContainerProvider.getWebSocketContainer(); - return container.connectToServer(GoogleDocClient.class, new URI("ws://localhost:8080/server/websocket")); - } - -} diff --git a/websocket/google-docs/pom.xml b/websocket/google-docs/pom.xml deleted file mode 100644 index 588e2eeb0..000000000 --- a/websocket/google-docs/pom.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - 4.0.0 - - org.javaee7.websocket - websocket-samples - 1.0-SNAPSHOT - ../pom.xml - - - org.javaee7.websocket.google-docs - google-docs-sample - pom - Java EE 7 WebSocket Google Docs - - - server - client - - diff --git a/websocket/google-docs/readme.asciidoc b/websocket/google-docs/readme.asciidoc deleted file mode 100644 index d4724315c..000000000 --- a/websocket/google-docs/readme.asciidoc +++ /dev/null @@ -1,7 +0,0 @@ -Install JavaFX library locally: - -[source,text] ----- -mvn install:install-file -Dfile=$JAVA_HOME/jre/lib/ext/jfxrt.jar -DgroupId=com.oracle -DartifactId=javafx -Dversion=1.8-ea-b123 -Dpackaging=jar ----- - diff --git a/websocket/google-docs/server/pom.xml b/websocket/google-docs/server/pom.xml deleted file mode 100644 index 563e7b957..000000000 --- a/websocket/google-docs/server/pom.xml +++ /dev/null @@ -1,15 +0,0 @@ - - 4.0.0 - - org.javaee7.websocket.google-docs - google-docs-sample - 1.0-SNAPSHOT - ../pom.xml - - - org.javaee7.websocket.google-docs - server - 1.0-SNAPSHOT - war - diff --git a/websocket/google-docs/server/src/main/java/org/javaee7/websocket/googledocs/server/GoogleDocServer.java b/websocket/google-docs/server/src/main/java/org/javaee7/websocket/googledocs/server/GoogleDocServer.java deleted file mode 100644 index 2e9406037..000000000 --- a/websocket/google-docs/server/src/main/java/org/javaee7/websocket/googledocs/server/GoogleDocServer.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.javaee7.websocket.googledocs.server; - -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.websocket.EncodeException; -import javax.websocket.OnMessage; -import javax.websocket.OnOpen; -import javax.websocket.Session; -import javax.websocket.server.ServerEndpoint; - -/** - * @author Arun Gupta - */ -@ServerEndpoint(value = "/websocket") -public class GoogleDocServer { - - private static final Logger LOGGER = Logger.getLogger(GoogleDocServer.class.getName()); - - @OnOpen - public void onOpen(Session client) { - LOGGER.log(Level.INFO, "connected"); - } - - @OnMessage - public void broadcastText(String text, Session session) throws IOException, EncodeException { - LOGGER.log(Level.INFO, "broadcastText: {0}", text); - for (Session peer : session.getOpenSessions()) { - if (!peer.equals(session)) { - peer.getBasicRemote().sendText(text); - } - } - } -} diff --git a/websocket/google-docs/server/src/main/webapp/index.html b/websocket/google-docs/server/src/main/webapp/index.html deleted file mode 100644 index f9e46ee14..000000000 --- a/websocket/google-docs/server/src/main/webapp/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Google Docs Server - - - - -

Google Docs Server
- - From e4737e68f295a265baa67a892fa3201f43fb6a7c Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 15 Oct 2019 20:03:36 +0200 Subject: [PATCH 087/117] Update Travis file to use OpenJDK Signed-off-by: arjantijms --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6b0499ba1..d5babc431 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ sudo: false language: java jdk: - - oraclejdk8 + - openjdk8 env: - TESTFOLDER=batch - TESTFOLDER=cdi From 2c1ccfb970dbcd59590e0866b1ae1f8d18728f0c Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 5 Nov 2019 17:08:52 +0100 Subject: [PATCH 088/117] Some cleanup of the Servlet samples Added test for cookie sample Signed-off-by: arjantijms --- servlet/async-servlet/pom.xml | 7 +- .../javaee7/servlet/async/MyAsyncServlet.java | 38 +++--- servlet/cookies/pom.xml | 2 + .../servlet/cookies/ClientCookieServlet.java | 114 ++++++++++++++++++ .../javaee7/servlet/cookies/TestServlet.java | 42 +++---- .../servlet/cookies/SimpleServletTest.java | 78 ++++++++++++ servlet/error-mapping/pom.xml | 2 + servlet/event-listeners/pom.xml | 2 + servlet/file-upload/pom.xml | 2 + servlet/metadata-complete/pom.xml | 2 + servlet/nonblocking/pom.xml | 2 + servlet/pom.xml | 19 +-- servlet/programmatic-registration/pom.xml | 2 + servlet/protocol-handler/pom.xml | 2 + servlet/resource-packaging/pom.xml | 2 + servlet/security-annotated/pom.xml | 21 ++-- servlet/security-basicauth-omission/pom.xml | 19 +-- servlet/security-basicauth/pom.xml | 19 +-- servlet/security-clientcert-jce/pom.xml | 4 +- servlet/security-clientcert/pom.xml | 4 +- servlet/security-deny-uncovered/pom.xml | 19 ++- servlet/security-digest/pom.xml | 35 +++--- servlet/security-form-based/pom.xml | 18 +-- servlet/security-programmatic/pom.xml | 5 +- servlet/servlet-filters/pom.xml | 2 + .../javaee7/servlet/filters/FooBarFilter.java | 46 ++++--- .../javaee7/servlet/filters/TestServlet.java | 10 +- .../servlet/filters/FilterServletTest.java | 54 +++++---- servlet/simple-servlet/pom.xml | 7 +- .../javaee7/servlet/simple/SimpleServlet.java | 10 +- .../metadata/complete/SimpleServletTest.java | 16 +-- servlet/web-fragment/pom.xml | 2 + 32 files changed, 413 insertions(+), 194 deletions(-) create mode 100644 servlet/cookies/src/main/java/org/javaee7/servlet/cookies/ClientCookieServlet.java create mode 100644 servlet/cookies/src/test/java/org/javaee7/servlet/cookies/SimpleServletTest.java diff --git a/servlet/async-servlet/pom.xml b/servlet/async-servlet/pom.xml index e940bdd18..64f60a48e 100644 --- a/servlet/async-servlet/pom.xml +++ b/servlet/async-servlet/pom.xml @@ -1,6 +1,5 @@ - + 4.0.0 @@ -8,9 +7,9 @@ servlet 1.0-SNAPSHOT - + servlet-async-servlet war - + Java EE 7 Sample: servlet - async-servlet diff --git a/servlet/async-servlet/src/main/java/org/javaee7/servlet/async/MyAsyncServlet.java b/servlet/async-servlet/src/main/java/org/javaee7/servlet/async/MyAsyncServlet.java index c8db9f77c..a340f5161 100644 --- a/servlet/async-servlet/src/main/java/org/javaee7/servlet/async/MyAsyncServlet.java +++ b/servlet/async-servlet/src/main/java/org/javaee7/servlet/async/MyAsyncServlet.java @@ -39,6 +39,8 @@ */ package org.javaee7.servlet.async; +import java.io.IOException; + import javax.annotation.Resource; import javax.enterprise.concurrent.ManagedExecutorService; import javax.servlet.AsyncContext; @@ -49,7 +51,6 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; /** * @author Arun Gupta @@ -57,24 +58,23 @@ @WebServlet(urlPatterns = "/MyAsyncServlet", asyncSupported = true) public class MyAsyncServlet extends HttpServlet { - // @Resource(lookup="java:comp/DefaultManagedExecutorService") + private static final long serialVersionUID = 3709640331218336841L; + @Resource ManagedExecutorService executor; /** - * Processes requests for both HTTP GET and POST - * methods. + * Processes requests for both HTTP GET and POST methods. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ - protected void processRequest(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - AsyncContext ac = request.startAsync(); + protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + AsyncContext asyncContext = request.startAsync(); - ac.addListener(new AsyncListener() { + asyncContext.addListener(new AsyncListener() { @Override public void onComplete(AsyncEvent event) throws IOException { event.getSuppliedResponse().getWriter().println("onComplete"); @@ -96,29 +96,29 @@ public void onStartAsync(AsyncEvent event) throws IOException { event.getSuppliedResponse().getWriter().println("onStartAsync"); } }); - executor.submit(new MyAsyncService(ac)); + + executor.submit(new MyAsyncService(asyncContext)); } class MyAsyncService implements Runnable { - AsyncContext ac; + AsyncContext asyncContext; - public MyAsyncService(AsyncContext ac) { - this.ac = ac; + public MyAsyncService(AsyncContext asyncContext) { + this.asyncContext = asyncContext; } @Override public void run() { try { - ac.getResponse().getWriter().println("Running inside MyAsyncService"); + asyncContext.getResponse().getWriter().println("Running inside MyAsyncService"); } catch (IOException e) { throw new IllegalStateException(e); } - ac.complete(); + asyncContext.complete(); } } - // /** * Handles the HTTP GET method. * @@ -128,8 +128,7 @@ public void run() { * @throws IOException if an I/O error occurs */ @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } @@ -142,8 +141,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) * @throws IOException if an I/O error occurs */ @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } @@ -155,5 +153,5 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) @Override public String getServletInfo() { return "Short description"; - }// + } } diff --git a/servlet/cookies/pom.xml b/servlet/cookies/pom.xml index 9bd042110..f3981cade 100644 --- a/servlet/cookies/pom.xml +++ b/servlet/cookies/pom.xml @@ -8,9 +8,11 @@ 1.0-SNAPSHOT ../pom.xml + org.javaee7 servlet-cookies 1.0-SNAPSHOT war + Java EE 7 Sample: servlet - cookies diff --git a/servlet/cookies/src/main/java/org/javaee7/servlet/cookies/ClientCookieServlet.java b/servlet/cookies/src/main/java/org/javaee7/servlet/cookies/ClientCookieServlet.java new file mode 100644 index 000000000..9805b8459 --- /dev/null +++ b/servlet/cookies/src/main/java/org/javaee7/servlet/cookies/ClientCookieServlet.java @@ -0,0 +1,114 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html + * or packager/legal/LICENSE.txt. See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at packager/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * Oracle designates this particular file as subject to the "Classpath" + * exception as provided by Oracle in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +package org.javaee7.servlet.cookies; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Arun Gupta + */ +@WebServlet(urlPatterns = { "/ClientCookieServlet" }) +public class ClientCookieServlet extends HttpServlet { + + private static final long serialVersionUID = -1944396991856607131L; + + /** + * Processes requests for both HTTP GET and POST methods. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setContentType("text/html;charset=UTF-8"); + + try (PrintWriter out = response.getWriter()) { + out.println(""); + out.println(""); + out.println(""); + out.println("Servlet ClientCookieServlet"); + out.println(""); + out.println(""); + out.println("

Servlet ClientCookieServlet at " + request.getContextPath() + "

"); + + + out.println(""); + + out.println(""); + out.println(""); + } + } + + /** + * Handles the HTTP GET method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + processRequest(request, response); + } + + /** + * Handles the HTTP POST method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + processRequest(request, response); + } +} diff --git a/servlet/cookies/src/main/java/org/javaee7/servlet/cookies/TestServlet.java b/servlet/cookies/src/main/java/org/javaee7/servlet/cookies/TestServlet.java index e1beb39a5..1ad92047e 100644 --- a/servlet/cookies/src/main/java/org/javaee7/servlet/cookies/TestServlet.java +++ b/servlet/cookies/src/main/java/org/javaee7/servlet/cookies/TestServlet.java @@ -41,9 +41,8 @@ import java.io.IOException; import java.io.PrintWriter; + import javax.servlet.ServletException; -import javax.servlet.SessionCookieConfig; -import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; @@ -54,21 +53,21 @@ * @author Arun Gupta */ @WebServlet(urlPatterns = { "/TestServlet" }) -@MultipartConfig(location = "/tmp") public class TestServlet extends HttpServlet { + private static final long serialVersionUID = -1944396991856607131L; + /** - * Processes requests for both HTTP GET and POST - * methods. + * Processes requests for both HTTP GET and POST methods. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ - protected void processRequest(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); + try (PrintWriter out = response.getWriter()) { out.println(""); out.println(""); @@ -77,33 +76,36 @@ protected void processRequest(HttpServletRequest request, HttpServletResponse re out.println(""); out.println(""); out.println("

Servlet TestServlet at " + request.getContextPath() + "

"); - SessionCookieConfig cookies = request.getServletContext().getSessionCookieConfig(); - out.println("Found cookie: " + cookies.getName()); + + if (request.getCookies() != null) { + for (Cookie cookie : request.getCookies()) { + out.println("Found cookie: " + cookie.getName()); + } + } + // General cookie Cookie cookie = new Cookie("myCookieKey", "myCookieValue"); cookie.setMaxAge(60); response.addCookie(cookie); + out.println("

Set a new cookie"); + // Http only cookie cookie = new Cookie("myHttpOnlyCookieKey", "myHttpOnlyCookieValue"); cookie.setHttpOnly(true); cookie.setMaxAge(60); response.addCookie(cookie); + out.println("
Set a new HTTPOnly Cookie

"); out.println("Check what cookies are visible by"); - out.println("clicking here"); + out.println("clicking here"); out.println(""); out.println(""); } } - // /** * Handles the HTTP GET method. * @@ -113,8 +115,7 @@ protected void processRequest(HttpServletRequest request, HttpServletResponse re * @throws IOException if an I/O error occurs */ @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } @@ -127,8 +128,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) * @throws IOException if an I/O error occurs */ @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } @@ -140,6 +140,6 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) @Override public String getServletInfo() { return "Short description"; - }// + } } diff --git a/servlet/cookies/src/test/java/org/javaee7/servlet/cookies/SimpleServletTest.java b/servlet/cookies/src/test/java/org/javaee7/servlet/cookies/SimpleServletTest.java new file mode 100644 index 000000000..b9e1344cb --- /dev/null +++ b/servlet/cookies/src/test/java/org/javaee7/servlet/cookies/SimpleServletTest.java @@ -0,0 +1,78 @@ +package org.javaee7.servlet.cookies; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.net.URL; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.xml.sax.SAXException; + +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.html.HtmlPage; + +/** + * @author Arjan Tijms + */ +@RunWith(Arquillian.class) +public class SimpleServletTest { + + @ArquillianResource + private URL base; + + private WebClient webClient; + + @Deployment(testable = false) + public static WebArchive createDeployment() { + return ShrinkWrap.create(WebArchive.class) + .addClasses(TestServlet.class, ClientCookieServlet.class); + } + + @Before + public void setup() { + webClient = new WebClient(); + } + + @Test + public void testCookies() throws IOException, SAXException { + HtmlPage page = webClient.getPage(base + "TestServlet"); + + assertFalse(page.asText().contains("Found cookie: myCookieKey Found cookie: myHttpOnlyCookieKey")); + + // Request page again, should now send cookies back + page = webClient.getPage(base + "TestServlet"); + + assertTrue(page.asText().contains("Found cookie: myCookieKey Found cookie: myHttpOnlyCookieKey")); + + page = webClient.getPage(base + "ClientCookieServlet"); + webClient.waitForBackgroundJavaScript(1000); + + System.out.println(page.asText()); + + } + + @Test + public void testHttpOnlyCookies() throws IOException, SAXException { + HtmlPage page = webClient.getPage(base + "TestServlet"); + + assertFalse(page.asText().contains("Found cookie: myCookieKey Found cookie: myHttpOnlyCookieKey")); + + // Request page with client-side script, should now be able to read cookies client-side + page = webClient.getPage(base + "ClientCookieServlet"); + webClient.waitForBackgroundJavaScript(1000); + + assertTrue(page.asText().contains("myCookieKey")); + assertFalse(page.asText().contains("myHttpOnlyCookieKey")); + + System.out.println(page.asText()); + } + +} diff --git a/servlet/error-mapping/pom.xml b/servlet/error-mapping/pom.xml index 0a10ffe60..3f8c317d1 100644 --- a/servlet/error-mapping/pom.xml +++ b/servlet/error-mapping/pom.xml @@ -8,9 +8,11 @@ 1.0-SNAPSHOT ../pom.xml + org.javaee7 servlet-error-mapping 1.0-SNAPSHOT war + Java EE 7 Sample: servlet - error-mapping
diff --git a/servlet/event-listeners/pom.xml b/servlet/event-listeners/pom.xml index 90543ed06..21b5f3b2e 100644 --- a/servlet/event-listeners/pom.xml +++ b/servlet/event-listeners/pom.xml @@ -8,9 +8,11 @@ 1.0-SNAPSHOT ../pom.xml + org.javaee7 servlet-event-listeners 1.0-SNAPSHOT war + Java EE 7 Sample: servlet - event-listeners
diff --git a/servlet/file-upload/pom.xml b/servlet/file-upload/pom.xml index 44d680ccc..138088586 100644 --- a/servlet/file-upload/pom.xml +++ b/servlet/file-upload/pom.xml @@ -8,9 +8,11 @@ 1.0-SNAPSHOT ../pom.xml + org.javaee7 servlet-file-upload 1.0-SNAPSHOT war + Java EE 7 Sample: servlet - file-upload
diff --git a/servlet/metadata-complete/pom.xml b/servlet/metadata-complete/pom.xml index cf6ab3a63..3385b53a0 100644 --- a/servlet/metadata-complete/pom.xml +++ b/servlet/metadata-complete/pom.xml @@ -8,9 +8,11 @@ 1.0-SNAPSHOT ../pom.xml + org.javaee7 servlet-metadata-complete 1.0-SNAPSHOT war + Java EE 7 Sample: servlet - metadata-complete
diff --git a/servlet/nonblocking/pom.xml b/servlet/nonblocking/pom.xml index 071e5e798..3a169d6b5 100644 --- a/servlet/nonblocking/pom.xml +++ b/servlet/nonblocking/pom.xml @@ -8,9 +8,11 @@ 1.0-SNAPSHOT ../pom.xml + org.javaee7 servlet-nonblocking 1.0-SNAPSHOT war + Java EE 7 Sample: servlet - nonblocking
diff --git a/servlet/pom.xml b/servlet/pom.xml index 802416e4f..872dd15f9 100644 --- a/servlet/pom.xml +++ b/servlet/pom.xml @@ -1,18 +1,19 @@ - 4.0.0 + + 4.0.0 - + org.javaee7 samples-parent 1.0-SNAPSHOT - - servlet - pom - - Java EE 7 Sample: servlet - + servlet + pom + + Java EE 7 Sample: servlet + + simple-servlet async-servlet servlet-filters @@ -39,7 +40,7 @@ security-basicauth-omission - + org.javaee7 test-utils diff --git a/servlet/programmatic-registration/pom.xml b/servlet/programmatic-registration/pom.xml index 6abec3004..88b8a5aad 100644 --- a/servlet/programmatic-registration/pom.xml +++ b/servlet/programmatic-registration/pom.xml @@ -8,8 +8,10 @@ 1.0-SNAPSHOT ../pom.xml + org.javaee7 servlet-programmatic-registration war + Java EE 7 Sample: servlet - programmatic-registration diff --git a/servlet/protocol-handler/pom.xml b/servlet/protocol-handler/pom.xml index 4cd9f2198..733bddf27 100644 --- a/servlet/protocol-handler/pom.xml +++ b/servlet/protocol-handler/pom.xml @@ -8,9 +8,11 @@ 1.0-SNAPSHOT ../pom.xml + org.javaee7 servlet-protocol-handler 1.0-SNAPSHOT war + Java EE 7 Sample: servlet - protocol-handler diff --git a/servlet/resource-packaging/pom.xml b/servlet/resource-packaging/pom.xml index b1ddf7528..9ad606524 100644 --- a/servlet/resource-packaging/pom.xml +++ b/servlet/resource-packaging/pom.xml @@ -8,9 +8,11 @@ 1.0-SNAPSHOT ../pom.xml + org.javaee7 servlet-resource-packaging 1.0-SNAPSHOT war + Java EE 7 Sample: servlet - resource-packaging
diff --git a/servlet/security-annotated/pom.xml b/servlet/security-annotated/pom.xml index 6b4c5877e..c33b70c41 100644 --- a/servlet/security-annotated/pom.xml +++ b/servlet/security-annotated/pom.xml @@ -1,18 +1,19 @@ - 4.0.0 - - + + 4.0.0 + + org.javaee7 - servlet + servlet 1.0-SNAPSHOT - security-annotated - war - - Java EE 7 Sample: servlet - security-annotated - - + security-annotated + war + + Java EE 7 Sample: servlet - security-annotated + + payara-micro-managed diff --git a/servlet/security-basicauth-omission/pom.xml b/servlet/security-basicauth-omission/pom.xml index 64d2f4e6b..660e50e17 100644 --- a/servlet/security-basicauth-omission/pom.xml +++ b/servlet/security-basicauth-omission/pom.xml @@ -1,17 +1,19 @@ - 4.0.0 + + 4.0.0 - + org.javaee7 servlet 1.0-SNAPSHOT - - servlet-security-basicauth-omission - war - Java EE 7 Sample: servlet - security-basicauth-omission - - + + servlet-security-basicauth-omission + war + + Java EE 7 Sample: servlet - security-basicauth-omission + + payara-micro-managed @@ -34,5 +36,4 @@ - diff --git a/servlet/security-basicauth/pom.xml b/servlet/security-basicauth/pom.xml index de632d638..c0a327fe2 100644 --- a/servlet/security-basicauth/pom.xml +++ b/servlet/security-basicauth/pom.xml @@ -1,18 +1,19 @@ - 4.0.0 + + 4.0.0 - + org.javaee7 servlet 1.0-SNAPSHOT - - servlet-security-basicauth - war - - Java EE 7 Sample: servlet - security-basicauth - - + + servlet-security-basicauth + war + + Java EE 7 Sample: servlet - security-basicauth + + payara-micro-managed diff --git a/servlet/security-clientcert-jce/pom.xml b/servlet/security-clientcert-jce/pom.xml index 860c1ce6c..9e985b8a7 100644 --- a/servlet/security-clientcert-jce/pom.xml +++ b/servlet/security-clientcert-jce/pom.xml @@ -1,6 +1,5 @@ - + 4.0.0 @@ -40,5 +39,4 @@ - diff --git a/servlet/security-clientcert/pom.xml b/servlet/security-clientcert/pom.xml index cc15ea24b..ceee567c8 100644 --- a/servlet/security-clientcert/pom.xml +++ b/servlet/security-clientcert/pom.xml @@ -1,6 +1,5 @@ - + 4.0.0 @@ -40,5 +39,4 @@ - diff --git a/servlet/security-deny-uncovered/pom.xml b/servlet/security-deny-uncovered/pom.xml index d3dd691a0..16a0dd1df 100644 --- a/servlet/security-deny-uncovered/pom.xml +++ b/servlet/security-deny-uncovered/pom.xml @@ -1,18 +1,19 @@ - 4.0.0 + + 4.0.0 - + org.javaee7 servlet 1.0-SNAPSHOT - - servlet-security-deny-uncovered - war - - Java EE 7 Sample: servlet - security-deny-uncovered - + servlet-security-deny-uncovered + war + + Java EE 7 Sample: servlet - security-deny-uncovered + + payara-micro-managed @@ -35,6 +36,4 @@ - - diff --git a/servlet/security-digest/pom.xml b/servlet/security-digest/pom.xml index bd3e6878b..1347f78eb 100644 --- a/servlet/security-digest/pom.xml +++ b/servlet/security-digest/pom.xml @@ -1,18 +1,27 @@ - 4.0.0 + + 4.0.0 - + org.javaee7 servlet 1.0-SNAPSHOT - - servlet-security-digest - war - - Java EE 7 Sample: servlet - security-digest - + servlet-security-digest + war + + Java EE 7 Sample: servlet - security-digest + + + + commons-codec + commons-codec + 1.11 + + + + org.apache.maven.plugins @@ -30,15 +39,7 @@ - - - commons-codec - commons-codec - 1.11 - - - - + payara-micro-managed diff --git a/servlet/security-form-based/pom.xml b/servlet/security-form-based/pom.xml index d0e4dabe8..e4126eb3c 100644 --- a/servlet/security-form-based/pom.xml +++ b/servlet/security-form-based/pom.xml @@ -1,17 +1,19 @@ - 4.0.0 + + 4.0.0 - + org.javaee7 servlet 1.0-SNAPSHOT - - servlet-security-form-based - war - Java EE 7 Sample: servlet - security-form-based - - + + servlet-security-form-based + war + + Java EE 7 Sample: servlet - security-form-based + + payara-micro-managed diff --git a/servlet/security-programmatic/pom.xml b/servlet/security-programmatic/pom.xml index 87df3cf45..5548cbd47 100644 --- a/servlet/security-programmatic/pom.xml +++ b/servlet/security-programmatic/pom.xml @@ -7,10 +7,10 @@ servlet 1.0-SNAPSHOT - + servlet-security-programmatic war - + Java EE 7 Sample: servlet - security-programmatic @@ -36,5 +36,4 @@ - diff --git a/servlet/servlet-filters/pom.xml b/servlet/servlet-filters/pom.xml index aaa5cf172..bb21b456a 100644 --- a/servlet/servlet-filters/pom.xml +++ b/servlet/servlet-filters/pom.xml @@ -8,7 +8,9 @@ 1.0-SNAPSHOT ../pom.xml + servlet-servlet-filters war + Java EE 7 Sample: servlet - servlet-filters diff --git a/servlet/servlet-filters/src/main/java/org/javaee7/servlet/filters/FooBarFilter.java b/servlet/servlet-filters/src/main/java/org/javaee7/servlet/filters/FooBarFilter.java index 34359ce7b..0f6b525c9 100644 --- a/servlet/servlet-filters/src/main/java/org/javaee7/servlet/filters/FooBarFilter.java +++ b/servlet/servlet-filters/src/main/java/org/javaee7/servlet/filters/FooBarFilter.java @@ -39,6 +39,9 @@ */ package org.javaee7.servlet.filters; +import java.io.IOException; +import java.io.PrintWriter; + import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -47,8 +50,6 @@ import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; /** * @author Arun Gupta @@ -57,30 +58,16 @@ public class FooBarFilter implements Filter { private FilterConfig filterConfig; - - private void doBeforeProcessing(ServletRequest request, ServletResponse response) - throws IOException, ServletException { - try (PrintWriter out = response.getWriter()) { - out.print("foo--"); - out.flush(); - } - } - - private void doAfterProcessing(ServletRequest request, ServletResponse response) - throws IOException, ServletException { - try (PrintWriter out = response.getWriter()) { - out.print("--bar"); - out.flush(); - } + + @Override + public void init(FilterConfig filterConfig) { + this.filterConfig = filterConfig; } @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) - throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { PrintWriter out = response.getWriter(); - CharResponseWrapper wrappedResponse = new CharResponseWrapper( - (HttpServletResponse) response); + CharResponseWrapper wrappedResponse = new CharResponseWrapper((HttpServletResponse) response); doBeforeProcessing(request, wrappedResponse); chain.doFilter(request, wrappedResponse); @@ -92,10 +79,19 @@ public void doFilter(ServletRequest request, ServletResponse response, @Override public void destroy() { } + + private void doBeforeProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException { + try (PrintWriter out = response.getWriter()) { + out.print("foo--"); + out.flush(); + } + } - @Override - public void init(FilterConfig filterConfig) { - this.filterConfig = filterConfig; + private void doAfterProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException { + try (PrintWriter out = response.getWriter()) { + out.print("--bar"); + out.flush(); + } } } diff --git a/servlet/servlet-filters/src/main/java/org/javaee7/servlet/filters/TestServlet.java b/servlet/servlet-filters/src/main/java/org/javaee7/servlet/filters/TestServlet.java index 7101b9ec6..a4e9bf3aa 100644 --- a/servlet/servlet-filters/src/main/java/org/javaee7/servlet/filters/TestServlet.java +++ b/servlet/servlet-filters/src/main/java/org/javaee7/servlet/filters/TestServlet.java @@ -39,13 +39,14 @@ */ package org.javaee7.servlet.filters; +import java.io.IOException; +import java.io.PrintWriter; + import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; /** * @author Kuba Marchwicki @@ -53,9 +54,10 @@ @WebServlet(urlPatterns = { "/TestServlet", "/filtered/TestServlet" }) public class TestServlet extends HttpServlet { + private static final long serialVersionUID = -1521781346816042757L; + @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); try (PrintWriter out = response.getWriter()) { out.print("bar"); diff --git a/servlet/servlet-filters/src/test/java/org/javaee7/servlet/filters/FilterServletTest.java b/servlet/servlet-filters/src/test/java/org/javaee7/servlet/filters/FilterServletTest.java index 6da88151e..721f6612c 100644 --- a/servlet/servlet-filters/src/test/java/org/javaee7/servlet/filters/FilterServletTest.java +++ b/servlet/servlet-filters/src/test/java/org/javaee7/servlet/filters/FilterServletTest.java @@ -1,33 +1,35 @@ package org.javaee7.servlet.filters; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; + +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.core.Response; + import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.WebArchive; -import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URL; - -import static org.hamcrest.CoreMatchers.*; - @RunWith(Arquillian.class) public class FilterServletTest { - @Deployment + @Deployment(testable = false) public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class) - .addClass(CharResponseWrapper.class) - .addClasses(TestServlet.class, FooBarFilter.class); + .addClasses( + CharResponseWrapper.class, + TestServlet.class, + FooBarFilter.class); } @ArquillianResource @@ -36,20 +38,24 @@ public static WebArchive createDeployment() { @Test @RunAsClient public void filtered_servlet_should_return_enhanced_foobar_text() throws MalformedURLException { - Client client = ClientBuilder.newClient(); - WebTarget target = client.target(URI.create(new URL(base, "filtered/TestServlet").toExternalForm())); - - Response response = target.request().get(); - Assert.assertThat(response.readEntity(String.class), is(equalTo("foo--bar--bar"))); + Response response = + ClientBuilder.newClient() + .target(URI.create(new URL(base, "filtered/TestServlet").toExternalForm())) + .request() + .get(); + + assertThat(response.readEntity(String.class), is(equalTo("foo--bar--bar"))); } @Test @RunAsClient public void standard_servlet_should_return_simple_text() throws MalformedURLException { - Client client = ClientBuilder.newClient(); - WebTarget target = client.target(URI.create(new URL(base, "TestServlet").toExternalForm())); - - Response response = target.request().get(); - Assert.assertThat(response.readEntity(String.class), is(equalTo("bar"))); + Response response = + ClientBuilder.newClient() + .target(URI.create(new URL(base, "TestServlet").toExternalForm())) + .request() + .get(); + + assertThat(response.readEntity(String.class), is(equalTo("bar"))); } } diff --git a/servlet/simple-servlet/pom.xml b/servlet/simple-servlet/pom.xml index 5a2d35483..1a54652f1 100644 --- a/servlet/simple-servlet/pom.xml +++ b/servlet/simple-servlet/pom.xml @@ -6,11 +6,10 @@ org.javaee7 servlet 1.0-SNAPSHOT - ../pom.xml - - org.javaee7 + + servlet-simple-servlet - 1.0-SNAPSHOT war + Java EE 7 Sample: servlet - simple-servlet
diff --git a/servlet/simple-servlet/src/main/java/org/javaee7/servlet/simple/SimpleServlet.java b/servlet/simple-servlet/src/main/java/org/javaee7/servlet/simple/SimpleServlet.java index 6f929c4ce..79687c40b 100644 --- a/servlet/simple-servlet/src/main/java/org/javaee7/servlet/simple/SimpleServlet.java +++ b/servlet/simple-servlet/src/main/java/org/javaee7/servlet/simple/SimpleServlet.java @@ -1,6 +1,7 @@ package org.javaee7.servlet.simple; import java.io.IOException; + import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -12,15 +13,16 @@ */ @WebServlet("/SimpleServlet") public class SimpleServlet extends HttpServlet { + + private static final long serialVersionUID = -8359235999619949424L; + @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().print("my GET"); } @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().print("my POST"); } } diff --git a/servlet/simple-servlet/src/test/java/org/javaee7/servlet/metadata/complete/SimpleServletTest.java b/servlet/simple-servlet/src/test/java/org/javaee7/servlet/metadata/complete/SimpleServletTest.java index 76829dd03..0e7e1eac7 100644 --- a/servlet/simple-servlet/src/test/java/org/javaee7/servlet/metadata/complete/SimpleServletTest.java +++ b/servlet/simple-servlet/src/test/java/org/javaee7/servlet/metadata/complete/SimpleServletTest.java @@ -1,24 +1,26 @@ package org.javaee7.servlet.metadata.complete; -import org.javaee7.servlet.simple.SimpleServlet; -import com.gargoylesoftware.htmlunit.HttpMethod; -import com.gargoylesoftware.htmlunit.TextPage; -import com.gargoylesoftware.htmlunit.WebClient; -import com.gargoylesoftware.htmlunit.WebRequest; -import java.io.File; +import static org.junit.Assert.assertEquals; + import java.io.IOException; import java.net.URL; + +import org.javaee7.servlet.simple.SimpleServlet; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.WebArchive; -import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.xml.sax.SAXException; +import com.gargoylesoftware.htmlunit.HttpMethod; +import com.gargoylesoftware.htmlunit.TextPage; +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.WebRequest; + /** * @author Arun Gupta */ diff --git a/servlet/web-fragment/pom.xml b/servlet/web-fragment/pom.xml index 224442afe..f639b7a4c 100644 --- a/servlet/web-fragment/pom.xml +++ b/servlet/web-fragment/pom.xml @@ -8,9 +8,11 @@ 1.0-SNAPSHOT ../pom.xml + org.javaee7 servlet-web-fragment 1.0-SNAPSHOT war + Java EE 7 Sample: servlet - web-fragment
From 857696766270e6dd237bf3303cbbf1cf1e135bc4 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 5 Nov 2019 21:08:23 +0100 Subject: [PATCH 089/117] Cleanup for Servlet error mapping and adding test Signed-off-by: arjantijms --- .../servlet/cookies/SimpleServletTest.java | 8 +-- servlet/error-mapping/pom.xml | 3 - .../servlet/error/mapping/ErrorServlet.java} | 48 ++++++++----- .../error/mapping/NotFoundServlet.java} | 49 +++++++++----- .../servlet/error/mapping/TestServlet.java | 47 ++----------- .../src/main/webapp/WEB-INF/web.xml | 16 ++--- .../error/mapping/ErrorMappingTest.java | 67 +++++++++++++++++++ 7 files changed, 141 insertions(+), 97 deletions(-) rename servlet/error-mapping/src/main/{webapp/error-404.jsp => java/org/javaee7/servlet/error/mapping/ErrorServlet.java} (67%) rename servlet/error-mapping/src/main/{webapp/error-exception.jsp => java/org/javaee7/servlet/error/mapping/NotFoundServlet.java} (67%) create mode 100644 servlet/error-mapping/src/test/java/org/javaee7/servlet/error/mapping/ErrorMappingTest.java diff --git a/servlet/cookies/src/test/java/org/javaee7/servlet/cookies/SimpleServletTest.java b/servlet/cookies/src/test/java/org/javaee7/servlet/cookies/SimpleServletTest.java index b9e1344cb..6f33dd018 100644 --- a/servlet/cookies/src/test/java/org/javaee7/servlet/cookies/SimpleServletTest.java +++ b/servlet/cookies/src/test/java/org/javaee7/servlet/cookies/SimpleServletTest.java @@ -51,12 +51,6 @@ public void testCookies() throws IOException, SAXException { page = webClient.getPage(base + "TestServlet"); assertTrue(page.asText().contains("Found cookie: myCookieKey Found cookie: myHttpOnlyCookieKey")); - - page = webClient.getPage(base + "ClientCookieServlet"); - webClient.waitForBackgroundJavaScript(1000); - - System.out.println(page.asText()); - } @Test @@ -69,6 +63,8 @@ public void testHttpOnlyCookies() throws IOException, SAXException { page = webClient.getPage(base + "ClientCookieServlet"); webClient.waitForBackgroundJavaScript(1000); + System.out.println(page.asText()); + assertTrue(page.asText().contains("myCookieKey")); assertFalse(page.asText().contains("myHttpOnlyCookieKey")); diff --git a/servlet/error-mapping/pom.xml b/servlet/error-mapping/pom.xml index 3f8c317d1..c4b8230e5 100644 --- a/servlet/error-mapping/pom.xml +++ b/servlet/error-mapping/pom.xml @@ -6,12 +6,9 @@ org.javaee7 servlet 1.0-SNAPSHOT - ../pom.xml - org.javaee7 servlet-error-mapping - 1.0-SNAPSHOT war Java EE 7 Sample: servlet - error-mapping diff --git a/servlet/error-mapping/src/main/webapp/error-404.jsp b/servlet/error-mapping/src/main/java/org/javaee7/servlet/error/mapping/ErrorServlet.java similarity index 67% rename from servlet/error-mapping/src/main/webapp/error-404.jsp rename to servlet/error-mapping/src/main/java/org/javaee7/servlet/error/mapping/ErrorServlet.java index c4ce2711e..2f0d9949d 100644 --- a/servlet/error-mapping/src/main/webapp/error-404.jsp +++ b/servlet/error-mapping/src/main/java/org/javaee7/servlet/error/mapping/ErrorServlet.java @@ -1,4 +1,3 @@ - -<%@page contentType="text/html" pageEncoding="UTF-8"%> - +package org.javaee7.servlet.error.mapping; - - - - Error Mapping Sample - 404 page not found - - -

Error Mapping Sample - 404 page not found

- - Go home. - - +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Arun Gupta + * @author Arjan Tijms + */ +@WebServlet("/error") +public class ErrorServlet extends HttpServlet { + + private static final long serialVersionUID = -3681304530279446784L; + + /** + * Handles the HTTP GET method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.getWriter().write("!error!"); + } + +} diff --git a/servlet/error-mapping/src/main/webapp/error-exception.jsp b/servlet/error-mapping/src/main/java/org/javaee7/servlet/error/mapping/NotFoundServlet.java similarity index 67% rename from servlet/error-mapping/src/main/webapp/error-exception.jsp rename to servlet/error-mapping/src/main/java/org/javaee7/servlet/error/mapping/NotFoundServlet.java index 72e67435e..5c6af4a73 100644 --- a/servlet/error-mapping/src/main/webapp/error-exception.jsp +++ b/servlet/error-mapping/src/main/java/org/javaee7/servlet/error/mapping/NotFoundServlet.java @@ -1,4 +1,3 @@ - -<%@page contentType="text/html" pageEncoding="UTF-8"%> - +package org.javaee7.servlet.error.mapping; - - - - Error Mapping Sample - Exception Mapping - - -

Error Mapping Sample - Exception Mapping

- - This page is shown when a java.lang.RuntimeException is thrown.

- - Go home. - - +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Arun Gupta + * @author Arjan Tijms + */ +@WebServlet("/notfound") +public class NotFoundServlet extends HttpServlet { + + private static final long serialVersionUID = -3681304530279446784L; + + /** + * Handles the HTTP GET method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.getWriter().write("!not found!"); + } +} diff --git a/servlet/error-mapping/src/main/java/org/javaee7/servlet/error/mapping/TestServlet.java b/servlet/error-mapping/src/main/java/org/javaee7/servlet/error/mapping/TestServlet.java index 45d9ee442..c1d45aa06 100644 --- a/servlet/error-mapping/src/main/java/org/javaee7/servlet/error/mapping/TestServlet.java +++ b/servlet/error-mapping/src/main/java/org/javaee7/servlet/error/mapping/TestServlet.java @@ -40,7 +40,7 @@ package org.javaee7.servlet.error.mapping; import java.io.IOException; -import java.io.PrintWriter; + import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -48,24 +48,12 @@ /** * @author Arun Gupta + * @author Arjan Tijms */ public class TestServlet extends HttpServlet { - /** - * Processes requests for both HTTP GET and POST - * methods. - * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs - */ - protected void processRequest(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - throw new RuntimeException(); - } + private static final long serialVersionUID = -3681304530279446784L; - // /** * Handles the HTTP GET method. * @@ -75,33 +63,8 @@ protected void processRequest(HttpServletRequest request, HttpServletResponse re * @throws IOException if an I/O error occurs */ @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - processRequest(request, response); - } - - /** - * Handles the HTTP POST method. - * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs - */ - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - processRequest(request, response); + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + throw new RuntimeException(); } - /** - * Returns a short description of the servlet. - * - * @return a String containing servlet description - */ - @Override - public String getServletInfo() { - return "Short description"; - }// - } diff --git a/servlet/error-mapping/src/main/webapp/WEB-INF/web.xml b/servlet/error-mapping/src/main/webapp/WEB-INF/web.xml index e9929cfb6..2c4396e28 100644 --- a/servlet/error-mapping/src/main/webapp/WEB-INF/web.xml +++ b/servlet/error-mapping/src/main/webapp/WEB-INF/web.xml @@ -40,11 +40,7 @@ * holder. */ --> - + TestServlet org.javaee7.servlet.error.mapping.TestServlet @@ -53,17 +49,13 @@ TestServlet /TestServlet - - - 30 - - + 404 - /error-404.jsp + /notfound java.lang.RuntimeException - /error-exception.jsp + /error diff --git a/servlet/error-mapping/src/test/java/org/javaee7/servlet/error/mapping/ErrorMappingTest.java b/servlet/error-mapping/src/test/java/org/javaee7/servlet/error/mapping/ErrorMappingTest.java new file mode 100644 index 000000000..39b1207d1 --- /dev/null +++ b/servlet/error-mapping/src/test/java/org/javaee7/servlet/error/mapping/ErrorMappingTest.java @@ -0,0 +1,67 @@ +package org.javaee7.servlet.error.mapping; + +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; +import java.net.URL; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.xml.sax.SAXException; + +import com.gargoylesoftware.htmlunit.TextPage; +import com.gargoylesoftware.htmlunit.WebClient; + +/** + * @author Arjan Tijms + */ +@RunWith(Arquillian.class) +public class ErrorMappingTest { + + private static final String WEBAPP_SRC = "src/main/webapp"; + + @ArquillianResource + private URL base; + + private WebClient webClient; + + @Deployment(testable = false) + public static WebArchive createDeployment() { + return ShrinkWrap.create(WebArchive.class) + .addAsWebInfResource((new File(WEBAPP_SRC + "/WEB-INF", "web.xml"))) + .addClasses( + TestServlet.class, + ErrorServlet.class, + NotFoundServlet.class); + } + + @Before + public void setup() { + webClient = new WebClient(); + webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); + } + + @Test + public void testError() throws IOException, SAXException { + TextPage page = webClient.getPage(base + "TestServlet"); + + System.out.println(page.getContent()); + + assertTrue(page.getContent().contains("!error!")); + } + + @Test + public void test404() throws IOException, SAXException { + TextPage page = webClient.getPage(base + "does-not-exist"); + + assertTrue(page.getContent().contains("!not found!")); + } + +} From a013bfc4118654e92adf1a320f4cb090ae0e7bc5 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Wed, 6 Nov 2019 02:34:21 +0100 Subject: [PATCH 090/117] Cleaning servlet events sample plus added test Signed-off-by: arjantijms --- servlet/event-listeners/pom.xml | 4 +- .../listeners/MyContextAttributeListener.java | 6 +- .../event/listeners/MyContextListener.java | 4 +- .../MyHttpSessionActivationListener.java | 4 +- .../MyHttpSessionAttributeListener.java | 6 +- .../MyHttpSessionBindingListener.java | 4 +- .../MyServletRequestAttributeListener.java | 6 +- .../listeners/MyServletRequestListener.java | 4 +- .../event/listeners/MySessionIdListener.java | 2 +- .../event/listeners/MySessionListener.java | 4 +- .../servlet/event/listeners/TestServlet.java | 109 +++++++----------- .../event/listeners/EventListenerTest.java | 90 +++++++++++++++ 12 files changed, 153 insertions(+), 90 deletions(-) create mode 100644 servlet/event-listeners/src/test/java/org/javaee7/servlet/event/listeners/EventListenerTest.java diff --git a/servlet/event-listeners/pom.xml b/servlet/event-listeners/pom.xml index 21b5f3b2e..0880ecfd7 100644 --- a/servlet/event-listeners/pom.xml +++ b/servlet/event-listeners/pom.xml @@ -7,11 +7,9 @@ servlet 1.0-SNAPSHOT ../pom.xml - + - org.javaee7 servlet-event-listeners - 1.0-SNAPSHOT war Java EE 7 Sample: servlet - event-listeners diff --git a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyContextAttributeListener.java b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyContextAttributeListener.java index 2e9acbe26..94a3e1367 100644 --- a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyContextAttributeListener.java +++ b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyContextAttributeListener.java @@ -53,16 +53,16 @@ public class MyContextAttributeListener implements ServletContextAttributeListen @Override public void attributeAdded(ServletContextAttributeEvent event) { - System.out.println("MyContextAttributeListener.attributeAdded: " + event.getName()); + TestServlet.eventBuffer.append("\nMyContextAttributeListener.attributeAdded: " + event.getName()); } @Override public void attributeRemoved(ServletContextAttributeEvent event) { - System.out.println("MyContextAttributeListener.attributeRemoved: " + event.getName()); + TestServlet.eventBuffer.append("\nMyContextAttributeListener.attributeRemoved: " + event.getName()); } @Override public void attributeReplaced(ServletContextAttributeEvent event) { - System.out.println("MyContextAttributeListener.attributeReplaced: " + event.getName()); + TestServlet.eventBuffer.append("\nMyContextAttributeListener.attributeReplaced: " + event.getName()); } } diff --git a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyContextListener.java b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyContextListener.java index 063a9b945..4a009b298 100644 --- a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyContextListener.java +++ b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyContextListener.java @@ -53,11 +53,11 @@ public class MyContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { - System.out.println("MyContextListener.contextInitialized: " + sce.getServletContext().getContextPath()); + TestServlet.eventBuffer.append("\nMyContextListener.contextInitialized: " + sce.getServletContext().getContextPath()); } @Override public void contextDestroyed(ServletContextEvent sce) { - System.out.println("MyContextListener.contextDestroyed: " + sce.getServletContext().getContextPath()); + TestServlet.eventBuffer.append("\nMyContextListener.contextDestroyed: " + sce.getServletContext().getContextPath()); } } diff --git a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyHttpSessionActivationListener.java b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyHttpSessionActivationListener.java index 0d8b73fe5..9b99a249d 100644 --- a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyHttpSessionActivationListener.java +++ b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyHttpSessionActivationListener.java @@ -51,12 +51,12 @@ public class MyHttpSessionActivationListener implements HttpSessionActivationLis @Override public void sessionWillPassivate(HttpSessionEvent se) { - System.out.println("MyHttpSessionActivationListener.sessionWillPassivate: " + se.getSession().getId()); + TestServlet.eventBuffer.append("\nMyHttpSessionActivationListener.sessionWillPassivate: " + se.getSession().getId()); } @Override public void sessionDidActivate(HttpSessionEvent se) { - System.out.println("MyHttpSessionActivationListener.sessionDidActivate: " + se.getSession().getId()); + TestServlet.eventBuffer.append("\nMyHttpSessionActivationListener.sessionDidActivate: " + se.getSession().getId()); } } diff --git a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyHttpSessionAttributeListener.java b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyHttpSessionAttributeListener.java index 1e7cbdea6..8cab6fbb2 100644 --- a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyHttpSessionAttributeListener.java +++ b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyHttpSessionAttributeListener.java @@ -53,16 +53,16 @@ public class MyHttpSessionAttributeListener implements HttpSessionAttributeListe @Override public void attributeAdded(HttpSessionBindingEvent event) { - System.out.println("MyHttpSessionAttributeListener.attributeAdded: " + event.getName()); + TestServlet.eventBuffer.append("\nMyHttpSessionAttributeListener.attributeAdded: " + event.getName()); } @Override public void attributeRemoved(HttpSessionBindingEvent event) { - System.out.println("MyHttpSessionAttributeListener.attributeRemoved: " + event.getName()); + TestServlet.eventBuffer.append("\nMyHttpSessionAttributeListener.attributeRemoved: " + event.getName()); } @Override public void attributeReplaced(HttpSessionBindingEvent event) { - System.out.println("MyHttpSessionAttributeListener.attributeReplaced: " + event.getName()); + TestServlet.eventBuffer.append("\nMyHttpSessionAttributeListener.attributeReplaced: " + event.getName()); } } diff --git a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyHttpSessionBindingListener.java b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyHttpSessionBindingListener.java index 5eb2daefc..fe98aa4f7 100644 --- a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyHttpSessionBindingListener.java +++ b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyHttpSessionBindingListener.java @@ -51,12 +51,12 @@ public class MyHttpSessionBindingListener implements HttpSessionBindingListener @Override public void valueBound(HttpSessionBindingEvent event) { - System.out.println("MyHttpSessionBindingListener.valueBound: " + event.getName()); + TestServlet.eventBuffer.append("\nMyHttpSessionBindingListener.valueBound: " + event.getName()); } @Override public void valueUnbound(HttpSessionBindingEvent event) { - System.out.println("MyHttpSessionBindingListener.valueUnbound: " + event.getName()); + TestServlet.eventBuffer.append("\nMyHttpSessionBindingListener.valueUnbound: " + event.getName()); } } diff --git a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyServletRequestAttributeListener.java b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyServletRequestAttributeListener.java index cc0dc6f4d..5c05ea3ae 100644 --- a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyServletRequestAttributeListener.java +++ b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyServletRequestAttributeListener.java @@ -53,17 +53,17 @@ public class MyServletRequestAttributeListener implements ServletRequestAttribut @Override public void attributeAdded(ServletRequestAttributeEvent srae) { - System.out.println("MyServletRequestAttributeListener.attributeAdded: " + srae.getName()); + TestServlet.eventBuffer.append("\nMyServletRequestAttributeListener.attributeAdded: " + srae.getName()); } @Override public void attributeRemoved(ServletRequestAttributeEvent srae) { - System.out.println("MyServletRequestAttributeListener.attributeRemoved: " + srae.getName()); + TestServlet.eventBuffer.append("\nMyServletRequestAttributeListener.attributeRemoved: " + srae.getName()); } @Override public void attributeReplaced(ServletRequestAttributeEvent srae) { - System.out.println("MyServletRequestAttributeListener.attributeReplaced: " + srae.getName()); + TestServlet.eventBuffer.append("\nMyServletRequestAttributeListener.attributeReplaced: " + srae.getName()); } } diff --git a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyServletRequestListener.java b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyServletRequestListener.java index 09b7af811..c5a73e88c 100644 --- a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyServletRequestListener.java +++ b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MyServletRequestListener.java @@ -53,11 +53,11 @@ public class MyServletRequestListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent sre) { - System.out.println("MyServletRequestListener.requestDestroyed: " + sre.getServletContext().getContextPath()); + TestServlet.eventBuffer.append("\nMyServletRequestListener.requestDestroyed: " + sre.getServletContext().getContextPath()); } @Override public void requestInitialized(ServletRequestEvent sre) { - System.out.println("MyServletRequestListener.requestInitialized: " + sre.getServletContext().getContextPath()); + TestServlet.eventBuffer.append("\nMyServletRequestListener.requestInitialized: " + sre.getServletContext().getContextPath()); } } diff --git a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MySessionIdListener.java b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MySessionIdListener.java index 5a9224b60..a95fea58f 100644 --- a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MySessionIdListener.java +++ b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MySessionIdListener.java @@ -53,7 +53,7 @@ public class MySessionIdListener implements HttpSessionIdListener { @Override public void sessionIdChanged(HttpSessionEvent event, String oldSessionId) { - System.out.println("MySessionIdListener.sessionIdChanged: new=" + event.getSession().getId() + ", old=" + oldSessionId); + TestServlet.eventBuffer.append("\nMySessionIdListener.sessionIdChanged: new=" + event.getSession().getId() + ", old=" + oldSessionId); } } diff --git a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MySessionListener.java b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MySessionListener.java index e72488652..f3b27d086 100644 --- a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MySessionListener.java +++ b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/MySessionListener.java @@ -53,11 +53,11 @@ public class MySessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { - System.out.println("MySessionListener.sessionCreated: " + se.getSession().getId()); + TestServlet.eventBuffer.append("\nMySessionListener.sessionCreated: " + se.getSession().getId()); } @Override public void sessionDestroyed(HttpSessionEvent se) { - System.out.println("MySessionListener.sessionDestroyed: " + se.getSession().getId()); + TestServlet.eventBuffer.append("\nMySessionListener.sessionDestroyed: " + se.getSession().getId()); } } diff --git a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/TestServlet.java b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/TestServlet.java index 074137976..daa804af7 100644 --- a/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/TestServlet.java +++ b/servlet/event-listeners/src/main/java/org/javaee7/servlet/event/listeners/TestServlet.java @@ -53,85 +53,60 @@ @WebServlet(urlPatterns = "/TestServlet") public class TestServlet extends HttpServlet { + private static final long serialVersionUID = -535776072448287787L; + + public static StringBuffer eventBuffer = new StringBuffer(); + /** - * Processes requests for both HTTP GET and POST - * methods. + * Processes requests for both HTTP GET and POST methods. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ - protected void processRequest(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + eventBuffer.setLength(0); + response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); + out.println(""); out.println(""); - out.println(""); - out.println("Servlet Event Listeners"); - out.println(""); - out.println(""); - out.println("

Servlet Event Listeners

"); - out.println("

Setting, updating, and removing ServletContext Attributes

"); - request.getServletContext().setAttribute("attribute1", "attribute-value1"); - request.getServletContext().setAttribute("attribute1", "attribute-updated-value1"); - request.getServletContext().removeAttribute("attribute1"); - out.println("done"); - out.println("

Setting, updating, and removing HttpSession Attributes

"); - request.getSession(true).setAttribute("attribute1", "attribute-value1"); - request.getSession().setAttribute("attribute1", "attribute-updated-value1"); - request.getSession().removeAttribute("attribute1"); - out.println("done"); - out.println("

Setting, updating, and removing ServletRequest Attributes

"); - request.setAttribute("attribute1", "attribute-value1"); - request.setAttribute("attribute1", "attribute-updated-value1"); - request.removeAttribute("attribute1"); - out.println("done"); - out.println("

Invalidating session

"); - request.getSession().invalidate(); - out.println("done"); - out.println("

Check output in server log"); - out.println(""); + out.println(""); + out.println("Servlet Event Listeners"); + out.println(""); + out.println(""); + out.println("

Servlet Event Listeners

"); + + out.println("

Setting, updating, and removing ServletContext Attributes

"); + request.getServletContext().setAttribute("attribute1", "attribute-value1"); + request.getServletContext().setAttribute("attribute1", "attribute-updated-value1"); + request.getServletContext().removeAttribute("attribute1"); + out.println("done"); + + out.println("

Setting, updating, and removing HttpSession Attributes

"); + request.getSession(true).setAttribute("attribute1", "attribute-value1"); + request.getSession().setAttribute("attribute1", "attribute-updated-value1"); + request.getSession().removeAttribute("attribute1"); + out.println("done"); + + out.println("

Setting, updating, and removing ServletRequest Attributes

"); + request.setAttribute("attribute1", "attribute-value1"); + request.setAttribute("attribute1", "attribute-updated-value1"); + request.removeAttribute("attribute1"); + out.println("done"); + + out.println("

Invalidating session

"); + request.getSession().invalidate(); + out.println("done"); + + out.println("

Generated output:"); + out.println("
");
+                out.println(eventBuffer.toString());
+                out.println("
"); + out.println(""); out.println(""); } - // - /** - * Handles the HTTP GET method. - * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs - */ - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - processRequest(request, response); - } - - /** - * Handles the HTTP POST method. - * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs - */ - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - processRequest(request, response); - } - - /** - * Returns a short description of the servlet. - * - * @return a String containing servlet description - */ - @Override - public String getServletInfo() { - return "Short description"; - }// } diff --git a/servlet/event-listeners/src/test/java/org/javaee7/servlet/event/listeners/EventListenerTest.java b/servlet/event-listeners/src/test/java/org/javaee7/servlet/event/listeners/EventListenerTest.java new file mode 100644 index 000000000..128a93a68 --- /dev/null +++ b/servlet/event-listeners/src/test/java/org/javaee7/servlet/event/listeners/EventListenerTest.java @@ -0,0 +1,90 @@ +package org.javaee7.servlet.event.listeners; + +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.net.URL; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.html.HtmlPage; + +/** + * @author Arjan Tijms + */ +@RunWith(Arquillian.class) +public class EventListenerTest { + + @ArquillianResource + private URL base; + + private WebClient webClient; + + @Deployment(testable = false) + public static WebArchive createDeployment() { + return ShrinkWrap + .create(WebArchive.class) + .addClasses( + MyServletRequestAttributeListener.class, + MyHttpSessionActivationListener.class, + MyHttpSessionAttributeListener.class, + MyHttpSessionBindingListener.class, + MyContextAttributeListener.class, + MyServletRequestListener.class, + MySessionIdListener.class, + MyContextListener.class, + MySessionListener.class, + TestServlet.class); + } + + @Before + public void setup() { + webClient = new WebClient(); + } + + @Test + public void testContextAttributeListener() throws IOException { + HtmlPage page = webClient.getPage(base + "TestServlet"); + + System.out.println(page.asText()); + + assertTrue(page.asText().contains("MyContextAttributeListener.attributeAdded: attribute1")); + assertTrue(page.asText().contains("MyContextAttributeListener.attributeReplaced: attribute1")); + assertTrue(page.asText().contains("MyContextAttributeListener.attributeRemoved: attribute1")); + } + + @Test + public void testSessionListener() throws IOException { + HtmlPage page = webClient.getPage(base + "TestServlet"); + + assertTrue(page.asText().contains("MySessionListener.sessionCreated:")); + assertTrue(page.asText().contains("MySessionListener.sessionDestroyed:")); + } + + @Test + public void testSessionAttributeListener() throws IOException { + HtmlPage page = webClient.getPage(base + "TestServlet"); + + assertTrue(page.asText().contains("MyHttpSessionAttributeListener.attributeAdded: attribute1")); + assertTrue(page.asText().contains("MyHttpSessionAttributeListener.attributeReplaced: attribute1")); + assertTrue(page.asText().contains("MyHttpSessionAttributeListener.attributeRemoved: attribute1")); + } + + @Test + public void testRequestAttributeListener() throws IOException { + HtmlPage page = webClient.getPage(base + "TestServlet"); + + assertTrue(page.asText().contains("MyServletRequestAttributeListener.attributeAdded: attribute1")); + assertTrue(page.asText().contains("MyServletRequestAttributeListener.attributeReplaced: attribute1")); + assertTrue(page.asText().contains("MyServletRequestAttributeListener.attributeRemoved: attribute1")); + } + +} From de82de6403daea3f9e308ab70856771ee3b3168a Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 7 Nov 2019 14:15:24 +0100 Subject: [PATCH 091/117] Cleaned up servlet protocol sample and added test Signed-off-by: arjantijms --- servlet/protocol-handler/pom.xml | 3 - .../protocolhandler/MyProtocolHandler.java | 19 ++--- .../protocolhandler/UpgradeServlet.java | 78 ++++--------------- .../protocolhandler/ProtocolHandlerTest.java | 77 ++++++++++++++++++ 4 files changed, 98 insertions(+), 79 deletions(-) create mode 100644 servlet/protocol-handler/src/test/java/org/javaee7/servlet/protocolhandler/ProtocolHandlerTest.java diff --git a/servlet/protocol-handler/pom.xml b/servlet/protocol-handler/pom.xml index 733bddf27..e49c5507f 100644 --- a/servlet/protocol-handler/pom.xml +++ b/servlet/protocol-handler/pom.xml @@ -6,12 +6,9 @@ org.javaee7 servlet 1.0-SNAPSHOT - ../pom.xml - org.javaee7 servlet-protocol-handler - 1.0-SNAPSHOT war Java EE 7 Sample: servlet - protocol-handler diff --git a/servlet/protocol-handler/src/main/java/org/javaee7/servlet/protocolhandler/MyProtocolHandler.java b/servlet/protocol-handler/src/main/java/org/javaee7/servlet/protocolhandler/MyProtocolHandler.java index 6cb8c1952..cc191c731 100644 --- a/servlet/protocol-handler/src/main/java/org/javaee7/servlet/protocolhandler/MyProtocolHandler.java +++ b/servlet/protocol-handler/src/main/java/org/javaee7/servlet/protocolhandler/MyProtocolHandler.java @@ -39,30 +39,27 @@ */ package org.javaee7.servlet.protocolhandler; -import java.io.IOException; -import javax.servlet.ServletInputStream; -import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpUpgradeHandler; import javax.servlet.http.WebConnection; /** * @author Arun Gupta + * @author Arjan Tijms */ public class MyProtocolHandler implements HttpUpgradeHandler { - // public MyProtocolHandler(ServletInputStream in, ServletOutputStream out) { - // } - @Override - public void init(WebConnection wc) { - try (ServletInputStream input = wc.getInputStream(); - ServletOutputStream output = wc.getOutputStream();) { - } catch (IOException ex) { + public void init(WebConnection webConnection) { + try { + webConnection.getOutputStream().write(("In protocol handler" + "\n").getBytes()); + webConnection.getOutputStream().close(); + } catch (Exception ex) { + ex.printStackTrace(); } } @Override public void destroy() { - throw new UnsupportedOperationException("Not supported yet."); + // Nothing to do } } diff --git a/servlet/protocol-handler/src/main/java/org/javaee7/servlet/protocolhandler/UpgradeServlet.java b/servlet/protocol-handler/src/main/java/org/javaee7/servlet/protocolhandler/UpgradeServlet.java index 9ab55053e..8bca67535 100644 --- a/servlet/protocol-handler/src/main/java/org/javaee7/servlet/protocolhandler/UpgradeServlet.java +++ b/servlet/protocol-handler/src/main/java/org/javaee7/servlet/protocolhandler/UpgradeServlet.java @@ -39,8 +39,10 @@ */ package org.javaee7.servlet.protocolhandler; +import static javax.servlet.http.HttpServletResponse.SC_SWITCHING_PROTOCOLS; + import java.io.IOException; -import java.io.PrintWriter; + import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -50,79 +52,25 @@ /** * @author Arun Gupta */ -@WebServlet(urlPatterns = { "/UpgradeServlet" }) +@WebServlet("/UpgradeServlet") public class UpgradeServlet extends HttpServlet { - /** - * Processes requests for both HTTP - * GET and - * POST methods. - * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs - */ - protected void processRequest(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - response.setContentType("text/html;charset=UTF-8"); - try (PrintWriter out = response.getWriter()) { - out.println(""); - out.println(""); - out.println("Servlet UpgradeServlet"); - out.println(""); - out.println(""); - out.println("

Servlet UpgradeServlet at " + request.getContextPath() + "

"); - if (request.getHeader("Upgrade").equals("echo")) { - response.setStatus(HttpServletResponse.SC_SWITCHING_PROTOCOLS); - response.setHeader("Connection", "Upgrade"); - response.setHeader("Upgrade", "echo"); - request.upgrade(MyProtocolHandler.class); - System.out.println("Request upgraded to MyProtocolHandler"); - } - out.println(""); - out.println(""); - } - } + private static final long serialVersionUID = 1L; - // /** - * Handles the HTTP - * GET method. + * Processes requests for HTTP GET * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - processRequest(request, response); + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setStatus(SC_SWITCHING_PROTOCOLS); + response.setHeader("Connection", "Upgrade"); + response.setHeader("Upgrade", "echo"); + request.upgrade(MyProtocolHandler.class); + + System.out.println("Request upgraded to MyProtocolHandler"); } - - /** - * Handles the HTTP - * POST method. - * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs - */ - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - processRequest(request, response); - } - - /** - * Returns a short description of the servlet. - * - * @return a String containing servlet description - */ - @Override - public String getServletInfo() { - return "Short description"; - }// } diff --git a/servlet/protocol-handler/src/test/java/org/javaee7/servlet/protocolhandler/ProtocolHandlerTest.java b/servlet/protocol-handler/src/test/java/org/javaee7/servlet/protocolhandler/ProtocolHandlerTest.java new file mode 100644 index 000000000..2e02c1baa --- /dev/null +++ b/servlet/protocol-handler/src/test/java/org/javaee7/servlet/protocolhandler/ProtocolHandlerTest.java @@ -0,0 +1,77 @@ +package org.javaee7.servlet.protocolhandler; + +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLConnection; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * @author Arjan Tijms + */ +@RunWith(Arquillian.class) +public class ProtocolHandlerTest { + + @ArquillianResource + private URL base; + + @Deployment(testable = false) + public static WebArchive createDeployment() { + return + ShrinkWrap.create(WebArchive.class) + .addClasses( + UpgradeServlet.class, + MyProtocolHandler.class); + } + + @Test + @RunAsClient + public void testUpgradeProtocol() throws IOException, URISyntaxException { + + // Read more manually from the connection, as using the regular readers (JAX-RS client, HtmlUnit) + // typically hang when reading. + + URLConnection connection = new URL(base, "UpgradeServlet").openConnection(); + connection.setConnectTimeout(2000); + connection.setReadTimeout(2000); + + StringBuilder response = new StringBuilder(); + + try (InputStream in = connection.getInputStream()) { + InputStreamReader reader = new InputStreamReader(in); + + long startTime = System.currentTimeMillis(); + while (System.currentTimeMillis() - startTime < 10000) { // for at most 10 seconds + try { + char[] buffer = new char[1]; + reader.read(buffer); + + System.out.println("Character read = " + buffer[0]); + + // Use the end of line character is this sample to signal end of transmission + if (buffer[0] == '\n') { + break; + } + response.append(buffer[0]); + } catch(Exception e) { + e.printStackTrace(); + } + } + } + + assertTrue("In protocol handler".equals(response.toString())); + } + +} From b70076f84e9ce8659a764cbdfcf9ac06da7cc8f5 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 7 Nov 2019 14:21:37 +0100 Subject: [PATCH 092/117] Small cleanup for Servlet programmatic sample Signed-off-by: arjantijms --- servlet/programmatic-registration/pom.xml | 2 -- .../registration/DynamicServlet.java | 9 ++++---- .../SimpleServletContextListener.java | 14 ++++++------ .../registration/DynamicServletTest.java | 22 ++++++++++--------- 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/servlet/programmatic-registration/pom.xml b/servlet/programmatic-registration/pom.xml index 88b8a5aad..35e3cdb21 100644 --- a/servlet/programmatic-registration/pom.xml +++ b/servlet/programmatic-registration/pom.xml @@ -6,10 +6,8 @@ org.javaee7 servlet 1.0-SNAPSHOT - ../pom.xml - org.javaee7 servlet-programmatic-registration war diff --git a/servlet/programmatic-registration/src/main/java/org/javaee7/servlet/programmatic/registration/DynamicServlet.java b/servlet/programmatic-registration/src/main/java/org/javaee7/servlet/programmatic/registration/DynamicServlet.java index e401b73ab..97629a1df 100644 --- a/servlet/programmatic-registration/src/main/java/org/javaee7/servlet/programmatic/registration/DynamicServlet.java +++ b/servlet/programmatic-registration/src/main/java/org/javaee7/servlet/programmatic/registration/DynamicServlet.java @@ -1,23 +1,22 @@ package org.javaee7.servlet.programmatic.registration; +import java.io.IOException; + import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; /** * @author OrelGenya */ public class DynamicServlet extends HttpServlet { + private static final long serialVersionUID = 8310377560908221629L; + @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().print("dynamic GET"); } - @Override - public String getServletInfo() { - return "My dynamic awesome servlet!"; - } } \ No newline at end of file diff --git a/servlet/programmatic-registration/src/main/java/org/javaee7/servlet/programmatic/registration/SimpleServletContextListener.java b/servlet/programmatic-registration/src/main/java/org/javaee7/servlet/programmatic/registration/SimpleServletContextListener.java index d911d2d03..f5923aeb6 100644 --- a/servlet/programmatic-registration/src/main/java/org/javaee7/servlet/programmatic/registration/SimpleServletContextListener.java +++ b/servlet/programmatic-registration/src/main/java/org/javaee7/servlet/programmatic/registration/SimpleServletContextListener.java @@ -2,7 +2,6 @@ import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; -import javax.servlet.ServletRegistration; import javax.servlet.annotation.WebListener; /** @@ -12,14 +11,15 @@ public class SimpleServletContextListener implements ServletContextListener { @Override - public void contextInitialized(ServletContextEvent sce) { - System.out.println("Servlet context initialized: " + sce.getServletContext().getContextPath()); - ServletRegistration.Dynamic registration = sce.getServletContext().addServlet("dynamic", DynamicServlet.class); - registration.addMapping("/dynamic"); + public void contextInitialized(ServletContextEvent contextEvent) { + System.out.println("Servlet context initialized: " + contextEvent.getServletContext().getContextPath()); + + contextEvent.getServletContext().addServlet("dynamic", DynamicServlet.class) + .addMapping("/dynamic"); } @Override - public void contextDestroyed(ServletContextEvent sce) { - System.out.println("Servlet context destroyed: " + sce.getServletContext().getContextPath()); + public void contextDestroyed(ServletContextEvent contextEvent) { + System.out.println("Servlet context destroyed: " + contextEvent.getServletContext().getContextPath()); } } diff --git a/servlet/programmatic-registration/src/test/java/org/javaee7/servlet/programmatic/registration/DynamicServletTest.java b/servlet/programmatic-registration/src/test/java/org/javaee7/servlet/programmatic/registration/DynamicServletTest.java index babfc69fd..726193f46 100644 --- a/servlet/programmatic-registration/src/test/java/org/javaee7/servlet/programmatic/registration/DynamicServletTest.java +++ b/servlet/programmatic-registration/src/test/java/org/javaee7/servlet/programmatic/registration/DynamicServletTest.java @@ -1,7 +1,10 @@ package org.javaee7.servlet.programmatic.registration; -import com.gargoylesoftware.htmlunit.TextPage; -import com.gargoylesoftware.htmlunit.WebClient; +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.net.URL; + import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; @@ -12,10 +15,8 @@ import org.junit.runner.RunWith; import org.xml.sax.SAXException; -import java.io.IOException; -import java.net.URL; - -import static org.junit.Assert.assertEquals; +import com.gargoylesoftware.htmlunit.TextPage; +import com.gargoylesoftware.htmlunit.WebClient; /** * @author OrelGenya @@ -30,10 +31,10 @@ public class DynamicServletTest { @Deployment(testable = false) public static WebArchive createDeployment() { - WebArchive war = ShrinkWrap.create(WebArchive.class). - addClass(DynamicServlet.class). - addClass(SimpleServletContextListener.class); - return war; + return ShrinkWrap.create(WebArchive.class). + addClasses( + DynamicServlet.class, + SimpleServletContextListener.class); } @Before @@ -44,6 +45,7 @@ public void setup() { @Test public void testChildServlet() throws IOException, SAXException { TextPage page = webClient.getPage(base + "dynamic"); + assertEquals("dynamic GET", page.getContent()); } } From 8bdef708141f50dc767ec301f02a35d377b46cba Mon Sep 17 00:00:00 2001 From: arjantijms Date: Wed, 20 Nov 2019 00:57:22 +0100 Subject: [PATCH 093/117] FORM auth more consistent with BASIC test Signed-off-by: arjantijms --- .../security/form/based/ErrorServlet.java} | 58 +++++++++++----- .../security/form/based/LoginServlet.java} | 66 +++++++++++++------ .../security/form/based/SecureServlet.java} | 59 +++++++++++------ .../src/main/webapp/WEB-INF/web.xml | 13 +--- .../servlet/security/form/based/FormTest.java | 12 ++-- 5 files changed, 136 insertions(+), 72 deletions(-) rename servlet/security-form-based/src/main/{webapp/index.jsp => java/org/javaee7/servlet/security/form/based/ErrorServlet.java} (57%) rename servlet/security-form-based/src/main/{webapp/loginform.jsp => java/org/javaee7/servlet/security/form/based/LoginServlet.java} (52%) rename servlet/security-form-based/src/main/{webapp/loginerror.jsp => java/org/javaee7/servlet/security/form/based/SecureServlet.java} (59%) diff --git a/servlet/security-form-based/src/main/webapp/index.jsp b/servlet/security-form-based/src/main/java/org/javaee7/servlet/security/form/based/ErrorServlet.java similarity index 57% rename from servlet/security-form-based/src/main/webapp/index.jsp rename to servlet/security-form-based/src/main/java/org/javaee7/servlet/security/form/based/ErrorServlet.java index 734e4f816..6847b9036 100644 --- a/servlet/security-form-based/src/main/webapp/index.jsp +++ b/servlet/security-form-based/src/main/java/org/javaee7/servlet/security/form/based/ErrorServlet.java @@ -1,6 +1,5 @@ - +package org.javaee7.servlet.security.form.based; -<%@page contentType="text/html" pageEncoding="UTF-8"%> - +import java.io.IOException; - - - - Form-based Security - Success - - -

Form-based Security - Success

+import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Arun Gupta + * @author Arjan Tijms + */ +@WebServlet("/ErrorServlet") +public class ErrorServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setContentType("text/html;charset=UTF-8"); - If you reached this page that means form-based security credentials are correctly configured. - - + response.getWriter().print( + + "" + + "" + + "" + + "Form-Based Login Error Page" + + "" + + + "" + + "

Invalid user name or password.

" + + "" + + "" + + ); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.getWriter().print("my POST"); + } +} diff --git a/servlet/security-form-based/src/main/webapp/loginform.jsp b/servlet/security-form-based/src/main/java/org/javaee7/servlet/security/form/based/LoginServlet.java similarity index 52% rename from servlet/security-form-based/src/main/webapp/loginform.jsp rename to servlet/security-form-based/src/main/java/org/javaee7/servlet/security/form/based/LoginServlet.java index 054c05f16..8c6726f5f 100644 --- a/servlet/security-form-based/src/main/webapp/loginform.jsp +++ b/servlet/security-form-based/src/main/java/org/javaee7/servlet/security/form/based/LoginServlet.java @@ -1,6 +1,5 @@ - +package org.javaee7.servlet.security.form.based; -<%@page contentType="text/html" pageEncoding="UTF-8"%> - +import java.io.IOException; - - - - Form-Based Login Page - - -

Form-Based Login Page

+import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; -
- Username:

- Password:

- - -

+/** + * @author Arun Gupta + * @author Arjan Tijms + */ +@WebServlet("/LoginServlet") +public class LoginServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setContentType("text/html;charset=UTF-8"); + + response.getWriter().print( + + "" + + "" + + "" + + "Form-Based Login Page" + + "" + + + "" + + "
" + + "Username:

" + + "Password:

" + + "" + + "

" + + "" + + "" + + ); + } - - + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.getWriter().print("my POST"); + } +} diff --git a/servlet/security-form-based/src/main/webapp/loginerror.jsp b/servlet/security-form-based/src/main/java/org/javaee7/servlet/security/form/based/SecureServlet.java similarity index 59% rename from servlet/security-form-based/src/main/webapp/loginerror.jsp rename to servlet/security-form-based/src/main/java/org/javaee7/servlet/security/form/based/SecureServlet.java index 777e5d0f8..ceeef0553 100644 --- a/servlet/security-form-based/src/main/webapp/loginerror.jsp +++ b/servlet/security-form-based/src/main/java/org/javaee7/servlet/security/form/based/SecureServlet.java @@ -1,4 +1,3 @@ - +package org.javaee7.servlet.security.form.based; -<%@page contentType="text/html" pageEncoding="UTF-8"%> - +import java.io.IOException; - - - - Form-Based Login Error Page - - -

Form-Based Login Error Page

+import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; -

Invalid user name or password.

+/** + * @author Arun Gupta + * @author Arjan Tijms + */ +@WebServlet("/SecureServlet") +public class SecureServlet extends HttpServlet { -

Please enter a user name or password that is authorized to access this - application. For this application, make sure to create a user:

- - For WildFly: Invoke "./bin/add-user.sh -a -u u1 -p p1 -g g1"
- For GlassFish: Invoke "./bin/asadmin create-file-user --groups g1 u1" and use the password "p1" when prompted.

+ private static final long serialVersionUID = 1L; - Click here to Try Again

+ @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setContentType("text/html;charset=UTF-8"); + + response.getWriter().print( + + "" + + "" + + "" + + "Form-based Security - Success" + + "" + + + "" + + "

Form-based Security - Success

" + + "" + + "" + + ); + } - - + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.getWriter().print("my POST"); + } +} diff --git a/servlet/security-form-based/src/main/webapp/WEB-INF/web.xml b/servlet/security-form-based/src/main/webapp/WEB-INF/web.xml index 7bf9cb0c5..b3f1b8830 100644 --- a/servlet/security-form-based/src/main/webapp/WEB-INF/web.xml +++ b/servlet/security-form-based/src/main/webapp/WEB-INF/web.xml @@ -45,16 +45,10 @@ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> - - index - index - /index.jsp - - SecurityConstraint - /* + /SecureServlet g1 @@ -66,10 +60,9 @@ FORM - file - /loginform.jsp - /loginerror.jsp + /LoginServlet + /ErrorServlet diff --git a/servlet/security-form-based/src/test/java/org/javaee7/servlet/security/form/based/FormTest.java b/servlet/security-form-based/src/test/java/org/javaee7/servlet/security/form/based/FormTest.java index ec0893939..bf3e331a7 100644 --- a/servlet/security-form-based/src/test/java/org/javaee7/servlet/security/form/based/FormTest.java +++ b/servlet/security-form-based/src/test/java/org/javaee7/servlet/security/form/based/FormTest.java @@ -41,17 +41,21 @@ public static WebArchive createDeployment() { addUsersToContainerIdentityStore(); return create(WebArchive.class) - .addAsWebResource(new File(WEBAPP_SRC, "index.jsp")) - .addAsWebResource(new File(WEBAPP_SRC, "loginerror.jsp")) - .addAsWebResource(new File(WEBAPP_SRC, "loginform.jsp")) + .addClasses( + SecureServlet.class, + LoginServlet.class, + ErrorServlet.class) + .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF", "web.xml")) .addAsWebInfResource(new File(WEBAPP_SRC + "/WEB-INF", "glassfish-web.xml")); } @Before public void setup() throws IOException { + @SuppressWarnings("resource") WebClient webClient = new WebClient(); - HtmlPage page = webClient.getPage(base + "/index.jsp"); + HtmlPage page = webClient.getPage(base + "SecureServlet"); + loginForm = page.getForms().get(0); } From 207fe5b9c4db750a2bb1df1b2cc2d2810fc29916 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Wed, 20 Nov 2019 13:06:34 +0100 Subject: [PATCH 094/117] Clearer messages for when denied test fails Signed-off-by: arjantijms --- .../security/deny/uncovered/SecureServletTest.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/servlet/security-deny-uncovered/src/test/java/org/javaee7/servlet/security/deny/uncovered/SecureServletTest.java b/servlet/security-deny-uncovered/src/test/java/org/javaee7/servlet/security/deny/uncovered/SecureServletTest.java index 5b197cb75..67b8bf7a2 100644 --- a/servlet/security-deny-uncovered/src/test/java/org/javaee7/servlet/security/deny/uncovered/SecureServletTest.java +++ b/servlet/security-deny-uncovered/src/test/java/org/javaee7/servlet/security/deny/uncovered/SecureServletTest.java @@ -5,6 +5,7 @@ import static org.javaee7.ServerOperations.addUsersToContainerIdentityStore; import static org.jboss.shrinkwrap.api.ShrinkWrap.create; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; @@ -78,16 +79,21 @@ public void testPostMethod() throws Exception { webClient.setCredentialsProvider(correctCreds); WebRequest request = new WebRequest(new URL(base + "SecureServlet"), POST); + TextPage p = null; try { - TextPage p = webClient.getPage(request); + p = webClient.getPage(request); System.out.println(p.getContent()); + + assertFalse( + "POST method could be called even with deny-uncovered-http-methods", + p.getContent().contains("my POST")); } catch (FailingHttpStatusCodeException e) { assertNotNull(e); assertEquals(403, e.getStatusCode()); return; } - fail("POST method could be called even with deny-uncovered-http-methods"); + fail("POST correctly not called, but wrong status code: " + (p != null ? p.getWebResponse().getStatusCode() : -1)); } @Test From 2073b815b224aa70e0d7cc633565f2f61bb0e189 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Wed, 20 Nov 2019 21:39:26 +0100 Subject: [PATCH 095/117] Added sample to test uncovered methods are accessible --- servlet/pom.xml | 1 + servlet/security-allow-uncovered/pom.xml | 39 ++++++ .../allow/uncovered/SecureServlet.java | 33 ++++++ .../src/main/webapp/WEB-INF/glassfish-web.xml | 8 ++ .../src/main/webapp/WEB-INF/web.xml | 32 +++++ .../allow/uncovered/SecureServletTest.java | 111 ++++++++++++++++++ .../src/test/resources/addUsersPayara.txt | 1 + .../src/test/resources/password.txt | 1 + 8 files changed, 226 insertions(+) create mode 100644 servlet/security-allow-uncovered/pom.xml create mode 100644 servlet/security-allow-uncovered/src/main/java/org/javaee7/servlet/security/allow/uncovered/SecureServlet.java create mode 100644 servlet/security-allow-uncovered/src/main/webapp/WEB-INF/glassfish-web.xml create mode 100644 servlet/security-allow-uncovered/src/main/webapp/WEB-INF/web.xml create mode 100644 servlet/security-allow-uncovered/src/test/java/org/javaee7/servlet/security/allow/uncovered/SecureServletTest.java create mode 100644 servlet/security-allow-uncovered/src/test/resources/addUsersPayara.txt create mode 100644 servlet/security-allow-uncovered/src/test/resources/password.txt diff --git a/servlet/pom.xml b/servlet/pom.xml index 872dd15f9..912a59a6e 100644 --- a/servlet/pom.xml +++ b/servlet/pom.xml @@ -36,6 +36,7 @@ security-clientcert-jce security-programmatic security-deny-uncovered + security-allow-uncovered security-annotated security-basicauth-omission diff --git a/servlet/security-allow-uncovered/pom.xml b/servlet/security-allow-uncovered/pom.xml new file mode 100644 index 000000000..43d9cd611 --- /dev/null +++ b/servlet/security-allow-uncovered/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + + org.javaee7 + servlet + 1.0-SNAPSHOT + + + servlet-security-allow-uncovered + war + + Java EE 7 Sample: servlet - security-allow-uncovered + + + + payara-micro-managed + + + + src/test/resources + true + + + + + maven-surefire-plugin + + + --postdeploycommandfile ${project.build.directory}/test-classes/addUsersPayara.txt + + + + + + + + diff --git a/servlet/security-allow-uncovered/src/main/java/org/javaee7/servlet/security/allow/uncovered/SecureServlet.java b/servlet/security-allow-uncovered/src/main/java/org/javaee7/servlet/security/allow/uncovered/SecureServlet.java new file mode 100644 index 000000000..484b540cb --- /dev/null +++ b/servlet/security-allow-uncovered/src/main/java/org/javaee7/servlet/security/allow/uncovered/SecureServlet.java @@ -0,0 +1,33 @@ +package org.javaee7.servlet.security.allow.uncovered; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Arun Gupta + * @author Arjan Tijms + */ +@WebServlet("/SecureServlet") +public class SecureServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.getWriter().print("my GET"); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.getWriter().print("my POST"); + } + + @Override + protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.getWriter().print("my PUT"); + } +} diff --git a/servlet/security-allow-uncovered/src/main/webapp/WEB-INF/glassfish-web.xml b/servlet/security-allow-uncovered/src/main/webapp/WEB-INF/glassfish-web.xml new file mode 100644 index 000000000..54e3db333 --- /dev/null +++ b/servlet/security-allow-uncovered/src/main/webapp/WEB-INF/glassfish-web.xml @@ -0,0 +1,8 @@ + + + + + g1 + g1 + + diff --git a/servlet/security-allow-uncovered/src/main/webapp/WEB-INF/web.xml b/servlet/security-allow-uncovered/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..fddd54eaa --- /dev/null +++ b/servlet/security-allow-uncovered/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,32 @@ + + + + + + + + + SecureServlet + /SecureServlet + GET + + + g1 + + + + + BASIC + file + + + + g1 + + diff --git a/servlet/security-allow-uncovered/src/test/java/org/javaee7/servlet/security/allow/uncovered/SecureServletTest.java b/servlet/security-allow-uncovered/src/test/java/org/javaee7/servlet/security/allow/uncovered/SecureServletTest.java new file mode 100644 index 000000000..531c0af08 --- /dev/null +++ b/servlet/security-allow-uncovered/src/test/java/org/javaee7/servlet/security/allow/uncovered/SecureServletTest.java @@ -0,0 +1,111 @@ +package org.javaee7.servlet.security.allow.uncovered; + +import static com.gargoylesoftware.htmlunit.HttpMethod.POST; +import static com.gargoylesoftware.htmlunit.HttpMethod.PUT; +import static org.javaee7.ServerOperations.addUsersToContainerIdentityStore; +import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.net.URL; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider; +import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; +import com.gargoylesoftware.htmlunit.TextPage; +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.WebRequest; + +/** + * @author Arun Gupta + * @author Arjan Tijms + */ +@RunWith(Arquillian.class) +public class SecureServletTest { + + @ArquillianResource + private URL base; + + DefaultCredentialsProvider correctCreds = new DefaultCredentialsProvider(); + DefaultCredentialsProvider incorrectCreds = new DefaultCredentialsProvider(); + WebClient webClient; + + @Deployment(testable = false) + public static WebArchive createDeployment() { + + addUsersToContainerIdentityStore(); + + WebArchive war = create(WebArchive.class) + .addClass(SecureServlet.class) + .addAsWebInfResource((new File("src/main/webapp/WEB-INF/web.xml"))); + + System.out.println(war.toString(true)); + + return war; + } + + @Before + public void setup() { + correctCreds.addCredentials("u1", "p1"); + incorrectCreds.addCredentials("random", "random"); + webClient = new WebClient(); + } + + @After + public void tearDown() { + webClient.getCookieManager().clearCookies(); + webClient.close(); + } + + @Test + public void testGetMethod() throws Exception { + webClient.setCredentialsProvider(correctCreds); + TextPage page = webClient.getPage(base + "/SecureServlet"); + assertEquals("my GET", page.getContent()); + } + + @Test + public void testPostMethod() throws Exception { + webClient.setCredentialsProvider(correctCreds); + WebRequest request = new WebRequest(new URL(base + "SecureServlet"), POST); + + TextPage page = null; + try { + page = webClient.getPage(request); + System.out.println(page.getContent()); + + assertTrue( + "POST method could not be called even without deny-uncovered-http-methods", + page.getContent().contains("my POST")); + } catch (FailingHttpStatusCodeException e) { + assertNotEquals("Post denied, but should be allowed", 403, e.getStatusCode()); + throw e; + } + } + + @Test + public void testPutMethod() throws Exception { + webClient.setCredentialsProvider(correctCreds); + WebRequest request = new WebRequest(new URL(base + "SecureServlet"), PUT); + + TextPage page = null; + try { + page = webClient.getPage(request); + System.out.println(page.getContent()); + } catch (FailingHttpStatusCodeException e) { + assertNotEquals("PUT denied, but should be allowed", 403, e.getStatusCode()); + throw e; + } + + } +} diff --git a/servlet/security-allow-uncovered/src/test/resources/addUsersPayara.txt b/servlet/security-allow-uncovered/src/test/resources/addUsersPayara.txt new file mode 100644 index 000000000..037cdbd6f --- /dev/null +++ b/servlet/security-allow-uncovered/src/test/resources/addUsersPayara.txt @@ -0,0 +1 @@ +create-file-user --groups g1 --passwordfile ${project.build.directory}/test-classes/password.txt u1 \ No newline at end of file diff --git a/servlet/security-allow-uncovered/src/test/resources/password.txt b/servlet/security-allow-uncovered/src/test/resources/password.txt new file mode 100644 index 000000000..c00bb4cac --- /dev/null +++ b/servlet/security-allow-uncovered/src/test/resources/password.txt @@ -0,0 +1 @@ +AS_ADMIN_USERPASSWORD=p1 From 391cc5c33c0da5b61ff0b6c36f45561eecef0e0c Mon Sep 17 00:00:00 2001 From: arjantijms Date: Fri, 22 Nov 2019 00:16:32 +0100 Subject: [PATCH 096/117] Cleaned up programmatic login example Signed-off-by: arjantijms --- .../programmatic/login/LoginServlet.java | 35 +++---------------- .../src/main/webapp/WEB-INF/web.xml | 6 ---- .../programmatic/login/LoginServletTest.java | 20 +++++++++-- 3 files changed, 22 insertions(+), 39 deletions(-) diff --git a/servlet/security-programmatic/src/main/java/org/javaee7/servlet/programmatic/login/LoginServlet.java b/servlet/security-programmatic/src/main/java/org/javaee7/servlet/programmatic/login/LoginServlet.java index 8587857c0..66f015f1f 100644 --- a/servlet/security-programmatic/src/main/java/org/javaee7/servlet/programmatic/login/LoginServlet.java +++ b/servlet/security-programmatic/src/main/java/org/javaee7/servlet/programmatic/login/LoginServlet.java @@ -12,7 +12,7 @@ /** * @author Arun Gupta */ -@WebServlet(urlPatterns = { "/LoginServlet" }) +@WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; @@ -25,9 +25,10 @@ public class LoginServlet extends HttpServlet { * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ - protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); + String user = request.getParameter("user"); String password = request.getParameter("password"); @@ -43,34 +44,8 @@ protected void processRequest(HttpServletRequest request, HttpServletResponse re private void userDetails(PrintWriter out, HttpServletRequest request) { out.println("isUserInRole?" + request.isUserInRole("g1")); out.println("getRemoteUser?" + request.getRemoteUser()); - out.println("getUserPrincipal?" + request.getUserPrincipal()); + out.println("getUserPrincipal?" + (request.getUserPrincipal() != null? request.getUserPrincipal().getName() : null)); out.println("getAuthType?" + request.getAuthType()); } - /** - * Handles the HTTP GET method. - * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs - */ - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - processRequest(request, response); - } - - /** - * Handles the HTTP POST method. - * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs - */ - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - processRequest(request, response); - } - } diff --git a/servlet/security-programmatic/src/main/webapp/WEB-INF/web.xml b/servlet/security-programmatic/src/main/webapp/WEB-INF/web.xml index b5f400875..4b6003dca 100644 --- a/servlet/security-programmatic/src/main/webapp/WEB-INF/web.xml +++ b/servlet/security-programmatic/src/main/webapp/WEB-INF/web.xml @@ -3,12 +3,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> - - index - index - /index.jsp - - g1 diff --git a/servlet/security-programmatic/src/test/java/org/javaee7/servlet/programmatic/login/LoginServletTest.java b/servlet/security-programmatic/src/test/java/org/javaee7/servlet/programmatic/login/LoginServletTest.java index 19e4449d0..f263dd091 100644 --- a/servlet/security-programmatic/src/test/java/org/javaee7/servlet/programmatic/login/LoginServletTest.java +++ b/servlet/security-programmatic/src/test/java/org/javaee7/servlet/programmatic/login/LoginServletTest.java @@ -12,6 +12,8 @@ import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.xml.sax.SAXException; @@ -29,6 +31,8 @@ public class LoginServletTest { @ArquillianResource private URL base; + + WebClient webClient; @Deployment(testable = false) public static WebArchive createDeployment() { @@ -39,12 +43,23 @@ public static WebArchive createDeployment() { addClass(LoginServlet.class). addAsWebInfResource((new File(WEBAPP_SRC + "/WEB-INF", "web.xml"))); } + + @Before + public void setup() { + webClient = new WebClient(); + } + + @After + public void tearDown() { + webClient.getCookieManager().clearCookies(); + webClient.close(); + } @Test public void testUnauthenticatedRequest() throws IOException, SAXException { - WebClient webClient = new WebClient(); HtmlPage page = webClient.getPage(base + "/LoginServlet"); String responseText = page.asText(); + System.out.println("testUnauthenticatedRequest:\n" + responseText + "\n"); assertTrue(responseText.contains("isUserInRole?false")); @@ -55,14 +70,13 @@ public void testUnauthenticatedRequest() throws IOException, SAXException { @Test public void testAuthenticatedRequest() throws IOException, SAXException { - WebClient webClient = new WebClient(); HtmlPage page = webClient.getPage(base + "/LoginServlet?user=u1&password=p1"); String responseText = page.asText(); + System.out.println("testAuthenticatedRequest:\n" + responseText + "\n"); assertTrue(responseText.contains("isUserInRole?true")); assertTrue(responseText.contains("getRemoteUser?u1")); assertTrue(responseText.contains("getUserPrincipal?u1")); - assertTrue(responseText.contains("getAuthType?BASIC")); } } From ff745e515e4d956260fe7d04ac8684f49c3fd245 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Sun, 24 Nov 2019 13:35:54 +0100 Subject: [PATCH 097/117] Making implicit assumption BASIC is used explicit --- .../src/main/webapp/WEB-INF/web.xml | 11 +++++++++++ .../servlet/security/annotated/SecureServletTest.java | 6 +++++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 servlet/security-annotated/src/main/webapp/WEB-INF/web.xml diff --git a/servlet/security-annotated/src/main/webapp/WEB-INF/web.xml b/servlet/security-annotated/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..32ab0c045 --- /dev/null +++ b/servlet/security-annotated/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,11 @@ + + + + + BASIC + file + + + diff --git a/servlet/security-annotated/src/test/java/org/javaee7/servlet/security/annotated/SecureServletTest.java b/servlet/security-annotated/src/test/java/org/javaee7/servlet/security/annotated/SecureServletTest.java index 79694789b..acac40efd 100644 --- a/servlet/security-annotated/src/test/java/org/javaee7/servlet/security/annotated/SecureServletTest.java +++ b/servlet/security-annotated/src/test/java/org/javaee7/servlet/security/annotated/SecureServletTest.java @@ -7,6 +7,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; +import java.io.File; import java.net.URL; import org.jboss.arquillian.container.test.api.Deployment; @@ -29,6 +30,8 @@ */ @RunWith(Arquillian.class) public class SecureServletTest { + + private static final String WEBAPP_SRC = "src/main/webapp"; @ArquillianResource private URL base; @@ -43,7 +46,8 @@ public static WebArchive createDeployment() { addUsersToContainerIdentityStore(); return create(WebArchive.class) - .addClass(SecureServlet.class); + .addClass(SecureServlet.class) + .addAsWebInfResource((new File(WEBAPP_SRC + "/WEB-INF", "web.xml"))); } @Before From 0af93709d3ede6ed71823a6120ef1c7378c9343d Mon Sep 17 00:00:00 2001 From: arjantijms Date: Mon, 16 Dec 2019 23:00:37 +0100 Subject: [PATCH 098/117] Initial support for Piranha Note: connector needs to be locally compiled first for now Signed-off-by: arjantijms --- pom.xml | 48 +++++++++++++++++++ .../java/org/javaee7/ServerOperations.java | 6 ++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 07bd0260a..80057a0da 100644 --- a/pom.xml +++ b/pom.xml @@ -358,6 +358,54 @@ + + + + + piranha-embedded + + + true + true + true + true + + true + + + + + + fish.payara.arquillian + payara-client-ee7 + + + + cloud.piranha.arquillian + piranha-arquillian-server + 20.1.0-SNAPSHOT + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + piranha-embedded + 19.12.0 + https://dl.bintray.com/piranhacloud/maven + + + + + + + + + diff --git a/test-utils/src/main/java/org/javaee7/ServerOperations.java b/test-utils/src/main/java/org/javaee7/ServerOperations.java index 714d1fe19..d1ae5983d 100644 --- a/test-utils/src/main/java/org/javaee7/ServerOperations.java +++ b/test-utils/src/main/java/org/javaee7/ServerOperations.java @@ -56,7 +56,11 @@ public static void addUsersToContainerIdentityStore() { cmd.add("u1"); CliCommands.payaraGlassFish(cmd); - } else { + } else if ("piranha-embedded".equals(javaEEServer)) { + System.out.println("Adding user for piranha-embedded"); + System.setProperty("io.piranha.identitystore.callers", ""); + } + else { if (javaEEServer == null) { System.out.println("javaEEServer not specified"); } else { From 13c622e7ff8287c5aa124d85e5ecbc20c9068e6c Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 2 Jan 2020 00:16:38 +0100 Subject: [PATCH 099/117] Removed parent to prevent multiple arquillian inclusions on CP Signed-off-by: arjantijms --- jaspic/common/pom.xml | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/jaspic/common/pom.xml b/jaspic/common/pom.xml index ed3a7ca7b..82da0e698 100644 --- a/jaspic/common/pom.xml +++ b/jaspic/common/pom.xml @@ -5,19 +5,39 @@ it provides a base class for unit tests --> 4.0.0 - - - org.javaee7 - jaspic - 1.0-SNAPSHOT - + org.javaee7 jaspic-common + 1.0-SNAPSHOT jar Java EE 7 Sample: jaspic - common + + + UTF-8 + 1.7 + 1.7 + + + + + + org.jboss.arquillian + arquillian-bom + 1.1.14.Final + import + pom + + + + + javax + javaee-api + 7.0 + provided + org.jboss.arquillian.junit arquillian-junit-container From dc48fdd78abfcc8d98c22fa6bfd179f7d1280114 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 2 Jan 2020 00:17:45 +0100 Subject: [PATCH 100/117] Remove redundant maven info Signed-off-by: arjantijms --- jaspic/basic-authentication/pom.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/jaspic/basic-authentication/pom.xml b/jaspic/basic-authentication/pom.xml index 17bb1bf47..8c520010e 100644 --- a/jaspic/basic-authentication/pom.xml +++ b/jaspic/basic-authentication/pom.xml @@ -6,11 +6,9 @@ org.javaee7 jaspic 1.0-SNAPSHOT - ../pom.xml - org.javaee7 + jaspic-basic-authentication - 1.0-SNAPSHOT war Java EE 7 Sample: jaspic - basic-authentication From 346ec06e31dbbe734f64e55f3cfa060fa4bfe743 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Thu, 2 Jan 2020 00:18:14 +0100 Subject: [PATCH 101/117] Don't deploy test classes Signed-off-by: arjantijms --- .../javaee7/jaspic/common/ArquillianBase.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/jaspic/common/src/main/java/org/javaee7/jaspic/common/ArquillianBase.java b/jaspic/common/src/main/java/org/javaee7/jaspic/common/ArquillianBase.java index 2771fc4b5..b2f0e9687 100644 --- a/jaspic/common/src/main/java/org/javaee7/jaspic/common/ArquillianBase.java +++ b/jaspic/common/src/main/java/org/javaee7/jaspic/common/ArquillianBase.java @@ -9,10 +9,13 @@ import java.io.File; import java.io.IOException; import java.net.URL; +import java.util.Map; import java.util.logging.Logger; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ArchivePath; +import org.jboss.shrinkwrap.api.Node; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.After; @@ -69,13 +72,24 @@ public static Archive defaultArchive() { } public static WebArchive defaultWebArchive() { - return - create(WebArchive.class, "test.war") - .addPackages(true, "org.javaee7.jaspic") - .deleteClass(ArquillianBase.class) - .addAsWebInfResource(resource("web.xml")) - .addAsWebInfResource(resource("jboss-web.xml")) - .addAsWebInfResource(resource("glassfish-web.xml")); + return + removeTestClasses( + create(WebArchive.class, "test.war") + .addPackages(true, "org.javaee7.jaspic") + .addAsWebInfResource(resource("web.xml")) + .addAsWebInfResource(resource("jboss-web.xml")) + .addAsWebInfResource(resource("glassfish-web.xml"))); + } + + private static WebArchive removeTestClasses(WebArchive archive) { + for (Map.Entry content : archive.getContent().entrySet()) { + if (content.getKey().get().endsWith("Test.class")) { + archive.delete(content.getKey().get()); + } + } + archive.deleteClass(ArquillianBase.class); + + return archive; } public static Archive tryWrapEAR(WebArchive webArchive) { From 9a961270dfba450db095ac545c492c63db0f64db Mon Sep 17 00:00:00 2001 From: arjantijms Date: Wed, 8 Jan 2020 21:43:07 +0100 Subject: [PATCH 102/117] Update Piranha profile Signed-off-by: arjantijms --- pom.xml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 80057a0da..a6afb586c 100644 --- a/pom.xml +++ b/pom.xml @@ -366,9 +366,6 @@ true - true - true - true true @@ -395,8 +392,9 @@ piranha-embedded - 19.12.0 - https://dl.bintray.com/piranhacloud/maven + 20.1.0-SNAPSHOT + true + ${skipEJB} From 092ffee9aebda8140d1b6e143e08a2a3e5d18170 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Wed, 8 Jan 2020 21:44:08 +0100 Subject: [PATCH 103/117] Add EJB switch and more explicitly define archive Signed-off-by: arjantijms --- .../RequestFromPolicyContextTest.java | 48 ++++++++++++++----- .../SubjectFromPolicyContextTest.java | 11 ++++- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/jacc/contexts/src/test/java/org/javaee7/jacc/contexts/RequestFromPolicyContextTest.java b/jacc/contexts/src/test/java/org/javaee7/jacc/contexts/RequestFromPolicyContextTest.java index 837496371..8e20af4f6 100644 --- a/jacc/contexts/src/test/java/org/javaee7/jacc/contexts/RequestFromPolicyContextTest.java +++ b/jacc/contexts/src/test/java/org/javaee7/jacc/contexts/RequestFromPolicyContextTest.java @@ -6,11 +6,18 @@ import javax.servlet.http.HttpServletRequest; +import org.javaee7.jacc.contexts.bean.JaccRequestBean; +import org.javaee7.jacc.contexts.sam.SamAutoRegistrationListener; +import org.javaee7.jacc.contexts.sam.TestServerAuthModule; +import org.javaee7.jacc.contexts.servlet.RequestServlet; +import org.javaee7.jacc.contexts.servlet.RequestServletEJB; +import org.javaee7.jacc.contexts.servlet.SubjectServlet; import org.javaee7.jaspic.common.ArquillianBase; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; import org.xml.sax.SAXException; @@ -27,8 +34,18 @@ public class RequestFromPolicyContextTest extends ArquillianBase { @Deployment(testable = false) public static Archive createDeployment() { - // TODO: Fix for Liberty which requires EARs :( - return ((WebArchive)defaultArchive()).addPackages(true, "org.javaee7.jacc"); + WebArchive archive = ((WebArchive) ArquillianBase.defaultArchive()) + .addClasses( + SamAutoRegistrationListener.class, TestServerAuthModule.class, + RequestServlet.class, SubjectServlet.class); + + if (!Boolean.valueOf(System.getProperty("skipEJB"))) { + archive.addClasses(JaccRequestBean.class, RequestServletEJB.class); + } else { + System.out.println("Skipping EJB based tests"); + } + + return archive; } /** @@ -41,17 +58,7 @@ public void testCanObtainRequestInServlet() throws IOException, SAXException { assertTrue(response.contains("Obtained request from context.")); } - - /** - * Tests that we are able to obtain a reference to the {@link HttpServletRequest} from an EJB. - */ - @Test - public void testCanObtainRequestInEJB() throws IOException, SAXException { - - String response = getFromServerPath("requestServletEJB"); - - assertTrue(response.contains("Obtained request from context.")); - } + /** * Tests that the {@link HttpServletRequest} reference that we obtained from JACC in a Servlet actually @@ -77,6 +84,8 @@ public void testDataInServlet() throws IOException, SAXException { */ @Test public void testDataInEJB() throws IOException, SAXException { + + Assume.assumeTrue(false); String response = getFromServerPath("requestServlet?jacc_test=true"); @@ -88,5 +97,18 @@ public void testDataInEJB() throws IOException, SAXException { "Request parameter not present in request obtained from context in EJB, but should have been", response.contains("Request parameter present in request from context.")); } + + /** + * Tests that we are able to obtain a reference to the {@link HttpServletRequest} from an EJB. + */ + @Test + public void testCanObtainRequestInEJB() throws IOException, SAXException { + + Assume.assumeTrue(false); + + String response = getFromServerPath("requestServletEJB"); + + assertTrue(response.contains("Obtained request from context.")); + } } \ No newline at end of file diff --git a/jacc/contexts/src/test/java/org/javaee7/jacc/contexts/SubjectFromPolicyContextTest.java b/jacc/contexts/src/test/java/org/javaee7/jacc/contexts/SubjectFromPolicyContextTest.java index 539ebef5f..3e155f0f8 100644 --- a/jacc/contexts/src/test/java/org/javaee7/jacc/contexts/SubjectFromPolicyContextTest.java +++ b/jacc/contexts/src/test/java/org/javaee7/jacc/contexts/SubjectFromPolicyContextTest.java @@ -7,7 +7,10 @@ import javax.security.auth.Subject; import javax.servlet.http.HttpServletRequest; +import org.javaee7.jacc.contexts.sam.SamAutoRegistrationListener; import org.javaee7.jacc.contexts.sam.TestServerAuthModule; +import org.javaee7.jacc.contexts.servlet.RequestServlet; +import org.javaee7.jacc.contexts.servlet.SubjectServlet; import org.javaee7.jaspic.common.ArquillianBase; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; @@ -46,8 +49,12 @@ public class SubjectFromPolicyContextTest extends ArquillianBase { @Deployment(testable = false) public static Archive createDeployment() { - // TODO: Fix for Liberty which requires EARs :( - return ((WebArchive)defaultArchive()).addPackages(true, "org.javaee7.jacc"); + WebArchive archive = ((WebArchive) ArquillianBase.defaultArchive()) + .addClasses( + SamAutoRegistrationListener.class, TestServerAuthModule.class, + RequestServlet.class, SubjectServlet.class); + + return archive; } /** From 278bf7607c523ab229ed3f2cd55c88175e32b0ec Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 14 Jan 2020 15:41:32 +0100 Subject: [PATCH 104/117] Updated for Piranha 20.1.2 --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index a6afb586c..a8716f1e8 100644 --- a/pom.xml +++ b/pom.xml @@ -362,7 +362,7 @@ - piranha-embedded + piranha-embedded-micro true @@ -380,7 +380,7 @@ cloud.piranha.arquillian piranha-arquillian-server - 20.1.0-SNAPSHOT + 20.1.2 @@ -392,8 +392,8 @@ piranha-embedded - 20.1.0-SNAPSHOT - true + 20.1.2 + false ${skipEJB} From b0e8b576a48a2bae5e32e98c7a918867309b6869 Mon Sep 17 00:00:00 2001 From: Ladislav Thon Date: Thu, 7 May 2020 10:35:25 +0200 Subject: [PATCH 105/117] fix the test for HTTP protocol upgrade If the HTTP client wants to request protocol upgrade, it must send the `Upgrade` header. It should also set the `Connection` header. This test didn't do that, so conforming implementations could reject the `request.upgrade()` call. The fix is simple: add the 2 headers on the client side (i.e., in the test). To be able to set `Connection` and `Upgrade` headers on the `java.net.HttpURLConnection`, restricted headers must be allowed by setting a special system property. See also https://developer.mozilla.org/en-US/docs/Web/HTTP/Protocol_upgrade_mechanism and the Servlet specification 4.0, section 2.3.3.5. --- servlet/protocol-handler/pom.xml | 15 +++++++++++++++ .../protocolhandler/UpgradeServlet.java | 18 ++++++++++++------ .../protocolhandler/ProtocolHandlerTest.java | 6 ++++-- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/servlet/protocol-handler/pom.xml b/servlet/protocol-handler/pom.xml index e49c5507f..71b9394f4 100644 --- a/servlet/protocol-handler/pom.xml +++ b/servlet/protocol-handler/pom.xml @@ -12,4 +12,19 @@ war Java EE 7 Sample: servlet - protocol-handler + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + + true + + + + +
diff --git a/servlet/protocol-handler/src/main/java/org/javaee7/servlet/protocolhandler/UpgradeServlet.java b/servlet/protocol-handler/src/main/java/org/javaee7/servlet/protocolhandler/UpgradeServlet.java index 8bca67535..862f14a79 100644 --- a/servlet/protocol-handler/src/main/java/org/javaee7/servlet/protocolhandler/UpgradeServlet.java +++ b/servlet/protocol-handler/src/main/java/org/javaee7/servlet/protocolhandler/UpgradeServlet.java @@ -39,6 +39,7 @@ */ package org.javaee7.servlet.protocolhandler; +import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; import static javax.servlet.http.HttpServletResponse.SC_SWITCHING_PROTOCOLS; import java.io.IOException; @@ -66,11 +67,16 @@ public class UpgradeServlet extends HttpServlet { * @throws IOException if an I/O error occurs */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - response.setStatus(SC_SWITCHING_PROTOCOLS); - response.setHeader("Connection", "Upgrade"); - response.setHeader("Upgrade", "echo"); - request.upgrade(MyProtocolHandler.class); - - System.out.println("Request upgraded to MyProtocolHandler"); + String requestedUpgrade = request.getHeader("Upgrade"); + if ("echo".equals(requestedUpgrade)) { + response.setStatus(SC_SWITCHING_PROTOCOLS); + response.setHeader("Connection", "Upgrade"); + response.setHeader("Upgrade", "echo"); + request.upgrade(MyProtocolHandler.class); + + System.out.println("Request upgraded to MyProtocolHandler"); + } else { + response.sendError(SC_BAD_REQUEST, "unknown upgrade " + requestedUpgrade); + } } } diff --git a/servlet/protocol-handler/src/test/java/org/javaee7/servlet/protocolhandler/ProtocolHandlerTest.java b/servlet/protocol-handler/src/test/java/org/javaee7/servlet/protocolhandler/ProtocolHandlerTest.java index 2e02c1baa..a7fe9e1bd 100644 --- a/servlet/protocol-handler/src/test/java/org/javaee7/servlet/protocolhandler/ProtocolHandlerTest.java +++ b/servlet/protocol-handler/src/test/java/org/javaee7/servlet/protocolhandler/ProtocolHandlerTest.java @@ -1,6 +1,6 @@ package org.javaee7.servlet.protocolhandler; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; import java.io.IOException; import java.io.InputStream; @@ -44,6 +44,8 @@ public void testUpgradeProtocol() throws IOException, URISyntaxException { // typically hang when reading. URLConnection connection = new URL(base, "UpgradeServlet").openConnection(); + connection.setRequestProperty("Connection", "Upgrade"); + connection.setRequestProperty("Upgrade", "echo"); connection.setConnectTimeout(2000); connection.setReadTimeout(2000); @@ -71,7 +73,7 @@ public void testUpgradeProtocol() throws IOException, URISyntaxException { } } - assertTrue("In protocol handler".equals(response.toString())); + assertEquals("In protocol handler", response.toString()); } } From 07797bf5c66656f088facd6b1c0c619057f1716c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 May 2020 21:14:46 +0000 Subject: [PATCH 106/117] Bump htmlunit from 2.35.0 to 2.37.0 Bumps [htmlunit](https://github.com/HtmlUnit/htmlunit) from 2.35.0 to 2.37.0. - [Release notes](https://github.com/HtmlUnit/htmlunit/releases) - [Commits](https://github.com/HtmlUnit/htmlunit/compare/2.35.0...2.37.0) Signed-off-by: dependabot[bot] --- jaspic/common/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jaspic/common/pom.xml b/jaspic/common/pom.xml index 82da0e698..07e04bb54 100644 --- a/jaspic/common/pom.xml +++ b/jaspic/common/pom.xml @@ -52,7 +52,7 @@ net.sourceforge.htmlunit htmlunit - 2.31 + 2.37.0 provided diff --git a/pom.xml b/pom.xml index a8716f1e8..ad03f6804 100644 --- a/pom.xml +++ b/pom.xml @@ -228,7 +228,7 @@ net.sourceforge.htmlunit htmlunit - 2.35.0 + 2.37.0 test From be7d1b2065f571e85d3fe95c8acd80ddeb888205 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Fri, 5 Jun 2020 19:37:55 +0200 Subject: [PATCH 107/117] Added sample that shows a servlet present in a WEB-INF/lib jar. Signed-off-by: arjantijms --- servlet/pom.xml | 1 + .../empty-app-servlet-lib/pom.xml | 23 ++++++++ .../empty/app/EmptyAppWithLibTest.java | 59 +++++++++++++++++++ servlet/servlet-libs/pom.xml | 25 ++++++++ servlet/servlet-libs/servlet-lib/pom.xml | 54 +++++++++++++++++ .../basic/servlet/BasicServlet.java | 24 ++++++++ 6 files changed, 186 insertions(+) create mode 100644 servlet/servlet-libs/empty-app-servlet-lib/pom.xml create mode 100644 servlet/servlet-libs/empty-app-servlet-lib/src/test/java/org/javaee7/servlet/servlet_libs/empty/app/EmptyAppWithLibTest.java create mode 100644 servlet/servlet-libs/pom.xml create mode 100644 servlet/servlet-libs/servlet-lib/pom.xml create mode 100644 servlet/servlet-libs/servlet-lib/src/main/java/org/javaee7/servlet/servlet_libs/basic/servlet/BasicServlet.java diff --git a/servlet/pom.xml b/servlet/pom.xml index 912a59a6e..1bbe27055 100644 --- a/servlet/pom.xml +++ b/servlet/pom.xml @@ -27,6 +27,7 @@ resource-packaging file-upload programmatic-registration + servlet-libs security-basicauth diff --git a/servlet/servlet-libs/empty-app-servlet-lib/pom.xml b/servlet/servlet-libs/empty-app-servlet-lib/pom.xml new file mode 100644 index 000000000..5545d4563 --- /dev/null +++ b/servlet/servlet-libs/empty-app-servlet-lib/pom.xml @@ -0,0 +1,23 @@ + + + 4.0.0 + + + org.javaee7 + servlet-libs + 1.0-SNAPSHOT + + + empty-app-servlet-lib + war + + Java EE 7 Sample: servlet - empty-app-servlet-lib + + + + org.javaee7 + servlet-lib + 1.0-SNAPSHOT + + + diff --git a/servlet/servlet-libs/empty-app-servlet-lib/src/test/java/org/javaee7/servlet/servlet_libs/empty/app/EmptyAppWithLibTest.java b/servlet/servlet-libs/empty-app-servlet-lib/src/test/java/org/javaee7/servlet/servlet_libs/empty/app/EmptyAppWithLibTest.java new file mode 100644 index 000000000..445d2f309 --- /dev/null +++ b/servlet/servlet-libs/empty-app-servlet-lib/src/test/java/org/javaee7/servlet/servlet_libs/empty/app/EmptyAppWithLibTest.java @@ -0,0 +1,59 @@ +package org.javaee7.servlet.servlet_libs.empty.app; + +import static org.junit.Assert.assertTrue; + +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; + +import javax.ws.rs.client.ClientBuilder; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.jboss.shrinkwrap.resolver.api.maven.Maven; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * + * @author Arjan Tijms + * + */ +@RunWith(Arquillian.class) +public class EmptyAppWithLibTest { + + @ArquillianResource + private URL base; + + @Deployment(testable = false) + public static WebArchive deploy() throws URISyntaxException { + JavaArchive[] archiveWithServlet = + Maven.resolver() + .loadPomFromFile("pom.xml") + .resolve("org.javaee7:servlet-lib") + .withoutTransitivity() + .as(JavaArchive.class); + + return ShrinkWrap.create(WebArchive.class) + .addAsLibraries(archiveWithServlet); + } + + @Test + @RunAsClient + public void invokeBasicServlet() throws MalformedURLException, URISyntaxException { + String response = + ClientBuilder.newClient() + .target(new URL(base, "basic").toURI()) + .request() + .get() + .readEntity(String.class); + + assertTrue(response.startsWith("get request")); + } + +} diff --git a/servlet/servlet-libs/pom.xml b/servlet/servlet-libs/pom.xml new file mode 100644 index 000000000..ee2519d80 --- /dev/null +++ b/servlet/servlet-libs/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + + org.javaee7 + servlet + 1.0-SNAPSHOT + + + + This module contains samples for functioning of web apps and code in libraries + (jars in WEB-INF/lib). + + + servlet-libs + pom + + Java EE 7 Sample: Servlet - libs + + + servlet-lib + empty-app-servlet-lib + + diff --git a/servlet/servlet-libs/servlet-lib/pom.xml b/servlet/servlet-libs/servlet-lib/pom.xml new file mode 100644 index 000000000..ccda7987c --- /dev/null +++ b/servlet/servlet-libs/servlet-lib/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + org.javaee7 + servlet-lib + 1.0-SNAPSHOT + + Java EE 7 Sample: servlet - servlet-lib + + This module delivers a jar with a single Servlet in it. The intend is for this to be included + in the WEB-INF/lib folder of a war, to test that Servlets are found and correctly excecuted + from there. As such this module itself contains no tests. + + + + UTF-8 + 1.7 + + + + + javax + javaee-api + 7.0 + provided + + + junit + junit + 4.13 + + + + + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + ${java.min.version} + ${java.min.version} + + + + + diff --git a/servlet/servlet-libs/servlet-lib/src/main/java/org/javaee7/servlet/servlet_libs/basic/servlet/BasicServlet.java b/servlet/servlet-libs/servlet-lib/src/main/java/org/javaee7/servlet/servlet_libs/basic/servlet/BasicServlet.java new file mode 100644 index 000000000..183ed6669 --- /dev/null +++ b/servlet/servlet-libs/servlet-lib/src/main/java/org/javaee7/servlet/servlet_libs/basic/servlet/BasicServlet.java @@ -0,0 +1,24 @@ +package org.javaee7.servlet.servlet_libs.basic.servlet; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Arjan Tijms + */ +@WebServlet("/basic") +public class BasicServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.getWriter().print("get request"); + } + +} From ba04eb37d08a4a04bee39269a156b702e645fab5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Jun 2020 17:38:47 +0000 Subject: [PATCH 108/117] Bump htmlunit from 2.31 to 2.37.0 in /jaspic/common Bumps [htmlunit](https://github.com/HtmlUnit/htmlunit) from 2.31 to 2.37.0. - [Release notes](https://github.com/HtmlUnit/htmlunit/releases) - [Commits](https://github.com/HtmlUnit/htmlunit/compare/HtmlUnit-2.31...2.37.0) Signed-off-by: dependabot[bot] --- jaspic/common/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jaspic/common/pom.xml b/jaspic/common/pom.xml index 82da0e698..07e04bb54 100644 --- a/jaspic/common/pom.xml +++ b/jaspic/common/pom.xml @@ -52,7 +52,7 @@ net.sourceforge.htmlunit htmlunit - 2.31 + 2.37.0 provided From 5f7e6b83dd6f0af5ef480f05824471e63ed929a7 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Fri, 5 Jun 2020 19:49:06 +0200 Subject: [PATCH 109/117] Updated several dependency versions Signed-off-by: arjantijms --- pom.xml | 36 +++++++++++++++++------------------- test-utils/pom.xml | 4 ++-- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/pom.xml b/pom.xml index ad03f6804..0a349500e 100644 --- a/pom.xml +++ b/pom.xml @@ -10,9 +10,9 @@ Java EE 7 Sample: javaee7-samples - 1.4.1.Final + 1.7.0.Alpha1 1.7 - 3.0.0 + 3.5.4 UTF-8 false @@ -129,7 +129,7 @@ fish.payara.arquillian payara-client-ee7 - 1.0.Beta3-m1 + 2.2 test @@ -163,26 +163,24 @@ junit junit - 4.12 + 4.13 test org.hamcrest hamcrest-core - 2.1 test org.hamcrest hamcrest-library - 2.1 test org.assertj assertj-core - 1.5.0 + 3.16.1 test @@ -228,7 +226,7 @@ net.sourceforge.htmlunit htmlunit - 2.37.0 + 2.40.0 test @@ -282,7 +280,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.0 + 3.8.1 ${java.min.version} ${java.min.version} @@ -300,7 +298,7 @@ org.apache.maven.plugins maven-war-plugin - 3.2.2 + 3.2.3 true false @@ -333,7 +331,7 @@ org.wildfly.plugins wildfly-maven-plugin - 1.0.2.Final + 1.2.1.Final @@ -341,12 +339,12 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M2 + 3.0.0-M3 org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M3 + 3.0.0-M4 @@ -380,7 +378,7 @@ cloud.piranha.arquillian piranha-arquillian-server - 20.1.2 + 20.6.0-SNAPSHOT @@ -392,8 +390,8 @@ piranha-embedded - 20.1.2 - false + 20.6.0-SNAPSHOT + true ${skipEJB} @@ -426,7 +424,7 @@ fish.payara.arquillian arquillian-payara-server-4-managed - 1.0.Beta3-m1 + 1.1 @@ -1445,7 +1443,7 @@ org.apache.maven.plugins maven-antrun-plugin - 1.1 + 1.8 process-test-classes @@ -1705,7 +1703,7 @@ org.apache.maven.plugins maven-dependency-plugin - 2.4 + 3.1.2 sources diff --git a/test-utils/pom.xml b/test-utils/pom.xml index 1a596a1f6..90d9a57ad 100644 --- a/test-utils/pom.xml +++ b/test-utils/pom.xml @@ -9,7 +9,7 @@ UTF-8 - 1.1.14.Final + 1.7.0.Alpha1 1.7 @@ -35,7 +35,7 @@ junit junit - 4.12 + 4.13 org.jboss.arquillian.container From c980615fb4204dfe19fec6a022219b3dfd214594 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Fri, 5 Jun 2020 19:49:35 +0200 Subject: [PATCH 110/117] Small cleaning and removing deprecated lines Signed-off-by: arjantijms --- .../packaging/ResourcePackagingTest.java | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/servlet/resource-packaging/src/test/java/org/javaee7/servlet/resource/packaging/ResourcePackagingTest.java b/servlet/resource-packaging/src/test/java/org/javaee7/servlet/resource/packaging/ResourcePackagingTest.java index 5d179c70a..7a662a411 100644 --- a/servlet/resource-packaging/src/test/java/org/javaee7/servlet/resource/packaging/ResourcePackagingTest.java +++ b/servlet/resource-packaging/src/test/java/org/javaee7/servlet/resource/packaging/ResourcePackagingTest.java @@ -1,22 +1,19 @@ package org.javaee7.servlet.resource.packaging; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.startsWith; -import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.io.File; import java.net.MalformedURLException; -import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.util.logging.Logger; -import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Response; import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; @@ -29,26 +26,32 @@ */ @RunWith(Arquillian.class) public class ResourcePackagingTest { + + Logger logger = Logger.getLogger(ResourcePackagingTest.class.getName()); @Deployment(testable = false) public static WebArchive deploy() throws URISyntaxException { return ShrinkWrap.create(WebArchive.class) - .addAsLibrary(new File("src/main/webapp/WEB-INF/lib/myResources.jar"), "myResources.jar"); + .addAsLibrary(new File("src/main/webapp/WEB-INF/lib/myResources.jar"), "myResources.jar"); } @ArquillianResource private URL base; @Test - public void getMyResourceJarStyles() throws MalformedURLException { - Client client = ClientBuilder.newClient(); - WebTarget target = client.target(URI.create(new URL(base, "styles.css").toExternalForm())); - Response response = target.request().get(); - - assertThat(response.getStatus(), is(equalTo(200))); + @RunAsClient + public void getMyResourceJarStyles() throws MalformedURLException, URISyntaxException { + Response response = + ClientBuilder.newClient() + .target(new URL(base, "styles.css").toURI()) + .request() + .get(); + + assertEquals(200, response.getStatus()); String style = response.readEntity(String.class); - assertThat(style, startsWith("body {")); + + assertTrue(style.startsWith("body {")); } } From bf5f5df1033b6d25bf0e64857c1f2dfc0ac68912 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2020 18:29:11 +0000 Subject: [PATCH 111/117] Bump ant from 1.7.0 to 1.9.15 in /jaxrpc/jaxrpc-security Bumps ant from 1.7.0 to 1.9.15. Signed-off-by: dependabot[bot] --- jaxrpc/jaxrpc-security/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jaxrpc/jaxrpc-security/pom.xml b/jaxrpc/jaxrpc-security/pom.xml index dcc9c6c31..516d5f709 100644 --- a/jaxrpc/jaxrpc-security/pom.xml +++ b/jaxrpc/jaxrpc-security/pom.xml @@ -32,7 +32,7 @@ org.apache.ant ant - 1.7.0 + 1.9.15 From 29e57b1151c92ce9232fa982c142705c688be0f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Aug 2021 20:53:43 +0000 Subject: [PATCH 112/117] Bump jsoup from 1.9.1 to 1.14.2 in /jaspic/common Bumps [jsoup](https://github.com/jhy/jsoup) from 1.9.1 to 1.14.2. - [Release notes](https://github.com/jhy/jsoup/releases) - [Changelog](https://github.com/jhy/jsoup/blob/master/CHANGES) - [Commits](https://github.com/jhy/jsoup/compare/jsoup-1.9.1...jsoup-1.14.2) --- updated-dependencies: - dependency-name: org.jsoup:jsoup dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- jaspic/common/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jaspic/common/pom.xml b/jaspic/common/pom.xml index 07e04bb54..c5e0c45fe 100644 --- a/jaspic/common/pom.xml +++ b/jaspic/common/pom.xml @@ -58,7 +58,7 @@ org.jsoup jsoup - 1.9.1 + 1.14.2 From 976ab4f43c6fa883af2df89898d3d7cf6d61f7b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Aug 2021 20:57:43 +0000 Subject: [PATCH 113/117] Bump logback-core from 1.0.13 to 1.2.0 in /websocket/atmosphere-chat Bumps logback-core from 1.0.13 to 1.2.0. --- updated-dependencies: - dependency-name: ch.qos.logback:logback-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- websocket/atmosphere-chat/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/websocket/atmosphere-chat/pom.xml b/websocket/atmosphere-chat/pom.xml index f627751e2..2f6dd9c8a 100644 --- a/websocket/atmosphere-chat/pom.xml +++ b/websocket/atmosphere-chat/pom.xml @@ -30,7 +30,7 @@ ch.qos.logback logback-core - 1.0.13 + 1.2.0 org.atmosphere From df675e890097904c172fdf29ce25e17bec2fbbb1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Aug 2021 20:57:46 +0000 Subject: [PATCH 114/117] Bump junit from 4.11 to 4.13.1 in /jaspic/common Bumps [junit](https://github.com/junit-team/junit4) from 4.11 to 4.13.1. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.11.md) - [Commits](https://github.com/junit-team/junit4/compare/r4.11...r4.13.1) Signed-off-by: dependabot[bot] --- jaspic/common/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jaspic/common/pom.xml b/jaspic/common/pom.xml index c5e0c45fe..069b74319 100644 --- a/jaspic/common/pom.xml +++ b/jaspic/common/pom.xml @@ -46,7 +46,7 @@ junit junit - 4.11 + 4.13.1 provided From 5fdc76169fdccbd11214218e86598c5c1c5aa146 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Aug 2021 20:58:17 +0000 Subject: [PATCH 115/117] Bump junit from 4.13 to 4.13.1 Bumps [junit](https://github.com/junit-team/junit4) from 4.13 to 4.13.1. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.13.1.md) - [Commits](https://github.com/junit-team/junit4/compare/r4.13...r4.13.1) Signed-off-by: dependabot[bot] --- ejb/embeddable/pom.xml | 2 +- jaspic/common/pom.xml | 2 +- pom.xml | 2 +- servlet/servlet-libs/servlet-lib/pom.xml | 2 +- test-utils/pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ejb/embeddable/pom.xml b/ejb/embeddable/pom.xml index 17032dd7d..cc1eacac5 100644 --- a/ejb/embeddable/pom.xml +++ b/ejb/embeddable/pom.xml @@ -18,7 +18,7 @@ junit junit - 4.10 + 4.13.1 test jar diff --git a/jaspic/common/pom.xml b/jaspic/common/pom.xml index c5e0c45fe..069b74319 100644 --- a/jaspic/common/pom.xml +++ b/jaspic/common/pom.xml @@ -46,7 +46,7 @@ junit junit - 4.11 + 4.13.1 provided diff --git a/pom.xml b/pom.xml index 0a349500e..9156a11a9 100644 --- a/pom.xml +++ b/pom.xml @@ -163,7 +163,7 @@ junit junit - 4.13 + 4.13.1 test diff --git a/servlet/servlet-libs/servlet-lib/pom.xml b/servlet/servlet-libs/servlet-lib/pom.xml index ccda7987c..8ad86b342 100644 --- a/servlet/servlet-libs/servlet-lib/pom.xml +++ b/servlet/servlet-libs/servlet-lib/pom.xml @@ -28,7 +28,7 @@ junit junit - 4.13 + 4.13.1 diff --git a/test-utils/pom.xml b/test-utils/pom.xml index 90d9a57ad..263f2eb41 100644 --- a/test-utils/pom.xml +++ b/test-utils/pom.xml @@ -35,7 +35,7 @@ junit junit - 4.13 + 4.13.1 org.jboss.arquillian.container From fd93fde4a560ef5e1c008a0d708cddbf5481644e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Aug 2021 21:04:48 +0000 Subject: [PATCH 116/117] Bump ant from 1.9.15 to 1.10.11 in /jaxrpc/jaxrpc-security Bumps ant from 1.9.15 to 1.10.11. --- updated-dependencies: - dependency-name: org.apache.ant:ant dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- jaxrpc/jaxrpc-security/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jaxrpc/jaxrpc-security/pom.xml b/jaxrpc/jaxrpc-security/pom.xml index 516d5f709..37c76a192 100644 --- a/jaxrpc/jaxrpc-security/pom.xml +++ b/jaxrpc/jaxrpc-security/pom.xml @@ -32,7 +32,7 @@ org.apache.ant ant - 1.9.15 + 1.10.11 From 160223278a869adc9a144d15e71bad61124b2ec7 Mon Sep 17 00:00:00 2001 From: Alfonso Valdez Date: Thu, 2 Dec 2021 22:31:32 -0600 Subject: [PATCH 117/117] updating jaxb and jaxws to execute jdk17 --- jaxws/jaxws-client/pom.xml | 1 + jaxws/pom.xml | 8 +------- pom.xml | 4 ++-- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/jaxws/jaxws-client/pom.xml b/jaxws/jaxws-client/pom.xml index 94b71f3be..cbdc0d008 100644 --- a/jaxws/jaxws-client/pom.xml +++ b/jaxws/jaxws-client/pom.xml @@ -18,6 +18,7 @@ com.helger.maven jaxws-maven-plugin + 2.6.2 generate-sources diff --git a/jaxws/pom.xml b/jaxws/pom.xml index 84686e4cb..81a9e49f2 100644 --- a/jaxws/pom.xml +++ b/jaxws/pom.xml @@ -24,16 +24,10 @@ ${project.version} test - - javax.xml.ws - jaxws-api - 2.3.1 - test - com.sun.xml.ws jaxws-rt - 2.3.2 + 2.3.5 test diff --git a/pom.xml b/pom.xml index 9156a11a9..732727fc8 100644 --- a/pom.xml +++ b/pom.xml @@ -256,12 +256,12 @@ jakarta.xml.bind jakarta.xml.bind-api - 2.3.2 + 3.0.0 org.glassfish.jaxb jaxb-runtime - 2.3.2 + 3.0.0