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: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to