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 / CSVFeatureTypeLoader.java @ 47640

History | View | Annotate | Download (6.36 KB)

1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.fmap.dal.store.csv;
7

    
8
import org.gvsig.fmap.dal.store.simplereader.SimpleReaderPointAttributeEmulator;
9
import java.io.IOException;
10
import java.io.Reader;
11
import org.apache.commons.lang3.StringUtils;
12
import org.gvsig.fmap.dal.DataTypes;
13
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
14
import org.gvsig.fmap.dal.feature.EditableFeatureType;
15
import org.gvsig.fmap.dal.store.csv.simplereaders.CSVReaderSuperCSV;
16
import org.gvsig.fmap.dal.store.csv.simplereaders.FixedLenReader;
17
import org.gvsig.fmap.dal.store.simplereader.*;
18
import org.gvsig.fmap.dal.store.simplereader.simplereaders.SimpleReader;
19
import org.gvsig.fmap.geom.Geometry;
20
import org.gvsig.fmap.geom.GeometryLocator;
21
import org.gvsig.fmap.geom.GeometryManager;
22
import org.gvsig.fmap.geom.type.GeometryType;
23
import org.gvsig.tools.locator.LocatorException;
24
import org.slf4j.Logger;
25
import org.slf4j.LoggerFactory;
26

    
27
/**
28
 *
29
 * @author fdiaz
30
 */
31
public class CSVFeatureTypeLoader extends SimpleReaderFeatureTypeLoader{
32
    
33
    private static final Logger LOGGER = LoggerFactory.getLogger(CSVFeatureTypeLoader.class);
34

    
35
    public CSVFeatureTypeLoader(CSVStoreParameters parameters) {
36
        super(parameters);
37
    }
38

    
39
    protected String getProviderName() {
40
        return CSVStoreProvider.NAME;
41
    }
42
    
43
    protected SimpleReader getSimpleReader(Reader in) throws IOException {
44
        SimpleReader reader;
45
        if (CSVStoreParameters.getRawFieldsDefinition(parameters) != null) {
46
            reader = new FixedLenReader(in, (CSVStoreParameters) parameters);
47
        } else {
48
            reader = new CSVReaderSuperCSV(in, (CSVStoreParameters) parameters);
49
        }
50
        return reader;
51
    }
52

    
53
    @Override
54
    protected boolean isFirstLineHeader() {
55
        return CSVStoreParameters.isFirstLineHeader(parameters);
56
    }
57
    
58
    
59
    protected String[] getHeaders(SimpleReader reader) throws RuntimeException, IOException {
60
        String headers[];
61
        headers = CSVStoreParameters.getHeaders(parameters);
62
        if (headers == null) {
63
            if (CSVStoreParameters.isFirstLineHeader(parameters)) {
64
                headers = reader.getHeader();
65
                if (headers == null) {
66
                    if (CSVStoreParameters.getIgnoreErrors(parameters)) {
67
                        headers = getFixedHeaders(reader.getColumnsCount());
68
                    } else {
69
                        String msg = "Can't retrieve header from csv file '"
70
                                + parameters.getFile()
71
                                        .getAbsolutePath()
72
                                + "' and not specified in the parameters.";
73
                        LOGGER.warn(msg);
74
                        throw new RuntimeException(msg);
75
                    }
76
                }
77
            } else {
78
                headers = getFixedHeaders(reader.getColumnsCount());
79
            }
80
        } else {
81
            if (CSVStoreParameters.isFirstLineHeader(parameters)) {
82
                reader.getHeader(); // Skip and ignore the header of file
83
            }
84
        }
85
        return headers;
86
    }
87
    
88
    protected void fillFeatureType(EditableFeatureType fType, String headers[], AutomaticDetectionOfTypes.DetectedValue automaticTypes[]) {
89
        String fullFileName = parameters.getFile()==null? "":parameters.getFile().getAbsolutePath();
90
        String providerName = this.getProviderName();
91
        
92
        fType.setHasOID(true);
93

    
94

    
95
        FieldTypeParser[] fieldTypes = getFieldTypes(headers, automaticTypes);
96

    
97
        fillFeatureType(fType, fieldTypes);
98
        
99
        makeGeometry(fType, providerName, fullFileName);        
100
        
101
        declareGeometryType(fType, fullFileName);
102

    
103
    }
104

    
105
    private void declareGeometryType(EditableFeatureType fType, String fullFileName) throws LocatorException {
106
        String geometry_column = CSVStoreParameters.getGeometryColumn(parameters);
107
        if (!StringUtils.isEmpty(geometry_column)) {
108
            EditableFeatureAttributeDescriptor attr = (EditableFeatureAttributeDescriptor) fType.get(geometry_column);
109
            if (attr != null ) {
110
                if( attr.getType() != DataTypes.GEOMETRY ) {
111
                    attr.setDataType(DataTypes.GEOMETRY);
112
                }
113
                GeometryManager geommgr = GeometryLocator.getGeometryManager();
114
                GeometryType gt;
115
                try {
116
                    gt = geommgr.getGeometryType(
117
                            CSVStoreParameters.getGeometryType(parameters),
118
                            CSVStoreParameters.getGeometrySubType(parameters)
119
                    );
120
                    attr.setGeometryType(gt);
121
                } catch (Exception e) {
122
                    LOGGER.warn("Can't set geometry type for the calculated field in CSV file '" + fullFileName + "'.", e);
123
                }
124
                fType.setDefaultGeometryAttributeName(geometry_column);
125
            }
126
        }
127
    }
128

    
129
    private void makeGeometry(EditableFeatureType fType, String providerName, String fullFileName) throws LocatorException {
130
        String[] pointDimensionNames = CSVStoreParameters.getPointDimensionNames(parameters);
131
        if ( pointDimensionNames != null ) {
132
            SimpleReaderPointAttributeEmulator emulator = new SimpleReaderPointAttributeEmulator(pointDimensionNames);
133
            String columnName = CSVStoreParameters.getPointColumnName(parameters);
134
            if( StringUtils.isBlank(columnName) ) {
135
                columnName = "geom";
136
            }
137
            EditableFeatureAttributeDescriptor attr = fType.add(columnName, DataTypes.GEOMETRY, emulator);
138
            GeometryManager geommgr = GeometryLocator.getGeometryManager();
139
            GeometryType gt;
140
            try {
141
                if ( emulator.getFieldNames() != null && emulator.getFieldNames().length <= 2 ) {
142
                    gt = geommgr.getGeometryType(Geometry.TYPES.GEOMETRY, Geometry.SUBTYPES.GEOM2D);
143
                } else {
144
                    gt = geommgr.getGeometryType(Geometry.TYPES.GEOMETRY, Geometry.SUBTYPES.GEOM3D);
145
                }
146
                attr.setGeometryType(gt);
147
            } catch (Exception e) {
148
                LOGGER.warn("Can't set geometry type for the calculated field in '"+providerName+"' file '" + fullFileName + "'.", e);
149
            }
150
        }
151
    }
152

    
153
}