cziegeler    02/02/12 04:55:24

  Modified:    src/java/org/apache/cocoon/components/store
                        FilesystemStore.java
  Log:
  Fixed Filesystemstore:
  - keys can now be any values
  - the get() method now returns the object previously stored and not a File
  
  Revision  Changes    Path
  1.7       +58 -4     
xml-cocoon2/src/java/org/apache/cocoon/components/store/FilesystemStore.java
  
  Index: FilesystemStore.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/store/FilesystemStore.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- FilesystemStore.java      4 Feb 2002 12:31:09 -0000       1.6
  +++ FilesystemStore.java      12 Feb 2002 12:55:24 -0000      1.7
  @@ -75,12 +75,18 @@
    *
    * @author ?
    * @author <a href="mailto:[EMAIL PROTECTED]";>Vadim Gritsenko</a>
  - * @version CVS $Id: FilesystemStore.java,v 1.6 2002/02/04 12:31:09 cziegeler Exp $
  + * @version CVS $Id: FilesystemStore.java,v 1.7 2002/02/12 12:55:24 cziegeler Exp $
    */
   public final class FilesystemStore
   extends AbstractLoggable
   implements Store, Contextualizable, Parameterizable, ThreadSafe {
   
  +    protected static final int          BYTE_MASK      = 0x0f;
  +    protected static final char[]       HEX_DIGITS     =
  +    {
  +        '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
  +    };
  +
       protected File workDir;
       protected File cacheDir;
   
  @@ -182,7 +188,11 @@
               if (this.getLogger().isDebugEnabled()) {
                   getLogger().debug("Found file: " + key);
               }
  -            return file;
  +            try {
  +                return IOUtils.deserializeObject(file);
  +            } catch (Exception any) {
  +                getLogger().error("Error during deseralization.", any);
  +            }
           } else {
               if (this.getLogger().isDebugEnabled()) {
                   getLogger().debug("NOT Found file: " + key);
  @@ -284,7 +294,7 @@
               if (files[i].isDirectory()) {
                   this.addKeys(enum, files[i]);
               } else {
  -                enum.add(files[i].getAbsolutePath().substring(subStringBegin));
  +                
enum.add(this.decode(files[i].getAbsolutePath().substring(subStringBegin)));
               }
           }
       }
  @@ -339,7 +349,7 @@
   
       /* Utility Methods*/
       protected File fileFromKey(final Object key) {
  -        return IOUtils.createFile(this.directoryFile, key.toString());
  +        return IOUtils.createFile(this.directoryFile, this.encode(key.toString()));
       }
   
       public String getString(final Object key)
  @@ -364,4 +374,48 @@
   
           return null;
       }
  +
  +    /**
  +     * Returns a String that uniquely identifies the object.
  +     * <b>Note:</b> since this method uses the Object.toString()
  +     * method, it's up to the caller to make sure that this method
  +     * doesn't change between different JVM executions (like
  +     * it may normally happen). For this reason, it's highly recommended
  +     * (even if not mandated) that Strings be used as keys.
  +     */
  +    protected String encode( final String key )
  +    {
  +        final byte[] bytes = key.getBytes();
  +        final char[] buffer = new char[ bytes.length << 1 ];
  +
  +        for( int i = 0, j = 0; i < bytes.length; i++ )
  +        {
  +            final int k = bytes[ i ];
  +            buffer[ j++ ] = HEX_DIGITS[ ( k >>> 4 ) & BYTE_MASK ];
  +            buffer[ j++ ] = HEX_DIGITS[ k & BYTE_MASK ];
  +        }
  +
  +        return new String(buffer);
  +    }
  +
  +    /**
  +     * Inverse of encode exept it do not use path.
  +     * So decode(encode(s) - m_path) = s.
  +     * In other words it returns a String that can be used as key to retive
  +     * the record contained in the 'filename' file.
  +     */
  +    protected String decode( String filename )
  +    {
  +        final int size = filename.length();
  +        final byte[] bytes = new byte[ size >>> 1 ];
  +
  +        for( int i = 0, j = 0; i < size; j++ )
  +        {
  +            bytes[ j ] = Byte.parseByte( filename.substring( i, i + 2 ), 16 );
  +            i +=2;
  +        }
  +
  +        return new String( bytes );
  +    }
  +
   }
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     [EMAIL PROTECTED]
To unsubscribe, e-mail:          [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to