Repository: cxf Updated Branches: refs/heads/master f18acbcdf -> a5f8a4dd4
http-jetty now compiles and it's unit tests pass with both Jetty 8 and Jetty 9 Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/a5f8a4dd Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/a5f8a4dd Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/a5f8a4dd Branch: refs/heads/master Commit: a5f8a4dd4d9ecbfc1f8a1a8e5bcb4af17f561cc5 Parents: e242307 Author: Daniel Kulp <[email protected]> Authored: Wed Aug 6 21:24:07 2014 -0400 Committer: Daniel Kulp <[email protected]> Committed: Wed Aug 6 22:04:34 2014 -0400 ---------------------------------------------------------------------- .../http_jetty/JettyHTTPServerEngine.java | 177 +++++++++++++++---- .../http_jetty/JettyHTTPDestinationTest.java | 4 +- .../JettyHTTPServerEngineFactoryTest.java | 15 -- .../http_jetty/JettyHTTPServerEngineTest.java | 58 ++---- .../transport/http_jetty/invalid-engines.xml | 5 - .../spring/ApplicationContextTest.java | 2 - .../transport/http_jetty/spring/beans-props.xml | 5 - .../cxf/transport/http_jetty/spring/beans.xml | 5 - 8 files changed, 155 insertions(+), 116 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/a5f8a4dd/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java ---------------------------------------------------------------------- diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java index dacb5ba..fb60d39 100644 --- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java +++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java @@ -23,6 +23,8 @@ import java.io.Closeable; import java.io.IOException; import java.net.URL; import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Level; @@ -35,6 +37,7 @@ import javax.net.ssl.X509KeyManager; import javax.servlet.ServletContext; import org.apache.cxf.Bus; +import org.apache.cxf.common.classloader.ClassLoaderUtils; import org.apache.cxf.common.i18n.Message; import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.common.util.PropertyUtils; @@ -333,8 +336,11 @@ public class JettyHTTPServerEngine if (mBeanContainer != null) { getContainer(server).addEventListener(mBeanContainer); + if (!Server.getVersion().startsWith("8")) { + addServerMBean(); + } } - + if (connector == null) { connector = createConnector(getHost(), getPort()); if (LOG.isLoggable(Level.FINER)) { @@ -474,6 +480,27 @@ public class JettyHTTPServerEngine ++servantCount; } + private void addServerMBean() { + try { + mBeanContainer.getClass().getMethod("beanAdded", Container.class, Object.class) + .invoke(mBeanContainer, null, server); + } catch (RuntimeException rex) { + throw rex; + } catch (Exception r) { + throw new RuntimeException(r); + } + } + private void removeServerMBean() { + try { + mBeanContainer.getClass().getMethod("beanRemoved", Container.class, Object.class) + .invoke(mBeanContainer, null, server); + } catch (RuntimeException rex) { + throw rex; + } catch (Exception r) { + throw new RuntimeException(r); + } + } + private Connector createConnector(String hosto, int porto) { // now we just use the SelectChannelConnector as the default connector SslContextFactory sslcf = null; @@ -489,51 +516,102 @@ public class JettyHTTPServerEngine }; decorateCXFJettySslSocketConnector(sslcf); } - - - //Jetty 8 - org.eclipse.jetty.server.nio.SelectChannelConnector result = null; - if (tlsServerParameters == null) { - result = new org.eclipse.jetty.server.nio.SelectChannelConnector(); + AbstractConnector result = null; + if (!Server.getVersion().startsWith("8")) { + result = createConnectorJetty9(sslcf, hosto, porto); } else { - result = new org.eclipse.jetty.server.ssl.SslSelectChannelConnector(sslcf); - } - getServer().setSendServerVersion(getSendServerVersion()); - if (getMaxIdleTime() > 0) { - result.setMaxIdleTime(getMaxIdleTime()); - } + result = createConnectorJetty8(sslcf, hosto, porto); + } + try { + result.getClass().getMethod("setPort", Integer.TYPE).invoke(result, porto); + if (hosto != null) { + result.getClass().getMethod("setHost", String.class).invoke(result, hosto); + } + result.getClass().getMethod("setReuseAddress", Boolean.TYPE).invoke(result, isReuseAddress()); + } catch (RuntimeException rex) { + throw rex; + } catch (Exception ex) { + throw new RuntimeException(ex); + } + return result; + } + + AbstractConnector createConnectorJetty9(SslContextFactory sslcf, String hosto, int porto) { //Jetty 9 - /* - org.eclipse.jetty.server.HttpConfiguration httpConfig - = new org.eclipse.jetty.server.HttpConfiguration(); - httpConfig.setSendServerVersion(getSendServerVersion()); - org.eclipse.jetty.server.HttpConnectionFactory httpFactory - = new org.eclipse.jetty.server.HttpConnectionFactory(httpConfig); - org.eclipse.jetty.server.ServerConnector result = null; - if (tlsServerParameters == null) { - result = new org.eclipse.jetty.server.ServerConnector(server, httpFactory); - } else { - httpConfig.addCustomizer(new org.eclipse.jetty.server.SecureRequestCustomizer()); - org.eclipse.jetty.server.SslConnectionFactory scf - = new org.eclipse.jetty.server.SslConnectionFactory(sslcf, httpFactory.getProtocol()); - result = new org.eclipse.jetty.server.ServerConnector(server, scf, httpFactory); - } - if (getMaxIdleTime() > 0) { - result.setIdleTimeout(getMaxIdleTime()); + AbstractConnector result = null; + try { + Class<?> configClass = ClassLoaderUtils.loadClass("org.eclipse.jetty.server.HttpConfiguration", + Server.class); + Object httpConfig = configClass.newInstance(); + httpConfig.getClass().getMethod("setSendServerVersion", Boolean.TYPE) + .invoke(httpConfig, getSendServerVersion()); + + Object httpFactory = ClassLoaderUtils.loadClass("org.eclipse.jetty.server.HttpConnectionFactory", + Server.class) + .getConstructor(configClass).newInstance(httpConfig); + + Collection<Object> connectionFactories = new ArrayList<Object>(); + result = (AbstractConnector)ClassLoaderUtils.loadClass("org.eclipse.jetty.server.ServerConnector", + Server.class) + .getConstructor(Server.class) + .newInstance(server); + + if (tlsServerParameters != null) { + Class<?> src = ClassLoaderUtils.loadClass("org.eclipse.jetty.server.SecureRequestCustomizer", + Server.class); + httpConfig.getClass().getMethod("addCustomizer", src.getInterfaces()[0]) + .invoke(httpConfig, src.newInstance()); + + Object scf = ClassLoaderUtils.loadClass("org.eclipse.jetty.server.SslConnectionFactory", + Server.class).getConstructor(SslContextFactory.class, + String.class) + .newInstance(sslcf, "HTTP/1.1"); + connectionFactories.add(scf); + } + connectionFactories.add(httpFactory); + result.getClass().getMethod("setConnectionFactories", Collection.class) + .invoke(result, connectionFactories); + + if (getMaxIdleTime() > 0) { + result.getClass().getMethod("setIdleTimeout", Long.TYPE).invoke(result, new Long(getMaxIdleTime())); + } + + } catch (RuntimeException rex) { + throw rex; + } catch (Exception ex) { + throw new RuntimeException(ex); } - */ - - - result.setPort(porto); - if (hosto != null) { - result.setHost(hosto); + return result; + } + AbstractConnector createConnectorJetty8(SslContextFactory sslcf, String hosto, int porto) { + //Jetty 8 + AbstractConnector result = null; + try { + if (sslcf == null) { + result = (AbstractConnector)ClassLoaderUtils + .loadClass("org.eclipse.jetty.server.nio.SelectChannelConnector", + Server.class).newInstance(); + } else { + result = (AbstractConnector)ClassLoaderUtils + .loadClass("org.eclipse.jetty.server.ssl.SslSelectChannelConnector", + Server.class).getConstructor(SslContextFactory.class) + .newInstance(sslcf); + } + Server.class.getMethod("setSendServerVersion", Boolean.TYPE).invoke(server, getSendServerVersion()); + if (getMaxIdleTime() > 0) { + result.getClass().getMethod("setMaxIdleTime", Integer.TYPE).invoke(result, getMaxIdleTime()); + } + } catch (RuntimeException rex) { + throw rex; + } catch (Exception ex) { + throw new RuntimeException(ex); } - result.setReuseAddress(isReuseAddress()); return result; } + protected SSLContext createSSLContext(SslContextFactory scf) throws Exception { String proto = tlsServerParameters.getSecureSocketProtocol() == null ? "TLS" : tlsServerParameters.getSecureSocketProtocol(); @@ -767,8 +845,22 @@ public class JettyHTTPServerEngine if (connector == null) { return false; } - //return "https".equalsIgnoreCase(connector.getDefaultConnectionFactory().getProtocol()); - return connector instanceof org.eclipse.jetty.server.ssl.SslConnector; + + try { + //Jetty 8 + return ClassLoaderUtils.loadClass("org.eclipse.jetty.server.ssl.SslConnector", + Server.class).isInstance(connector); + } catch (ClassNotFoundException e) { + //Jetty 9 + //return "https".equalsIgnoreCase(connector.getDefaultConnectionFactory().getProtocol()); + try { + Object o = connector.getClass().getMethod("getDefaultConnectionFactory").invoke(connector); + return "https".equalsIgnoreCase((String)o.getClass().getMethod("getProtocol").invoke(o)); + } catch (Exception ex) { + //ignore + } + } + return false; } protected void retrieveListenerFactory() { @@ -835,10 +927,17 @@ public class JettyHTTPServerEngine } } finally { if (contexts != null) { + for (Handler h : contexts.getHandlers()) { + h.stop(); + } contexts.stop(); } contexts = null; server.stop(); + if (mBeanContainer != null + && !Server.getVersion().startsWith("8")) { + removeServerMBean(); + } server.destroy(); server = null; } http://git-wip-us.apache.org/repos/asf/cxf/blob/a5f8a4dd/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestinationTest.java ---------------------------------------------------------------------- diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestinationTest.java b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestinationTest.java index f452259..73f0d2a 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestinationTest.java +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestinationTest.java @@ -627,8 +627,8 @@ public class JettyHTTPDestinationTest extends Assert { response = EasyMock.createMock(Response.class); request.getMethod(); EasyMock.expectLastCall().andReturn(method).atLeastOnce(); - request.getConnection(); - EasyMock.expectLastCall().andReturn(null).anyTimes(); + //request.getConnection(); + //EasyMock.expectLastCall().andReturn(null).anyTimes(); request.getUserPrincipal(); EasyMock.expectLastCall().andReturn(null).anyTimes(); http://git-wip-us.apache.org/repos/asf/cxf/blob/a5f8a4dd/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineFactoryTest.java ---------------------------------------------------------------------- diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineFactoryTest.java b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineFactoryTest.java index e1d4a52..170ea61 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineFactoryTest.java +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineFactoryTest.java @@ -140,21 +140,6 @@ public class JettyHTTPServerEngineFactoryTest bus.getExtension(JettyHTTPServerEngineFactory.class); assertNotNull("EngineFactory is not configured.", factory); - - - // The Engine for port 1234 was configured for TLS. - // and the connector which is injected into the engine - // should be an instance of SslSocketConnector - // here will throw an error if it is not. - - - try { - factory.createJettyHTTPServerEngine(1234, "https"); - fail("A configure error should be thrown here "); - } catch (Exception e) { - // experct the exception - } - } } http://git-wip-us.apache.org/repos/asf/cxf/blob/a5f8a4dd/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineTest.java ---------------------------------------------------------------------- diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineTest.java b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineTest.java index bcf6735..2fc0294 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineTest.java +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineTest.java @@ -43,12 +43,9 @@ import org.apache.cxf.management.InstrumentationManager; import org.apache.cxf.testutil.common.TestUtil; import org.easymock.EasyMock; import org.easymock.IMocksControl; - import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.handler.ContextHandler; -import org.eclipse.jetty.server.nio.SelectChannelConnector; -import org.eclipse.jetty.server.ssl.SslSocketConnector; import org.junit.Assert; import org.junit.Before; @@ -125,7 +122,8 @@ public class JettyHTTPServerEngineTest extends Assert { engine.addServant(new URL("https://localhost:" + PORT2 + "/test"), handler1); assertTrue("Protocol must be https", "https".equals(engine.getProtocol())); - assertEquals("Get the wrong maxIdleTime.", 30000, engine.getConnector().getMaxIdleTime()); + + assertEquals("Get the wrong maxIdleTime.", 30000, getMaxIdle(engine.getConnector())); factory.setTLSServerParametersForPort(PORT1, new TLSServerParameters()); engine = factory.createJettyHTTPServerEngine(PORT1, "https"); @@ -143,38 +141,13 @@ public class JettyHTTPServerEngineTest extends Assert { } - @Test - public void testSetConnector() throws Exception { - JettyHTTPServerEngine engine = new JettyHTTPServerEngine(); - Connector conn = new SslSocketConnector(); - engine.setConnector(conn); - engine.setPort(9000); - try { - engine.finalizeConfig(); - fail("We should get the connector not set with TSLServerParameter exception."); - } catch (Exception ex) { - // expect the excepion - } - - engine = new JettyHTTPServerEngine(); - conn = new SelectChannelConnector(); - conn.setPort(9002); - engine.setConnector(conn); - engine.setPort(9000); + private int getMaxIdle(Connector connector) throws Exception { try { - engine.finalizeConfig(); - fail("We should get the connector not set right port exception."); - } catch (Exception ex) { - // expect the exception + return (int)connector.getClass().getMethod("getMaxIdleTime").invoke(connector); + } catch (NoSuchMethodException nex) { + //jetty 9 } - - engine = new JettyHTTPServerEngine(); - conn = new SslSocketConnector(); - conn.setPort(9003); - engine.setConnector(conn); - engine.setPort(9003); - engine.setTlsServerParameters(new TLSServerParameters()); - engine.finalizeConfig(); + return ((Long)connector.getClass().getMethod("getIdleTimeout").invoke(connector)).intValue(); } @Test @@ -184,31 +157,30 @@ public class JettyHTTPServerEngineTest extends Assert { JettyHTTPServerEngine engine = factory.createJettyHTTPServerEngine(PORT1, "http"); engine.setMaxIdleTime(30000); - JettyHTTPTestHandler handler1 = new JettyHTTPTestHandler("string1", true); - JettyHTTPTestHandler handler2 = new JettyHTTPTestHandler("string2", true); - engine.addServant(new URL(urlStr), handler1); - assertEquals("Get the wrong maxIdleTime.", 30000, engine.getConnector().getMaxIdleTime()); + engine.addServant(new URL(urlStr), new JettyHTTPTestHandler("string1", true)); + assertEquals("Get the wrong maxIdleTime.", 30000, getMaxIdle(engine.getConnector())); String response = null; response = getResponse(urlStr); assertEquals("The jetty http handler did not take effect", response, "string1"); try { - engine.addServant(new URL(urlStr), handler2); + engine.addServant(new URL(urlStr), new JettyHTTPTestHandler("string2", true)); fail("We don't support to publish the two service at the same context path"); } catch (Exception ex) { assertTrue("Get a wrong exception message", ex.getMessage().indexOf("hello/test") > 0); } try { - engine.addServant(new URL(urlStr + "/test"), handler2); + engine.addServant(new URL(urlStr + "/test"), new JettyHTTPTestHandler("string2", true)); fail("We don't support to publish the two service at the same context path"); } catch (Exception ex) { assertTrue("Get a wrong exception message", ex.getMessage().indexOf("hello/test/test") > 0); } try { - engine.addServant(new URL("http://localhost:" + PORT1 + "/hello"), handler2); + engine.addServant(new URL("http://localhost:" + PORT1 + "/hello"), + new JettyHTTPTestHandler("string2", true)); fail("We don't support to publish the two service at the same context path"); } catch (Exception ex) { assertTrue("Get a wrong exception message", ex.getMessage().indexOf("hello") > 0); @@ -216,11 +188,11 @@ public class JettyHTTPServerEngineTest extends Assert { // check if the system property change could work System.setProperty("org.apache.cxf.transports.http_jetty.DontCheckUrl", "true"); - engine.addServant(new URL(urlStr + "/test"), handler2); + engine.addServant(new URL(urlStr + "/test"), new JettyHTTPTestHandler("string2", true)); // clean up the System property setting System.clearProperty("org.apache.cxf.transports.http_jetty.DontCheckUrl"); - engine.addServant(new URL(urlStr2), handler2); + engine.addServant(new URL(urlStr2), new JettyHTTPTestHandler("string2", true)); Set<ObjectName> s = CastUtils.cast(ManagementFactory.getPlatformMBeanServer(). queryNames(new ObjectName("org.eclipse.jetty.server:type=server,*"), null)); http://git-wip-us.apache.org/repos/asf/cxf/blob/a5f8a4dd/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/invalid-engines.xml ---------------------------------------------------------------------- diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/invalid-engines.xml b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/invalid-engines.xml index f63ef73..ead3647 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/invalid-engines.xml +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/invalid-engines.xml @@ -23,11 +23,6 @@ <httpj:tlsServerParameters> <sec:clientAuthentication want="true" required="true"/> </httpj:tlsServerParameters> - <httpj:connector> - <beans:bean class="org.eclipse.jetty.server.bio.SocketConnector"> - <beans:property name="port" value="1234"/> - </beans:bean> - </httpj:connector> </httpj:engine> </httpj:engine-factory> </beans> http://git-wip-us.apache.org/repos/asf/cxf/blob/a5f8a4dd/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/ApplicationContextTest.java ---------------------------------------------------------------------- diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/ApplicationContextTest.java b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/ApplicationContextTest.java index 7b38288..af0d6ab 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/ApplicationContextTest.java +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/ApplicationContextTest.java @@ -138,8 +138,6 @@ public class ApplicationContextTest extends Assert { assertTrue("The engine should support session manager", engine.isSessionSupport()); assertNotNull("The handlers should not be null", engine.getHandlers()); assertEquals(1, engine.getHandlers().size()); - assertTrue("The connector should be instance of org.eclipse.jetty.server.bio.SocketConnector", - engine.getConnector() instanceof org.eclipse.jetty.server.bio.SocketConnector); JettyHTTPDestination jd3 = (JettyHTTPDestination)factory.getDestination( http://git-wip-us.apache.org/repos/asf/cxf/blob/a5f8a4dd/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans-props.xml ---------------------------------------------------------------------- diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans-props.xml b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans-props.xml index ea3aaa8..61dd687 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans-props.xml +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans-props.xml @@ -57,11 +57,6 @@ </hj:engine> <hj:engine port="$(engine.port.nine.one)" maxIdleTime="$(engine.port.nine.one.maxIdle)" sendServerVersion="$(engine.port.nine.one.sendServerVersion)"> <hj:threadingParameters minThreads="${engine.port.nine.one.minThreads}" maxThreads="${engine.port.nine.one.maxThreads}"/> - <hj:connector> - <beans:bean class="org.eclipse.jetty.server.bio.SocketConnector"> - <beans:property name="port" value="${engine.port.nine.one}"/> - </beans:bean> - </hj:connector> <hj:handlers> <beans:bean class="org.eclipse.jetty.server.handler.DefaultHandler"/> </hj:handlers> http://git-wip-us.apache.org/repos/asf/cxf/blob/a5f8a4dd/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans.xml ---------------------------------------------------------------------- diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans.xml b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans.xml index e52d93a..6328d2f 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans.xml +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans.xml @@ -44,11 +44,6 @@ </hj:engine> <hj:engine port="9001" maxIdleTime="40000" sendServerVersion="false"> <hj:threadingParameters minThreads="99" maxThreads="777"/> - <hj:connector> - <beans:bean class="org.eclipse.jetty.server.bio.SocketConnector"> - <beans:property name="port" value="9001"/> - </beans:bean> - </hj:connector> <hj:handlers> <beans:bean class="org.eclipse.jetty.server.handler.DefaultHandler"/> </hj:handlers>
