From 7fb2ae1d8555b47d2d6dcb4ee5adf1d44a7ca200 Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Thu, 14 Dec 2017 17:05:50 +0000 Subject: [PATCH 01/30] Added bean-discovery-mode for empty beans.xml --- .../bean/discovery/empty/CdiEmptyTest.java | 44 +++++++++++++++++++ .../src/test/resources/empty-beans.xml | 0 2 files changed, 44 insertions(+) create mode 100644 cdi/bean-discovery-modes/src/test/java/org/javaee8/cdi/bean/discovery/empty/CdiEmptyTest.java create mode 100644 cdi/bean-discovery-modes/src/test/resources/empty-beans.xml diff --git a/cdi/bean-discovery-modes/src/test/java/org/javaee8/cdi/bean/discovery/empty/CdiEmptyTest.java b/cdi/bean-discovery-modes/src/test/java/org/javaee8/cdi/bean/discovery/empty/CdiEmptyTest.java new file mode 100644 index 00000000..66e3c648 --- /dev/null +++ b/cdi/bean-discovery-modes/src/test/java/org/javaee8/cdi/bean/discovery/empty/CdiEmptyTest.java @@ -0,0 +1,44 @@ +package org.javaee8.cdi.bean.discovery.empty; + +import static org.junit.Assert.assertFalse; + +import java.util.Set; + +import javax.enterprise.inject.spi.Bean; +import javax.enterprise.inject.spi.BeanManager; +import javax.inject.Inject; + +import org.javaee8.cdi.bean.discovery.disabled.CdiDisabledBean; +import org.javaee8.cdi.bean.discovery.enabled.CdiEnabledBean; +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.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(Arquillian.class) +public class CdiEmptyTest { + + @Deployment + public static Archive deploy() { + return ShrinkWrap.create(WebArchive.class).addClasses(CdiDisabledBean.class, CdiEnabledBean.class) + .addAsWebInfResource("empty-beans.xml", "beans.xml"); + } + + @Inject + BeanManager beanManager; + + /** + * Should work the same as 'all'. + */ + @Test + public void should_beans_be_injected() throws Exception { + Set> disabledBeans = beanManager.getBeans(CdiDisabledBean.class); + assertFalse("Instances of disabled bean expected.", disabledBeans.isEmpty()); + + Set> enabledBeans = beanManager.getBeans(CdiEnabledBean.class); + assertFalse("Instances of enabled bean expected.", enabledBeans.isEmpty()); + } +} diff --git a/cdi/bean-discovery-modes/src/test/resources/empty-beans.xml b/cdi/bean-discovery-modes/src/test/resources/empty-beans.xml new file mode 100644 index 00000000..e69de29b From e4ae2533671249a2629b6f6aefad94cea0fe4756 Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Mon, 8 Jan 2018 10:56:57 +0000 Subject: [PATCH 02/30] Added Micro container. --- pom.xml | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/pom.xml b/pom.xml index 6c369bf4..312baca7 100644 --- a/pom.xml +++ b/pom.xml @@ -419,6 +419,57 @@ + + payara-micro-managed + + + + 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.version} + false + ${session.executionRootDirectory}/target/ + payara-micro-${payara.version}.jar + + + + + + + + + maven-surefire-plugin + + + ${session.executionRootDirectory}/target/payara-micro-${payara.version}.jar + + + + + + + payara-embedded From abdf7398ca2917c61bd5b9a8dd3b3fe2dc51a8f8 Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Thu, 8 Feb 2018 11:13:49 +0000 Subject: [PATCH 03/30] Added HTTP2 test. --- servlet/http2/pom.xml | 84 ++++++++++++++++ .../org/javaee8/servlet/http2/Servlet.java | 40 ++++++++ servlet/http2/src/main/webapp/WEB-INF/web.xml | 6 ++ .../src/main/webapp/images/payara-logo.jpg | Bin 0 -> 6231 bytes .../org/javaee8/servlet/http2/Http2Test.java | 93 ++++++++++++++++++ servlet/pom.xml | 3 +- 6 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 servlet/http2/pom.xml create mode 100644 servlet/http2/src/main/java/org/javaee8/servlet/http2/Servlet.java create mode 100644 servlet/http2/src/main/webapp/WEB-INF/web.xml create mode 100644 servlet/http2/src/main/webapp/images/payara-logo.jpg create mode 100644 servlet/http2/src/test/java/org/javaee8/servlet/http2/Http2Test.java diff --git a/servlet/http2/pom.xml b/servlet/http2/pom.xml new file mode 100644 index 00000000..d1d3d28b --- /dev/null +++ b/servlet/http2/pom.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + + org.javaee8 + servlet + 1.0-SNAPSHOT + + + servlet-http2 + war + + Java EE 8 Samples: Servlet - http2 + + + 8.1.11.v20170118 + 9.4.8.v20171121 + + + + + + org.eclipse.jetty.http2 + http2-client + ${jetty-version} + test + + + org.eclipse.jetty.http2 + http2-common + ${jetty-version} + test + + + org.eclipse.jetty.http2 + http2-http-client-transport + ${jetty-version} + test + + + org.eclipse.jetty + jetty-alpn-openjdk8-client + ${jetty-version} + test + + + org.eclipse.jetty + jetty-alpn-java-client + ${jetty-version} + test + + + + + + + maven-dependency-plugin + 3.0.2 + + + process-test-resources + + get + + + + + org.mortbay.jetty.alpn + alpn-boot + ${alpn-version} + + + + maven-surefire-plugin + + + -Xbootclasspath/p:${settings.localRepository}/org/mortbay/jetty/alpn/alpn-boot/${alpn-version}/alpn-boot-${alpn-version}.jar + + + + + + diff --git a/servlet/http2/src/main/java/org/javaee8/servlet/http2/Servlet.java b/servlet/http2/src/main/java/org/javaee8/servlet/http2/Servlet.java new file mode 100644 index 00000000..7427750e --- /dev/null +++ b/servlet/http2/src/main/java/org/javaee8/servlet/http2/Servlet.java @@ -0,0 +1,40 @@ +package org.javaee8.servlet.http2; + +import static java.nio.charset.StandardCharsets.UTF_8; + +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; +import javax.servlet.http.PushBuilder; +import javax.ws.rs.core.MediaType; + +@WebServlet("/test") +public class Servlet extends HttpServlet { + + private static final long serialVersionUID = -3439982021784932020L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + response.setContentType(MediaType.TEXT_HTML_TYPE.withCharset(UTF_8.name()).toString()); + response.setStatus(200); + + PushBuilder builder = request.newPushBuilder(); + + // If server push isn't supported, return that in the result. + if (builder == null) { + response.addHeader("protocol", "HTTP 1.1"); + response.getWriter().append("

The image below was sent normally using HTTP 1.1.

"); + } else { + response.addHeader("protocol", "HTTP 2.0"); + response.getWriter().append("

The image below was pushed using HTTP 2.0.

"); + builder.path("images/payara-logo.jpg").push(); + } + response.getWriter().append(""); + } + +} diff --git a/servlet/http2/src/main/webapp/WEB-INF/web.xml b/servlet/http2/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..ccc69f21 --- /dev/null +++ b/servlet/http2/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,6 @@ + + + + test + + diff --git a/servlet/http2/src/main/webapp/images/payara-logo.jpg b/servlet/http2/src/main/webapp/images/payara-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c22eae068733470083436f4a27bf9de854edb8d GIT binary patch literal 6231 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 EE 8 Samples: Servlet - mapping + http2 + mapping From 4febf9df67e325e7f1b6688c88de93143ec8f869 Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Thu, 15 Mar 2018 10:23:12 +0000 Subject: [PATCH 04/30] Updated jetty alpn. --- servlet/http2/pom.xml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/servlet/http2/pom.xml b/servlet/http2/pom.xml index d1d3d28b..f1c8f636 100644 --- a/servlet/http2/pom.xml +++ b/servlet/http2/pom.xml @@ -14,7 +14,7 @@ Java EE 8 Samples: Servlet - http2 - 8.1.11.v20170118 + 8.1.12.v20180117 9.4.8.v20171121 @@ -32,12 +32,6 @@ ${jetty-version} test - - org.eclipse.jetty.http2 - http2-http-client-transport - ${jetty-version} - test - org.eclipse.jetty jetty-alpn-openjdk8-client From b75a6638bdca0d4adbbe0b80e609dd3a432dd9a2 Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Thu, 15 Mar 2018 10:23:25 +0000 Subject: [PATCH 05/30] Converted to new web client. --- .../org/javaee8/servlet/http2/Http2Test.java | 62 +++------- .../org/javaee8/servlet/http2/WebClient.java | 107 ++++++++++++++++++ 2 files changed, 122 insertions(+), 47 deletions(-) create mode 100644 servlet/http2/src/test/java/org/javaee8/servlet/http2/WebClient.java diff --git a/servlet/http2/src/test/java/org/javaee8/servlet/http2/Http2Test.java b/servlet/http2/src/test/java/org/javaee8/servlet/http2/Http2Test.java index e88ec4c1..9929c362 100644 --- a/servlet/http2/src/test/java/org/javaee8/servlet/http2/Http2Test.java +++ b/servlet/http2/src/test/java/org/javaee8/servlet/http2/Http2Test.java @@ -1,22 +1,15 @@ package org.javaee8.servlet.http2; -import static org.eclipse.jetty.http.HttpVersion.HTTP_2; import static org.jboss.shrinkwrap.api.ShrinkWrap.create; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.Assert.assertNotNull; import java.io.File; +import java.net.URISyntaxException; import java.net.URL; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; +import java.util.logging.Level; -import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.client.api.ContentResponse; -import org.eclipse.jetty.http.HttpVersion; -import org.eclipse.jetty.http2.client.HTTP2Client; -import org.eclipse.jetty.http2.client.http.HttpClientTransportOverHTTP2; -import org.eclipse.jetty.util.ssl.SslContextFactory; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; @@ -30,64 +23,39 @@ @RunWith(Arquillian.class) public class Http2Test { - private HttpClient httpClient; + private WebClient client; @Deployment public static WebArchive createDeployment() { - return create(WebArchive.class) - .addPackages(true, "org.javaee8.servlet.http2") + return create(WebArchive.class).addPackages(true, "org.javaee8.servlet.http2") .addAsWebResource(new File("src/main/webapp/images/payara-logo.jpg"), "images/payara-logo.jpg") .addAsWebInfResource(new File("src/main/webapp/WEB-INF/web.xml")); } @Test @RunAsClient - public void testHttp2ControlGroup() { - String url = "https://javaee.github.io/"; - testUrl(url); + public void testHttp2ControlGroup() + throws InterruptedException, ExecutionException, TimeoutException, URISyntaxException { + String url = "https://http2.akamai.com/"; + assertNotNull(client.getResponse(url)); } @Test @RunAsClient - public void testServerHttp2(@ArquillianResource URL base) { - String url = String.format("https://%s:%d%s", base.getHost(), 8181, base.getPath()); - testUrl(url); - } - - private void testUrl(String url) { - System.out.println("Testing url: " + url); - ContentResponse response = null; - try { - response = httpClient.GET(url); - } catch (InterruptedException ex) { - fail("Request was interruped with exception: " + ex.getMessage()); - } catch (ExecutionException ex) { - fail("Exception whilst executing request: " + ex.getMessage()); - } catch (TimeoutException ex) { - fail("Request timed out with exception: " + ex.getMessage()); - } - - assertFalse("Error getting the response.", response == null); - - HttpVersion protocol = response.getVersion(); - - assertTrue(String.format("The page was delivered over %s instead of HTTP 2.", protocol.asString()), - protocol.equals(HTTP_2)); + public void testServerHttp2(@ArquillianResource URL url) + throws InterruptedException, ExecutionException, TimeoutException, URISyntaxException { + assertNotNull(client.getResponse(url.toString())); } @Before public void setup() throws Exception { - //System.setProperty("org.eclipse.jetty.client.LEVEL", "DEBUG"); - SslContextFactory sslContextFactory = new SslContextFactory(true); - HTTP2Client http2Client = new HTTP2Client(); - HttpClientTransportOverHTTP2 http2Transport = new HttpClientTransportOverHTTP2(http2Client); - httpClient = new HttpClient(http2Transport, sslContextFactory); - httpClient.start(); + client = new WebClient(Level.INFO); + client.start(); } @After public void cleanUp() throws Exception { - httpClient.stop(); + client.stop(); } } diff --git a/servlet/http2/src/test/java/org/javaee8/servlet/http2/WebClient.java b/servlet/http2/src/test/java/org/javaee8/servlet/http2/WebClient.java new file mode 100644 index 00000000..8cc4c336 --- /dev/null +++ b/servlet/http2/src/test/java/org/javaee8/servlet/http2/WebClient.java @@ -0,0 +1,107 @@ +package org.javaee8.servlet.http2; + +import java.net.InetSocketAddress; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.logging.Level; + +import org.eclipse.jetty.http.HttpFields; +import org.eclipse.jetty.http.HttpURI; +import org.eclipse.jetty.http.HttpVersion; +import org.eclipse.jetty.http.MetaData; +import org.eclipse.jetty.http2.api.Session; +import org.eclipse.jetty.http2.api.Stream; +import org.eclipse.jetty.http2.api.server.ServerSessionListener; +import org.eclipse.jetty.http2.client.HTTP2Client; +import org.eclipse.jetty.http2.frames.DataFrame; +import org.eclipse.jetty.http2.frames.HeadersFrame; +import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.FuturePromise; +import org.eclipse.jetty.util.Jetty; +import org.eclipse.jetty.util.ssl.SslContextFactory; + +public class WebClient { + + private HTTP2Client client; + private SslContextFactory sslContextFactory; + + public WebClient() { + this(Level.INFO); + } + + public WebClient(Level logLevel) { + System.setProperty("org.eclipse.jetty.client.LEVEL", logLevel.getName()); + } + + //private Pattern urlMatcher = Pattern.compile("^(?http[s]?):\\/\\/(?[\\w.]+)(?:(?=:):(?9000)|\\/)"); + + public String getResponse(String url) + throws URISyntaxException, InterruptedException, ExecutionException, TimeoutException { + URI uri = new URI(url); + + String host = uri.getHost(); + int port = uri.getPort(); + if (port == -1) { + port = 443; + } + String scheme = uri.getScheme(); + + FuturePromise sessionPromise = new FuturePromise<>(); + if (scheme.contains("https")) { + client.connect(sslContextFactory, new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), + sessionPromise); + } else { + client.connect(new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), sessionPromise); + } + + Session session = sessionPromise.get(5, TimeUnit.SECONDS); + + HttpFields requestFields = new HttpFields(); + requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION); + requestFields.put("Host", host + ":" + port); + + MetaData.Request request = new MetaData.Request("GET", new HttpURI(url), HttpVersion.HTTP_2, requestFields); + + HeadersFrame headersFrame = new HeadersFrame(request, null, true); + + CountDownLatch latch = new CountDownLatch(1); + final StringBuilder response = new StringBuilder(); + Stream.Listener responseListener = new Stream.Listener.Adapter() { + @Override + public void onData(Stream stream, DataFrame frame, Callback callback) { + byte[] bytes = new byte[frame.getData().remaining()]; + frame.getData().get(bytes); + response.append(new String(bytes)); + latch.countDown(); + callback.succeeded(); + } + }; + + session.newStream(headersFrame, new FuturePromise<>(), responseListener); + + if (!latch.await(1, TimeUnit.SECONDS)) { + throw new RuntimeException("The request timed out."); + } + return response.toString(); + } + + public void start() throws Exception { + client = new HTTP2Client(); + + // Configure SSL for test + sslContextFactory = new SslContextFactory(true); + client.addBean(sslContextFactory); + + // Start client + client.start(); + } + + public void stop() throws Exception { + client.stop(); + } + +} \ No newline at end of file From bd1632bdf23ff56fd780207b60e398cf898dd610 Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Thu, 15 Mar 2018 11:49:23 +0000 Subject: [PATCH 06/30] Updated HTTP 2.0 to HTTP/2. --- .../src/main/java/org/javaee8/servlet/http2/Servlet.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servlet/http2/src/main/java/org/javaee8/servlet/http2/Servlet.java b/servlet/http2/src/main/java/org/javaee8/servlet/http2/Servlet.java index 7427750e..f8cf4746 100644 --- a/servlet/http2/src/main/java/org/javaee8/servlet/http2/Servlet.java +++ b/servlet/http2/src/main/java/org/javaee8/servlet/http2/Servlet.java @@ -30,8 +30,8 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) response.addHeader("protocol", "HTTP 1.1"); response.getWriter().append("

The image below was sent normally using HTTP 1.1.

"); } else { - response.addHeader("protocol", "HTTP 2.0"); - response.getWriter().append("

The image below was pushed using HTTP 2.0.

"); + response.addHeader("protocol", "HTTP/2"); + response.getWriter().append("

The image below was pushed using HTTP/2.

"); builder.path("images/payara-logo.jpg").push(); } response.getWriter().append(""); From 2d24e0b8f0c0b598c4caf2a816177c7864e7da9e Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Thu, 15 Mar 2018 11:49:41 +0000 Subject: [PATCH 07/30] Converted to using Jersey Client connector. --- .../org/javaee8/servlet/http2/Http2Test.java | 31 ++- .../javaee8/servlet/http2/JettyConnector.java | 179 ++++++++++++++++++ .../org/javaee8/servlet/http2/WebClient.java | 107 ----------- 3 files changed, 202 insertions(+), 115 deletions(-) create mode 100644 servlet/http2/src/test/java/org/javaee8/servlet/http2/JettyConnector.java delete mode 100644 servlet/http2/src/test/java/org/javaee8/servlet/http2/WebClient.java diff --git a/servlet/http2/src/test/java/org/javaee8/servlet/http2/Http2Test.java b/servlet/http2/src/test/java/org/javaee8/servlet/http2/Http2Test.java index 9929c362..b3577ec1 100644 --- a/servlet/http2/src/test/java/org/javaee8/servlet/http2/Http2Test.java +++ b/servlet/http2/src/test/java/org/javaee8/servlet/http2/Http2Test.java @@ -1,6 +1,7 @@ package org.javaee8.servlet.http2; import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.io.File; @@ -8,8 +9,12 @@ import java.net.URL; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; -import java.util.logging.Level; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.core.Response; + +import org.glassfish.jersey.client.ClientConfig; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; @@ -23,7 +28,7 @@ @RunWith(Arquillian.class) public class Http2Test { - private WebClient client; + private Client jaxrsClient; @Deployment public static WebArchive createDeployment() { @@ -36,26 +41,36 @@ public static WebArchive createDeployment() { @RunAsClient public void testHttp2ControlGroup() throws InterruptedException, ExecutionException, TimeoutException, URISyntaxException { - String url = "https://http2.akamai.com/"; - assertNotNull(client.getResponse(url)); + testUrl("https://http2.akamai.com/"); } @Test @RunAsClient public void testServerHttp2(@ArquillianResource URL url) throws InterruptedException, ExecutionException, TimeoutException, URISyntaxException { - assertNotNull(client.getResponse(url.toString())); + Response response = testUrl(url.toURI().toString()); + assertEquals( + "Request wasn't over HTTP/2." + + " Either the wrong servlet was returned, or the server doesn't support HTTP/2.", + response.getHeaderString("protocol"), "HTTP/2"); + } + + private Response testUrl(String url) { + Response response = jaxrsClient.target(url).request().get(); + assertNotNull(response); + return response; } @Before public void setup() throws Exception { - client = new WebClient(Level.INFO); - client.start(); + ClientConfig config = new ClientConfig(); + config.connectorProvider(JettyConnector::new); + jaxrsClient = ClientBuilder.newClient(config); } @After public void cleanUp() throws Exception { - client.stop(); + jaxrsClient.close(); } } diff --git a/servlet/http2/src/test/java/org/javaee8/servlet/http2/JettyConnector.java b/servlet/http2/src/test/java/org/javaee8/servlet/http2/JettyConnector.java new file mode 100644 index 00000000..d7e89b8b --- /dev/null +++ b/servlet/http2/src/test/java/org/javaee8/servlet/http2/JettyConnector.java @@ -0,0 +1,179 @@ +package org.javaee8.servlet.http2; + +import java.io.ByteArrayInputStream; +import java.net.InetSocketAddress; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.logging.Level; + +import javax.ws.rs.client.Client; +import javax.ws.rs.core.Configuration; + +import org.eclipse.jetty.http.HttpFields; +import org.eclipse.jetty.http.HttpURI; +import org.eclipse.jetty.http.HttpVersion; +import org.eclipse.jetty.http.MetaData.Request; +import org.eclipse.jetty.http2.api.Session; +import org.eclipse.jetty.http2.api.Stream; +import org.eclipse.jetty.http2.api.server.ServerSessionListener; +import org.eclipse.jetty.http2.client.HTTP2Client; +import org.eclipse.jetty.http2.frames.DataFrame; +import org.eclipse.jetty.http2.frames.HeadersFrame; +import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.FuturePromise; +import org.eclipse.jetty.util.Jetty; +import org.eclipse.jetty.util.ssl.SslContextFactory; +import org.glassfish.jersey.client.ClientRequest; +import org.glassfish.jersey.client.ClientResponse; +import org.glassfish.jersey.client.spi.AsyncConnectorCallback; +import org.glassfish.jersey.client.spi.Connector; +import org.glassfish.jersey.message.internal.Statuses; + +public class JettyConnector implements Connector { + + private HTTP2Client client; + private SslContextFactory sslContextFactory; + + /** + * Needed for the JAX-RS connector creation. + */ + public JettyConnector(final Client jaxrsClient, final Configuration config) { + this(); + } + + public JettyConnector() { + this(Level.INFO); + } + + public JettyConnector(Level logLevel) { + System.setProperty("org.eclipse.jetty.client.LEVEL", logLevel.getName()); + client = new HTTP2Client(); + + // Configure SSL for test. Ignore insecure certificates + sslContextFactory = new SslContextFactory(true); + client.addBean(sslContextFactory); + + // Start client + try { + client.start(); + } catch (Exception e) { + throw new RuntimeException("Unable to start client."); + } + } + + @Override + public ClientResponse apply(ClientRequest request) { + + String host = request.getUri().getHost(); + int port = request.getUri().getPort(); + if (port == -1) { + port = 443; + } + boolean secure = request.getUri().getScheme().equals("https"); + + // Get the session + Session session = createSession(host, port, secure); + + // Create HTTP headers + HttpFields headers = new HttpFields(); + request.getStringHeaders().forEach((key, value) -> { + headers.put(key, value); + }); + headers.put("User-Agent", getName()); + headers.put("Host", host + ":" + port); + + // Create the request + Request jettyRequest = new Request(request.getMethod(), new HttpURI(request.getUri()), HttpVersion.HTTP_2, + headers); + + // Stored metadata + int status = 200; + StringBuilder entityStream = new StringBuilder(); + Map responseHeaders = new HashMap<>(); + + // Response listener + CountDownLatch latch = new CountDownLatch(1); + Stream.Listener responseListener = new Stream.Listener.Adapter() { + @Override + public void onHeaders(Stream stream, HeadersFrame frame) { + frame.getMetaData().getFields().forEach(field -> { + responseHeaders.put(field.getName(), field.getValue()); + }); + } + + @Override + public void onData(Stream stream, DataFrame frame, Callback callback) { + byte[] bytes = new byte[frame.getData().remaining()]; + frame.getData().get(bytes); + entityStream.append(new String(bytes)); + if (frame.isEndStream()) { + latch.countDown(); + callback.succeeded(); + } + } + }; + + // Make the connection + session.newStream(new HeadersFrame(jettyRequest, null, true), new FuturePromise<>(), responseListener); + + // Wait for response + try { + if (!latch.await(5, TimeUnit.SECONDS)) { + throw new RuntimeException("The request timed out. This usually means HTTP/2 isn't supported."); + } + } catch (InterruptedException e) { + throw new RuntimeException("Request interrupted."); + } + + // Build response from metadata + ClientResponse response = new ClientResponse(Statuses.from(status), request); + response.setEntityStream(new ByteArrayInputStream(entityStream.toString().getBytes())); + responseHeaders.forEach((key, value) -> { + response.header(key, value); + }); + return response; + } + + @Override + public Future apply(ClientRequest request, AsyncConnectorCallback callback) { + throw new UnsupportedOperationException("Unimplemented method."); + } + + @Override + public String getName() { + return client.getClass().getName() + "/" + Jetty.VERSION; + } + + @Override + public void close() { + try { + client.stop(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private Session createSession(String host, int port, boolean secure) { + FuturePromise sessionPromise = new FuturePromise<>(); + if (secure) { + client.connect(sslContextFactory, new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), + sessionPromise); + } else { + client.connect(new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), sessionPromise); + } + + Session session = null; + try { + session = sessionPromise.get(5, TimeUnit.SECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + e.printStackTrace(); + } + return session; + } + +} \ No newline at end of file diff --git a/servlet/http2/src/test/java/org/javaee8/servlet/http2/WebClient.java b/servlet/http2/src/test/java/org/javaee8/servlet/http2/WebClient.java deleted file mode 100644 index 8cc4c336..00000000 --- a/servlet/http2/src/test/java/org/javaee8/servlet/http2/WebClient.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.javaee8.servlet.http2; - -import java.net.InetSocketAddress; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.logging.Level; - -import org.eclipse.jetty.http.HttpFields; -import org.eclipse.jetty.http.HttpURI; -import org.eclipse.jetty.http.HttpVersion; -import org.eclipse.jetty.http.MetaData; -import org.eclipse.jetty.http2.api.Session; -import org.eclipse.jetty.http2.api.Stream; -import org.eclipse.jetty.http2.api.server.ServerSessionListener; -import org.eclipse.jetty.http2.client.HTTP2Client; -import org.eclipse.jetty.http2.frames.DataFrame; -import org.eclipse.jetty.http2.frames.HeadersFrame; -import org.eclipse.jetty.util.Callback; -import org.eclipse.jetty.util.FuturePromise; -import org.eclipse.jetty.util.Jetty; -import org.eclipse.jetty.util.ssl.SslContextFactory; - -public class WebClient { - - private HTTP2Client client; - private SslContextFactory sslContextFactory; - - public WebClient() { - this(Level.INFO); - } - - public WebClient(Level logLevel) { - System.setProperty("org.eclipse.jetty.client.LEVEL", logLevel.getName()); - } - - //private Pattern urlMatcher = Pattern.compile("^(?http[s]?):\\/\\/(?[\\w.]+)(?:(?=:):(?9000)|\\/)"); - - public String getResponse(String url) - throws URISyntaxException, InterruptedException, ExecutionException, TimeoutException { - URI uri = new URI(url); - - String host = uri.getHost(); - int port = uri.getPort(); - if (port == -1) { - port = 443; - } - String scheme = uri.getScheme(); - - FuturePromise sessionPromise = new FuturePromise<>(); - if (scheme.contains("https")) { - client.connect(sslContextFactory, new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), - sessionPromise); - } else { - client.connect(new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), sessionPromise); - } - - Session session = sessionPromise.get(5, TimeUnit.SECONDS); - - HttpFields requestFields = new HttpFields(); - requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION); - requestFields.put("Host", host + ":" + port); - - MetaData.Request request = new MetaData.Request("GET", new HttpURI(url), HttpVersion.HTTP_2, requestFields); - - HeadersFrame headersFrame = new HeadersFrame(request, null, true); - - CountDownLatch latch = new CountDownLatch(1); - final StringBuilder response = new StringBuilder(); - Stream.Listener responseListener = new Stream.Listener.Adapter() { - @Override - public void onData(Stream stream, DataFrame frame, Callback callback) { - byte[] bytes = new byte[frame.getData().remaining()]; - frame.getData().get(bytes); - response.append(new String(bytes)); - latch.countDown(); - callback.succeeded(); - } - }; - - session.newStream(headersFrame, new FuturePromise<>(), responseListener); - - if (!latch.await(1, TimeUnit.SECONDS)) { - throw new RuntimeException("The request timed out."); - } - return response.toString(); - } - - public void start() throws Exception { - client = new HTTP2Client(); - - // Configure SSL for test - sslContextFactory = new SslContextFactory(true); - client.addBean(sslContextFactory); - - // Start client - client.start(); - } - - public void stop() throws Exception { - client.stop(); - } - -} \ No newline at end of file From a29d8dd0bc8835914c1f926671177d010cc4db5a Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Thu, 15 Mar 2018 11:49:52 +0000 Subject: [PATCH 08/30] Updated ALPN version to use dynamic profiles. --- servlet/http2/pom.xml | 341 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 311 insertions(+), 30 deletions(-) diff --git a/servlet/http2/pom.xml b/servlet/http2/pom.xml index f1c8f636..6f6e0f11 100644 --- a/servlet/http2/pom.xml +++ b/servlet/http2/pom.xml @@ -14,7 +14,6 @@ Java EE 8 Samples: Servlet - http2 - 8.1.12.v20180117 9.4.8.v20171121 @@ -45,34 +44,316 @@ test
- - - - - maven-dependency-plugin - 3.0.2 - - - process-test-resources - - get - - - - - org.mortbay.jetty.alpn - alpn-boot - ${alpn-version} - - - - maven-surefire-plugin - - - -Xbootclasspath/p:${settings.localRepository}/org/mortbay/jetty/alpn/alpn-boot/${alpn-version}/alpn-boot-${alpn-version}.jar - - - - + + + + + alpn-when-jdk8 + + 1.8 + + + + ${settings.localRepository}/org/mortbay/jetty/alpn/alpn-boot/${alpn.version}/alpn-boot-${alpn.version}.jar + + + + + + maven-surefire-plugin + + -Xbootclasspath/p:${bootclasspathPrefix} + + + + org.mortbay.jetty.alpn + alpn-boot + ${alpn.version} + + + + + + + + alpn-when-jdk8_05 + + 1.8.0_05 + + + 8.1.0.v20141016 + + + + alpn-when-jdk8_11 + + 1.8.0_11 + + + 8.1.0.v20141016 + + + + alpn-when-jdk8_20 + + 1.8.0_20 + + + 8.1.0.v20141016 + + + + alpn-when-jdk8_25 + + 1.8.0_25 + + + 8.1.2.v20141202 + + + + alpn-when-jdk8_31 + + 1.8.0_31 + + + 8.1.3.v20150130 + + + + alpn-when-jdk8_40 + + 1.8.0_40 + + + 8.1.3.v20150130 + + + + alpn-when-jdk8_45 + + 1.8.0_45 + + + 8.1.3.v20150130 + + + + alpn-when-jdk8_51 + + 1.8.0_51 + + + 8.1.4.v20150727 + + + + alpn-when-jdk8_60 + + 1.8.0_60 + + + 8.1.5.v20150921 + + + + alpn-when-jdk8_65 + + 1.8.0_65 + + + 8.1.6.v20151105 + + + + alpn-when-jdk8_66 + + 1.8.0_66 + + + 8.1.6.v20151105 + + + + alpn-when-jdk8_71 + + 1.8.0_71 + + + 8.1.7.v20160121 + + + + alpn-when-jdk8_72 + + 1.8.0_72 + + + 8.1.7.v20160121 + + + + alpn-when-jdk8_73 + + 1.8.0_73 + + + 8.1.7.v20160121 + + + + alpn-when-jdk8_74 + + 1.8.0_74 + + + 8.1.7.v20160121 + + + + alpn-when-jdk8_77 + + 1.8.0_77 + + + 8.1.7.v20160121 + + + + alpn-when-jdk8_91 + + 1.8.0_91 + + + 8.1.7.v20160121 + + + + alpn-when-jdk8_92 + + 1.8.0_92 + + + 8.1.8.v20160420 + + + + alpn-when-jdk8_101 + + 1.8.0_101 + + + 8.1.8.v20160420 + + + + alpn-when-jdk8_102 + + 1.8.0_102 + + + 8.1.9.v20160720 + + + + alpn-when-jdk8_111 + + 1.8.0_111 + + + 8.1.9.v20160720 + + + + alpn-when-jdk8_112 + + 1.8.0_112 + + + 8.1.9.v20160720 + + + + alpn-when-jdk8_121 + + 1.8.0_121 + + + 8.1.11.v20170118 + + + + alpn-when-jdk8_131 + + 1.8.0_131 + + + 8.1.11.v20170118 + + + + alpn-when-jdk8_141 + + 1.8.0_141 + + + 8.1.11.v20170118 + + + + alpn-when-jdk8_144 + + 1.8.0_144 + + + 8.1.11.v20170118 + + + + alpn-when-jdk8_151 + + 1.8.0_151 + + + 8.1.11.v20170118 + + + + alpn-when-jdk8_152 + + 1.8.0_152 + + + 8.1.11.v20170118 + + + + alpn-when-jdk8_161 + + 1.8.0_161 + + + 8.1.12.v20180117 + + + + alpn-when-jdk8_162 + + 1.8.0_162 + + + 8.1.12.v20180117 + + + + alpn-when-jdk8_163 + + 1.8.0_163 + + + 8.1.12.v20180117 + + + From 9996843502039ffa7a2b43c72187fb4e505dc9c9 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 10 Jul 2018 14:30:18 +0200 Subject: [PATCH 09/30] Update to Payara 5.182 --- pom.xml | 6 +++--- servlet/http2/pom.xml | 18 ++++++++++++++++++ test-utils/src/main/resources/arquillian.xml | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 25d52b31..cfc23c5d 100644 --- a/pom.xml +++ b/pom.xml @@ -25,10 +25,10 @@ - 5.Beta2 - 5.Beta3-m1 + 5.182 + 5.182 4.1.1 - 9.0.4 + 9.0.10 diff --git a/servlet/http2/pom.xml b/servlet/http2/pom.xml index 6f6e0f11..696ee854 100644 --- a/servlet/http2/pom.xml +++ b/servlet/http2/pom.xml @@ -354,6 +354,24 @@ 8.1.12.v20180117
+ + alpn-when-jdk8_172 + + 1.8.0_172 + + + 8.1.12.v20180117 + + + + alpn-when-jdk8_173 + + 1.8.0_173 + + + 8.1.12.v20180117 + + diff --git a/test-utils/src/main/resources/arquillian.xml b/test-utils/src/main/resources/arquillian.xml index 68b93843..bcd5d74e 100644 --- a/test-utils/src/main/resources/arquillian.xml +++ b/test-utils/src/main/resources/arquillian.xml @@ -7,7 +7,7 @@ - payaradomain + production From 262b14237a731d5490d259f7a19748227a1098a4 Mon Sep 17 00:00:00 2001 From: arjantijms Date: Tue, 10 Jul 2018 14:31:39 +0200 Subject: [PATCH 10/30] Added test for decorating a dynamically added CDI bean --- cdi/dynamic-bean-decorated/pom.xml | 12 ++++++ .../dynamic/bean/decorated/CdiExtension.java | 24 +++++++++++ .../cdi/dynamic/bean/decorated/MyBean.java | 10 +++++ .../dynamic/bean/decorated/MyBeanImpl.java | 29 +++++++++++++ .../javax.enterprise.inject.spi.Extension | 1 + .../bean/decorated/DynamicBeanTest.java | 41 +++++++++++++++++++ .../dynamic/bean/decorated/MyDecorator.java | 21 ++++++++++ .../src/test/resources/beans.xml | 8 ++++ 8 files changed, 146 insertions(+) create mode 100644 cdi/dynamic-bean-decorated/pom.xml create mode 100644 cdi/dynamic-bean-decorated/src/main/java/org/javaee8/cdi/dynamic/bean/decorated/CdiExtension.java create mode 100644 cdi/dynamic-bean-decorated/src/main/java/org/javaee8/cdi/dynamic/bean/decorated/MyBean.java create mode 100644 cdi/dynamic-bean-decorated/src/main/java/org/javaee8/cdi/dynamic/bean/decorated/MyBeanImpl.java create mode 100644 cdi/dynamic-bean-decorated/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension create mode 100644 cdi/dynamic-bean-decorated/src/test/java/org/javaee8/cdi/dynamic/bean/decorated/DynamicBeanTest.java create mode 100644 cdi/dynamic-bean-decorated/src/test/java/org/javaee8/cdi/dynamic/bean/decorated/MyDecorator.java create mode 100644 cdi/dynamic-bean-decorated/src/test/resources/beans.xml diff --git a/cdi/dynamic-bean-decorated/pom.xml b/cdi/dynamic-bean-decorated/pom.xml new file mode 100644 index 00000000..33fbd1c4 --- /dev/null +++ b/cdi/dynamic-bean-decorated/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + + + org.javaee8 + cdi + 1.0-SNAPSHOT + + + dynamic-bean-decorated + Java EE 8 Samples: CDI - Dynamic Bean Decorated + diff --git a/cdi/dynamic-bean-decorated/src/main/java/org/javaee8/cdi/dynamic/bean/decorated/CdiExtension.java b/cdi/dynamic-bean-decorated/src/main/java/org/javaee8/cdi/dynamic/bean/decorated/CdiExtension.java new file mode 100644 index 00000000..9a1517e1 --- /dev/null +++ b/cdi/dynamic-bean-decorated/src/main/java/org/javaee8/cdi/dynamic/bean/decorated/CdiExtension.java @@ -0,0 +1,24 @@ +package org.javaee8.cdi.dynamic.bean.decorated; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.event.Observes; +import javax.enterprise.inject.spi.AfterBeanDiscovery; +import javax.enterprise.inject.spi.Extension; + +/** + * + * @author Arjan Tijms + * + */ +public class CdiExtension implements Extension { + + public void afterBean(final @Observes AfterBeanDiscovery afterBeanDiscovery) { + afterBeanDiscovery + .addBean() + .scope(ApplicationScoped.class) + .types(MyBean.class) + .id("Created by " + CdiExtension.class) + .createWith(e -> new MyBeanImpl("Hi!")); + } + +} diff --git a/cdi/dynamic-bean-decorated/src/main/java/org/javaee8/cdi/dynamic/bean/decorated/MyBean.java b/cdi/dynamic-bean-decorated/src/main/java/org/javaee8/cdi/dynamic/bean/decorated/MyBean.java new file mode 100644 index 00000000..51b6a17c --- /dev/null +++ b/cdi/dynamic-bean-decorated/src/main/java/org/javaee8/cdi/dynamic/bean/decorated/MyBean.java @@ -0,0 +1,10 @@ +package org.javaee8.cdi.dynamic.bean.decorated; + +/** + * + * @author Arjan Tijms + * + */ +public interface MyBean { + String sayHi(); +} diff --git a/cdi/dynamic-bean-decorated/src/main/java/org/javaee8/cdi/dynamic/bean/decorated/MyBeanImpl.java b/cdi/dynamic-bean-decorated/src/main/java/org/javaee8/cdi/dynamic/bean/decorated/MyBeanImpl.java new file mode 100644 index 00000000..7fb6d32e --- /dev/null +++ b/cdi/dynamic-bean-decorated/src/main/java/org/javaee8/cdi/dynamic/bean/decorated/MyBeanImpl.java @@ -0,0 +1,29 @@ +package org.javaee8.cdi.dynamic.bean.decorated; + +import javax.enterprise.inject.Typed; + +/** + * + * @author Arjan Tijms + * + */ +// Typed: Extra guard so that MyBeanImpl has no types of itself, but extension archive is not scanned +// so not strictly needed. +@Typed +public class MyBeanImpl implements MyBean { + + private final String greet; + + // Note: There's no default ctor, so CDI cannot directly inject an instance of this + // bean. + + public MyBeanImpl(String greet) { + this.greet = greet; + } + + @Override + public String sayHi() { + return greet; + } + +} diff --git a/cdi/dynamic-bean-decorated/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension b/cdi/dynamic-bean-decorated/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension new file mode 100644 index 00000000..9c4a3530 --- /dev/null +++ b/cdi/dynamic-bean-decorated/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension @@ -0,0 +1 @@ +org.javaee8.cdi.dynamic.bean.decorated.CdiExtension \ No newline at end of file diff --git a/cdi/dynamic-bean-decorated/src/test/java/org/javaee8/cdi/dynamic/bean/decorated/DynamicBeanTest.java b/cdi/dynamic-bean-decorated/src/test/java/org/javaee8/cdi/dynamic/bean/decorated/DynamicBeanTest.java new file mode 100644 index 00000000..8fc3b192 --- /dev/null +++ b/cdi/dynamic-bean-decorated/src/test/java/org/javaee8/cdi/dynamic/bean/decorated/DynamicBeanTest.java @@ -0,0 +1,41 @@ +package org.javaee8.cdi.dynamic.bean.decorated; + +import static org.jboss.shrinkwrap.api.ShrinkWrap.create; +import static org.junit.Assert.assertEquals; + +import javax.inject.Inject; + +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 DynamicBeanTest { + + @Deployment + public static WebArchive deploy() { + return create(WebArchive.class) + .addAsLibraries( + create(JavaArchive.class) + .addClasses(CdiExtension.class, MyBean.class, MyBeanImpl.class) + .addAsResource("META-INF/services/javax.enterprise.inject.spi.Extension")) + .addClass(MyDecorator.class) + .addAsManifestResource("beans.xml"); + } + + @Inject + private MyBean myBean; + + @Test + public void test() { + assertEquals("Hi! decorated", myBean.sayHi()); + } +} diff --git a/cdi/dynamic-bean-decorated/src/test/java/org/javaee8/cdi/dynamic/bean/decorated/MyDecorator.java b/cdi/dynamic-bean-decorated/src/test/java/org/javaee8/cdi/dynamic/bean/decorated/MyDecorator.java new file mode 100644 index 00000000..3251afcf --- /dev/null +++ b/cdi/dynamic-bean-decorated/src/test/java/org/javaee8/cdi/dynamic/bean/decorated/MyDecorator.java @@ -0,0 +1,21 @@ +package org.javaee8.cdi.dynamic.bean.decorated; + +import javax.annotation.Priority; +import javax.decorator.Decorator; +import javax.decorator.Delegate; +import javax.inject.Inject; + +@Decorator +@Priority(100) +public class MyDecorator implements MyBean { + + @Inject + @Delegate + MyBean mybean; + + @Override + public String sayHi() { + return mybean.sayHi() + " decorated"; + } + +} diff --git a/cdi/dynamic-bean-decorated/src/test/resources/beans.xml b/cdi/dynamic-bean-decorated/src/test/resources/beans.xml new file mode 100644 index 00000000..d306e5f6 --- /dev/null +++ b/cdi/dynamic-bean-decorated/src/test/resources/beans.xml @@ -0,0 +1,8 @@ + + + + + From 7073125a0c023731cec9b598ba384c2ab015a96d Mon Sep 17 00:00:00 2001 From: Matt Gill Date: Fri, 20 Jul 2018 17:18:06 +0100 Subject: [PATCH 11/30] Revert "Merge pull request #17 from MattGill98/add-payara-micro-container" This reverts commit 44bb02c93bfc220c0e00baed796d211a495cef54, reversing changes made to 7d6ad86e8e81565e3400c0bcc543a570f54a8250. --- pom.xml | 51 --------------------------------------------------- 1 file changed, 51 deletions(-) diff --git a/pom.xml b/pom.xml index d88277ed..cfc23c5d 100644 --- a/pom.xml +++ b/pom.xml @@ -418,57 +418,6 @@ - - payara-micro-managed - - - - 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.version} - false - ${session.executionRootDirectory}/target/ - payara-micro-${payara.version}.jar - - - - - - - - - maven-surefire-plugin - - - ${session.executionRootDirectory}/target/payara-micro-${payara.version}.jar - - - - - - - payara-embedded From e47b3955e7220e8b0b016171cc713eb602f7fede Mon Sep 17 00:00:00 2001 From: David Matejcek Date: Mon, 30 Jul 2018 16:12:35 +0200 Subject: [PATCH 12/30] Fixed #23 ClientConfig differs between appservers - test was successful if run against remote servers, but failed with embedded The cause was that the default server's private embedded payara provider is incompatible with the jerseys's - solution: configure the jersey client to be independent on server settings/impl - also done some cleanup and comments - the test is faster now and has timeout set (hangouts were possible) - no asserts lost now (try/catch/stacktrace replaced with collecting junit exceptions from each event processing and asserting that all assertions passed and no exception was thrown) --- .../jaxrs/sseproducer/data/EventData.java | 8 +- .../sseproducer/producer/SseResource.java | 18 +-- jaxrs/sse-producer/src/main/webapp/index.html | 10 +- .../jaxrs/sseproducer/SseResourceTest.java | 129 +++++++++++------- 4 files changed, 92 insertions(+), 73 deletions(-) diff --git a/jaxrs/sse-producer/src/main/java/org/javaee8/jaxrs/sseproducer/data/EventData.java b/jaxrs/sse-producer/src/main/java/org/javaee8/jaxrs/sseproducer/data/EventData.java index 64fc5713..8c208462 100644 --- a/jaxrs/sse-producer/src/main/java/org/javaee8/jaxrs/sseproducer/data/EventData.java +++ b/jaxrs/sse-producer/src/main/java/org/javaee8/jaxrs/sseproducer/data/EventData.java @@ -2,7 +2,6 @@ import java.util.Date; import java.util.UUID; -import javax.json.bind.JsonbBuilder; /** * @@ -16,7 +15,7 @@ public class EventData { public EventData() { } - + public EventData(String comment) { this.setTime(new Date()); this.setId(UUID.randomUUID().toString()); @@ -46,9 +45,4 @@ public String getComment() { public void setComment(String comment) { this.comment = comment; } - - @Override - public String toString() { - return JsonbBuilder.create().toJson(this); - } } diff --git a/jaxrs/sse-producer/src/main/java/org/javaee8/jaxrs/sseproducer/producer/SseResource.java b/jaxrs/sse-producer/src/main/java/org/javaee8/jaxrs/sseproducer/producer/SseResource.java index 63ad39ac..b82a60de 100644 --- a/jaxrs/sse-producer/src/main/java/org/javaee8/jaxrs/sseproducer/producer/SseResource.java +++ b/jaxrs/sse-producer/src/main/java/org/javaee8/jaxrs/sseproducer/producer/SseResource.java @@ -15,11 +15,13 @@ import org.javaee8.jaxrs.sseproducer.data.EventData; /** + * Produces server side events. + * * @author Daniel Contreras */ @Path("sse") public class SseResource { - + @Context private Sse sse; @@ -34,25 +36,23 @@ public void init() { @Path("register") @Produces(MediaType.SERVER_SENT_EVENTS) public void register(@Context SseEventSink eventSink) { - - Jsonb jsonb = JsonbBuilder.create(); - eventSink.send(sse.newEvent("INIT",new EventData("event:intialized").toString())); + final Jsonb json = JsonbBuilder.create(); + eventSink.send(sse.newEvent("INIT", json.toJson(new EventData("event:intialized")))); sseBroadcaster.register(eventSink); for (int i = 0; i < 5; i++) { - sseBroadcaster.broadcast(sse.newEvent("EVENT",new EventData("event:"+i).toString())); + sseBroadcaster.broadcast(sse.newEvent("EVENT", json.toJson(new EventData("event:" + i)))); try { - Thread.sleep(100); + Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } - - eventSink.send(sse.newEvent("FINISH",new EventData("event:finished").toString())); + + eventSink.send(sse.newEvent("FINISH", json.toJson(new EventData("event:finished")))); } - } diff --git a/jaxrs/sse-producer/src/main/webapp/index.html b/jaxrs/sse-producer/src/main/webapp/index.html index dba826df..a7763133 100644 --- a/jaxrs/sse-producer/src/main/webapp/index.html +++ b/jaxrs/sse-producer/src/main/webapp/index.html @@ -1,9 +1,5 @@ @@ -20,7 +16,7 @@