Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.file / org.gvsig.fmap.dal.file.csv / src / main / java / org / gvsig / fmap / dal / store / csv / CSVStoreParameters.java @ 42775

History | View | Annotate | Download (14.8 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA 02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.fmap.dal.store.csv;
25

    
26
import java.io.File;
27
import java.util.Locale;
28
import org.apache.commons.lang3.BooleanUtils;
29

    
30
import org.apache.commons.lang3.StringEscapeUtils;
31
import org.apache.commons.lang3.StringUtils;
32
import org.cresques.cts.IProjection;
33
import org.gvsig.fmap.dal.FileHelper;
34
import org.gvsig.fmap.dal.OpenDataStoreParameters;
35
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
36
import org.gvsig.fmap.dal.spi.AbstractDataParameters;
37
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
38
import org.gvsig.tools.dynobject.DelegatedDynObject;
39
import org.gvsig.tools.dynobject.DynObject;
40
import org.slf4j.Logger;
41
import org.slf4j.LoggerFactory;
42
import org.supercsv.prefs.CsvPreference;
43
import org.supercsv.quote.AlwaysQuoteMode;
44
import org.supercsv.quote.NormalQuoteMode;
45
import org.supercsv.quote.QuoteMode;
46

    
47
public class CSVStoreParameters extends AbstractDataParameters implements
48
        OpenDataStoreParameters, FilesystemStoreParameters {
49

    
50
    private static final Logger logger = LoggerFactory.getLogger(CSVStoreParameters.class);
51

    
52
    public static final String PARAMETERS_DEFINITION_NAME = "CSVStoreParameters";
53

    
54
    private static final String FILE = "file";
55
    private static final String IGNOREERRORS = "ignoreErrors";
56
    private static final String PROFILE = "profile";
57
    private static final String QUOTEPOLICY = "quotePolicy";
58
    private static final String QUOTECHAR = "quoteCharacter";
59
    private static final String RECORDSEPARATOR = "recordSeparator";
60
    private static final String DELIMITER = "delimiter";
61
    private static final String COMMENTSTARTMARKER = "commentStartMarker";
62
    private static final String AUTOMATICTYPESDETECTION = "automaticTypesDetection";
63

    
64
    private static final String ESCAPECHARACTER = "escapeCharacter";
65
    private static final String FIRST_LINE_HEADER = "firstLineHeader";
66
    private static final String HEADER = "header";
67
    private static final String SURROUNDINGSPACESNEEDQUOTES = "surroundingSpacesNeedQuotes";
68

    
69
    //private static final String IGNOREEMPTYLINES = "ignoreEmptyLines";
70
    private static final String CRS = "CRS";
71
    private static final String FIELDTYPES = "fieldtypes";
72
//    private static final String NULLTO = "nullTo";
73
    private static final String CHARSET = "charset"; // Default "UTF-8"
74
    private static final String LOCALE = "locale";
75
    private static final String POINT_COLUMN_NAME = "pointColumnName";
76
    private static final String LIMIT = "limit";
77

    
78
    private DelegatedDynObject parameters;
79

    
80
    public CSVStoreParameters() {
81
        this(PARAMETERS_DEFINITION_NAME);
82
    }
83

    
84
    protected CSVStoreParameters(String parametersDefinitionName) {
85
        this(parametersDefinitionName, CSVStoreProvider.NAME);
86
    }
87

    
88
    public CSVStoreParameters(String parametersDefinitionName, String name) {
89
        super();
90
        this.parameters = (DelegatedDynObject) FileHelper.newParameters(parametersDefinitionName);
91
        this.setDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME, name);
92
    }
93

    
94
    public String getDataStoreName() {
95
        return (String) this.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME);
96
    }
97

    
98
    public String getDescription() {
99
        return this.getDynClass().getDescription();
100
    }
101

    
102
    protected DelegatedDynObject getDelegatedDynObject() {
103
        return parameters;
104
    }
105

    
106
    public boolean isValid() {
107
        if ( getFileName(this) == null ) {
108
            return false;
109
        }
110
        return true;
111
    }
112

    
113
    public File getFile() {
114
        return (File) this.getDynValue(FILE);
115
    }
