This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 95a4d90ce463a9220e921c376aef7d6521498736
Author: Nikita Timofeev <[email protected]>
AuthorDate: Mon Jul 11 19:19:59 2022 +0300

    CAY-2737 Cayenne 4.3: cleanup deprecated code
      - remove cayenne-web module
---
 assembly/pom.xml                                   |   6 -
 .../assemblies/generic/assembly-generic.xml        |   1 -
 .../main/resources/assemblies/mac/assembly-mac.xml |   1 -
 .../assemblies/windows/assembly-windows.xml        |   1 -
 cayenne-web/pom.xml                                |  93 -------
 .../cayenne/configuration/web/CayenneFilter.java   | 133 ----------
 .../cayenne/configuration/web/RequestHandler.java  |  35 ---
 .../web/SessionContextRequestHandler.java          |  88 -------
 .../web/StatelessContextRequestHandler.java        |  73 ------
 .../configuration/web/WebConfiguration.java        | 205 ---------------
 .../cayenne/configuration/web/WebModule.java       |  35 ---
 .../configuration/web/WebServerModuleProvider.java |  43 ----
 .../apache/cayenne/configuration/web/WebUtil.java  |  54 ----
 ...onfiguration.server.CayenneServerModuleProvider |  20 --
 .../configuration/web/CayenneFilterTest.java       | 227 ----------------
 .../web/CayenneFilter_DispatchModule.java          |  29 ---
 .../web/CayenneFilter_DispatchRequestHandler.java  |  45 ----
 .../cayenne/configuration/web/MockModule1.java     |  30 ---
 .../cayenne/configuration/web/MockModule2.java     |  31 ---
 .../configuration/web/MockRequestHandler.java      |  33 ---
 .../web/ServletContextHandlerTest.java             | 124 ---------
 .../configuration/web/WebConfigurationTest.java    | 214 ---------------
 .../configuration/web/WebModuleProviderTest.java   |  30 ---
 .../cayenne/configuration/web/WebModuleTest.java   |  40 ---
 .../cayenne/configuration/web/WebUtilTest.java     |  50 ----
 .../src/docs/asciidoc/_cayenne-guide/part5.adoc    |   2 -
 .../asciidoc/_cayenne-guide/part5/cayenneWeb.adoc  |  40 ---
 .../asciidoc/_getting-started-guide/webapp.adoc    | 286 ---------------------
 .../src/docs/asciidoc/getting-started-guide.adoc   |   2 -
 pom.xml                                            |   1 -
 tutorials/tutorial/pom.xml                         |   5 -
 tutorials/tutorial/src/main/webapp/WEB-INF/web.xml |  41 ---
 tutorials/tutorial/src/main/webapp/detail.jsp      |  89 -------
 tutorials/tutorial/src/main/webapp/index.jsp       |  53 ----
 34 files changed, 2160 deletions(-)

diff --git a/assembly/pom.xml b/assembly/pom.xml
index a2d48216d..8432e231b 100644
--- a/assembly/pom.xml
+++ b/assembly/pom.xml
@@ -118,12 +118,6 @@
                        <version>${project.version}</version>
                </dependency>
 
-               <dependency>
-                       <groupId>org.apache.cayenne</groupId>
-                       <artifactId>cayenne-web</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
-
                <dependency>
                        <groupId>org.apache.cayenne</groupId>
                        <artifactId>cayenne-osgi</artifactId>
diff --git 
a/assembly/src/main/resources/assemblies/generic/assembly-generic.xml 
b/assembly/src/main/resources/assemblies/generic/assembly-generic.xml
index 126e019a3..000d197d7 100644
--- a/assembly/src/main/resources/assemblies/generic/assembly-generic.xml
+++ b/assembly/src/main/resources/assemblies/generic/assembly-generic.xml
@@ -81,7 +81,6 @@
                                
<include>org.apache.cayenne:cayenne-project-compatibility</include>
                                
<include>org.apache.cayenne:cayenne-server</include>
                                
<include>org.apache.cayenne:cayenne-velocity</include>
-                               
<include>org.apache.cayenne:cayenne-web</include>
                        </includes>
                </dependencySet>
                <dependencySet>
diff --git a/assembly/src/main/resources/assemblies/mac/assembly-mac.xml 
b/assembly/src/main/resources/assemblies/mac/assembly-mac.xml
index 047861d71..519cfbb40 100644
--- a/assembly/src/main/resources/assemblies/mac/assembly-mac.xml
+++ b/assembly/src/main/resources/assemblies/mac/assembly-mac.xml
@@ -79,7 +79,6 @@
                                
<include>org.apache.cayenne:cayenne-project-compatibility</include>
                                
<include>org.apache.cayenne:cayenne-server</include>
                                
<include>org.apache.cayenne:cayenne-velocity</include>
-                               
<include>org.apache.cayenne:cayenne-web</include>
                        </includes>
                </dependencySet>
                <dependencySet>
diff --git 
a/assembly/src/main/resources/assemblies/windows/assembly-windows.xml 
b/assembly/src/main/resources/assemblies/windows/assembly-windows.xml
index 460ba7500..ea769e6a8 100644
--- a/assembly/src/main/resources/assemblies/windows/assembly-windows.xml
+++ b/assembly/src/main/resources/assemblies/windows/assembly-windows.xml
@@ -79,7 +79,6 @@
                                
<include>org.apache.cayenne:cayenne-project-compatibility</include>
                                
<include>org.apache.cayenne:cayenne-server</include>
                                
<include>org.apache.cayenne:cayenne-velocity</include>
-                               
<include>org.apache.cayenne:cayenne-web</include>
                        </includes>
                </dependencySet>
                <dependencySet>
diff --git a/cayenne-web/pom.xml b/cayenne-web/pom.xml
deleted file mode 100644
index 60c9d31cc..000000000
--- a/cayenne-web/pom.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-       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
-
-       https://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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
-    <parent>
-        <artifactId>cayenne-parent</artifactId>
-        <groupId>org.apache.cayenne</groupId>
-        <version>4.3.M1-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>cayenne-web</artifactId>
-    <name>cayenne-web: Cayenne Web Extensions</name>
-    <packaging>jar</packaging>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.cayenne</groupId>
-            <artifactId>cayenne-server</artifactId>
-            <version>${project.version}</version>
-            <scope>compile</scope>
-        </dependency>
-
-        <!-- Optional dependencies... things that might have been placed in 
submodules... -->
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>servlet-api</artifactId>
-            <scope>provided</scope>
-            <optional>true</optional>
-        </dependency>
-
-        <!-- Test dependencies -->
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.mockrunner</groupId>
-            <artifactId>mockrunner-servlet</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-simple</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cayenne</groupId>
-            <artifactId>cayenne-server</artifactId>
-            <version>${project.version}</version>
-            <type>test-jar</type>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <!-- This ensures LICENSE and NOTICE inclusion in all jars -->
-            <plugin>
-                <artifactId>maven-remote-resources-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>process</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
\ No newline at end of file
diff --git 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/CayenneFilter.java
 
