diff options
author | Joakim Erdfelt | 2013-04-23 18:06:01 +0000 |
---|---|---|
committer | Joakim Erdfelt | 2013-04-23 18:06:01 +0000 |
commit | a4644dc78008dab958895ba87fe2f6a99aea909b (patch) | |
tree | 5cbfe85fd6757904db5f887ea4ca3cbc5959a1d9 /jetty-websocket/javax-websocket-server-impl/src/test | |
parent | 346034b44fe42af7c592c138347c0dabbb124f2a (diff) | |
download | org.eclipse.jetty.project-a4644dc78008dab958895ba87fe2f6a99aea909b.tar.gz org.eclipse.jetty.project-a4644dc78008dab958895ba87fe2f6a99aea909b.tar.xz org.eclipse.jetty.project-a4644dc78008dab958895ba87fe2f6a99aea909b.zip |
JSR-356 working out server endpoint creation
Diffstat (limited to 'jetty-websocket/javax-websocket-server-impl/src/test')
17 files changed, 470 insertions, 589 deletions
diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BasicAnnotatedTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BasicAnnotatedTest.java index 197f71a5c7..1017c4640c 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BasicAnnotatedTest.java +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BasicAnnotatedTest.java @@ -35,11 +35,14 @@ import org.eclipse.jetty.webapp.WebInfConfiguration; import org.eclipse.jetty.webapp.WebXmlConfiguration; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.client.WebSocketClient; -import org.eclipse.jetty.websocket.jsr356.server.samples.BasicEchoSocket; +import org.eclipse.jetty.websocket.jsr356.server.samples.echo.BasicEchoSocket; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; +/** + * Example of an annotated echo server discovered via annotation scanning. + */ public class BasicAnnotatedTest { @Rule diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BasicEndpointTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BasicEndpointTest.java new file mode 100644 index 0000000000..411b2b3041 --- /dev/null +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/BasicEndpointTest.java @@ -0,0 +1,90 @@ +// +// ======================================================================== +// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.websocket.jsr356.server; + +import java.net.URI; +import java.util.Queue; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +import javax.websocket.Endpoint; +import javax.websocket.server.ServerContainer; + +import org.eclipse.jetty.toolchain.test.TestingDir; +import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.client.WebSocketClient; +import org.eclipse.jetty.websocket.jsr356.server.samples.echo.BasicEchoEndpoint; +import org.eclipse.jetty.websocket.jsr356.server.samples.echo.BasicEchoEndpointConfigContextListener; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; + +/** + * Example of an {@link Endpoint} extended echo server added programmatically via the + * {@link ServerContainer#addEndpoint(javax.websocket.server.ServerEndpointConfig)} + */ +public class BasicEndpointTest +{ + @Rule + public TestingDir testdir = new TestingDir(); + + @Test + public void testEcho() throws Exception + { + WSServer wsb = new WSServer(testdir,"app"); + wsb.copyWebInf("basic-echo-endpoint-config-web.xml"); + // the endpoint (extends javax.websocket.Endpoint) + wsb.copyClass(BasicEchoEndpoint.class); + // the configuration (adds the endpoint) + wsb.copyClass(BasicEchoEndpointConfigContextListener.class); + + try + { + wsb.start(); + URI uri = wsb.getServerBaseURI(); + + WebAppContext webapp = wsb.createWebAppContext(); + // default webapp configuration used (no annotation scanning) + wsb.deployWebapp(webapp); + wsb.dump(); + + WebSocketClient client = new WebSocketClient(); + try + { + client.start(); + JettyEchoSocket clientEcho = new JettyEchoSocket(); + Future<Session> future = client.connect(clientEcho,uri.resolve("/echo")); + // wait for connect + future.get(1,TimeUnit.SECONDS); + clientEcho.sendMessage("Hello World"); + Queue<String> msgs = clientEcho.awaitMessages(1); + Assert.assertEquals("Expected message","Hello World",msgs.poll()); + } + finally + { + client.stop(); + } + } + finally + { + wsb.stop(); + } + } +} diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/JettyServerEndpointConfiguratorTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/JettyServerEndpointConfiguratorTest.java new file mode 100644 index 0000000000..55e30f3acc --- /dev/null +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/JettyServerEndpointConfiguratorTest.java @@ -0,0 +1,51 @@ +// +// ======================================================================== +// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.websocket.jsr356.server; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +import java.util.Iterator; +import java.util.ServiceLoader; + +import javax.websocket.server.ServerEndpointConfig; + +import org.junit.Test; + +/** + * Test the JettyServerEndpointConfigurator impl. + */ +public class JettyServerEndpointConfiguratorTest +{ + @Test + public void testServiceLoader() + { + System.out.printf("Service Name: %s%n",ServerEndpointConfig.Configurator.class.getName()); + + ServiceLoader<ServerEndpointConfig.Configurator> loader = ServiceLoader.load(javax.websocket.server.ServerEndpointConfig.Configurator.class); + assertThat("loader",loader,notNullValue()); + Iterator<ServerEndpointConfig.Configurator> iter = loader.iterator(); + assertThat("loader.iterator",iter,notNullValue()); + assertThat("loader.iterator.hasNext",iter.hasNext(),is(true)); + + ServerEndpointConfig.Configurator configr = iter.next(); + assertThat("Configurator",configr,notNullValue()); + assertThat("COnfigurator type",configr,instanceOf(JettyServerEndpointConfigurator.class)); + } +} diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/WSServer.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/WSServer.java index 3dc2ed997a..baeeff70ed 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/WSServer.java +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/WSServer.java @@ -34,6 +34,8 @@ import org.eclipse.jetty.toolchain.test.IO; import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.toolchain.test.OS; import org.eclipse.jetty.toolchain.test.TestingDir; +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.webapp.WebAppContext; import org.junit.Assert; @@ -44,6 +46,7 @@ import org.junit.Assert; */ public class WSServer { + private static final Logger LOG = Log.getLogger(WSServer.class); @SuppressWarnings("unused") private final TestingDir testdir; private final File contextDir; @@ -62,18 +65,34 @@ public class WSServer FS.ensureEmpty(contextDir); } - public void copyEndpoint(Class<?> endpointClass) throws Exception + public void copyClass(Class<?> clazz) throws Exception { ClassLoader cl = Thread.currentThread().getContextClassLoader(); - String endpointPath = endpointClass.getName().replace('.','/') + ".class"; + String endpointPath = clazz.getName().replace('.','/') + ".class"; URL classUrl = cl.getResource(endpointPath); - Assert.assertThat("Class URL for: " + endpointClass,classUrl,notNullValue()); + Assert.assertThat("Class URL for: " + clazz,classUrl,notNullValue()); File destFile = new File(classesDir,OS.separators(endpointPath)); FS.ensureDirExists(destFile.getParentFile()); File srcFile = new File(classUrl.toURI()); IO.copy(srcFile,destFile); } + public void copyEndpoint(Class<?> endpointClass) throws Exception + { + copyClass(endpointClass); + } + + public void copyWebInf(String testResourceName) throws IOException + { + webinf = new File(contextDir,"WEB-INF"); + FS.ensureDirExists(webinf); + classesDir = new File(webinf,"classes"); + FS.ensureDirExists(classesDir); + File webxml = new File(webinf,"web.xml"); + File testWebXml = MavenTestingUtils.getTestResourceFile(testResourceName); + IO.copy(testWebXml,webxml); + } + public WebAppContext createWebAppContext() { WebAppContext context = new WebAppContext(); @@ -84,13 +103,7 @@ public class WSServer public void createWebInf() throws IOException { - webinf = new File(contextDir,"WEB-INF"); - FS.ensureDirExists(webinf); - classesDir = new File(webinf,"classes"); - FS.ensureDirExists(classesDir); - File webxml = new File(webinf,"web.xml"); - File emptyWebXml = MavenTestingUtils.getTestResourceFile("empty-web.xml"); - IO.copy(emptyWebXml,webxml); + copyWebInf("empty-web.xml"); } public void deployWebapp(WebAppContext webapp) throws Exception @@ -134,6 +147,7 @@ public class WSServer } int port = connector.getLocalPort(); serverUri = new URI(String.format("ws://%s:%d/",host,port)); + LOG.debug("Server started on {}",serverUri); } public void stop() diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/PathMappingsBenchmarkTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/PathMappingsBenchmarkTest.java deleted file mode 100644 index 250ec30934..0000000000 --- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/PathMappingsBenchmarkTest.java +++ /dev/null @@ -1,224 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.eclipse.jetty.websocket.jsr356.server.pathmap; - -import java.util.concurrent.CyclicBarrier; -import java.util.concurrent.TimeUnit; - -import org.eclipse.jetty.http.PathMap; -import org.eclipse.jetty.toolchain.test.AdvancedRunner; -import org.eclipse.jetty.toolchain.test.annotation.Stress; -import org.eclipse.jetty.util.log.Log; -import org.eclipse.jetty.util.log.Logger; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AdvancedRunner.class) -public class PathMappingsBenchmarkTest -{ - public static abstract class AbstractPathMapThread extends Thread - { - private int iterations; - private CyclicBarrier barrier; - private long success; - private long error; - - public AbstractPathMapThread(int iterations, CyclicBarrier barrier) - { - this.iterations = iterations; - this.barrier = barrier; - } - - public abstract String getMatchedResource(String path); - - @Override - public void run() - { - int llen = LOOKUPS.length; - String path; - String expectedResource; - String matchedResource; - await(barrier); - for (int iter = 0; iter < iterations; iter++) - { - for (int li = 0; li < llen; li++) - { - path = LOOKUPS[li][0]; - expectedResource = LOOKUPS[li][1]; - matchedResource = getMatchedResource(path); - if (matchedResource.equals(expectedResource)) - { - success++; - } - else - { - error++; - } - } - } - await(barrier); - } - } - - public static class PathMapMatchThread extends AbstractPathMapThread - { - private PathMap<String> pathmap; - - public PathMapMatchThread(PathMap<String> pathmap, int iters, CyclicBarrier barrier) - { - super(iters,barrier); - this.pathmap = pathmap; - } - - @Override - public String getMatchedResource(String path) - { - return pathmap.getMatch(path).getValue(); - } - } - - public static class PathMatchThread extends AbstractPathMapThread - { - private PathMappings<String> pathmap; - - public PathMatchThread(PathMappings<String> pathmap, int iters, CyclicBarrier barrier) - { - super(iters,barrier); - this.pathmap = pathmap; - } - - @Override - public String getMatchedResource(String path) - { - return pathmap.getMatch(path).getResource(); - } - } - - private static final Logger LOG = Log.getLogger(PathMappingsBenchmarkTest.class); - private static final String[][] LOOKUPS; - private int runs = 20; - private int threads = 200; - private int iters = 10000; - - static - { - LOOKUPS = new String[][] - { - // @formatter:off - { "/abs/path", "path" }, - { "/abs/path/longer","longpath" }, - { "/abs/path/foo","default" }, - { "/main.css","default" }, - { "/downloads/script.gz","gzipped" }, - { "/downloads/distribution.tar.gz","tarball" }, - { "/downloads/readme.txt","default" }, - { "/downloads/logs.tgz","default" }, - { "/animal/horse/mustang","animals" }, - { "/animal/bird/eagle/bald","birds" }, - { "/animal/fish/shark/hammerhead","fishes" }, - { "/animal/insect/ladybug","animals" }, - // @formatter:on - }; - } - - private static void await(CyclicBarrier barrier) - { - try - { - barrier.await(); - } - catch (Exception x) - { - throw new RuntimeException(x); - } - } - - @Stress("High CPU") - @Test - public void testServletPathMap() - { - // Setup (old) PathMap - - PathMap<String> p = new PathMap<>(); - - p.put("/abs/path","path"); - p.put("/abs/path/longer","longpath"); - p.put("/animal/bird/*","birds"); - p.put("/animal/fish/*","fishes"); - p.put("/animal/*","animals"); - p.put("*.tar.gz","tarball"); - p.put("*.gz","gzipped"); - p.put("/","default"); - - final CyclicBarrier barrier = new CyclicBarrier(threads + 1); - - for (int r = 0; r < runs; r++) - { - for (int t = 0; t < threads; t++) - { - PathMapMatchThread thread = new PathMapMatchThread(p,iters,barrier); - thread.start(); - } - await(barrier); - long begin = System.nanoTime(); - await(barrier); - long end = System.nanoTime(); - long elapsed = TimeUnit.NANOSECONDS.toMillis(end - begin); - int totalMatches = threads * iters * LOOKUPS.length; - LOG.info("jetty-http/PathMap (Servlet only) threads:{}/iters:{}/total-matches:{} => {} ms",threads,iters,totalMatches,elapsed); - } - } - - @Stress("High CPU") - @Test - public void testServletPathMappings() - { - // Setup (new) PathMappings - - PathMappings<String> p = new PathMappings<>(); - - p.put(new ServletPathSpec("/abs/path"),"path"); - p.put(new ServletPathSpec("/abs/path/longer"),"longpath"); - p.put(new ServletPathSpec("/animal/bird/*"),"birds"); - p.put(new ServletPathSpec("/animal/fish/*"),"fishes"); - p.put(new ServletPathSpec("/animal/*"),"animals"); - p.put(new ServletPathSpec("*.tar.gz"),"tarball"); - p.put(new ServletPathSpec("*.gz"),"gzipped"); - p.put(new ServletPathSpec("/"),"default"); - - final CyclicBarrier barrier = new CyclicBarrier(threads + 1); - - for (int r = 0; r < runs; r++) - { - for (int t = 0; t < threads; t++) - { - PathMatchThread thread = new PathMatchThread(p,iters,barrier); - thread.start(); - } - await(barrier); - long begin = System.nanoTime(); - await(barrier); - long end = System.nanoTime(); - long elapsed = TimeUnit.NANOSECONDS.toMillis(end - begin); - int totalMatches = threads * iters * LOOKUPS.length; - LOG.info("jetty-websocket/PathMappings (Servlet only) threads:{}/iters:{}/total-matches:{} => {} ms",threads,iters,totalMatches,elapsed); - - } - } -} diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/PathMappingsTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/PathMappingsTest.java index 1479393f01..2ba15abe9d 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/PathMappingsTest.java +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/PathMappingsTest.java @@ -20,7 +20,9 @@ package org.eclipse.jetty.websocket.jsr356.server.pathmap; import static org.hamcrest.Matchers.*; -import org.eclipse.jetty.websocket.jsr356.server.pathmap.PathMappings.MappedResource; +import org.eclipse.jetty.websocket.server.pathmap.PathMappings; +import org.eclipse.jetty.websocket.server.pathmap.PathMappings.MappedResource; +import org.eclipse.jetty.websocket.server.pathmap.ServletPathSpec; import org.junit.Assert; import org.junit.Test; @@ -73,49 +75,6 @@ public class PathMappingsTest } /** - * Test the match order rules imposed by the Servlet API. - * <p> - * <ul> - * <li>Exact match</li> - * <li>Longest prefix match</li> - * <li>Longest suffix match</li> - * <li>default</li> - * </ul> - */ - @Test - public void testServletMatchOrder() - { - PathMappings<String> p = new PathMappings<>(); - - p.put(new ServletPathSpec("/abs/path"),"path"); - p.put(new ServletPathSpec("/abs/path/longer"),"longpath"); - p.put(new ServletPathSpec("/animal/bird/*"),"birds"); - p.put(new ServletPathSpec("/animal/fish/*"),"fishes"); - p.put(new ServletPathSpec("/animal/*"),"animals"); - p.put(new ServletPathSpec("*.tar.gz"),"tarball"); - p.put(new ServletPathSpec("*.gz"),"gzipped"); - p.put(new ServletPathSpec("/"),"default"); - - for (MappedResource<String> res : p) - { - System.out.printf(" %s%n",res); - } - - assertMatch(p,"/abs/path","path"); - assertMatch(p,"/abs/path/longer","longpath"); - assertMatch(p,"/abs/path/foo","default"); - assertMatch(p,"/main.css","default"); - assertMatch(p,"/downloads/script.gz","gzipped"); - assertMatch(p,"/downloads/distribution.tar.gz","tarball"); - assertMatch(p,"/downloads/readme.txt","default"); - assertMatch(p,"/downloads/logs.tgz","default"); - assertMatch(p,"/animal/horse/mustang","animals"); - assertMatch(p,"/animal/bird/eagle/bald","birds"); - assertMatch(p,"/animal/fish/shark/hammerhead","fishes"); - assertMatch(p,"/animal/insect/ladybug","animals"); - } - - /** * Test the match order rules imposed by the WebSocket API (JSR-356) * <p> * <ul> diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/RegexPathSpecTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/RegexPathSpecTest.java deleted file mode 100644 index cdcc150676..0000000000 --- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/RegexPathSpecTest.java +++ /dev/null @@ -1,113 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.eclipse.jetty.websocket.jsr356.server.pathmap; - -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - -import org.junit.Test; - -public class RegexPathSpecTest -{ - public static void assertMatches(PathSpec spec, String path) - { - String msg = String.format("Spec(\"%s\").matches(\"%s\")",spec.getPathSpec(),path); - assertThat(msg,spec.matches(path),is(true)); - } - - public static void assertNotMatches(PathSpec spec, String path) - { - String msg = String.format("!Spec(\"%s\").matches(\"%s\")",spec.getPathSpec(),path); - assertThat(msg,spec.matches(path),is(false)); - } - - @Test - public void testExactSpec() - { - RegexPathSpec spec = new RegexPathSpec("^/a$"); - assertEquals("Spec.pathSpec","^/a$",spec.getPathSpec()); - assertEquals("Spec.pattern","^/a$",spec.getPattern().pattern()); - assertEquals("Spec.pathDepth",1,spec.getPathDepth()); - assertEquals("Spec.group",PathSpecGroup.EXACT,spec.group); - - assertMatches(spec,"/a"); - - assertNotMatches(spec,"/aa"); - assertNotMatches(spec,"/a/"); - } - - @Test - public void testMiddleSpec() - { - RegexPathSpec spec = new RegexPathSpec("^/rest/([^/]*)/list$"); - assertEquals("Spec.pathSpec","^/rest/([^/]*)/list$",spec.getPathSpec()); - assertEquals("Spec.pattern","^/rest/([^/]*)/list$",spec.getPattern().pattern()); - assertEquals("Spec.pathDepth",3,spec.getPathDepth()); - assertEquals("Spec.group",PathSpecGroup.MIDDLE_GLOB,spec.group); - - assertMatches(spec,"/rest/api/list"); - assertMatches(spec,"/rest/1.0/list"); - assertMatches(spec,"/rest/2.0/list"); - assertMatches(spec,"/rest/accounts/list"); - - assertNotMatches(spec,"/a"); - assertNotMatches(spec,"/aa"); - assertNotMatches(spec,"/aa/bb"); - assertNotMatches(spec,"/rest/admin/delete"); - assertNotMatches(spec,"/rest/list"); - } - - @Test - public void testPrefixSpec() - { - RegexPathSpec spec = new RegexPathSpec("^/a/(.*)$"); - assertEquals("Spec.pathSpec","^/a/(.*)$",spec.getPathSpec()); - assertEquals("Spec.pattern","^/a/(.*)$",spec.getPattern().pattern()); - assertEquals("Spec.pathDepth",2,spec.getPathDepth()); - assertEquals("Spec.group",PathSpecGroup.PREFIX_GLOB,spec.group); - - assertMatches(spec,"/a/"); - assertMatches(spec,"/a/b"); - assertMatches(spec,"/a/b/c/d/e"); - - assertNotMatches(spec,"/a"); - assertNotMatches(spec,"/aa"); - assertNotMatches(spec,"/aa/bb"); - } - - @Test - public void testSuffixSpec() - { - RegexPathSpec spec = new RegexPathSpec("^(.*).do$"); - assertEquals("Spec.pathSpec","^(.*).do$",spec.getPathSpec()); - assertEquals("Spec.pattern","^(.*).do$",spec.getPattern().pattern()); - assertEquals("Spec.pathDepth",0,spec.getPathDepth()); - assertEquals("Spec.group",PathSpecGroup.SUFFIX_GLOB,spec.group); - - assertMatches(spec,"/a.do"); - assertMatches(spec,"/a/b/c.do"); - assertMatches(spec,"/abcde.do"); - assertMatches(spec,"/abc/efg.do"); - - assertNotMatches(spec,"/a"); - assertNotMatches(spec,"/aa"); - assertNotMatches(spec,"/aa/bb"); - assertNotMatches(spec,"/aa/bb.do/more"); - } -} diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/ServletPathSpecTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/ServletPathSpecTest.java deleted file mode 100644 index f1bd83a2fa..0000000000 --- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/ServletPathSpecTest.java +++ /dev/null @@ -1,186 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.eclipse.jetty.websocket.jsr356.server.pathmap; - -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - -import org.junit.Test; - -public class ServletPathSpecTest -{ - private void assertBadServletPathSpec(String pathSpec) - { - try - { - new ServletPathSpec(pathSpec); - fail("Expected IllegalArgumentException for a bad servlet pathspec on: " + pathSpec); - } - catch (IllegalArgumentException e) - { - // expected path - System.out.println(e); - } - } - - private void assertMatches(ServletPathSpec spec, String path) - { - String msg = String.format("Spec(\"%s\").matches(\"%s\")",spec.getPathSpec(),path); - assertThat(msg,spec.matches(path),is(true)); - } - - private void assertNotMatches(ServletPathSpec spec, String path) - { - String msg = String.format("!Spec(\"%s\").matches(\"%s\")",spec.getPathSpec(),path); - assertThat(msg,spec.matches(path),is(false)); - } - - @Test - public void testBadServletPathSpecA() - { - assertBadServletPathSpec("foo"); - } - - @Test - public void testBadServletPathSpecB() - { - assertBadServletPathSpec("/foo/*.do"); - } - - @Test - public void testBadServletPathSpecC() - { - assertBadServletPathSpec("foo/*.do"); - } - - @Test - public void testBadServletPathSpecD() - { - assertBadServletPathSpec("foo/*.*do"); - } - - @Test - public void testBadServletPathSpecE() - { - assertBadServletPathSpec("*do"); - } - - @Test - public void testDefaultPathSpec() - { - ServletPathSpec spec = new ServletPathSpec("/"); - assertEquals("Spec.pathSpec","/",spec.getPathSpec()); - assertEquals("Spec.pathDepth",-1,spec.getPathDepth()); - } - - @Test - public void testEmptyPathSpec() - { - ServletPathSpec spec = new ServletPathSpec(""); - assertEquals("Spec.pathSpec","/",spec.getPathSpec()); - assertEquals("Spec.pathDepth",-1,spec.getPathDepth()); - } - - @Test - public void testExactPathSpec() - { - ServletPathSpec spec = new ServletPathSpec("/abs/path"); - assertEquals("Spec.pathSpec","/abs/path",spec.getPathSpec()); - assertEquals("Spec.pathDepth",2,spec.getPathDepth()); - - assertMatches(spec,"/abs/path"); - assertMatches(spec,"/abs/path/"); - - assertNotMatches(spec,"/abs/path/more"); - assertNotMatches(spec,"/foo"); - assertNotMatches(spec,"/foo/abs/path"); - assertNotMatches(spec,"/foo/abs/path/"); - } - - @Test - public void testGetPathInfo() - { - assertEquals("pathInfo exact",null,new ServletPathSpec("/Foo/bar").getPathInfo("/Foo/bar")); - assertEquals("pathInfo prefix","/bar",new ServletPathSpec("/Foo/*").getPathInfo("/Foo/bar")); - assertEquals("pathInfo prefix","/*",new ServletPathSpec("/Foo/*").getPathInfo("/Foo/*")); - assertEquals("pathInfo prefix","/",new ServletPathSpec("/Foo/*").getPathInfo("/Foo/")); - assertEquals("pathInfo prefix",null,new ServletPathSpec("/Foo/*").getPathInfo("/Foo")); - assertEquals("pathInfo suffix",null,new ServletPathSpec("*.ext").getPathInfo("/Foo/bar.ext")); - assertEquals("pathInfo default",null,new ServletPathSpec("/").getPathInfo("/Foo/bar.ext")); - - assertEquals("pathInfo default","/xxx/zzz",new ServletPathSpec("/*").getPathInfo("/xxx/zzz")); - } - - @Test - public void testNullPathSpec() - { - ServletPathSpec spec = new ServletPathSpec(null); - assertEquals("Spec.pathSpec","/",spec.getPathSpec()); - assertEquals("Spec.pathDepth",-1,spec.getPathDepth()); - } - - @Test - public void testPathMatch() - { - assertEquals("pathMatch exact","/Foo/bar",new ServletPathSpec("/Foo/bar").getPathMatch("/Foo/bar")); - assertEquals("pathMatch prefix","/Foo",new ServletPathSpec("/Foo/*").getPathMatch("/Foo/bar")); - assertEquals("pathMatch prefix","/Foo",new ServletPathSpec("/Foo/*").getPathMatch("/Foo/")); - assertEquals("pathMatch prefix","/Foo",new ServletPathSpec("/Foo/*").getPathMatch("/Foo")); - assertEquals("pathMatch suffix","/Foo/bar.ext",new ServletPathSpec("*.ext").getPathMatch("/Foo/bar.ext")); - assertEquals("pathMatch default","/Foo/bar.ext",new ServletPathSpec("/").getPathMatch("/Foo/bar.ext")); - - assertEquals("pathMatch default","",new ServletPathSpec("/*").getPathMatch("/xxx/zzz")); - } - - @Test - public void testPrefixPathSpec() - { - ServletPathSpec spec = new ServletPathSpec("/downloads/*"); - assertEquals("Spec.pathSpec","/downloads/*",spec.getPathSpec()); - assertEquals("Spec.pathDepth",2,spec.getPathDepth()); - - assertMatches(spec,"/downloads/logo.jpg"); - assertMatches(spec,"/downloads/distribution.tar.gz"); - assertMatches(spec,"/downloads/distribution.tgz"); - assertMatches(spec,"/downloads/distribution.zip"); - - assertMatches(spec,"/downloads"); - - assertEquals("Spec.pathInfo","/",spec.getPathInfo("/downloads/")); - assertEquals("Spec.pathInfo","/distribution.zip",spec.getPathInfo("/downloads/distribution.zip")); - assertEquals("Spec.pathInfo","/dist/9.0/distribution.tar.gz",spec.getPathInfo("/downloads/dist/9.0/distribution.tar.gz")); - } - - @Test - public void testSuffixPathSpec() - { - ServletPathSpec spec = new ServletPathSpec("*.gz"); - assertEquals("Spec.pathSpec","*.gz",spec.getPathSpec()); - assertEquals("Spec.pathDepth",0,spec.getPathDepth()); - - assertMatches(spec,"/downloads/distribution.tar.gz"); - assertMatches(spec,"/downloads/jetty.log.gz"); - - assertNotMatches(spec,"/downloads/distribution.zip"); - assertNotMatches(spec,"/downloads/distribution.tgz"); - assertNotMatches(spec,"/abs/path"); - - assertEquals("Spec.pathInfo",null,spec.getPathInfo("/downloads/distribution.tar.gz")); - } -} diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/WebSocketPathSpecTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/WebSocketPathSpecTest.java index ef84852009..d85d0bb7af 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/WebSocketPathSpecTest.java +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/pathmap/WebSocketPathSpecTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.*; import java.util.Map; +import org.eclipse.jetty.websocket.server.pathmap.PathSpecGroup; import org.junit.Test; /** @@ -60,7 +61,7 @@ public class WebSocketPathSpecTest assertEquals("Spec.pathSpec","/",spec.getPathSpec()); assertEquals("Spec.pattern","^/$",spec.getPattern().pattern()); assertEquals("Spec.pathDepth",1,spec.getPathDepth()); - assertEquals("Spec.group",PathSpecGroup.EXACT,spec.group); + assertEquals("Spec.group",PathSpecGroup.EXACT,spec.getGroup()); assertEquals("Spec.variableCount",0,spec.getVariableCount()); assertEquals("Spec.variable.length",0,spec.getVariables().length); @@ -73,7 +74,7 @@ public class WebSocketPathSpecTest assertEquals("Spec.pathSpec","/a",spec.getPathSpec()); assertEquals("Spec.pattern","^/a$",spec.getPattern().pattern()); assertEquals("Spec.pathDepth",1,spec.getPathDepth()); - assertEquals("Spec.group",PathSpecGroup.EXACT,spec.group); + assertEquals("Spec.group",PathSpecGroup.EXACT,spec.getGroup()); assertEquals("Spec.variableCount",0,spec.getVariableCount()); assertEquals("Spec.variable.length",0,spec.getVariables().length); @@ -86,7 +87,7 @@ public class WebSocketPathSpecTest assertEquals("Spec.pathSpec","/a/b",spec.getPathSpec()); assertEquals("Spec.pattern","^/a/b$",spec.getPattern().pattern()); assertEquals("Spec.pathDepth",2,spec.getPathDepth()); - assertEquals("Spec.group",PathSpecGroup.EXACT,spec.group); + assertEquals("Spec.group",PathSpecGroup.EXACT,spec.getGroup()); assertEquals("Spec.variableCount",0,spec.getVariableCount()); assertEquals("Spec.variable.length",0,spec.getVariables().length); @@ -105,7 +106,7 @@ public class WebSocketPathSpecTest assertEquals("Spec.pathSpec","/a/{var}/c",spec.getPathSpec()); assertEquals("Spec.pattern","^/a/([^/]+)/c$",spec.getPattern().pattern()); assertEquals("Spec.pathDepth",3,spec.getPathDepth()); - assertEquals("Spec.group",PathSpecGroup.MIDDLE_GLOB,spec.group); + assertEquals("Spec.group",PathSpecGroup.MIDDLE_GLOB,spec.getGroup()); assertDetectedVars(spec,"var"); @@ -129,7 +130,7 @@ public class WebSocketPathSpecTest assertEquals("Spec.pathSpec","/a/{foo}",spec.getPathSpec()); assertEquals("Spec.pattern","^/a/([^/]+)$",spec.getPattern().pattern()); assertEquals("Spec.pathDepth",2,spec.getPathDepth()); - assertEquals("Spec.group",PathSpecGroup.PREFIX_GLOB,spec.group); + assertEquals("Spec.group",PathSpecGroup.PREFIX_GLOB,spec.getGroup()); assertDetectedVars(spec,"foo"); @@ -150,7 +151,7 @@ public class WebSocketPathSpecTest assertEquals("Spec.pathSpec","/{var}/b/c",spec.getPathSpec()); assertEquals("Spec.pattern","^/([^/]+)/b/c$",spec.getPattern().pattern()); assertEquals("Spec.pathDepth",3,spec.getPathDepth()); - assertEquals("Spec.group",PathSpecGroup.SUFFIX_GLOB,spec.group); + assertEquals("Spec.group",PathSpecGroup.SUFFIX_GLOB,spec.getGroup()); assertDetectedVars(spec,"var"); @@ -174,7 +175,7 @@ public class WebSocketPathSpecTest assertEquals("Spec.pathSpec","/a/{var1}/c/{var2}/e",spec.getPathSpec()); assertEquals("Spec.pattern","^/a/([^/]+)/c/([^/]+)/e$",spec.getPattern().pattern()); assertEquals("Spec.pathDepth",5,spec.getPathDepth()); - assertEquals("Spec.group",PathSpecGroup.MIDDLE_GLOB,spec.group); + assertEquals("Spec.group",PathSpecGroup.MIDDLE_GLOB,spec.getGroup()); assertDetectedVars(spec,"var1","var2"); @@ -197,7 +198,7 @@ public class WebSocketPathSpecTest assertEquals("Spec.pathSpec","/{var1}/b/{var2}/{var3}",spec.getPathSpec()); assertEquals("Spec.pattern","^/([^/]+)/b/([^/]+)/([^/]+)$",spec.getPattern().pattern()); assertEquals("Spec.pathDepth",4,spec.getPathDepth()); - assertEquals("Spec.group",PathSpecGroup.MIDDLE_GLOB,spec.group); + assertEquals("Spec.group",PathSpecGroup.MIDDLE_GLOB,spec.getGroup()); assertDetectedVars(spec,"var1","var2","var3"); @@ -221,7 +222,7 @@ public class WebSocketPathSpecTest assertEquals("Spec.pathSpec","/a/{var1}/{var2}",spec.getPathSpec()); assertEquals("Spec.pattern","^/a/([^/]+)/([^/]+)$",spec.getPattern().pattern()); assertEquals("Spec.pathDepth",3,spec.getPathDepth()); - assertEquals("Spec.group",PathSpecGroup.PREFIX_GLOB,spec.group); + assertEquals("Spec.group",PathSpecGroup.PREFIX_GLOB,spec.getGroup()); assertDetectedVars(spec,"var1","var2"); @@ -244,7 +245,7 @@ public class WebSocketPathSpecTest assertEquals("Spec.pathSpec","/{var1}",spec.getPathSpec()); assertEquals("Spec.pattern","^/([^/]+)$",spec.getPattern().pattern()); assertEquals("Spec.pathDepth",1,spec.getPathDepth()); - assertEquals("Spec.group",PathSpecGroup.PREFIX_GLOB,spec.group); + assertEquals("Spec.group",PathSpecGroup.PREFIX_GLOB,spec.getGroup()); assertDetectedVars(spec,"var1"); diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpoint.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpoint.java new file mode 100644 index 0000000000..761fc0cde4 --- /dev/null +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpoint.java @@ -0,0 +1,46 @@ +// +// ======================================================================== +// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.websocket.jsr356.server.samples.echo; + +import javax.websocket.Endpoint; +import javax.websocket.EndpointConfig; +import javax.websocket.MessageHandler; +import javax.websocket.Session; + +/** + * Example of websocket endpoint based on extending {@link Endpoint} + */ +public class BasicEchoEndpoint extends Endpoint implements MessageHandler.Whole<String> +{ + private Session session; + + @Override + public void onMessage(String msg) + { + // reply with echo + session.getAsyncRemote().sendText(msg); + } + + @Override + public void onOpen(Session session, EndpointConfig config) + { + this.session = session; + this.session.addMessageHandler(this); + } +} diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpointConfigContextListener.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpointConfigContextListener.java new file mode 100644 index 0000000000..d64057aab8 --- /dev/null +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpointConfigContextListener.java @@ -0,0 +1,56 @@ +// +// ======================================================================== +// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.websocket.jsr356.server.samples.echo; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.websocket.ContainerProvider; +import javax.websocket.DeploymentException; +import javax.websocket.Endpoint; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; + +/** + * Example of adding a server WebSocket (extending {@link Endpoint}) programmatically via config + */ +public class BasicEchoEndpointConfigContextListener implements ServletContextListener +{ + @Override + public void contextDestroyed(ServletContextEvent sce) + { + /* do nothing */ + } + + @Override + public void contextInitialized(ServletContextEvent sce) + { + ServerContainer container = (ServerContainer)ContainerProvider.getWebSocketContainer(); + // Build up a configuration with a specific path + String path = "/echo"; + ServerEndpointConfig.Builder builder = ServerEndpointConfig.Builder.create(BasicEchoEndpoint.class,path); + try + { + container.addEndpoint(builder.build()); + } + catch (DeploymentException e) + { + throw new RuntimeException("Unable to add endpoint via config file",e); + } + } +} diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpointContextListener.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpointContextListener.java new file mode 100644 index 0000000000..035e386be9 --- /dev/null +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoEndpointContextListener.java @@ -0,0 +1,55 @@ +// +// ======================================================================== +// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.websocket.jsr356.server.samples.echo; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.websocket.ContainerProvider; +import javax.websocket.DeploymentException; +import javax.websocket.Endpoint; +import javax.websocket.server.ServerContainer; + +/** + * Example of adding a server WebSocket (extending {@link Endpoint}) programmatically directly. + * <p> + * NOTE: this shouldn't work as the endpoint has no path associated with it. + */ +public class BasicEchoEndpointContextListener implements ServletContextListener +{ + @Override + public void contextDestroyed(ServletContextEvent sce) + { + /* do nothing */ + } + + @Override + public void contextInitialized(ServletContextEvent sce) + { + ServerContainer container = (ServerContainer)ContainerProvider.getWebSocketContainer(); + try + { + // Should fail as there is no path associated with this endpoint + container.addEndpoint(BasicEchoEndpoint.class); + } + catch (DeploymentException e) + { + throw new RuntimeException("Unable to add endpoint directly",e); + } + } +} diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/BasicEchoSocket.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoSocket.java index fa49975cc4..49a7e2e504 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/BasicEchoSocket.java +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoSocket.java @@ -16,12 +16,15 @@ // ======================================================================== // -package org.eclipse.jetty.websocket.jsr356.server.samples; +package org.eclipse.jetty.websocket.jsr356.server.samples.echo; import javax.websocket.OnMessage; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; +/** + * Annotated echo socket + */ @ServerEndpoint("/echo") public class BasicEchoSocket { diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoSocketConfigContextListener.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoSocketConfigContextListener.java new file mode 100644 index 0000000000..401dd12f6e --- /dev/null +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoSocketConfigContextListener.java @@ -0,0 +1,56 @@ +// +// ======================================================================== +// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.websocket.jsr356.server.samples.echo; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.websocket.ContainerProvider; +import javax.websocket.DeploymentException; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; + +/** + * Example of adding a server socket (annotated) programmatically via config + */ +public class BasicEchoSocketConfigContextListener implements ServletContextListener +{ + @Override + public void contextDestroyed(ServletContextEvent sce) + { + /* do nothing */ + } + + @Override + public void contextInitialized(ServletContextEvent sce) + { + ServerContainer container = (ServerContainer)ContainerProvider.getWebSocketContainer(); + // Build up a configuration with a specific path + // Intentionally using alternate path in config (which differs from @ServerEndpoint declaration) + String path = "/echo-alt"; + ServerEndpointConfig.Builder builder = ServerEndpointConfig.Builder.create(BasicEchoSocket.class,path); + try + { + container.addEndpoint(builder.build()); + } + catch (DeploymentException e) + { + throw new RuntimeException("Unable to add endpoint via config file",e); + } + } +} diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoSocketContextListener.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoSocketContextListener.java new file mode 100644 index 0000000000..9e720d016c --- /dev/null +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/samples/echo/BasicEchoSocketContextListener.java @@ -0,0 +1,51 @@ +// +// ======================================================================== +// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.websocket.jsr356.server.samples.echo; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.websocket.ContainerProvider; +import javax.websocket.DeploymentException; +import javax.websocket.server.ServerContainer; + +/** + * Example of adding a server socket (annotated) programmatically directly with no config + */ +public class BasicEchoSocketContextListener implements ServletContextListener +{ + @Override + public void contextDestroyed(ServletContextEvent sce) + { + /* do nothing */ + } + + @Override + public void contextInitialized(ServletContextEvent sce) + { + ServerContainer container = (ServerContainer)ContainerProvider.getWebSocketContainer(); + try + { + container.addEndpoint(BasicEchoSocket.class); + } + catch (DeploymentException e) + { + throw new RuntimeException("Unable to add endpoint directly",e); + } + } +} diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/resources/basic-echo-endpoint-config-web.xml b/jetty-websocket/javax-websocket-server-impl/src/test/resources/basic-echo-endpoint-config-web.xml new file mode 100644 index 0000000000..afd9cef68d --- /dev/null +++ b/jetty-websocket/javax-websocket-server-impl/src/test/resources/basic-echo-endpoint-config-web.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<web-app + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="http://java.sun.com/xml/ns/javaee" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" + metadata-complete="false" + version="3.0"> + + <listener> + <listener-class>org.eclipse.jetty.websocket.jsr356.server.samples.echo.BasicEchoEndpointConfigContextListener</listener-class> + </listener> +</web-app>
\ No newline at end of file diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/resources/jetty-logging.properties b/jetty-websocket/javax-websocket-server-impl/src/test/resources/jetty-logging.properties new file mode 100644 index 0000000000..95a7e3fbed --- /dev/null +++ b/jetty-websocket/javax-websocket-server-impl/src/test/resources/jetty-logging.properties @@ -0,0 +1,7 @@ +org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog +org.eclipse.jetty.LEVEL=WARN + +org.eclipse.jetty.websocket.LEVEL=DEBUG +# org.eclipse.jetty.websocket.LEVEL=WARN +# org.eclipse.jetty.websocket.common.io.LEVEL=DEBUG + |