Merge remote-tracking branch 'origin/jetty-9.4.x'

This commit is contained in:
Jan Bartel 2017-10-17 16:45:31 +11:00
commit 050d593056
92 changed files with 135 additions and 4899 deletions

View File

@ -815,6 +815,7 @@ public class AnnotationParser
MultiException me = new MultiException();
// TODO do not force version 8 once ASM can scan 9
// TODO support a different target for quickstart generation
MultiReleaseJarFile jarFile = new MultiReleaseJarFile(jarResource.getFile(),8,false);
jarFile.stream().forEach(e->
{

View File

@ -151,21 +151,6 @@
<artifactId>jetty-ant</artifactId>
<version>10.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>cdi-core</artifactId>
<version>10.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>cdi-full-servlet</artifactId>
<version>10.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>cdi-servlet</artifactId>
<version>10.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-client</artifactId>

36
jetty-cdi/cdi-2/pom.xml Normal file
View File

@ -0,0 +1,36 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>jetty-cdi-parent</artifactId>
<version>10.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cdi-2</artifactId>
<name>Jetty :: CDI 2</name>
<url>http://www.eclipse.org/jetty</url>
<packaging>jar</packaging>
<properties>
<bundle-symbolic-name>${project.groupId}.cdi2</bundle-symbolic-name>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>config</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -9,8 +9,8 @@
<Ref refid="DeploymentManager">
<Call name="addLifeCycleBinding">
<Arg>
<New
class="org.eclipse.jetty.cdi.servlet.WeldDeploymentBinding">
<New class="org.eclipse.jetty.deploy.bindings.GlobalWebappConfigBinding">
<Set name="jettyXml"><Property name="jetty.home" default="."/>/etc/cdi2/jetty-web-cdi2.xml</Set>
</New>
</Arg>
</Call>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Call name="prependServerClass">
<Arg>-org.eclipse.jetty.util.Decorator</Arg>
</Call>
<Call name="prependServerClass">
<Arg>-org.eclipse.jetty.util.DecoratedObjectFactory</Arg>
</Call>
<Call name="prependServerClass">
<Arg>-org.eclipse.jetty.server.handler.ContextHandler.</Arg>
</Call>
<Call name="prependServerClass">
<Arg>-org.eclipse.jetty.server.handler.ContextHandler</Arg>
</Call>
<Call name="prependServerClass">
<Arg>-org.eclipse.jetty.servlet.ServletContextHandler</Arg>
</Call>
</Configure>

View File

@ -0,0 +1,5 @@
[description]
Jetty setup to support Weld/CDI2 with WELD inside the webapp
[depend]
cdi2

View File

@ -0,0 +1,16 @@
[description]
Jetty setup to support Weld/CDI2 with WELD inside the webapp
[depend]
annotations
[ini]
jetty.webapp.addServerClasses+=,-org.eclipse.jetty.util.Decorator,-org.eclipse.jetty.util.DecoratedObjectFactory
jetty.webapp.addServerClasses+=,-org.eclipse.jetty.server.handler.ContextHandler.,-org.eclipse.jetty.server.handler.ContextHandler,-org.eclipse.jetty.servlet.ServletContextHandler
[license]
Weld is an open source project hosted on Github and released under the Apache 2.0 license.
http://weld.cdi-spec.org/
http://www.apache.org/licenses/LICENSE-2.0.html

View File

@ -1,71 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>jetty-cdi-parent</artifactId>
<version>10.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cdi-core</artifactId>
<name>Jetty :: CDI :: Core</name>
<description>
Core CDI routines for Jetty (Also useful for CDI/SE applications that dont need a server)
</description>
<url>http://www.eclipse.org/jetty</url>
<packaging>jar</packaging>
<properties>
<bundle-symbolic-name>${project.groupId}.core</bundle-symbolic-name>
</properties>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-core</artifactId>
<version>${weld.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
<version>${weld.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>tests-jar</id>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -1,28 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.core;
import javax.enterprise.inject.Any;
import javax.enterprise.util.AnnotationLiteral;
@SuppressWarnings("serial")
public class AnyLiteral extends AnnotationLiteral<Any>
{
public static final AnyLiteral INSTANCE = new AnyLiteral();
}

View File

@ -1,37 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.core;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
/**
* CDI Producer of Jetty Logging instances.
*/
public class JettyLogFactory
{
@Produces
public Logger createLogger(InjectionPoint injectionPoint)
{
return Log.getLogger(injectionPoint.getMember().getDeclaringClass());
}
}

View File

@ -1,45 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.core;
import javax.enterprise.util.AnnotationLiteral;
import javax.inject.Named;
@SuppressWarnings("serial")
public class NamedLiteral extends AnnotationLiteral<Named> implements Named
{
private final String value;
public String value()
{
return value;
}
public NamedLiteral(String name)
{
if (name == null)
{
this.value = "";
}
else
{
this.value = name;
}
}
}

View File

@ -1,45 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.core;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
public class ScopedInstance<T>
{
public Bean<T> bean;
public CreationalContext<T> creationalContext;
public T instance;
public void destroy()
{
bean.destroy(instance,creationalContext);
}
@Override
public String toString()
{
StringBuilder s = new StringBuilder();
s.append("ScopedInstance[");
s.append(bean);
s.append(',').append(creationalContext);
s.append(']');
return s.toString();
}
}

View File

@ -1,94 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.core;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.enterprise.context.spi.Contextual;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
public class SimpleBeanStore
{
private static final Logger LOG = Log.getLogger(SimpleBeanStore.class);
public Map<Contextual<?>, List<ScopedInstance<?>>> beans = new HashMap<>();
public void addBean(ScopedInstance<?> instance)
{
if (LOG.isDebugEnabled())
{
LOG.debug("addBean({})",instance);
}
List<ScopedInstance<?>> instances = getBeans(instance.bean);
if (instances == null)
{
instances = new ArrayList<>();
beans.put(instance.bean,instances);
}
instances.add(instance);
}
public void clear()
{
beans.clear();
}
public void destroy()
{
if (LOG.isDebugEnabled())
{
LOG.debug("destroy() - {} beans",beans.size());
}
for (List<ScopedInstance<?>> instances : beans.values())
{
if (LOG.isDebugEnabled())
{
LOG.debug("destroying - {} instance(s)",instances.size());
}
for (ScopedInstance<?> instance : instances)
{
if (LOG.isDebugEnabled())
{
LOG.debug("destroying instance {}",instance);
}
instance.destroy();
}
}
}
public List<ScopedInstance<?>> getBeans(Contextual<?> contextual)
{
if (LOG.isDebugEnabled())
{
LOG.debug("getBeans({})",contextual);
}
return beans.get(contextual);
}
@Override
public String toString()
{
return String.format("%s@%X[size=%d]",this.getClass().getSimpleName(),hashCode(),beans.size());
}
}

View File

@ -1,6 +0,0 @@
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>

View File

@ -1,78 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.core;
import java.util.Set;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
public abstract class AbstractWeldTest
{
public static class TestBean<T>
{
public Bean<T> bean;
public CreationalContext<T> cCtx;
public T instance;
public void destroy()
{
bean.destroy(instance,cCtx);
}
}
@BeforeClass
public static void initWeld()
{
weld = new Weld();
container = weld.initialize();
}
@AfterClass
public static void shutdownWeld()
{
weld.shutdown();
}
private static WeldContainer container;
private static Weld weld;
@SuppressWarnings("unchecked")
public <T> TestBean<T> newInstance(Class<T> clazz) throws Exception
{
TestBean<T> testBean = new TestBean<>();
Set<Bean<?>> beans = container.getBeanManager().getBeans(clazz,AnyLiteral.INSTANCE);
if (beans.size() > 0)
{
testBean.bean = (Bean<T>)beans.iterator().next();
testBean.cCtx = container.getBeanManager().createCreationalContext(testBean.bean);
testBean.instance = (T)container.getBeanManager().getReference(testBean.bean,clazz,testBean.cCtx);
return testBean;
}
else
{
throw new Exception(String.format("Can't find class %s",clazz));
}
}
}

View File

@ -1,112 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.core.logging;
import java.text.MessageFormat;
import java.util.ResourceBundle;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.regex.Pattern;
public class LeanConsoleHandler extends Handler
{
public static Handler createWithLevel(Level level)
{
LeanConsoleHandler handler = new LeanConsoleHandler();
handler.setLevel(level);
return handler;
}
@Override
public void close() throws SecurityException
{
/* nothing to do here */
}
@Override
public void flush()
{
/* nothing to do here */
}
public synchronized String formatMessage(LogRecord record)
{
String msg = getMessage(record);
try
{
Object params[] = record.getParameters();
if ((params == null) || (params.length == 0))
{
return msg;
}
if (Pattern.compile("\\{\\d+\\}").matcher(msg).find())
{
return MessageFormat.format(msg,params);
}
return msg;
}
catch (Exception ex)
{
return msg;
}
}
private String getMessage(LogRecord record)
{
ResourceBundle bundle = record.getResourceBundle();
if (bundle != null)
{
try
{
return bundle.getString(record.getMessage());
}
catch (java.util.MissingResourceException ex)
{
}
}
return record.getMessage();
}
@Override
public void publish(LogRecord record)
{
StringBuilder buf = new StringBuilder();
buf.append("[").append(record.getLevel().getName()).append("] ");
String logname = record.getLoggerName();
int idx = logname.lastIndexOf('.');
if (idx > 0)
{
logname = logname.substring(idx + 1);
}
buf.append(logname);
buf.append(": ");
buf.append(formatMessage(record));
System.out.println(buf.toString());
if (record.getThrown() != null)
{
record.getThrown().printStackTrace(System.out);
}
}
}

View File

@ -1,33 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.core.logging;
import java.util.logging.Logger;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
public class LogFactory
{
@Produces
public Logger createLogger(InjectionPoint injectionPoint)
{
return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}
}

View File

@ -1,46 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.core.logging;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.logging.LogManager;
public class Logging
{
public static void config()
{
ClassLoader cl = Thread.currentThread().getContextClassLoader();
URL url = cl.getResource("logging.properties");
if (url != null)
{
try (InputStream in = url.openStream())
{
LogManager.getLogManager().readConfiguration(in);
}
catch (IOException e)
{
e.printStackTrace(System.err);
}
}
System.setProperty("org.apache.commons.logging.Log","org.apache.commons.logging.impl.Jdk14Logger");
}
}

View File

@ -1,2 +0,0 @@
handlers = org.eclipse.jetty.cdi.core.logging.LeanConsoleHandler
.level=INFO

View File

@ -1,52 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>jetty-cdi-parent</artifactId>
<version>10.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cdi-full-servlet</artifactId>
<name>Jetty :: CDI :: Dependencies</name>
<url>http://www.eclipse.org/jetty</url>
<packaging>pom</packaging>
<properties>
</properties>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>cdi-servlet</artifactId>
<version>${project.version}</version>
<!--
<exclusions>
<exclusion>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.spec.javax.el</groupId>
<artifactId>jboss-el-api_3.0_spec</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.spec.javax.annotation</groupId>
<artifactId>jboss-annotations-api_1.2_spec</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.spec.javax.interceptor</groupId>
<artifactId>jboss-interceptors-api_1.2_spec</artifactId>
</exclusion>
</exclusions>
-->
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.mortbay.jasper</groupId>
<artifactId>apache-jsp</artifactId>
<version>${jsp.version}</version>
</dependency>
</dependencies>
</project>

View File

@ -1,89 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>jetty-cdi-parent</artifactId>
<version>10.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cdi-servlet</artifactId>
<name>Jetty :: CDI :: Servlet</name>
<url>http://www.eclipse.org/jetty</url>
<packaging>jar</packaging>
<properties>
<bundle-symbolic-name>${project.groupId}.servlet</bundle-symbolic-name>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>config</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>cdi-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-plus</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-deploy</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet-core</artifactId>
<version>${weld.version}</version>
<exclusions>
<exclusion>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.spec.javax.el</groupId>
<artifactId>jboss-el-api_3.0_spec</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.spec.javax.annotation</groupId>
<artifactId>jboss-annotations-api_1.2_spec</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.spec.javax.interceptor</groupId>
<artifactId>jboss-interceptors-api_1.2_spec</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- below here lie testing dragons -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jsp</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -1,36 +0,0 @@
[description]
Experimental CDI/Weld integration
[depend]
deploy
annotations
plus
# JSP (and EL) are requirements for CDI and Weld
jsp
[files]
lib/cdi/
maven://javax.enterprise/cdi-api/1.2|lib/cdi/javax.enterprise.cdi-api-1.2.jar
maven://javax.interceptor/javax.interceptor-api/1.2|lib/cdi/javax.interceptor-api-1.2.jar
maven://javax.inject/javax.inject/1|lib/cdi/javax.inject-1.0.jar
maven://org.jboss.weld.servlet/weld-servlet-core/2.4.3.Final|lib/cdi/weld-servlet-core-2.4.3.Final.jar
maven://org.jboss.weld.environment/weld-environment-common/2.4.3.Final|lib/cdi/weld-environment-common-2.4.3.Final.jar
maven://org.jboss.weld/weld-core-impl/2.4.3.Final|lib/cdi/weld-core-impl-2.4.3.Final.jar
maven://org.jboss.classfilewriter/jboss-classfilewriter/1.1.2.Final|lib/cdi/jboss-classfilewriter-1.1.2.Final.jar
maven://org.jboss.weld/weld-spi/2.4.SP1|lib/cdi/weld-spi-2.4.SP1.jar
maven://org.jboss.weld/weld-api/2.4.SP1|lib/cdi/weld-api-2.4.SP1.jar
maven://org.jboss.logging/jboss-logging/3.2.1.Final|lib/cdi/jboss-logging-3.2.1.Final.jar
[lib]
lib/cdi/*.jar
lib/cdi-core-${jetty.version}.jar
lib/cdi-servlet-${jetty.version}.jar
[xml]
etc/jetty-cdi.xml
[license]
Weld is an open source project hosted on Github and released under the Apache 2.0 license.
http://weld.cdi-spec.org/
http://www.apache.org/licenses/LICENSE-2.0.html

View File

@ -1,131 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.servlet;
import java.io.IOException;
import java.util.Collections;
import java.util.Set;
import javax.servlet.ServletContext;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.resource.Resource;
import org.jboss.weld.environment.servlet.EnhancedListener;
/**
* Handy {@link ServletContextHandler} implementation that hooks up
* all of the various CDI related components and listeners from Weld.
*/
public class EmbeddedCdiHandler extends ServletContextHandler
{
private static final Logger LOG = Log.getLogger(EmbeddedCdiHandler.class);
private static final String[] REQUIRED_BEANS_XML_PATHS = new String[] {
"/WEB-INF/beans.xml",
"/META-INF/beans.xml",
"/WEB-INF/classes/META-INF/beans.xml"
};
public EmbeddedCdiHandler()
{
super();
}
public EmbeddedCdiHandler(int options)
{
super(options);
}
@Override
protected void doStart() throws Exception
{
// Required of CDI
Resource baseResource = getBaseResource();
if (baseResource == null)
{
throw new NullPointerException("baseResource must be set (to so it can find the beans.xml)");
}
boolean foundBeansXml = false;
// Verify that beans.xml is present, otherwise weld will fail silently.
for(String beansXmlPath: REQUIRED_BEANS_XML_PATHS) {
Resource res = baseResource.addPath(beansXmlPath);
if (res == null)
{
// not found, skip it
continue;
}
if (res.exists())
{
foundBeansXml = true;
}
if (res.isDirectory())
{
throw new IOException("Directory conflicts with expected file: " + res.getURI().toASCIIString());
}
}
if (!foundBeansXml)
{
StringBuilder err = new StringBuilder();
err.append("Unable to find required beans.xml from the baseResource: ");
err.append(baseResource.getURI().toASCIIString()).append(System.lineSeparator());
err.append("Searched for: ");
for (String beansXmlPath : REQUIRED_BEANS_XML_PATHS)
{
err.append(System.lineSeparator());
err.append(" ").append(beansXmlPath);
}
LOG.warn("ERROR: {}",err.toString());
throw new IOException(err.toString());
}
// Initialize Weld
JettyWeldInitializer.initContext(this);
// Wire up Weld (what's usually done via the ServletContainerInitializer)
ServletContext ctx = getServletContext();
// Fake the call to ServletContainerInitializer
ClassLoader orig = Thread.currentThread().getContextClassLoader();
try
{
Thread.currentThread().setContextClassLoader(ctx.getClassLoader());
EnhancedListener weldListener = new EnhancedListener();
Set<Class<?>> classes = Collections.emptySet();
weldListener.onStartup(classes,ctx);
// add the rest of the Weld Listeners
ctx.addListener(weldListener);
}
finally
{
Thread.currentThread().setContextClassLoader(orig);
}
// Let normal ServletContextHandler startup continue its merry way
super.doStart();
}
}

View File

@ -1,84 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.servlet;
import javax.naming.NamingException;
import javax.naming.Reference;
import org.eclipse.jetty.plus.jndi.Resource;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.webapp.WebAppContext;
/**
* Utility class suitable for initializing CDI/Weld on Embedded Jetty
*/
public class JettyWeldInitializer
{
/**
* Initialize WebAppContext to support CDI/Weld.
* <p>
* Initializes Context, then sets up WebAppContext system and server classes to allow Weld to operate from Server
* level.
* <p>
* Includes {@link #initContext(ContextHandler)} behavior as well.
* @param webapp the webapp
* @throws NamingException if unable to bind BeanManager context
*/
public static void initWebApp(WebAppContext webapp) throws NamingException
{
initContext(webapp);
// TODO use location bases include/exclude
// webapp cannot change / replace weld classes
webapp.getSystemClasspathPattern()
.include(
"org.jboss.weld.",
"org.jboss.classfilewriter.",
"org.jboss.logging.",
"com.google.common.",
"org.eclipse.jetty.cdi.websocket.annotation."
);
// don't hide weld classes from webapps (allow webapp to use ones from system classloader)
webapp.getServerClasspathPattern()
.exclude(
"org.eclipse.jetty.cdi.websocket.annotation.",
"org.eclipse.jetty.cdi.core.",
"org.eclipse.jetty.cdi.servlet.",
"org.jboss.weld.",
"org.jboss.classfilewriter.",
"org.jboss.logging.",
"com.google.common.");
}
public static void initContext(ContextHandler handler) throws NamingException
{
// Add context specific weld container reference.
// See https://issues.jboss.org/browse/WELD-1710
// and https://github.com/weld/core/blob/2.2.5.Final/environments/servlet/core/src/main/java/org/jboss/weld/environment/servlet/WeldServletLifecycle.java#L244-L253
handler.setInitParameter("org.jboss.weld.environment.container.class","org.jboss.weld.environment.jetty.JettyContainer");
// Setup Weld BeanManager reference
Reference ref = new Reference("javax.enterprise.inject.spi.BeanManager","org.jboss.weld.resources.ManagerObjectFactory",null);
new Resource(handler,"BeanManager",ref);
}
}

View File

@ -1,57 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.servlet;
import org.eclipse.jetty.deploy.App;
import org.eclipse.jetty.deploy.AppLifeCycle;
import org.eclipse.jetty.deploy.graph.Node;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.webapp.WebAppContext;
/**
* Perform some basic weld configuration of WebAppContext
*/
public class WeldDeploymentBinding implements AppLifeCycle.Binding
{
public String[] getBindingTargets()
{
return new String[] { "deploying" };
}
public void processBinding(Node node, App app) throws Exception
{
ContextHandler handler = app.getContextHandler();
if (handler == null)
{
throw new NullPointerException("No Handler created for App: " + app);
}
if (handler instanceof WebAppContext)
{
// Do webapp specific init
WebAppContext webapp = (WebAppContext)handler;
JettyWeldInitializer.initWebApp(webapp);
}
else
{
// Do general init
JettyWeldInitializer.initContext(handler);
}
}
}

View File

@ -1,27 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.servlet;
import java.io.IOException;
import java.io.PrintWriter;
public interface Dumper
{
public void dump(PrintWriter out) throws IOException;
}

View File

@ -1,39 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.servlet;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;
import javax.inject.Named;
@Named("iso")
public class IsoTimeFormatter implements TimeFormatter
{
@Override
public String format(Calendar cal)
{
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'",Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
return dateFormat.format(cal.getTime());
}
}

View File

@ -1,38 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.servlet;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.enterprise.inject.Default;
import javax.inject.Named;
@Named("locale")
@Default
public class LocaleTimeFormatter implements TimeFormatter
{
public static final TimeFormatter INSTANCE = new LocaleTimeFormatter();
@Override
public String format(Calendar cal)
{
return new SimpleDateFormat().format(cal.getTime());
}
}

View File

@ -1,69 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.cdi.core.NamedLiteral;
@SuppressWarnings("serial")
@WebServlet("/req-info")
public class RequestInfoServlet extends HttpServlet
{
@Inject
@Any
private Instance<Dumper> dumpers;
@Inject
@Named("params")
private Dumper defaultDumper;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
resp.setContentType("text/plain");
PrintWriter out = resp.getWriter();
Dumper dumper = defaultDumper;
String dumperId = req.getParameter("dumperId");
if (dumperId != null)
{
Instance<Dumper> inst = dumpers.select(new NamedLiteral(dumperId));
if (!inst.isAmbiguous() && !inst.isUnsatisfied())
{
dumper = inst.get();
}
}
dumper.dump(out);
}
}

View File

@ -1,71 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
@Named("params")
@RequestScoped
public class RequestParamsDumper implements Dumper
{
@Inject
private HttpServletRequest request;
@Override
public void dump(PrintWriter out) throws IOException
{
out.printf("request is %s%n",request == null ? "NULL" : "PRESENT");
if (request != null)
{
Map<String, String[]> params = request.getParameterMap();
List<String> paramNames = new ArrayList<>();
paramNames.addAll(params.keySet());
Collections.sort(paramNames);
out.printf("parameters.size = [%d]%n",params.size());
for (String name : paramNames)
{
out.printf(" param[%s] = [",name);
boolean delim = false;
for (String val : params.get(name))
{
if (delim)
{
out.print(", ");
}
out.print(val);
delim = true;
}
out.println("]");
}
}
}
}

View File

@ -1,26 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.servlet;
import java.util.Calendar;
public interface TimeFormatter
{
public String format(Calendar cal);
}

View File

@ -1,59 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.servlet;
import java.io.IOException;
import java.util.Calendar;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.cdi.core.NamedLiteral;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = "/time")
public class TimeServlet extends HttpServlet
{
@Inject
@Any
Instance<TimeFormatter> formatters;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
resp.setContentType("text/plain");
String timeType = req.getParameter("type");
TimeFormatter time = LocaleTimeFormatter.INSTANCE;
Instance<TimeFormatter> inst = formatters.select(new NamedLiteral(timeType));
if (!inst.isAmbiguous() && !inst.isUnsatisfied())
{
time = inst.get();
}
resp.getWriter().println(time.format(Calendar.getInstance()));
}
}

View File

@ -1,120 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.servlet;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import java.io.File;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URI;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.util.IO;
import org.eclipse.jetty.util.log.JettyLogHandler;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.resource.Resource;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class WeldInitializationTest
{
private static final Logger LOG = Log.getLogger(WeldInitializationTest.class);
private static Server server;
private static URI serverHttpURI;
@BeforeClass
public static void startServer() throws Exception
{
JettyLogHandler.config();
server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(0);
server.addConnector(connector);
EmbeddedCdiHandler context = new EmbeddedCdiHandler();
File baseDir = MavenTestingUtils.getTestResourcesDir();
context.setBaseResource(Resource.newResource(baseDir));
context.setContextPath("/");
server.setHandler(context);
// Add some servlets
context.addServlet(TimeServlet.class,"/time");
context.addServlet(RequestInfoServlet.class,"/req-info");
server.start();
String host = connector.getHost();
if (host == null)
{
host = "localhost";
}
int port = connector.getLocalPort();
serverHttpURI = new URI(String.format("http://%s:%d/",host,port));
}
@AfterClass
public static void stopServer()
{
try
{
server.stop();
}
catch (Exception e)
{
LOG.warn(e);
}
}
@Test
public void testRequestParamServletDefault() throws Exception
{
HttpURLConnection http = (HttpURLConnection) serverHttpURI.resolve("req-info").toURL().openConnection();
assertThat("response code", http.getResponseCode(), is(200));
try(InputStream inputStream = http.getInputStream())
{
String resp = IO.toString(inputStream);
assertThat("Response", resp, containsString("request is PRESENT"));
assertThat("Response", resp, containsString("parameters.size = [0]"));
}
}
@Test
public void testRequestParamServletAbc() throws Exception
{
HttpURLConnection http = (HttpURLConnection) serverHttpURI.resolve("req-info?abc=123").toURL().openConnection();
assertThat("response code", http.getResponseCode(), is(200));
try(InputStream inputStream = http.getInputStream())
{
String resp = IO.toString(inputStream);
assertThat("Response", resp, containsString("request is PRESENT"));
assertThat("Response", resp, containsString("parameters.size = [1]"));
assertThat("Response", resp, containsString(" param[abc] = [123]"));
}
}
}

View File

@ -1,6 +0,0 @@
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>

View File

@ -1,11 +0,0 @@
org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
# org.jboss.LEVEL=DEBUG
org.eclipse.jetty.LEVEL=INFO
# org.eclipse.jetty.util.DecoratedObjectFactory.LEVEL=DEBUG
# org.eclipse.jetty.cdi.LEVEL=DEBUG
# org.eclipse.jetty.LEVEL=DEBUG
# org.eclipse.jetty.websocket.LEVEL=DEBUG
# org.eclipse.jetty.websocket.client.LEVEL=DEBUG

View File

@ -1,2 +0,0 @@
handlers = org.eclipse.jetty.util.log.JettyLogHandler
.level=FINE

View File

@ -1,70 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>jetty-cdi-parent</artifactId>
<version>10.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cdi-websocket</artifactId>
<name>Jetty :: CDI :: WebSocket</name>
<url>http://www.eclipse.org/jetty</url>
<packaging>jar</packaging>
<properties>
<bundle-symbolic-name>${project.groupId}.websocket</bundle-symbolic-name>
</properties>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>cdi-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-common</artifactId>
<version>${project.version}</version>
</dependency>
<!-- below here lie testing dragons -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jsp</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-core</artifactId>
<version>${weld.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
<version>${weld.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>cdi-core</artifactId>
<version>${project.version}</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>cdi-servlet</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>javax-websocket-server-impl</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -1,73 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket;
import org.eclipse.jetty.util.component.Container;
import org.eclipse.jetty.util.component.LifeCycle;
/**
* Abstract implementation of listener that needs both Container events and LifeCycle events
*/
public abstract class AbstractContainerListener implements LifeCycle.Listener, Container.InheritedListener
{
@Override
public void beanAdded(Container parent, Object child)
{
if (child instanceof LifeCycle)
{
((LifeCycle)child).addLifeCycleListener(this);
}
}
@Override
public void beanRemoved(Container parent, Object child)
{
if (child instanceof LifeCycle)
{
((LifeCycle)child).removeLifeCycleListener(this);
}
}
@Override
public void lifeCycleFailure(LifeCycle event, Throwable cause)
{
}
@Override
public void lifeCycleStarted(LifeCycle event)
{
}
@Override
public void lifeCycleStarting(LifeCycle event)
{
}
@Override
public void lifeCycleStopped(LifeCycle event)
{
}
@Override
public void lifeCycleStopping(LifeCycle event)
{
}
}

View File

@ -1,56 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.websocket.Session;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
/**
* Producer of {@link javax.websocket.Session} instances
*/
public class JavaWebSocketSessionProducer
{
private static final Logger LOG = Log.getLogger(JavaWebSocketSessionProducer.class);
@Produces
public Session getSession(InjectionPoint injectionPoint)
{
if (LOG.isDebugEnabled())
{
LOG.debug("getSession({})",injectionPoint);
}
org.eclipse.jetty.websocket.api.Session sess = WebSocketScopeContext.current().getSession();
if (sess == null)
{
throw new IllegalStateException("No Session Available");
}
if (sess instanceof javax.websocket.Session)
{
return (Session)sess;
}
throw new IllegalStateException("Incompatible Session, expected <" + javax.websocket.Session.class.getName() + ">, but got <"
+ sess.getClass().getName() + "> instead");
}
}

View File

@ -1,55 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import org.eclipse.jetty.cdi.websocket.annotation.WebSocketScope;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.websocket.api.Session;
/**
* Producer of {@link org.eclipse.jetty.websocket.api.Session} instances
*/
public class JettyWebSocketSessionProducer
{
private static final Logger LOG = Log.getLogger(JettyWebSocketSessionProducer.class);
@Produces
public Session getSession(InjectionPoint injectionPoint)
{
if (LOG.isDebugEnabled())
{
LOG.debug("getSession({})",injectionPoint);
}
WebSocketScopeContext ctx = WebSocketScopeContext.current();
if (ctx == null)
{
throw new IllegalStateException("Not in a " + WebSocketScope.class.getName());
}
org.eclipse.jetty.websocket.api.Session sess = ctx.getSession();
if (sess == null)
{
throw new IllegalStateException("No Session Available");
}
return sess;
}
}

View File

@ -1,37 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket;
import org.eclipse.jetty.webapp.AbstractConfiguration;
import org.eclipse.jetty.webapp.WebSocketConfiguration;
/**
* <p>Websocket CDI Configuration</p>
* <p>This configuration configures the WebAppContext server/system classes to
* be able to see {@link WebSocketCdiInitializer}
* </p>
*/
public class WebSocketCdiConfiguration extends AbstractConfiguration
{
public WebSocketCdiConfiguration()
{
addDependencies(WebSocketConfiguration.class);
protectAndExpose("org.eclipse.jetty.cdi.websocket.");
}
}

View File

@ -1,70 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket;
import java.util.Set;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.thread.ThreadClassLoaderScope;
public class WebSocketCdiInitializer implements ServletContainerInitializer
{
public static void configureContext(ServletContextHandler context) throws ServletException
{
try (ThreadClassLoaderScope scope = new ThreadClassLoaderScope(context.getClassLoader()))
{
addListeners(context);
}
}
@Override
public void onStartup(Set<Class<?>> c, ServletContext context) throws ServletException
{
ContextHandler handler = ContextHandler.getContextHandler(context);
if (handler == null)
{
throw new ServletException("Not running on Jetty, WebSocket+CDI support unavailable");
}
if (!(handler instanceof ServletContextHandler))
{
throw new ServletException("Not running in Jetty ServletContextHandler, WebSocket+CDI support unavailable");
}
ServletContextHandler jettyContext = (ServletContextHandler)handler;
try (ThreadClassLoaderScope scope = new ThreadClassLoaderScope(context.getClassLoader()))
{
addListeners(jettyContext);
}
}
private static void addListeners(ContainerLifeCycle container)
{
WebSocketCdiListener listener = new WebSocketCdiListener();
container.addLifeCycleListener(listener);
container.addEventListener(listener);
}
}

View File

@ -1,115 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.CDI;
import org.eclipse.jetty.cdi.core.AnyLiteral;
import org.eclipse.jetty.cdi.core.ScopedInstance;
import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.websocket.common.WebSocketSession;
import org.eclipse.jetty.websocket.common.scopes.WebSocketContainerScope;
public class WebSocketCdiListener extends AbstractContainerListener implements WebSocketSession.Listener
{
static final Logger LOG = Log.getLogger(WebSocketCdiListener.class);
private Map<String, ScopedInstance<WebSocketScopeContext>> instances = new ConcurrentHashMap<>();
@SuppressWarnings(
{"rawtypes", "unchecked"})
public static <T> ScopedInstance<T> newInstance(Class<T> clazz)
{
BeanManager bm = CDI.current().getBeanManager();
ScopedInstance sbean = new ScopedInstance();
Set<Bean<?>> beans = bm.getBeans(clazz, AnyLiteral.INSTANCE);
if (beans.size() > 0)
{
sbean.bean = beans.iterator().next();
sbean.creationalContext = bm.createCreationalContext(sbean.bean);
sbean.instance = bm.getReference(sbean.bean, clazz, sbean.creationalContext);
return sbean;
}
else
{
throw new RuntimeException(String.format("Can't find class %s", clazz));
}
}
@Override
public void onCreated(WebSocketSession session)
{
String id = toId(session);
ScopedInstance<WebSocketScopeContext> wsScope = newInstance(WebSocketScopeContext.class);
wsScope.instance.create();
wsScope.instance.begin();
wsScope.instance.setSession(session);
instances.put(id, wsScope);
}
@Override
public void onOpened(WebSocketSession session)
{
// do nothing
}
@Override
public void onClosed(WebSocketSession session)
{
String id = toId(session);
ScopedInstance<WebSocketScopeContext> wsScope = instances.remove(id);
if (wsScope != null)
{
wsScope.instance.end();
wsScope.instance.destroy();
wsScope.destroy();
}
}
private String toId(WebSocketSession session)
{
return session.getRemoteAddress().toString() + ">" + session.getLocalAddress().toString();
}
@Override
public void lifeCycleStarting(LifeCycle event)
{
if (event instanceof WebSocketContainerScope)
{
if (LOG.isDebugEnabled())
{
LOG.debug("started websocket container [{}]", event);
}
WebSocketContainerScope webSocketContainerScope = (WebSocketContainerScope) event;
webSocketContainerScope.addSessionListener(this);
}
}
}

View File

@ -1,230 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket;
import java.lang.annotation.Annotation;
import java.util.List;
import java.util.Set;
import javax.enterprise.context.spi.Context;
import javax.enterprise.context.spi.Contextual;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Inject;
import org.eclipse.jetty.cdi.core.AnyLiteral;
import org.eclipse.jetty.cdi.core.ScopedInstance;
import org.eclipse.jetty.cdi.core.SimpleBeanStore;
import org.eclipse.jetty.cdi.websocket.annotation.WebSocketScope;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.websocket.api.Session;
/**
* WebSocket Scope Context.
* <p>
* A CDI Context definition for how CDI will use objects defined to belong to the WebSocketScope
*/
public class WebSocketScopeContext implements Context
{
private static final Logger LOG = Log.getLogger(WebSocketScopeContext.class);
private static ThreadLocal<WebSocketScopeContext> current = new ThreadLocal<>();
public static WebSocketScopeContext current()
{
return current.get();
}
private SimpleBeanStore beanStore;
@Inject
private BeanManager beanManager;
private ThreadLocal<org.eclipse.jetty.websocket.api.Session> session = new ThreadLocal<>();
public void begin()
{
if (LOG.isDebugEnabled())
{
LOG.debug("{} begin()",this);
}
current.set(this);
}
public void create()
{
if (LOG.isDebugEnabled())
{
LOG.debug("{} create()",this);
}
current.set(this);
beanStore = new SimpleBeanStore();
}
public void destroy()
{
if (LOG.isDebugEnabled())
{
LOG.debug("{} destroy()",this);
}
beanStore.destroy();
}
public void end()
{
if (LOG.isDebugEnabled())
{
LOG.debug("{} end()",this);
}
beanStore.clear();
}
@SuppressWarnings({ "unchecked" })
@Override
public <T> T get(Contextual<T> contextual)
{
if (LOG.isDebugEnabled())
{
LOG.debug("{} get({})",this,contextual);
}
Bean<T> bean = (Bean<T>)contextual;
if (bean.getBeanClass().isAssignableFrom(Session.class))
{
return (T)this.session;
}
if (beanStore == null)
{
return null;
}
List<ScopedInstance<?>> beans = beanStore.getBeans(contextual);
if ((beans != null) && (!beans.isEmpty()))
{
return (T)beans.get(0).instance;
}
return null;
}
@SuppressWarnings("unchecked")
@Override
public <T> T get(Contextual<T> contextual, CreationalContext<T> creationalContext)
{
if (LOG.isDebugEnabled())
{
LOG.debug("{} get({},{})",this,contextual,creationalContext);
}
Bean<T> bean = (Bean<T>)contextual;
if (bean.getBeanClass().isAssignableFrom(Session.class))
{
return (T)this.session;
}
if (beanStore == null)
{
beanStore = new SimpleBeanStore();
}
List<ScopedInstance<?>> beans = beanStore.getBeans(contextual);
if ((beans != null) && (!beans.isEmpty()))
{
for (ScopedInstance<?> instance : beans)
{
if (instance.bean.equals(bean))
{
return (T)instance.instance;
}
}
}
// no bean found, create it
T t = bean.create(creationalContext);
ScopedInstance<T> customInstance = new ScopedInstance<>();
customInstance.bean = bean;
customInstance.creationalContext = creationalContext;
customInstance.instance = t;
beanStore.addBean(customInstance);
return t;
}
@Override
public Class<? extends Annotation> getScope()
{
return WebSocketScope.class;
}
@Override
public boolean isActive()
{
return true;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public <T> T newInstance(Class<T> clazz)
{
if (LOG.isDebugEnabled())
{
LOG.debug("newInstance({})",clazz);
}
Set<Bean<?>> beans = beanManager.getBeans(clazz,AnyLiteral.INSTANCE);
if (beans.isEmpty())
{
return null;
}
Bean bean = beans.iterator().next();
CreationalContext cc = beanManager.createCreationalContext(bean);
return (T)beanManager.getReference(bean,clazz,cc);
}
public void setSession(org.eclipse.jetty.websocket.api.Session sess)
{
if (LOG.isDebugEnabled())
{
LOG.debug("{} setSession({})",this,sess);
}
current.set(this);
this.session.set(sess);
}
public org.eclipse.jetty.websocket.api.Session getSession()
{
if (LOG.isDebugEnabled())
{
LOG.debug("{} getSession()",this);
}
return this.session.get();
}
@Override
public String toString()
{
return String.format("%s@%X[%s]",this.getClass().getSimpleName(),hashCode(),beanStore);
}
}

View File

@ -1,74 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket;
import javax.enterprise.context.Destroyed;
import javax.enterprise.context.Initialized;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.BeforeBeanDiscovery;
import javax.enterprise.inject.spi.Extension;
import org.eclipse.jetty.cdi.websocket.annotation.WebSocketScope;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
/**
* Register the various WebSocket specific components for CDI
*/
public class WebSocketScopeExtension implements Extension
{
private static final Logger LOG = Log.getLogger(WebSocketScopeExtension.class);
public void addScope(@Observes final BeforeBeanDiscovery event)
{
if (LOG.isDebugEnabled())
{
LOG.debug("addScope()");
}
// Add our scope
event.addScope(WebSocketScope.class,true,false);
}
public void registerContext(@Observes final AfterBeanDiscovery event)
{
if (LOG.isDebugEnabled())
{
LOG.debug("registerContext()");
}
// Register our context
event.addContext(new WebSocketScopeContext());
}
public void logWsScopeInit(@Observes @Initialized(WebSocketScope.class) org.eclipse.jetty.websocket.api.Session sess)
{
if (LOG.isDebugEnabled())
{
LOG.debug("Initialized @WebSocketScope - {}",sess);
}
}
public void logWsScopeDestroyed(@Observes @Destroyed(WebSocketScope.class) org.eclipse.jetty.websocket.api.Session sess)
{
if (LOG.isDebugEnabled())
{
LOG.debug("Destroyed @WebSocketScope - {}",sess);
}
}
}

View File

@ -1,45 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Scope;
/**
* A CDI Context Scope for a WebSocket Session / Endpoint
* <p>
* <em>CAUTION: This is a highly speculative scope defined by Jetty. One that will likely be replaced by a formal spec later</em>
* <p>
* At the time of implementation (of this scope), no standard scope exists for websocket session lifecycle.
*/
@Scope
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD })
@Inherited
@Documented
public @interface WebSocketScope
{
}

View File

@ -1,4 +0,0 @@
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

View File

@ -1 +0,0 @@
org.eclipse.jetty.cdi.websocket.WebSocketScopeExtension

View File

@ -1 +0,0 @@
org.eclipse.jetty.cdi.websocket.WebSocketCdiInitializer

View File

@ -1 +0,0 @@
org.eclipse.jetty.cdi.websocket.WebSocketCdiConfiguration

View File

@ -1,106 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.WebSocketAdapter;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
import org.eclipse.jetty.websocket.common.util.TextUtil;
@WebSocket
public class CheckSocket extends WebSocketAdapter
{
private static final Logger LOG = Log.getLogger(CheckSocket.class);
private CountDownLatch closeLatch = new CountDownLatch(1);
private CountDownLatch openLatch = new CountDownLatch(1);
private BlockingQueue<String> textMessages = new LinkedBlockingDeque<>();
public void awaitClose(int timeout, TimeUnit timeunit) throws InterruptedException
{
assertTrue("Timeout waiting for close",closeLatch.await(timeout,timeunit));
}
public void awaitOpen(int timeout, TimeUnit timeunit) throws InterruptedException
{
assertTrue("Timeout waiting for open",openLatch.await(timeout,timeunit));
}
public BlockingQueue<String> getTextMessages()
{
return textMessages;
}
@Override
public void onWebSocketClose(int statusCode, String reason)
{
LOG.debug("Close: {}, {}",statusCode,reason);
super.onWebSocketClose(statusCode,reason);
closeLatch.countDown();
}
@Override
public void onWebSocketConnect(Session sess)
{
LOG.debug("Open: {}",sess);
super.onWebSocketConnect(sess);
openLatch.countDown();
}
@Override
public void onWebSocketError(Throwable cause)
{
LOG.warn("WebSocket Error",cause);
super.onWebSocketError(cause);
}
@Override
public void onWebSocketText(String message)
{
LOG.debug("TEXT: {}",message);
textMessages.offer(message);
}
public void sendText(String msg) throws IOException
{
if (isConnected())
{
getRemote().sendString(msg);
}
else
{
LOG.warn("Not connected, cannot send {}", TextUtil.quote(msg));
LOG.debug("Session: {}", getSession());
}
}
public void close(int statusCode, String reason)
{
getSession().close(statusCode,reason);
}
}

View File

@ -1,125 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.basicapp;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import java.io.File;
import java.net.URI;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import javax.websocket.server.ServerContainer;
import org.eclipse.jetty.cdi.servlet.EmbeddedCdiHandler;
import org.eclipse.jetty.cdi.websocket.CheckSocket;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.util.log.JettyLogHandler;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.StatusCode;
import org.eclipse.jetty.websocket.api.util.WSURI;
import org.eclipse.jetty.websocket.client.WebSocketClient;
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
@Ignore("TODO: Fix CDI integration")
public class BasicAppTest
{
private static final Logger LOG = Log.getLogger(BasicAppTest.class);
private static Server server;
@SuppressWarnings("unused")
private static URI serverHttpURI;
private static URI serverWebsocketURI;
@BeforeClass
public static void startServer() throws Exception
{
JettyLogHandler.config();
server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(0);
server.addConnector(connector);
EmbeddedCdiHandler context = new EmbeddedCdiHandler();
File baseDir = MavenTestingUtils.getTestResourcesDir();
context.setBaseResource(Resource.newResource(baseDir));
context.setContextPath("/");
server.setHandler(context);
// Add some websockets
ServerContainer container = WebSocketServerContainerInitializer.configureContext(context);
container.addEndpoint(EchoSocket.class);
server.start();
serverHttpURI = server.getURI().resolve("/");
serverWebsocketURI = WSURI.toWebsocket(serverHttpURI);
}
@AfterClass
public static void stopServer()
{
try
{
server.stop();
}
catch (Exception e)
{
LOG.warn(e);
}
}
@Test
public void testWebSocketEcho() throws Exception
{
WebSocketClient client = new WebSocketClient();
try
{
client.start();
CheckSocket socket = new CheckSocket();
Future<Session> futureSession = client.connect(socket,serverWebsocketURI.resolve("/echo"));
Session session = futureSession.get(5, TimeUnit.SECONDS);
session.getRemote().sendString("Hello World");
String response = socket.getTextMessages().poll(5, TimeUnit.SECONDS);
assertThat("Message[0]",response,is("Hello World"));
socket.close(StatusCode.NORMAL,"Test complete");
socket.awaitClose(5,TimeUnit.SECONDS);
}
finally
{
client.stop();
}
}
}

View File

@ -1,59 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.basicapp;
import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.websocket.common.util.TextUtil;
@ServerEndpoint("/echo")
public class EchoSocket
{
private static final Logger LOG = Log.getLogger(EchoSocket.class);
@SuppressWarnings("unused")
private Session session;
@OnOpen
public void onOpen(Session session)
{
LOG.debug("onOpen(): {}",session);
this.session = session;
}
@OnClose
public void onClose(CloseReason close)
{
LOG.debug("onClose(): {}",close);
this.session = null;
}
@OnMessage
public String onMessage(String msg)
{
LOG.debug("onMessage({})", TextUtil.quote(msg));
return msg;
}
}

View File

@ -1,100 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.basicscope;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class Food
{
private boolean constructed = false;
private boolean destroyed = false;
private String name;
@PreDestroy
void destroy()
{
destroyed = true;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
Food other = (Food)obj;
if (name == null)
{
if (other.name != null)
{
return false;
}
}
else if (!name.equals(other.name))
{
return false;
}
return true;
}
public String getName()
{
return name;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = (prime * result) + ((name == null) ? 0 : name.hashCode());
return result;
}
@PostConstruct
void init()
{
constructed = true;
}
public boolean isConstructed()
{
return constructed;
}
public boolean isDestroyed()
{
return destroyed;
}
public void setName(String name)
{
this.name = name;
}
}

View File

@ -1,40 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.basicscope;
import javax.inject.Inject;
public class Meal
{
@Inject
private Food entree;
@Inject
private Food side;
public Food getEntree()
{
return entree;
}
public Food getSide()
{
return side;
}
}

View File

@ -1,97 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.basicscope;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.sameInstance;
import static org.junit.Assert.assertThat;
import java.util.Set;
import javax.enterprise.inject.spi.Bean;
import org.eclipse.jetty.cdi.core.AnyLiteral;
import org.eclipse.jetty.cdi.core.ScopedInstance;
import org.eclipse.jetty.cdi.core.logging.Logging;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class ScopeBasicsTest
{
private static Weld weld;
private static WeldContainer container;
@BeforeClass
public static void startWeld()
{
Logging.config();
weld = new Weld();
container = weld.initialize();
}
@AfterClass
public static void stopWeld()
{
weld.shutdown();
}
/**
* Validation of Scope / Inject logic on non-websocket-scoped classes
* @throws Exception on test failure
*/
@Test
public void testBasicBehavior() throws Exception
{
ScopedInstance<Meal> meal1Bean = newInstance(Meal.class);
Meal meal1 = meal1Bean.instance;
ScopedInstance<Meal> meal2Bean = newInstance(Meal.class);
Meal meal2 = meal2Bean.instance;
assertThat("Meals are not the same",meal1,not(sameInstance(meal2)));
assertThat("Meal 1 Entree Constructed",meal1.getEntree().isConstructed(),is(true));
assertThat("Meal 1 Side Constructed",meal1.getSide().isConstructed(),is(true));
assertThat("Meal parts not the same",meal1.getEntree(),not(sameInstance(meal1.getSide())));
assertThat("Meal entrees are the same",meal1.getEntree(),not(sameInstance(meal2.getEntree())));
assertThat("Meal sides are the same",meal1.getSide(),not(sameInstance(meal2.getSide())));
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static <T> ScopedInstance<T> newInstance(Class<T> clazz) throws Exception
{
ScopedInstance sbean = new ScopedInstance();
Set<Bean<?>> beans = container.getBeanManager().getBeans(clazz,AnyLiteral.INSTANCE);
if (beans.size() > 0)
{
sbean.bean = beans.iterator().next();
sbean.creationalContext = container.getBeanManager().createCreationalContext(sbean.bean);
sbean.instance = container.getBeanManager().getReference(sbean.bean,clazz,sbean.creationalContext);
return sbean;
}
else
{
throw new Exception(String.format("Can't find class %s",clazz));
}
}
}

View File

@ -1,186 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.cdiapp;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;
import java.io.File;
import java.net.URI;
import java.util.concurrent.TimeUnit;
import javax.websocket.server.ServerContainer;
import org.eclipse.jetty.cdi.servlet.EmbeddedCdiHandler;
import org.eclipse.jetty.cdi.websocket.CheckSocket;
import org.eclipse.jetty.cdi.websocket.WebSocketCdiInitializer;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.util.log.JettyLogHandler;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.websocket.api.StatusCode;
import org.eclipse.jetty.websocket.client.WebSocketClient;
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
@Ignore("TODO: Fix CDI integration")
public class CdiAppTest
{
private static final Logger LOG = Log.getLogger(CdiAppTest.class);
private static Server server;
private static URI serverWebsocketURI;
@BeforeClass
public static void startServer() throws Exception
{
JettyLogHandler.config();
server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(0);
server.addConnector(connector);
EmbeddedCdiHandler context = new EmbeddedCdiHandler();
WebSocketCdiInitializer.configureContext(context);
File baseDir = MavenTestingUtils.getTestResourcesDir();
context.setBaseResource(Resource.newResource(baseDir));
context.setContextPath("/");
server.setHandler(context);
// Add some websockets
ServerContainer container = WebSocketServerContainerInitializer.configureContext(context);
container.addEndpoint(EchoSocket.class);
container.addEndpoint(InfoSocket.class);
server.start();
String host = connector.getHost();
if (host == null)
{
host = "localhost";
}
int port = connector.getLocalPort();
serverWebsocketURI = new URI(String.format("ws://%s:%d/",host,port));
}
@AfterClass
public static void stopServer()
{
try
{
server.stop();
}
catch (Exception e)
{
LOG.warn(e);
}
}
@Test
public void testWebSocketActivated() throws Exception
{
WebSocketClient client = new WebSocketClient();
try
{
client.start();
CheckSocket socket = new CheckSocket();
client.connect(socket,serverWebsocketURI.resolve("/echo"));
socket.awaitOpen(2,TimeUnit.SECONDS);
socket.sendText("Hello");
socket.close(StatusCode.NORMAL,"Test complete");
socket.awaitClose(2,TimeUnit.SECONDS);
assertThat("Messages received",socket.getTextMessages().size(),is(1));
assertThat("Message[0]",socket.getTextMessages().poll(),is("Hello"));
}
finally
{
client.stop();
}
}
@Test
public void testWebSocket_Info_FieldPresence() throws Exception
{
WebSocketClient client = new WebSocketClient();
try
{
client.start();
CheckSocket socket = new CheckSocket();
client.connect(socket,serverWebsocketURI.resolve("/cdi-info"));
socket.awaitOpen(2,TimeUnit.SECONDS);
socket.sendText("info");
socket.close(StatusCode.NORMAL,"Test complete");
socket.awaitClose(2,TimeUnit.SECONDS);
String response = socket.getTextMessages().poll(5, TimeUnit.SECONDS);
assertThat("Message[0]",response,
allOf(
containsString("websocketSession is PRESENT"),
containsString("httpSession is PRESENT"),
containsString("servletContext is PRESENT")
));
}
finally
{
client.stop();
}
}
@Test
public void testWebSocket_Info_DataFromCdi() throws Exception
{
WebSocketClient client = new WebSocketClient();
try
{
client.start();
CheckSocket socket = new CheckSocket();
client.connect(socket,serverWebsocketURI.resolve("/cdi-info"));
socket.awaitOpen(2,TimeUnit.SECONDS);
socket.sendText("data|stuff");
String response = socket.getTextMessages().poll(5, TimeUnit.SECONDS);
assertThat("Message[0]",response,containsString("Hello there stuff"));
response = socket.getTextMessages().poll(5, TimeUnit.SECONDS);
assertThat("Message[1]",response,notNullValue());
socket.close(StatusCode.NORMAL,"Test complete");
socket.awaitClose(2,TimeUnit.SECONDS);
}
finally
{
client.stop();
}
}
}

View File

@ -1,41 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.cdiapp;
import javax.inject.Inject;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.websocket.api.Session;
public class DataMaker
{
private static final Logger LOG = Log.getLogger(DataMaker.class);
@Inject
public Session session;
public void processMessage(String msg)
{
LOG.debug(".processMessage({})",msg);
LOG.debug("session = {}",session);
session.getRemote().sendStringByFuture("Hello there " + msg);
}
}

View File

@ -1,57 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.cdiapp;
import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ServerEndpoint("/echo")
public class EchoSocket
{
private static final Logger LOG = Log.getLogger(EchoSocket.class);
@SuppressWarnings("unused")
private Session session;
@OnOpen
public void onOpen(Session session)
{
LOG.debug("onOpen(): {}",session);
this.session = session;
}
@OnClose
public void onClose(CloseReason close)
{
LOG.debug("onClose(): {}",close);
this.session = null;
}
@OnMessage
public String onMessage(String msg)
{
return msg;
}
}

View File

@ -1,92 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.cdiapp;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.logging.Level;
import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/cdi-info")
public class InfoSocket
{
private static final java.util.logging.Logger LOG = java.util.logging.Logger.getLogger(InfoSocket.class.getName());
@Inject
public HttpSession httpSession;
@Inject
public ServletContext servletContext;
@Inject
public DataMaker dataMaker;
private Session session;
@OnOpen
public void onOpen(Session session)
{
LOG.log(Level.INFO,"onOpen(): {0}",session);
this.session = session;
}
@OnClose
public void onClose(CloseReason close)
{
LOG.log(Level.INFO,"onClose(): {}",close);
this.session = null;
}
@OnMessage
public String onMessage(String msg)
{
StringWriter str = new StringWriter();
PrintWriter out = new PrintWriter(str);
String args[] = msg.split("\\|");
switch (args[0])
{
case "info":
out.printf("websocketSession is %s%n",asPresent(session));
out.printf("httpSession is %s%n",asPresent(httpSession));
out.printf("servletContext is %s%n",asPresent(servletContext));
break;
case "data":
dataMaker.processMessage(args[1]);
break;
}
return str.toString();
}
private String asPresent(Object obj)
{
return obj == null ? "NULL" : "PRESENT";
}
}

View File

@ -1,150 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.wsscope;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.eclipse.jetty.websocket.api.CloseStatus;
import org.eclipse.jetty.websocket.api.RemoteEndpoint;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.SuspendToken;
import org.eclipse.jetty.websocket.api.UpgradeRequest;
import org.eclipse.jetty.websocket.api.UpgradeResponse;
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
/**
* A bogus websocket Session concept object.
* <p>
* Used to test the scope @Inject of this kind of Session. This is important to test, as the BogusSession does not have
* a default constructor that CDI itself can use to create this object.
* <p>
* This object would need to be added to the beanstore for this scope for later @Inject to use.
*/
public class BogusSession implements Session
{
private final String id;
public BogusSession(String id)
{
this.id = id;
}
@Override
public String toString()
{
return String.format("BogusSession[id=%s]",id);
}
public String getId()
{
return id;
}
@Override
public void close()
{
}
@Override
public void close(CloseStatus closeStatus)
{
}
@Override
public void close(int statusCode, String reason)
{
}
@Override
public void disconnect() throws IOException
{
}
@Override
public long getIdleTimeout()
{
return 0;
}
@Override
public InetSocketAddress getLocalAddress()
{
return null;
}
@Override
public WebSocketPolicy getPolicy()
{
return null;
}
@Override
public String getProtocolVersion()
{
return null;
}
@Override
public RemoteEndpoint getRemote()
{
return null;
}
@Override
public InetSocketAddress getRemoteAddress()
{
return null;
}
@Override
public UpgradeRequest getUpgradeRequest()
{
return null;
}
@Override
public UpgradeResponse getUpgradeResponse()
{
return null;
}
@Override
public boolean isOpen()
{
return false;
}
@Override
public boolean isSecure()
{
return false;
}
@Override
public void setIdleTimeout(long ms)
{
}
@Override
public SuspendToken suspend()
{
return null;
}
}

View File

@ -1,34 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.wsscope;
import javax.inject.Inject;
import org.eclipse.jetty.websocket.api.Session;
public class BogusSocket
{
@Inject
public Session session;
public Session getSession()
{
return session;
}
}

View File

@ -1,119 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.wsscope;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.eclipse.jetty.cdi.websocket.annotation.WebSocketScope;
@WebSocketScope
public class Food
{
private boolean constructed = false;
private boolean destroyed = false;
private String name;
public Food()
{
// default constructor (for CDI use)
}
public Food(String name)
{
this.name = name;
}
@PreDestroy
void destroy()
{
destroyed = true;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
Food other = (Food)obj;
if (name == null)
{
if (other.name != null)
{
return false;
}
}
else if (!name.equals(other.name))
{
return false;
}
return true;
}
public String getName()
{
return name;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = (prime * result) + ((name == null) ? 0 : name.hashCode());
return result;
}
@PostConstruct
void init()
{
constructed = true;
}
public boolean isConstructed()
{
return constructed;
}
public boolean isDestroyed()
{
return destroyed;
}
public void setName(String name)
{
this.name = name;
}
@Override
public String toString()
{
return String.format("%s@%X[%s]",Food.class.getSimpleName(),hashCode(),name);
}
}

View File

@ -1,40 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.wsscope;
import javax.inject.Inject;
public class Meal
{
@Inject
private Food entree;
@Inject
private Food side;
public Food getEntree()
{
return entree;
}
public Food getSide()
{
return side;
}
}

View File

@ -1,131 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.wsscope;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.sameInstance;
import static org.junit.Assert.assertThat;
import java.util.Set;
import javax.enterprise.inject.spi.Bean;
import org.eclipse.jetty.cdi.core.AnyLiteral;
import org.eclipse.jetty.cdi.core.ScopedInstance;
import org.eclipse.jetty.cdi.core.logging.Logging;
import org.eclipse.jetty.cdi.websocket.WebSocketScopeContext;
import org.eclipse.jetty.cdi.websocket.annotation.WebSocketScope;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class WebSocketScopeBaselineTest
{
private static Weld weld;
private static WeldContainer container;
@BeforeClass
public static void startWeld()
{
Logging.config();
weld = new Weld();
container = weld.initialize();
}
@AfterClass
public static void stopWeld()
{
weld.shutdown();
}
/**
* Test behavior of {@link WebSocketScope} in basic operation.
* <p>
* Food is declared as part of WebSocketScope, and as such, only 1 instance of it can exist.
* @throws Exception on test failure
*/
@Test
public void testScopeBehavior() throws Exception
{
ScopedInstance<WebSocketScopeContext> wsScopeBean = newInstance(WebSocketScopeContext.class);
WebSocketScopeContext wsScope = wsScopeBean.instance;
wsScope.create();
Meal meal1;
try
{
wsScope.begin();
ScopedInstance<Meal> meal1Bean = newInstance(Meal.class);
meal1 = meal1Bean.instance;
ScopedInstance<Meal> meal2Bean = newInstance(Meal.class);
Meal meal2 = meal2Bean.instance;
assertThat("Meals are not the same",meal1,not(sameInstance(meal2)));
assertThat("Meal 1 Entree Constructed",meal1.getEntree().isConstructed(),is(true));
assertThat("Meal 1 Side Constructed",meal1.getSide().isConstructed(),is(true));
/* Since Food is annotated with @WebSocketScope, there can only be one instance of it
* in use with the 2 Meal objects.
*/
assertThat("Meal parts not the same",meal1.getEntree(),sameInstance(meal1.getSide()));
assertThat("Meal entrees are the same",meal1.getEntree(),sameInstance(meal2.getEntree()));
assertThat("Meal sides are the same",meal1.getSide(),sameInstance(meal2.getSide()));
meal1Bean.destroy();
meal2Bean.destroy();
}
finally
{
wsScope.end();
}
Food entree1 = meal1.getEntree();
Food side1 = meal1.getSide();
assertThat("Meal 1 entree destroyed",entree1.isDestroyed(),is(false));
assertThat("Meal 1 side destroyed",side1.isDestroyed(),is(false));
wsScope.destroy();
// assertThat("Meal 1 entree destroyed",entree1.isDestroyed(),is(true));
// assertThat("Meal 1 side destroyed",side1.isDestroyed(),is(true));
wsScopeBean.destroy();
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static <T> ScopedInstance<T> newInstance(Class<T> clazz) throws Exception
{
ScopedInstance sbean = new ScopedInstance();
Set<Bean<?>> beans = container.getBeanManager().getBeans(clazz,AnyLiteral.INSTANCE);
if (beans.size() > 0)
{
sbean.bean = beans.iterator().next();
sbean.creationalContext = container.getBeanManager().createCreationalContext(sbean.bean);
sbean.instance = container.getBeanManager().getReference(sbean.bean,clazz,sbean.creationalContext);
return sbean;
}
else
{
throw new Exception(String.format("Can't find class %s",clazz));
}
}
}

View File

@ -1,253 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.cdi.websocket.wsscope;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.sameInstance;
import static org.junit.Assert.assertThat;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import javax.enterprise.inject.spi.Bean;
import org.eclipse.jetty.cdi.core.AnyLiteral;
import org.eclipse.jetty.cdi.core.ScopedInstance;
import org.eclipse.jetty.cdi.core.logging.Logging;
import org.eclipse.jetty.cdi.websocket.WebSocketScopeContext;
import org.eclipse.jetty.websocket.api.Session;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class WebSocketScopeSessionTest
{
private static Weld weld;
private static WeldContainer container;
@BeforeClass
public static void startWeld()
{
Logging.config();
weld = new Weld();
container = weld.initialize();
}
@AfterClass
public static void stopWeld()
{
weld.shutdown();
}
@Test
public void testSessionActivation() throws Exception
{
ScopedInstance<WebSocketScopeContext> wsScopeBean = newInstance(WebSocketScopeContext.class);
WebSocketScopeContext wsScope = wsScopeBean.instance;
wsScope.create();
try
{
// Scope 1
wsScope.begin();
BogusSession sess = new BogusSession("1");
wsScope.setSession(sess);
ScopedInstance<BogusSocket> sock1Bean = newInstance(BogusSocket.class);
BogusSocket sock1 = sock1Bean.instance;
assertThat("Socket 1 Session",sock1.getSession().toString(),is(sess.toString()));
sock1Bean.destroy();
}
finally
{
wsScope.end();
}
wsScope.destroy();
wsScopeBean.destroy();
}
@Test
public void testMultiSession_Sequential() throws Exception
{
ScopedInstance<WebSocketScopeContext> wsScope1Bean = newInstance(WebSocketScopeContext.class);
WebSocketScopeContext wsScope1 = wsScope1Bean.instance;
ScopedInstance<WebSocketScopeContext> wsScope2Bean = newInstance(WebSocketScopeContext.class);
WebSocketScopeContext wsScope2 = wsScope2Bean.instance;
wsScope1.create();
try
{
// Scope 1
wsScope1.begin();
BogusSession sess = new BogusSession("1");
wsScope1.setSession(sess);
ScopedInstance<BogusSocket> sock1Bean = newInstance(BogusSocket.class);
BogusSocket sock1 = sock1Bean.instance;
assertThat("Socket 1 Session",sock1.getSession(),sameInstance((Session)sess));
sock1Bean.destroy();
}
finally
{
wsScope1.end();
}
wsScope1.destroy();
wsScope1Bean.destroy();
wsScope2.create();
try
{
// Scope 2
wsScope2.begin();
BogusSession sess = new BogusSession("2");
wsScope2.setSession(sess);
ScopedInstance<BogusSocket> sock2Bean = newInstance(BogusSocket.class);
BogusSocket sock2 = sock2Bean.instance;
assertThat("Socket 2 Session",sock2.getSession(),sameInstance((Session)sess));
sock2Bean.destroy();
}
finally
{
wsScope2.end();
}
wsScope2.destroy();
wsScope2Bean.destroy();
}
@Test
public void testMultiSession_Overlapping() throws Exception
{
final CountDownLatch midLatch = new CountDownLatch(2);
final CountDownLatch end1Latch = new CountDownLatch(1);
Callable<Session> call1 = new Callable<Session>() {
@Override
public Session call() throws Exception
{
Session ret = null;
ScopedInstance<WebSocketScopeContext> wsScope1Bean = newInstance(WebSocketScopeContext.class);
WebSocketScopeContext wsScope1 = wsScope1Bean.instance;
wsScope1.create();
try
{
// Scope 1
wsScope1.begin();
BogusSession sess = new BogusSession("1");
wsScope1.setSession(sess);
midLatch.countDown();
midLatch.await(1, TimeUnit.SECONDS);
ScopedInstance<BogusSocket> sock1Bean = newInstance(BogusSocket.class);
BogusSocket sock1 = sock1Bean.instance;
assertThat("Socket 1 Session",sock1.getSession(),sameInstance((Session)sess));
ret = sock1.getSession();
sock1Bean.destroy();
}
finally
{
wsScope1.end();
}
wsScope1.destroy();
wsScope1Bean.destroy();
end1Latch.countDown();
return ret;
}
};
final CountDownLatch end2Latch = new CountDownLatch(1);
Callable<Session> call2 = new Callable<Session>() {
@Override
public Session call() throws Exception
{
Session ret = null;
ScopedInstance<WebSocketScopeContext> wsScope2Bean = newInstance(WebSocketScopeContext.class);
WebSocketScopeContext wsScope2 = wsScope2Bean.instance;
wsScope2.create();
try
{
// Scope 2
wsScope2.begin();
BogusSession sess = new BogusSession("2");
wsScope2.setSession(sess);
ScopedInstance<BogusSocket> sock2Bean = newInstance(BogusSocket.class);
midLatch.countDown();
midLatch.await(1, TimeUnit.SECONDS);
BogusSocket sock2 = sock2Bean.instance;
ret = sock2.getSession();
assertThat("Socket 2 Session",sock2.getSession(),sameInstance((Session)sess));
sock2Bean.destroy();
}
finally
{
wsScope2.end();
}
wsScope2.destroy();
wsScope2Bean.destroy();
end2Latch.countDown();
return ret;
}
};
ExecutorService svc = Executors.newFixedThreadPool(4);
Future<Session> fut1 = svc.submit(call1);
Future<Session> fut2 = svc.submit(call2);
Session sess1 = fut1.get(1,TimeUnit.SECONDS);
Session sess2 = fut2.get(1,TimeUnit.SECONDS);
assertThat("Sessions are different", sess1, not(sameInstance(sess2)));
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static <T> ScopedInstance<T> newInstance(Class<T> clazz)
{
ScopedInstance sbean = new ScopedInstance();
Set<Bean<?>> beans = container.getBeanManager().getBeans(clazz,AnyLiteral.INSTANCE);
if (beans.size() > 0)
{
sbean.bean = beans.iterator().next();
sbean.creationalContext = container.getBeanManager().createCreationalContext(sbean.bean);
sbean.instance = container.getBeanManager().getReference(sbean.bean,clazz,sbean.creationalContext);
return sbean;
}
else
{
throw new RuntimeException(String.format("Can't find class %s",clazz));
}
}
}

View File

@ -1,6 +0,0 @@
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>

View File

@ -1,15 +0,0 @@
org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
org.jetty.LEVEL=INFO
org.jboss.LEVEL=INFO
# org.eclipse.jetty.LEVEL=INFO
# org.eclipse.jetty.util.component.LEVEL=DEBUG
# org.eclipse.jetty.websocket.common.LEVEL=DEBUG
# org.eclipse.jetty.util.DecoratedObjectFactory.LEVEL=DEBUG
# org.eclipse.jetty.cdi.LEVEL=DEBUG
# org.eclipse.jetty.LEVEL=DEBUG
# org.eclipse.jetty.websocket.LEVEL=DEBUG
# org.eclipse.jetty.websocket.client.LEVEL=DEBUG

View File

@ -1,2 +0,0 @@
handlers = org.eclipse.jetty.util.log.JettyLogHandler
.level=FINE

View File

@ -15,13 +15,6 @@
</properties>
<modules>
<module>cdi-core</module>
<module>cdi-servlet</module>
<module>cdi-full-servlet</module>
<module>cdi-websocket</module>
<module>test-cdi-webapp</module>
<!-- deprecated
<module>test-cdi-it</module>
-->
<module>cdi-2</module>
</modules>
</project>

View File

@ -1,204 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>jetty-cdi-parent</artifactId>
<version>10.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cdi-webapp-it</artifactId>
<packaging>jar</packaging>
<name>Jetty :: CDI :: Test :: WebApp Integration Tests</name>
<url>http://www.eclipse.org/jetty</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<bundle-symbolic-name>${project.groupId}.cdi.webapp.it</bundle-symbolic-name>
<scripts-dir>${project.basedir}/src/test/scripts</scripts-dir>
<test-base-dir>${project.build.directory}/test-base</test-base-dir>
<test-home-dir>${project.build.directory}/test-home</test-home-dir>
</properties>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-distribution</artifactId>
<version>${project.version}</version>
<type>zip</type>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>test-cdi-webapp</artifactId>
<version>${project.version}</version>
<type>war</type>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<!-- DO NOT DEPLOY (or Release) -->
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-apps-for-testing</id>
<phase>process-test-resources</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<includeArtifactIds>test-cdi-webapp</includeArtifactIds>
<includeScope>runtime</includeScope>
<includeTypes>war</includeTypes>
<overwriteSnapshots>true</overwriteSnapshots>
<overwriteReleases>true</overwriteReleases>
<stripVersion>true</stripVersion>
<outputDirectory>${test-base-dir}/webapps</outputDirectory>
</configuration>
</execution>
<execution>
<id>unpack-jetty-distro</id>
<phase>process-test-resources</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<includeArtifactIds>jetty-distribution</includeArtifactIds>
<includeScope>runtime</includeScope>
<includeTypes>zip</includeTypes>
<outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>
<outputDirectory>${test-home-dir}</outputDirectory>
<overWriteSnapshots>true</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>start-jetty</id>
<phase>pre-integration-test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<property name="jetty.cdi.home" location="${test-home-dir}/jetty-distribution-${project.version}"/>
<property name="jetty.cdi.base" location="${test-base-dir}"/>
<echo>Integration Test : Setup Jetty</echo>
<exec executable="${run.command}"
dir="${scripts-dir}"
spawn="false">
<arg value="${run.command.xtra}"/>
<arg value="${setup.script}"/>
<arg file="${java.home}"/>
<arg file="${jetty.cdi.home}"/>
<arg file="${jetty.cdi.base}"/>
</exec>
<echo>Integration Test : Starting Jetty ...</echo>
<exec executable="${run.command}"
dir="${scripts-dir}"
spawn="true">
<arg value="${run.command.xtra}"/>
<arg value="${start.script}"/>
<arg file="${java.home}"/>
<arg file="${jetty.cdi.home}"/>
<arg file="${jetty.cdi.base}"/>
</exec>
<waitfor maxwait="5" maxwaitunit="second"
checkevery="100" checkeveryunit="millisecond">
<http url="http://localhost:58080/cdi-webapp/"/>
</waitfor>
<echo>Integration Test : Jetty is now available</echo>
</target>
</configuration>
</execution>
<execution>
<id>stop-jetty</id>
<phase>post-integration-test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<property name="jetty.cdi.home" location="${test-home-dir}/jetty-distribution-${project.version}"/>
<property name="jetty.cdi.base" location="${test-base-dir}"/>
<echo>Integration Test : Stop Jetty</echo>
<exec executable="${run.command}"
dir="${scripts-dir}"
spawn="false">
<arg value="${run.command.xtra}"/>
<arg value="${stop.script}"/>
<arg file="${java.home}"/>
<arg file="${jetty.cdi.home}"/>
<arg file="${jetty.cdi.base}"/>
</exec>
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>it-windows</id>
<activation>
<os>
<family>Windows</family>
</os>
</activation>
<properties>
<run.command>cmd</run.command>
<run.command.xtra>/c</run.command.xtra>
<start.script>start-jetty.bat</start.script>
<stop.script>stop-jetty.bat</stop.script>
</properties>
</profile>
<profile>
<id>it-unix</id>
<activation>
<os>
<family>unix</family>
</os>
</activation>
<properties>
<run.command>sh</run.command>
<run.command.xtra>--</run.command.xtra>
<setup.script>setup-jetty.sh</setup.script>
<start.script>start-jetty.sh</start.script>
<stop.script>stop-jetty.sh</stop.script>
</properties>
</profile>
</profiles>
</project>

View File

@ -1,41 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.tests;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.net.URI;
import org.eclipse.jetty.toolchain.test.SimpleRequest;
import org.junit.Test;
/**
* Basic tests for a simple @WebServlet with no CDI
*/
public class HelloIT
{
@Test
public void testBasic() throws Exception
{
URI serverURI = new URI("http://localhost:58080/cdi-webapp/");
SimpleRequest req = new SimpleRequest(serverURI);
assertThat(req.getString("hello"),is("Hello World" + System.lineSeparator()));
}
}

View File

@ -1,47 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.tests;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.net.URI;
import org.eclipse.jetty.toolchain.test.SimpleRequest;
import org.junit.Test;
public class ServerInfoIT
{
@Test
public void testGET() throws Exception {
URI serverURI = new URI("http://localhost:58080/cdi-webapp/");
SimpleRequest req = new SimpleRequest(serverURI);
// Typical response:
// context = ServletContext@o.e.j.w.WebAppContext@37cb63fd{/cdi-webapp,
// file:///tmp/jetty-0.0.0.0-58080-cdi-webapp.war-_cdi-webapp-any-417759194514596377.dir/webapp/,AVAILABLE}
// {/cdi-webapp.war}\ncontext.contextPath = /cdi-webapp\ncontext.effective-version = 3.1\n
assertThat(req.getString("serverinfo"),
allOf(
containsString("context = ServletContext@"),
containsString("context.contextPath = /cdi-webapp"),
containsString("context.effective-version = 3.1")
));
}
}

View File

@ -1,102 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.tests.ws;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.net.URI;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import javax.websocket.ClientEndpoint;
import javax.websocket.CloseReason;
import javax.websocket.ContainerProvider;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
import org.eclipse.jetty.toolchain.test.EventQueue;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.junit.Test;
public class SessionInfoIT
{
@ClientEndpoint
public static class ClientSessionInfoSocket
{
private static final Logger LOG = Log.getLogger(SessionInfoIT.ClientSessionInfoSocket.class);
public CountDownLatch openLatch = new CountDownLatch(1);
public CountDownLatch closeLatch = new CountDownLatch(1);
public Session session;
public EventQueue<String> messages = new EventQueue<>();
public CloseReason closeReason;
@OnOpen
public void onOpen(Session session)
{
LOG.info("onOpen(): {}", session);
this.session = session;
this.openLatch.countDown();
}
@OnClose
public void onClose(CloseReason close)
{
LOG.info("onClose(): {}", close);
this.session = null;
this.closeReason = close;
this.closeLatch.countDown();
}
@OnMessage
public void onMessage(String message)
{
LOG.info("onMessage(): {}", message);
this.messages.offer(message);
}
}
@Test
public void testSessionInfo() throws Exception
{
URI serverURI = new URI("ws://localhost:58080/cdi-webapp/");
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
ClientSessionInfoSocket socket = new ClientSessionInfoSocket();
container.connectToServer(socket,serverURI.resolve("sessioninfo"));
assertThat("Await open", socket.openLatch.await(1,TimeUnit.SECONDS), is(true));
socket.session.getBasicRemote().sendText("info");
socket.messages.awaitEventCount(1,2,TimeUnit.SECONDS);
String msg = socket.messages.poll();
assertThat("Message", msg, containsString("HttpSession = HttpSession"));
socket.session.getBasicRemote().sendText("close");
assertThat("Await close", socket.closeLatch.await(1,TimeUnit.SECONDS),is(true));
}
}

View File

@ -1,10 +0,0 @@
org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
# org.jboss.LEVEL=DEBUG
org.eclipse.jetty.LEVEL=INFO
# org.eclipse.jetty.util.DecoratedObjectFactory.LEVEL=DEBUG
# org.eclipse.jetty.LEVEL=DEBUG
# org.eclipse.jetty.websocket.LEVEL=DEBUG
# org.eclipse.jetty.websocket.client.LEVEL=DEBUG

View File

@ -1,19 +0,0 @@
#!/usr/bin/env bash
JAVA_HOME=$1
JETTY_HOME=$2
JETTY_BASE=$3
echo \${java.home} : $JAVA_HOME
echo \${jetty.home} : $JETTY_HOME
echo \${jetty.base} : $JETTY_BASE
cd "$JETTY_BASE"
"$JAVA_HOME/bin/java" -jar "$JETTY_HOME/start.jar" \
--approve-all-licenses \
--add-to-start=deploy,http,annotations,websocket,cdi,logging
"$JAVA_HOME/bin/java" -jar "$JETTY_HOME/start.jar" \
--version

View File

@ -1,17 +0,0 @@
#!/usr/bin/env bash
JAVA_HOME=$1
JETTY_HOME=$2
JETTY_BASE=$3
echo \${java.home} : $JAVA_HOME
echo \${jetty.home} : $JETTY_HOME
echo \${jetty.base} : $JETTY_BASE
cd "$JETTY_BASE"
"$JAVA_HOME/bin/java" -jar "$JETTY_HOME/start.jar" \
jetty.http.port=58080 \
STOP.PORT=58181 STOP.KEY=it

View File

@ -1,11 +0,0 @@
#!/usr/bin/env bash
JAVA_HOME=$1
JETTY_HOME=$2
JETTY_BASE=$3
cd "$JETTY_BASE"
"$JAVA_HOME/bin/java" -jar "$JETTY_HOME/start.jar" \
--stop STOP.PORT=58181 STOP.KEY=it

View File

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>jetty-cdi-parent</artifactId>
<version>10.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>test-cdi-webapp</artifactId>
<packaging>war</packaging>
<name>Jetty :: CDI :: Test :: WebApp</name>
<url>http://www.eclipse.org/jetty</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<bundle-symbolic-name>${project.groupId}.cdi.webapp.noweld</bundle-symbolic-name>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>${weld.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>cdi-webapp</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<!-- DO NOT DEPLOY (or Release) -->
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>with-weld</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/assembly/with-weld.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${project.version}</version>
<configuration>
</configuration>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>cdi-full-servlet</artifactId>
<version>${project.version}</version>
<type>pom</type>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>

View File

@ -1,31 +0,0 @@
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>with-weld</id>
<formats>
<format>war</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}/src/main/webapp</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/WEB-INF/classes</outputDirectory>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>/WEB-INF/lib</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>false</unpack>
<scope>test</scope>
<includes>
<include>*:cdi-api</include>
<include>*:weld-servlet</include>
</includes>
</dependencySet>
</dependencySets>
</assembly>

View File

@ -1,42 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.tests;
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;
/**
* The most basic servlet here, no CDI use.
*/
@SuppressWarnings("serial")
@WebServlet("/hello")
public class HelloServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
resp.setContentType("text/plain");
resp.getWriter().println("Hello World");
}
}

View File

@ -1,54 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.tests;
import java.io.IOException;
import java.io.PrintWriter;
import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
@WebServlet("/serverinfo")
public class ServerInfoServlet extends HttpServlet
{
@Inject
private ServletContext context;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
resp.setContentType("text/plain");
PrintWriter out = resp.getWriter();
if (context == null)
{
out.println("context = null");
return;
}
out.printf("context = %s%n",context);
out.printf("context.contextPath = %s%n",context.getContextPath());
out.printf("context.effective-version = %d.%d%n",context.getEffectiveMajorVersion(),context.getEffectiveMinorVersion());
}
}

View File

@ -1,47 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.tests.logging;
import java.util.logging.Level;
import java.util.logging.Logger;
public class JULog
{
private final Logger log;
public JULog(Class<?> clazz)
{
this.log = Logger.getLogger(clazz.getName());
}
public void info(String msg)
{
log.log(Level.INFO, msg);
}
public void info(String msg, Object ... args)
{
log.log(Level.INFO, msg, args);
}
public void warn(Throwable t)
{
log.log(Level.WARNING, "", t);
}
}

View File

@ -1,31 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.tests.logging;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
public class JULogFactory
{
@Produces
public JULog createJULog(InjectionPoint injectionPoint)
{
return new JULog(injectionPoint.getMember().getDeclaringClass());
}
}

View File

@ -1,98 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2017 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.tests.ws;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.eclipse.jetty.tests.logging.JULog;
@ServerEndpoint(value = "/sessioninfo")
public class SessionInfoSocket
{
@Inject
private JULog LOG;
@Inject
private HttpSession httpSession;
private Session wsSession;
@OnOpen
public void onOpen(Session session)
{
LOG.info("onOpen({0})",asClassId(session));
this.wsSession = session;
}
@OnMessage
public void onMessage(String message)
{
LOG.info("onMessage({0})",quoted(message));
try
{
RemoteEndpoint.Basic remote = wsSession.getBasicRemote();
LOG.info("Remote.Basic: {0}", remote);
if ("info".equalsIgnoreCase(message))
{
LOG.info("returning 'info' details");
remote.sendText("HttpSession = " + httpSession);
}
else if ("close".equalsIgnoreCase(message))
{
LOG.info("closing session");
wsSession.close();
}
else
{
LOG.info("echoing message as-is");
remote.sendText(message);
}
}
catch (Throwable t)
{
LOG.warn(t);
}
}
private String asClassId(Object obj)
{
if (obj == null)
{
return "<null>";
}
return String.format("%s@%X",obj.getClass().getName(),obj.hashCode());
}
private String quoted(String str)
{
if (str == null)
{
return "<null>";
}
return '"' + str + '"';
}
}

View File

@ -1,18 +0,0 @@
<?xml version="1.0"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>CDI Integration Test WebApp</display-name>
<listener>
<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
<resource-env-ref>
<description>Object factory for the CDI Bean Manager</description>
<resource-env-ref-name>BeanManager</resource-env-ref-name>
<resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
</resource-env-ref>
</web-app>

View File

@ -458,7 +458,7 @@
</dependency>
<dependency>
<groupId>org.eclipse.jetty.cdi</groupId>
<artifactId>cdi-servlet</artifactId>
<artifactId>cdi-2</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>

View File

@ -106,6 +106,7 @@ public class RequestTest
_server.setHandler(_handler);
ErrorHandler errors = new ErrorHandler();
errors.setServer(_server);
errors.setShowStacks(true);
_server.addBean(errors);
_server.start();
@ -1399,6 +1400,42 @@ public class RequestTest
assertEquals("14316.133020.1.1.utr=gna.de|ucn=(real)|utd=reral|utct=/games/hen-one,gnt-50-ba-keys:key,2072262.html", cookies.get(0).getValue());
}
@Test
public void testBadCookies() throws Exception
{
final ArrayList<Cookie> cookies = new ArrayList<>();
_handler._checker = new RequestTester()
{
@Override
public boolean check(HttpServletRequest request,HttpServletResponse response) throws IOException
{
javax.servlet.http.Cookie[] ca = request.getCookies();
if (ca!=null)
cookies.addAll(Arrays.asList(ca));
response.getOutputStream().println("Hello World");
return true;
}
};
String response;
cookies.clear();
response=_connector.getResponse(
"GET / HTTP/1.1\n"+
"Host: whatever\n"+
"Cookie: Path=value\n" +
"Cookie: name=value\n" +
"Connection: close\n"+
"\n"
);
assertTrue(response.startsWith("HTTP/1.1 200 OK"));
assertEquals(1,cookies.size());
assertEquals("name", cookies.get(0).getName());
assertEquals("value", cookies.get(0).getValue());
}
@Ignore("No longer relevant")
@Test

