This is an automated email from the ASF dual-hosted git repository. juanpablo pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/jspwiki.git
commit cd85300b4dbf3e28631ce55bdd1a3898cbf2e41f Author: juanpablo <[email protected]> AuthorDate: Fri Mar 27 15:56:00 2020 +0100 refactor SPI's DSL: * locate appropiate SPI implementation before application start, via WikiSPIServletContextListener * move engine(..) related methods to its own class; each SPI will be accesed through its own class DSL, i,e instead of Wiki.engine(..) we now have Wiki.engine().find(..) * propagate this changes --- .../java/org/apache/wiki/api/spi/EngineDSL.java | 68 ++++++++++++++++++++++ .../main/java/org/apache/wiki/api/spi/Wiki.java | 32 +++------- .../api/spi/WikiSPIServletContextListener.java | 20 +++++++ .../src/main/webapp/WEB-INF/web.xml | 5 ++ .../src/main/webapp/WEB-INF/web.xml | 5 ++ .../src/main/webapp/WEB-INF/web.xml | 5 ++ .../src/main/webapp/WEB-INF/web.xml | 5 ++ .../src/main/webapp/WEB-INF/web.xml | 5 ++ .../src/main/java/org/apache/wiki/WikiServlet.java | 2 +- .../wiki/ajax/WikiAjaxDispatcherServlet.java | 2 +- jspwiki-main/src/test/resources/WEB-INF/web.xml | 5 ++ jspwiki-war/src/main/webapp/WEB-INF/web.xml | 5 ++ 12 files changed, 133 insertions(+), 26 deletions(-) diff --git a/jspwiki-api/src/main/java/org/apache/wiki/api/spi/EngineDSL.java b/jspwiki-api/src/main/java/org/apache/wiki/api/spi/EngineDSL.java new file mode 100644 index 0000000..59e496e --- /dev/null +++ b/jspwiki-api/src/main/java/org/apache/wiki/api/spi/EngineDSL.java @@ -0,0 +1,68 @@ +/* + 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.wiki.api.spi; + +import org.apache.wiki.api.core.Engine; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import java.util.Properties; + + +public class EngineDSL { + + private final EngineSPI engineSPI; + + EngineDSL( final EngineSPI engineSPI ) { + this.engineSPI = engineSPI; + } + + /** + * Locate, or build if necessary, a configured {@link Engine} instance. + * + * @param config servlet config holding the {@link Engine} instance. + * @return a configured {@link Engine} instance. + */ + public Engine find( final ServletConfig config ) { + return find( config.getServletContext(), null ); + } + + /** + * Locate, or build if necessary, a configured {@link Engine} instance. + * + * @param config servlet config holding the {@link Engine} instance. + * @param props Engine configuration properties. + * @return a configured {@link Engine} instance. + */ + public Engine find( final ServletConfig config, final Properties props ) { + return find( config.getServletContext(), props ); + } + + /** + * Locate, or build if necessary, a configured {@link Engine} instance. + * + * @param context servlet context holding the {@link Engine} instance. + * @param props Engine configuration properties. + * @return a configured {@link Engine} instance. + */ + public Engine find( final ServletContext context, final Properties props ) { + return engineSPI.getInstance( context, props ); + } + +} diff --git a/jspwiki-api/src/main/java/org/apache/wiki/api/spi/Wiki.java b/jspwiki-api/src/main/java/org/apache/wiki/api/spi/Wiki.java index f986dc7..7d22fd2 100644 --- a/jspwiki-api/src/main/java/org/apache/wiki/api/spi/Wiki.java +++ b/jspwiki-api/src/main/java/org/apache/wiki/api/spi/Wiki.java @@ -18,11 +18,9 @@ */ package org.apache.wiki.api.spi; -import org.apache.wiki.api.core.Engine; import org.apache.wiki.util.PropertyReader; import org.apache.wiki.util.TextUtil; -import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import java.nio.file.ProviderNotFoundException; import java.util.Properties; @@ -31,32 +29,18 @@ import java.util.ServiceLoader; public class Wiki { - private static final String ATTR_ENGINE_SPI = "org.apache.wiki.api.core.Engine"; - private static final String PROP_ENGINE_PROVIDER_IMPL = "jspwiki.provider.impl.engine"; - private static final String DEFAULT_ENGINE_PROVIDER_IMPL = "org.apache.wiki.spi.EngineSPIDefaultImpl"; + private static final String PROP_PROVIDER_IMPL_ENGINE = "jspwiki.provider.impl.engine"; + private static final String DEFAULT_PROVIDER_IMPL_ENGINE = "org.apache.wiki.spi.EngineSPIDefaultImpl"; - public static Engine engine( final ServletConfig config ) { - return engine( config.getServletContext(), null ); - } + private static EngineSPI engineSPI; - public static Engine engine( final ServletConfig config, final Properties props ) { - return engine( config.getServletContext(), props ); + static void init( final ServletContext context ) { + final Properties properties = PropertyReader.loadWebAppProps( context ); + engineSPI = getSPI( EngineSPI.class, properties, PROP_PROVIDER_IMPL_ENGINE, DEFAULT_PROVIDER_IMPL_ENGINE ); } - public static Engine engine( final ServletContext context, final Properties props ) { - final Engine engine = ( Engine )context.getAttribute( ATTR_ENGINE_SPI ); - if( engine == null ) { - final Properties properties = loadPropertiesFrom( context, props ); - return getSPI( EngineSPI.class, properties, PROP_ENGINE_PROVIDER_IMPL, DEFAULT_ENGINE_PROVIDER_IMPL ).getInstance( context, props ); - } - return engine; - } - - static Properties loadPropertiesFrom( final ServletContext context, final Properties props ) { - if( props == null ) { - return PropertyReader.loadWebAppProps( context ); - } - return props; + public static EngineDSL engine() { + return new EngineDSL( engineSPI ); } static < SPI > SPI getSPI( final Class< SPI > spi, final Properties props, final String prop, final String defValue ) { diff --git a/jspwiki-api/src/main/java/org/apache/wiki/api/spi/WikiSPIServletContextListener.java b/jspwiki-api/src/main/java/org/apache/wiki/api/spi/WikiSPIServletContextListener.java new file mode 100644 index 0000000..233aac9 --- /dev/null +++ b/jspwiki-api/src/main/java/org/apache/wiki/api/spi/WikiSPIServletContextListener.java @@ -0,0 +1,20 @@ +package org.apache.wiki.api.spi; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + + +public class WikiSPIServletContextListener implements ServletContextListener { + + /** {@inheritDoc} */ + @Override + public void contextInitialized( final ServletContextEvent sce ) { + Wiki.init( sce.getServletContext() ); + } + + /** {@inheritDoc} */ + @Override + public void contextDestroyed( final ServletContextEvent sce ) { + } + +} diff --git a/jspwiki-it-tests/jspwiki-it-test-cma-jdbc/src/main/webapp/WEB-INF/web.xml b/jspwiki-it-tests/jspwiki-it-test-cma-jdbc/src/main/webapp/WEB-INF/web.xml index 80bec26..f16ef3f 100644 --- a/jspwiki-it-tests/jspwiki-it-test-cma-jdbc/src/main/webapp/WEB-INF/web.xml +++ b/jspwiki-it-tests/jspwiki-it-test-cma-jdbc/src/main/webapp/WEB-INF/web.xml @@ -100,6 +100,11 @@ <listener-class>org.apache.wiki.auth.SessionMonitor</listener-class> </listener> + <!-- servlet context listener to configure API's SPI --> + <listener> + <listener-class>org.apache.wiki.api.spi.WikiSPIServletContextListener</listener-class> + </listener> + <!-- Now, let's define the XML-RPC interfaces. You probably don't have to touch these. diff --git a/jspwiki-it-tests/jspwiki-it-test-cma/src/main/webapp/WEB-INF/web.xml b/jspwiki-it-tests/jspwiki-it-test-cma/src/main/webapp/WEB-INF/web.xml index 70acd52..8374872 100644 --- a/jspwiki-it-tests/jspwiki-it-test-cma/src/main/webapp/WEB-INF/web.xml +++ b/jspwiki-it-tests/jspwiki-it-test-cma/src/main/webapp/WEB-INF/web.xml @@ -100,6 +100,11 @@ <listener-class>org.apache.wiki.auth.SessionMonitor</listener-class> </listener> + <!-- servlet context listener to configure API's SPI --> + <listener> + <listener-class>org.apache.wiki.api.spi.WikiSPIServletContextListener</listener-class> + </listener> + <!-- Now, let's define the XML-RPC interfaces. You probably don't have to touch these. diff --git a/jspwiki-it-tests/jspwiki-it-test-custom-absolute-urls/src/main/webapp/WEB-INF/web.xml b/jspwiki-it-tests/jspwiki-it-test-custom-absolute-urls/src/main/webapp/WEB-INF/web.xml index ea15081..f4bb5c1 100644 --- a/jspwiki-it-tests/jspwiki-it-test-custom-absolute-urls/src/main/webapp/WEB-INF/web.xml +++ b/jspwiki-it-tests/jspwiki-it-test-custom-absolute-urls/src/main/webapp/WEB-INF/web.xml @@ -100,6 +100,11 @@ <listener-class>org.apache.wiki.auth.SessionMonitor</listener-class> </listener> + <!-- servlet context listener to configure API's SPI --> + <listener> + <listener-class>org.apache.wiki.api.spi.WikiSPIServletContextListener</listener-class> + </listener> + <!-- Now, let's define the XML-RPC interfaces. You probably don't have to touch these. diff --git a/jspwiki-it-tests/jspwiki-it-test-custom-jdbc/src/main/webapp/WEB-INF/web.xml b/jspwiki-it-tests/jspwiki-it-test-custom-jdbc/src/main/webapp/WEB-INF/web.xml index ea15081..f4bb5c1 100644 --- a/jspwiki-it-tests/jspwiki-it-test-custom-jdbc/src/main/webapp/WEB-INF/web.xml +++ b/jspwiki-it-tests/jspwiki-it-test-custom-jdbc/src/main/webapp/WEB-INF/web.xml @@ -100,6 +100,11 @@ <listener-class>org.apache.wiki.auth.SessionMonitor</listener-class> </listener> + <!-- servlet context listener to configure API's SPI --> + <listener> + <listener-class>org.apache.wiki.api.spi.WikiSPIServletContextListener</listener-class> + </listener> + <!-- Now, let's define the XML-RPC interfaces. You probably don't have to touch these. diff --git a/jspwiki-it-tests/jspwiki-it-test-custom/src/main/webapp/WEB-INF/web.xml b/jspwiki-it-tests/jspwiki-it-test-custom/src/main/webapp/WEB-INF/web.xml index ea15081..f4bb5c1 100644 --- a/jspwiki-it-tests/jspwiki-it-test-custom/src/main/webapp/WEB-INF/web.xml +++ b/jspwiki-it-tests/jspwiki-it-test-custom/src/main/webapp/WEB-INF/web.xml @@ -100,6 +100,11 @@ <listener-class>org.apache.wiki.auth.SessionMonitor</listener-class> </listener> + <!-- servlet context listener to configure API's SPI --> + <listener> + <listener-class>org.apache.wiki.api.spi.WikiSPIServletContextListener</listener-class> + </listener> + <!-- Now, let's define the XML-RPC interfaces. You probably don't have to touch these. diff --git a/jspwiki-main/src/main/java/org/apache/wiki/WikiServlet.java b/jspwiki-main/src/main/java/org/apache/wiki/WikiServlet.java index 98e5ac6..7cc472f 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/WikiServlet.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/WikiServlet.java @@ -51,7 +51,7 @@ public class WikiServlet extends HttpServlet { @Override public void init( final ServletConfig config ) throws ServletException { super.init( config ); - m_engine = Wiki.engine( config ); + m_engine = Wiki.engine().find( config ); log.info( "WikiServlet initialized." ); } diff --git a/jspwiki-main/src/main/java/org/apache/wiki/ajax/WikiAjaxDispatcherServlet.java b/jspwiki-main/src/main/java/org/apache/wiki/ajax/WikiAjaxDispatcherServlet.java index 97645ec..e1bce1a 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/ajax/WikiAjaxDispatcherServlet.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/ajax/WikiAjaxDispatcherServlet.java @@ -65,7 +65,7 @@ public class WikiAjaxDispatcherServlet extends HttpServlet { @Override public void init( final ServletConfig config ) throws ServletException { super.init( config ); - m_engine = Wiki.engine( config ); + m_engine = Wiki.engine().find( config ); PATH_AJAX = "/" + TextUtil.getStringProperty( m_engine.getWikiProperties(), "jspwiki.ajax.url.prefix", "ajax" ) + "/"; log.info( "WikiAjaxDispatcherServlet initialized." ); } diff --git a/jspwiki-main/src/test/resources/WEB-INF/web.xml b/jspwiki-main/src/test/resources/WEB-INF/web.xml index dcc7e9c..e41a3fe 100644 --- a/jspwiki-main/src/test/resources/WEB-INF/web.xml +++ b/jspwiki-main/src/test/resources/WEB-INF/web.xml @@ -101,6 +101,11 @@ <listener-class>org.apache.wiki.auth.SessionMonitor</listener-class> </listener> + <!-- servlet context listener to configure API's SPI --> + <listener> + <listener-class>org.apache.wiki.api.spi.WikiSPIServletContextListener</listener-class> + </listener> + <!-- Now, let's define the XML-RPC interfaces. You probably don't have to touch these. diff --git a/jspwiki-war/src/main/webapp/WEB-INF/web.xml b/jspwiki-war/src/main/webapp/WEB-INF/web.xml index 3fcce8b..fc19f4e 100644 --- a/jspwiki-war/src/main/webapp/WEB-INF/web.xml +++ b/jspwiki-war/src/main/webapp/WEB-INF/web.xml @@ -94,6 +94,11 @@ <listener-class>org.apache.wiki.auth.SessionMonitor</listener-class> </listener> + <!-- servlet context listener to configure API's SPI --> + <listener> + <listener-class>org.apache.wiki.api.spi.WikiSPIServletContextListener</listener-class> + </listener> + <!-- Now, let's define the XML-RPC interfaces. You probably don't have to touch these.
