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 }