View File

@ -815,7 +815,7 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL
super.setServer(server);
if (server != null)
{
if (_systemClasses.isEmpty())
if (__dftSystemClasses.equals(_systemClasses))
{
Object systemClasses = server.getAttribute(SERVER_SYS_CLASSES);
if (systemClasses instanceof String[])
@ -824,13 +824,13 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL
_systemClasses.add(((ClasspathPattern)systemClasses).getPatterns());
}
if (_serverClasses.isEmpty())
if (__dftServerClasses.equals(_serverClasses))
{
Object serverClasses = server.getAttribute(SERVER_SRV_CLASSES);
if (serverClasses instanceof String[])
serverClasses = new ClasspathPattern((String[])serverClasses);
if (serverClasses instanceof ClasspathPattern)
_systemClasses.add(((ClasspathPattern)serverClasses).getPatterns());
_serverClasses.add(((ClasspathPattern)serverClasses).getPatterns());
}
}
}

View File

@ -141,9 +141,10 @@ if proceedyn "Are you sure you want to release using above? (y/N)" n; then
# This is equivalent to 'mvn release:prepare'
if proceedyn "Update project.versions for $VER_RELEASE? (Y/n)" y; then
mvn org.codehaus.mojo:versions-maven-plugin:2.1:set \
mvn org.codehaus.mojo:versions-maven-plugin:2.5:set \
-DoldVersion="$VER_CURRENT" \
-DnewVersion="$VER_RELEASE"
-DnewVersion="$VER_RELEASE" \
-DprocessAllModules=true
fi
if proceedyn "Commit $VER_RELEASE updates? (Y/n)" y; then
git commit -a -m "Updating to version $VER_RELEASE"

View File

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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">
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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">
<display-name>Transparent Proxy WebApp</display-name>
@ -20,12 +20,10 @@
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>JavadocTransparentProxy</servlet-name>
<url-pattern>/current/*</url-pattern>
</servlet-mapping>
</web-app>
</web-app>