116

    
117
    public void setFile(File file) {
118
        this.setDynValue(FILE, file);
119
    }
120

    
121
    public static CsvPreference getPredefinedCSVPreferences(DynObject dynobj) {
122
        String s = (String) dynobj.getDynValue(PROFILE);
123
        if ( "NONE".equalsIgnoreCase(s) ) {
124
            return null;
125
        }
126
        if ( "STANDARD_PREFERENCE".equalsIgnoreCase(s) ) {
127
            return CsvPreference.STANDARD_PREFERENCE;
128
        }
129
        if ( "EXCEL_PREFERENCE".equalsIgnoreCase(s) ) {
130
            return CsvPreference.EXCEL_PREFERENCE;
131
        }
132
        if ( "EXCEL_NORTH_EUROPE_PREFERENCE".equalsIgnoreCase(s) ) {
133
            return CsvPreference.EXCEL_NORTH_EUROPE_PREFERENCE;
134
        }
135
        if ( "TAB_PREFERENCE".equalsIgnoreCase(s) ) {
136
            return CsvPreference.TAB_PREFERENCE;
137
        }
138
        return null;
139
    }
140

    
141
    public static QuoteMode getQuoteMode(DynObject dynobj) {
142
        String s = (String) dynobj.getDynValue(QUOTEPOLICY);
143
        if ( "AlwaysQuoteMode".equalsIgnoreCase(s) ) {
144
            return new AlwaysQuoteMode();
145
        }
146
        if ( "NormalQuoteMode".equalsIgnoreCase(s) ) {
147
            return new NormalQuoteMode();
148
        }
149
        return null;
150
    }
151

    
152
    static IProjection getCRS(DynObject dynobj) {
153
        return (IProjection) dynobj.getDynValue(CRS);
154
    }
155

    
156
    static String getFileName(DynObject dynobj) {
157
        File f = (File) dynobj.getDynValue(FILE);
158
        if ( f == null ) {
159
            return null;
160
        }
161
        return f.getPath();
162
    }
163

    
164
    static File getFile(DynObject dynobj) {
165
        File f = (File) dynobj.getDynValue(FILE);
166
        return f;
167
    }
168

    
169
    public static String getRecordSeparator(DynObject dynobj) {
170
        String s = (String) dynobj.getDynValue(RECORDSEPARATOR);
171
        return StringEscapeUtils.unescapeJava(s);
172
    }
173

    
174
    static Locale getLocale(DynObject dynobj) {
175
        try {
176
            String s = (String) dynobj.getDynValue(LOCALE);
177
            if ( s.trim().length() == 0 ) {
178
                return null;
179
            }
180
            if ( "DEFAULT".equalsIgnoreCase(s.trim()) ) {
181
                return Locale.getDefault();
182
            }
183
            Locale locale = null;
184
            // locale = Locale.forLanguageTag(s); // Since java 1.7
185
            String[] ss = s.split("-");
186
            switch (ss.length) {
187
            case 1:
188
                locale = new Locale(ss[0]);
189
                break;
190
            case 2:
191
                locale = new Locale(ss[0], ss[1]);
192
                break;
193
            case 3:
194
            default:
195
                locale = new Locale(ss[0], ss[1], ss[2]);
196
                break;
197
            }
198
            return locale;
199
        } catch (Exception ex) {
200
            logger.warn("Can't get locale from CSV parameters.", ex);
201
            return null;
202
        }
203
    }
204

    
205
    public static String getCommentStartMarker(DynObject dynobj) {
206
        String s = (String) dynobj.getDynValue(COMMENTSTARTMARKER);
207
        return StringEscapeUtils.unescapeJava(s);
208
    }
209
    
210
    public static String getPointColumnName(DynObject dynobj) {
211
        String s = (String) dynobj.getDynValue(POINT_COLUMN_NAME);
212
        return s;
213
    }
214

    
215
    public static String getQuoteCharacter(DynObject dynobj) {
216
        String s = (String) dynobj.getDynValue(QUOTECHAR);
217
        s = StringEscapeUtils.unescapeJava(s);
218
        if ( StringUtils.isBlank(s) ) {
219
            return null;
220
        }
221
        return s.substring(0, 1);
222
    }
