You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by st...@apache.org on 2015/05/05 07:50:21 UTC
[01/16] tomee git commit: TOMEE-1572 upgrade to latest OWB snapshot
Repository: tomee
Updated Branches:
refs/heads/fb_tomee2_owb16 [created] 58b9bc093
TOMEE-1572 upgrade to latest OWB snapshot
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/d376ef5a
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/d376ef5a
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/d376ef5a
Branch: refs/heads/fb_tomee2_owb16
Commit: d376ef5a37b489edfb7579895b3b2b031c85b8d2
Parents: 1f9fdc9
Author: Mark Struberg <st...@apache.org>
Authored: Sat May 2 11:38:02 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Sat May 2 11:43:44 2015 +0200
----------------------------------------------------------------------
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/d376ef5a/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 967955f..e2d717f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -95,7 +95,7 @@
<tomee.version>2.0.0-SNAPSHOT</tomee.version>
<openjpa.version>2.4.0</openjpa.version>
- <org.apache.openwebbeans.version>1.5.0</org.apache.openwebbeans.version>
+ <org.apache.openwebbeans.version>1.5.1-SNAPSHOT</org.apache.openwebbeans.version>
<jcs.version>2.0-SNAPSHOT</jcs.version>
<!-- Maven module versions -->
[07/16] tomee git commit: TOMEE-1569 forcing container loader for
LoggerCreator
Posted by st...@apache.org.
TOMEE-1569 forcing container loader for LoggerCreator
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/0421a028
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/0421a028
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/0421a028
Branch: refs/heads/fb_tomee2_owb16
Commit: 0421a028293a09037b5d5074bda39a3f366bdaa3
Parents: b7eb5b0
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Thu Apr 30 09:53:40 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Mon May 4 19:00:19 2015 +0200
----------------------------------------------------------------------
.../openejb/core/ParentClassLoaderFinder.java | 3 +-
.../org/apache/openejb/log/LoggerCreator.java | 29 ++++++++++++--------
2 files changed, 20 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/0421a028/container/openejb-core/src/main/java/org/apache/openejb/core/ParentClassLoaderFinder.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/ParentClassLoaderFinder.java b/container/openejb-core/src/main/java/org/apache/openejb/core/ParentClassLoaderFinder.java
index dca0d39..c6497a1 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/ParentClassLoaderFinder.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/ParentClassLoaderFinder.java
@@ -27,7 +27,8 @@ public interface ParentClassLoaderFinder {
class Helper {
public static ClassLoader get() {
- final ParentClassLoaderFinder parentFinder = SystemInstance.get().getComponent(ParentClassLoaderFinder.class);
+ final ParentClassLoaderFinder parentFinder = SystemInstance.isInitialized() ?
+ SystemInstance.get().getComponent(ParentClassLoaderFinder.class) : null;
if (parentFinder != null) {
return parentFinder.getParentClassLoader(FALLBACK);
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/0421a028/container/openejb-core/src/main/java/org/apache/openejb/log/LoggerCreator.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/log/LoggerCreator.java b/container/openejb-core/src/main/java/org/apache/openejb/log/LoggerCreator.java
index 47d2935..c1fb803 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/log/LoggerCreator.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/log/LoggerCreator.java
@@ -52,20 +52,27 @@ public class LoggerCreator implements Callable<Logger> {
if (logger == null) {
synchronized (this) { // no need of lock for this part
if (logger == null) {
+ final Thread thread = Thread.currentThread();
+ final ClassLoader originalLoader = thread.getContextClassLoader();
+ thread.setContextClassLoader(ParentClassLoaderFinder.Helper.get());
try {
- logger = Logger.getLogger(name);
- } catch (final Exception e) {
- logger = Logger.getLogger(name); // try again
- }
+ try {
+ logger = Logger.getLogger(name);
+ } catch (final Exception e) {
+ logger = Logger.getLogger(name); // try again
+ }
- // if level set through properties force it
- final Properties p = SystemInstance.get().getProperties();
- final String levelName = p.getProperty("logging.level." + logger.getName());
- if (levelName != null) {
- final Level level = Level.parse(levelName);
- for (final Handler handler : logger.getHandlers()) {
- handler.setLevel(level);
+ // if level set through properties force it
+ final Properties p = SystemInstance.get().getProperties();
+ final String levelName = p.getProperty("logging.level." + logger.getName());
+ if (levelName != null) {
+ final Level level = Level.parse(levelName);
+ for (final Handler handler : logger.getHandlers()) {
+ handler.setLevel(level);
+ }
}
+ } finally {
+ thread.setContextClassLoader(originalLoader);
}
}
}
[10/16] tomee git commit: TOMEE-1571 destroying http session of
openejb-http layer when undeploying applications with openejb embedded
arquillian adapter
Posted by st...@apache.org.
TOMEE-1571 destroying http session of openejb-http layer when undeploying applications with openejb embedded arquillian adapter
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/95ea7d5b
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/95ea7d5b
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/95ea7d5b
Branch: refs/heads/fb_tomee2_owb16
Commit: 95ea7d5be3a8da495a71003ba9bd61bf5bcad27b
Parents: 065fc36
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Sun May 3 22:20:13 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Mon May 4 19:32:04 2015 +0200
----------------------------------------------------------------------
.../openejb/OpenEJBDeployableContainer.java | 30 ++++-
.../http/WebArchiveResourceProvider.java | 16 +++
.../arquillian/openejb/SessionDestroyTest.java | 113 ++++++++++++++++
.../openejb/server/httpd/HttpRequestImpl.java | 126 +++++-------------
.../openejb/server/httpd/HttpResponseImpl.java | 3 +-
.../openejb/server/httpd/HttpSessionImpl.java | 26 ++--
.../server/httpd/OpenEJBHttpRegistry.java | 2 +
.../openejb/server/httpd/OpenEJBHttpServer.java | 9 +-
.../server/httpd/session/SessionManager.java | 132 +++++++++++++++++++
.../httpd/HttpResponseImplSessionTest.java | 16 +--
10 files changed, 346 insertions(+), 127 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/95ea7d5b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
----------------------------------------------------------------------
diff --git a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
index 90d86b1..44915b8 100644
--- a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
+++ b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
@@ -37,8 +37,10 @@ import org.apache.openejb.config.DeploymentFilterable;
import org.apache.openejb.config.WebModule;
import org.apache.openejb.core.LocalInitialContext;
import org.apache.openejb.core.LocalInitialContextFactory;
+import org.apache.openejb.core.WebContext;
import org.apache.openejb.loader.IO;
import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.server.httpd.session.SessionManager;
import org.apache.openejb.web.LightweightWebAppBuilder;
import org.apache.webbeans.web.lifecycle.test.MockHttpSession;
import org.apache.webbeans.web.lifecycle.test.MockServletContext;
@@ -58,11 +60,6 @@ import org.jboss.arquillian.test.spi.annotation.SuiteScoped;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.descriptor.api.Descriptor;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpSession;
import java.io.ByteArrayInputStream;
import java.io.Closeable;
import java.io.IOException;
@@ -75,6 +72,11 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.logging.Level;
import java.util.logging.Logger;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpSession;
import static org.apache.openejb.cdi.ScopeHelper.startContexts;
import static org.apache.openejb.cdi.ScopeHelper.stopContexts;
@@ -295,7 +297,8 @@ public class OpenEJBDeployableContainer implements DeployableContainer<OpenEJBCo
final AppInfo appInfo = configurationFactory.configureApplication(module);
final WebAppBuilder webAppBuilder = SystemInstance.get().getComponent(WebAppBuilder.class);
- if (webAppBuilder != null && LightweightWebAppBuilder.class.isInstance(webAppBuilder)) {
+ final boolean isEmbeddedWebAppBuilder = webAppBuilder != null && LightweightWebAppBuilder.class.isInstance(webAppBuilder);
+ if (isEmbeddedWebAppBuilder) {
// for now we keep the same classloader, open to discussion if we should recreate it, not sure it does worth it
final LightweightWebAppBuilder lightweightWebAppBuilder = LightweightWebAppBuilder.class.cast(webAppBuilder);
for (final WebModule w : module.getWebModules()) {
@@ -310,6 +313,21 @@ public class OpenEJBDeployableContainer implements DeployableContainer<OpenEJBCo
}
}
final AppContext appCtx = assembler.createApplication(appInfo, module.getClassLoader());
+ if (isEmbeddedWebAppBuilder && PROPERTIES.containsKey(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE) && !appCtx.getWebContexts().isEmpty()) {
+ cls.add(new Closeable() {
+ @Override
+ public void close() throws IOException {
+ try {
+ final SessionManager sessionManager = SystemInstance.get().getComponent(SessionManager.class);
+ for (final WebContext web : appCtx.getWebContexts()) {
+ sessionManager.destroy(web);
+ }
+ } catch (final Throwable e) {
+ // no-op
+ }
+ }
+ });
+ }
final ServletContext appServletContext = new MockServletContext();
final HttpSession appSession = new MockHttpSession();
http://git-wip-us.apache.org/repos/asf/tomee/blob/95ea7d5b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/http/WebArchiveResourceProvider.java
----------------------------------------------------------------------
diff --git a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/http/WebArchiveResourceProvider.java b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/http/WebArchiveResourceProvider.java
index 2f1f731..5fd0b04 100644
--- a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/http/WebArchiveResourceProvider.java
+++ b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/http/WebArchiveResourceProvider.java
@@ -1,3 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package org.apache.openejb.arquillian.openejb.http;
import org.apache.openejb.arquillian.openejb.SWClassLoader;
http://git-wip-us.apache.org/repos/asf/tomee/blob/95ea7d5b/arquillian/arquillian-openejb-embedded-5/src/test/java/org/apache/openejb/arquillian/openejb/SessionDestroyTest.java
----------------------------------------------------------------------
diff --git a/arquillian/arquillian-openejb-embedded-5/src/test/java/org/apache/openejb/arquillian/openejb/SessionDestroyTest.java b/arquillian/arquillian-openejb-embedded-5/src/test/java/org/apache/openejb/arquillian/openejb/SessionDestroyTest.java
new file mode 100644
index 0000000..fbae01e
--- /dev/null
+++ b/arquillian/arquillian-openejb-embedded-5/src/test/java/org/apache/openejb/arquillian/openejb/SessionDestroyTest.java
@@ -0,0 +1,113 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.arquillian.openejb;
+
+import org.apache.openejb.loader.IO;
+import org.jboss.arquillian.container.test.api.Deployer;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.container.test.api.OperateOnDeployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.junit.InSequence;
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.IOException;
+import java.net.URL;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebListener;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+@RunWith(Arquillian.class)
+public class SessionDestroyTest {
+ @Deployment(name = "app", managed = false, testable = false)
+ public static Archive<?> app() {
+ return ShrinkWrap.create(WebArchive.class).addClasses(SessionTestManager.class, SessionListener.class);
+ }
+
+ @ArquillianResource
+ private Deployer deployer;
+
+ private static String id;
+
+ @Test
+ @InSequence(1)
+ public void deploy() {
+ reset();
+ deployer.deploy("app");
+ }
+
+ @Test
+ @InSequence(2)
+ @OperateOnDeployment("app")
+ public void doTest(@ArquillianResource final URL url) throws IOException {
+ id = IO.slurp(new URL(url.toExternalForm() + "create"));
+ assertNotNull(SessionListener.created);
+ assertEquals(id, SessionListener.created);
+ }
+
+ @Test
+ @InSequence(3)
+ public void undeployAndAsserts() {
+ deployer.undeploy("app");
+ assertNotNull(SessionListener.destroyed);
+ assertEquals(id, SessionListener.destroyed);
+ reset();
+ }
+
+ private void reset() {
+ SessionListener.destroyed = null;
+ SessionListener.created = null;
+ id = null;
+ }
+
+ @WebServlet("/create")
+ public static class SessionTestManager extends HttpServlet {
+ @Override
+ protected void service(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
+ req.getSession().setAttribute("test", "ok");
+ resp.getWriter().write(req.getSession().getId());
+ }
+ }
+
+ @WebListener
+ public static class SessionListener implements HttpSessionListener {
+ private static String created;
+ private static String destroyed;
+
+ @Override
+ public void sessionCreated(final HttpSessionEvent httpSessionEvent) {
+ created = httpSessionEvent.getSession().getId();
+ }
+
+ @Override
+ public void sessionDestroyed(final HttpSessionEvent httpSessionEvent) {
+ destroyed = httpSessionEvent.getSession().getId();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/tomee/blob/95ea7d5b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
index 6006178..eaf420f 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
@@ -19,30 +19,13 @@ package org.apache.openejb.server.httpd;
import org.apache.openejb.assembler.classic.AppInfo;
import org.apache.openejb.assembler.classic.Assembler;
import org.apache.openejb.assembler.classic.WebAppInfo;
+import org.apache.openejb.core.WebContext;
import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.server.httpd.session.SessionManager;
import org.apache.openejb.spi.SecurityService;
import org.apache.openejb.util.ArrayEnumeration;
-import org.apache.openejb.util.DaemonThreadFactory;
-import org.apache.openejb.util.Duration;
import org.apache.openejb.util.Logger;
-import javax.security.auth.login.LoginException;
-import javax.servlet.AsyncContext;
-import javax.servlet.DispatcherType;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletInputStream;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletRequestEvent;
-import javax.servlet.ServletRequestListener;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSessionEvent;
-import javax.servlet.http.HttpUpgradeHandler;
-import javax.servlet.http.Part;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataInput;
@@ -67,11 +50,23 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.StringTokenizer;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
+import javax.security.auth.login.LoginException;
+import javax.servlet.AsyncContext;
+import javax.servlet.DispatcherType;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpUpgradeHandler;
+import javax.servlet.http.Part;
import static java.util.Collections.singletonList;
@@ -83,11 +78,6 @@ public class HttpRequestImpl implements HttpRequest {
private static final String FORM_URL_ENCODED = "application/x-www-form-urlencoded";
private static final String TRANSFER_ENCODING = "Transfer-Encoding";
private static final String CHUNKED = "chunked";
- protected static final String EJBSESSIONID = "EJBSESSIONID";
- protected static final String JSESSIONID = "JSESSIONID";
-
- // note: no eviction so invalidate has to be called properly
- private static final ConcurrentMap<String, RequestSession> SESSIONS = new ConcurrentHashMap<>();
public static final Class<?>[] SERVLET_CONTEXT_INTERFACES = new Class<?>[]{ServletContext.class};
public static final InvocationHandler SERVLET_CONTEXT_HANDLER = new InvocationHandler() {
@@ -97,46 +87,9 @@ public class HttpRequestImpl implements HttpRequest {
}
};
- private static volatile ScheduledExecutorService es;
-
- public static void destroyEviction() {
- if (es == null) {
- return;
- }
- es.shutdownNow();
- for (RequestSession requestSession : SESSIONS.values()) {
- requestSession.session.invalidate();
- }
- SESSIONS.clear();
- }
-
- public static void initEviction() {
- if (!"true".equalsIgnoreCase(SystemInstance.get().getProperty("openejb.http.eviction", "true"))) {
- return;
- }
- final Duration duration = new Duration(SystemInstance.get().getProperty("openejb.http.eviction.duration", "1 minute"));
- es = Executors.newScheduledThreadPool(1, new DaemonThreadFactory(HttpRequestImpl.class));
- es.scheduleWithFixedDelay(new Runnable() {
- @Override
- public void run() {
- for (final RequestSession data : new ArrayList<>(SESSIONS.values())) {
- final HttpSession session = data.session;
- if (session.getMaxInactiveInterval() > 0
- && session.getLastAccessedTime() + TimeUnit.SECONDS.toMillis(session.getMaxInactiveInterval()) < System.currentTimeMillis()) {
- SESSIONS.remove(session.getId());
- session.invalidate();
-
- if (data.request != null && data.request.begin != null) {
- data.request.begin.sessionDestroyed(new HttpSessionEvent(session));
- }
- }
- }
- }
- }, duration.getTime(), duration.getTime(), duration.getUnit());
- }
-
private EndWebBeansListener end;
private BeginWebBeansListener begin;
+ private WebContext application;
/**
* 5.1.1 Method
@@ -441,11 +394,13 @@ public class HttpRequestImpl implements HttpRequest {
for (String c : cookies) {
final String current = c.trim();
if (current.startsWith("EJBSESSIONID=")) {
- final RequestSession requestSession = SESSIONS.get(current.substring("EJBSESSIONID=".length()));
- session = requestSession == null ? null : requestSession.session;
+ final SessionManager.SessionWrapper sessionWrapper =
+ SystemInstance.get().getComponent(SessionManager.class).findSession(current.substring("EJBSESSIONID=".length()));
+ session = sessionWrapper == null ? null : sessionWrapper.session;
} else if (current.startsWith("JSESSIONID=")) {
- final RequestSession requestSession = SESSIONS.get(current.substring("JSESSIONID=".length()));
- session = requestSession == null ? null : requestSession.session;
+ final SessionManager.SessionWrapper sessionWrapper =
+ SystemInstance.get().getComponent(SessionManager.class).findSession(current.substring("JSESSIONID=".length()));
+ session = sessionWrapper == null ? null : sessionWrapper.session;
}
}
}
@@ -932,7 +887,7 @@ public class HttpRequestImpl implements HttpRequest {
}
}
- final HttpSessionImpl impl = new HttpSessionImpl(SESSIONS, contextPath, timeout);
+ final HttpSessionImpl impl = new HttpSessionImpl(contextPath, timeout);
session = impl;
if (begin != null) {
begin.sessionCreated(new HttpSessionEvent(session));
@@ -940,17 +895,10 @@ public class HttpRequestImpl implements HttpRequest {
}
impl.callListeners(); // can call req.getSession() so do it after affectation + do it after cdi init
- final RequestSession previous = SESSIONS.putIfAbsent(session.getId(), new RequestSession(this, session));
+ final SessionManager sessionManager = SystemInstance.get().getComponent(SessionManager.class);
+ final SessionManager.SessionWrapper previous = sessionManager.newSession(begin, end, session, application);
if (previous != null) {
session = previous.session;
- } else {
- if (es == null) {
- synchronized (HttpRequestImpl.class) {
- if (es == null) {
- initEviction();
- }
- }
- }
}
}
return session;
@@ -1222,6 +1170,10 @@ public class HttpRequestImpl implements HttpRequest {
}
}
+ public void setApplication(final WebContext app) {
+ this.application = app;
+ }
+
public void setBeginListener(final BeginWebBeansListener begin) {
if (this.begin == null) {
this.begin = begin;
@@ -1270,7 +1222,6 @@ public class HttpRequestImpl implements HttpRequest {
@Override
public void invalidate() {
- SESSIONS.remove(session.getId());
try {
super.invalidate();
} finally {
@@ -1317,15 +1268,4 @@ public class HttpRequestImpl implements HttpRequest {
// not yet supported: TODO: fake response write in ByteArrayOutputStream and then call HttpListenerRegistry and write it back
}
}
-
- private static class RequestSession extends HttpSessionEvent {
- private final HttpRequestImpl request;
- private final HttpSession session;
-
- public RequestSession(final HttpRequestImpl request, final HttpSession session) {
- super(session);
- this.request = request;
- this.session = session;
- }
- }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/95ea7d5b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java
index 9692e28..180e3e2 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpResponseImpl.java
@@ -17,6 +17,7 @@
package org.apache.openejb.server.httpd;
import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.server.httpd.session.SessionManager;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
import org.apache.openejb.util.OpenEjbVersion;
@@ -483,7 +484,7 @@ public class HttpResponseImpl implements HttpResponse {
return;
}
- headers.put(HttpRequest.HEADER_SET_COOKIE, HttpRequestImpl.EJBSESSIONID + '=' + session.getId() + "; Path=/");
+ headers.put(HttpRequest.HEADER_SET_COOKIE, SessionManager.EJBSESSIONID + '=' + session.getId() + "; Path=/");
}
/**
http://git-wip-us.apache.org/repos/asf/tomee/blob/95ea7d5b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java
index cd0a394..657a394 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java
@@ -18,11 +18,8 @@ package org.apache.openejb.server.httpd;
import org.apache.openejb.client.ArrayEnumeration;
import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.server.httpd.session.SessionManager;
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpSessionContext;
-import javax.servlet.http.HttpSessionEvent;
-import javax.servlet.http.HttpSessionListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -31,19 +28,20 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
-import java.util.concurrent.ConcurrentMap;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpSessionContext;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
public class HttpSessionImpl implements HttpSession {
private Collection<HttpSessionListener> listeners;
private String sessionId = UUID.randomUUID().toString();
private Map<String, Object> attributes = new HashMap<String, Object>();
- private final ConcurrentMap<String, ? extends HttpSessionEvent> mapToClean;
private final long created = System.currentTimeMillis();
private volatile long timeout;
private volatile long lastAccessed = created;
- public HttpSessionImpl(final ConcurrentMap<String, ? extends HttpSessionEvent> sessions, final String contextPath, final long timeout) {
- this.mapToClean = sessions;
+ public HttpSessionImpl(final String contextPath, final long timeout) {
this.timeout = timeout;
if (contextPath == null) {
return;
@@ -62,7 +60,7 @@ public class HttpSessionImpl implements HttpSession {
}
public HttpSessionImpl() {
- this(null, null, 30000);
+ this(null, 30000);
}
public void newSessionId() {
@@ -105,8 +103,9 @@ public class HttpSessionImpl implements HttpSession {
}
attributes.clear();
- if (mapToClean != null) {
- mapToClean.remove(sessionId);
+ final SessionManager sessionManager = SystemInstance.get().getComponent(SessionManager.class);
+ if (sessionManager != null) {
+ sessionManager.removeSession(sessionId);
}
}
@@ -186,16 +185,17 @@ public class HttpSessionImpl implements HttpSession {
@Override
public HttpSessionContext getSessionContext() {
touch();
+ final SessionManager component = SystemInstance.get().getComponent(SessionManager.class);
return new HttpSessionContext() {
@Override
public javax.servlet.http.HttpSession getSession(final String sessionId) {
- final HttpSessionEvent event = mapToClean.get(sessionId);
+ final HttpSessionEvent event = component.findSession(sessionId);
return event == null ? null : event.getSession();
}
@Override
public Enumeration<String> getIds() {
- return Collections.enumeration(mapToClean.keySet());
+ return Collections.enumeration(component.findSessionIds());
}
};
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/95ea7d5b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpRegistry.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpRegistry.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpRegistry.java
index 3a61442..6dd8d9e 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpRegistry.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpRegistry.java
@@ -113,6 +113,8 @@ public class OpenEJBHttpRegistry {
final HttpRequestImpl httpRequest = HttpRequestImpl.class.cast(request);
final WebContext web = findWebContext(request.getURI() == null ? request.getContextPath() : request.getURI().getPath());
if (web != null) {
+ httpRequest.setApplication(web);
+
if (web.getClassLoader() != null) {
thread.setContextClassLoader(web.getClassLoader());
} else if (web.getAppContext().getClassLoader() != null) {
http://git-wip-us.apache.org/repos/asf/tomee/blob/95ea7d5b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java
index 33f358c..65e8c66 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java
@@ -22,6 +22,7 @@ import org.apache.openejb.loader.Options;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.server.ServiceException;
import org.apache.openejb.server.context.RequestInfos;
+import org.apache.openejb.server.httpd.session.SessionManager;
import org.apache.openejb.server.stream.CountingInputStream;
import org.apache.openejb.server.stream.CountingOutputStream;
import org.apache.openejb.util.LogCategory;
@@ -76,6 +77,9 @@ public class OpenEJBHttpServer implements HttpServer {
public OpenEJBHttpServer(final HttpListener listener) {
this.listener = new OpenEJBHttpRegistry.ClassLoaderHttpListener(listener, ParentClassLoaderFinder.Helper.get());
+ if (SystemInstance.get().getComponent(SessionManager.class) == null) {
+ SystemInstance.get().setComponent(SessionManager.class, new SessionManager());
+ }
}
public static boolean isTextXml(final Map<String, String> headers) {
@@ -170,7 +174,10 @@ public class OpenEJBHttpServer implements HttpServer {
@Override
public void stop() throws ServiceException {
OpenEJBAsyncContext.destroy();
- HttpRequestImpl.destroyEviction();
+ final SessionManager component = SystemInstance.get().getComponent(SessionManager.class);
+ if (component != null) {
+ component.destroy();
+ }
}
@Override
http://git-wip-us.apache.org/repos/asf/tomee/blob/95ea7d5b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/session/SessionManager.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/session/SessionManager.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/session/SessionManager.java
new file mode 100644
index 0000000..ad455b1
--- /dev/null
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/session/SessionManager.java
@@ -0,0 +1,132 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.server.httpd.session;
+
+import org.apache.openejb.core.WebContext;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.server.httpd.BeginWebBeansListener;
+import org.apache.openejb.server.httpd.HttpRequestImpl;
+import org.apache.openejb.server.httpd.HttpSession;
+import org.apache.openejb.util.DaemonThreadFactory;
+import org.apache.openejb.util.Duration;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import javax.servlet.http.HttpSessionEvent;
+
+public class SessionManager {
+ public static final String EJBSESSIONID = "EJBSESSIONID";
+ public static final String JSESSIONID = "JSESSIONID";
+
+ private final ConcurrentMap<String, SessionWrapper> sessions = new ConcurrentHashMap<>();
+
+ private static volatile ScheduledExecutorService es;
+
+ public void destroy(final WebContext app) {
+ final Iterator<SessionWrapper> iterator = sessions.values().iterator();
+ while (iterator.hasNext()) {
+ final SessionWrapper next = iterator.next();
+ if (next.app == app) {
+ next.session.invalidate();
+ iterator.remove();
+ }
+ }
+ }
+
+ public void destroy() {
+ if (es == null) {
+ return;
+ }
+ es.shutdownNow();
+ for (final SessionWrapper rs : sessions.values()) {
+ rs.session.invalidate();
+ }
+ sessions.clear();
+ }
+
+ public void initEviction() {
+ if (!"true".equalsIgnoreCase(SystemInstance.get().getProperty("openejb.http.eviction", "true"))) {
+ return;
+ }
+ final Duration duration = new Duration(SystemInstance.get().getProperty("openejb.http.eviction.duration", "1 minute"));
+ es = Executors.newScheduledThreadPool(1, new DaemonThreadFactory(HttpRequestImpl.class));
+ es.scheduleWithFixedDelay(new Runnable() {
+ @Override
+ public void run() {
+ for (final SessionWrapper data : new ArrayList<>(sessions.values())) {
+ final HttpSession session = data.session;
+ if (session.getMaxInactiveInterval() > 0
+ && session.getLastAccessedTime() + TimeUnit.SECONDS.toMillis(session.getMaxInactiveInterval()) < System.currentTimeMillis()) {
+ sessions.remove(session.getId());
+ session.invalidate();
+
+ if (data.listener != null) {
+ data.listener.sessionDestroyed(new HttpSessionEvent(session));
+ }
+ }
+ }
+ }
+ }, duration.getTime(), duration.getTime(), duration.getUnit());
+ }
+
+ public SessionWrapper findSession(final String id) {
+ return sessions.get(id);
+ }
+
+ public void removeSession(final String sessionId) {
+ sessions.remove(sessionId);
+ }
+
+ public Collection<String> findSessionIds() {
+ return sessions.keySet();
+ }
+
+ public int size() {
+ return sessions.size();
+ }
+
+ public SessionWrapper newSession(final BeginWebBeansListener listener, final HttpSession session, final WebContext app) {
+ final SessionWrapper existing = sessions.putIfAbsent(session.getId(), new SessionWrapper(listener, session, app));
+ if (existing == null && es == null) {
+ synchronized (this) {
+ if (es == null) {
+ initEviction();
+ }
+ }
+ }
+ return existing;
+ }
+
+ public static class SessionWrapper extends HttpSessionEvent {
+ public final BeginWebBeansListener listener;
+ public final HttpSession session;
+ public final WebContext app;
+
+ public SessionWrapper(final BeginWebBeansListener listener, final HttpSession session, final WebContext app) {
+ super(session);
+ this.listener = listener;
+ this.session = session;
+ this.app = app;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/tomee/blob/95ea7d5b/server/openejb-http/src/test/java/org/apache/openejb/server/httpd/HttpResponseImplSessionTest.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/test/java/org/apache/openejb/server/httpd/HttpResponseImplSessionTest.java b/server/openejb-http/src/test/java/org/apache/openejb/server/httpd/HttpResponseImplSessionTest.java
index 595c9be..b43d130 100644
--- a/server/openejb-http/src/test/java/org/apache/openejb/server/httpd/HttpResponseImplSessionTest.java
+++ b/server/openejb-http/src/test/java/org/apache/openejb/server/httpd/HttpResponseImplSessionTest.java
@@ -21,41 +21,31 @@ import org.apache.openejb.core.CoreContainerSystem;
import org.apache.openejb.core.ivm.naming.IvmJndiFactory;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.server.ServiceException;
+import org.apache.openejb.server.httpd.session.SessionManager;
import org.apache.openejb.spi.ContainerSystem;
import org.junit.After;
import org.junit.Before;
-import org.junit.BeforeClass;
import org.junit.Test;
-import javax.servlet.http.HttpSession;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import java.lang.reflect.Field;
import java.net.Socket;
-import java.util.Map;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicReference;
+import javax.servlet.http.HttpSession;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class HttpResponseImplSessionTest {
- private static Field sessions;
-
private OpenEJBHttpEjbServer server;
- @BeforeClass
- public static void findSessionsField() throws NoSuchFieldException {
- sessions = HttpRequestImpl.class.getDeclaredField("SESSIONS");
- sessions.setAccessible(true);
- }
-
private static int numberOfSessions() throws IllegalAccessException {
- return Map.class.cast(sessions.get(null)).size();
+ return SystemInstance.get().getComponent(SessionManager.class).size();
}
@Before
[15/16] tomee git commit: TOMEE-1572 upgrade to OWB-1.6.0-SNAPSHOT
Posted by st...@apache.org.
TOMEE-1572 upgrade to OWB-1.6.0-SNAPSHOT
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/b0f479fd
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/b0f479fd
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/b0f479fd
Branch: refs/heads/fb_tomee2_owb16
Commit: b0f479fd2463a94a861e3a2fb97b94268490d544
Parents: 94df0ba
Author: Mark Struberg <st...@apache.org>
Authored: Mon May 4 21:11:44 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Mon May 4 21:11:44 2015 +0200
----------------------------------------------------------------------
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/b0f479fd/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index e2d717f..0ab6965 100644
--- a/pom.xml
+++ b/pom.xml
@@ -95,7 +95,7 @@
<tomee.version>2.0.0-SNAPSHOT</tomee.version>
<openjpa.version>2.4.0</openjpa.version>
- <org.apache.openwebbeans.version>1.5.1-SNAPSHOT</org.apache.openwebbeans.version>
+ <org.apache.openwebbeans.version>1.6.0-SNAPSHOT</org.apache.openwebbeans.version>
<jcs.version>2.0-SNAPSHOT</jcs.version>
<!-- Maven module versions -->
[02/16] tomee git commit: TOMEE-1572 adopt OWB-1.5 changes
Posted by st...@apache.org.
TOMEE-1572 adopt OWB-1.5 changes
* improved ConversationHandling
* improved SessionHandling
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/e41c460f
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/e41c460f
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/e41c460f
Branch: refs/heads/fb_tomee2_owb16
Commit: e41c460fb6410f54f153f54272c8bce7dfea39f2
Parents: d376ef5
Author: Mark Struberg <st...@apache.org>
Authored: Sat May 2 11:44:53 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Sat May 2 11:44:53 2015 +0200
----------------------------------------------------------------------
.../openejb/cdi/CdiAppContextsService.java | 760 +------------------
.../java/org/apache/openejb/cdi/CdiPlugin.java | 14 +-
.../apache/openejb/cdi/OpenEJBLifecycle.java | 68 +-
.../openejb/cdi/ThreadSingletonServiceImpl.java | 4 -
.../cdi/UpdatableSessionContextManager.java | 66 --
.../openejb/testing/ApplicationComposers.java | 2 +-
.../openejb/cdi/CdiAppContextsServiceTest.java | 4 +-
...StatefulConversationScopedTOMEE1138Test.java | 4 +-
.../server/httpd/BeginWebBeansListener.java | 35 -
.../server/httpd/EndWebBeansListener.java | 10 -
.../server/httpd/HttpListenerRegistry.java | 8 +-
.../openejb/server/httpd/HttpRequestImpl.java | 3 +
.../server/httpd/WebBeansListenerHelper.java | 3 +
.../tomee/catalina/OpenEJBContextConfig.java | 45 --
.../tomee/catalina/TomEEContainerListener.java | 13 +-
.../tomee/catalina/TomcatWebAppBuilder.java | 8 +-
.../cdi/SessionContextBackedByHttpSession.java | 289 -------
.../cdi/SessionNormalScopeBeanHandler.java | 117 ---
18 files changed, 74 insertions(+), 1379 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
index 655af39..780728e 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
@@ -18,82 +18,26 @@
package org.apache.openejb.cdi;
-import org.apache.openejb.core.Operation;
-import org.apache.openejb.core.ThreadContext;
-import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
-import org.apache.webbeans.annotation.DestroyedLiteral;
-import org.apache.webbeans.annotation.InitializedLiteral;
-import org.apache.webbeans.config.OWBLogConst;
import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.context.AbstractContextsService;
-import org.apache.webbeans.context.ApplicationContext;
-import org.apache.webbeans.context.ConversationContext;
-import org.apache.webbeans.context.DependentContext;
+import org.apache.webbeans.context.RequestContext;
import org.apache.webbeans.context.SessionContext;
-import org.apache.webbeans.context.SingletonContext;
-import org.apache.webbeans.conversation.ConversationImpl;
-import org.apache.webbeans.conversation.ConversationManager;
-import org.apache.webbeans.el.ELContextStore;
-import org.apache.webbeans.event.EventMetadataImpl;
import org.apache.webbeans.spi.ContextsService;
-import org.apache.webbeans.spi.ConversationService;
-import org.apache.webbeans.web.context.ServletRequestContext;
-import org.apache.webbeans.web.intercept.RequestScopedBeanInterceptorHandler;
+import org.apache.webbeans.web.context.WebContextsService;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Map;
import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.context.BusyConversationException;
-import javax.enterprise.context.ContextException;
-import javax.enterprise.context.Conversation;
-import javax.enterprise.context.ConversationScoped;
-import javax.enterprise.context.Dependent;
-import javax.enterprise.context.RequestScoped;
-import javax.enterprise.context.SessionScoped;
-import javax.enterprise.context.spi.Context;
import javax.inject.Singleton;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletRequestEvent;
-import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
-public class CdiAppContextsService extends AbstractContextsService implements ContextsService, ConversationService {
+
+public class CdiAppContextsService extends WebContextsService implements ContextsService {
public static final Object EJB_REQUEST_EVENT = new Object();
private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB.createChild("cdi"), CdiAppContextsService.class);
- private static final String CID = "cid";
-
- private final ThreadLocal<ServletRequestContext> requestContext = new ThreadLocal<>();
-
- private final ThreadLocal<SessionContext> sessionContext = new ThreadLocal<>();
- private final UpdatableSessionContextManager sessionCtxManager = new UpdatableSessionContextManager();
-
- /**
- * Conversation context manager
- */
- private final ThreadLocal<ConversationContext> conversationContext;
-
- private final DependentContext dependentContext = new DependentContext();
-
- private final ApplicationContext applicationContext = new ApplicationContext();
-
- private final SingletonContext singletonContext = new SingletonContext();
-
- private final WebBeansContext webBeansContext;
-
- private final ConversationService conversationService;
-
- private volatile Object appEvent;
-
- private final boolean useGetParameter;
-
private static final ThreadLocal<Collection<Runnable>> endRequestRunnables = new ThreadLocal<Collection<Runnable>>() {
@Override
protected Collection<Runnable> initialValue() {
@@ -101,37 +45,13 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
}
};
- private volatile boolean autoConversationCheck = true;
public CdiAppContextsService(final WebBeansContext wbc) {
- this(wbc, wbc.getOpenWebBeansConfiguration().supportsConversation());
+ super(wbc);
}
- public CdiAppContextsService(final WebBeansContext wbc, final boolean supportsConversation) {
- if (wbc != null) {
- webBeansContext = wbc;
- } else {
- webBeansContext = WebBeansContext.currentInstance();
- }
-
- dependentContext.setActive(true);
- if (supportsConversation) {
- conversationService = webBeansContext.getService(ConversationService.class);
- if (conversationService == null) {
- conversationContext = null;
- } else {
- conversationContext = new ThreadLocal<>();
- }
- } else {
- conversationService = null;
- conversationContext = null;
- }
- applicationContext.setActive(true);
- singletonContext.setActive(true);
- useGetParameter = "true".equalsIgnoreCase(SystemInstance.get().getProperty("openejb.cdi.conversation.http.use-get-parameter", "false"));
- }
- private void endRequest() {
+ private void runEndRequestTasks() {
for (final Runnable r : endRequestRunnables.get()) {
try {
r.run();
@@ -146,30 +66,6 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
endRequestRunnables.get().add(runnable);
}
- @Override
- public String getConversationId() {
- return getHttpParameter(CID);
- }
-
- @Override
- public String getConversationSessionId() {
- return currentSessionId(false);
- }
-
- public String currentSessionId(final boolean force) {
- final ServletRequestContext rc = requestContext.get();
- if (rc != null) {
- final HttpServletRequest req = rc.getServletRequest();
- if (req != null) {
- final HttpSession session = req.getSession(force);
- if (session != null) {
- return session.getId();
- }
- }
- }
- return null;
- }
-
@Override // this method is called after the deployment (BeansDeployer) but need beans to be here to get events
public void init(final Object initializeObject) {
//Start application context
@@ -179,651 +75,17 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
startContext(Singleton.class, initializeObject);
}
- public void beforeStop(final Object ignored) {
- { // trigger @PreDestroy mainly but keep it active until destroy(xxx)
- applicationContext.destroy();
- webBeansContext.getBeanManagerImpl().fireEvent(
- appEvent,
- new EventMetadataImpl(null, ServletContext.class.isInstance(appEvent) ? ServletContext.class : Object.class,null, new Annotation[] { DestroyedLiteral.INSTANCE_APPLICATION_SCOPED }, webBeansContext),
- false);
- applicationContext.setActive(true);
-
- singletonContext.destroy();
- singletonContext.setActive(true);
- }
-
- for (final Map.Entry<Conversation, ConversationContext> conversation : webBeansContext.getConversationManager().getAllConversationContexts().entrySet()) {
- conversation.getValue().destroy();
- final String id = conversation.getKey().getId();
- if (id != null) {
- webBeansContext.getBeanManagerImpl().fireEvent(id, DestroyedLiteral.INSTANCE_CONVERSATION_SCOPED);
- }
- }
- for (final SessionContext sc : sessionCtxManager.getContextById().values()) {
- final Object event = HttpSessionContextSessionAware.class.isInstance(sc) ? HttpSessionContextSessionAware.class.cast(sc).getSession() : sc;
- if (HttpSession.class.isInstance(event)) {
- final HttpSession httpSession = HttpSession.class.cast(event);
- if (httpSession.getId() == null) {
- continue;
- }
- initSessionContext(httpSession);
- try {
- httpSession.invalidate();
- } catch (final IllegalStateException ise) {
- // no-op
- } finally {
- destroySessionContext(httpSession);
- }
- } else {
- sc.destroy();
- }
- webBeansContext.getBeanManagerImpl().fireEvent(event, DestroyedLiteral.INSTANCE_SESSION_SCOPED);
- }
- sessionCtxManager.getContextById().clear();
- }
-
public void destroy(final Object destroyObject) {
- //Destroy application context
- endContext(ApplicationScoped.class, destroyObject);
-
- //Destroy singleton context
- endContext(Singleton.class, destroyObject);
-
+ super.destroy(destroyObject);
removeThreadLocals();
}
- public void removeThreadLocals() {
- //Remove thread locals
- //for preventing memory leaks
- requestContext.set(null);
- requestContext.remove();
- sessionContext.set(null);
- sessionContext.remove();
-
- if (null != conversationContext) {
- conversationContext.set(null);
- conversationContext.remove();
- }
- }
-
- @Override
- public void endContext(final Class<? extends Annotation> scopeType, final Object endParameters) {
- if (supportsContext(scopeType)) {
- if (scopeType.equals(RequestScoped.class)) {
- destroyRequestContext(endParameters);
- } else if (scopeType.equals(SessionScoped.class)) {
- destroySessionContext((HttpSession) endParameters);
- } else if (scopeType.equals(ApplicationScoped.class)) {
- destroyApplicationContext();
- } else if (scopeType.equals(Dependent.class)) { //NOPMD
- // Do nothing
- } else if (scopeType.equals(Singleton.class)) {
- destroySingletonContext();
- } else if (supportsConversation() && scopeType.equals(ConversationScoped.class)) {
- destroyConversationContext(endParameters);
- } else {
- if (logger.isWarningEnabled()) {
- logger.warning("CDI-OpenWebBeans container in OpenEJB does not support context scope "
- + scopeType.getSimpleName()
- + ". Scopes @Dependent, @RequestScoped, @ApplicationScoped and @Singleton are supported scope types");
- }
- }
- }
-
- }
-
- @Override
- public Context getCurrentContext(final Class<? extends Annotation> scopeType) {
- if (scopeType.equals(RequestScoped.class)) {
- return getRequestContext(true);
- } else if (scopeType.equals(SessionScoped.class)) {
- return getSessionContext(true);
- } else if (scopeType.equals(ApplicationScoped.class)) {
- return getApplicationContext();
- } else if (supportsConversation() && scopeType.equals(ConversationScoped.class)) {
- return getConversationContext();
- } else if (scopeType.equals(Dependent.class)) {
- return dependentContext;
- } else if (scopeType.equals(Singleton.class)) {
- return getSingletonContext();
- }
-
- return null;
- }
@Override
- public void startContext(final Class<? extends Annotation> scopeType, final Object startParameter) throws ContextException {
- if (supportsContext(scopeType)) {
- if (scopeType.equals(RequestScoped.class)) {
- initRequestContext(startParameter);
- } else if (scopeType.equals(SessionScoped.class)) {
- initSessionContext((HttpSession) startParameter);
- } else if (scopeType.equals(ApplicationScoped.class)) {
- initApplicationContext(startParameter);
- } else if (scopeType.equals(Dependent.class)) {
- initSingletonContext();
- } else if (scopeType.equals(Singleton.class)) { //NOPMD
- // Do nothing
- } else if (supportsConversation() && scopeType.equals(ConversationScoped.class) && !isTimeout()) {
- initConversationContext(startParameter);
- } else {
- if (logger.isWarningEnabled()) {
- logger.warning("CDI-OpenWebBeans container in OpenEJB does not support context scope "
- + scopeType.getSimpleName()
- + ". Scopes @Dependent, @RequestScoped, @ApplicationScoped and @Singleton are supported scope types");
- }
- }
- }
- }
-
- private void initSingletonContext() {
- singletonContext.setActive(true);
- }
-
- private void initApplicationContext(final Object init) { // in case contexts are stop/start
- if (appEvent == null) { // no need of sync cause of the lifecycle
- Object event = init;
- if (StartupObject.class.isInstance(init)) {
- final StartupObject so = StartupObject.class.cast(init);
- if (so.isFromWebApp()) { // ear webapps
- event = so.getWebContext().getServletContext();
- } else if (so.getAppInfo().webAppAlone) {
- event = SystemInstance.get().getComponent(ServletContext.class);
- }
- } else if (ServletContextEvent.class.isInstance(init)) {
- event = ServletContextEvent.class.cast(init).getServletContext();
- }
- appEvent = event != null ? event : applicationContext;
- webBeansContext.getBeanManagerImpl().fireEvent(
- appEvent,
- new EventMetadataImpl(null,
- ServletContext.class.isInstance(appEvent) ? ServletContext.class : Object.class, null, new Annotation[] { InitializedLiteral.INSTANCE_APPLICATION_SCOPED },
- webBeansContext),
- false);
- }
- }
-
- @Override
- public boolean supportsContext(final Class<? extends Annotation> scopeType) {
- return scopeType.equals(RequestScoped.class)
- || scopeType.equals(SessionScoped.class)
- || scopeType.equals(ApplicationScoped.class)
- || scopeType.equals(Dependent.class)
- || scopeType.equals(Singleton.class)
- || scopeType.equals(ConversationScoped.class) && supportsConversation();
-
- }
-
- private void initRequestContext(final Object event) {
- final ServletRequestContext rq = new ServletRequestContext();
- rq.setActive(true);
-
- requestContext.set(rq);// set thread local
- if (event != null && ServletRequestEvent.class.isInstance(event)) {
- final HttpServletRequest request = (HttpServletRequest) ServletRequestEvent.class.cast(event).getServletRequest();
- rq.setServletRequest(request);
-
- if (request != null) {
- webBeansContext.getBeanManagerImpl().fireEvent(request, InitializedLiteral.INSTANCE_REQUEST_SCOPED);
- }
-
- if (request != null) {
- //Re-initialize thread local for session
- final HttpSession session = request.getSession(false);
-
- final String cid = conversationService != null ? (!useGetParameter ? getCid(request) : request.getParameter(CID)) : null;
- if (session != null) {
- initSessionContext(session);
- if (autoConversationCheck && conversationService != null && !isConversationSkipped(request)) {
- if (cid != null) {
- final ConversationManager conversationManager = webBeansContext.getConversationManager();
- final ConversationImpl c = conversationManager.getPropogatedConversation(cid, session.getId());
- if (c != null) {
- final ConversationContext context = conversationManager.getConversationContext(c);
- context.setActive(true);
- conversationContext.set(context);
- return;
- }
- }
- }
- }
-
- if (cid == null && !isTimeout() && autoConversationCheck) {
- // transient but active
- initConversationContext(request);
- }
- }
- } else if (event == EJB_REQUEST_EVENT) {
- webBeansContext.getBeanManagerImpl().fireEvent(event, InitializedLiteral.INSTANCE_REQUEST_SCOPED);
- }
- }
-
- public static String getCid(final HttpServletRequest req) {
- return getFromQuery(CID, req.getQueryString());
- }
-
- public static String getFromQuery(final String name, final String q) {
- final int cid = q == null ? -1 : q.indexOf(name + "=");
- if (cid < 0) {
- return null;
- }
- int end = q.indexOf("&", cid);
- final int end2 = q.indexOf("#", cid);
- if (end2 > 0 && end2 < end) {
- end = end2;
- }
- if (end < 0) {
- end = q.length();
- }
- return q.substring(cid + name.length() + 1, end);
- }
-
- public boolean isAutoConversationCheck() {
- return autoConversationCheck;
- }
-
- public void checkConversationState() {
- final ServletRequestContext rc = getRequestContext(false);
- if (rc != null && rc.getServletRequest() != null && conversationService != null) {
- final HttpSession session = rc.getServletRequest().getSession(false);
- if (session != null) {
- final String cid = useGetParameter ? rc.getServletRequest().getParameter(CID) : getFromQuery(CID, rc.getServletRequest().getQueryString());
- if (cid != null) {
- final ConversationManager conversationManager = webBeansContext.getConversationManager();
- final ConversationImpl c = conversationManager.getPropogatedConversation(cid, session.getId());
- if (!autoConversationCheck) { // lazy association
- initConversationContext(rc.getServletRequest());
- }
- if (c != null) {
- if (c.isTransient()) {
- throw new IllegalStateException("Conversation " + cid + " missing");
- }
- if (c.iUseIt() > 1) {
- throw new BusyConversationException("busy conversation " + c.getId() + '(' + c.getSessionId() + ')');
- }
- }
- }
- }
- }
- }
-
- private void destroyRequestContext(final Object end) {
- // execute request tasks
- endRequest();
-
- //Get context
- final ServletRequestContext context = getRequestContext(false);
-
- //Destroy context
- if (context != null) {
- if (supportsConversation()) { // OWB-595
- cleanupConversation();
- }
-
- final HttpServletRequest servletRequest = context.getServletRequest();
- if (servletRequest != null) {
- webBeansContext.getBeanManagerImpl().fireEvent(servletRequest, DestroyedLiteral.INSTANCE_REQUEST_SCOPED);
- } else if (end == EJB_REQUEST_EVENT) {
- webBeansContext.getBeanManagerImpl().fireEvent(end, DestroyedLiteral.INSTANCE_REQUEST_SCOPED);
- }
- context.destroy();
- }
-
- // clean up the EL caches after each request
- final ELContextStore elStore = ELContextStore.getInstance(false);
- if (elStore != null) {
- elStore.destroyELContextStore();
- }
-
- //Clear thread locals - only for request to let user do with deltaspike start(session, request)restart(request)...stop()
- requestContext.remove();
-
- RequestScopedBeanInterceptorHandler.removeThreadLocals();
- }
-
- private void cleanupConversation() {
- if (conversationService == null) {
- return;
- }
-
- final ConversationContext cc = getConversationContext();
- if (cc == null) {
- return;
- }
- cc.setActive(false);
-
- final ConversationManager conversationManager = webBeansContext.getConversationManager();
- final Conversation conversation = conversationManager.getConversationBeanReference();
- if (conversation == null) {
- return;
- }
-
- final ConversationImpl conversationImpl = ConversationImpl.class.cast(conversation);
- conversationImpl.iDontUseItAnymore(); // do it before next call to avoid busy exception if possible
- try {
- if (conversation.isTransient()) {
- endContext(ConversationScoped.class, null);
- conversationManager.removeConversation(conversation); // in case end() was called
- } else {
- conversationImpl.updateTimeOut();
- }
- } catch (final BusyConversationException bce) {
- // no-op, TODO: do something, maybe add internalIsTransient() to avoid to fail here
- }
- }
-
- /**
- * Creates the session context at the session start.
- *
- * @param session http session object
- */
- private void initSessionContext(final HttpSession session) {
- if (session == null) {
- // no session -> no SessionContext
- return;
- }
-
- final String sessionId = session.getId();
- //Current context
- SessionContext currentSessionContext = sessionId == null ? null : sessionCtxManager.getSessionContextWithSessionId(sessionId);
-
- //No current context
- boolean fire = false;
- if (currentSessionContext == null) {
- currentSessionContext = newSessionContext(session);
- sessionCtxManager.addNewSessionContext(sessionId, currentSessionContext);
- fire = true;
- }
- //Activate
- currentSessionContext.setActive(true);
-
- //Set thread local
- sessionContext.set(currentSessionContext);
-
- if (fire) {
- webBeansContext.getBeanManagerImpl().fireEvent(session, InitializedLiteral.INSTANCE_SESSION_SCOPED);
- }
- }
-
- private SessionContext newSessionContext(final HttpSession session) {
- final String classname = SystemInstance.get().getComponent(ThreadSingletonService.class).sessionContextClass();
- if (classname != null) {
- try {
- final Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(classname);
- try {
- final Constructor<?> constr = clazz.getConstructor(HttpSession.class);
- return (SessionContext) constr.newInstance(session);
- } catch (final Exception e) {
- return (SessionContext) clazz.newInstance();
- }
-
- } catch (final Exception e) {
- logger.error("Can't instantiate " + classname + ", using default session context", e);
- }
- }
- return new HttpSessionContextSessionAware(session);
- }
-
- /**
- * Destroys the session context and all of its components at the end of the
- * session.
- *
- * @param session http session object
- */
- private void destroySessionContext(final HttpSession session) {
- if (session != null) {
- final SessionContext context = sessionContext.get();
-
- if (context != null && context.isActive()) {
- final ServletRequestContext servletRequestContext = getRequestContext(false);
- if (servletRequestContext == null || servletRequestContext.getServletRequest() == null) {
- doDestroySession(context, session);
- } else {
- pushRequestReleasable(new Runnable() { // call it at the end of the request
- @Override
- public void run() {
- doDestroySession(context, session);
- }
- });
- }
- }
-
- //Clear thread locals
- sessionContext.set(null);
- sessionContext.remove();
-
- //Remove session from manager
- sessionCtxManager.removeSessionContextWithSessionId(session.getId());
- }
- }
-
- private void doDestroySession(SessionContext context, HttpSession session) {
- context.destroy();
- webBeansContext.getBeanManagerImpl().fireEvent(session, DestroyedLiteral.INSTANCE_SESSION_SCOPED);
- }
-
- //we don't have initApplicationContext
-
- private void destroyApplicationContext() {
- applicationContext.destroy();
- }
-
- private void destroySingletonContext() {
- singletonContext.destroy();
- }
-
- private ConversationContext initConversationContext(final Object request) {
- if (conversationService == null) {
- return null;
- }
-
- final HttpServletRequest req = HttpServletRequest.class.isInstance(request) ? HttpServletRequest.class.cast(request) : null;
- ConversationContext context = ConversationContext.class.isInstance(request) ? ConversationContext.class.cast(request) : null;
- Object event = null;
- if (context == null) {
- final ConversationContext existingContext = conversationContext.get();
- if (existingContext == null) {
- context = new ConversationContext();
- context.setActive(true);
-
- if (req != null) {
- event = req;
- } else {
- final ServletRequestContext servletRequestContext = getRequestContext(true);
- event = servletRequestContext != null && servletRequestContext.getServletRequest() != null ? servletRequestContext.getServletRequest() : context;
- }
- } else {
- context = existingContext;
- }
- }
- conversationContext.set(context);
- context.setActive(true);
- if (event != null) {
- webBeansContext.getBeanManagerImpl().fireEvent(event, InitializedLiteral.INSTANCE_CONVERSATION_SCOPED);
- }
- return context;
- }
-
- /**
- * Destroy conversation context.
- */
- private void destroyConversationContext(final Object destroy) {
- if (conversationService == null) {
- return;
- }
-
- final ConversationContext context = getConversationContext();
- if (context != null) {
- context.destroy();
- final ServletRequestContext servletRequestContext = getRequestContext(false);
- final Object destroyObject = servletRequestContext != null && servletRequestContext.getServletRequest() != null ?
- servletRequestContext.getServletRequest() : destroy;
- webBeansContext.getBeanManagerImpl().fireEvent(
- destroyObject == null ? context : destroyObject, DestroyedLiteral.INSTANCE_CONVERSATION_SCOPED);
- }
-
- if (null != context) {
- conversationContext.remove();
- }
- }
+ protected void destroyRequestContext(Object requestEvent) {
+ // execute endrequest tasks
+ runEndRequestTasks();
-
- public ServletRequestContext getRequestContext(final boolean create) {
- ServletRequestContext context = requestContext.get();
- if (context == null && create) {
- initRequestContext(null);
- return requestContext.get();
- }
- return context;
- }
-
- private Context getSessionContext(final boolean create) {
- SessionContext context = sessionContext.get();
- if ((context == null || !context.isActive()) && create) {
- lazyStartSessionContext();
- context = sessionContext.get();
- if (context == null) {
- context = new SessionContext();
- context.setActive(true);
- sessionContext.set(context);
- }
- }
- return context;
- }
-
- /**
- * Gets application context.
- *
- * @return application context
- */
- private ApplicationContext getApplicationContext() {
- return applicationContext;
- }
-
- /**
- * Gets singleton context.
- *
- * @return singleton context
- */
- private SingletonContext getSingletonContext() {
- return singletonContext;
- }
-
- /**
- * Get current conversation ctx.
- *
- * @return conversation context
- */
- private ConversationContext getConversationContext() {
- return conversationContext.get();
- }
-
- private boolean isConversationSkipped(final HttpServletRequest servletRequest) {
- final String queryString = servletRequest.getQueryString();
- return "none".equals(getFromQuery("conversationPropagation", queryString)) || "true".equals(getFromQuery("nocid", queryString));
- }
-
- private boolean isTimeout() {
- final ThreadContext tc = ThreadContext.getThreadContext();
- return tc != null && tc.getCurrentOperation() == Operation.TIMEOUT;
- }
-
- private Context lazyStartSessionContext() {
-
- if (logger.isDebugEnabled()) {
- logger.debug(">lazyStartSessionContext");
- }
-
- final Context webContext = null;
- final Context context = getCurrentContext(RequestScoped.class);
- if (context instanceof ServletRequestContext) {
- final ServletRequestContext requestContext = (ServletRequestContext) context;
- final HttpServletRequest servletRequest = requestContext.getServletRequest();
- if (null != servletRequest) { // this could be null if there is no active request context
- try {
- final HttpSession currentSession = servletRequest.getSession();
- initSessionContext(currentSession);
-
- /*
- final FailOverService failoverService = webBeansContext.getService(FailOverService.class);
- if (failoverService != null && failoverService.isSupportFailOver()) {
- failoverService.sessionIsInUse(currentSession);
- }
- */
-
- if (logger.isDebugEnabled()) {
- logger.debug("Lazy SESSION context initialization SUCCESS");
- }
- } catch (final Exception e) {
- logger.error(OWBLogConst.ERROR_0013, e);
- }
-
- } else {
- logger.warning("Could NOT lazily initialize session context because NO active request context");
- }
- } else {
- logger.warning("Could NOT lazily initialize session context because of " + context + " RequestContext");
- }
-
- if (logger.isDebugEnabled()) {
- logger.debug("<lazyStartSessionContext " + webContext);
- }
- return webContext;
- }
-
- public void setAutoConversationCheck(final boolean autoConversationCheck) {
- this.autoConversationCheck = autoConversationCheck;
- }
-
- private boolean supportsConversation() {
- return conversationContext != null;
- }
-
- public void updateSessionIdMapping(final String oldId, final String newId) {
- sessionCtxManager.updateSessionIdMapping(oldId, newId);
- }
-
- public State saveState() {
- return new State(requestContext.get(), sessionContext.get(), conversationContext.get());
- }
-
- public State restoreState(final State state) {
- final State old = saveState();
- requestContext.set(state.request);
- sessionContext.set(state.session);
- conversationContext.set(state.conversation);
- return old;
- }
-
- public String getHttpParameter(final String name) {
- final ServletRequestContext req = getRequestContext(false);
- if (req != null && req.getServletRequest() != null) {
- return useGetParameter ? req.getServletRequest().getParameter(name) : getFromQuery(name, req.getServletRequest().getQueryString());
- }
- return null;
- }
-
- public static class State {
- private final ServletRequestContext request;
- private final SessionContext session;
- private final ConversationContext conversation;
-
- public State(final ServletRequestContext request, final SessionContext session, final ConversationContext conversation) {
- this.request = request;
- this.session = session;
- this.conversation = conversation;
- }
- }
-
- public static class HttpSessionContextSessionAware extends SessionContext {
- private final HttpSession session;
-
- public HttpSessionContextSessionAware(final HttpSession session) {
- this.session = session;
- }
-
- public HttpSession getSession() {
- return session;
- }
+ super.destroyRequestContext(requestEvent);
}
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
index 8dab787..429f7ac 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
@@ -41,14 +41,12 @@ import org.apache.webbeans.exception.WebBeansConfigurationException;
import org.apache.webbeans.portable.events.discovery.BeforeShutdownImpl;
import org.apache.webbeans.portable.events.generics.GProcessSessionBean;
import org.apache.webbeans.proxy.NormalScopeProxyFactory;
-import org.apache.webbeans.spi.ContextsService;
import org.apache.webbeans.spi.ResourceInjectionService;
import org.apache.webbeans.spi.SecurityService;
import org.apache.webbeans.spi.TransactionService;
import org.apache.webbeans.spi.plugins.AbstractOwbPlugin;
import org.apache.webbeans.spi.plugins.OpenWebBeansEjbPlugin;
import org.apache.webbeans.spi.plugins.OpenWebBeansJavaEEPlugin;
-import org.apache.webbeans.spi.plugins.OpenWebBeansWebPlugin;
import org.apache.webbeans.util.GenericsUtil;
import org.apache.webbeans.util.WebBeansUtil;
@@ -94,12 +92,11 @@ import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
-public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPlugin, OpenWebBeansEjbPlugin, OpenWebBeansWebPlugin {
+public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPlugin, OpenWebBeansEjbPlugin {
private Map<Class<?>, BeanContext> beans;
private WebBeansContext webBeansContext;
- private CdiAppContextsService contexsServices;
private ClassLoader classLoader;
private Map<Contextual<?>, Object> cacheProxies;
@@ -113,10 +110,6 @@ public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPl
}
}
- @Override
- public String currentSessionId() {
- return CdiAppContextsService.class.cast(webBeansContext.getService(ContextsService.class)).currentSessionId(true);
- }
@Override
public boolean isEEComponent(final Class<?> impl) {
@@ -157,9 +150,6 @@ public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPl
}
}
- public CdiAppContextsService getContexsServices() {
- return contexsServices;
- }
public void stop() throws OpenEJBException {
final ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
@@ -171,7 +161,7 @@ public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPl
webBeansContext.getBeanManagerImpl().fireEvent(new BeforeShutdownImpl());
// Destroys context
- this.contexsServices.destroy(null);
+ webBeansContext.getContextsService().destroy(null);
// Free all plugin resources
webBeansContext.getPluginLoader().shutDown();
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
index 5747c50..4a05de7 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
@@ -29,10 +29,10 @@ import org.apache.webbeans.component.BuiltInOwbBean;
import org.apache.webbeans.component.SimpleProducerFactory;
import org.apache.webbeans.component.WebBeansType;
import org.apache.webbeans.config.BeansDeployer;
-import org.apache.webbeans.config.OpenWebBeansConfiguration;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.config.WebBeansFinder;
import org.apache.webbeans.container.BeanManagerImpl;
+import org.apache.webbeans.el.ELContextStore;
import org.apache.webbeans.intercept.InterceptorResolutionService;
import org.apache.webbeans.portable.AbstractProducer;
import org.apache.webbeans.portable.InjectionTargetImpl;
@@ -48,10 +48,15 @@ import org.apache.webbeans.util.WebBeansConstants;
import org.apache.webbeans.util.WebBeansUtil;
import javax.el.ELResolver;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.context.ConversationScoped;
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.context.SessionScoped;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Provider;
+import javax.inject.Singleton;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletRequest;
@@ -71,7 +76,6 @@ import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
/**
* @version $Rev:$ $Date:$
@@ -288,12 +292,22 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
WebappBeanManager.class.cast(beanManager).beforeStop();
}
- if (CdiAppContextsService.class.isInstance(contextsService)) {
- CdiAppContextsService.class.cast(contextsService).beforeStop(endObject);
+ webBeansContext.getContextsService().endContext(RequestScoped.class, endObject);
+ webBeansContext.getContextsService().endContext(ConversationScoped.class, endObject);
+ webBeansContext.getContextsService().endContext(SessionScoped.class, endObject);
+ webBeansContext.getContextsService().endContext(ApplicationScoped.class, endObject);
+ webBeansContext.getContextsService().endContext(Singleton.class, endObject);
+
+ // clean up the EL caches after each request
+ ELContextStore elStore = ELContextStore.getInstance(false);
+ if (elStore != null)
+ {
+ elStore.destroyELContextStore();
}
+
this.beanManager.fireEvent(new BeforeShutdownImpl(), true);
- // Destroys context before BeforeShutdown event
+ // this will now even destroy the ExtensionBeans and other internal stuff
this.contextsService.destroy(endObject);
//Unbind BeanManager
@@ -374,8 +388,6 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
}
public static ScheduledExecutorService initializeServletContext(final ServletContext servletContext, final WebBeansContext context) {
- final String strDelay = context.getOpenWebBeansConfiguration().getProperty(OpenWebBeansConfiguration.CONVERSATION_PERIODIC_DELAY, "150000");
- final long delay = Long.parseLong(strDelay);
final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1, new ThreadFactory() {
@Override
@@ -385,7 +397,6 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
return t;
}
});
- executorService.scheduleWithFixedDelay(new ConversationCleaner(context), delay, delay, TimeUnit.MILLISECONDS);
final ELAdaptor elAdaptor = context.getService(ELAdaptor.class);
final ELResolver resolver = elAdaptor.getOwbELResolver();
@@ -393,13 +404,7 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
if (context.getOpenWebBeansConfiguration().isJspApplication()) {
logger.debug("Application is configured as JSP. Adding EL Resolver.");
- final JspFactory factory = JspFactory.getDefaultFactory();
- if (factory != null) {
- final JspApplicationContext applicationCtx = factory.getJspApplicationContext(servletContext);
- applicationCtx.addELResolver(resolver);
- } else {
- logger.debug("Default JspFactory instance was not found");
- }
+ setJspELFactory(servletContext, resolver);
}
// Add BeanManager to the 'javax.enterprise.inject.spi.BeanManager' servlet context attribute
@@ -409,22 +414,37 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
}
/**
- * Conversation cleaner thread, that
- * clears unused conversations.
+ * On Tomcat we need to sometimes force a class load to get our hands on the JspFactory
*/
- private static final class ConversationCleaner implements Runnable {
- private final WebBeansContext webBeansContext;
+ private static void setJspELFactory(ServletContext startupObject, ELResolver resolver)
+ {
+ JspFactory factory = JspFactory.getDefaultFactory();
+ if (factory == null)
+ {
+ try
+ {
+ Class.forName("org.apache.jasper.compiler.JspRuntimeContext");
+ factory = JspFactory.getDefaultFactory();
+ }
+ catch (Exception e)
+ {
+ // ignore
+ }
- private ConversationCleaner(final WebBeansContext webBeansContext) {
- this.webBeansContext = webBeansContext;
}
- public void run() {
- webBeansContext.getConversationManager().destroyWithRespectToTimout();
-
+ if (factory != null)
+ {
+ JspApplicationContext applicationCtx = factory.getJspApplicationContext(startupObject);
+ applicationCtx.addELResolver(resolver);
+ }
+ else
+ {
+ logger.warning("Default JSPFactroy instance has not found. Skipping OWB JSP handling");
}
}
+
/**
* Returns servlet context otherwise throws exception.
*
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
index ed48b9e..fef83b3 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
@@ -121,10 +121,6 @@ public class ThreadSingletonServiceImpl implements ThreadSingletonService {
properties.setProperty("org.apache.webbeans.proxy.mapping.javax.enterprise.context.RequestScoped", defaultNormalScopeHandlerClass);
}
- if (sessionContextClass() != null && tomee) {
- properties.setProperty("org.apache.webbeans.proxy.mapping.javax.enterprise.context.SessionScoped", "org.apache.tomee.catalina.cdi.SessionNormalScopeBeanHandler");
- }
-
if (SystemInstance.get().getOptions().get(WEBBEANS_FAILOVER_ISSUPPORTFAILOVER, false)) {
properties.setProperty(WEBBEANS_FAILOVER_ISSUPPORTFAILOVER, "true");
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java
deleted file mode 100644
index fe97ef1..0000000
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.openejb.cdi;
-
-import org.apache.openejb.OpenEJBRuntimeException;
-import org.apache.webbeans.context.SessionContext;
-import org.apache.webbeans.web.context.SessionContextManager;
-
-import java.lang.reflect.Field;
-import java.util.Map;
-
-public class UpdatableSessionContextManager extends SessionContextManager {
- private static final Field scField;
-
- static {
- try {
- scField = SessionContextManager.class.getDeclaredField("sessionContexts");
- scField.setAccessible(true);
- } catch (final NoSuchFieldException e) {
- throw new OpenEJBRuntimeException("sessionContexts attribute of SessionContextManager not found, you probably use a not compatible version of OWB");
- }
- }
-
- private final Map<String, SessionContext> contextById;
-
- public UpdatableSessionContextManager() {
- try {
- contextById = (Map<String, SessionContext>) scField.get(this);
- } catch (final IllegalAccessException e) {
- throw new OpenEJBRuntimeException("can't get session contexts", e);
- }
- }
-
- public Map<String, SessionContext> getContextById() {
- return contextById;
- }
-
- public void updateSessionIdMapping(final String oldId, final String newId) {
- if (oldId == null) {
- return;
- }
-
- final SessionContext sc = getSessionContextWithSessionId(oldId);
- if (sc == null) {
- return;
- }
-
- addNewSessionContext(newId, sc);
- contextById.remove(oldId);
- }
-}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
index 9616622..49d4468 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
@@ -1027,9 +1027,9 @@ public class ApplicationComposers {
public void stopApplication() throws NamingException {
if (appContext != null) {
final ContextsService contextsService = appContext.getWebBeansContext().getContextsService();
+ // No need to stop the ConversationContext manually as it gets stored inside the SessionContext as Bean
contextsService.endContext(SessionScoped.class, session);
contextsService.endContext(RequestScoped.class, null);
- contextsService.endContext(ConversationScoped.class, null);
}
if (appInfo != null) {
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java b/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java
index 41ba092..08f6b05 100644
--- a/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java
+++ b/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java
@@ -18,12 +18,11 @@ package org.apache.openejb.cdi;
import org.junit.Test;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
public class CdiAppContextsServiceTest {
@Test
public void cid() {
+/*X TODO refactor this over to any cId test in OWB
assertNull(CdiAppContextsService.getFromQuery("cid", null));
assertNull(CdiAppContextsService.getFromQuery("cid", ""));
assertNull(CdiAppContextsService.getFromQuery("cid", "superparam=cejdzl&cfdlcjlzdbc=czlbcjb&cdlzcs&cdlcjkd"));
@@ -32,5 +31,6 @@ public class CdiAppContextsServiceTest {
assertEquals("10", CdiAppContextsService.getFromQuery("cid", "cecfzd=cefczerf&cfdzcd=&é&cdzc&cid=10"));
assertEquals("10", CdiAppContextsService.getFromQuery("cid", "cecfzd=cefczerf&cfdzcd=&é&cdzc&cid=10&cdsjlcbdjc=djlbcsjlb=ldjbs=cdsln"));
assertEquals("10", CdiAppContextsService.getFromQuery("cid", "cid=10&cdsjlcbdjc=djlbcsjlb=ldjbs=cdsln"));
+*/
}
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java b/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java
index c9a4476..c005681 100644
--- a/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java
+++ b/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java
@@ -75,8 +75,8 @@ public class StatefulConversationScopedTOMEE1138Test {
}
@Override
- public String getConversationSessionId() {
- return "session-test";
+ public String generateConversationId() {
+ return "cid_1";
}
});
webBeansContext.getService(ContextsService.class).startContext(ConversationScoped.class, null);
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
index 36e83aa..acd4208 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
@@ -22,18 +22,13 @@ import org.apache.openejb.cdi.ThreadSingletonServiceImpl;
import org.apache.openejb.cdi.WebappWebBeansContext;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
-import org.apache.webbeans.annotation.DestroyedLiteral;
import org.apache.webbeans.config.OWBLogConst;
import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.context.ConversationContext;
-import org.apache.webbeans.conversation.ConversationManager;
import org.apache.webbeans.el.ELContextStore;
import org.apache.webbeans.spi.ContextsService;
import org.apache.webbeans.spi.FailOverService;
import org.apache.webbeans.util.WebBeansUtil;
-import java.util.Map;
-import javax.enterprise.context.Conversation;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.SessionScoped;
import javax.servlet.ServletContextEvent;
@@ -188,26 +183,6 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq
logger.debug("Destroying a session with session id : [{0}]", event.getSession().getId());
}
- // ensure session ThreadLocal is set
- webBeansContext.getContextsService().startContext(SessionScoped.class, event.getSession());
-
- if (WebappWebBeansContext.class.isInstance(webBeansContext)) { // end after child
- WebappWebBeansContext.class.cast(webBeansContext).getParent().getContextsService().endContext(SessionScoped.class, event.getSession());
- }
-
- final CdiAppContextsService appContextsService = CdiAppContextsService.class.cast(webBeansContext.getContextsService());
- if (appContextsService.getRequestContext(false) != null) {
- final String id = event.getSession().getId(); // capture it eagerly!
- appContextsService.pushRequestReleasable(new Runnable() {
- @Override
- public void run() {
- doDestroyConversations(id);
- }
- });
- } else {
- doDestroyConversations(event.getSession().getId());
- }
-
webBeansContext.getContextsService().endContext(SessionScoped.class, event.getSession());
WebBeansListenerHelper.destroyFakedRequest(this);
@@ -240,14 +215,4 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq
WebBeansListenerHelper.destroyFakedRequest(this);
}
- private void doDestroyConversations(final String id) {
- final ConversationManager conversationManager = webBeansContext.getConversationManager();
- final Map<Conversation, ConversationContext> cc = conversationManager.getAndRemoveConversationMapWithSessionId(id);
- for (final Map.Entry<Conversation, ConversationContext> c : cc.entrySet()) {
- if (c != null) {
- c.getValue().destroy();
- webBeansContext.getBeanManagerImpl().fireEvent(c.getKey().getId(), DestroyedLiteral.INSTANCE_CONVERSATION_SCOPED);
- }
- }
- }
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java
index 65d15e1..de5841f 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java
@@ -19,7 +19,6 @@ package org.apache.openejb.server.httpd;
import org.apache.openejb.cdi.CdiAppContextsService;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.spi.ContextsService;
-import org.apache.webbeans.spi.FailOverService;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
@@ -36,8 +35,6 @@ import javax.servlet.http.HttpSessionListener;
*/
public class EndWebBeansListener implements ServletContextListener, ServletRequestListener, HttpSessionListener, HttpSessionActivationListener {
- protected FailOverService failoverService;
-
/**
* Manages the container lifecycle
*/
@@ -52,7 +49,6 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque
public EndWebBeansListener(WebBeansContext webBeansContext) {
this.webBeansContext = webBeansContext;
if (webBeansContext != null) {
- this.failoverService = this.webBeansContext.getService(FailOverService.class);
this.contextsService = CdiAppContextsService.class.cast(webBeansContext.getService(ContextsService.class));
} else {
this.contextsService = null;
@@ -72,9 +68,6 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque
*/
@Override
public void requestInitialized(ServletRequestEvent event) {
- if (contextsService != null && contextsService.isAutoConversationCheck()) {
- contextsService.checkConversationState();
- }
}
/**
@@ -99,9 +92,6 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque
return;
}
- if (failoverService != null && failoverService.isSupportPassivation()) {
- failoverService.sessionWillPassivate(event.getSession());
- }
WebBeansListenerHelper.destroyFakedRequest(this);
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
index 7cbaa0b..ae80d63 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
@@ -35,7 +35,6 @@ import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.apache.openejb.AppContext;
import org.apache.openejb.assembler.classic.WebAppBuilder;
-import org.apache.openejb.cdi.CdiAppContextsService;
import org.apache.openejb.cdi.Proxys;
import org.apache.openejb.core.ParentClassLoaderFinder;
import org.apache.openejb.core.WebContext;
@@ -43,8 +42,7 @@ import org.apache.openejb.loader.IO;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.util.AppFinder;
import org.apache.openejb.web.LightweightWebAppBuilder;
-import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.spi.ContextsService;
+
/**
* @version $Revision$ $Date$
@@ -184,10 +182,6 @@ public class HttpListenerRegistry implements HttpListener {
for (final Map.Entry<String, HttpListener> entry : listeners.entrySet()) {
final String pattern = entry.getKey();
if (path.matches(pattern) || path.equals(pattern)) {
- final WebBeansContext wbc = WebBeansContext.class.cast(request.getAttribute("openejb_owb_context"));
- if (wbc != null) {
- CdiAppContextsService.class.cast(wbc.getService(ContextsService.class)).checkConversationState();
- }
if (pattern.contains("/.*\\.") && HttpRequestImpl.class.isInstance(request)) { // TODO: enhance it, basically servlet *.xxx
HttpRequestImpl.class.cast(request).noPathInfo();
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
index 3751ef0..6006178 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
@@ -104,6 +104,9 @@ public class HttpRequestImpl implements HttpRequest {
return;
}
es.shutdownNow();
+ for (RequestSession requestSession : SESSIONS.values()) {
+ requestSession.session.invalidate();
+ }
SESSIONS.clear();
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java
index db0578c..979e676 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java
@@ -22,6 +22,9 @@ import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.spi.Context;
import javax.servlet.ServletRequestListener;
+/**
+ * @deprecated this features is imo highly questionable. We should rather fix the root of the issue
+ */
public final class WebBeansListenerHelper {
private static final ThreadLocal<Boolean> FAKE_REQUEST = new ThreadLocal<Boolean>();
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
index d7bdbe6..753b021 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
@@ -35,7 +35,6 @@ import org.apache.openejb.assembler.classic.ResourceInfo;
import org.apache.openejb.assembler.classic.ServletInfo;
import org.apache.openejb.assembler.classic.WebAppBuilder;
import org.apache.openejb.assembler.classic.WebAppInfo;
-import org.apache.openejb.cdi.CdiAppContextsService;
import org.apache.openejb.config.ConfigurationFactory;
import org.apache.openejb.config.NewLoaderLogic;
import org.apache.openejb.config.ServiceUtils;
@@ -60,16 +59,9 @@ import org.apache.tomee.common.NamingUtil;
import org.apache.tomee.common.ResourceFactory;
import org.apache.tomee.jasper.TomEEJasperInitializer;
import org.apache.tomee.loader.TomcatHelper;
-import org.apache.webbeans.config.WebBeansContext;
import org.apache.xbean.finder.IAnnotationFinder;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
import javax.servlet.ServletContainerInitializer;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.ws.rs.core.Application;
import java.io.ByteArrayInputStream;
@@ -373,16 +365,6 @@ public class OpenEJBContextConfig extends ContextConfig {
webXml.addFilterMapping(mapping);
}
- {
- final FilterDef filter = new FilterDef();
- filter.setAsyncSupported("true");
- filter.setDescription("CDI Conversation Filter");
- filter.setDisplayName("CDI Conversation Filter");
- filter.setFilterName("CDI Conversation Filter");
- filter.setFilterClass(ConversationFilter.class.getName());
- webXml.addFilter(filter);
- }
-
return webXml;
}
@@ -717,31 +699,4 @@ public class OpenEJBContextConfig extends ContextConfig {
return false;
}
- public static class ConversationFilter implements Filter {
- private WebBeansContext wbc;
- private CdiAppContextsService contextsService;
-
- @Override
- public void init(final FilterConfig filterConfig) throws ServletException {
- try {
- wbc = WebBeansContext.currentInstance();
- contextsService = CdiAppContextsService.class.cast(wbc.getContextsService());
- } catch (final Exception e) {
- // no-op
- }
- }
-
- @Override
- public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
- if (contextsService != null) {
- contextsService.checkConversationState();
- }
- chain.doFilter(request, response);
- }
-
- @Override
- public void destroy() {
- // no-op
- }
- }
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java
index 048efa1..f842923 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java
@@ -18,11 +18,8 @@ package org.apache.tomee.catalina;
import org.apache.catalina.ContainerEvent;
import org.apache.catalina.ContainerListener;
-import org.apache.catalina.Context;
import org.apache.catalina.core.StandardContext;
-import org.apache.openejb.cdi.CdiAppContextsService;
-import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.spi.ContextsService;
+
public class TomEEContainerListener implements ContainerListener {
private static final ThreadLocal<StandardContext> context = new ThreadLocal<StandardContext>();
@@ -33,14 +30,6 @@ public class TomEEContainerListener implements ContainerListener {
context.set((StandardContext) event.getContainer());
} else if ("afterContextInitialized".equals(event.getType())) {
context.remove();
- } else if (Context.CHANGE_SESSION_ID_EVENT.endsWith(event.getType())) {
- final String[] ids = (String[]) event.getData();
-
- final WebBeansContext wbc = WebBeansContext.currentInstance();
- final ContextsService cs = wbc.getContextsService();
- if (CdiAppContextsService.class.isInstance(cs) && ids.length > 0) {
- ((CdiAppContextsService) cs).updateSessionIdMapping(ids[0], ids[1]);
- }
}
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
index 1f9c81a..24a31e0 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
@@ -78,7 +78,6 @@ import org.apache.openejb.assembler.classic.ServletInfo;
import org.apache.openejb.assembler.classic.WebAppBuilder;
import org.apache.openejb.assembler.classic.WebAppInfo;
import org.apache.openejb.assembler.classic.event.NewEjbAvailableAfterApplicationCreated;
-import org.apache.openejb.cdi.CdiAppContextsService;
import org.apache.openejb.cdi.CdiBuilder;
import org.apache.openejb.cdi.OpenEJBLifecycle;
import org.apache.openejb.cdi.Proxys;
@@ -128,6 +127,7 @@ import org.apache.tomee.common.NamingUtil;
import org.apache.tomee.common.UserTransactionFactory;
import org.apache.tomee.loader.TomcatHelper;
import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.spi.ContextsService;
import org.apache.webbeans.spi.adaptor.ELAdaptor;
import org.omg.CORBA.ORB;
@@ -1071,9 +1071,9 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare
}
for (final FilterMap map : standardContext.findFilterMaps()) {
if ("CDI Conversation Filter".equals(map.getFilterName()) && webContext.getWebBeansContext() != null) {
- final CdiAppContextsService cdiAppContextsService = CdiAppContextsService.class.cast(webContext.getWebBeansContext().getContextsService());
- if (cdiAppContextsService != null) {
- cdiAppContextsService.setAutoConversationCheck(false);
+ ContextsService contextsService = webContext.getWebBeansContext().getContextsService();
+ if (contextsService != null) {
+ contextsService.setSupportConversations(false);
}
break;
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java
deleted file mode 100644
index 585a011..0000000
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.catalina.cdi;
-
-import org.apache.catalina.session.StandardSession;
-import org.apache.catalina.session.StandardSessionFacade;
-import org.apache.openejb.cdi.CdiAppContextsService;
-import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.util.reflection.Reflections;
-import org.apache.webbeans.context.creational.BeanInstanceBag;
-import org.apache.webbeans.util.WebBeansUtil;
-
-import javax.enterprise.context.spi.Contextual;
-import javax.servlet.http.HttpSession;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-public class SessionContextBackedByHttpSession extends CdiAppContextsService.HttpSessionContextSessionAware {
- private static final String WRAPPER = SystemInstance.get().getProperty("tomee.session-context.wrapper", "direct");
-
- public SessionContextBackedByHttpSession(final HttpSession session) {
- super(session);
- setComponentSessionInstanceMap(); // override default map (set in super())
- }
-
- @SuppressWarnings("unchecked")
- public void setComponentSessionInstanceMap() {
- HttpSession session = getSession();
- if (session == null) {
- super.setComponentInstanceMap();
- return;
- }
-
- if (session instanceof StandardSessionFacade) {
- try {
- session = (HttpSession) Reflections.get(session, "session");
- } catch (final Exception e) {
- // no-op
- }
- }
-
- if (StandardSession.class.equals(session.getClass())) { // local session, use fastest wrapper
- try {
- final ConcurrentHashMap<String, Object> map = (ConcurrentHashMap<String, Object>) Reflections.get(session, "attributes");
- if (WRAPPER.equals("direct")) {
- componentInstanceMap = new DirectSessionMap(map);
- } else {
- componentInstanceMap = new HttpSessionMap(session);
- }
- } catch (final Exception e) {
- componentInstanceMap = new HttpSessionMap(session);
- }
- } else {
- componentInstanceMap = new HttpSessionMap(session);
- }
- }
-
- public static String key(final Object key) {
- if (key instanceof String) { // avoid nested calls
- return (String) key;
- }
-
- final String id = WebBeansUtil.getPassivationId((Contextual<?>) key);
- if (id != null) {
- return id;
- }
- return key.toString(); // shouldn't occur
- }
-
- private static class DirectSessionMap implements ConcurrentMap<Contextual<?>, BeanInstanceBag<?>> {
- private final ConcurrentHashMap<String, Object> delegate;
-
- public DirectSessionMap(final ConcurrentHashMap<String, Object> map) {
- delegate = map;
- }
-
- @Override
- public int size() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean isEmpty() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean containsValue(final Object value) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Set<Contextual<?>> keySet() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Collection<BeanInstanceBag<?>> values() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Set<Entry<Contextual<?>, BeanInstanceBag<?>>> entrySet() {
- return Collections.emptySet();
- }
-
- @Override
- public boolean containsKey(final Object key) {
- return delegate.containsKey(key(key));
- }
-
- @Override
- public BeanInstanceBag<?> get(final Object key) {
- return (BeanInstanceBag<?>) delegate.get(key(key));
- }
-
- @Override
- public BeanInstanceBag<?> put(final Contextual<?> key, final BeanInstanceBag<?> value) {
- return (BeanInstanceBag<?>) delegate.put(key(key), value);
- }
-
- @Override
- public BeanInstanceBag<?> remove(final Object key) {
- return (BeanInstanceBag<?>) delegate.remove(key(key));
- }
-
- @Override
- public void putAll(final Map<? extends Contextual<?>, ? extends BeanInstanceBag<?>> m) {
- for (final Map.Entry<? extends Contextual<?>, ? extends BeanInstanceBag<?>> e : m.entrySet()) {
- put(e.getKey(), e.getValue());
- }
- }
-
- @Override
- public void clear() {
- final Iterator<String> it = delegate.keySet().iterator();
- while (it.hasNext()) {
- if (delegate.get(it.next()) instanceof BeanInstanceBag) {
- it.remove();
- }
- }
- }
-
- @Override
- public BeanInstanceBag<?> putIfAbsent(final Contextual<?> key, final BeanInstanceBag<?> value) {
- return (BeanInstanceBag<?>) delegate.putIfAbsent(key(key), value);
- }
-
- @Override
- public boolean remove(final Object key, final Object value) {
- return delegate.remove(key(key), value);
- }
-
- @Override
- public boolean replace(final Contextual<?> key, final BeanInstanceBag<?> oldValue, final BeanInstanceBag<?> newValue) {
- return delegate.replace(key(key), oldValue, newValue);
- }
-
- @Override
- public BeanInstanceBag<?> replace(final Contextual<?> key, final BeanInstanceBag<?> value) {
- return (BeanInstanceBag<?>) delegate.replace(key(key), value);
- }
- }
-
- private static class HttpSessionMap implements ConcurrentMap<Contextual<?>,BeanInstanceBag<?>> { // not sure it can really work
- private final HttpSession session;
-
- public HttpSessionMap(final HttpSession session) {
- this.session = session;
- }
-
- @Override
- public int size() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean isEmpty() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean containsKey(final Object key) {
- return session.getAttribute(key(key)) != null;
- }
-
- @Override
- public boolean containsValue(final Object value) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Set<Contextual<?>> keySet() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Collection<BeanInstanceBag<?>> values() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean replace(final Contextual<?> key, final BeanInstanceBag<?> oldValue, final BeanInstanceBag<?> newValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public BeanInstanceBag<?> replace(final Contextual<?> key, final BeanInstanceBag<?> value) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void clear() {
- // no-op
- }
-
- @Override
- public Set<Entry<Contextual<?>, BeanInstanceBag<?>>> entrySet() {
- return Collections.emptySet();
- }
-
- @Override
- public BeanInstanceBag<?> get(final Object key) {
- return (BeanInstanceBag<?>) session.getAttribute(key(key));
- }
-
- @Override
- public BeanInstanceBag<?> put(final Contextual<?> key, final BeanInstanceBag<?> value) {
- final BeanInstanceBag<?> bag = get(key);
- session.setAttribute(key(key), value);
- return bag;
- }
-
- @Override
- public BeanInstanceBag<?> remove(final Object key) {
- final BeanInstanceBag<?> bag = get(key);
- session.removeAttribute(key(key));
- return bag;
- }
-
- @Override
- public void putAll(final Map<? extends Contextual<?>, ? extends BeanInstanceBag<?>> m) {
- for (final Map.Entry<? extends Contextual<?>, ? extends BeanInstanceBag<?>> e : m.entrySet()) {
- put(e.getKey(), e.getValue());
- }
- }
-
- @Override
- public BeanInstanceBag<?> putIfAbsent(final Contextual<?> key, final BeanInstanceBag<?> value) {
- final String k = key(key);
- final BeanInstanceBag<?> beanInstanceBag = get(k);
- if (beanInstanceBag == null) {
- return put(key, value);
- }
- return beanInstanceBag;
- }
-
- @Override
- public boolean remove(final Object key, final Object value) {
- remove(key(key));
- return true;
- }
-
- @Override
- public String toString() {
- return "HttpSessionMap{session=" + session + '}';
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java
deleted file mode 100644
index 71b2c2a..0000000
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.catalina.cdi;
-
-import org.apache.openejb.cdi.CdiAppContextsService;
-import org.apache.tomee.catalina.TomEERuntimeException;
-import org.apache.webbeans.context.creational.BeanInstanceBag;
-import org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler;
-
-import javax.enterprise.context.SessionScoped;
-import javax.enterprise.context.spi.Context;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.servlet.http.HttpSession;
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
-
-public class SessionNormalScopeBeanHandler extends NormalScopedBeanInterceptorHandler {
- private static final Field BAG_INSTANCE;
- static {
- try {
- BAG_INSTANCE = BeanInstanceBag.class.getDeclaredField("beanInstance");
- BAG_INSTANCE.setAccessible(true);
- } catch (final NoSuchFieldException e) {
- throw new TomEERuntimeException(e);
- }
- }
-
- private static final ThreadLocal<Map<Bean<?>, UpdateInfo>> OBJECTS = new ThreadLocal<Map<Bean<?>, UpdateInfo>>() {
- @Override
- protected Map<Bean<?>, UpdateInfo> initialValue() {
- CdiAppContextsService.pushRequestReleasable(new Runnable() { // update in batch
- @Override
- public void run() {
- final Map<Bean<?>, UpdateInfo> values = OBJECTS.get();
- for (final UpdateInfo o : values.values()) {
- o.updateBean();
- }
- values.clear();
- OBJECTS.remove();
- }
- });
- return new HashMap<Bean<?>, UpdateInfo>();
- }
- };
-
- public SessionNormalScopeBeanHandler(final BeanManager beanManager, final Bean<?> bean) {
- super(beanManager, bean);
- }
-
- @Override
- public Object get() {
- final Object webbeansInstance = getContextualInstance();
- final Map<Bean<?>, UpdateInfo> beanUpdateInfoMap = OBJECTS.get();
-
- if (!beanUpdateInfoMap.containsKey(bean)) {
- beanUpdateInfoMap.put(bean, new UpdateInfo(bean, getBeanManager(), webbeansInstance));
- }
-
- return webbeansInstance;
- }
-
- protected static class UpdateInfo {
- private Bean<?> bean;
- private BeanManager bm;
- private Object value;
-
- protected UpdateInfo(final Bean<?> bean, final BeanManager bm, final Object value) {
- this.bean = bean;
- this.bm = bm;
- this.value = value;
- }
-
- @SuppressWarnings("unchecked")
- protected void updateBean() {
- final HttpSession session = session();
- if (session == null) {
- return;
- }
-
- // go through all listeners to be able to be replicated or do any processing which can be done
- final String key = SessionContextBackedByHttpSession.key(bean);
- final BeanInstanceBag<Object> bag = BeanInstanceBag.class.cast(session.getAttribute(key));
- if (bag != null) {
- try {
- BAG_INSTANCE.set(bag, value);
- } catch (final IllegalAccessException e) {
- throw new TomEERuntimeException(e);
- }
- session.setAttribute(key, bag);
- }
- }
-
- private HttpSession session() {
- final Context context = bm.getContext(SessionScoped.class);
- if (!SessionContextBackedByHttpSession.class.isInstance(context)) {
- return null;
- }
- return SessionContextBackedByHttpSession.class.cast(context).getSession();
- }
- }
-}
[14/16] tomee git commit: destroying session scope before session in
some tomee lifecycles
Posted by st...@apache.org.
destroying session scope before session in some tomee lifecycles
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/94df0ba7
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/94df0ba7
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/94df0ba7
Branch: refs/heads/fb_tomee2_owb16
Commit: 94df0ba7b81d6330055de819e125dcb629601339
Parents: bdd8644
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Mon May 4 18:25:48 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Mon May 4 19:57:36 2015 +0200
----------------------------------------------------------------------
tck/cdi-tomee/src/test/resources/failing.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/94df0ba7/tck/cdi-tomee/src/test/resources/failing.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-tomee/src/test/resources/failing.xml b/tck/cdi-tomee/src/test/resources/failing.xml
index 6ec10c3..23ceda0 100644
--- a/tck/cdi-tomee/src/test/resources/failing.xml
+++ b/tck/cdi-tomee/src/test/resources/failing.xml
@@ -23,7 +23,7 @@
-->
<test name="CDI TCK for developers (debugging)">
<classes>
- <class name="org.jboss.cdi.tck.tests.context.request.ws.RequestContextTest" />
+ <class name="org.jboss.cdi.tck.tests.deployment.shutdown.ApplicationShutdownLifecycleTest" />
</classes>
</test>
</suite>
[09/16] tomee git commit: fixing test
Posted by st...@apache.org.
fixing test
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/a629b804
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/a629b804
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/a629b804
Branch: refs/heads/fb_tomee2_owb16
Commit: a629b804aa0493f9fab8729d1d2d65144dcc9132
Parents: 0421a02
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Thu Apr 30 10:27:58 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Mon May 4 19:00:19 2015 +0200
----------------------------------------------------------------------
.../openejb/util/classloader/URLClassLoaderFirstTest.java | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/a629b804/container/openejb-core/src/test/java/org/apache/openejb/util/classloader/URLClassLoaderFirstTest.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/util/classloader/URLClassLoaderFirstTest.java b/container/openejb-core/src/test/java/org/apache/openejb/util/classloader/URLClassLoaderFirstTest.java
index f77d7e2..e7646dd 100644
--- a/container/openejb-core/src/test/java/org/apache/openejb/util/classloader/URLClassLoaderFirstTest.java
+++ b/container/openejb-core/src/test/java/org/apache/openejb/util/classloader/URLClassLoaderFirstTest.java
@@ -21,17 +21,17 @@ import org.apache.openejb.loader.JarLocation;
import org.apache.openejb.loader.SystemInstance;
import org.junit.Test;
-import javax.wsdl.WSDLException;
-import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
+import java.util.Properties;
+import javax.wsdl.WSDLException;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class URLClassLoaderFirstTest {
@Test
- public void loadFromAppIfNotInContainer() throws MalformedURLException {
+ public void loadFromAppIfNotInContainer() throws Exception {
assertTrue(URLClassLoaderFirst.shouldSkip("javax.wsdl.WSDLException"));
final URLClassLoader parent = new URLClassLoader(new URL[0]) {
@@ -45,6 +45,7 @@ public class URLClassLoaderFirstTest {
};
final URLClassLoader tmpLoader = new URLClassLoaderFirst(new URL[]{JarLocation.jarLocation(WSDLException.class).toURI().toURL()}, parent);
+ SystemInstance.init(new Properties());
SystemInstance.get().setComponent(ParentClassLoaderFinder.class, new ParentClassLoaderFinder() {
@Override
public ClassLoader getParentClassLoader(final ClassLoader fallback) {
@@ -62,5 +63,6 @@ public class URLClassLoaderFirstTest {
}
assertTrue(URLClassLoaderFirst.shouldSkip("javax.wsdl.WSDLException"));
+ SystemInstance.reset();
}
}
[12/16] tomee git commit: OWB-1049 removing failoverservice references
Posted by st...@apache.org.
OWB-1049 removing failoverservice references
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/12e1a440
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/12e1a440
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/12e1a440
Branch: refs/heads/fb_tomee2_owb16
Commit: 12e1a440a44de3817e8faea60804f752491d8266
Parents: 7840b09
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Sun May 3 22:26:11 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Mon May 4 19:49:52 2015 +0200
----------------------------------------------------------------------
.../org/apache/openejb/cdi/ThreadSingletonServiceImpl.java | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/12e1a440/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
index 5564b8f..e5c36d0 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
@@ -47,8 +47,6 @@ import org.apache.webbeans.spi.TransactionService;
import org.apache.webbeans.spi.adaptor.ELAdaptor;
import org.apache.webbeans.web.intercept.RequestScopedBeanInterceptorHandler;
-import javax.enterprise.inject.spi.DeploymentException;
-import javax.transaction.Transactional;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@@ -56,6 +54,8 @@ import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
+import javax.enterprise.inject.spi.DeploymentException;
+import javax.transaction.Transactional;
/**
* @version $Rev:$ $Date:$
@@ -71,7 +71,6 @@ public class ThreadSingletonServiceImpl implements ThreadSingletonService {
//this needs to be static because OWB won't tell us what the existing SingletonService is and you can't set it twice.
private static final ThreadLocal<WebBeansContext> contexts = new ThreadLocal<WebBeansContext>();
private static final Map<ClassLoader, WebBeansContext> contextByClassLoader = new ConcurrentHashMap<ClassLoader, WebBeansContext>();
- private static final String WEBBEANS_FAILOVER_ISSUPPORTFAILOVER = "org.apache.webbeans.web.failover.issupportfailover";
@Override
public void initialize(final StartupObject startupObject) {
@@ -114,9 +113,6 @@ public class ThreadSingletonServiceImpl implements ThreadSingletonService {
properties.setProperty("org.apache.webbeans.proxy.mapping.javax.enterprise.context.RequestScoped", defaultNormalScopeHandlerClass);
}
- if (SystemInstance.get().getOptions().get(WEBBEANS_FAILOVER_ISSUPPORTFAILOVER, false)) {
- properties.setProperty(WEBBEANS_FAILOVER_ISSUPPORTFAILOVER, "true");
- }
properties.put(OpenWebBeansConfiguration.PRODUCER_INTERCEPTION_SUPPORT, SystemInstance.get().getProperty("openejb.cdi.producer.interception", "true"));
[11/16] tomee git commit: destroying sessions in application composer
as well
Posted by st...@apache.org.
destroying sessions in application composer as well
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/7840b09f
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/7840b09f
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/7840b09f
Branch: refs/heads/fb_tomee2_owb16
Commit: 7840b09f4957b494ef76d8be8842d631d1ba6acc
Parents: 95ea7d5
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Sun May 3 22:23:57 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Mon May 4 19:32:05 2015 +0200
----------------------------------------------------------------------
.../openejb/OpenEJBDeployableContainer.java | 6 ++++--
.../openejb/testing/ApplicationComposers.java | 22 ++++++++++++++++++++
2 files changed, 26 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/7840b09f/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
----------------------------------------------------------------------
diff --git a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
index 44915b8..f999c20 100644
--- a/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
+++ b/arquillian/arquillian-openejb-embedded-5/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
@@ -319,8 +319,10 @@ public class OpenEJBDeployableContainer implements DeployableContainer<OpenEJBCo
public void close() throws IOException {
try {
final SessionManager sessionManager = SystemInstance.get().getComponent(SessionManager.class);
- for (final WebContext web : appCtx.getWebContexts()) {
- sessionManager.destroy(web);
+ if (sessionManager != null) {
+ for (final WebContext web : appCtx.getWebContexts()) {
+ sessionManager.destroy(web);
+ }
}
} catch (final Throwable e) {
// no-op
http://git-wip-us.apache.org/repos/asf/tomee/blob/7840b09f/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
index 49d4468..e94bed3 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
@@ -46,6 +46,7 @@ import org.apache.openejb.config.sys.JaxbOpenejb;
import org.apache.openejb.config.sys.Openejb;
import org.apache.openejb.core.LocalInitialContextFactory;
import org.apache.openejb.core.Operation;
+import org.apache.openejb.core.ParentClassLoaderFinder;
import org.apache.openejb.core.ThreadContext;
import org.apache.openejb.core.WebContext;
import org.apache.openejb.core.ivm.naming.InitContextFactory;
@@ -75,6 +76,7 @@ import org.apache.openejb.util.NetworkUtil;
import org.apache.openejb.util.PropertyPlaceHolderHelper;
import org.apache.openejb.util.ServiceManagerProxy;
import org.apache.openejb.util.URLs;
+import org.apache.openejb.util.reflection.Reflections;
import org.apache.openejb.web.LightweightWebAppBuilder;
import org.apache.webbeans.inject.OWBInjector;
import org.apache.webbeans.spi.ContextsService;
@@ -1447,6 +1449,26 @@ public class ApplicationComposers {
}
}
});
+ if (!composer.appContext.getWebContexts().isEmpty()) {
+ composer.beforeDestroyAfterRunnables.add(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ final Object sessionManager = SystemInstance.get().getComponent(
+ ParentClassLoaderFinder.Helper.get().loadClass("org.apache.openejb.server.httpd.session.SessionManager")
+ );
+ if (sessionManager != null) {
+ final Class<?>[] paramTypes = {WebContext.class};
+ for (final WebContext web : composer.appContext.getWebContexts()) {
+ Reflections.invokeByReflection(sessionManager, "destroy", paramTypes, new Object[] { web });
+ }
+ }
+ } catch (final Throwable e) {
+ // no-op
+ }
+ }
+ });
+ }
composer.afterRunnables.add(new Runnable() {
@Override
public void run() {
[03/16] tomee git commit: TOMEE-1572 remove FailOverService
Posted by st...@apache.org.
TOMEE-1572 remove FailOverService
FailOverService is not needed by OWB any longer
TOMEE-
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/c5632ef8
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/c5632ef8
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/c5632ef8
Branch: refs/heads/fb_tomee2_owb16
Commit: c5632ef80b01e900daaf5a1c651577f79a67479b
Parents: e41c460
Author: Mark Struberg <st...@apache.org>
Authored: Sat May 2 14:48:51 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Sat May 2 14:48:51 2015 +0200
----------------------------------------------------------------------
.../openejb/cdi/ThreadSingletonServiceImpl.java | 7 -------
.../server/httpd/BeginWebBeansListener.java | 20 --------------------
2 files changed, 27 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5632ef8/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
index fef83b3..5564b8f 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
@@ -102,13 +102,6 @@ public class ThreadSingletonServiceImpl implements ThreadSingletonService {
properties.setProperty(OpenWebBeansConfiguration.APPLICATION_SUPPORTS_CONVERSATION, "true");
properties.setProperty(OpenWebBeansConfiguration.IGNORED_INTERFACES, "org.apache.aries.proxy.weaving.WovenProxy");
- final String failoverService = startupObject.getAppInfo().properties.getProperty("org.apache.webbeans.spi.FailOverService",
- SystemInstance.get().getProperty("org.apache.webbeans.spi.FailOverService",
- null));
- if (failoverService != null) {
- properties.setProperty(OpenWebBeansConfiguration.IGNORED_INTERFACES, failoverService);
- }
-
final boolean tomee = SystemInstance.get().getProperty("openejb.loader", "foo").startsWith("tomcat");
final String defaultNormalScopeHandlerClass = NormalScopedBeanInterceptorHandler.class.getName();
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5632ef8/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
index acd4208..4a9b6e1 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
@@ -26,7 +26,6 @@ import org.apache.webbeans.config.OWBLogConst;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.el.ELContextStore;
import org.apache.webbeans.spi.ContextsService;
-import org.apache.webbeans.spi.FailOverService;
import org.apache.webbeans.util.WebBeansUtil;
import javax.enterprise.context.RequestScoped;
@@ -35,7 +34,6 @@ import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
-import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@@ -52,7 +50,6 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq
*/
private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_CDI, BeginWebBeansListener.class);
- protected FailOverService failoverService;
private final CdiAppContextsService contextsService;
/**
@@ -67,7 +64,6 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq
*/
public BeginWebBeansListener(final WebBeansContext webBeansContext) {
this.webBeansContext = webBeansContext;
- this.failoverService = webBeansContext != null ? this.webBeansContext.getService(FailOverService.class) : null;
this.contextsService = webBeansContext != null ? CdiAppContextsService.class.cast(webBeansContext.getService(ContextsService.class)) : null;
this.contextKey = "org.apache.tomee.catalina.WebBeansListener@" + webBeansContext.hashCode();
}
@@ -93,19 +89,6 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq
}
try {
- if (event != null
- && failoverService != null
- && failoverService.isSupportFailOver()) {
- Object request = event.getServletRequest();
- if (request instanceof HttpServletRequest) {
- HttpServletRequest httpRequest = (HttpServletRequest) request;
- javax.servlet.http.HttpSession session = httpRequest.getSession(false);
- if (session != null) {
- failoverService.sessionIsIdle(session);
- }
- }
- }
-
// clean up the EL caches after each request
final ELContextStore elStore = ELContextStore.getInstance(false);
if (elStore != null) {
@@ -195,9 +178,6 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq
@Override
public void sessionDidActivate(final HttpSessionEvent event) {
- if (failoverService.isSupportFailOver() || failoverService.isSupportPassivation()) {
- failoverService.sessionDidActivate(event.getSession());
- }
}
@Override
[04/16] tomee git commit: TOMEE-1572 remove unused import
Posted by st...@apache.org.
TOMEE-1572 remove unused import
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/dec1a0ff
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/dec1a0ff
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/dec1a0ff
Branch: refs/heads/fb_tomee2_owb16
Commit: dec1a0ff83a7ab47555cc3d4030206cd11780f64
Parents: c5632ef
Author: Mark Struberg <st...@apache.org>
Authored: Mon May 4 18:50:30 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Mon May 4 18:50:30 2015 +0200
----------------------------------------------------------------------
.../main/java/org/apache/openejb/cdi/CdiAppContextsService.java | 3 ---
1 file changed, 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/dec1a0ff/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
index 780728e..6ca395e 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
@@ -21,8 +21,6 @@ package org.apache.openejb.cdi;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.context.RequestContext;
-import org.apache.webbeans.context.SessionContext;
import org.apache.webbeans.spi.ContextsService;
import org.apache.webbeans.web.context.WebContextsService;
@@ -30,7 +28,6 @@ import java.util.ArrayList;
import java.util.Collection;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Singleton;
-import javax.servlet.http.HttpSession;
public class CdiAppContextsService extends WebContextsService implements ContextsService {
[13/16] tomee git commit: destroying session in a SessionManager in
embedded mode and not in cdi context
Posted by st...@apache.org.
destroying session in a SessionManager in embedded mode and not in cdi context
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/bdd8644b
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/bdd8644b
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/bdd8644b
Branch: refs/heads/fb_tomee2_owb16
Commit: bdd8644b96f620ab0c642383d12ceefa9ec525bd
Parents: 12e1a44
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Sun May 3 23:59:34 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Mon May 4 19:54:15 2015 +0200
----------------------------------------------------------------------
.../server/httpd/BeginWebBeansListener.java | 8 +--
.../openejb/server/httpd/HttpSessionImpl.java | 1 -
.../openejb/server/httpd/OpenEJBHttpServer.java | 17 ++++---
.../server/httpd/session/SessionManager.java | 52 ++++++++++++++------
tck/cdi-embedded/src/test/resources/failing.xml | 2 +-
5 files changed, 51 insertions(+), 29 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/bdd8644b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
index 4a9b6e1..ad73556 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
@@ -95,7 +95,7 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq
elStore.destroyELContextStore();
}
- webBeansContext.getContextsService().endContext(RequestScoped.class, event);
+ contextsService.endContext(RequestScoped.class, event);
if (webBeansContext instanceof WebappWebBeansContext) { // end after child
((WebappWebBeansContext) webBeansContext).getParent().getContextsService().endContext(RequestScoped.class, event);
}
@@ -123,7 +123,7 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq
if (webBeansContext instanceof WebappWebBeansContext) { // start before child
((WebappWebBeansContext) webBeansContext).getParent().getContextsService().startContext(RequestScoped.class, event);
}
- this.webBeansContext.getContextsService().startContext(RequestScoped.class, event);
+ contextsService.startContext(RequestScoped.class, event);
// we don't initialise the Session here but do it lazily if it gets requested
// the first time. See OWB-457
@@ -146,7 +146,7 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq
if (webBeansContext instanceof WebappWebBeansContext) { // start before child
((WebappWebBeansContext) webBeansContext).getParent().getContextsService().startContext(SessionScoped.class, event.getSession());
}
- this.webBeansContext.getContextsService().startContext(SessionScoped.class, event.getSession());
+ contextsService.startContext(SessionScoped.class, event.getSession());
} catch (final Exception e) {
logger.error(OWBLogConst.ERROR_0020, event.getSession());
WebBeansUtil.throwRuntimeExceptions(e);
@@ -166,7 +166,7 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq
logger.debug("Destroying a session with session id : [{0}]", event.getSession().getId());
}
- webBeansContext.getContextsService().endContext(SessionScoped.class, event.getSession());
+ contextsService.endContext(SessionScoped.class, event.getSession());
WebBeansListenerHelper.destroyFakedRequest(this);
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/bdd8644b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java
index 657a394..f82b7bf 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpSessionImpl.java
@@ -102,7 +102,6 @@ public class HttpSessionImpl implements HttpSession {
}
}
- attributes.clear();
final SessionManager sessionManager = SystemInstance.get().getComponent(SessionManager.class);
if (sessionManager != null) {
sessionManager.removeSession(sessionId);
http://git-wip-us.apache.org/repos/asf/tomee/blob/bdd8644b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java
index 65e8c66..16277fb 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpServer.java
@@ -29,12 +29,6 @@ import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
import org.apache.openejb.util.OptionsLog;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -46,6 +40,12 @@ import java.net.URI;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
/**
* This is the main class for the web administration. It takes care of the
@@ -62,7 +62,7 @@ public class OpenEJBHttpServer implements HttpServer {
private boolean indent;
public OpenEJBHttpServer() {
- this(getHttpListenerRegistry());
+ this(null);
}
public static HttpListenerRegistry getHttpListenerRegistry() {
@@ -76,10 +76,11 @@ public class OpenEJBHttpServer implements HttpServer {
}
public OpenEJBHttpServer(final HttpListener listener) {
- this.listener = new OpenEJBHttpRegistry.ClassLoaderHttpListener(listener, ParentClassLoaderFinder.Helper.get());
if (SystemInstance.get().getComponent(SessionManager.class) == null) {
SystemInstance.get().setComponent(SessionManager.class, new SessionManager());
}
+ this.listener = new OpenEJBHttpRegistry.ClassLoaderHttpListener(
+ listener == null ? getHttpListenerRegistry() : listener, ParentClassLoaderFinder.Helper.get());
}
public static boolean isTextXml(final Map<String, String> headers) {
http://git-wip-us.apache.org/repos/asf/tomee/blob/bdd8644b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/session/SessionManager.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/session/SessionManager.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/session/SessionManager.java
index ad455b1..2284421 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/session/SessionManager.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/session/SessionManager.java
@@ -19,10 +19,11 @@ package org.apache.openejb.server.httpd.session;
import org.apache.openejb.core.WebContext;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.server.httpd.BeginWebBeansListener;
-import org.apache.openejb.server.httpd.HttpRequestImpl;
+import org.apache.openejb.server.httpd.EndWebBeansListener;
import org.apache.openejb.server.httpd.HttpSession;
import org.apache.openejb.util.DaemonThreadFactory;
import org.apache.openejb.util.Duration;
+import org.apache.webbeans.config.WebBeansContext;
import java.util.ArrayList;
import java.util.Collection;
@@ -43,16 +44,37 @@ public class SessionManager {
private static volatile ScheduledExecutorService es;
public void destroy(final WebContext app) {
+ if (app == null) {
+ return;
+ }
+
+ final WebBeansContext wbc = app.getWebBeansContext();
final Iterator<SessionWrapper> iterator = sessions.values().iterator();
while (iterator.hasNext()) {
final SessionWrapper next = iterator.next();
if (next.app == app) {
- next.session.invalidate();
+ doDestroy(next);
iterator.remove();
}
}
}
+ private void doDestroy(final SessionWrapper next) {
+ HttpSessionEvent event = null;
+ if (next.end != null) {
+ event = new HttpSessionEvent(next.session);
+ next.end.sessionDestroyed(event);
+ next.begin.sessionCreated(event); // just set session thread local
+ }
+ try {
+ next.session.invalidate();
+ } finally {
+ if (next.begin != null) {
+ next.begin.sessionDestroyed(event);
+ }
+ }
+ }
+
public void destroy() {
if (es == null) {
return;
@@ -69,7 +91,7 @@ public class SessionManager {
return;
}
final Duration duration = new Duration(SystemInstance.get().getProperty("openejb.http.eviction.duration", "1 minute"));
- es = Executors.newScheduledThreadPool(1, new DaemonThreadFactory(HttpRequestImpl.class));
+ es = Executors.newScheduledThreadPool(1, new DaemonThreadFactory(SessionManager.class));
es.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
@@ -77,12 +99,8 @@ public class SessionManager {
final HttpSession session = data.session;
if (session.getMaxInactiveInterval() > 0
&& session.getLastAccessedTime() + TimeUnit.SECONDS.toMillis(session.getMaxInactiveInterval()) < System.currentTimeMillis()) {
- sessions.remove(session.getId());
- session.invalidate();
-
- if (data.listener != null) {
- data.listener.sessionDestroyed(new HttpSessionEvent(session));
- }
+ doDestroy(data);
+ sessions.remove(data.session.getId());
}
}
}
@@ -105,8 +123,10 @@ public class SessionManager {
return sessions.size();
}
- public SessionWrapper newSession(final BeginWebBeansListener listener, final HttpSession session, final WebContext app) {
- final SessionWrapper existing = sessions.putIfAbsent(session.getId(), new SessionWrapper(listener, session, app));
+ public SessionWrapper newSession(final BeginWebBeansListener begin, final EndWebBeansListener end,
+ final HttpSession session, final WebContext app) {
+ final SessionWrapper wrapper = new SessionWrapper(begin, end, session, app);
+ final SessionWrapper existing = sessions.putIfAbsent(session.getId(), wrapper);
if (existing == null && es == null) {
synchronized (this) {
if (es == null) {
@@ -114,17 +134,19 @@ public class SessionManager {
}
}
}
- return existing;
+ return existing == null ? wrapper : existing;
}
public static class SessionWrapper extends HttpSessionEvent {
- public final BeginWebBeansListener listener;
+ public final BeginWebBeansListener begin;
+ public final EndWebBeansListener end;
public final HttpSession session;
public final WebContext app;
- public SessionWrapper(final BeginWebBeansListener listener, final HttpSession session, final WebContext app) {
+ public SessionWrapper(final BeginWebBeansListener begin, final EndWebBeansListener end, final HttpSession session, final WebContext app) {
super(session);
- this.listener = listener;
+ this.begin = begin;
+ this.end = end;
this.session = session;
this.app = app;
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/bdd8644b/tck/cdi-embedded/src/test/resources/failing.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-embedded/src/test/resources/failing.xml b/tck/cdi-embedded/src/test/resources/failing.xml
index bf0d833..3a10892 100644
--- a/tck/cdi-embedded/src/test/resources/failing.xml
+++ b/tck/cdi-embedded/src/test/resources/failing.xml
@@ -32,7 +32,7 @@
-Dopenejb.cdi.conversation.http.use-get-parameter=true
-->
<classes>
- <class name="org.jboss.cdi.tck.tests.lookup.injection.non.contextual.InjectionIntoNonContextualComponentTest" />
+ <class name="org.jboss.cdi.tck.tests.context.session.listener.shutdown.SessionContextListenerShutdownTest" />
</classes>
</test>
</suite>
[16/16] tomee git commit: TOMEE-1572 remove exclusions which are not
needed anymore
Posted by st...@apache.org.
TOMEE-1572 remove exclusions which are not needed anymore
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/58b9bc09
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/58b9bc09
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/58b9bc09
Branch: refs/heads/fb_tomee2_owb16
Commit: 58b9bc0930a0ac36a40c5a9fcf72fd7d69a9646d
Parents: b0f479f
Author: Mark Struberg <st...@apache.org>
Authored: Tue May 5 07:48:57 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Tue May 5 07:48:57 2015 +0200
----------------------------------------------------------------------
pom.xml | 12 ------------
1 file changed, 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/58b9bc09/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 0ab6965..5806c3d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1726,18 +1726,6 @@
<version>${org.apache.openwebbeans.version}</version>
<exclusions>
<exclusion>
- <groupId>javassist</groupId>
- <artifactId>javassist</artifactId>
- </exclusion>
- <exclusion>
- <groupId>net.sf.scannotation</groupId>
- <artifactId>scannotation</artifactId>
- </exclusion>
- <exclusion>
- <groupId>asm</groupId>
- <artifactId>asm</artifactId>
- </exclusion>
- <exclusion>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-finder-shaded</artifactId>
</exclusion>
[05/16] tomee git commit: TOMEE-1572 add docs to the cdi poms
Posted by st...@apache.org.
TOMEE-1572 add docs to the cdi poms
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/19599541
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/19599541
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/19599541
Branch: refs/heads/fb_tomee2_owb16
Commit: 195995419c087d1fb15552ce5af993abd697335a
Parents: dec1a0f
Author: Mark Struberg <st...@apache.org>
Authored: Mon May 4 18:52:33 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Mon May 4 18:52:33 2015 +0200
----------------------------------------------------------------------
tck/cdi-embedded/pom.xml | 2 +-
tck/cdi-tomee-embedded/pom.xml | 2 +-
tck/cdi-tomee/pom.xml | 4 ++++
3 files changed, 6 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/19599541/tck/cdi-embedded/pom.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-embedded/pom.xml b/tck/cdi-embedded/pom.xml
index 95f0b3e..20de463 100644
--- a/tck/cdi-embedded/pom.xml
+++ b/tck/cdi-embedded/pom.xml
@@ -208,7 +208,7 @@
<openejb.strict.interface.declaration>true</openejb.strict.interface.declaration>
<openejb.http.mock-request>true</openejb.http.mock-request>
<openejb.http.default-content-type>text/plain</openejb.http.default-content-type> <!-- TODO: remove it -->
- <openejb.http.eviction.duration>1 second</openejb.http.eviction.duration>
+ <openejb.http.eviction.duration>2 second</openejb.http.eviction.duration>
<openejb.embedded.try-jsp>true</openejb.embedded.try-jsp>
<openejb.deploymentId.format>{appId}/{ejbJarId}/{ejbName}</openejb.deploymentId.format>
<org.apache.openejb.assembler.classic.WebAppBuilder>org.apache.openejb.web.LightweightWebAppBuilder</org.apache.openejb.assembler.classic.WebAppBuilder>
http://git-wip-us.apache.org/repos/asf/tomee/blob/19599541/tck/cdi-tomee-embedded/pom.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-tomee-embedded/pom.xml b/tck/cdi-tomee-embedded/pom.xml
index d8319a5..b45864c 100644
--- a/tck/cdi-tomee-embedded/pom.xml
+++ b/tck/cdi-tomee-embedded/pom.xml
@@ -25,7 +25,7 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>cdi-tomee-embedded</artifactId>
<packaging>jar</packaging>
- <name>OpenEJB :: TCK :: CDI TomEE Embedded</name>
+ <name>OpenEJB :: TCK :: CDI-1.2 TomEE Embedded</name>
<dependencies>
<dependency>
<groupId>org.apache.openejb</groupId>
http://git-wip-us.apache.org/repos/asf/tomee/blob/19599541/tck/cdi-tomee/pom.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-tomee/pom.xml b/tck/cdi-tomee/pom.xml
index ba4345a..fae8ce7 100644
--- a/tck/cdi-tomee/pom.xml
+++ b/tck/cdi-tomee/pom.xml
@@ -27,6 +27,10 @@
<artifactId>cdi-tomee</artifactId>
<name>OpenEJB :: TCK :: CDI TomEE</name>
+ <!--
+ * debug the server side by adding -Dopenejb.server.debug=true
+ -->
+
<properties>
<suite.name>passing</suite.name>
<cdi-tck.version>1.2.4.Final</cdi-tck.version>
[06/16] tomee git commit: TOMEE-1570 adding logger name to openejb
log record
Posted by st...@apache.org.
TOMEE-1570 adding logger name to openejb log record
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/065fc36e
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/065fc36e
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/065fc36e
Branch: refs/heads/fb_tomee2_owb16
Commit: 065fc36e6ac49c5e712f4991c24745e95a088fb5
Parents: a629b80
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Thu Apr 30 10:59:00 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Mon May 4 19:00:19 2015 +0200
----------------------------------------------------------------------
.../src/main/java/org/apache/openejb/util/JuliLogStream.java | 1 +
1 file changed, 1 insertion(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/065fc36e/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStream.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStream.java b/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStream.java
index 75639a2..b99af1d 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStream.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStream.java
@@ -102,6 +102,7 @@ public class JuliLogStream implements LogStream {
if (t != null) {
logRecord.setThrown(t);
}
+ logRecord.setLoggerName(log.getName());
log.log(logRecord);
}
}
[08/16] tomee git commit: TOMEE-1568 support overriding of a failed
deployment in tomcat webappdeployer
Posted by st...@apache.org.
TOMEE-1568 support overriding of a failed deployment in tomcat webappdeployer
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/b7eb5b01
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/b7eb5b01
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/b7eb5b01
Branch: refs/heads/fb_tomee2_owb16
Commit: b7eb5b01b07c16efc79c076006b20a7e214eb39e
Parents: 1959954
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Wed Apr 29 22:59:17 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Mon May 4 19:00:19 2015 +0200
----------------------------------------------------------------------
.../org/apache/openejb/assembler/DeployerEjb.java | 7 +++++--
.../apache/tomee/catalina/TomcatWebAppBuilder.java | 17 ++++++++++++++---
2 files changed, 19 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/b7eb5b01/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java b/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java
index 908d14b..bc4d354 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java
@@ -176,8 +176,11 @@ public class DeployerEjb implements Deployer {
try {
final AppInfo appInfo = SystemInstance.get().getComponent(WebAppDeployer.class)
.deploy(host, contextRoot(properties, file.getAbsolutePath()), file);
- saveIfNeeded(properties, file, appInfo);
- return appInfo;
+ if (appInfo != null) {
+ saveIfNeeded(properties, file, appInfo);
+ return appInfo;
+ }
+ throw new OpenEJBException("can't deploy " + file.getAbsolutePath());
} finally {
AUTO_DEPLOY.remove();
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/b7eb5b01/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
index 24a31e0..2ef7d8c 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
@@ -466,7 +466,7 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare
}
}
- if (getContextInfo(webApp.host, webApp.contextRoot) != null) {
+ if (isAlreadyDeployed(webApp)) {
continue;
}
@@ -515,7 +515,7 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare
appParam.setValue(webApp.moduleId);
standardContext.addApplicationParameter(appParam);
- if (getContextInfo(webApp.host, webApp.contextRoot) == null) {
+ if (!isAlreadyDeployed(webApp)) {
if (standardContext.getPath() == null) {
if (webApp.contextRoot != null && webApp.contextRoot.startsWith("/")) {
standardContext.setPath(webApp.contextRoot);
@@ -542,7 +542,7 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare
webApp.contextRoot = "";
}
- if (getContextInfo(webApp.host, webApp.contextRoot) != null) { // possible because of the previous renaming
+ if (isAlreadyDeployed(webApp)) { // possible because of the previous renaming
continue;
}
@@ -580,6 +580,17 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare
}
}
+ private boolean isAlreadyDeployed(final WebAppInfo webApp) {
+ final ContextInfo contextInfo = getContextInfo(webApp.host, webApp.contextRoot);
+ if (contextInfo != null && contextInfo.standardContext != null && contextInfo.standardContext.getState() == LifecycleState.FAILED) {
+ synchronized (this) {
+ infos.remove(getId(webApp.host, webApp.contextRoot));
+ }
+ return false;
+ }
+ return contextInfo != null;
+ }
+
private static boolean isParent(final ClassLoader parent, final ClassLoader child) {
ClassLoader current = child;
while (current != null) {