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
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 @@
 
 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;
+
+    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 ServletConfig config, final Properties props ) {
-        return engine( config.getServletContext(), props );
-    }
-
-    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 @@
     @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 @@
     @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.