tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ar...@apache.org
Subject cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/util FileUtil.java
Date Fri, 16 Mar 2001 23:39:53 GMT
arieh       01/03/16 15:39:52

  Modified:    src/share/org/apache/tomcat/util Tag: tomcat_32
                        FileUtil.java
  Log:
  Add support for docbase localized lookups.
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.9.2.7   +216 -5    jakarta-tomcat/src/share/org/apache/tomcat/util/Attic/FileUtil.java
  
  Index: FileUtil.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/Attic/FileUtil.java,v
  retrieving revision 1.9.2.6
  retrieving revision 1.9.2.7
  diff -u -r1.9.2.6 -r1.9.2.7
  --- FileUtil.java	2001/03/05 04:02:49	1.9.2.6
  +++ FileUtil.java	2001/03/16 23:39:50	1.9.2.7
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/Attic/FileUtil.java,v
1.9.2.6 2001/03/05 04:02:49 marcsaeg Exp $
  - * $Revision: 1.9.2.6 $
  - * $Date: 2001/03/05 04:02:49 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/Attic/FileUtil.java,v
1.9.2.7 2001/03/16 23:39:50 arieh Exp $
  + * $Revision: 1.9.2.7 $
  + * $Date: 2001/03/16 23:39:50 $
    *
    * ====================================================================
    *
  @@ -228,7 +228,7 @@
       }
   
       public static String patch(String path) {
  -	String patchPath = path;
  +	String patchPath = path.trim();
   
   	// Move drive spec to the front of the path
   	if (patchPath.length() >= 3 &&
  @@ -421,7 +421,8 @@
       }
   
       /**  utility method to return the name of the localized file whose
  -     *   name best-matches the Locale passed as an argument
  +     *   name best-matches the Locale passed as an argument using the
  +     *   'file-based' lookup mechanism.
        *
        *  @param base the directory that is the Document Base for the context
        *			in which the 'path' passed is expected to be located
  @@ -441,6 +442,7 @@
       /**  utility method to get the best-match for getting the Localized
        *   version of the file whose 'path' is passed as an argument, using
        *   the 'loc' Locale, and performing 'safePath'checks
  +     *   The algorithm used matches 'file-based' lookup mechanism.
        *
        *  The method performs a resource lookup in a manner similar to the
        *  one specified by java.util.ResourceBundle.
  @@ -592,4 +594,213 @@
   	return null;
       }
   
  +    /**  utility method to return the name of the localized file whose
  +     *   name best-matches the Locale passed as an argument using the
  +     *   'docbase-based' lookup mechanism.
  +     *
  +     *  @param base the directory that is the Document Base for the context
  +     *			in which the 'path' passed is expected to be located
  +     *  @param path the pathname for the file that is being searched for its
  +     *			best-matched Localized version
  +     *  @param loc the requested Locale to match
  +     *  @param fbloc the requested fall-back Locale to match
  +     *
  +     *  @return the name of the file that best-matched the Locale requested
  +     */
  +    public static String getDocBaseLocalizedFile (String base,
  +					   String path,
  +					   Locale loc,
  +					   Locale fbloc) {
  +	return getDocBaseLocalizedResource (base, path, loc, fbloc);
  +    }
  +
  +    /**  utility method to get the best-match for getting the Localized
  +     *   version of the file whose 'path' is passed as an argument, using
  +     *   the 'loc' Locale, and performing 'safePath'checks
  +     *   The algorithm used matches 'docBase-based' lookup mechanism.
  +     *
  +     *  In the case of 'typed' files (files whose name is [file].[ftype])
  +     *  search for localized versions of the file are looked for:
  +     *
  +     *   docbase + "/" + language1 + "_" + country1 + "_" + variant1 + filepath 
  +     *   docbase + "/" + language1 + "_" + country1 + filepath 
  +     *   docbase + "/" + language1 + filepath 
  +     *
  +     *  Where language1, country1, variant1 are associated with the Locale
  +     *  passed as an argument. 
  +     *
  +     *  For example, if the preferred Locale is <CODE>es_AR_POSIX</CODE>
  +     *  the docBase is '/' and  pathname is <CODE>/foo/bar/index.html</CODE>,
  +     *  then a search for the following localized versions of that file will
  +     *  be done, in order:
  +     *<UL>
  +     *<LI>/es_AR_POSIX/foo/bar/index.html</LI>
  +     *<LI>/es_AR/foo/bar/index.html</LI>
  +     *<LI>/es/foo/bar/index.html</LI>
  +     *<LI>/foo/bar/index_es.html</LI>
  +     *</UL>
  +     *
  +     *  @param base the directory that is the Document Base for the context
  +     *			in which the 'path' passed is expected to be located
  +     *  @param path the pathname for the file that is being searched for its
  +     *			best-matched Localized version
  +     *  @param loc the requested Locale to match
  +     *  @param fbloc the fallback Locale if the requested one not found
  +     *
  +     *  @return the name of the file that best-matched the Locale requested
  +     */
  +    public static String getDocBaseLocalizedResource (String base,
  +					              String path,
  +					              Locale loc,
  +					              Locale fbloc) {
  +	
  +	String locRes = null;
  +
  +	//  test first for safePath
  +	//
  +	locRes = safePath (base, path);
  +
  +	//  if it was not safe as requested, it will not be safe after
  +	//  localization lookup. Localization name transformations do not
  +	//  affect the safety of the file.
  +	//
  +	if (null == locRes)
  +	    return null;
  +
  +	if (null != loc)
  +	    locRes = getDocBaseLocalizedPath (base, path, loc);
  +
  +	if (null != locRes)
  +	    return locRes;
  +
  +	if (null != fbloc)
  +	    locRes= getDocBaseLocalizedPath (base, path, fbloc);
  +
  +	return locRes;
  +    }
  +
  +    /**  internal method to check the existence of a file
  +     *
  +     *  @param base the docbase where the file is
  +     *  @param info the pathinfo component under the docbase
  +     *
  +     *  @return a TestedFile object for that base+info
  +     */
  +    private static TestedFile checkFile (String base, String info)
  +    {
  +	return new TestedFile (base, info);
  +    }
  +
  +    /**  method to perform docBase localization
  +     *
  +     *  The method performs a resource lookup in a manner similar to the
  +     *  one performed by JavaHelp.
  +     * 
  +     *  See above explanation of lookup order.
  +     *
  +     *  @param dBase the document base for the context of the document
  +     *  @param path the path to the document
  +     *  @param loc the Locale from the request
  +     *
  +     *  @return the String for the localized path
  +     */
  +    private static String getDocBaseLocalizedPath (String dBase, String path,
  +						   Locale loc)
  +    {
  +	String rLang = loc.getLanguage();
  +	String rCoun = loc.getCountry();
  +	String rVar  = loc.getVariant();
  +	String ldBase = dBase.endsWith(File.separator)
  +			    		? dBase
  +			    		: (dBase + File.separatorChar);
  +
  +	TestedFile tf = null;
  +
  +	//  first, try with the provided language+country+variant
  +	//
  +	String base = null;
  +
  +	if (null != rVar && ! ("".equals (rVar)) )
  +	{
  +	    base = ldBase + rLang + '_' + rCoun + '_' + rVar;
  +
  +	    if ((tf = checkFile(base, path)).getFile().exists())
  +		return tf.getPath();
  +	}
  +
  +	//  then, try with the provided language+country
  +	//
  +	if (null != rCoun && ! ("".equals (rCoun)) )
  +	{
  +	    base = ldBase + rLang + '_' + rCoun;
  +
  +	    if ((tf = checkFile(base, path)).getFile().exists())
  +		return tf.getPath();
  +	}
  +
  +	//  now, try with the provided language only
  +	//
  +	base = ldBase + rLang;
  +
  +	if ((tf = checkFile(base, path)).getFile().exists())
  +	    return tf.getPath();
  +
  +	return checkFile(dBase, path).getPath();
  +    }
  +
  +    static String concatPath( String s1, String s2 )
  +    {
  +        if( s1.endsWith( File.separator ) ) {
  +            if( s2.startsWith( File.separator ))
  +                return s1 + s2.substring(1);
  +            else
  +                return s1 + s2;
  +        } else {
  +            if( s2.startsWith(File.separator))
  +                return s1 + s2;
  +            else
  +                return s1 + File.separatorChar + s2;
  +        }
  +    }
  +
  +    /**  inner class to perform file tests
  +     */
  +    public static class TestedFile {
  +
  +	File	file = null;
  +	String	path = null;
  +
  +	/**  class to return the combination of File and pathname
  +	 *
  +	 *  @param base the directory name for the document base 
  +	 *  @param path the pathname for the file under the document base
  +	 */
  +	public TestedFile (String base, String path)
  +	{
  +	    if ((path == null) || (path.length() < 1))
  +		this.path = base;
  +	    else
  +		this.path = concatPath (base, path);
  +
  +	    file = new File (this.path);
  +	}
  +
  +	/**  method to obtain the path for the file being tested
  +	 *
  +	 *  @return a String with the path for the file associated
  +	 */
  +	public String getPath ()
  +	{
  +	    return path;
  +	}
  +
  +	/**  method to obtain the File for the path being tested
  +	 *
  +	 *  @return a File corresponding to the path passed.
  +	 */
  +	public File getFile ()
  +	{
  +	    return file;
  +	}
  +    }
   }
  
  
  

Mime
View raw message