Author: markt
Date: Wed Oct 29 17:44:11 2014
New Revision: 1635222
URL: http://svn.apache.org/r1635222
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=57155
Allow a web application to be configured that does not have a docBase on the
file system. This is primarily intended for use when embedding.
Added:
tomcat/trunk/java/org/apache/catalina/webresources/EmptyResourceSet.java
(with props)
Modified:
tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java
tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
tomcat/trunk/webapps/docs/changelog.xml
Added: tomcat/trunk/java/org/apache/catalina/webresources/EmptyResourceSet.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/EmptyResourceSet.java?rev=1635222&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/EmptyResourceSet.java
(added)
+++ tomcat/trunk/java/org/apache/catalina/webresources/EmptyResourceSet.java
Wed Oct 29 17:44:11 2014
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.catalina.webresources;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Set;
+
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.LifecycleState;
+import org.apache.catalina.WebResource;
+import org.apache.catalina.WebResourceRoot;
+import org.apache.catalina.WebResourceSet;
+import org.apache.catalina.util.LifecycleBase;
+
+/**
+ * A {@link WebResourceSet} implementation that is not backed by a file system
+ * and behaves as if it has no resources available. This is primarily used in
+ * embedded mode when the web application is configured entirely
+ * programmatically and does not use any static resources from the file system.
+ */
+public class EmptyResourceSet extends LifecycleBase implements WebResourceSet {
+
+ private static final String[] EMPTY_STRING_ARRAY = new String[0];
+
+ private WebResourceRoot root;
+ private boolean classLoaderOnly;
+
+ public EmptyResourceSet(WebResourceRoot root) {
+ this.root = root;
+ }
+
+ /**
+ * {@inheritDoc}
+ * <p>
+ * This implementation always returns an {@link EmptyResource}.
+ */
+ @Override
+ public WebResource getResource(String path) {
+ return new EmptyResource(root, path);
+ }
+
+ /**
+ * {@inheritDoc}
+ * <p>
+ * This implementation always returns an empty array.
+ */
+ @Override
+ public String[] list(String path) {
+ return EMPTY_STRING_ARRAY;
+ }
+
+ /**
+ * {@inheritDoc}
+ * <p>
+ * This implementation always returns an empty set.
+ */
+ @Override
+ public Set<String> listWebAppPaths(String path) {
+ return Collections.emptySet();
+ }
+
+ /**
+ * {@inheritDoc}
+ * <p>
+ * This implementation always returns false.
+ */
+ @Override
+ public boolean mkdir(String path) {
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ * <p>
+ * This implementation always returns false.
+ */
+ @Override
+ public boolean write(String path, InputStream is, boolean overwrite) {
+ return false;
+ }
+
+ @Override
+ public void setRoot(WebResourceRoot root) {
+ this.root = root;
+ }
+
+ @Override
+ public boolean getClassLoaderOnly() {
+ return classLoaderOnly;
+ }
+
+ @Override
+ public void setClassLoaderOnly(boolean classLoaderOnly) {
+ this.classLoaderOnly = classLoaderOnly;
+ }
+
+ /**
+ * {@inheritDoc}
+ * <p>
+ * This implementation always returns null.
+ */
+ @Override
+ public URL getBaseUrl() {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ * <p>
+ * Calls to this method will be ignored as this implementation always read
+ * only.
+ */
+ @Override
+ public void setReadOnly(boolean readOnly) {
+
+ }
+
+ /**
+ * {@inheritDoc}
+ * <p>
+ * This implementation always returns true.
+ */
+ @Override
+ public boolean isReadOnly() {
+ return true;
+ }
+
+ @Override
+ protected void initInternal() throws LifecycleException {
+ // NO-OP
+ }
+
+ @Override
+ protected void startInternal() throws LifecycleException {
+ setState(LifecycleState.STARTING);
+ }
+
+ @Override
+ protected void stopInternal() throws LifecycleException {
+ setState(LifecycleState.STOPPING);
+ }
+
+ @Override
+ protected void destroyInternal() throws LifecycleException {
+ // NO-OP
+ }
+}
Propchange:
tomcat/trunk/java/org/apache/catalina/webresources/EmptyResourceSet.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java?rev=1635222&r1=1635221&r2=1635222&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java
(original)
+++ tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java Wed
Oct 29 17:44:11 2014
@@ -653,21 +653,26 @@ public class StandardRoot extends Lifecy
protected void startInternal() throws LifecycleException {
String docBase = context.getDocBase();
- File f = new File(docBase);
- if (!f.isAbsolute()) {
- f = new File(((Host)context.getParent()).getAppBaseFile(),
f.getPath());
- }
- if (f.isDirectory()) {
- main = new DirResourceSet(this, "/", f.getAbsolutePath(), "/");
- } else if(f.isFile() && docBase.endsWith(".war")) {
- main = new JarResourceSet(this, "/", f.getAbsolutePath(), "/");
+ mainResources.clear();
+
+ if (docBase == null) {
+ main = new EmptyResourceSet(this);
} else {
- throw new IllegalArgumentException(
- sm.getString("standardRoot.startInvalidMain",
- f.getAbsolutePath()));
+ File f = new File(docBase);
+ if (!f.isAbsolute()) {
+ f = new File(((Host)context.getParent()).getAppBaseFile(),
f.getPath());
+ }
+ if (f.isDirectory()) {
+ main = new DirResourceSet(this, "/", f.getAbsolutePath(), "/");
+ } else if(f.isFile() && docBase.endsWith(".war")) {
+ main = new JarResourceSet(this, "/", f.getAbsolutePath(), "/");
+ } else {
+ throw new IllegalArgumentException(
+ sm.getString("standardRoot.startInvalidMain",
+ f.getAbsolutePath()));
+ }
}
- mainResources.clear();
mainResources.add(main);
for (ArrayList<WebResourceSet> list : allResources) {
Modified:
tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java?rev=1635222&r1=1635221&r2=1635222&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
(original)
+++ tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
Wed Oct 29 17:44:11 2014
@@ -408,13 +408,8 @@ public class TestWsWebSocketContainer ex
Tomcat tomcat = getTomcatInstance();
- // Must have a real docBase - just use temp
- // Context ctx =
- // tomcat.addContext("", System.getProperty("java.io.tmpdir"));
- // FIXME: Using docBase = appBase. A temporary workaround to avoid
- // using the system temporary directory as docBase, until either
- // BZ 57154 is fixed or there is better API from BZ 57155
- Context ctx = tomcat.addContext("", "");
+ // No file system docBase required
+ Context ctx = tomcat.addContext("", null);
ctx.addApplicationListener(ConstantTxConfig.class.getName());
Tomcat.addServlet(ctx, "default", new DefaultServlet());
ctx.addServletMapping("/", "default");
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1635222&r1=1635221&r2=1635222&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Wed Oct 29 17:44:11 2014
@@ -190,6 +190,11 @@
AsyncContext createListener should wrap any instantiation exception
using a ServletException. (remm)
</fix>
+ <fix>
+ <bug>57155</bug>: Allow a web application to be configured that does
not
+ have a docBase on the file system. This is primarily intended for use
+ when embedding. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Coyote">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]