Statistics
| Revision:

gvsig-geoprocess / org.gvsig.geoprocess / branches / refactor-2018 / org.gvsig.geoprocess / org.gvsig.geoprocess.lib / org.gvsig.geoprocess.lib.sextante / src / main / java / org / gvsig / geoprocess / lib / sextante / dataObjects / TableDocumentITable.java @ 1055

History | View | Annotate | Download (8.44 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2012 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 2
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.geoprocess.lib.sextante.dataObjects;
25

    
26
import java.io.File;
27
import java.util.Iterator;
28

    
29
import es.unex.sextante.core.Sextante;
30
import es.unex.sextante.dataObjects.AbstractTable;
31
import es.unex.sextante.dataObjects.IRecordsetIterator;
32
import es.unex.sextante.outputs.FileOutputChannel;
33
import es.unex.sextante.outputs.IOutputChannel;
34

    
35
import org.gvsig.app.project.ProjectManager;
36
import org.gvsig.app.project.documents.table.TableDocument;
37
import org.gvsig.app.project.documents.table.TableManager;
38
import org.gvsig.fmap.dal.DALLocator;
39
import org.gvsig.fmap.dal.DataManager;
40
import org.gvsig.fmap.dal.exception.DataException;
41
import org.gvsig.fmap.dal.feature.EditableFeature;
42
import org.gvsig.fmap.dal.feature.EditableFeatureType;
43
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
44
import org.gvsig.fmap.dal.feature.FeatureStore;
45
import org.gvsig.fmap.dal.feature.FeatureType;
46
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
47
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
48
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
49
import org.gvsig.tools.ToolsLocator;
50
import org.gvsig.tools.dataTypes.DataTypesManager;
51

    
52
public class TableDocumentITable extends AbstractTable {
53

    
54
    private final int PRECISION = 5;
55
    private TableDocument m_Table;
56
    private String m_sName;
57
    private String m_sFilename;
58
    private FeatureType featureType;
59
    private FeatureStore featureStore;
60

    
61
    @Override
62
    public String getName() {
63

    
64
        if (m_Table != null) {
65
            return m_Table.getName();
66
        } else {
67
            return m_sName;
68
        }
69

    
70
    }
71

    
72
    public void create(final TableDocument table) {
73

    
74
        try {
75
            m_Table = table;
76
            featureStore = table.getStore();
77
            featureType = featureStore.getDefaultFeatureType();
78
        } catch (final DataException e) {
79
            Sextante.addErrorToLog(e);
80
        }
81

    
82
    }
83
    
84
    public FeatureStore getFeatureStore() {
85
        return this.featureStore;
86
    }
87

    
88
    public void create(final String sName, final String sFilename,
89
        final Class<?>[] types, final String[] sFields) {
90

    
91
        try {
92
            m_sName = sName;
93

    
94
            final DataManager datamanager = DALLocator.getDataManager();
95
            final FilesystemServerExplorerParameters explorerParams =
96
                (FilesystemServerExplorerParameters) datamanager
97
                    .createServerExplorerParameters(FilesystemServerExplorer.NAME);
98
            explorerParams.setRoot(new File(sFilename).getParent());
99
            final FilesystemServerExplorer explorer =
100
                (FilesystemServerExplorer) datamanager.openServerExplorer(
101
                    FilesystemServerExplorer.NAME, explorerParams);
102
            final NewFeatureStoreParameters newParams =
103
                (NewFeatureStoreParameters) explorer.getAddParameters(new File(
104
                    sFilename));
105

    
106
            EditableFeatureType editableFeatureType =
107
                newParams.getDefaultFeatureType();
108
            featureType = editableFeatureType;
109
            loadFeatureType(sFields, types, editableFeatureType);
110

    
111
            newParams.setDefaultFeatureType(featureType);
112

    
113
            explorer.add(newParams.getDataStoreName(), newParams, true);
114
            final DataManager manager = DALLocator.getDataManager();
115
            featureStore =
116
                (FeatureStore) manager.openStore(newParams.getDataStoreName(),
117
                    newParams);
118
            featureStore.edit(FeatureStore.MODE_APPEND);
119
            featureType = featureStore.getDefaultFeatureType();
120
            m_sFilename = sFilename;
121

    
122
        } catch (final Exception e) {
123
            Sextante.addErrorToLog(e);
124
        }
125

    
126
    }
127

    
128
    private void loadFeatureType(final String[] fields, final Class<?>[] types,
129
        final EditableFeatureType featureType) {
130
        final int[] iTypes = getTypes(types);
131

    
132
        for (int i = 0; i < fields.length; i++) {
133
            featureType.add(fields[i], iTypes[i]).setPrecision(PRECISION);
134
        }
135
    }
136

    
137
    private int[] getTypes(Class<?>[] classes) {
138
        DataTypesManager typesManager = ToolsLocator.getDataTypesManager();
139
        int[] types = new int[classes.length];
140
        for (int i = 0; i < classes.length; i++) {
141
            types[i] = typesManager.getDataType(classes[i]).getType();
142
        }
143
        return types;
144
    }
145

    
146
    @Override
147
    public void addRecord(final Object[] record) {
148
        try {
149
            final EditableFeature ef = featureStore.createNewFeature();
150
            @SuppressWarnings("unchecked")
151
            final Iterator<FeatureAttributeDescriptor> features =
152
                featureType.iterator();
153

    
154
            int i = 0;
155
            while (features.hasNext()) {
156
                final FeatureAttributeDescriptor featureAttributeDescriptor =
157
                    features.next();
158
                ef.set(featureAttributeDescriptor.getName(), record[i]);
159
                i++;
160
            }
161
            featureStore.insert(ef);
162
        } catch (final Exception e) {
163
            e.printStackTrace();
164
        }
165

    
166
    }
167

    
168
    @Override
169
    public IRecordsetIterator iterator() {
170
        try {
171
            return new FeatureSetIRecordsetIterator(featureStore.getFeatureSet(m_Table
172
                .getQuery()));
173
        } catch (final DataException e) {
174
            throw new RuntimeException(e);
175
        }
176
    }
177

    
178
    @Override
179
    public String getFieldName(final int i) {
180
        return ((FeatureAttributeDescriptor) featureType.get(i)).getName();
181
    }
182

    
183
    @Override
184
    public Class<?> getFieldType(final int i) {
185
        return featureType.getAttributeDescriptor(i).getDataType()
186
            .getDefaultClass();
187
    }
188

    
189
    @Override
190
    public int getFieldCount() {
191
        return featureType.size();
192
    }
193

    
194
    @Override
195
    public long getRecordCount() {
196
        try {
197
            return featureStore.getFeatureSet(m_Table.getQuery()).getSize();
198
        } catch (final DataException e) {
199
            e.printStackTrace();
200
        }
201
        return 0;
202
    }
203

    
204
    @Override
205
    public void postProcess() {
206
        if(featureStore.isAppending() || featureStore.isEditing()) {
207
            try {
208
                featureStore.finishEditing();
209
            } catch (DataException e) {
210
                return;
211
            }
212
        }
213
        try {
214
            final TableDocument table =
215
                (TableDocument) ProjectManager.getInstance().createDocument(
216
                    TableManager.TYPENAME, m_sName);
217
            table.setStore(featureStore);
218
        } catch (final Exception e) {
219
            return;
220
        }
221

    
222
        final TableDocument table = FileTools.openTable(m_sFilename, m_sName);
223
        create(table);
224
    }
225

    
226
    @Override
227
    public void open() {
228

    
229
    }
230

    
231
    @Override
232
    public void close() {
233
        // Nothing to do
234
    }
235

    
236
    public String getFilename() {
237

    
238
        return m_sFilename;
239

    
240
    }
241

    
242
    @Override
243
    public void setName(final String name) {
244

    
245
        if (m_Table != null) {
246
            m_Table.setName(name);
247
        } else {
248
            m_sName = name;
249
        }
250

    
251
    }
252

    
253
    @Override
254
    public Object getBaseDataObject() {
255

    
256
        return m_Table;
257

    
258
    }
259

    
260
    @Override
261
    public void free() {
262

    
263
        m_Table = null;
264

    
265
    }
266

    
267
    @Override
268
    public IOutputChannel getOutputChannel() {
269

    
270
        return new FileOutputChannel(m_sFilename);
271

    
272
    }
273
}