This is an automated email from the ASF dual-hosted git repository. rmannibucau pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/openwebbeans.git
The following commit(s) were added to refs/heads/master by this push: new 8442117 OWB-1296 ensure OWB can start in a SCI instead of a servlet context listener 8442117 is described below commit 844211708106e20f34baee7505de1903a1eae1a0 Author: Romain Manni-Bucau <rmannibu...@gmail.com> AuthorDate: Thu Aug 1 11:04:08 2019 +0200 OWB-1296 ensure OWB can start in a SCI instead of a servlet context listener --- .../servlet/WebBeansConfigurationListener.java | 58 ++++++++++++++----- .../javax.servlet.ServletContainerInitializer | 17 ++++++ .../java/WebBeansConfigurationListenerTest.java | 66 ++++++++++++++++++++++ .../lifeycle/SingleStartContainerLifecycle.java | 34 +++++++++++ .../webbeans/web/tests/scanner/EmptyScanner.java | 35 ++++++++++++ 5 files changed, 196 insertions(+), 14 deletions(-) diff --git a/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java b/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java index 6cb451b..b6d56d6 100644 --- a/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java +++ b/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java @@ -30,12 +30,16 @@ import org.apache.webbeans.web.util.ServletCompatibilityUtil; import javax.enterprise.context.RequestScoped; import javax.enterprise.context.SessionScoped; import javax.enterprise.context.spi.Context; +import javax.servlet.ServletContainerInitializer; +import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; + +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -78,20 +82,7 @@ public class WebBeansConfigurationListener implements ServletContextListener, Se @Override public void contextInitialized(ServletContextEvent event) { - this.lifeCycle = webBeansContext.getService(ContainerLifecycle.class); - - try - { - this.lifeCycle.startApplication(event); - } - catch (Exception e) - { - logger.log(Level.SEVERE, - WebBeansLoggerFacade.constructMessage( - OWBLogConst.ERROR_0018, - ServletCompatibilityUtil.getServletInfo(event.getServletContext()))); - WebBeansUtil.throwRuntimeExceptions(e); - } + doStart(event); } @@ -202,6 +193,30 @@ public class WebBeansConfigurationListener implements ServletContextListener, Se } } + private void doStart(final ServletContextEvent event) + { + if (event.getServletContext().getAttribute(getClass().getName()) != null) + { + return; + } + + this.lifeCycle = webBeansContext.getService(ContainerLifecycle.class); + + try + { + this.lifeCycle.startApplication(event); + event.getServletContext().setAttribute(getClass().getName(), true); + } + catch (Exception e) + { + logger.log(Level.SEVERE, + WebBeansLoggerFacade.constructMessage( + OWBLogConst.ERROR_0018, + ServletCompatibilityUtil.getServletInfo(event.getServletContext()))); + WebBeansUtil.throwRuntimeExceptions(e); + } + } + private boolean ensureRequestScope() { Context context = this.lifeCycle.getContextService().getCurrentContext(RequestScoped.class); @@ -226,4 +241,19 @@ public class WebBeansConfigurationListener implements ServletContextListener, Se } } + public static class Auto implements ServletContainerInitializer + { + @Override + public void onStartup(final Set<Class<?>> set, final ServletContext servletContext) + { + final String key = "openwebbeans.web.sci.active"; + if (!Boolean.parseBoolean(System.getProperty(key, servletContext.getInitParameter(key)))) + { + return; + } + final WebBeansConfigurationListener listener = new WebBeansConfigurationListener(); + listener.doStart(new ServletContextEvent(servletContext)); + servletContext.addListener(listener); + } + } } diff --git a/webbeans-web/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer b/webbeans-web/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer new file mode 100644 index 0000000..b203f88 --- /dev/null +++ b/webbeans-web/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer @@ -0,0 +1,17 @@ +#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. +org.apache.webbeans.servlet.WebBeansConfigurationListener$Auto diff --git a/webbeans-web/src/test/java/WebBeansConfigurationListenerTest.java b/webbeans-web/src/test/java/WebBeansConfigurationListenerTest.java new file mode 100644 index 0000000..e8d54fd --- /dev/null +++ b/webbeans-web/src/test/java/WebBeansConfigurationListenerTest.java @@ -0,0 +1,66 @@ +/* + * 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. + */ + +import static java.util.Collections.emptySet; +import static org.apache.webbeans.util.Asserts.assertNotNull; + +import java.util.EventListener; +import java.util.concurrent.atomic.AtomicReference; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.apache.webbeans.servlet.WebBeansConfigurationListener; +import org.apache.webbeans.spi.ContainerLifecycle; +import org.apache.webbeans.spi.ScannerService; +import org.apache.webbeans.web.lifecycle.test.MockServletContext; +import org.apache.webbeans.web.tests.lifeycle.SingleStartContainerLifecycle; +import org.apache.webbeans.web.tests.scanner.EmptyScanner; +import org.junit.Test; + +public class WebBeansConfigurationListenerTest +{ + @Test + public void avoidDoubleInitWithSci() + { + final WebBeansConfigurationListener.Auto auto = new WebBeansConfigurationListener.Auto(); + final AtomicReference<ServletContextListener> listener = new AtomicReference<>(); + final MockServletContext context = new MockServletContext() + { + @Override + public <T extends EventListener> void addListener(final T t) + { + listener.set(ServletContextListener.class.cast(t)); + } + }; + context.setAttribute("openwebbeans.web.sci.active", "true"); + System.setProperty(ScannerService.class.getName(), EmptyScanner.class.getName()); + System.setProperty(ContainerLifecycle.class.getName(), SingleStartContainerLifecycle.class.getName()); + auto.onStartup(emptySet(), context); + System.clearProperty(ScannerService.class.getName()); + System.clearProperty(ContainerLifecycle.class.getName()); + + final ServletContextListener wbcl = listener.get(); + assertNotNull(wbcl); + + final ServletContextEvent event = new ServletContextEvent(context); + wbcl.contextInitialized(event); + wbcl.contextDestroyed(event); + } +} diff --git a/webbeans-web/src/test/java/org/apache/webbeans/web/tests/lifeycle/SingleStartContainerLifecycle.java b/webbeans-web/src/test/java/org/apache/webbeans/web/tests/lifeycle/SingleStartContainerLifecycle.java new file mode 100644 index 0000000..d5f40f1 --- /dev/null +++ b/webbeans-web/src/test/java/org/apache/webbeans/web/tests/lifeycle/SingleStartContainerLifecycle.java @@ -0,0 +1,34 @@ +/* + * 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.webbeans.web.tests.lifeycle; + +import org.apache.webbeans.web.lifecycle.WebContainerLifecycle; + +public class SingleStartContainerLifecycle extends WebContainerLifecycle +{ + @Override + public void startApplication(final Object startupObject) + { + if (started.get()) + { + throw new IllegalStateException("already started"); + } + super.startApplication(startupObject); + } +} diff --git a/webbeans-web/src/test/java/org/apache/webbeans/web/tests/scanner/EmptyScanner.java b/webbeans-web/src/test/java/org/apache/webbeans/web/tests/scanner/EmptyScanner.java new file mode 100644 index 0000000..504b9bf --- /dev/null +++ b/webbeans-web/src/test/java/org/apache/webbeans/web/tests/scanner/EmptyScanner.java @@ -0,0 +1,35 @@ +/* + * 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.webbeans.web.tests.scanner; + +import org.apache.webbeans.web.scanner.WebScannerService; + +public class EmptyScanner extends WebScannerService { + @Override + protected void addWarBeansArchive() + { + // no-op + } + + @Override + protected void registerBeanArchives(final ClassLoader loader) + { + // no-op + } +}