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

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

    
95

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

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

    
104
    }
105

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

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

    
154
}