View Javadoc

1   package uba.db.impl.filesystem;
2   
3   import java.io.DataOutputStream;
4   import java.io.File;
5   import java.io.FileInputStream;
6   import java.io.FileNotFoundException;
7   import java.io.FileOutputStream;
8   import java.io.IOException;
9   import java.io.ObjectInputStream;
10  import java.io.ObjectOutputStream;
11  
12  import uba.db.table.InsertException;
13  import uba.db.table.Row;
14  import uba.db.table.TableBehavior;
15  import uba.db.table.TableSchema;
16  import uba.db.table.io.RowWriter;
17  import uba.db.table.io.TableReader;
18  import uba.db.table.io.TableReaderCreationException;
19  
20  /***
21   * @version $Revision: 1.4 $
22   */
23  public class FileSystemTable extends TableBehavior {
24      public static final String DATA_FILE_SUFFIX = ".data";
25      public static final String SCHEMA_FILE_SUFFIX = ".schema";
26  
27      private File dataFile;
28  
29      protected FileSystemTable(TableSchema tableSchema, File dataFile)
30              throws FileNotFoundException {
31          super(tableSchema);
32  
33          if (!dataFile.exists()) {
34              throw new FileNotFoundException(dataFile.toString());
35          }
36  
37          this.dataFile = dataFile;
38      }
39  
40      /***
41       * @see uba.db.table.Table#reader()
42       */
43      public TableReader reader() throws TableReaderCreationException {
44          return new FileSystemTableReader(this);
45      }
46  
47      /***
48       * @see uba.db.table.TableBehavior#insertRow(uba.db.table.Row)
49       */
50      protected void insertRow(Row row) throws InsertException {
51          try {
52              FileOutputStream fileOutputStream = null;
53              try {
54                  fileOutputStream = new FileOutputStream(dataFile, true);
55                  RowWriter rowWriter = new RowWriter(this, new DataOutputStream(
56                          fileOutputStream));
57                  rowWriter.write(row);
58              } finally {
59                  if (fileOutputStream != null) {
60                      fileOutputStream.close();
61                  }
62              }
63          } catch (IOException e) {
64              throw new InsertException(e);
65          }
66      }
67  
68      public File dataFile() {
69          return dataFile;
70      }
71  
72      public static FileSystemTable createNew(File directory, TableSchema tableSchema)
73              throws IOException {
74          createSchemaFile(directory, tableSchema);
75          File dataFile = createDataFile(directory, tableSchema);
76  
77          return new FileSystemTable(tableSchema, dataFile);
78      }
79  
80      public static FileSystemTable createFrom(File schemaFile) throws IOException,
81              ClassNotFoundException {
82          TableSchema tableSchema = readTableSchemaFrom(schemaFile);
83          File dataFile = dataFileFor(schemaFile.getParentFile(), tableSchema);
84          return new FileSystemTable(tableSchema, dataFile);
85      }
86  
87      private static TableSchema readTableSchemaFrom(File schemaFile) throws IOException,
88              ClassNotFoundException {
89          ObjectInputStream in = new ObjectInputStream(new FileInputStream(schemaFile));
90          return (TableSchema) in.readObject();
91      }
92  
93      private static void createSchemaFile(File directory, TableSchema tableSchema)
94              throws IOException {
95          File schemaFile = schemaFileFor(directory, tableSchema.tableName());
96          ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(schemaFile));
97          out.writeObject(tableSchema);
98      }
99  
100     private static File schemaFileFor(File directory, String tableName) {
101         return new File(directory, tableName + SCHEMA_FILE_SUFFIX);
102     }
103 
104     public static File createDataFile(File directory, TableSchema tableSchema)
105             throws IOException {
106         File dataFile = dataFileFor(directory, tableSchema);
107         dataFile.createNewFile();
108         return dataFile;
109     }
110 
111     public static File dataFileFor(File directory, TableSchema tableSchema) {
112         return new File(directory, tableSchema.tableName() + DATA_FILE_SUFFIX);
113     }
114 
115     public File schemaFile() {
116         return schemaFileFor(dataFile().getParentFile(), name());
117     }
118 }