Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.exportto / org.gvsig.exportto.lib / org.gvsig.exportto.lib.api / src / main / java / org / gvsig / export / spi / AbstractExportService.java @ 43939

History | View | Annotate | Download (8.17 KB)

1
package org.gvsig.export.spi;
2

    
3
import java.util.ArrayList;
4
import java.util.HashSet;
5
import java.util.List;
6
import java.util.Set;
7
import org.gvsig.export.ExportException;
8
import org.gvsig.export.ExportLocator;
9
import org.gvsig.export.ExportParameters;
10
import org.gvsig.export.ExportParametersGeometry;
11
import org.gvsig.export.spi.ExportServiceManager.FixGeometryStatus;
12
import org.gvsig.fmap.dal.DALLocator;
13
import org.gvsig.fmap.dal.DataManager;
14
import org.gvsig.fmap.dal.DataServerExplorer;
15
import org.gvsig.fmap.dal.NewDataStoreParameters;
16
import org.gvsig.fmap.dal.OpenDataStoreParameters;
17
import org.gvsig.fmap.dal.feature.EditableFeature;
18
import org.gvsig.fmap.dal.feature.Feature;
19
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
20
import org.gvsig.fmap.dal.feature.FeatureSet;
21
import org.gvsig.fmap.dal.feature.FeatureStore;
22
import org.gvsig.fmap.dal.feature.FeatureType;
23
import org.gvsig.tools.ToolsLocator;
24
import org.gvsig.tools.dispose.DisposableIterator;
25
import org.gvsig.tools.dispose.DisposeUtils;
26
import org.gvsig.tools.task.SimpleTaskStatus;
27
import org.slf4j.Logger;
28
import org.slf4j.LoggerFactory;
29

    
30
/**
31
 *
32
 * @author jjdelcerro
33
 */
