Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / edition / writers / dbf / DbfWriter.java @ 5558

History | View | Annotate | Download (3.55 KB)

1
package com.iver.cit.gvsig.fmap.edition.writers.dbf;
2

    
3
import java.io.File;
4
import java.io.IOException;
5
import java.io.RandomAccessFile;
6
import java.nio.channels.FileChannel;
7
import java.nio.channels.WritableByteChannel;
8
import java.sql.Types;
9

    
10
import com.iver.cit.gvsig.fmap.core.IRow;
11
import com.iver.cit.gvsig.fmap.drivers.ITableDefinition;
12
import com.iver.cit.gvsig.fmap.drivers.shp.DbaseFileHeaderNIO;
13
import com.iver.cit.gvsig.fmap.drivers.shp.DbaseFileWriterNIO;
14
import com.iver.cit.gvsig.fmap.edition.EditionException;
15
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
16
import com.iver.cit.gvsig.fmap.edition.writers.AbstractWriter;
17
import com.iver.cit.gvsig.fmap.layers.FBitSet;
18

    
19
public class DbfWriter extends AbstractWriter {
20
        private String dbfPath = null;
21

    
22
        private DbaseFileWriterNIO dbfWrite;
23

    
24
        private DbaseFileHeaderNIO myHeader;
25

    
26
        private int numRows;
27
        private Object[] record;
28

    
29
        // private FLyrVect lyrVect;
30
        private FBitSet selection = null;
31

    
32
        public void setFile(File f)
33
        {
34
                String strFichDbf = f.getAbsolutePath().replaceAll("\\.shp", ".dbf");
35
                dbfPath = strFichDbf.replaceAll("\\.SHP", ".DBF");
36
        }
37

    
38
        private WritableByteChannel getWriteChannel(String path)
39
                                throws IOException
40
        {
41
                WritableByteChannel channel;
42

    
43
                File f = new File(path);
44

    
45
                if (!f.exists()) {
46
                        System.out.println("Creando fichero " + f.getAbsolutePath());
47

    
48
                        if (!f.createNewFile()) {
49
                                System.err.print("Error al crear el fichero " +
50
                                        f.getAbsolutePath());
51
                                throw new IOException("Cannot create file " + f);
52
                        }
53
                }
54

    
55
                RandomAccessFile raf = new RandomAccessFile(f, "rw");
56
                channel = raf.getChannel();
57

    
58
                return channel;
59
        }
60

    
61

    
62

    
63
        public void preProcess() throws EditionException {
64
                // Por ahora solo escribimos los primeros bytes
65
                // de las cabeceras. Luego en el postprocess los escribiremos
66
                // correctamente, con el fullExtent y el numero de
67
                // registros que tocan.
68
                if (selection == null)
69
                {
70

    
71
                        try {
72
                                myHeader.setNumRecords(0);
73
                                dbfWrite = new DbaseFileWriterNIO(myHeader,
74
                                                (FileChannel) getWriteChannel(dbfPath));
75
                                record = new Object[myHeader.getNumFields()];
76
                                numRows = 0;
77

    
78
                        } catch (IOException e) {
79
                                e.printStackTrace();
80
                                throw new EditionException(e);
81
                        }
82
                }
83

    
84

    
85
        }
86

    
87
        public void process(IRowEdited row) throws EditionException {
88
                IRow rowEdit = (IRow) row.getLinkedRow();
89

    
90
                try {
91
                        for (int i=0; i < record.length; i++)
92
                                record[i] = rowEdit.getAttribute(i);
93
                        dbfWrite.write(record);
94
                        numRows++;
95

    
96
                } catch (IOException e) {
97
                        e.printStackTrace();
98
                        throw new EditionException(e);
99
                }
100

    
101
        }
102

    
103
        public void postProcess() throws EditionException {
104
                try {
105
                        myHeader.setNumRecords(numRows);
106
                        dbfWrite = new DbaseFileWriterNIO(myHeader,
107
                                        (FileChannel) getWriteChannel(dbfPath));
108
                } catch (IOException e) {
109
                        e.printStackTrace();
110
                        throw new EditionException(e);
111
                }
112

    
113

    
114
        }
115

    
116
        public String getName() {
117
                return "DBF Writer";
118
        }
119

    
120
        public boolean canWriteAttribute(int sqlType) {
121
                switch (sqlType)
122
                {
123
                case Types.DOUBLE:
124
                case Types.FLOAT:
125
                case Types.INTEGER:
126
                case Types.BIGINT:
127
                        return true;
128
                case Types.DATE:
129
                        return true;
130
                case Types.BIT:
131
                case Types.BOOLEAN:
132
                        return true;
133
                case Types.VARCHAR:
134
                case Types.CHAR:
135
                case Types.LONGVARCHAR:
136
                        return true; // TODO: Revisar esto, porque no creo que admita campos muy grandes
137

    
138
                }
139

    
140
                return false;
141
        }
142

    
143

    
144
        public void initialize(ITableDefinition tableDefinition) throws EditionException {
145
                myHeader = DbaseFileHeaderNIO.createDbaseHeader(tableDefinition.getFieldsDesc());
146
                if (dbfPath == null)
147
                {
148
                        throw new EditionException("DBFWriter: You need to use setFile before initialize."); 
149
                }
150
                
151
        }
152

    
153
}