001 package com.croftsoft.core.util.filemap;
002
003 import java.io.*;
004 import java.util.*;
005
006 /*********************************************************************
007 * A Map that stores the values in files within a directory.
008 *
009 * Uses filenames as the keys and InputStreams as the values.
010 *
011 * @see
012 * FilenameKeyGenerator
013 * @see
014 * java.util.AbstractMap
015 *
016 * @version
017 * 1999-04-03
018 * @author
019 * <a href="http://www.CroftSoft.com/">David Wallace Croft</a>
020 *********************************************************************/
021
022 public class FileMap extends AbstractMap
023 //////////////////////////////////////////////////////////////////////
024 //////////////////////////////////////////////////////////////////////
025 {
026
027 private File rootDirectory;
028
029 //////////////////////////////////////////////////////////////////////
030 //////////////////////////////////////////////////////////////////////
031
032 public static void main ( String [ ] args )
033 //////////////////////////////////////////////////////////////////////
034 {
035 System.out.println ( test ( ) );
036 }
037
038 public static boolean test ( )
039 //////////////////////////////////////////////////////////////////////
040 {
041 try
042 {
043 String filename = "com.orbs.util.filemap.FileMap_test.tmp";
044
045 FileMap fileMap = new FileMap ( new File ( "." ) );
046
047 fileMap.put ( filename,
048 new ByteArrayInputStream ( "Hello".getBytes ( ) ) );
049
050 InputStream in = ( InputStream ) fileMap.get ( filename );
051
052 int i;
053 while ( ( i = in.read ( ) ) > -1 ) System.out.write ( i );
054
055 in.close ( );
056
057 System.out.println ( "" );
058
059 fileMap.remove ( filename );
060 }
061 catch ( Exception ex )
062 {
063 ex.printStackTrace ( );
064
065 return false;
066 }
067
068 return true;
069 }
070
071 //////////////////////////////////////////////////////////////////////
072 //////////////////////////////////////////////////////////////////////
073
074 public FileMap ( File rootDirectory )
075 //////////////////////////////////////////////////////////////////////
076 {
077 this.rootDirectory = rootDirectory;
078 }
079
080 //////////////////////////////////////////////////////////////////////
081 //////////////////////////////////////////////////////////////////////
082
083 public Set entrySet ( )
084 //////////////////////////////////////////////////////////////////////
085 {
086 return new FileMapEntrySet ( rootDirectory );
087 }
088
089 // synchronize?
090
091 public synchronized Object put ( Object key, Object value )
092 //////////////////////////////////////////////////////////////////////
093 {
094 File file = null;
095 BufferedOutputStream out = null;
096 InputStream in = null;
097
098 try
099 {
100 String filename = ( String ) key;
101
102 file = new File ( rootDirectory, filename );
103
104 out = new BufferedOutputStream ( new FileOutputStream ( file ) );
105
106 in = ( InputStream ) value;
107
108 int i;
109 while ( ( i = in.read ( ) ) > -1 ) out.write ( i );
110 }
111 catch ( IOException ioex )
112 {
113 try { out.close ( ); } catch ( Exception ex ) { }
114 try { file.delete ( ); } catch ( Exception ex ) { }
115 throw new RuntimeException ( ioex.getMessage ( ) );
116 }
117 finally
118 {
119 try { in.close ( ); } catch ( Exception ex ) { }
120 try { out.close ( ); } catch ( Exception ex ) { }
121 }
122
123 return null;
124 }
125
126 public synchronized Object remove ( Object key )
127 //////////////////////////////////////////////////////////////////////
128 {
129 String filename = ( String ) key;
130
131 File file = new File ( rootDirectory, filename );
132
133 file.delete ( );
134
135 return null;
136 }
137
138 //////////////////////////////////////////////////////////////////////
139 //////////////////////////////////////////////////////////////////////
140 }