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]

Reply via email to