223

    
224
    public static String getDelimiter(DynObject dynobj) {
225
        String s = (String) dynobj.getDynValue(DELIMITER);
226
        s = StringEscapeUtils.unescapeJava(s);
227
        if ( StringUtils.isBlank(s) ) {
228
            return null;
229
        }
230
        return s.substring(0, 1);
231
    }
232

    
233
    static String getHeader(DynObject dynobj) {
234
        String s = (String) dynobj.getDynValue(HEADER);
235
        s = StringEscapeUtils.unescapeJava(s);
236
        if ( StringUtils.isBlank(s) ) {
237
            return null;
238
        }
239
        return s;
240
    }
241

    
242
    static String[] getHeaders(DynObject dynobj) {
243
        String s = getHeader(dynobj);
244
        if ( StringUtils.isBlank(s) ) {
245
            return null;
246
        }
247
        String sep = getDelimiter(dynobj);
248
        if ( sep == null ) {
249
            sep = getDelimiter(s);
250
            if ( sep == null ) {
251
                // Chungo
252
                return null;
253
            }
254
        }
255
        String[] ss = s.split("[" + sep + "]");
256
        return ss;
257
    }
258

    
259
    static String getDelimiter(String line) {
260
        if( StringUtils.isBlank(line) ) {
261
            return null;
262
        }
263
        String sep = null;
264
        // Cuidado con los ":", los he puesto al final a proposito
265
        // ya que podian estar en la cadena para separar el size
266
        // de cada tipo.
267
        String seps = ",;-|@#/+$%&!:";
268
        for ( int i = 0; i < seps.length(); i++ ) {
269
            sep = seps.substring(i, 1);
270
            if ( line.contains(seps.substring(i, 1)) ) {
271
                break;
272
            }
273
            sep = null;
274
        }
275
        return sep;
276
    }
277

    
278
    static String getCharset(DynObject dynobj) {
279
        String s = (String) dynobj.getDynValue(CHARSET);
280
        return StringEscapeUtils.unescapeJava(s);
281
    }
282

    
283
    static String[] getPointDimensionNames(DynObject dynobj) {
284
        String s = (String) dynobj.getDynValue("point");
285
        if ( StringUtils.isBlank(s) ) {
286
            return null;
287
        }
288
        return s.split(",");
289
    }
290

    
291
    public static boolean getSurroundingSpacesNeedQuotes(DynObject dynobj) {
292
        Boolean b = (Boolean) dynobj.getDynValue(SURROUNDINGSPACESNEEDQUOTES);
293
        return BooleanUtils.isTrue(b);
294
    }
295

    
296
    static boolean getAutomaticTypesDetection(DynObject dynobj) {
297
        Boolean b = (Boolean) dynobj.getDynValue(AUTOMATICTYPESDETECTION);
298
        return BooleanUtils.isTrue(b);
299
    }
300

    
301
    static boolean getIgnoreErrors(DynObject dynobj) {
302
        Boolean b = (Boolean) dynobj.getDynValue(IGNOREERRORS);
303
        return BooleanUtils.isTrue(b);
304
    }
305

    
306
    static boolean isFirstLineHeader(DynObject dynobj) {
307
        Boolean b = (Boolean) dynobj.getDynValue(FIRST_LINE_HEADER);
308
        return BooleanUtils.isTrue(b);
309
    }
