Revision 47643 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/gml/GMLFeatureTypeLoader.java

View differences:

GMLFeatureTypeLoader.java
5 5
 */
6 6
package org.gvsig.fmap.dal.store.gml;
7 7

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

  
28 14
/**
29 15
 *
......
31 17
 */
32 18
public class GMLFeatureTypeLoader extends SimpleReaderFeatureTypeLoader{
33 19
    
34
    private static final Logger LOGGER = LoggerFactory.getLogger(GMLFeatureTypeLoader.class);
35

  
36 20
    public GMLFeatureTypeLoader(GMLStoreParameters parameters) {
37 21
        super(parameters);
38 22
    }
39 23

  
40 24
    protected String getProviderName() {
41
        return CSVStoreProvider.NAME;
25
        return GMLStoreProvider.NAME;
42 26
    }
43 27
    
44 28
    protected SimpleReader getSimpleReader(Reader in) throws IOException {
45
        SimpleReader reader;
46
        if (CSVStoreParameters.getRawFieldsDefinition(parameters) != null) {
47
            reader = new FixedLenReader(in, (CSVStoreParameters) parameters);
48
        } else {
49
            reader = new CSVReaderSuperCSV(in, (CSVStoreParameters) parameters);
50
        }
29
        SimpleReader reader = new GMLReader(in, parameters);
51 30
        return reader;
52 31
    }
53

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

  
91
    
92
    public void fillFeatureType(CSVStoreParameters parameters, EditableFeatureType fType, String headers[], AutomaticDetectionOfTypes.DetectedValue automaticTypes[]) {
93
        String fullFileName = parameters.getFile()==null? "":parameters.getFile().getAbsolutePath();
94
        String providerName = this.getProviderName();
95
        
96
        fType.setHasOID(true);
97

  
98

  
99
        FieldTypeParser[] fieldTypes = getFieldTypes(headers, automaticTypes);
100

  
101
        fillFeatureType(fType, fieldTypes);
102
        
103
        makeGeometry(fType, providerName, fullFileName);        
104
        
105
        declareGeometryType(fType, fullFileName);
106

  
107
    }
108

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

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

  
157 32
}

Also available in: Unified diff