funkman 2004/07/02 09:25:31 Modified: catalina/src/share/org/apache/naming/resources FileDirContext.java LocalStrings.properties Log: If the dir listing errors, return an empty array instead of ending up with a NPE. Occured when a non-readable dir appeared inside the classes dir and TldLocationsCache was trying to init. An error was thrown and it said null. Now it keeps going and logs a warning message stating a directory could not be listed. Revision Changes Path 1.5 +278 -268 jakarta-tomcat-catalina/catalina/src/share/org/apache/naming/resources/FileDirContext.java Index: FileDirContext.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/naming/resources/FileDirContext.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- FileDirContext.java 27 Feb 2004 14:58:54 -0000 1.4 +++ FileDirContext.java 2 Jul 2004 16:25:31 -0000 1.5 @@ -1,18 +1,18 @@ /* * Copyright 1999,2004 The Apache Software Foundation. - * + * * Licensed 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.naming.resources; @@ -49,6 +49,8 @@ public class FileDirContext extends BaseDirContext { + private static org.apache.commons.logging.Log log= + org.apache.commons.logging.LogFactory.getLog( FileDirContext.class ); // -------------------------------------------------------------- Constants @@ -110,9 +112,9 @@ /** * Set the document root. - * + * * @param docBase The new document root - * + * * @exception IllegalArgumentException if the specified value is not * supported by this implementation * @exception IllegalArgumentException if this would create a @@ -120,23 +122,23 @@ */ public void setDocBase(String docBase) { - // Validate the format of the proposed document root - if (docBase == null) - throw new IllegalArgumentException - (sm.getString("resources.null")); + // Validate the format of the proposed document root + if (docBase == null) + throw new IllegalArgumentException + (sm.getString("resources.null")); - // Calculate a File object referencing this document base directory - base = new File(docBase); + // Calculate a File object referencing this document base directory + base = new File(docBase); try { base = base.getCanonicalFile(); } catch (IOException e) { // Ignore } - // Validate that the document base is an existing directory - if (!base.exists() || !base.isDirectory() || !base.canRead()) - throw new IllegalArgumentException - (sm.getString("fileResources.base", docBase)); + // Validate that the document base is an existing directory + if (!base.exists() || !base.isDirectory() || !base.canRead()) + throw new IllegalArgumentException + (sm.getString("fileResources.base", docBase)); this.absoluteBase = base.getAbsolutePath(); super.setDocBase(docBase); @@ -197,7 +199,7 @@ /** * Retrieves the named object. - * + * * @param name the name of the object to look up * @return the object bound to name * @exception NamingException if a naming exception is encountered @@ -206,11 +208,11 @@ throws NamingException { Object result = null; File file = file(name); - + if (file == null) throw new NamingException (sm.getString("resources.notFound", name)); - + if (file.isDirectory()) { FileDirContext tempContext = new FileDirContext(env); tempContext.setDocBase(file.getPath()); @@ -218,23 +220,23 @@ } else { result = new FileResource(file); } - + return result; - + } /** - * Unbinds the named object. Removes the terminal atomic name in name - * from the target context--that named by all but the terminal atomic + * Unbinds the named object. Removes the terminal atomic name in name + * from the target context--that named by all but the terminal atomic * part of name. * <p> - * This method is idempotent. It succeeds even if the terminal atomic - * name is not bound in the target context, but throws - * NameNotFoundException if any of the intermediate contexts do not exist. - * + * This method is idempotent. It succeeds even if the terminal atomic + * name is not bound in the target context, but throws + * NameNotFoundException if any of the intermediate contexts do not exist. + * * @param name the name to bind; may not be empty - * @exception NameNotFoundException if an intermediate context does not + * @exception NameNotFoundException if an intermediate context does not * exist * @exception NamingException if a naming exception is encountered */ @@ -255,11 +257,11 @@ /** - * Binds a new name to the object bound to an old name, and unbinds the - * old name. Both names are relative to this context. Any attributes - * associated with the old name become associated with the new name. + * Binds a new name to the object bound to an old name, and unbinds the + * old name. Both names are relative to this context. Any attributes + * associated with the old name become associated with the new name. * Intermediate contexts of the old name are not changed. - * + * * @param oldName the name of the existing binding; may not be empty * @param newName the name of the new binding; may not be empty * @exception NameAlreadyBoundException if newName is already bound @@ -267,7 +269,7 @@ */ public void rename(String oldName, String newName) throws NamingException { - + File file = file(oldName); if (file == null) @@ -275,22 +277,22 @@ (sm.getString("resources.notFound", oldName)); File newFile = new File(base, newName); - + file.renameTo(newFile); - + } /** - * Enumerates the names bound in the named context, along with the class - * names of objects bound to them. The contents of any subcontexts are + * Enumerates the names bound in the named context, along with the class + * names of objects bound to them. The contents of any subcontexts are * not included. * <p> - * If a binding is added to or removed from this context, its effect on + * If a binding is added to or removed from this context, its effect on * an enumeration previously returned is undefined. - * + * * @param name the name of the context to list - * @return an enumeration of the names and class names of the bindings in + * @return an enumeration of the names and class names of the bindings in * this context. Each element of the enumeration is of type NameClassPair. * @exception NamingException if a naming exception is encountered */ @@ -311,15 +313,15 @@ /** - * Enumerates the names bound in the named context, along with the - * objects bound to them. The contents of any subcontexts are not + * Enumerates the names bound in the named context, along with the + * objects bound to them. The contents of any subcontexts are not * included. * <p> - * If a binding is added to or removed from this context, its effect on + * If a binding is added to or removed from this context, its effect on * an enumeration previously returned is undefined. - * + * * @param name the name of the context to list - * @return an enumeration of the bindings in this context. + * @return an enumeration of the bindings in this context. * Each element of the enumeration is of type Binding. * @exception NamingException if a naming exception is encountered */ @@ -340,28 +342,28 @@ /** - * Destroys the named context and removes it from the namespace. Any - * attributes associated with the name are also removed. Intermediate + * Destroys the named context and removes it from the namespace. Any + * attributes associated with the name are also removed. Intermediate * contexts are not destroyed. * <p> - * This method is idempotent. It succeeds even if the terminal atomic - * name is not bound in the target context, but throws - * NameNotFoundException if any of the intermediate contexts do not exist. - * - * In a federated naming system, a context from one naming system may be - * bound to a name in another. One can subsequently look up and perform - * operations on the foreign context using a composite name. However, an - * attempt destroy the context using this composite name will fail with - * NotContextException, because the foreign context is not a "subcontext" - * of the context in which it is bound. Instead, use unbind() to remove - * the binding of the foreign context. Destroying the foreign context - * requires that the destroySubcontext() be performed on a context from + * This method is idempotent. It succeeds even if the terminal atomic + * name is not bound in the target context, but throws + * NameNotFoundException if any of the intermediate contexts do not exist. + * + * In a federated naming system, a context from one naming system may be + * bound to a name in another. One can subsequently look up and perform + * operations on the foreign context using a composite name. However, an + * attempt destroy the context using this composite name will fail with + * NotContextException, because the foreign context is not a "subcontext" + * of the context in which it is bound. Instead, use unbind() to remove + * the binding of the foreign context. Destroying the foreign context + * requires that the destroySubcontext() be performed on a context from * the foreign context's "native" naming system. - * + * * @param name the name of the context to be destroyed; may not be empty - * @exception NameNotFoundException if an intermediate context does not + * @exception NameNotFoundException if an intermediate context does not * exist - * @exception NotContextException if the name is bound but does not name + * @exception NotContextException if the name is bound but does not name * a context, or does not name a context of the appropriate type */ public void destroySubcontext(String name) @@ -371,12 +373,12 @@ /** - * Retrieves the named object, following links except for the terminal - * atomic component of the name. If the object bound to name is not a + * Retrieves the named object, following links except for the terminal + * atomic component of the name. If the object bound to name is not a * link, returns the object itself. - * + * * @param name the name of the object to look up - * @return the object bound to name, not following the terminal link + * @return the object bound to name, not following the terminal link * (if any). * @exception NamingException if a naming exception is encountered */ @@ -390,17 +392,17 @@ /** * Retrieves the full name of this context within its own namespace. * <p> - * Many naming services have a notion of a "full name" for objects in - * their respective namespaces. For example, an LDAP entry has a - * distinguished name, and a DNS record has a fully qualified name. This - * method allows the client application to retrieve this name. The string - * returned by this method is not a JNDI composite name and should not be - * passed directly to context methods. In naming systems for which the - * notion of full name does not make sense, + * Many naming services have a notion of a "full name" for objects in + * their respective namespaces. For example, an LDAP entry has a + * distinguished name, and a DNS record has a fully qualified name. This + * method allows the client application to retrieve this name. The string + * returned by this method is not a JNDI composite name and should not be + * passed directly to context methods. In naming systems for which the + * notion of full name does not make sense, * OperationNotSupportedException is thrown. - * + * * @return this context's name in its own namespace; never null - * @exception OperationNotSupportedException if the naming system does + * @exception OperationNotSupportedException if the naming system does * not have the notion of a full name * @exception NamingException if a naming exception is encountered */ @@ -414,14 +416,14 @@ /** - * Retrieves selected attributes associated with a named object. - * See the class description regarding attribute models, attribute type + * Retrieves selected attributes associated with a named object. + * See the class description regarding attribute models, attribute type * names, and operational attributes. - * + * * @return the requested attributes; never null * @param name the name of the object from which to retrieve attributes - * @param attrIds the identifiers of the attributes to retrieve. null - * indicates that all attributes should be retrieved; an empty array + * @param attrIds the identifiers of the attributes to retrieve. null + * indicates that all attributes should be retrieved; an empty array * indicates that none should be retrieved * @exception NamingException if a naming exception is encountered */ @@ -441,14 +443,14 @@ /** - * Modifies the attributes associated with a named object. The order of - * the modifications is not specified. Where possible, the modifications + * Modifies the attributes associated with a named object. The order of + * the modifications is not specified. Where possible, the modifications * are performed atomically. - * + * * @param name the name of the object whose attributes will be updated - * @param mod_op the modification operation, one of: ADD_ATTRIBUTE, + * @param mod_op the modification operation, one of: ADD_ATTRIBUTE, * REPLACE_ATTRIBUTE, REMOVE_ATTRIBUTE - * @param attrs the attributes to be used for the modification; may not + * @param attrs the attributes to be used for the modification; may not * be null * @exception AttributeModificationException if the modification cannot be * completed successfully @@ -456,19 +458,19 @@ */ public void modifyAttributes(String name, int mod_op, Attributes attrs) throws NamingException { - + } /** - * Modifies the attributes associated with a named object using an an - * ordered list of modifications. The modifications are performed in the - * order specified. Each modification specifies a modification operation - * code and an attribute on which to operate. Where possible, the + * Modifies the attributes associated with a named object using an an + * ordered list of modifications. The modifications are performed in the + * order specified. Each modification specifies a modification operation + * code and an attribute on which to operate. Where possible, the * modifications are performed atomically. - * + * * @param name the name of the object whose attributes will be updated - * @param mods an ordered sequence of modifications to be performed; may + * @param mods an ordered sequence of modifications to be performed; may * not be null * @exception AttributeModificationException if the modification cannot be * completed successfully @@ -476,66 +478,66 @@ */ public void modifyAttributes(String name, ModificationItem[] mods) throws NamingException { - + } /** - * Binds a name to an object, along with associated attributes. If attrs - * is null, the resulting binding will have the attributes associated - * with obj if obj is a DirContext, and no attributes otherwise. If attrs - * is non-null, the resulting binding will have attrs as its attributes; + * Binds a name to an object, along with associated attributes. If attrs + * is null, the resulting binding will have the attributes associated + * with obj if obj is a DirContext, and no attributes otherwise. If attrs + * is non-null, the resulting binding will have attrs as its attributes; * any attributes associated with obj are ignored. - * + * * @param name the name to bind; may not be empty * @param obj the object to bind; possibly null * @param attrs the attributes to associate with the binding * @exception NameAlreadyBoundException if name is already bound - * @exception InvalidAttributesException if some "mandatory" attributes + * @exception InvalidAttributesException if some "mandatory" attributes * of the binding are not supplied * @exception NamingException if a naming exception is encountered */ public void bind(String name, Object obj, Attributes attrs) throws NamingException { - + // Note: No custom attributes allowed - + File file = new File(base, name); if (file.exists()) throw new NameAlreadyBoundException (sm.getString("resources.alreadyBound", name)); - + rebind(name, obj, attrs); - + } /** - * Binds a name to an object, along with associated attributes, - * overwriting any existing binding. If attrs is null and obj is a - * DirContext, the attributes from obj are used. If attrs is null and obj + * Binds a name to an object, along with associated attributes, + * overwriting any existing binding. If attrs is null and obj is a + * DirContext, the attributes from obj are used. If attrs is null and obj * is not a DirContext, any existing attributes associated with the object - * already bound in the directory remain unchanged. If attrs is non-null, - * any existing attributes associated with the object already bound in - * the directory are removed and attrs is associated with the named - * object. If obj is a DirContext and attrs is non-null, the attributes + * already bound in the directory remain unchanged. If attrs is non-null, + * any existing attributes associated with the object already bound in + * the directory are removed and attrs is associated with the named + * object. If obj is a DirContext and attrs is non-null, the attributes * of obj are ignored. - * + * * @param name the name to bind; may not be empty * @param obj the object to bind; possibly null * @param attrs the attributes to associate with the binding - * @exception InvalidAttributesException if some "mandatory" attributes + * @exception InvalidAttributesException if some "mandatory" attributes * of the binding are not supplied * @exception NamingException if a naming exception is encountered */ public void rebind(String name, Object obj, Attributes attrs) throws NamingException { - + // Note: No custom attributes allowed // Check obj type - + File file = new File(base, name); - + InputStream is = null; if (obj instanceof Resource) { try { @@ -557,9 +559,9 @@ if (is == null) throw new NamingException (sm.getString("resources.bindFailed", name)); - + // Open os - + try { FileOutputStream os = null; byte buffer[] = new byte[BUFFER_SIZE]; @@ -581,30 +583,30 @@ throw new NamingException (sm.getString("resources.bindFailed", e)); } - + } /** - * Creates and binds a new context, along with associated attributes. - * This method creates a new subcontext with the given name, binds it in - * the target context (that named by all but terminal atomic component of - * the name), and associates the supplied attributes with the newly - * created object. All intermediate and target contexts must already - * exist. If attrs is null, this method is equivalent to + * Creates and binds a new context, along with associated attributes. + * This method creates a new subcontext with the given name, binds it in + * the target context (that named by all but terminal atomic component of + * the name), and associates the supplied attributes with the newly + * created object. All intermediate and target contexts must already + * exist. If attrs is null, this method is equivalent to * Context.createSubcontext(). - * + * * @param name the name of the context to create; may not be empty * @param attrs the attributes to associate with the newly created context * @return the newly created context * @exception NameAlreadyBoundException if the name is already bound - * @exception InvalidAttributesException if attrs does not contain all + * @exception InvalidAttributesException if attrs does not contain all * the mandatory attributes required for creation * @exception NamingException if a naming exception is encountered */ public DirContext createSubcontext(String name, Attributes attrs) throws NamingException { - + File file = new File(base, name); if (file.exists()) throw new NameAlreadyBoundException @@ -613,18 +615,18 @@ throw new NamingException (sm.getString("resources.bindFailed", name)); return (DirContext) lookup(name); - + } /** - * Retrieves the schema associated with the named object. The schema - * describes rules regarding the structure of the namespace and the - * attributes stored within it. The schema specifies what types of - * objects can be added to the directory and where they can be added; - * what mandatory and optional attributes an object can have. The range + * Retrieves the schema associated with the named object. The schema + * describes rules regarding the structure of the namespace and the + * attributes stored within it. The schema specifies what types of + * objects can be added to the directory and where they can be added; + * what mandatory and optional attributes an object can have. The range * of support for schemas is directory-specific. - * + * * @param name the name of the object whose schema is to be retrieved * @return the schema associated with the context; never null * @exception OperationNotSupportedException if schema not supported @@ -637,12 +639,12 @@ /** - * Retrieves a context containing the schema objects of the named + * Retrieves a context containing the schema objects of the named * object's class definitions. - * - * @param name the name of the object whose object class definition is to + * + * @param name the name of the object whose object class definition is to * be retrieved - * @return the DirContext containing the named object's class + * @return the DirContext containing the named object's class * definitions; never null * @exception OperationNotSupportedException if schema not supported * @exception NamingException if a naming exception is encountered @@ -654,19 +656,19 @@ /** - * Searches in a single context for objects that contain a specified set - * of attributes, and retrieves selected attributes. The search is + * Searches in a single context for objects that contain a specified set + * of attributes, and retrieves selected attributes. The search is * performed using the default SearchControls settings. - * + * * @param name the name of the context to search - * @param matchingAttributes the attributes to search for. If empty or + * @param matchingAttributes the attributes to search for. If empty or * null, all objects in the target context are returned. - * @param attributesToReturn the attributes to return. null indicates - * that all attributes are to be returned; an empty array indicates that + * @param attributesToReturn the attributes to return. null indicates + * that all attributes are to be returned; an empty array indicates that * none are to be returned. - * @return a non-null enumeration of SearchResult objects. Each - * SearchResult contains the attributes identified by attributesToReturn - * and the name of the corresponding object, named relative to the + * @return a non-null enumeration of SearchResult objects. Each + * SearchResult contains the attributes identified by attributesToReturn + * and the name of the corresponding object, named relative to the * context named by name. * @exception NamingException if a naming exception is encountered */ @@ -678,17 +680,17 @@ /** - * Searches in a single context for objects that contain a specified set - * of attributes. This method returns all the attributes of such objects. - * It is equivalent to supplying null as the atributesToReturn parameter + * Searches in a single context for objects that contain a specified set + * of attributes. This method returns all the attributes of such objects. + * It is equivalent to supplying null as the atributesToReturn parameter * to the method search(Name, Attributes, String[]). - * + * * @param name the name of the context to search - * @param matchingAttributes the attributes to search for. If empty or + * @param matchingAttributes the attributes to search for. If empty or * null, all objects in the target context are returned. - * @return a non-null enumeration of SearchResult objects. Each - * SearchResult contains the attributes identified by attributesToReturn - * and the name of the corresponding object, named relative to the + * @return a non-null enumeration of SearchResult objects. Each + * SearchResult contains the attributes identified by attributesToReturn + * and the name of the corresponding object, named relative to the * context named by name. * @exception NamingException if a naming exception is encountered */ @@ -699,25 +701,25 @@ /** - * Searches in the named context or object for entries that satisfy the - * given search filter. Performs the search as specified by the search + * Searches in the named context or object for entries that satisfy the + * given search filter. Performs the search as specified by the search * controls. - * + * * @param name the name of the context or object to search - * @param filter the filter expression to use for the search; may not be + * @param filter the filter expression to use for the search; may not be * null - * @param cons the search controls that control the search. If null, - * the default search controls are used (equivalent to + * @param cons the search controls that control the search. If null, + * the default search controls are used (equivalent to * (new SearchControls())). - * @return an enumeration of SearchResults of the objects that satisfy + * @return an enumeration of SearchResults of the objects that satisfy * the filter; never null - * @exception InvalidSearchFilterException if the search filter specified + * @exception InvalidSearchFilterException if the search filter specified * is not supported or understood by the underlying directory - * @exception InvalidSearchControlsException if the search controls + * @exception InvalidSearchControlsException if the search controls * contain invalid settings * @exception NamingException if a naming exception is encountered */ - public NamingEnumeration search(String name, String filter, + public NamingEnumeration search(String name, String filter, SearchControls cons) throws NamingException { return null; @@ -725,30 +727,30 @@ /** - * Searches in the named context or object for entries that satisfy the - * given search filter. Performs the search as specified by the search + * Searches in the named context or object for entries that satisfy the + * given search filter. Performs the search as specified by the search * controls. - * + * * @param name the name of the context or object to search - * @param filterExpr the filter expression to use for the search. - * The expression may contain variables of the form "{i}" where i is a + * @param filterExpr the filter expression to use for the search. + * The expression may contain variables of the form "{i}" where i is a * nonnegative integer. May not be null. - * @param filterArgs the array of arguments to substitute for the - * variables in filterExpr. The value of filterArgs[i] will replace each + * @param filterArgs the array of arguments to substitute for the + * variables in filterExpr. The value of filterArgs[i] will replace each * occurrence of "{i}". If null, equivalent to an empty array. - * @param cons the search controls that control the search. If null, the + * @param cons the search controls that control the search. If null, the * default search controls are used (equivalent to (new SearchControls())). - * @return an enumeration of SearchResults of the objects that satisy the + * @return an enumeration of SearchResults of the objects that satisy the * filter; never null - * @exception ArrayIndexOutOfBoundsException if filterExpr contains {i} + * @exception ArrayIndexOutOfBoundsException if filterExpr contains {i} * expressions where i is outside the bounds of the array filterArgs - * @exception InvalidSearchControlsException if cons contains invalid + * @exception InvalidSearchControlsException if cons contains invalid * settings - * @exception InvalidSearchFilterException if filterExpr with filterArgs + * @exception InvalidSearchFilterException if filterExpr with filterArgs * represents an invalid search filter * @exception NamingException if a naming exception is encountered */ - public NamingEnumeration search(String name, String filterExpr, + public NamingEnumeration search(String name, String filterExpr, Object[] filterArgs, SearchControls cons) throws NamingException { return null; @@ -769,46 +771,46 @@ */ protected String normalize(String path) { - String normalized = path; + String normalized = path; - // Normalize the slashes and add leading slash if necessary - if (normalized.indexOf('\\') >= 0) - normalized = normalized.replace('\\', '/'); - if (!normalized.startsWith("/")) - normalized = "/" + normalized; - - // Resolve occurrences of "//" in the normalized path - while (true) { - int index = normalized.indexOf("//"); - if (index < 0) - break; - normalized = normalized.substring(0, index) + - normalized.substring(index + 1); - } - - // Resolve occurrences of "/./" in the normalized path - while (true) { - int index = normalized.indexOf("/./"); - if (index < 0) - break; - normalized = normalized.substring(0, index) + - normalized.substring(index + 2); - } - - // Resolve occurrences of "/../" in the normalized path - while (true) { - int index = normalized.indexOf("/../"); - if (index < 0) - break; - if (index == 0) - return (null); // Trying to go outside our context - int index2 = normalized.lastIndexOf('/', index - 1); - normalized = normalized.substring(0, index2) + - normalized.substring(index + 3); - } + // Normalize the slashes and add leading slash if necessary + if (normalized.indexOf('\\') >= 0) + normalized = normalized.replace('\\', '/'); + if (!normalized.startsWith("/")) + normalized = "/" + normalized; + + // Resolve occurrences of "//" in the normalized path + while (true) { + int index = normalized.indexOf("//"); + if (index < 0) + break; + normalized = normalized.substring(0, index) + + normalized.substring(index + 1); + } + + // Resolve occurrences of "/./" in the normalized path + while (true) { + int index = normalized.indexOf("/./"); + if (index < 0) + break; + normalized = normalized.substring(0, index) + + normalized.substring(index + 2); + } + + // Resolve occurrences of "/../" in the normalized path + while (true) { + int index = normalized.indexOf("/../"); + if (index < 0) + break; + if (index == 0) + return (null); // Trying to go outside our context + int index2 = normalized.lastIndexOf('/', index - 1); + normalized = normalized.substring(0, index2) + + normalized.substring(index + 3); + } - // Return the normalized path that we have completed - return (normalized); + // Return the normalized path that we have completed + return (normalized); } @@ -847,7 +849,7 @@ String absPath = normalize(fileAbsPath); if (canPath != null) canPath = normalize(canPath); - if ((absoluteBase.length() < absPath.length()) + if ((absoluteBase.length() < absPath.length()) && (absoluteBase.length() < canPath.length())) { absPath = absPath.substring(absoluteBase.length() + 1); if ((canPath == null) || (absPath == null)) @@ -872,7 +874,7 @@ /** * List the resources which are members of a collection. - * + * * @param file Collection * @return Vector containg NamingEntry objects */ @@ -882,6 +884,14 @@ if (!file.isDirectory()) return entries; String[] names = file.list(); + if (names==null) { + /* Some IO error occurred such as bad file permissions. + Prevent a NPE with Arrays.sort(names) */ + log.warn(sm.getString("fileResources.listingNull", + file.getAbsolutePath())); + return entries; + } + Arrays.sort(names); // Sort alphabetically if (names == null) return entries; @@ -916,37 +926,37 @@ * to the file right away (which would put a lock on the file). */ protected class FileResource extends Resource { - - + + // -------------------------------------------------------- Constructor public FileResource(File file) { this.file = file; } - - + + // --------------------------------------------------- Member Variables - - + + /** * Associated file object. */ protected File file; - - + + /** * File length. */ protected long length = -1L; - - + + // --------------------------------------------------- Resource Methods - - + + /** * Content accessor. - * + * * @return InputStream */ public InputStream streamContent() @@ -956,8 +966,8 @@ } return super.streamContent(); } - - + + } @@ -965,8 +975,8 @@ /** - * This specialized resource attribute implementation does some lazy - * reading (to speed up simple checks, like checking the last modified + * This specialized resource attribute implementation does some lazy + * reading (to speed up simple checks, like checking the last modified * date). */ protected class FileResourceAttributes extends ResourceAttributes { @@ -978,19 +988,19 @@ public FileResourceAttributes(File file) { this.file = file; } - + // --------------------------------------------------- Member Variables - - + + protected File file; - - + + protected boolean accessed = false; - - + + // ----------------------------------------- ResourceAttributes Methods - - + + /** * Is collection. */ @@ -1001,11 +1011,11 @@ } return super.isCollection(); } - - + + /** * Get content length. - * + * * @return content length value */ public long getContentLength() { @@ -1014,11 +1024,11 @@ contentLength = file.length(); return contentLength; } - - + + /** * Get creation time. - * + * * @return creation time value */ public long getCreation() { @@ -1027,11 +1037,11 @@ creation = file.lastModified(); return creation; } - - + + /** * Get creation date. - * + * * @return Creation date value */ public Date getCreationDate() { @@ -1040,11 +1050,11 @@ } return super.getCreationDate(); } - - + + /** * Get last modified time. - * + * * @return lastModified time value */ public long getLastModified() { @@ -1053,11 +1063,11 @@ lastModified = file.lastModified(); return lastModified; } - - + + /** * Get lastModified date. - * + * * @return LastModified date value */ public Date getLastModifiedDate() { @@ -1066,11 +1076,11 @@ } return super.getLastModifiedDate(); } - - + + /** * Get name. - * + * * @return Name value */ public String getName() { @@ -1078,11 +1088,11 @@ name = file.getName(); return name; } - - + + /** * Get resource type. - * + * * @return String resource type */ public String getResourceType() { @@ -1092,8 +1102,8 @@ } return super.getResourceType(); } - - + + } 1.2 +1 -0 jakarta-tomcat-catalina/catalina/src/share/org/apache/naming/resources/LocalStrings.properties Index: LocalStrings.properties =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/naming/resources/LocalStrings.properties,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- LocalStrings.properties 18 Jul 2002 16:47:33 -0000 1.1 +++ LocalStrings.properties 2 Jul 2004 16:25:31 -0000 1.2 @@ -1,4 +1,5 @@ fileResources.base=Document base {0} does not exist or is not a readable directory +fileResources.listingNull=Could not get dir listing for {0} warResources.notWar=Doc base must point to a WAR file warResources.invalidWar=Invalid or unreadable WAR file : {0} jarResources.syntax=Document base {0} must start with 'jar:' and end with '!/'
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]