310

    
311
//    static int[] getFieldTypes(DynObject dynobj) {
312
//        String s = (String) dynobj.getDynValue(FIELDTYPES);
313
//        if ( StringUtils.isBlank(s) ) {
314
//            return null;
315
//        }
316
//        String sep = getDelimiter(s);
317
//        if ( sep == null ) {
318
//            return null;
319
//        }
320
//        DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
321
//        String fieldTypeNames[] = s.split("[" + sep + "]");
322
//        int fieldTypes[] = new int[fieldTypeNames.length];
323
//        for ( int i = 0; i < fieldTypeNames.length; i++ ) {
324
//            s = fieldTypeNames[i].trim();
325
//            if ( s.contains(":") ) {
326
//                s = s.split(":")[0];
327
//            }
328
//            fieldTypes[i] = dataTypeManager.getType(s);
329
//        }
330
//        return fieldTypes;
331
//    }
332
//
333
//    static int[] getFieldSizes(DynObject dynobj) {
334
//        String s = (String) dynobj.getDynValue(FIELDTYPES);
335
//        if ( StringUtils.isBlank(s) ) {
336
//            return null;
337
//        }
338
//        String sep = getDelimiter(s);
339
//        if ( sep == null ) {
340
//            return null;
341
//        }
342
//        DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
343
//        String fieldTypeNames[] = s.split("[" + sep + "]");
344
//        int fieldSizes[] = new int[fieldTypeNames.length];
345
//        for ( int i = 0; i < fieldTypeNames.length; i++ ) {
346
//            String fieldtypeDef = fieldTypeNames[i].trim();
347
//            if ( fieldtypeDef.contains(":") ) {
348
//                try {
349
//                    String[] parts = fieldtypeDef.split(":");
350
//                    int fieldType = dataTypeManager.getType(parts[0]);
351
//                    if( fieldType == DataTypes.GEOMETRY ) {
352
//                        fieldSizes[i] = 1;
353
//                    } else {
354
//                        s = parts[1];
355
//                        fieldSizes[i] = Integer.parseInt(s);
356
//                    }
357
//                } catch (Exception ex) {
358
//                    logger.warn("Can't get size of field " + i + " (" + fieldtypeDef + ").", ex);
359
//                }
360
//            } else {
361
//                fieldSizes[i] = 0;
362
//            }
363
//        }
364
//        return fieldSizes;
365
//    }
366

    
367
    static String getRawFieldTypes(DynObject dynobj) {
368
        String s = (String) dynobj.getDynValue(FIELDTYPES);
369
        if ( StringUtils.isBlank(s) ) {
370
            return null;
371
        }
372
        return s.trim();
373
    }
374

    
375
    static int getSkipLines(DynObject dynobj) {
376
        Integer n = (Integer) dynobj.getDynValue("skipLines");
377
        if ( n == null ) {
378
            return 0;
379
        }
380
        return n;
381
    }
382

    
383
    static int getLimit(DynObject dynobj) {
384
        Integer n = (Integer) dynobj.getDynValue(LIMIT);
385
        if ( n == null ) {
386
            return -1;
387
        }
388
        return n;
389
    }
390

    
391
    static String getRawFieldsDefinition(DynObject dynobj) {
392
        String s = (String) dynobj.getDynValue("fieldsDefinition");
393
        if ( StringUtils.isBlank(s) ) {
394
            return null;
395
        }
396
        return s.trim();
397
    }
398

    
399
    public static class FieldDefinition {
400

    
401
        private int start;
402
        private int end;
403

    
404
        public FieldDefinition(String def) {
405
            def = def.trim();
406
            String[] ss = def.split(":");
407
            this.start = Integer.parseInt(ss[0]);
408
            if ( ss.length < 2 ) {
409
                this.end = -1;
410
            } else {
411
                this.end = Integer.parseInt(ss[1]);
412
            }
413
        }
414

    
415
        public int getStart() {
416
            return this.start;
417
        }
418

    
419
        public int getEnd() {
420
            return this.end;
421
        }
422

    
423
        public boolean getToEndOfLine() {
424
            return this.end == -1;
425
        }
426
    }
427

    
428
    public static FieldDefinition[] getFieldsDefinition(DynObject dynobj) {
429
        String definition = getRawFieldsDefinition(dynobj);
430
        if ( definition == null ) {
431
            return null;
432
        }
433
        int i=0;
434
        try {
435
            String[] defs = StringUtils.split(definition);
436
            FieldDefinition[] fieldsDefinition = new FieldDefinition[defs.length];
437
            for ( i = 0; i < defs.length; i++ ) {
438
                fieldsDefinition[i] = new FieldDefinition(defs[i]);
439
            }
440
            return fieldsDefinition;
441
        } catch (Exception ex) {
442
            throw  new IllegalArgumentException("Can't recognize the format field definition '"+definition+"' ("+i+").");
443
        }
444
    }
445

    
446
}