34
public abstract class AbstractExportService
35
        implements ExportService {
36

    
37
    protected static final Logger LOG = LoggerFactory.getLogger(AbstractExportService.class);
38

    
39
    private final ExportParameters parameters;
40
    private final Set<ExportFinishListener> finishListeners;
41
    protected AttributeNamesTranslator attributeNamesTranslator;
42
    private SimpleTaskStatus taskStatus;
43
    private final ExportServiceFactory factory;
44

    
45
    protected AbstractExportService(ExportServiceFactory factory, ExportParameters parameters) {
46
        this.factory = factory;
47
        this.parameters = parameters;
48
        this.finishListeners = new HashSet<>();
49
    }
50

    
51
    @Override
52
    public ExportParameters getParameters() {
53
        return this.parameters;
54
    }
55

    
56
    @Override
57
    public ExportServiceFactory getFactory() {
58
        return factory;
59
    }
60

    
61
    @Override
62
    public void addFinishListener(ExportFinishListener listener) {
63
        this.finishListeners.add(listener);
64
    }
65

    
66
    protected void fireFinishedListener() {
67
        for (ExportFinishListener listener : finishListeners) {
68
            try {
69
                listener.finished(this);
70
            } catch (Exception ex) {
71

    
72
            }
73
        }
74
    }
75

    
76
    protected void fireCancelledListeners() {
77
        for (ExportFinishListener listener : finishListeners) {
78
            try {
79
                listener.cancelled(this);
80
            } catch (Exception ex) {
81

    
82
            }
83
        }
84
    }
85

    
86
    @Override
87
    public SimpleTaskStatus getTaskStatus() {
88
        if (this.taskStatus == null) {
89
            this.taskStatus = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("Export");
90
        }
91
        return this.taskStatus;
92
    }
93

    
94
    @Override
95
    public boolean isCancellationRequested() {
96
        return this.getTaskStatus().isCancellationRequested();
97
    }
98

    
99
    @Override
100
    public void cancelRequest() {
101
        this.getTaskStatus().cancelRequest();
102
    }
103

    
104
    @Override
105
    public AttributeNamesTranslator getAttributeNamesTranslator() {
106
        if (attributeNamesTranslator == null) {
107
            this.attributeNamesTranslator = ExportLocator.getServiceManager().createAttributeNamesTranslator();
108
        }
109
        return this.attributeNamesTranslator;
110
    }
111

    
112
    @Override
113
    public List<OpenDataStoreParameters> getTargetOpenStoreParameters() throws ExportException {
114
        List<OpenDataStoreParameters> r = new ArrayList<>();
115
        r.add(this.createTargetOpenStoreParameters());
116
        return r;
117
    }
118

    
119
    abstract protected DataServerExplorer createServerExplorer() throws ExportException;
120

    
121
    abstract protected NewDataStoreParameters createTargetNewStoreParameters() throws ExportException;
122

    
123
    abstract protected OpenDataStoreParameters createTargetOpenStoreParameters() throws ExportException;
124

    
125
    protected static class InvalidGeometryException extends ExportException {
126

    
127
        public InvalidGeometryException(Feature feature, String checkMessage) {
128
            super(checkMessage, feature);
129
        }
130
    }
131

    
132
    @Override
133
    public void export(FeatureSet featureSet) throws ExportException {
134
        DataServerExplorer explorer = createServerExplorer();
135
        NewDataStoreParameters newStoreParameters = createTargetNewStoreParameters();
136
        OpenDataStoreParameters openStoreParameters = createTargetOpenStoreParameters();
137

    
138
        String providerName = newStoreParameters.getDataStoreName();
139
        String explorerName = explorer.getProviderName();
140

    
141
        DisposableIterator it = null;
142
        FeatureStore target = null;
143
        EditableFeature targetFeature = null;
144
        try {
145
            this.getTaskStatus().setRangeOfValues(0, featureSet.getSize());
146

    
147
            DataManager dataManager = DALLocator.getDataManager();
148

    
149
            dataManager.newStore(explorerName, providerName, newStoreParameters, true);
150
            target = (FeatureStore) dataManager.openStore(providerName, openStoreParameters);
151

    
152
            FeatureType theTargetFeatureType = target.getDefaultFeatureType();
153
            FeatureType theSourceFeatureType = featureSet.getDefaultFeatureType();
154

    
155
            ExportGeometryHelper geomHelper = null;
156
            if (this.getParameters() instanceof ExportParametersGeometry) {
157
                geomHelper = ExportLocator.getServiceManager().createGeometryHelper(
158
                        (ExportParametersGeometry) this.getParameters(),
159
                        theTargetFeatureType,
160
                        theSourceFeatureType
161
                );
162
                if (!geomHelper.canProcessGeometry()) {
163
                    geomHelper = null;
164
                }
165
            }
166
            // ============================================
167

    
168
            target.edit(FeatureStore.MODE_APPEND);
169
            it = featureSet.fastIterator();
170

    
171
            long featureCount = 0;
172
            while (it.hasNext()) {
173
                this.getTaskStatus().setCurValue(featureCount);
174

    
175
                Feature sourceFeature = (Feature) it.next();
176
                targetFeature = target.createNewFeature(theTargetFeatureType, true);
177
                copyValues(sourceFeature, targetFeature);
178

    
179
                if (geomHelper != null) {
180
                    switch (geomHelper.copyGeometry(sourceFeature, targetFeature)) {
181
                        case FixGeometryStatus.STATE_OK:
182
                            break;
183
                        case FixGeometryStatus.STATE_SKIP:
184
                            continue;
185
                        case FixGeometryStatus.STATE_ABORT:
186
                            throw new InvalidGeometryException(targetFeature, geomHelper.getLastErrorMessage());
187
                    }
188
                }
189

    
190
                target.insert(targetFeature);
191

    
192
                featureCount++;
193

    
194
                if (this.getTaskStatus().isCancellationRequested()) {
195
                    return;
196
                }
197
            }
198
            target.finishEditing();
199
            this.getTaskStatus().terminate();
200
            this.getTaskStatus().remove();
201
            fireFinishedListener();
202
        } catch (Exception e) {
203
            fireCancelledListeners();
204
            throw new ExportException(e, targetFeature);
205
        } finally {
206
            DisposeUtils.dispose(it);
207
            DisposeUtils.dispose(featureSet);
208
            DisposeUtils.dispose(target);
209
        }
210
    }
211

    
212
    protected void copyValues(Feature source, EditableFeature target) {
213
        FeatureType sourceType = source.getType();
214
        FeatureType targetType = target.getType();
215
        for (FeatureAttributeDescriptor targetAttr : targetType) {
216
            String targetAttrName = targetAttr.getName();
217
            String sourceAttrName = getAttributeNamesTranslator().getSourceName(targetAttrName);
218
            FeatureAttributeDescriptor sourceAttr = sourceType.getAttributeDescriptor(sourceAttrName);
219
            if (sourceAttr != null) {
220
                Object value = source.get(sourceAttrName);
221
                if (value == null) {
222
                    if (targetAttr.allowNull()) {
223
                        target.set(targetAttrName, null);
224
                    }
225
                } else {
226
                    target.set(targetAttrName, value);
227
                }
228
            }
229
        }
230
    }
231

    
232
}