svn-gvsig-desktop / tags / v1_1_Build_1005 / libraries / libGDBMS / src / main / java / com / hardcode / gdbms / driver / dbf / DBFDriver.java @ 12355
History | View | Annotate | Download (8.52 KB)
1 | 3199 | fjp | package com.hardcode.gdbms.driver.dbf; |
---|---|---|---|
2 | |||
3 | 4050 | fjp | import java.io.File; |
4 | import java.io.FileInputStream; |
||
5 | import java.io.IOException; |
||
6 | import java.io.RandomAccessFile; |
||
7 | 6936 | fjp | import java.io.UnsupportedEncodingException; |
8 | 4050 | fjp | import java.nio.channels.FileChannel; |
9 | import java.nio.channels.WritableByteChannel; |
||
10 | import java.sql.Types; |
||
11 | import java.text.DateFormat; |
||
12 | import java.text.ParseException; |
||
13 | import java.util.Date; |
||
14 | import java.util.Locale; |
||
15 | 3199 | fjp | |
16 | 4050 | fjp | import com.hardcode.gdbms.driver.DriverUtilities; |
17 | 3199 | fjp | import com.hardcode.gdbms.engine.data.DataSourceFactory; |
18 | import com.hardcode.gdbms.engine.data.driver.DriverException; |
||
19 | import com.hardcode.gdbms.engine.data.driver.FileDriver; |
||
20 | 4050 | fjp | import com.hardcode.gdbms.engine.data.edition.DataWare; |
21 | 3199 | fjp | import com.hardcode.gdbms.engine.data.file.FileDataWare; |
22 | import com.hardcode.gdbms.engine.values.Value; |
||
23 | import com.hardcode.gdbms.engine.values.ValueFactory; |
||
24 | 4050 | fjp | import com.iver.cit.gvsig.fmap.drivers.dbf.DbaseFile; |
25 | import com.iver.cit.gvsig.fmap.drivers.shp.DbaseFileHeaderNIO; |
||
26 | import com.iver.cit.gvsig.fmap.drivers.shp.DbaseFileWriterNIO; |
||
27 | 3199 | fjp | |
28 | |||
29 | /**
|
||
30 | * DOCUMENT ME!
|
||
31 | *
|
||
32 | * @author Fernando Gonz?lez Cort?s
|
||
33 | */
|
||
34 | 4050 | fjp | public class DBFDriver implements FileDriver { |
35 | //private File file;
|
||
36 | private static Locale ukLocale = new Locale("en", "UK"); // English, UK version |
||
37 | 3199 | fjp | private DbaseFile dbf = new DbaseFile(); |
38 | private char[] fieldTypes; |
||
39 | 4050 | fjp | private DataSourceFactory dsf;
|
40 | |||
41 | 3199 | fjp | |
42 | /**
|
||
43 | * @see com.hardcode.driverManager.Driver#getName()
|
||
44 | */
|
||
45 | public String getName() { |
||
46 | return "gdbms dbf driver"; |
||
47 | } |
||
48 | |||
49 | /**
|
||
50 | * @see com.hardcode.gdbms.engine.data.GDBMSDriver#open(java.io.File)
|
||
51 | */
|
||
52 | public void open(File file) throws IOException { |
||
53 | 4050 | fjp | dbf.open(file); |
54 | 3199 | fjp | |
55 | try {
|
||
56 | fieldTypes = new char[getFieldCount()]; |
||
57 | |||
58 | for (int i = 0; i < fieldTypes.length; i++) { |
||
59 | fieldTypes[i] = dbf.getFieldType(i); |
||
60 | } |
||
61 | } catch (DriverException e) {
|
||
62 | throw new IOException(e.getMessage()); |
||
63 | } |
||
64 | } |
||
65 | |||
66 | /**
|
||
67 | * @see com.hardcode.gdbms.engine.data.GDBMSDriver#close()
|
||
68 | */
|
||
69 | public void close() throws IOException { |
||
70 | dbf.close(); |
||
71 | } |
||
72 | |||
73 | /**
|
||
74 | * @see com.hardcode.gdbms.engine.data.driver.ReadAccess#getFieldValue(long,
|
||
75 | * int)
|
||
76 | */
|
||
77 | public Value getFieldValue(long rowIndex, int fieldId) |
||
78 | 12303 | jmvivo | throws DriverException {
|
79 | // Field Type (C or M)
|
||
80 | char cfieldType = fieldTypes[fieldId];
|
||
81 | int fieldType = getFieldType(fieldId);
|
||
82 | 3199 | fjp | |
83 | 12303 | jmvivo | String strValue;
|
84 | 3199 | fjp | |
85 | 12303 | jmvivo | if (cfieldType == 'D') { |
86 | String date;
|
||
87 | try {
|
||
88 | date = dbf.getStringFieldValue((int) rowIndex, fieldId).trim();
|
||
89 | } catch (UnsupportedEncodingException e1) { |
||
90 | throw new DriverException(e1); |
||
91 | } |
||
92 | // System.out.println(rowIndex + " data=" + date);
|
||
93 | if (date.length() == 0) { |
||
94 | return null; |
||
95 | } |
||
96 | 3199 | fjp | |
97 | 12303 | jmvivo | String year = date.substring(0, 4); |
98 | String month = date.substring(4, 6); |
||
99 | String day = date.substring(6, 8); |
||
100 | DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, ukLocale); |
||
101 | /* Calendar c = Calendar.getInstance();
|
||
102 | c.clear();
|
||
103 | c.set(Integer.parseInt(year), Integer.parseInt(month),
|
||
104 | Integer.parseInt(day));
|
||
105 | c.set(Calendar.MILLISECOND, 0); */
|
||
106 | String strAux = month + "/" + day + "/" + year; |
||
107 | Date dat;
|
||
108 | try {
|
||
109 | dat = df.parse(strAux); |
||
110 | } catch (ParseException e) { |
||
111 | throw new DriverException("Bad Date Format"); |
||
112 | } |
||
113 | 6936 | fjp | |
114 | 12303 | jmvivo | // System.out.println("numReg = " + rowIndex + " date:" + dat.getTime());
|
115 | 3199 | fjp | |
116 | 12303 | jmvivo | return ValueFactory.createValue(dat);
|
117 | } else {
|
||
118 | try {
|
||
119 | strValue = dbf.getStringFieldValue((int) rowIndex, fieldId);
|
||
120 | } catch (UnsupportedEncodingException e1) { |
||
121 | e1.printStackTrace(); |
||
122 | throw new DriverException(e1); |
||
123 | } |
||
124 | strValue = strValue.trim(); |
||
125 | try {
|
||
126 | return ValueFactory.createValueByType(strValue, fieldType);
|
||
127 | } catch (ParseException e) { |
||
128 | throw new DriverException("Bad Field Value: '" + strValue+"' (rowIndes: "+rowIndex + " fielId: "+ fieldId +" fieldType: " + fieldType+ " )"); |
||
129 | } |
||
130 | } |
||
131 | 3199 | fjp | } |
132 | |||
133 | /**
|
||
134 | * @see com.hardcode.gdbms.engine.data.driver.ReadAccess#getFieldCount()
|
||
135 | */
|
||
136 | public int getFieldCount() throws DriverException { |
||
137 | return dbf.getFieldCount();
|
||
138 | } |
||
139 | |||
140 | /**
|
||
141 | * @see com.hardcode.gdbms.engine.data.driver.ReadAccess#getFieldName(int)
|
||
142 | */
|
||
143 | public String getFieldName(int fieldId) throws DriverException { |
||
144 | return dbf.getFieldName(fieldId);
|
||
145 | } |
||
146 | |||
147 | /**
|
||
148 | * @see com.hardcode.gdbms.engine.data.driver.ReadAccess#getRowCount()
|
||
149 | */
|
||
150 | public long getRowCount() throws DriverException { |
||
151 | return dbf.getRecordCount();
|
||
152 | } |
||
153 | |||
154 | /**
|
||
155 | * @see com.hardcode.gdbms.engine.data.driver.FileDriver#fileAccepted(java.io.File)
|
||
156 | */
|
||
157 | public boolean fileAccepted(File f) { |
||
158 | return f.getAbsolutePath().toUpperCase().endsWith("DBF"); |
||
159 | } |
||
160 | |||
161 | /**
|
||
162 | * @see com.hardcode.gdbms.engine.data.driver.ObjectDriver#getFieldType(int)
|
||
163 | */
|
||
164 | public int getFieldType(int i) throws DriverException { |
||
165 | char fieldType = fieldTypes[i];
|
||
166 | |||
167 | if (fieldType == 'L') { |
||
168 | return Types.BOOLEAN; |
||
169 | } else if ((fieldType == 'F') || (fieldType == 'N')) { |
||
170 | return Types.DOUBLE; |
||
171 | } else if (fieldType == 'C') { |
||
172 | return Types.VARCHAR; |
||
173 | } else if (fieldType == 'D') { |
||
174 | return Types.DATE; |
||
175 | } else {
|
||
176 | throw new DriverException("Unknown field type"); |
||
177 | } |
||
178 | } |
||
179 | |||
180 | /**
|
||
181 | * @see com.hardcode.gdbms.engine.data.driver.DriverCommons#setDataSourceFactory(com.hardcode.gdbms.engine.data.DataSourceFactory)
|
||
182 | */
|
||
183 | public void setDataSourceFactory(DataSourceFactory dsf) { |
||
184 | 4050 | fjp | this.dsf = dsf;
|
185 | 3199 | fjp | } |
186 | |||
187 | 4050 | fjp | private void writeToTemp(DataWare dataWare, File file) throws DriverException { |
188 | DbaseFileWriterNIO dbfWrite = null;
|
||
189 | DbaseFileHeaderNIO myHeader; |
||
190 | Value[] record;
|
||
191 | |||
192 | try {
|
||
193 | myHeader = DbaseFileHeaderNIO.createDbaseHeader(dataWare); |
||
194 | |||
195 | myHeader.setNumRecords((int) dataWare.getRowCount());
|
||
196 | dbfWrite = new DbaseFileWriterNIO(myHeader,
|
||
197 | (FileChannel) getWriteChannel(file.getPath()));
|
||
198 | record = new Value[dataWare.getFieldCount()];
|
||
199 | |||
200 | for (int j = 0; j < dataWare.getRowCount(); j++) { |
||
201 | for (int r = 0; r < dataWare.getFieldCount(); r++) { |
||
202 | record[r] = dataWare.getFieldValue(j, r); |
||
203 | } |
||
204 | |||
205 | dbfWrite.write(record); |
||
206 | } |
||
207 | |||
208 | dbfWrite.close(); |
||
209 | } catch (IOException e) { |
||
210 | throw new DriverException(e); |
||
211 | } |
||
212 | |||
213 | } |
||
214 | |||
215 | 3199 | fjp | /**
|
216 | * @see com.hardcode.gdbms.engine.data.driver.FileDriver#writeFile(com.hardcode.gdbms.engine.data.file.FileDataWare,
|
||
217 | * java.io.File)
|
||
218 | */
|
||
219 | public void writeFile(FileDataWare dataWare) |
||
220 | throws DriverException {
|
||
221 | 4050 | fjp | |
222 | String temp = dsf.getTempFile();
|
||
223 | |||
224 | writeToTemp(dataWare, new File(temp)); |
||
225 | |||
226 | 3199 | fjp | try {
|
227 | 4050 | fjp | FileChannel fcout = dbf.getWriteChannel();
|
228 | FileChannel fcin = new FileInputStream(temp).getChannel(); |
||
229 | |||
230 | DriverUtilities.copy(fcin, fcout); |
||
231 | 3199 | fjp | } catch (IOException e) { |
232 | throw new DriverException(e); |
||
233 | } |
||
234 | } |
||
235 | |||
236 | 4050 | fjp | /**
|
237 | * DOCUMENT ME!
|
||
238 | *
|
||
239 | * @param path DOCUMENT ME!
|
||
240 | *
|
||
241 | * @return DOCUMENT ME!
|
||
242 | *
|
||
243 | * @throws IOException DOCUMENT ME!
|
||
244 | */
|
||
245 | private WritableByteChannel getWriteChannel(String path) |
||
246 | throws IOException { |
||
247 | WritableByteChannel channel;
|
||
248 | |||
249 | File f = new File(path); |
||
250 | |||
251 | if (!f.exists()) {
|
||
252 | System.out.println("Creando fichero " + f.getAbsolutePath()); |
||
253 | |||
254 | if (!f.createNewFile()) {
|
||
255 | throw new IOException("Cannot create file " + f); |
||
256 | } |
||
257 | } |
||
258 | |||
259 | RandomAccessFile raf = new RandomAccessFile(f, "rw"); |
||
260 | channel = raf.getChannel(); |
||
261 | |||
262 | return channel;
|
||
263 | 3199 | fjp | } |
264 | 4050 | fjp | |
265 | public void createSource(String arg0, String[] arg1, int[] arg2) throws IOException { |
||
266 | DbaseFileHeaderNIO myHeader; |
||
267 | |||
268 | int[] lengths = new int[arg2.length]; |
||
269 | for (int i = 0; i < arg2.length; i++) { |
||
270 | lengths[i] = 100;
|
||
271 | } |
||
272 | myHeader = DbaseFileHeaderNIO.createDbaseHeader(arg1, arg2, lengths); |
||
273 | myHeader.setNumRecords(0);
|
||
274 | DbaseFileWriterNIO dbfWrite = new DbaseFileWriterNIO(myHeader,
|
||
275 | (FileChannel) getWriteChannel(arg0));
|
||
276 | dbfWrite = new DbaseFileWriterNIO(myHeader,
|
||
277 | (FileChannel) getWriteChannel(arg0));
|
||
278 | } |
||
279 | 4851 | jmvivo | |
280 | public int getFieldWidth(int i) throws DriverException { |
||
281 | return dbf.getFieldLength(i);
|
||
282 | } |
||
283 | 3199 | fjp | } |