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 @ 41199

History | View | Annotate | Download (11 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

    
29
import org.apache.commons.lang3.StringEscapeUtils;
30
import org.cresques.cts.IProjection;
31
import org.gvsig.fmap.dal.DataStoreParameters;
32
import org.gvsig.fmap.dal.FileHelper;
33
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
34
import org.gvsig.fmap.dal.spi.AbstractDataParameters;
35
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
36
import org.gvsig.tools.ToolsLocator;
37
import org.gvsig.tools.dataTypes.DataTypesManager;
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
                DataStoreParameters, 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
    
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

    
76
    
77

    
78
        private DelegatedDynObject parameters;
79

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

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

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

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

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

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

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

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

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

    
123

    
124
        static CsvPreference getPredefinedCSVPreferences(DynObject dynobj) {
125
                String s = (String) dynobj.getDynValue(PROFILE);
126
                if( "NONE".equalsIgnoreCase(s) ) {
127
                        return null;
128
                }
129
                if( "STANDARD_PREFERENCE".equalsIgnoreCase(s) ) {
130
                        return CsvPreference.STANDARD_PREFERENCE;
131
                }
132
                if( "EXCEL_PREFERENCE".equalsIgnoreCase(s) ) {
133
                        return CsvPreference.EXCEL_PREFERENCE;
134
                }
135
                if( "EXCEL_NORTH_EUROPE_PREFERENCE".equalsIgnoreCase(s) ) {
136
                        return CsvPreference.EXCEL_NORTH_EUROPE_PREFERENCE;
137
                }
138
                if( "TAB_PREFERENCE".equalsIgnoreCase(s) ) {
139
                        return CsvPreference.TAB_PREFERENCE;
140
                }
141
                return null ;
142
        }
143
        
144
        static QuoteMode getQuoteMode(DynObject dynobj) {
145
                String s = (String) dynobj.getDynValue(QUOTEPOLICY);
146
                if( "AlwaysQuoteMode".equalsIgnoreCase(s) ) {
147
                        return new AlwaysQuoteMode();
148
                }
149
                if( "NormalQuoteMode".equalsIgnoreCase(s) ) {
150
                        return new NormalQuoteMode();
151
                }
152
                return null;
153
        }
154
        
155
        static IProjection getCRS(DynObject dynobj) {
156
                return (IProjection) dynobj.getDynValue(CRS);
157
        }
158

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

    
167
        static File getFile(DynObject dynobj) {
168
                File f = (File) dynobj.getDynValue(FILE);
169
                return f;
170
        }
171

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

    
213
//        static String getEscapeCharacter(DynObject dynobj) {
214
//                String s = (String) dynobj.getDynValue(ESCAPECHARACTER);
215
//                return StringEscapeUtils.unescapeJava(s);
216
//        }
217
//        
218
        static String getQuoteCharacter(DynObject dynobj) {
219
                String s = (String) dynobj.getDynValue(QUOTECHAR);
220
                s = StringEscapeUtils.unescapeJava(s);
221
                if( isEmpty(s) ) {
222
                        return null;
223
                }
224
                return s.substring(0, 1);
225
        }
226
        
227
        static String getDelimiter(DynObject dynobj) {
228
                String s = (String) dynobj.getDynValue(DELIMITER);
229
                s = StringEscapeUtils.unescapeJava(s);
230
                if( isEmpty(s) ) {
231
                        return null;
232
                }
233
                return s.substring(0, 1);
234
        }
235
        
236
        static String getHeader(DynObject dynobj) {
237
                String s = (String) dynobj.getDynValue(HEADER);
238
                s = StringEscapeUtils.unescapeJava(s);
239
                if( isEmpty(s) ) {
240
                        return null;
241
                }
242
                return s;
243
        }
244

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

    
262
        private static String getDelimiter(String line) {
263
                String sep = null;
264
                // Cuiaddo con los ":", los he puesto al final a proposito
265
                // ya que podian estar en la cadena para separar el size
266
                // size 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
//        static String getNullTo(DynObject dynobj) {
278
//                String s = (String) dynobj.getDynValue(NULLTO);
279
//                return StringEscapeUtils.unescapeJava(s);
280
//        }
281
        
282
        static String getCharset(DynObject dynobj) {
283
                String s = (String) dynobj.getDynValue(CHARSET);
284
                return StringEscapeUtils.unescapeJava(s);
285
        }
286
        
287
        static String[] getPointDimensionNames(DynObject dynobj) {
288
                String s = (String) dynobj.getDynValue("point");
289
                if( isEmpty(s) ) {
290
                        return null;
291
                }
292
                return s.split(",");
293
        }
294
        
295
        static boolean getSurroundingSpacesNeedQuotes(DynObject dynobj) {
296
                Boolean b = (Boolean) dynobj.getDynValue(SURROUNDINGSPACESNEEDQUOTES);
297
                if( b==null ) {
298
                        return false;
299
                }
300
                return b.booleanValue();
301
        }
302
        
303
        static boolean getAutomaticTypesDetection(DynObject dynobj) {
304
                Boolean b = (Boolean) dynobj.getDynValue(AUTOMATICTYPESDETECTION);
305
                if( b==null ) {
306
                        return false;
307
                }
308
                return b.booleanValue();
309
        }
310
        
311
        static boolean getIgnoreErrors(DynObject dynobj) {
312
                Boolean b = (Boolean) dynobj.getDynValue(IGNOREERRORS);
313
                if( b==null ) {
314
                        return false;
315
                }
316
                return b.booleanValue();
317
        }
318
        
319
//        static boolean getIgnoreEmptyLines(DynObject dynobj) {
320
//                Boolean b = (Boolean) dynobj.getDynValue(IGNOREEMPTYLINES);
321
//                return b.booleanValue();
322
//        }
323
        
324
        static int[] getFieldTypes(DynObject dynobj) {
325
                String s = (String) dynobj.getDynValue(FIELDTYPES);
326
                if( isEmpty(s) ) {
327
                        return null;
328
                }
329
                String sep = getDelimiter(s);
330
                if( sep == null ) {
331
                        return null;
332
                }
333
                DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
334
                String fieldTypeNames[] = s.split("["+sep+"]");
335
                int fieldTypes[] = new int[fieldTypeNames.length];
336
                for( int i=0; i<fieldTypeNames.length; i++ ) {
337
                        s = fieldTypeNames[i].trim();
338
                        if( s.contains(":") ) {
339
                                s = s.split(":")[0];
340
                        }
341
                        fieldTypes[i] = dataTypeManager.getType(s);
342
                }
343
                return fieldTypes;
344
        }
345
        
346
        static int[] getFieldSizes(DynObject dynobj) {
347
                String s = (String) dynobj.getDynValue(FIELDTYPES);
348
                if( isEmpty(s) ) {
349
                        return null;
350
                }
351
                String sep = getDelimiter(s);
352
                if( sep == null ) {
353
                        return null;
354
                }
355
                String fieldTypeNames[] = s.split("["+sep+"]");
356
                int fieldSizes[] = new int[fieldTypeNames.length];
357
                for( int i=0; i<fieldTypeNames.length; i++ ) {
358
                        String fieldtype = fieldTypeNames[i].trim();
359
                        if( fieldtype .contains(":") ) {
360
                                try {
361
                                        s = fieldtype .split(":")[1];
362
                                        fieldSizes[i] = Integer.parseInt(s);
363
                                } catch(Exception ex) {
364
                                        logger.warn("Can't get size of field "+i+" ("+fieldtype +").",ex);
365
                                }
366
                        } else {
367
                                fieldSizes[i] = 0;
368
                        }
369
                }
370
                return fieldSizes;
371
        }
372
        
373
        static private boolean isEmpty(String s) {
374
                if( s == null ) {
375
                        return true;
376
                }
377
                if( s.trim().length() == 0 ) {
378
                        return true;
379
                }
380
                return false;
381
        }
382
}