b/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/CayenneFilter.java
deleted file mode 100644
index 8cf2e6a48..000000000
--- 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/CayenneFilter.java
+++ /dev/null
@@ -1,133 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import org.apache.cayenne.configuration.CayenneRuntime;
-import org.apache.cayenne.configuration.server.ServerModule;
-import org.apache.cayenne.configuration.server.ServerRuntime;
-import org.apache.cayenne.di.Module;
-
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-
-/**
- * A filter that creates a Cayenne server runtime, possibly including custom 
modules. By
- * default runtime includes {@link ServerModule}. Any custom modules
- * are loaded after the two standard ones to allow custom service overrides. 
Filter
- * initialization parameters:
- * <ul>
- * <li>configuration-location - (optional) a name of Cayenne configuration XML 
file that
- * will be used to load Cayenne stack. If missing, the filter name will be 
used to derive
- * the location. ".xml" extension will be appended to the filter name to get 
the location,
- * so a filter named "cayenne-foo" will result in location "cayenne-foo.xml".
- * <li>extra-modules - (optional) a comma or space-separated list of class 
names, with
- * each class implementing {@link Module} interface. These are the custom 
modules loaded
- * after the two standard ones that allow users to override any Cayenne 
runtime aspects,
- * e.g. {@link RequestHandler}. Each custom module must have a no-arg 
constructor.
- * </ul>
- * <p>
- * CayenneFilter is a great utility to quickly start a Cayenne application. 
More advanced
- * apps most likely will not use it, relying on their own configuration 
mechanism (such as
- * Guice, Spring, etc.)
- * 
- * @since 3.1
- */
-public class CayenneFilter implements Filter {
-
-    protected ServletContext servletContext;
-
-    @Override
-    public void init(FilterConfig config) throws ServletException {
-
-        checkAlreadyConfigured(config.getServletContext());
-
-        this.servletContext = config.getServletContext();
-
-        WebConfiguration configAdapter = new WebConfiguration(config);
-
-        String configurationLocation = 
configAdapter.getConfigurationLocation();
-        String[] configurationLocations = null;
-        if (configurationLocation != null) {
-               configurationLocations = configurationLocation.split(",\\s*");
-        }
-        Collection<Module> modules = configAdapter.createModules();
-        modules.addAll(getAdditionalModules());
-
-        String dataDomainName = configAdapter.getDataDomainName();
-        
-        ServerRuntime runtime = ServerRuntime.builder(dataDomainName)
-                .addConfigs(configurationLocations)
-                .addModules(modules).build();
-
-        WebUtil.setCayenneRuntime(config.getServletContext(), runtime);
-    }
-
-    /**
-     * Subclasses may override this to specify additional modules that should 
be included when creating the CayenneRuntime
-     * (in addition to those specified in the web.xml file).
-     *
-     * @since 4.0
-     */
-    protected Collection<Module> getAdditionalModules() {
-               return new ArrayList<>();
-       }
-
-    protected void checkAlreadyConfigured(ServletContext context) throws 
ServletException {
-        // sanity check
-        if (WebUtil.getCayenneRuntime(context) != null) {
-            throw new ServletException(
-                    "CayenneRuntime is already configured in the servlet 
environment");
-        }
-    }
-
-    @Override
-    public void destroy() {
-        CayenneRuntime runtime = WebUtil.getCayenneRuntime(servletContext);
-
-        if (runtime != null) {
-            runtime.shutdown();
-        }
-    }
-
-    @Override
-    public void doFilter(
-            ServletRequest request,
-            ServletResponse response,
-            FilterChain chain) throws IOException, ServletException {
-
-        CayenneRuntime runtime = WebUtil.getCayenneRuntime(servletContext);
-        RequestHandler handler = 
runtime.getInjector().getInstance(RequestHandler.class);
-
-        handler.requestStart(request, response);
-        try {
-            chain.doFilter(request, response);
-        }
-        finally {
-            handler.requestEnd(request, response);
-        }
-    }
-}
diff --git 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/RequestHandler.java
 
b/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/RequestHandler.java
deleted file mode 100644
index 680abc52d..000000000
--- 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/RequestHandler.java
+++ /dev/null
@@ -1,35 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-/**
- * A service invoked by {@link CayenneFilter} that provides a callback 
mechanism to bind
- * appropriate ObjectContext to the request thread, handle transactions, etc.
- * 
- * @since 3.1
- */
-public interface RequestHandler {
-
-    void requestStart(ServletRequest request, ServletResponse response);
-
-    void requestEnd(ServletRequest request, ServletResponse response);
-}
diff --git 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/SessionContextRequestHandler.java
 
b/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/SessionContextRequestHandler.java
deleted file mode 100644
index b04cb70c4..000000000
--- 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/SessionContextRequestHandler.java
+++ /dev/null
@@ -1,88 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
-import org.apache.cayenne.BaseContext;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.configuration.CayenneRuntime;
-import org.apache.cayenne.configuration.ObjectContextFactory;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.di.Injector;
-
-/**
- * Default implementation of the {@link RequestHandler} that stores per-user
- * {@link ObjectContext} in a web session and binds it to request thread. Note 
that using
- * this handler would force {@link HttpSession} creation, that may not be 
desirable in
- * many cases. Also session-bound context may result in a race condition with 
two user
- * requests updating the same persistent objects in parallel.
- * <p>
- * User applications in most cases should provide a custom RequestHandler that 
implements
- * a smarter app-specific strategy for providing ObjectContext.
- * <p>
- * For stateless (per request) context creation use {@link 
StatelessContextRequestHandler}.
- * 
- * @since 3.1
- */
-public class SessionContextRequestHandler implements RequestHandler {
-
-    static final String SESSION_CONTEXT_KEY = 
SessionContextRequestHandler.class
-            .getName()
-            + ".SESSION_CONTEXT";
-
-    // using injector to lookup services instead of injecting them directly 
for lazy
-    // startup and "late binding"
-    @Inject
-    private Injector injector;
-
-    public void requestStart(ServletRequest request, ServletResponse response) 
{
-
-        CayenneRuntime.bindThreadInjector(injector);
-
-        if (request instanceof HttpServletRequest) {
-
-            // this forces session creation if it does not exist yet
-            HttpSession session = ((HttpServletRequest) request).getSession();
-
-            ObjectContext context;
-            synchronized (session) {
-                context = (ObjectContext) 
session.getAttribute(SESSION_CONTEXT_KEY);
-
-                if (context == null) {
-                    context = injector
-                            .getInstance(ObjectContextFactory.class)
-                            .createContext();
-                    session.setAttribute(SESSION_CONTEXT_KEY, context);
-                }
-            }
-
-            BaseContext.bindThreadObjectContext(context);
-        }
-    }
-
-    public void requestEnd(ServletRequest request, ServletResponse response) {
-        CayenneRuntime.bindThreadInjector(null);
-        BaseContext.bindThreadObjectContext(null);
-    }
-
-}
diff --git 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/StatelessContextRequestHandler.java
 
b/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/StatelessContextRequestHandler.java
deleted file mode 100644
index 2561ce549..000000000
--- 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/StatelessContextRequestHandler.java
+++ /dev/null
@@ -1,73 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-import org.apache.cayenne.BaseContext;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.configuration.CayenneRuntime;
-import org.apache.cayenne.configuration.ObjectContextFactory;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.di.Module;
-
-/**
- * <p>Stateless implementation of {@link RequestHandler} that creates a new
- * {@link ObjectContext} for each request and binds it to the request thread.
- * <p>
- * This is an alternative to the session-based request handler
- * {@link SessionContextRequestHandler} which is the default.
- * <p>
- * The request handler can be used by injecting it with a custom @{link 
Module}, like so:
- *
-<pre><code>
-import org.apache.cayenne.configuration.web.RequestHandler;
-import org.apache.cayenne.configuration.web.StatelessContextRequestHandler;
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Module;
-public class AppModule implements Module {
-    public void configure(Binder binder) {
-        
binder.bind(RequestHandler.class).to(StatelessContextRequestHandler.class);
-    }
-}
-</code></pre>
- *
- * @since 4.0
- */
-public class StatelessContextRequestHandler implements RequestHandler {
-
-    // using injector to lookup services instead of injecting them directly 
for lazy
-    // startup and "late binding"
-    @Inject
-    private Injector injector;
-
-    public void requestStart(ServletRequest request, ServletResponse response) 
{
-        CayenneRuntime.bindThreadInjector(injector);
-        ObjectContext context = 
injector.getInstance(ObjectContextFactory.class).createContext();
-        BaseContext.bindThreadObjectContext(context);
-    }
-
-    public void requestEnd(ServletRequest request, ServletResponse response) {
-        CayenneRuntime.bindThreadInjector(null);
-        BaseContext.bindThreadObjectContext(null);
-    }
-
-}
diff --git 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/WebConfiguration.java
 
b/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/WebConfiguration.java
deleted file mode 100644
index ad972d8f6..000000000
--- 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/WebConfiguration.java
+++ /dev/null
@@ -1,205 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import org.apache.cayenne.configuration.server.PropertyDataSourceFactory;
-import org.apache.cayenne.configuration.server.ServerRuntimeBuilder;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.util.Util;
-
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-
-/**
- * A class that provides access to common Cayenne web configuration parameters 
retrieved
- * either from a FilterConfig or a ServletConfig configuration.
- * 
- * @since 3.1
- */
-public class WebConfiguration {
-
-    static final String CONFIGURATION_LOCATION_PARAMETER = 
"configuration-location";
-    static final String EXTRA_MODULES_PARAMETER = "extra-modules";
-
-    /**
-     * @since 4.1
-     */
-    static final String DATA_DOMAIN_NAME_PARAMETER = "data-domain-name";
-
-    private FilterConfig configuration;
-
-    public WebConfiguration(final ServletConfig servletConfiguration) {
-        this.configuration = new FilterConfig() {
-
-            public ServletContext getServletContext() {
-                return servletConfiguration.getServletContext();
-            }
-
-            @SuppressWarnings("all")
-            public Enumeration getInitParameterNames() {
-                return servletConfiguration.getInitParameterNames();
-            }
-
-            public String getInitParameter(String name) {
-                return servletConfiguration.getInitParameter(name);
-            }
-
-            public String getFilterName() {
-                return servletConfiguration.getServletName();
-            }
-        };
-    }
-
-    public WebConfiguration(FilterConfig filterConfiguration) {
-        this.configuration = filterConfiguration;
-    }
-
-    /**
-     * Returns a non-null location of an XML Cayenne configuration, extracted 
from the
-     * filter or servlet configuration parameters.
-     */
-    public String getConfigurationLocation() {
-        String configurationLocation = configuration
-                .getInitParameter(CONFIGURATION_LOCATION_PARAMETER);
-
-        if (configurationLocation != null) {
-            return configurationLocation;
-        }
-
-        String name = configuration.getFilterName();
-
-        if (name == null) {
-            return null;
-        }
-
-        if (!name.endsWith(".xml")) {
-            name = name + ".xml";
-        }
-
-        return name;
-    }
-
-    /**
-     * If you are using multiple configuration files (cayenne-*.xml) this 
allows you
-     * to specify a name for the data domain other than the default name 
"cayenne" 
-     * (see {@link ServerRuntimeBuilder}).
-     * A specific data domain name is useful if you are setting database 
connection info 
-     * using properties via {@link PropertyDataSourceFactory}.
-     * @since 4.1
-     */
-    public String getDataDomainName() {
-        return configuration.getInitParameter(DATA_DOMAIN_NAME_PARAMETER);
-    }
-    
-    /**
-     * Creates and returns a collection of modules made of provided standard 
modules and
-     * extra custom modules specified via an optional "extra-modules" init 
parameter. The
-     * value of the parameter is expected to be a comma or space-separated 
list of class
-     * names, with each class implementing {@link Module} interface. Each 
custom module
-     * must have a no-arg constructor. If a module of this type is already in 
the modules
-     * collection, such module is skipped.
-     */
-    public Collection<Module> createModules(Module... standardModules)
-            throws ServletException {
-
-        Set<String> existingModules = new HashSet<>();
-        Collection<Module> modules = new ArrayList<>();
-
-        if (standardModules != null) {
-            for (Module module : standardModules) {
-                modules.add(module);
-                existingModules.add(module.getClass().getName());
-            }
-        }
-
-        String extraModules = 
configuration.getInitParameter(EXTRA_MODULES_PARAMETER);
-        if (extraModules != null) {
-
-            StringTokenizer toks = new StringTokenizer(extraModules, ", \n\r");
-            while (toks.hasMoreTokens()) {
-                String moduleName = toks.nextToken();
-
-                if (!existingModules.add(moduleName)) {
-                    continue;
-                }
-
-                Module module;
-                try {
-                    module = (Module) 
Util.getJavaClass(moduleName).newInstance();
-                } catch (Exception e) {
-                    String message = String.format("Error instantiating custom 
DI module '%s' by filter '%s': %s",
-                                    moduleName, getClass().getName(), 
e.getMessage());
-                    throw new ServletException(message, e);
-                }
-
-                modules.add(module);
-            }
-        }
-
-        return modules;
-    }
-
-    /**
-     * Returns a map of all init parameters from the underlying FilterConfig or
-     * ServletConfig object.
-     */
-    public Map<String, String> getParameters() {
-        Enumeration<?> en = configuration.getInitParameterNames();
-
-        if (!en.hasMoreElements()) {
-            return Collections.emptyMap();
-        }
-
-        Map<String, String> parameters = new HashMap<>();
-        while (en.hasMoreElements()) {
-            String key = (String) en.nextElement();
-            parameters.put(key, configuration.getInitParameter(key));
-        }
-
-        return parameters;
-    }
-
-    /**
-     * Returns servlet or filter init parameters, excluding those recognized by
-     * WebConfiguration. Namely 'configuration-location' and 'extra-modules' 
parameters
-     * are removed from the returned map.
-     */
-    public Map<String, String> getOtherParameters() {
-
-        Map<String, String> parameters = getParameters();
-
-        if (!parameters.isEmpty()) {
-            parameters.remove(CONFIGURATION_LOCATION_PARAMETER);
-            parameters.remove(EXTRA_MODULES_PARAMETER);
-        }
-
-        return parameters;
-    }
-}
diff --git 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/WebModule.java 
b/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/WebModule.java
deleted file mode 100644
index 577feb18e..000000000
--- 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/WebModule.java
+++ /dev/null
@@ -1,35 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Module;
-
-/**
- * @since 3.1
- */
-public class WebModule implements Module {
-
-    public void configure(Binder binder) {
-        binder
-                .bind(RequestHandler.class)
-                .to(SessionContextRequestHandler.class)
-                .withoutScope();
-    }
-}
diff --git 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/WebServerModuleProvider.java
 
b/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/WebServerModuleProvider.java
deleted file mode 100644
index 55e98ebe4..000000000
--- 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/WebServerModuleProvider.java
+++ /dev/null
@@ -1,43 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import org.apache.cayenne.configuration.server.CayenneServerModuleProvider;
-import org.apache.cayenne.di.Module;
-
-import java.util.Collection;
-import java.util.Collections;
-
-public class WebServerModuleProvider implements CayenneServerModuleProvider{
-
-    @Override
-    public Module module() {
-        return new WebModule();
-    }
-
-    @Override
-    public Class<? extends Module> moduleType() {
-        return WebModule.class;
-    }
-
-    @Override
-    public Collection<Class<? extends Module>> overrides() {
-        return Collections.emptyList();
-    }
-}
\ No newline at end of file
diff --git 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/WebUtil.java 
b/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/WebUtil.java
deleted file mode 100644
index 11a283f70..000000000
--- 
a/cayenne-web/src/main/java/org/apache/cayenne/configuration/web/WebUtil.java
+++ /dev/null
@@ -1,54 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import javax.servlet.ServletContext;
-
-import org.apache.cayenne.configuration.CayenneRuntime;
-
-/**
- * A helper class to retrieve and store {@link CayenneRuntime} in the
- * {@link ServletContext}. All Cayenne web configuration objects, such as
- * {@link CayenneFilter} and {@link org.apache.cayenne.rop.ROPServlet}, are 
using this class to access
- * runtime.
- * 
- * @since 3.1
- */
-public class WebUtil {
-
-    static final String CAYENNE_RUNTIME_KEY = WebUtil.class.getName()
-            + ".CAYENNE_RUNTIME";
-
-    /**
-     * Retrieves CayenneRuntime previously stored in provided context via
-     * {@link #setCayenneRuntime(ServletContext, CayenneRuntime)}. May return 
null if no
-     * runtime was stored.
-     */
-    public static CayenneRuntime getCayenneRuntime(ServletContext context) {
-        return (CayenneRuntime) context.getAttribute(CAYENNE_RUNTIME_KEY);
-    }
-
-    /**
-     * Stores {@link CayenneRuntime} in the servlet context. It can be later 
retrieve via
-     * {@link #getCayenneRuntime(ServletContext)}.
-     */
-    public static void setCayenneRuntime(ServletContext context, 
CayenneRuntime runtime) {
-        context.setAttribute(CAYENNE_RUNTIME_KEY, runtime);
-    }
-}
diff --git 
a/cayenne-web/src/main/resources/META-INF/services/org.apache.cayenne.configuration.server.CayenneServerModuleProvider
 
b/cayenne-web/src/main/resources/META-INF/services/org.apache.cayenne.configuration.server.CayenneServerModuleProvider
deleted file mode 100644
index 21f595930..000000000
--- 
a/cayenne-web/src/main/resources/META-INF/services/org.apache.cayenne.configuration.server.CayenneServerModuleProvider
+++ /dev/null
@@ -1,20 +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
-#
-#    https://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.cayenne.configuration.web.WebServerModuleProvider
\ No newline at end of file
diff --git 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/CayenneFilterTest.java
 
b/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/CayenneFilterTest.java
deleted file mode 100644
index a1f306339..000000000
--- 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/CayenneFilterTest.java
+++ /dev/null
@@ -1,227 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import com.mockrunner.mock.web.MockFilterChain;
-import com.mockrunner.mock.web.MockFilterConfig;
-import com.mockrunner.mock.web.MockHttpServletRequest;
-import com.mockrunner.mock.web.MockHttpServletResponse;
-import com.mockrunner.mock.web.MockServletContext;
-import org.apache.cayenne.configuration.CayenneRuntime;
-import org.apache.cayenne.configuration.Constants;
-import org.apache.cayenne.configuration.server.ServerModule;
-import org.apache.cayenne.di.Key;
-import org.apache.cayenne.di.Module;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-public class CayenneFilterTest {
-
-    @Test
-    public void testInitWithFilterName() throws Exception {
-
-        MockFilterConfig config = new MockFilterConfig();
-        config.setFilterName("abc");
-
-        MockServletContext context = new MockServletContext();
-        config.setupServletContext(context);
-
-        CayenneFilter filter = new CayenneFilter();
-
-        assertNull(WebUtil.getCayenneRuntime(context));
-        filter.init(config);
-
-        CayenneRuntime runtime = WebUtil.getCayenneRuntime(context);
-        assertNotNull(runtime);
-
-        List<String> locations = runtime.getInjector()
-                .getInstance(Key.getListOf(String.class, 
Constants.SERVER_PROJECT_LOCATIONS_LIST));
-
-        assertEquals(Collections.singletonList("abc.xml"), locations);
-    }
-
-    @Test
-    public void testInitWithLocation() throws Exception {
-
-        MockFilterConfig config = new MockFilterConfig();
-        config.setFilterName("abc");
-        
config.setInitParameter(WebConfiguration.CONFIGURATION_LOCATION_PARAMETER, 
"xyz");
-
-        MockServletContext context = new MockServletContext();
-        config.setupServletContext(context);
-
-        CayenneFilter filter = new CayenneFilter();
-        filter.init(config);
-
-        CayenneRuntime runtime = WebUtil.getCayenneRuntime(context);
-        assertNotNull(runtime);
-        List<String> locations = runtime.getInjector()
-                .getInstance(Key.getListOf(String.class, 
Constants.SERVER_PROJECT_LOCATIONS_LIST));
-
-        assertEquals(Collections.singletonList("xyz"), locations);
-    }
-
-    @Test
-    public void testInitWithMultipleLocations() throws Exception {
-
-        MockFilterConfig config = new MockFilterConfig();
-        config.setFilterName("abc");
-        
config.setInitParameter(WebConfiguration.CONFIGURATION_LOCATION_PARAMETER, 
"xyz,abc,\tdef, \n ghi");
-
-        MockServletContext context = new MockServletContext();
-        config.setupServletContext(context);
-
-        CayenneFilter filter = new CayenneFilter();
-        filter.init(config);
-
-        CayenneRuntime runtime = WebUtil.getCayenneRuntime(context);
-        assertNotNull(runtime);
-        List<String> locations = runtime.getInjector()
-                .getInstance(Key.getListOf(String.class, 
Constants.SERVER_PROJECT_LOCATIONS_LIST));
-
-        assertEquals(Arrays.asList("xyz", "abc", "def", "ghi"), locations);
-    }
-
-    @Test
-    public void testInitWithCustomDomainName() throws Exception {
-        MockFilterConfig config = new MockFilterConfig();
-        config.setFilterName("abc");
-        config.setInitParameter(WebConfiguration.DATA_DOMAIN_NAME_PARAMETER, 
"custom");
-
-        MockServletContext context = new MockServletContext();
-        config.setupServletContext(context);
-
-        CayenneFilter filter = new CayenneFilter();
-        filter.init(config);
-
-        CayenneRuntime runtime = WebUtil.getCayenneRuntime(context);
-        assertNotNull(runtime);
-
-        String domainName = runtime.getInjector()
-                .getInstance(Key.getMapOf(String.class, String.class, 
Constants.PROPERTIES_MAP))
-                .get(Constants.SERVER_DOMAIN_NAME_PROPERTY);
-        assertEquals("custom", domainName);
-    }
-
-    @Test
-    public void testInitWithStandardModules() throws Exception {
-
-        MockFilterConfig config = new MockFilterConfig();
-        config.setFilterName("cayenne-abc");
-
-        MockServletContext context = new MockServletContext();
-        config.setupServletContext(context);
-
-        CayenneFilter filter = new CayenneFilter();
-
-        assertNull(WebUtil.getCayenneRuntime(context));
-        filter.init(config);
-
-        CayenneRuntime runtime = WebUtil.getCayenneRuntime(context);
-        assertNotNull(runtime);
-        List<String> locations = runtime.getInjector()
-                .getInstance(Key.getListOf(String.class, 
Constants.SERVER_PROJECT_LOCATIONS_LIST));
-
-        assertEquals(Collections.singletonList("cayenne-abc.xml"), locations);
-        Collection<Module> modules = runtime.getModules();
-        assertEquals(3, modules.size());
-
-        Object[] marray = modules.toArray();
-
-        if (marray[0] instanceof ServerModule) {
-            assertTrue(marray[1] instanceof WebModule);
-        } else {
-            assertTrue(marray[0] instanceof WebModule);
-        }
-
-        RequestHandler handler = 
runtime.getInjector().getInstance(RequestHandler.class);
-        assertTrue(handler instanceof SessionContextRequestHandler);
-    }
-
-    @Test
-    public void testInitWithExtraModules() throws Exception {
-
-        MockFilterConfig config = new MockFilterConfig();
-        config.setFilterName("abc");
-        config.setInitParameter(WebConfiguration.EXTRA_MODULES_PARAMETER,
-                MockModule1.class.getName() + "," + 
MockModule2.class.getName());
-
-        MockServletContext context = new MockServletContext();
-        config.setupServletContext(context);
-
-        CayenneFilter filter = new CayenneFilter();
-        filter.init(config);
-
-        CayenneRuntime runtime = WebUtil.getCayenneRuntime(context);
-        assertNotNull(runtime);
-
-        Collection<Module> modules = runtime.getModules();
-        assertEquals(5, modules.size());
-
-
-        Object[] marray = modules.toArray();
-        if (marray[0] instanceof ServerModule) {
-            assertTrue(marray[1] instanceof WebModule);
-        } else {
-            assertTrue(marray[0] instanceof WebModule);
-        }
-        assertTrue(marray[2] instanceof MockModule1);
-        assertTrue(marray[3] instanceof MockModule2);
-
-        RequestHandler handler = 
runtime.getInjector().getInstance(RequestHandler.class);
-        assertTrue(handler instanceof MockRequestHandler);
-    }
-
-    @Test
-    public void testDoFilter() throws Exception {
-        MockFilterConfig config = new MockFilterConfig();
-        config.setFilterName("abc");
-        config.setInitParameter(WebConfiguration.EXTRA_MODULES_PARAMETER, 
CayenneFilter_DispatchModule.class.getName());
-
-        MockServletContext context = new MockServletContext();
-        config.setupServletContext(context);
-
-        CayenneFilter filter = new CayenneFilter();
-        filter.init(config);
-
-        CayenneRuntime runtime = WebUtil.getCayenneRuntime(context);
-        CayenneFilter_DispatchRequestHandler handler = 
(CayenneFilter_DispatchRequestHandler) runtime.getInjector()
-                .getInstance(RequestHandler.class);
-
-        assertEquals(0, handler.getStarted());
-        assertEquals(0, handler.getEnded());
-
-        filter.doFilter(new MockHttpServletRequest(), new 
MockHttpServletResponse(), new MockFilterChain());
-        assertEquals(1, handler.getStarted());
-        assertEquals(1, handler.getEnded());
-
-        filter.doFilter(new MockHttpServletRequest(), new 
MockHttpServletResponse(), new MockFilterChain());
-        assertEquals(2, handler.getStarted());
-        assertEquals(2, handler.getEnded());
-    }
-}
diff --git 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/CayenneFilter_DispatchModule.java
 
b/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/CayenneFilter_DispatchModule.java
deleted file mode 100644
index 67d440c66..000000000
--- 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/CayenneFilter_DispatchModule.java
+++ /dev/null
@@ -1,29 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Module;
-
-public class CayenneFilter_DispatchModule implements Module {
-
-    public void configure(Binder binder) {
-        
binder.bind(RequestHandler.class).to(CayenneFilter_DispatchRequestHandler.class);
-    }
-}
diff --git 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/CayenneFilter_DispatchRequestHandler.java
 
b/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/CayenneFilter_DispatchRequestHandler.java
deleted file mode 100644
index 3ca021ff4..000000000
--- 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/CayenneFilter_DispatchRequestHandler.java
+++ /dev/null
@@ -1,45 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-public class CayenneFilter_DispatchRequestHandler implements RequestHandler {
-
-    private int started;
-    private int ended;
-
-    public void requestEnd(ServletRequest request, ServletResponse response) {
-        ended++;
-    }
-
-    public void requestStart(ServletRequest request, ServletResponse response) 
{
-        started++;
-    }
-
-    public int getStarted() {
-        return started;
-    }
-
-    public int getEnded() {
-        return ended;
-    }
-
-}
diff --git 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/MockModule1.java
 
b/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/MockModule1.java
deleted file mode 100644
index e3c99403c..000000000
--- 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/MockModule1.java
+++ /dev/null
@@ -1,30 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Module;
-
-
-public class MockModule1 implements Module {
-
-    public void configure(Binder binder) {
-    }
-
-}
diff --git 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/MockModule2.java
 
b/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/MockModule2.java
deleted file mode 100644
index 1bd3e5e85..000000000
--- 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/MockModule2.java
+++ /dev/null
@@ -1,31 +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
- *
- *    https://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.cayenne.configuration.web;
-
-
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Module;
-
-public class MockModule2 implements Module {
-
-    public void configure(Binder binder) {
-        binder.bind(RequestHandler.class).to(MockRequestHandler.class);
-    }
-
-}
diff --git 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/MockRequestHandler.java
 
b/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/MockRequestHandler.java
deleted file mode 100644
index 37a652eb1..000000000
--- 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/MockRequestHandler.java
+++ /dev/null
@@ -1,33 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-
-public class MockRequestHandler implements RequestHandler {
-
-    public void requestEnd(ServletRequest request, ServletResponse response) {
-    }
-
-    public void requestStart(ServletRequest request, ServletResponse response) 
{
-    }
-
-}
diff --git 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/ServletContextHandlerTest.java
 
b/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/ServletContextHandlerTest.java
deleted file mode 100644
index 706f645b9..000000000
--- 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/ServletContextHandlerTest.java
+++ /dev/null
@@ -1,124 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import com.mockrunner.mock.web.MockHttpServletRequest;
-import com.mockrunner.mock.web.MockHttpServletResponse;
-import com.mockrunner.mock.web.MockHttpSession;
-import org.apache.cayenne.BaseContext;
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.MockDataChannel;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.configuration.ObjectContextFactory;
-import org.apache.cayenne.di.DIBootstrap;
-import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.di.Module;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.mock;
-
-public class ServletContextHandlerTest {
-
-    @Test
-    public void testRequestStart_bindContext() {
-
-        Module module = binder -> {
-
-            binder.bind(DataChannel.class).to(MockDataChannel.class);
-            binder.bind(ObjectContextFactory.class).toInstance(
-                    new ObjectContextFactory() {
-
-                        public ObjectContext createContext(DataChannel parent) 
{
-                            return mock(ObjectContext.class);
-                        }
-
-                        public ObjectContext createContext() {
-                            return mock(ObjectContext.class);
-                        }
-                    });
-        };
-        Injector injector = DIBootstrap.createInjector(module);
-        SessionContextRequestHandler handler = new 
SessionContextRequestHandler();
-        injector.injectMembers(handler);
-
-        MockHttpSession session = new MockHttpSession();
-
-        BaseContext.bindThreadObjectContext(null);
-
-        try {
-
-            MockHttpServletRequest request1 = new MockHttpServletRequest();
-            MockHttpServletResponse response1 = new MockHttpServletResponse();
-            request1.setSession(session);
-            handler.requestStart(request1, response1);
-
-            ObjectContext c1 = BaseContext.getThreadObjectContext();
-            assertNotNull(c1);
-
-            handler.requestEnd(request1, response1);
-
-            try {
-                BaseContext.getThreadObjectContext();
-                fail("thread context not null");
-            }
-            catch (IllegalStateException e) {
-                // expected
-            }
-
-            MockHttpServletRequest request2 = new MockHttpServletRequest();
-            MockHttpServletResponse response2 = new MockHttpServletResponse();
-            request2.setSession(session);
-            handler.requestStart(request2, response2);
-
-            ObjectContext c2 = BaseContext.getThreadObjectContext();
-            assertSame(c1, c2);
-
-            handler.requestEnd(request2, response2);
-            try {
-                BaseContext.getThreadObjectContext();
-                fail("thread context not null");
-            }
-            catch (IllegalStateException e) {
-                // expected
-            }
-
-            MockHttpServletRequest request3 = new MockHttpServletRequest();
-            MockHttpServletResponse response3 = new MockHttpServletResponse();
-            request3.setSession(new MockHttpSession());
-            handler.requestStart(request3, response3);
-
-            ObjectContext c3 = BaseContext.getThreadObjectContext();
-            assertNotNull(c3);
-            assertNotSame(c1, c3);
-
-            handler.requestEnd(request3, response3);
-            try {
-                BaseContext.getThreadObjectContext();
-                fail("thread context not null");
-            }
-            catch (IllegalStateException e) {
-                // expected
-            }
-        }
-        finally {
-            BaseContext.bindThreadObjectContext(null);
-        }
-    }
-}
diff --git 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/WebConfigurationTest.java
 
b/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/WebConfigurationTest.java
deleted file mode 100644
index 71cac8ca9..000000000
--- 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/WebConfigurationTest.java
+++ /dev/null
@@ -1,214 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import com.mockrunner.mock.web.MockFilterConfig;
-import com.mockrunner.mock.web.MockServletConfig;
-import org.apache.cayenne.di.Module;
-import org.junit.Test;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-
-import static org.junit.Assert.*;
-
-public class WebConfigurationTest {
-
-    @Test
-    public void testFilterCreateModules_Standard() throws Exception {
-
-        MockFilterConfig config = new MockFilterConfig();
-        WebConfiguration configuration = new WebConfiguration(config);
-
-        Module m1 = binder -> {
-        };
-
-        Module m2 = binder -> {
-        };
-
-        Collection<Module> modules = configuration.createModules(m1, m2);
-        assertEquals(2, modules.size());
-
-        Iterator<Module> it = modules.iterator();
-        assertSame(m1, it.next());
-        assertSame(m2, it.next());
-    }
-
-    @Test
-    public void testFilterCreateModules_Extra() throws Exception {
-
-        MockFilterConfig config = new MockFilterConfig();
-        String exra = String.format(
-                "%s, \n%s",
-                MockModule1.class.getName(),
-                MockModule2.class.getName());
-        config.setInitParameter(WebConfiguration.EXTRA_MODULES_PARAMETER, 
exra);
-
-        WebConfiguration configuration = new WebConfiguration(config);
-
-        Module m1 = binder -> {
-        };
-
-        Module m2 = binder -> {
-        };
-
-        Collection<Module> modules = configuration.createModules(m1, m2);
-        assertEquals(4, modules.size());
-
-        Iterator<Module> it = modules.iterator();
-        assertSame(m1, it.next());
-        assertSame(m2, it.next());
-        assertTrue(it.next() instanceof MockModule1);
-        assertTrue(it.next() instanceof MockModule2);
-    }
-
-    @Test
-    public void testServletCreateModules_Extra() throws Exception {
-
-        MockServletConfig config = new MockServletConfig();
-        String exra = String.format(
-                "%s, \n%s",
-                MockModule1.class.getName(),
-                MockModule2.class.getName());
-        config.setInitParameter(WebConfiguration.EXTRA_MODULES_PARAMETER, 
exra);
-
-        WebConfiguration configuration = new WebConfiguration(config);
-
-        Module m1 = binder -> {
-        };
-
-        Module m2 = binder -> {
-        };
-
-        Collection<Module> modules = configuration.createModules(m1, m2);
-        assertEquals(4, modules.size());
-
-        Iterator<Module> it = modules.iterator();
-        assertSame(m1, it.next());
-        assertSame(m2, it.next());
-        assertTrue(it.next() instanceof MockModule1);
-        assertTrue(it.next() instanceof MockModule2);
-    }
-
-    @Test
-    public void testFilterConfigurationLocation_Name() {
-        MockFilterConfig config1 = new MockFilterConfig();
-        config1.setFilterName("cayenne-x");
-
-        WebConfiguration configuration1 = new WebConfiguration(config1);
-        assertEquals("cayenne-x.xml", 
configuration1.getConfigurationLocation());
-
-        MockFilterConfig config2 = new MockFilterConfig();
-        config2.setFilterName("cayenne-y.xml");
-
-        WebConfiguration configuration2 = new WebConfiguration(config2);
-        assertEquals("cayenne-y.xml", 
configuration2.getConfigurationLocation());
-
-        MockFilterConfig config3 = new MockFilterConfig();
-        config3.setFilterName("a/b/c/cayenne-z.xml");
-
-        WebConfiguration configuration3 = new WebConfiguration(config3);
-        assertEquals("a/b/c/cayenne-z.xml", 
configuration3.getConfigurationLocation());
-    }
-
-    @Test
-    public void testServletConfigurationLocation_Name() {
-        MockServletConfig config1 = new MockServletConfig();
-        config1.setServletName("cayenne-x");
-
-        WebConfiguration configuration1 = new WebConfiguration(config1);
-        assertEquals("cayenne-x.xml", 
configuration1.getConfigurationLocation());
-
-        MockServletConfig config2 = new MockServletConfig();
-        config2.setServletName("cayenne-y.xml");
-
-        WebConfiguration configuration2 = new WebConfiguration(config2);
-        assertEquals("cayenne-y.xml", 
configuration2.getConfigurationLocation());
-
-        MockServletConfig config3 = new MockServletConfig();
-        config3.setServletName("a/b/c/cayenne-z.xml");
-
-        WebConfiguration configuration3 = new WebConfiguration(config3);
-        assertEquals("a/b/c/cayenne-z.xml", 
configuration3.getConfigurationLocation());
-    }
-
-    @Test
-    public void testFilterConfigurationLocation_Parameter() {
-        MockFilterConfig config1 = new MockFilterConfig();
-        config1.setFilterName("cayenne-x");
-        config1.setInitParameter(
-                WebConfiguration.CONFIGURATION_LOCATION_PARAMETER,
-                "cayenne-y.xml");
-
-        WebConfiguration configuration1 = new WebConfiguration(config1);
-        assertEquals("cayenne-y.xml", 
configuration1.getConfigurationLocation());
-    }
-
-    @Test
-    public void testServletConfigurationLocation_Parameter() {
-        MockServletConfig config1 = new MockServletConfig();
-        config1.setServletName("cayenne-x");
-        config1.setInitParameter(
-                WebConfiguration.CONFIGURATION_LOCATION_PARAMETER,
-                "cayenne-y.xml");
-
-        WebConfiguration configuration1 = new WebConfiguration(config1);
-        assertEquals("cayenne-y.xml", 
configuration1.getConfigurationLocation());
-    }
-
-    @Test
-    public void testFilterParameters() {
-        MockFilterConfig config1 = new MockFilterConfig();
-        config1.setFilterName("cayenne-x");
-        config1.setInitParameter(
-                WebConfiguration.CONFIGURATION_LOCATION_PARAMETER,
-                "cayenne-y.xml");
-        config1.setInitParameter("test", "xxx");
-
-        WebConfiguration configuration1 = new WebConfiguration(config1);
-        Map<String, String> parameters = configuration1.getParameters();
-        assertNotSame(parameters, configuration1.getParameters());
-        assertEquals(parameters, configuration1.getParameters());
-
-        assertEquals(2, parameters.size());
-        assertEquals("cayenne-y.xml", parameters
-                .get(WebConfiguration.CONFIGURATION_LOCATION_PARAMETER));
-        assertEquals("xxx", parameters.get("test"));
-    }
-
-    @Test
-    public void testFilterOtherParameters() {
-        MockFilterConfig config1 = new MockFilterConfig();
-        config1.setFilterName("cayenne-x");
-        config1.setInitParameter(
-                WebConfiguration.CONFIGURATION_LOCATION_PARAMETER,
-                "cayenne-y.xml");
-        config1.setInitParameter(WebConfiguration.EXTRA_MODULES_PARAMETER, 
"M1,M2");
-        config1.setInitParameter("test", "xxx");
-
-        WebConfiguration configuration1 = new WebConfiguration(config1);
-        Map<String, String> parameters = configuration1.getOtherParameters();
-        assertNotSame(parameters, configuration1.getOtherParameters());
-        assertEquals(parameters, configuration1.getOtherParameters());
-
-        assertEquals(1, parameters.size());
-        assertEquals("xxx", parameters.get("test"));
-    }
-}
diff --git 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/WebModuleProviderTest.java
 
b/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/WebModuleProviderTest.java
deleted file mode 100644
index a4a392d47..000000000
--- 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/WebModuleProviderTest.java
+++ /dev/null
@@ -1,30 +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
- *
- *      https://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.cayenne.configuration.web;
-
-import org.apache.cayenne.configuration.server.CayenneServerModuleProvider;
-import org.apache.cayenne.unit.util.ModuleProviderChecker;
-import org.junit.Test;
-
-public class WebModuleProviderTest {
-    @Test
-    public void testProviderPresent() {
-        
ModuleProviderChecker.testProviderPresent(WebServerModuleProvider.class, 
CayenneServerModuleProvider.class);
-    }
-}
\ No newline at end of file
diff --git 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/WebModuleTest.java
 
b/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/WebModuleTest.java
deleted file mode 100644
index 27ee168a3..000000000
--- 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/WebModuleTest.java
+++ /dev/null
@@ -1,40 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.di.spi.DefaultInjector;
-import org.junit.Test;
-
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertTrue;
-
-public class WebModuleTest {
-
-    @Test
-    public void testBind_Scopes() {
-
-        Injector injector = new DefaultInjector(new WebModule());
-        RequestHandler handler = injector.getInstance(RequestHandler.class);
-        assertTrue(handler instanceof SessionContextRequestHandler);
-
-        RequestHandler handler1 = injector.getInstance(RequestHandler.class);
-        assertNotSame("Incorrect singleton scope for request handler", 
handler, handler1);
-    }
-}
diff --git 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/WebUtilTest.java
 
b/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/WebUtilTest.java
deleted file mode 100644
index 336f24924..000000000
--- 
a/cayenne-web/src/test/java/org/apache/cayenne/configuration/web/WebUtilTest.java
+++ /dev/null
@@ -1,50 +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
- *
- *    https://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.cayenne.configuration.web;
-
-import com.mockrunner.mock.web.MockServletContext;
-import org.apache.cayenne.configuration.CayenneRuntime;
-import org.junit.Test;
-
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.mockito.Mockito.mock;
-
-public class WebUtilTest {
-
-    @Test
-       public void testGetCayenneRuntime() {
-               MockServletContext context = new MockServletContext();
-
-               assertNull(WebUtil.getCayenneRuntime(context));
-
-               CayenneRuntime runtime = mock(CayenneRuntime.class);
-
-               WebUtil.setCayenneRuntime(context, runtime);
-               assertSame(runtime, WebUtil.getCayenneRuntime(context));
-
-               CayenneRuntime runtime1 = mock(CayenneRuntime.class);
-
-               WebUtil.setCayenneRuntime(context, runtime1);
-               assertSame(runtime1, WebUtil.getCayenneRuntime(context));
-
-               WebUtil.setCayenneRuntime(context, null);
-               assertNull(WebUtil.getCayenneRuntime(context));
-       }
-}
diff --git 
a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part5.adoc 
b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part5.adoc
index da902e9e5..c0cb192c9 100644
--- a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part5.adoc
+++ b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part5.adoc
@@ -26,6 +26,4 @@ include::part5/projectCompatibility.adoc[]
 
 include::part5/apacheVelocity.adoc[]
 
-include::part5/cayenneWeb.adoc[]
-
 include::part5/cayenneOsgi.adoc[]
diff --git 
a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part5/cayenneWeb.adoc
 
b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part5/cayenneWeb.adoc
deleted file mode 100644
index d1a2c8ad9..000000000
--- 
a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part5/cayenneWeb.adoc
+++ /dev/null
@@ -1,40 +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
-//
-// https://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.
-
-include::../var.adoc[]
-
-[#ext-web]
-=== Cayenne Web Extension
-
-Provides basic utilities to bootstrap Cayenne service inside web application.
-
-==== Maven
-
-[source, XML,subs="verbatim,attributes"]
-----
-<dependency>
-    <groupId>org.apache.cayenne</groupId>
-    <artifactId>cayenne-web</artifactId>
-    <version>{version}</version>
-</dependency>
-----
-
-==== Gradle
-
-[source, Groovy,subs="verbatim,attributes"]
-----
-compile 'org.apache.cayenne:cayenne-web:{version}'
-----
-
-
diff --git 
a/docs/asciidoc/getting-started-guide/src/docs/asciidoc/_getting-started-guide/webapp.adoc
 
b/docs/asciidoc/getting-started-guide/src/docs/asciidoc/_getting-started-guide/webapp.adoc
deleted file mode 100644
index 5b1013eb8..000000000
--- 
a/docs/asciidoc/getting-started-guide/src/docs/asciidoc/_getting-started-guide/webapp.adoc
+++ /dev/null
@@ -1,286 +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
-//
-// https://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.
-== Converting to Web Application
-This chapter shows how to work with Cayenne in a web application.
-
-=== Converting Tutorial to a Web Application
-The web part of the web application tutorial is done in JSP, which is the 
least common
-denominator of the Java web technologies, and is intentionally simplistic from 
the UI
-perspective, to concentrate on Cayenne integration aspect, rather than the 
interface. A
-typical Cayenne web application works like this:
-
-- Cayenne configuration is loaded when an application context is started, 
using a special servlet filter.
-- User requests are intercepted by the filter, and the DataContext is bound to
-the request thread, so the application can access it easily from anywhere.
-- The same DataContext instance is reused within a single user session;
-different sessions use different DataContexts (and therefore different sets of
-objects). _The context can be scoped differently
-depending on the app specifics. For the tutorial we'll be using a
-session-scoped context._
-
-So let's convert the tutorial that we created to a web application:
-
-- In IDEA under "tutorial" project folder create a new folder 
`src/main/webapp/WEB-INF`.
-- Under `WEB-INF` create a new file `web.xml` (a standard web app descriptor):
-
-.web.xml
-[source,xml]
-----
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE web-app
-   PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
-  "http://java.sun.com/dtd/web-app_2_3.dtd";>
-<web-app>
-    <display-name>Cayenne Tutorial</display-name>
-
-    <!-- This filter bootstraps ServerRuntime and then provides each request 
thread 
-         with a session-bound DataContext. Note that the name of the filter is 
important,
-         as it points it to the right named configuration file.
-    -->
-    <filter>
-        <filter-name>cayenne-project</filter-name>
-        
<filter-class>org.apache.cayenne.configuration.web.CayenneFilter</filter-class>
-    </filter>
-    <filter-mapping>
-        <filter-name>cayenne-project</filter-name>
-        <url-pattern>/*</url-pattern>
-    </filter-mapping>
-    <welcome-file-list>
-        <welcome-file>index.jsp</welcome-file>
-    </welcome-file-list>
-</web-app>
-----
-
-- Create the artist browser page `src/main/webapp/index.jsp` file with the 
following contents:
-
-.webapp/index.jsp
-[source,jsp]
-----
-<%@ page language="java" contentType="text/html" %>
-<%@ page import="org.example.cayenne.persistent.*" %>
-<%@ page import="org.apache.cayenne.*" %>
-<%@ page import="org.apache.cayenne.query.*" %>
-<%@ page import="org.apache.cayenne.exp.*" %>
-<%@ page import="java.util.*" %>
-
-<%
-    ObjectContext context = BaseContext.getThreadObjectContext();
-    List<Artist> artists = ObjectSelect.query(Artist.class)
-                .orderBy(Artist.NAME.asc())
-                .select(context);
-%>
-
-<html>
-    <head>
-        <title>Main</title>
-    </head>
-    <body>
-        <h2>Artists:</h2>
-        
-        <% if(artists.isEmpty()) {%>
-        <p>No artists found</p>
-        <% } else {
-               for(Artist a : artists) {
-        %>
-        <p><a href="detail.jsp?id=<%=Cayenne.intPKForObject(a)%>"> 
<%=a.getName()%> </a></p>
-        <%
-               }
-           } %>
-        <hr>
-        <p><a href="detail.jsp">Create new artist...</a></p>
-    </body>
-</html>
-----
-
-- Create the artist editor page `src/main/webapp/detail.jsp` with the 
following content:
-
-.webapp/detail.jsp
-[source,jsp]
-----
-<%@ page language="java" contentType="text/html" %>
-<%@ page import="org.example.cayenne.persistent.*" %>
-<%@ page import="org.apache.cayenne.*" %>
-<%@ page import="org.apache.cayenne.query.*" %>
-<%@ page import="java.util.*" %>
-<%@ page import="java.text.*" %>
-<%@ page import="java.time.format.DateTimeFormatter" %>
-
-<% 
-    ObjectContext context = BaseContext.getThreadObjectContext();
-    String id = request.getParameter("id");
-
-    // find artist for id
-    Artist artist = null;
-    if(id != null &amp;&amp; id.trim().length() > 0) {
-        artist = SelectById.query(Artist.class, 
Integer.parseInt(id)).selectOne(context);
-    }
-
-    if("POST".equals(request.getMethod())) {
-        // if no id is saved in the hidden field, we are dealing with
-        // create new artist request
-        if(artist == null) {
-            artist = context.newObject(Artist.class);
-        }
-
-        // note that in a real application we would so dome validation ...
-        // here we just hope the input is correct
-        artist.setName(request.getParameter("name"));
-        artist.setDateOfBirthString(request.getParameter("dateOfBirth"));
-
-        context.commitChanges();
-
-        response.sendRedirect("index.jsp");
-    }
-
-    if(artist == null) {
-        // create transient artist for the form response rendering
-        artist = new Artist();
-    }
-
-    String name = artist.getName() == null ? "" : artist.getName();
-
-    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
-    String dob = artist.getDateOfBirth() == null
-                        ? "" :artist.getDateOfBirth().format(formatter);
-%>
-<html>
-    <head>
-        <title>Artist Details</title>
-    </head>
-    <body>
-        <h2>Artists Details</h2>
-        <form name="EditArtist" action="detail.jsp" method="POST">
-            <input type="hidden" name="id" value="<%= id != null ? id : "" %>" 
/>
-            <table border="0">
-                <tr>
-                    <td>Name:</td>
-                    <td><input type="text" name="name" value="<%= name 
%>"/></td>
-                </tr>
-                <tr>
-                    <td>Date of Birth (yyyyMMdd):</td>
-                    <td><input type="text" name="dateOfBirth" value="<%= dob 
%>"/></td>
-                </tr>
-                <tr>
-                    <td></td>
-                    <td align="right"><input type="submit" value="Save" /></td>
-                </tr>  
-            </table>
-        </form>
-    </body>
-</html>
-----
-
-==== Running Web Application
-
-We need to add cayenne-web module and javax servlet-api for our application.
-
-.pom.xml
-[source,xml]
-----
-<dependency>
-    <groupId>org.apache.cayenne</groupId>
-    <artifactId>cayenne-web</artifactId>
-    <version>${cayenne.version}</version>
-</dependency>
-<dependency>
-    <groupId>javax.servlet</groupId>
-    <artifactId>javax.servlet-api</artifactId>
-    <version>3.1.0</version>
-    <scope>provided</scope>
-</dependency>
-----
-
-Also to run the web application we'll use "maven-jetty-plugin". To activate it,
-let's add the following piece of code to the `pom.xml` file, following the 
"dependencies"
-section and save the POM:
-
-.pom.xml
-[source,xml]
-----
-<build>
-    <plugins>
-        <plugin>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-maven-plugin</artifactId>
-            <version>9.4.8.v20171121</version>
-        </plugin>
-    </plugins>
-</build>
-----
-
-- Go to "Select Run/Debug Configuration" menu, and then "Edit Configuration..."
-
-image::idea-edit-configurations.png[align="center"]
-
-
-- Click `+` button and select "Maven". Enter "Name" and "Command line" as 
shown on screenshot:
-
-image:idea-run-configuration.png[]
-
-- Click "Apply" and "Run". On the first execution it may take a few minutes for
-Jetty plugin to download all dependencies, but eventually you'll see the logs
-like this:
-
-    [INFO] 
------------------------------------------------------------------------
-    [INFO] Building tutorial 0.0.1-SNAPSHOT
-    [INFO] 
------------------------------------------------------------------------
-    ...
-    [INFO] Configuring Jetty for project: tutorial
-    [INFO] webAppSourceDirectory not set. Trying src/main/webapp
-    [INFO] Reload Mechanic: automatic
-    [INFO] Classes = /.../tutorial/target/classes
-    [INFO] Logging initialized @1617ms
-    [INFO] Context path = /
-    [INFO] Tmp directory = /.../tutorial/target/tmp
-    [INFO] Web defaults = org/eclipse/jetty/webapp/webdefault.xml
-    [INFO] Web overrides =  none
-    [INFO] web.xml file = file:/.../tutorial/src/main/webapp/WEB-INF/web.xml
-    [INFO] Webapp directory = /.../tutorial/src/main/webapp
-    [INFO] jetty-9.3.0.v20150612
-    [INFO] Started 
o.e.j.m.p.JettyWebAppContext@6872f9c8{/,file:/.../tutorial/src/main/webapp/,AVAILABLE}{file:/.../tutorial/src/main/webapp/}
-    [INFO] Started ServerConnector@723875bc{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
-    [INFO] Started @2367ms
-    [INFO] Started Jetty Server</screen>
-
-- So the Jetty container just started.
-
-- Now go to http://localhost:8080/ URL. You should see "No artists found 
message" in the web browser and
-the following output in the IDEA console:
-
-    INFO: Loading XML configuration resource from 
file:/.../tutorial/target/classes/cayenne-project.xml
-    INFO: loading user name and password.
-    INFO: Connecting to 'jdbc:derby:memory:testdb;create=true' as 'null'
-    INFO: +++ Connecting: SUCCESS.
-    INFO: setting DataNode 'datanode' as default, used by all unlinked DataMaps
-    INFO: Detected and installed adapter: 
org.apache.cayenne.dba.derby.DerbyAdapter
-    INFO: --- transaction started.
-    INFO: No schema detected, will create mapped tables
-    INFO: CREATE TABLE GALLERY (ID INTEGER NOT NULL, NAME VARCHAR (200), 
PRIMARY KEY (ID))
-    INFO: CREATE TABLE ARTIST (DATE_OF_BIRTH DATE, ID INTEGER NOT NULL, NAME 
VARCHAR (200), PRIMARY KEY (ID))
-    INFO: CREATE TABLE PAINTING (ARTIST_ID INTEGER, GALLERY_ID INTEGER, ID 
INTEGER NOT NULL,
-          NAME VARCHAR (200), PRIMARY KEY (ID))
-    INFO: ALTER TABLE PAINTING ADD FOREIGN KEY (ARTIST_ID) REFERENCES ARTIST 
(ID)
-    INFO: ALTER TABLE PAINTING ADD FOREIGN KEY (GALLERY_ID) REFERENCES GALLERY 
(ID)
-    INFO: CREATE TABLE AUTO_PK_SUPPORT (
-          TABLE_NAME CHAR(100) NOT NULL,  NEXT_ID BIGINT NOT NULL,  PRIMARY 
KEY(TABLE_NAME))
-    ...
-    INFO: SELECT t0.DATE_OF_BIRTH, t0.NAME, t0.ID FROM ARTIST t0 ORDER BY 
t0.NAME
-    INFO: === returned 0 rows. - took 17 ms.
-    INFO: +++ transaction committed.</screen>
-
-- You can click on "Create new artist" link to create artists. Existing 
artists can be edited by clicking on their name:
-
-image::chrome-webapp.png[align="center"]
-
-You are done with the tutorial!
\ No newline at end of file
diff --git 
a/docs/asciidoc/getting-started-guide/src/docs/asciidoc/getting-started-guide.adoc
 
b/docs/asciidoc/getting-started-guide/src/docs/asciidoc/getting-started-guide.adoc
index 87a401ff3..5725bd762 100644
--- 
a/docs/asciidoc/getting-started-guide/src/docs/asciidoc/getting-started-guide.adoc
+++ 
b/docs/asciidoc/getting-started-guide/src/docs/asciidoc/getting-started-guide.adoc
@@ -42,5 +42,3 @@ include::_getting-started-guide/setup.adoc[]
 include::_getting-started-guide/part2.adoc[]
 
 include::_getting-started-guide/part3.adoc[]
-
-include::_getting-started-guide/webapp.adoc[]
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 25671b772..9d60a361c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,7 +66,6 @@
                <module>cayenne-project-compatibility</module>
                <module>cayenne-server</module>
                <module>cayenne-velocity</module>
-               <module>cayenne-web</module>
                <module>cayenne-osgi</module>
                <module>maven-plugins</module>
                <module>modeler</module>
diff --git a/tutorials/tutorial/pom.xml b/tutorials/tutorial/pom.xml
index 89b6c2dc3..f865dbb57 100644
--- a/tutorials/tutorial/pom.xml
+++ b/tutorials/tutorial/pom.xml
@@ -37,11 +37,6 @@
                        <version>3.1.0</version>
                        <scope>provided</scope>
                </dependency>
-               <dependency>
-                       <groupId>org.apache.cayenne</groupId>
-                       <artifactId>cayenne-web</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
                <dependency>
                        <groupId>org.apache.derby</groupId>
                        <artifactId>derby</artifactId>
diff --git a/tutorials/tutorial/src/main/webapp/WEB-INF/web.xml 
b/tutorials/tutorial/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 40a668f2c..000000000
--- a/tutorials/tutorial/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE web-app
-   PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
-   "http://java.sun.com/dtd/web-app_2_3.dtd";>
-<!--
-       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
-
-       https://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.   
--->
-<web-app>
-       <display-name>Cayenne Tutorial</display-name>
-
-       <!--
-               This filter provides each request thread with a session-bound
-               DataContext
-       -->
-       <filter>
-               <filter-name>cayenne-project</filter-name>
-               
<filter-class>org.apache.cayenne.configuration.web.CayenneFilter</filter-class>
-       </filter>
-       <filter-mapping>
-               <filter-name>cayenne-project</filter-name>
-               <url-pattern>/*</url-pattern>
-       </filter-mapping>
-       <welcome-file-list>
-               <welcome-file>index.jsp</welcome-file>
-       </welcome-file-list>
-</web-app>
\ No newline at end of file
diff --git a/tutorials/tutorial/src/main/webapp/detail.jsp 
b/tutorials/tutorial/src/main/webapp/detail.jsp
deleted file mode 100644
index 1f9f890f2..000000000
--- a/tutorials/tutorial/src/main/webapp/detail.jsp
+++ /dev/null
@@ -1,89 +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
- *
- *    https://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.
- ****************************************************************/
- -->
-<%@ page language="java" contentType="text/html" %>
-<%@ page import="org.apache.cayenne.tutorial.persistent.*" %>
-<%@ page import="org.apache.cayenne.*" %>
-<%@ page import="java.time.format.DateTimeFormatter"%>
-
-// tag::content[]
-<% 
-    ObjectContext context = BaseContext.getThreadObjectContext();
-    String id = request.getParameter("id");
-
-    // find artist for id
-    Artist artist = null;
-    if(id != null && id.trim().length() > 0) {
-        artist = Cayenne.objectForPK(context, Artist.class, 
Integer.parseInt(id));
-    }
-
-    if("POST".equals(request.getMethod())) {
-        // if no id is saved in the hidden field, we are dealing with
-        // create new artist request
-        if(artist == null) {
-            artist = context.newObject(Artist.class);
-        }
-
-        // note that in a real application we would so dome validation ...
-        // here we just hope the input is correct
-        artist.setName(request.getParameter("name"));
-        artist.setDateOfBirthString(request.getParameter("dateOfBirth"));
-
-        context.commitChanges();
-
-        response.sendRedirect("index.jsp");
-    }
-
-    if(artist == null) {
-        // create transient artist for the form response rendering
-        artist = new Artist();
-    }
-
-    String name = artist.getName() == null ? "" : artist.getName();
-    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
-    String dob = artist.getDateOfBirth() == null
-                            ? "" :artist.getDateOfBirth().format(formatter);
-%>
-<html>
-    <head>
-        <title>Artist Details</title>
-    </head>
-    <body>
-        <h2>Artists Details</h2>
-        <form name="EditArtist" action="detail.jsp" method="POST">
-            <input type="hidden" name="id" value="<%= id != null ? id : "" %>" 
/>
-            <table border="0">
-                <tr>
-                    <td>Name:</td>
-                    <td><input type="text" name="name" value="<%= name 
%>"/></td>
-                </tr>
-                <tr>
-                    <td>Date of Birth (yyyyMMdd):</td>
-                    <td><input type="text" name="dateOfBirth" value="<%= dob 
%>"/></td>
-                </tr>
-                <tr>
-                    <td></td>
-                    <td align="right"><input type="submit" value="Save" /></td>
-                </tr>  
-            </table>
-        </form>
-    </body>    
-</html>
-// end::content[]
\ No newline at end of file
diff --git a/tutorials/tutorial/src/main/webapp/index.jsp 
b/tutorials/tutorial/src/main/webapp/index.jsp
deleted file mode 100644
index 64090cc89..000000000
--- a/tutorials/tutorial/src/main/webapp/index.jsp
+++ /dev/null
@@ -1,53 +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
- *
- *    https://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.
- ****************************************************************/
- -->
-<%@ page contentType="text/html" %>
-<%@ page import="org.apache.cayenne.tutorial.persistent.*" %>
-<%@ page import="org.apache.cayenne.*" %>
-<%@ page import="org.apache.cayenne.query.*" %>
-<%@ page import="java.util.*" %>
-// tag::content[]
-<%
-    ObjectContext context = BaseContext.getThreadObjectContext();
-    List<Artist> artists = ObjectSelect.query(Artist.class)
-                .orderBy(Artist.NAME.asc())
-                .select(context);
-%>
-<html>
-    <head>
-        <title>Main</title>
-    </head>
-    <body>
-        <h2>Artists:</h2>
-        
-        <% if(artists.isEmpty()) {%>
-        <p>No artists found</p>
-        <% } else { 
-               for(Artist a : artists) {
-        %>
-        <p><a href="detail.jsp?id=<%=Cayenne.intPKForObject(a)%>"> 
<%=a.getName()%> </a></p>
-        <%
-            }
-            } %>
-        <hr>
-        <p><a href="detail.jsp">Create new artist...</a></p>
-    </body>    
-</html>
-// end::content[]
\ No newline at end of file

Reply via email to