Author: markt
Date: Sun Sep 9 18:15:01 2012
New Revision: 1382552
URL: http://svn.apache.org/viewvc?rev=1382552&view=rev
Log:
Initial implementation of new resources API
Added:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/
(with props)
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/DirResourceSet.java
(with props)
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/EmptyResource.java
(with props)
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/FileResource.java
(with props)
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/JarResource.java
(with props)
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/JarResourceSet.java
(with props)
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/StandardRoot.java
(with props)
Propchange:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/
------------------------------------------------------------------------------
bugtraq:append = false
Propchange:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/
------------------------------------------------------------------------------
bugtraq:label = Bugzilla ID (optional)
Propchange:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/
------------------------------------------------------------------------------
--- bugtraq:message (added)
+++ bugtraq:message Sun Sep 9 18:15:01 2012
@@ -0,0 +1 @@
+Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=%BUGID%
Propchange:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/
------------------------------------------------------------------------------
bugtraq:url = https://issues.apache.org/bugzilla/show_bug.cgi?id=%BUGID%
Added:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/DirResourceSet.java
URL:
http://svn.apache.org/viewvc/tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/DirResourceSet.java?rev=1382552&view=auto
==============================================================================
---
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/DirResourceSet.java
(added)
+++
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/DirResourceSet.java
Sun Sep 9 18:15:01 2012
@@ -0,0 +1,104 @@
+/*
+ * 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.File;
+import java.io.InputStream;
+import java.util.Set;
+
+import org.apache.catalina.WebResource;
+import org.apache.catalina.WebResourceRoot;
+import org.apache.catalina.WebResourceSet;
+import org.apache.catalina.util.ResourceSet;
+
+public class DirResourceSet implements WebResourceSet {
+
+ private static final String[] EMPTY_STRING_ARRAY = new String[0];
+
+ private final WebResourceRoot root;
+ private final File base;
+ private final String webAppMount;
+
+ public DirResourceSet(WebResourceRoot root, File base, String webAppMount,
+ String internalPath) {
+ this.root = root;
+ base = new File(base, internalPath);
+ if (base.isDirectory() == false) {
+ throw new IllegalArgumentException(
+ "TODO-i18n: base/internalPath is not a directory");
+ }
+ this.base = base;
+ this.webAppMount = webAppMount;
+ }
+
+ @Override
+ public WebResource getResource(String path) {
+ if (path.startsWith(webAppMount)) {
+ File f = new File(base, path.substring(webAppMount.length()));
+ return new FileResource(root, f, path);
+ } else {
+ return new EmptyResource(root, path);
+ }
+ }
+
+ @Override
+ public String[] list(String path) {
+ if (path.startsWith(webAppMount)) {
+ File f = new File(base, path.substring(webAppMount.length()));
+ String[] result = f.list();
+ if (result == null) {
+ return EMPTY_STRING_ARRAY;
+ } else {
+ return result;
+ }
+ } else {
+ return EMPTY_STRING_ARRAY;
+ }
+ }
+
+ @Override
+ public Set<String> listWebAppPaths(String path) {
+ ResourceSet<String> result = new ResourceSet<>();
+ if (path.startsWith(webAppMount)) {
+ File f = new File(base, path.substring(webAppMount.length()));
+ String[] list = f.list();
+ if (list != null) {
+ for (String entry : list) {
+ result.add(path + "/" + entry);
+ }
+ }
+ }
+ result.setLocked(true);
+ return result;
+ }
+
+ @Override
+ public boolean mkdir(String path) {
+ if (path.startsWith(webAppMount)) {
+ File f = new File(base, path.substring(webAppMount.length()));
+ return f.mkdir();
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean write(String path, InputStream is) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+}
Propchange:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/DirResourceSet.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/EmptyResource.java
URL:
http://svn.apache.org/viewvc/tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/EmptyResource.java?rev=1382552&view=auto
==============================================================================
---
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/EmptyResource.java
(added)
+++
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/EmptyResource.java
Sun Sep 9 18:15:01 2012
@@ -0,0 +1,134 @@
+/*
+ * 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 org.apache.catalina.WebResource;
+import org.apache.catalina.WebResourceRoot;
+
+public class EmptyResource implements WebResource {
+
+ private final WebResourceRoot root;
+ private final String webAppPath;
+
+ public EmptyResource(WebResourceRoot root, String webAppPath) {
+ this.root = root;
+ this.webAppPath = webAppPath;
+ }
+
+ @Override
+ public long getLastModified() {
+ return 0;
+ }
+
+ @Override
+ public String getLastModifiedHttp() {
+ return null;
+ }
+
+ @Override
+ public boolean exists() {
+ return false;
+ }
+
+ @Override
+ public boolean isDirectory() {
+ return false;
+ }
+
+ @Override
+ public boolean isFile() {
+ return false;
+ }
+
+ @Override
+ public boolean delete() {
+ return false;
+ }
+
+ @Override
+ public String getName() {
+ int index = webAppPath.lastIndexOf('/');
+ if (index == -1) {
+ return webAppPath;
+ } else {
+ return webAppPath.substring(index + 1);
+ }
+ }
+
+ @Override
+ public long getContentLength() {
+ return 0;
+ }
+
+ @Override
+ public String getCanonicalPath() {
+ return null;
+ }
+
+ @Override
+ public boolean canRead() {
+ return false;
+ }
+
+ @Override
+ public String getWebappPath() {
+ return webAppPath;
+ }
+
+ @Override
+ public String getETag() {
+ return null;
+ }
+
+ @Override
+ public void setMimeType(String mimeType) {
+ // NOOP
+ }
+
+ @Override
+ public String getMimeType() {
+ return null;
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ return null;
+ }
+
+ @Override
+ public byte[] getContent() {
+ return null;
+ }
+
+ @Override
+ public long getCreation() {
+ return 0;
+ }
+
+ @Override
+ public URL getURL() {
+ return null;
+ }
+
+ @Override
+ public WebResourceRoot getWebResourceRoot() {
+ return root;
+ }
+}
Propchange:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/EmptyResource.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/FileResource.java
URL:
http://svn.apache.org/viewvc/tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/FileResource.java?rev=1382552&view=auto
==============================================================================
---
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/FileResource.java
(added)
+++
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/FileResource.java
Sun Sep 9 18:15:01 2012
@@ -0,0 +1,161 @@
+/*
+ * 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.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.apache.catalina.WebResource;
+import org.apache.catalina.WebResourceRoot;
+
+public class FileResource implements WebResource {
+
+ private final WebResourceRoot root;
+ private final String webAppPath;
+ private final File resource;
+
+ public FileResource(WebResourceRoot root, File resource, String
webAppPath) {
+ this.root = root;
+ this.webAppPath = webAppPath;
+ this.resource = resource;
+ }
+
+ @Override
+ public long getLastModified() {
+ return resource.lastModified();
+ }
+
+ @Override
+ public String getLastModifiedHttp() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean exists() {
+ return resource.exists();
+ }
+
+ @Override
+ public boolean isDirectory() {
+ return resource.isDirectory();
+ }
+
+ @Override
+ public boolean isFile() {
+ return resource.isFile();
+ }
+
+ @Override
+ public boolean delete() {
+ return resource.delete();
+ }
+
+ @Override
+ public String getName() {
+ return resource.getName();
+ }
+
+ @Override
+ public long getContentLength() {
+ return resource.length();
+ }
+
+ @Override
+ public String getCanonicalPath() {
+ try {
+ return resource.getCanonicalPath();
+ } catch (IOException ioe) {
+ // TODO Log this?
+ return null;
+ }
+ }
+
+ @Override
+ public boolean canRead() {
+ return resource.canRead();
+ }
+
+ @Override
+ public String getWebappPath() {
+ return webAppPath;
+ }
+
+ @Override
+ public String getETag() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void setMimeType(String mimeType) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public String getMimeType() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ if (resource.exists()) {
+ try {
+ return new FileInputStream(resource);
+ } catch (FileNotFoundException fnfe) {
+ // Race condition - not an error
+ return null;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public byte[] getContent() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public long getCreation() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public URL getURL() {
+ try {
+ return resource.toURI().toURL();
+ } catch (MalformedURLException e) {
+ // TODO Log this?
+ return null;
+ }
+ }
+
+ @Override
+ public WebResourceRoot getWebResourceRoot() {
+ return root;
+ }
+}
Propchange:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/FileResource.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/JarResource.java
URL:
http://svn.apache.org/viewvc/tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/JarResource.java?rev=1382552&view=auto
==============================================================================
---
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/JarResource.java
(added)
+++
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/JarResource.java
Sun Sep 9 18:15:01 2012
@@ -0,0 +1,161 @@
+/*
+ * 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.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import org.apache.catalina.WebResource;
+import org.apache.catalina.WebResourceRoot;
+
+public class JarResource implements WebResource {
+
+ private final WebResourceRoot root;
+ private final JarFile base;
+ private final String baseUrl;
+ private final JarEntry resource;
+ private final String webAppPath;
+
+ public JarResource(WebResourceRoot root, JarFile base, String baseUrl,
+ JarEntry jarEntry, String webAppPath) {
+ this.root = root;
+ this.base = base;
+ this.baseUrl = "jar:" + baseUrl;
+ this.resource = jarEntry;
+ this.webAppPath = webAppPath;
+ }
+
+ @Override
+ public long getLastModified() {
+ return resource.getTime();
+ }
+
+ @Override
+ public String getLastModifiedHttp() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean exists() {
+ return true;
+ }
+
+ @Override
+ public boolean isDirectory() {
+ return resource.isDirectory();
+ }
+
+ @Override
+ public boolean isFile() {
+ return !resource.isDirectory();
+ }
+
+ @Override
+ public boolean delete() {
+ return false;
+ }
+
+ @Override
+ public String getName() {
+ String path = resource.getName();
+ int index = path.lastIndexOf('/');
+ if (index == -1) {
+ return path;
+ } else {
+ return path.substring(index + 1);
+ }
+ }
+
+ @Override
+ public long getContentLength() {
+ return resource.getSize();
+ }
+
+ @Override
+ public String getCanonicalPath() {
+ return null;
+ }
+
+ @Override
+ public boolean canRead() {
+ return true;
+ }
+
+ @Override
+ public String getWebappPath() {
+ return webAppPath;
+ }
+
+ @Override
+ public String getETag() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void setMimeType(String mimeType) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public String getMimeType() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ try {
+ return base.getInputStream(resource);
+ } catch (IOException e) {
+ // TODO log this?
+ return null;
+ }
+ }
+
+ @Override
+ public byte[] getContent() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public long getCreation() {
+ return resource.getTime();
+ }
+
+ @Override
+ public URL getURL() {
+ try {
+ return new URL(baseUrl + "!/" + resource.getName());
+ } catch (MalformedURLException e) {
+ // TODO Log this?
+ return null;
+ }
+ }
+
+ @Override
+ public WebResourceRoot getWebResourceRoot() {
+ return root;
+ }
+}
Propchange:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/JarResource.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/JarResourceSet.java
URL:
http://svn.apache.org/viewvc/tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/JarResourceSet.java?rev=1382552&view=auto
==============================================================================
---
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/JarResourceSet.java
(added)
+++
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/JarResourceSet.java
Sun Sep 9 18:15:01 2012
@@ -0,0 +1,104 @@
+/*
+ * 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.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.util.Enumeration;
+import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import org.apache.catalina.WebResource;
+import org.apache.catalina.WebResourceRoot;
+import org.apache.catalina.WebResourceSet;
+import org.apache.catalina.util.ResourceSet;
+
+public class JarResourceSet implements WebResourceSet {
+
+ private final WebResourceRoot root;
+ private final JarFile base;
+ private final String baseUrl;
+ private final String webAppMount;
+ private final String internalPath;
+
+ public JarResourceSet(WebResourceRoot root, File base, String webAppMount,
+ String internalPath) throws IllegalArgumentException {
+ this.root = root;
+ try {
+ this.base = new JarFile(base);
+ } catch (IOException ioe) {
+ throw new IllegalArgumentException(ioe);
+ }
+ try {
+ this.baseUrl = base.toURI().toURL().toString();
+ } catch (MalformedURLException e) {
+ throw new IllegalArgumentException(e);
+ }
+ this.webAppMount = webAppMount;
+ this.internalPath = internalPath;
+ }
+
+ @Override
+ public WebResource getResource(String path) {
+ if (path.startsWith(webAppMount)) {
+ StringBuilder pathInJar = new StringBuilder(internalPath);
+ pathInJar.append(path.substring(webAppMount.length()));
+ JarEntry jarEntry = base.getJarEntry(pathInJar.toString());
+ if (jarEntry == null) {
+ return new EmptyResource(root, path);
+ } else {
+ return new JarResource(root, base, baseUrl, jarEntry, path);
+ }
+ } else {
+ return new EmptyResource(root, path);
+ }
+ }
+
+ @Override
+ public String[] list(String path) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Set<String> listWebAppPaths(String path) {
+ ResourceSet<String> result = new ResourceSet<>();
+ Enumeration<JarEntry> entries = base.entries();
+ while (entries.hasMoreElements()) {
+ JarEntry entry = entries.nextElement();
+ String name = entry.getName();
+ if (name.startsWith(path)) {
+ result.add(name);
+ }
+ }
+ result.setLocked(true);
+ return result;
+ }
+
+ @Override
+ public boolean mkdir(String path) {
+ return false;
+ }
+
+ @Override
+ public boolean write(String path, InputStream is) {
+ return false;
+ }
+}
Propchange:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/JarResourceSet.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/StandardRoot.java
URL:
http://svn.apache.org/viewvc/tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/StandardRoot.java?rev=1382552&view=auto
==============================================================================
---
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/StandardRoot.java
(added)
+++
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/StandardRoot.java
Sun Sep 9 18:15:01 2012
@@ -0,0 +1,274 @@
+/*
+ * 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.File;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
+
+import org.apache.catalina.Context;
+import org.apache.catalina.Host;
+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.LifecycleMBeanBase;
+
+public class StandardRoot extends LifecycleMBeanBase
+ implements WebResourceRoot {
+
+ private final Context context;
+ private ArrayList<WebResourceSet> preResources = new ArrayList<>();
+ private WebResourceSet main;
+ private ArrayList<WebResourceSet> jarResources = new ArrayList<>();
+ private ArrayList<WebResourceSet> postResources = new ArrayList<>();
+
+ // Constructs to make iteration over all WebResourceSets simpler
+ private ArrayList<WebResourceSet> mainResources = new ArrayList<>();
+ private ArrayList<ArrayList<WebResourceSet>> allResources =
+ new ArrayList<>();
+ {
+ allResources.add(preResources);
+ allResources.add(mainResources);
+ allResources.add(jarResources);
+ allResources.add(postResources);
+ }
+
+
+ public StandardRoot(Context context) {
+ this.context = context;
+ }
+
+ @Override
+ public String[] list(String path) {
+ checkState();
+
+ // Set because we don't want duplicates
+ HashSet<String> result = new HashSet<>();
+ for (ArrayList<WebResourceSet> list : allResources) {
+ for (WebResourceSet webResourceSet : list) {
+ String[] entries = webResourceSet.list(path);
+ for (String entry : entries) {
+ result.add(entry);
+ }
+ }
+ }
+ return result.toArray(new String[result.size()]);
+ }
+
+
+ @Override
+ public Set<String> listWebAppPaths(String path) {
+ checkState();
+
+ // Set because we don't want duplicates
+ HashSet<String> result = new HashSet<>();
+ for (ArrayList<WebResourceSet> list : allResources) {
+ for (WebResourceSet webResourceSet : list) {
+ result.addAll(webResourceSet.listWebAppPaths(path));
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public boolean mkdir(String path) {
+ checkState();
+ // TODO Check pre-Resources for overrides
+ return main.mkdir(path);
+ }
+
+ @Override
+ public boolean write(String path, InputStream is) {
+ checkState();
+ // TODO Check pre-Resources for overrides
+ return main.write(path, is);
+ }
+
+ @Override
+ public WebResource getResource(String path) {
+ checkState();
+
+ WebResource result = null;
+ for (ArrayList<WebResourceSet> list : allResources) {
+ for (WebResourceSet webResourceSet : list) {
+ result = webResourceSet.getResource(path);
+ if (result.exists()) {
+ return result;
+ }
+ }
+ }
+
+ // Default is empty resource in main resources
+ return main.getResource(path);
+ }
+
+ @Override
+ public WebResource[] listResources(String path) {
+ checkState();
+
+ String[] resources = list(path);
+ WebResource[] result = new WebResource[resources.length];
+ for (int i = 0; i < resources.length; i++) {
+ result[i] = getResource(path + "/" + resources[i]);
+ }
+ return result;
+ }
+
+
+ @Override
+ public void createWebResourceSet(ResourceSetType type, URL url,
+ String webAppPath, String internalPath) {
+ createWebResourceSet(type, toFile(url), webAppPath, internalPath);
+ }
+
+ @Override
+ public void createWebResourceSet(ResourceSetType type, File file,
+ String webAppPath, String internalPath) {
+
+ ArrayList<WebResourceSet> resourceList;
+ WebResourceSet resourceSet;
+
+ switch (type) {
+ case PRE:
+ resourceList = preResources;
+ break;
+ case RESOURCE_JAR:
+ resourceList = jarResources;
+ break;
+ case POST:
+ resourceList = postResources;
+ break;
+ default:
+ throw new IllegalArgumentException("TODO i18n - Unknown type");
+ }
+
+ if (file.isFile()) {
+ if (file.getName().toLowerCase(Locale.ENGLISH).endsWith(".jar")) {
+ resourceSet = new JarResourceSet(this, file, webAppPath,
+ internalPath);
+ } else {
+ throw new UnsupportedOperationException("No FileResourceSet
class");
+ }
+ } else if (file.isDirectory()) {
+ resourceSet =
+ new DirResourceSet(this, file, webAppPath, internalPath);
+ } else {
+ throw new IllegalArgumentException("TODO i18n - invalid file");
+ }
+
+ resourceList.add(resourceSet);
+ }
+
+ @Override
+ public void setAllowLinking(boolean allowLinking) {
+ // TODO Implement this feature
+ }
+
+ @Override
+ public String getContextName() {
+ return context.getName();
+ }
+
+ private void checkState() {
+ if (!getState().isAvailable()) {
+ throw new IllegalStateException(
+ "TODO - i18n: Can't access resources before they are
started");
+ }
+ }
+
+ private File toFile(URL url) {
+ File f = null;
+
+ if ("jar".equals(url.getProtocol())) {
+ String jarUrl = url.toString();
+ String fileUrl = jarUrl.substring(4, jarUrl.length() - 2);
+ try {
+ f = new File(new URL(fileUrl).toURI());
+ } catch (MalformedURLException | URISyntaxException e) {
+ throw new IllegalArgumentException(e);
+ }
+ } else {
+ try {
+ f = new File(url.toURI());
+ } catch (URISyntaxException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+ return f;
+ }
+
+ // ----------------------------------------------------------- JMX
Lifecycle
+ @Override
+ protected String getDomainInternal() {
+ return context.getDomain();
+ }
+
+ @Override
+ protected String getObjectNameKeyProperties() {
+ StringBuilder keyProperties = new
StringBuilder("type=WebResourceRoot");
+ keyProperties.append(context.getMBeanKeyProperties());
+
+ return keyProperties.toString();
+ }
+
+ // ---------------------------------------------------------------
Lifecycle
+
+ // TODO Review the lifecycle, particularly around context
start/stop/restart
+ // Need to consider where resource sets may be defined / identified (
+ // e.g. context.xml for pre/post, Jar scanning for resource JARs).
+ // Clarify what gets set/reset when in the Javadoc for this class.
+ @Override
+ 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.getName());
+ }
+ if (f.isDirectory()) {
+ main = new DirResourceSet(this, f, "", "");
+ } else if(f.isFile() && docBase.endsWith(".war")) {
+ main = new JarResourceSet(this, f, "", "");
+ } else {
+ throw new IllegalArgumentException(
+ "TODO - i18n: Invalid main resoucres");
+ }
+
+ mainResources.clear();
+ mainResources.add(main);
+
+ setState(LifecycleState.STARTING);
+ }
+
+ @Override
+ protected void stopInternal() throws LifecycleException {
+ preResources.clear();
+ mainResources.clear();
+ jarResources.clear();
+ postResources.clear();
+
+ setState(LifecycleState.STOPPING);
+ }
+}
Propchange:
tomcat/sandbox/trunk-resources/java/org/apache/catalina/webresources/StandardRoot.java
------------------------------------------------------------------------------
svn:eol-style = native
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]