Statistics
| Revision:

root / trunk / libraries / libDataSourceBaseDrivers / src / org / gvsig / data / datastores / vectorial / driver / dbf / DBFDriver.java @ 19673

History | View | Annotate | Download (7.38 KB)

1
package org.gvsig.data.datastores.vectorial.driver.dbf;
2

    
3
import java.io.File;
4
import java.text.DateFormat;
5
import java.text.ParseException;
6
import java.util.Date;
7
import java.util.Locale;
8

    
9
import org.gvsig.data.IDataStoreParameters;
10
import org.gvsig.data.datastores.vectorial.driver.AbstractDriver;
11
import org.gvsig.data.datastores.vectorial.driver.IDriverParameters;
12
import org.gvsig.data.datastores.vectorial.driver.IDriverStoreParameters;
13
import org.gvsig.data.datastores.vectorial.driver.IFeaturesReader;
14
import org.gvsig.data.datastores.vectorial.driver.IFeaturesWriter;
15
import org.gvsig.data.datastores.vectorial.driver.dbf.filedbf.DbaseFile;
16
import org.gvsig.data.exception.CloseException;
17
import org.gvsig.data.exception.InitializeException;
18
import org.gvsig.data.exception.InitializeWriterException;
19
import org.gvsig.data.exception.OpenException;
20
import org.gvsig.data.exception.ReadException;
21
import org.gvsig.data.vectorial.DefaultAttributeDescriptor;
22
import org.gvsig.data.vectorial.DefaultFeatureType;
23
import org.gvsig.data.vectorial.IFeature;
24
import org.gvsig.data.vectorial.IFeatureAttributeDescriptor;
25
import org.gvsig.data.vectorial.IFeatureCollection;
26
import org.gvsig.data.vectorial.IFeatureID;
27
import org.gvsig.data.vectorial.IFeatureType;
28
import org.gvsig.data.vectorial.expansionadapter.FeatureManager;
29
import org.gvsig.metadata.IMetadata;
30
import org.gvsig.metadata.IMetadataManager;
31
import org.gvsig.metadata.MetadataManager;
32

    
33

    
34
public class DBFDriver  extends AbstractDriver {
35
        public static final String DRIVER_NAME = "dbf";
36
        private static String tempDirectoryPath = System.getProperty("java.io.tmpdir");
37
        protected static Locale ukLocale = new Locale("en", "UK"); // English, UK version
38
    protected DbaseFile dbf = new DbaseFile();
39
    private IFeatureType featureType;
40

    
41
//    private DefaultAttributeDescriptor dad=new DefaultAttributeDescriptor();
42
        private File file;
43
        protected IMetadata metadata;
44

    
45
    public DBFDriver() {
46

    
47
        }
48

    
49
        public void init(IDriverParameters parameters) throws InitializeException {
50
                super.init(parameters);
51
                DBFDriverParameters DBFParameters=(DBFDriverParameters)parameters;
52
                file=DBFParameters.getDBFFile();
53
                dbf.open(file);
54
                featureType=new DefaultFeatureType();
55
                    for (int i = 0; i < dbf.getFieldCount(); i++) {
56
                featureType.add(createFeatureAttribute(i));
57
            }
58

    
59

    
60
            //Para el writer
61
//                    int aux = (int)(Math.random() * 1000);
62
//                    fTemp = new File(tempDirectoryPath + "/tmpDbf" + aux + ".dbf");
63
//                    dbfWriter.setFile(fTemp);
64

    
65

    
66
        }
67
        private IFeatureAttributeDescriptor createFeatureAttribute(int i) {
68
        char fieldType = dbf.getFieldType(i);
69
        DefaultAttributeDescriptor dad=new DefaultAttributeDescriptor();
70
        dad.setOrdinal(i);
71
        dad.setName(dbf.getFieldName(i));
72
        dad.setSize(dbf.getFieldLength(i));
73
        if (fieldType == 'L') {
74
                dad.setType(IFeatureAttributeDescriptor.TYPE_BOOLEAN);
75

    
76
        } else if ((fieldType == 'F') || (fieldType == 'N')) {
77
                int precision = dbf.getFieldDecimalLength(i);
78
                if (precision > 0){
79
                        dad.setType(IFeatureAttributeDescriptor.TYPE_DOUBLE);
80
                        dad.setPrecision(precision);
81
                } else{
82
                        dad.setType(IFeatureAttributeDescriptor.TYPE_INT);
83
                }
84
        } else if (fieldType == 'C') {
85
                dad.setType(IFeatureAttributeDescriptor.TYPE_STRING);
86
        } else if (fieldType == 'D') {
87
                dad.setType(IFeatureAttributeDescriptor.TYPE_DATE);
88
        } else {
89
//            throw new BadFieldDriverException(getName(),null,String.valueOf(fieldType));
90
        }
91
              return dad;
92

    
93
    }
94

    
95
        public void open() {
96
        }
97
        public void close() throws CloseException {
98
                dbf.close();
99
        }
100

    
101
        public void dispose() {
102
                // TODO Apéndice de método generado automáticamente
103

    
104
        }
105

    
106
        public IFeaturesWriter getFeaturesWriter() {
107
                IFeaturesWriter writer = new DBFFeaturesWriter();
108
//                writer.init(this);
109
                return writer;
110
        }
111

    
112

    
113
        public IFeaturesReader getFeatutesReader() {
114
                IFeaturesReader reader = new DBFFeaturesReader();
115
                reader.init(this);
116
                return reader;
117
        }
118

    
119
        public IFeature getFeatureByID(IFeatureID id) {
120
                return getFeatureByPosition(featureType,((DBFFeatureID)id).getIndex());
121
        }
122

    
123
        public IFeature getFeatureByPosition(IFeatureType ft,long position) {
124
//                 Field Type (C  or M)
125
//        char cfieldType = fieldTypes[fieldId];
126
//        int fieldType = getFieldType(fieldId);
127
                IFeature feature=new DBFFeature(ft,this,position);
128
                for (int i=0;i<ft.size();i++) {
129
                        IFeatureAttributeDescriptor descriptor= (IFeatureAttributeDescriptor)ft.get(i);
130
                        if (dbf.getFieldCount()<=i)
131
                                return feature;
132
                        String value=dbf.getStringFieldValue((int) position, i);
133
                        value=value.trim();
134
                        String fieldType=descriptor.getDataType();
135
                        if (fieldType.equals(IFeatureAttributeDescriptor.TYPE_STRING)){
136
                                feature.set(i,value);
137
                        }else if (fieldType.equals(IFeatureAttributeDescriptor.TYPE_DOUBLE)){
138
                                try{
139
                                        Double.parseDouble(value);
140
                                }catch (NumberFormatException e) {
141
                                        value="0";
142
                                }
143
                                feature.set(i,Double.parseDouble(value));
144
                        }else if (fieldType.equals(IFeatureAttributeDescriptor.TYPE_INT)){
145
                                feature.set(i,Integer.parseInt(value));
146
                        }else if (fieldType.equals(IFeatureAttributeDescriptor.TYPE_FLOAT)){
147
                                feature.set(i,Float.parseFloat(value));
148
                        }else if (fieldType.equals(IFeatureAttributeDescriptor.TYPE_LONG)){
149
                                feature.set(i,Long.parseLong(value));
150
                        }else if (fieldType.equals(IFeatureAttributeDescriptor.TYPE_BOOLEAN)){
151
                                feature.set(i,Boolean.parseBoolean(value));
152
                        }else if (fieldType.equals(IFeatureAttributeDescriptor.TYPE_BYTE)){
153
                                feature.set(i,Byte.parseByte(value));
154
                        }else if (fieldType.equals(IFeatureAttributeDescriptor.TYPE_DATE)){
155
                                 String year = value.substring(0, 4);
156
                            String month = value.substring(4, 6);
157
                            String day = value.substring(6, 8);
158
                            DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, ukLocale);
159
                            /* Calendar c = Calendar.getInstance();
160
                            c.clear();
161
                            c.set(Integer.parseInt(year), Integer.parseInt(month),
162
                                Integer.parseInt(day));
163
                            c.set(Calendar.MILLISECOND, 0); */
164
                            String strAux = month + "/" + day + "/" + year;
165
                            Date dat=null;
166
                            try {
167
                                dat = df.parse(strAux);
168
                            } catch (ParseException e) {
169
//                                throw new ReadDriverException(getName(),e);
170
                            }
171
                                feature.set(i,dat);
172
                        }else{
173
                                feature.set(i,null);
174
                        }
175
                }
176
                return feature;
177
        }
178

    
179
        public IFeatureType getFeatureType() {
180
                return featureType;
181
        }
182

    
183
        public IFeatureCollection getDataCollection(FeatureManager featureManager,IFeatureType type, String filter, String order) throws ReadException {
184
                if (type==null){
185
                        type=getFeatureType();
186
                }
187
                return getFeatutesReader().getFeatures(featureManager,type,filter,order);
188
        }
189

    
190
        public String getName() {
191
                return DRIVER_NAME;
192
        }
193

    
194
        public boolean isEditable() {
195
                if (file.canWrite()) return true;
196
                return false;
197
        }
198

    
199
        public boolean canAlterFeatureType() {
200
                return true;
201
        }
202
        public long getFeatureCount(){
203
                return dbf.getRecordCount();
204
        }
205

    
206
        public IMetadata getMetadata() {
207
                if (metadata==null){
208
                        IMetadataManager manager=MetadataManager.getManager();
209
                        metadata=manager.create(DRIVER_NAME);
210
                }
211
                return metadata;
212
        }
213
}