1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.healthmarketscience.jackcess.util;
18
19 import java.io.FileNotFoundException;
20 import java.io.IOException;
21 import java.nio.file.Path;
22
23 import com.healthmarketscience.jackcess.ColumnBuilder;
24 import com.healthmarketscience.jackcess.DataType;
25 import com.healthmarketscience.jackcess.Database;
26 import com.healthmarketscience.jackcess.Database.FileFormat;
27 import com.healthmarketscience.jackcess.Table;
28 import com.healthmarketscience.jackcess.TableBuilder;
29 import junit.framework.TestCase;
30 import static com.healthmarketscience.jackcess.TestUtil.*;
31 import static com.healthmarketscience.jackcess.impl.JetFormatTest.*;
32
33
34
35
36
37 public class CustomLinkResolverTest extends TestCase
38 {
39
40 public CustomLinkResolverTest(String name) {
41 super(name);
42 }
43
44 public void testCustomLinkResolver() throws Exception {
45 for(final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
46 Database db = create(fileFormat);
47
48 db.setLinkResolver(new TestLinkResolver());
49
50 db.createLinkedTable("Table1", "testFile1.txt", "Table1");
51 db.createLinkedTable("Table2", "testFile2.txt", "OtherTable2");
52 db.createLinkedTable("Table3", "missingFile3.txt", "MissingTable3");
53 db.createLinkedTable("Table4", "testFile2.txt", "MissingTable4");
54
55 Table t1 = db.getTable("Table1");
56 assertNotNull(t1);
57 assertNotSame(db, t1.getDatabase());
58
59 assertTable(createExpectedTable(createExpectedRow("id", 0,
60 "data1", "row0"),
61 createExpectedRow("id", 1,
62 "data1", "row1"),
63 createExpectedRow("id", 2,
64 "data1", "row2")),
65 t1);
66
67 Table t2 = db.getTable("Table2");
68 assertNotNull(t2);
69 assertNotSame(db, t2.getDatabase());
70
71 assertTable(createExpectedTable(createExpectedRow("id", 3,
72 "data2", "row3"),
73 createExpectedRow("id", 4,
74 "data2", "row4"),
75 createExpectedRow("id", 5,
76 "data2", "row5")),
77 t2);
78
79 assertNull(db.getTable("Table4"));
80
81 try {
82 db.getTable("Table3");
83 fail("FileNotFoundException should have been thrown");
84 } catch(FileNotFoundException e) {
85
86 }
87
88 db.close();
89 }
90 }
91
92 private static class TestLinkResolver extends CustomLinkResolver
93 {
94 private TestLinkResolver()
95 {
96 super(DEFAULT_FORMAT, true, DEFAULT_TEMP_DIR);
97 }
98
99 @Override
100 protected Object loadCustomFile(
101 Database linkerDb, String linkeeFileName) throws IOException
102 {
103 return (("testFile1.txt".equals(linkeeFileName) ||
104 "testFile2.txt".equals(linkeeFileName)) ?
105 linkeeFileName : null);
106 }
107
108 @Override
109 protected boolean loadCustomTable(
110 Database tempDb, Object customFile, String tableName)
111 throws IOException
112 {
113 if("Table1".equals(tableName)) {
114
115 assertEquals("testFile1.txt", customFile);
116 Table t = new TableBuilder(tableName)
117 .addColumn(new ColumnBuilder("id", DataType.LONG))
118 .addColumn(new ColumnBuilder("data1", DataType.TEXT))
119 .toTable(tempDb);
120
121 for(int i = 0; i < 3; ++i) {
122 t.addRow(i, "row" + i);
123 }
124
125 return true;
126
127 } else if("OtherTable2".equals(tableName)) {
128
129 assertEquals("testFile2.txt", customFile);
130 Table t = new TableBuilder(tableName)
131 .addColumn(new ColumnBuilder("id", DataType.LONG))
132 .addColumn(new ColumnBuilder("data2", DataType.TEXT))
133 .toTable(tempDb);
134
135 for(int i = 3; i < 6; ++i) {
136 t.addRow(i, "row" + i);
137 }
138
139 return true;
140
141 } else if("Table4".equals(tableName)) {
142
143 assertEquals("testFile2.txt", customFile);
144 return false;
145 }
146
147 return false;
148 }
149
150 @Override
151 protected Database createTempDb(Object customFile, FileFormat format,
152 boolean inMemory, Path tempDir,
153 boolean readOnly)
154 throws IOException
155 {
156 inMemory = "testFile1.txt".equals(customFile);
157 return super.createTempDb(customFile, format, inMemory, tempDir,
158 readOnly);
159 }
160 }
161 }