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.

Reply via email to