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