Merge remote-tracking branch 'origin/jetty-9.4.x'
This commit is contained in:
commit
050d593056
|
@ -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->
|
||||
{
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -0,0 +1,5 @@
|
|||
[description]
|
||||
Jetty setup to support Weld/CDI2 with WELD inside the webapp
|
||||
|
||||
[depend]
|
||||
cdi2
|
|
@ -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
|
|
@ -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>
|
|
@ -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();
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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>
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -1,2 +0,0 @@
|
|||
handlers = org.eclipse.jetty.cdi.core.logging.LeanConsoleHandler
|
||||
.level=INFO
|
|
@ -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>
|
|
@ -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>
|
|
@ -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
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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("]");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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()));
|
||||
}
|
||||
}
|
|
@ -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]"));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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>
|
|
@ -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
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
handlers = org.eclipse.jetty.util.log.JettyLogHandler
|
||||
.level=FINE
|
|
@ -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>
|
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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.");
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
{
|
||||
|
||||
}
|
|
@ -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>
|
|
@ -1 +0,0 @@
|
|||
org.eclipse.jetty.cdi.websocket.WebSocketScopeExtension
|
|
@ -1 +0,0 @@
|
|||
org.eclipse.jetty.cdi.websocket.WebSocketCdiInitializer
|
|
@ -1 +0,0 @@
|
|||
org.eclipse.jetty.cdi.websocket.WebSocketCdiConfiguration
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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>
|
|
@ -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
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
handlers = org.eclipse.jetty.util.log.JettyLogHandler
|
||||
.level=FINE
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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()));
|
||||
}
|
||||
}
|
|
@ -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")
|
||||
));
|
||||
}
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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>
|
|
@ -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>
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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 + '"';
|
||||
}
|
||||
}
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
Loading…
Reference in New Issue