mschachter    01/06/18 16:54:20

  Modified:    resources/src/java/org/apache/commons/resources
                        MessageResources.java
  Added:       resources/src/java/org/apache/commons/resources
                        FileResource.java
  Log:
   - Modify MessageResources to extend AbstractResource
   - Add FileResource class
  
  Revision  Changes    Path
  1.2       +24 -5     
jakarta-commons-sandbox/resources/src/java/org/apache/commons/resources/MessageResources.java
  
  Index: MessageResources.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/resources/src/java/org/apache/commons/resources/MessageResources.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- MessageResources.java     2001/05/30 16:45:49     1.1
  +++ MessageResources.java     2001/06/18 23:54:20     1.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-commons-sandbox/resources/src/java/org/apache/commons/resources/MessageResources.java,v
 1.1 2001/05/30 16:45:49 craigmcc Exp $
  - * $Revision: 1.1 $
  - * $Date: 2001/05/30 16:45:49 $
  + * $Header: 
/home/cvs/jakarta-commons-sandbox/resources/src/java/org/apache/commons/resources/MessageResources.java,v
 1.2 2001/06/18 23:54:20 mschachter Exp $
  + * $Revision: 1.2 $
  + * $Date: 2001/06/18 23:54:20 $
    *
    * ====================================================================
    * 
  @@ -67,6 +67,7 @@
   import java.text.MessageFormat;
   import java.util.HashMap;
   import java.util.Locale;
  +import java.util.TimeZone;
   
   
   /**
  @@ -89,10 +90,10 @@
    * application server environments.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.1 $ $Date: 2001/05/30 16:45:49 $
  + * @version $Revision: 1.2 $ $Date: 2001/06/18 23:54:20 $
    */
   
  -public abstract class MessageResources implements Serializable {
  +public abstract class MessageResources extends AbstractResource {
   
   
       // ------------------------------------------------------------- Properties
  @@ -183,6 +184,24 @@
       // --------------------------------------------------------- Public Methods
   
   
  +    /**
  +     * Implements the getData method of the Resource interface
  +     */
  +    public byte[] getData(String key, Locale locale, TimeZone timeZone) {
  +        String data = getMessage(locale, key);
  +        if (data != null) {
  +            return data.getBytes();
  +        }
  +        return null;
  +    }
  +    
  +    /**
  +     * Implements the getString method of the Resource interface
  +     */
  +    public String getString(String key, Locale locale, TimeZone timeZone) {
  +        return getMessage(locale, key);
  +    }
  +        
   
       /**
        * Returns a text message for the specified key, for the default Locale.
  
  
  
  1.1                  
jakarta-commons-sandbox/resources/src/java/org/apache/commons/resources/FileResource.java
  
  Index: FileResource.java
  ===================================================================
  package org.apache.commons.resources;
  
  import java.util.Locale;
  import java.util.TimeZone;
  import java.util.Iterator;
  import java.util.Collection;
  import java.util.MissingResourceException;
  
  import java.io.File;
  import java.io.InputStream;
  import java.io.IOException;
  import java.io.FileInputStream;
  import java.io.ByteArrayOutputStream;
  import java.io.FileNotFoundException;
  
  /**
   * This class represents a file data resource.
   */
  public class FileResource extends AbstractResource {
   
      /**
       * The character used to separate locale and time zone id's in files
       */
      public static String ID_SEPARATOR = "_";
      
      /**
       * The logical name of this resource
       */
      protected String name;
      
      /**
       * The base directory of the resource
       */
      protected String baseDir = "";
      
     /**
       * Get the name of this resource
       * @return A logical String representation of the name of this resource
       */
      public String getName() {
          return name;
      }
      
      /**
       * Set the name of this resource
       * @param name The name of this resource
       */
      public void setName(String name) {
          this.name = name;
      }
      
      /**
       * Sets the base directory of this resource.
       */
      public void setBaseDir(String baseDir) {
          this.baseDir = baseDir;
      }
      
      /**
       * Gets the base directory for this resource
       */
      public String getBaseDir() {
          return baseDir;
      }
      
      /**
       * Retrieves content based on the locale and time zone specified.
       * @param key The key for the content
       * @param locale The locale to retreive the content in, if <code>null</code>,
       *               the default locale
       * @param timeZone The time zone to retrieve the content for, if 
<code>null</code>,
       *                 the default time zone
       */
      public byte[] getData(String key, Locale locale, TimeZone timeZone)
          throws MissingResourceException {
          
              byte[] data = null;
              File file = null;
              try {
                  file = findFile(key, locale, timeZone);
                  InputStream stream = new FileInputStream(file);
                  ByteArrayOutputStream baos = new ByteArrayOutputStream();
                  byte[] content = new byte[(int) file.length()];
  
                  stream.read(content);
                  baos.write(content);
                  data = baos.toByteArray();
              }
              catch (IOException ioe) {
                  throw new MissingResourceException("IOException while reading " +
                      "file '" + file.getAbsolutePath() + "': "  + ioe.getMessage(), 
                      baseDir, key);
              }
                  
              return data;
      }
              
      
      /**
       * Retrieves an InputStream representing the content based on the key, locale,
       * and time zone specified
       * @param key The key for the content
       * @param locale The locale to retreive the content in, if <code>null</code>,
       *               the default locale
       * @param timeZone The time zone to retrieve the content for, if 
<code>null</code>,
       *                 the default time zone
       */
      public InputStream getStream(String key, Locale locale, TimeZone timeZone)
          throws MissingResourceException {
              
              
          InputStream stream = null;
          File file = findFile(key, locale, timeZone);
          if ((file != null) && (file.exists())) {
              try {
                  stream = new FileInputStream(file);
              }
              catch (FileNotFoundException fnfe) {
                  throw new MissingResourceException("File '" + file.getAbsolutePath() 
+
                      "' not found" , baseDir,  key);
              }
              catch (IOException ioe) {
                  throw new MissingResourceException("IOException while reading " +
                      "file '" + file.getAbsolutePath() + "': "  + ioe.getMessage(), 
                      baseDir, key);
              }
          }
          else {
              throw new MissingResourceException("File '" + file.getAbsolutePath() + 
                  "' cannot be found", baseDir, key);
          }
          return stream;
      }
      
      /**
       * Locates the file specified by key, locale, and timeZone.
       * It searches for files in the following way:<br />
       * <blockquote>
       *  1. <i>baseDir/key_language1_countryCode1_timeZone1.extension</i><br />
       *  2. <i>baseDir/key_language1_countryCode1.extension</i><br />
       *  3. <i>baseDir/key_language1.extension</i><br />
       *  4. <i>baseDir/key.extension</i><br />
       * </blockquote>
       * Where <i>extension</i> is the file extension (anything after the first 
       * "." in a file name), and <i>baseDir</i> is the
       * qualified file path representing the base of the file resources, and
       * <i>key</i> is either a file name or a relative file path minus the 
       * <i>extension</i>.  language1, countryCode1, and timeZone1 represent
       * the respective codes of the locale and time zone given.  language2,
       * countryCode, and timeZone2 represent the system default locale and timezone.
       * @return A file representing the data, or <code>null</code> if the file
       *         couldn't be found
       */
      protected File findFile(String key, Locale locale, TimeZone timeZone) {
          
          String fileName = null;
          String extension = "";
          String language = null;
          String countryCode = null;
          String zone = null;
         
          int dotIndex = key.indexOf(".");
          if (dotIndex > -1) {
              fileName = key.substring(0, dotIndex);
              extension = key.substring(dotIndex+1, key.length());
          }
          else {
              fileName = key;
          }
          
          if (locale != null) {            
              language = locale.getLanguage();          
              countryCode = locale.getCountry();
          }
          
          if (timeZone != null) {
              zone = timeZone.getID();
          }
          
          return findFile(fileName, language, countryCode, zone, extension);
      }
      
      /**
       * Get a the first file that exists according to the naming conventions
       * listed in {@link #findFile(String,Locale,TimeZone) findFile}
       * @param fileName the name of the file minus the extension, should
       *        not be <code>null</code>
       * @param language The lower-case, two letter language code of the locale,
       *                 or <code>null</code>.
       * @param countryCode The upper-case, two letter country code of the locale,
       *                    or <code>null</code>.
       * @param timeZone The upper-case, three letter time zone ID of the time zone,
       *                 or <code>null</code>.
       * @param extension The file extension, that is, anything after the "." in
       *                  a file name
       * @return An collection of files that follow the conventions according
       *         to the non-null parameters given
       */
      protected File findFile(String fileName, String language,String countryCode,
                             String timeZone, String extension) {        
          
          if (baseDir == null) {
              baseDir = "";
          }
          
          String base = baseDir + File.separator + fileName;
          
          String[] names = new String[4];
          if ((extension != null) && (!"".equals(extension))) {
              extension = "." + extension;
          }
          else {
              extension = "";
          }
          names[3] = base +  extension; 
          if ((language != null) && (!"".equals(language))) {
              names[2] = base + ID_SEPARATOR + language + extension;
              if ((countryCode != null) && (!"".equals(countryCode))) {
                  names[1] = base + ID_SEPARATOR + language + ID_SEPARATOR +
                      countryCode + extension;
                  if ((timeZone != null) && (!"".equals(timeZone))) {
                      names[0] = base + ID_SEPARATOR + language + ID_SEPARATOR +
                          countryCode + ID_SEPARATOR + timeZone + extension;
                  }
              }
          }
          
          for (int i = 0; i < names.length; i++) {
              String name = names[i];
              if ((name != null) && (!"".equals(name))) {
                  File file = new File(name);
                  if (file.exists()) {
                      return file;
                  }
              }
          }
          
          return null;
      }
      
  }
  
  
  
  
  

Reply via email to