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 43925 jjdelcerro
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 43936 jjdelcerro
import org.gvsig.export.ExportParametersGeometry;
11
import org.gvsig.export.spi.ExportServiceManager.FixGeometryStatus;
12 43925 jjdelcerro
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 43939 jjdelcerro
public abstract class AbstractExportService
35
        implements ExportService {
36
37 43925 jjdelcerro
    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 43939 jjdelcerro
45 43925 jjdelcerro
    protected AbstractExportService(ExportServiceFactory factory, ExportParameters parameters) {
46
        this.factory = factory;
47
        this.parameters = parameters;
48
        this.finishListeners = new HashSet<>();
49
    }
50 43939 jjdelcerro
51 43925 jjdelcerro
    @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 43939 jjdelcerro
    }
65
66 43925 jjdelcerro
    protected void fireFinishedListener() {
67
        for (ExportFinishListener listener : finishListeners) {
68
            try {
69
                listener.finished(this);
70 43939 jjdelcerro
            } catch (Exception ex) {
71
72 43925 jjdelcerro
            }
73
        }
74
    }
75
76
    protected void fireCancelledListeners() {
77
        for (ExportFinishListener listener : finishListeners) {
78
            try {
79
                listener.cancelled(this);
80 43939 jjdelcerro
            } catch (Exception ex) {
81
82 43925 jjdelcerro
            }
83
        }
84
    }
85
86
    @Override
87
    public SimpleTaskStatus getTaskStatus() {
88 43939 jjdelcerro
        if (this.taskStatus == null) {
89 43925 jjdelcerro
            this.taskStatus = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("Export");
90
        }
91
        return this.taskStatus;
92
    }
93 43939 jjdelcerro
94 43925 jjdelcerro
    @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 43939 jjdelcerro
        if (attributeNamesTranslator == null) {
107 43925 jjdelcerro
            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 43939 jjdelcerro
119 43925 jjdelcerro
    abstract protected DataServerExplorer createServerExplorer() throws ExportException;
120
121
    abstract protected NewDataStoreParameters createTargetNewStoreParameters() throws ExportException;
122
123 43939 jjdelcerro
    abstract protected OpenDataStoreParameters createTargetOpenStoreParameters() throws ExportException;
124 43925 jjdelcerro
125 43936 jjdelcerro
    protected static class InvalidGeometryException extends ExportException {
126
127
        public InvalidGeometryException(Feature feature, String checkMessage) {
128
            super(checkMessage, feature);
129
        }
130
    }
131
132 43925 jjdelcerro
    @Override
133
    public void export(FeatureSet featureSet) throws ExportException {
134
        DataServerExplorer explorer = createServerExplorer();
135
        NewDataStoreParameters newStoreParameters = createTargetNewStoreParameters();
136
        OpenDataStoreParameters openStoreParameters = createTargetOpenStoreParameters();
137 43939 jjdelcerro
138 43925 jjdelcerro
        String providerName = newStoreParameters.getDataStoreName();
139
        String explorerName = explorer.getProviderName();
140
141
        DisposableIterator it = null;
142
        FeatureStore target = null;
143 43936 jjdelcerro
        EditableFeature targetFeature = null;
144 43925 jjdelcerro
        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 43936 jjdelcerro
            FeatureType theTargetFeatureType = target.getDefaultFeatureType();
153
            FeatureType theSourceFeatureType = featureSet.getDefaultFeatureType();
154 43925 jjdelcerro
155 43936 jjdelcerro
            ExportGeometryHelper geomHelper = null;
156 43939 jjdelcerro
            if (this.getParameters() instanceof ExportParametersGeometry) {
157 43936 jjdelcerro
                geomHelper = ExportLocator.getServiceManager().createGeometryHelper(
158
                        (ExportParametersGeometry) this.getParameters(),
159 43939 jjdelcerro
                        theTargetFeatureType,
160 43936 jjdelcerro
                        theSourceFeatureType
161
                );
162 43939 jjdelcerro
                if (!geomHelper.canProcessGeometry()) {
163 43936 jjdelcerro
                    geomHelper = null;
164
                }
165
            }
166
            // ============================================
167 43939 jjdelcerro
168 43925 jjdelcerro
            target.edit(FeatureStore.MODE_APPEND);
169
            it = featureSet.fastIterator();
170
171
            long featureCount = 0;
172
            while (it.hasNext()) {
173 43936 jjdelcerro
                this.getTaskStatus().setCurValue(featureCount);
174 43925 jjdelcerro
175 43936 jjdelcerro
                Feature sourceFeature = (Feature) it.next();
176
                targetFeature = target.createNewFeature(theTargetFeatureType, true);
177
                copyValues(sourceFeature, targetFeature);
178 43939 jjdelcerro
179
                if (geomHelper != null) {
180
                    switch (geomHelper.copyGeometry(sourceFeature, targetFeature)) {
181 43936 jjdelcerro
                        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 43925 jjdelcerro
                }
189 43939 jjdelcerro
190 43936 jjdelcerro
                target.insert(targetFeature);
191 43925 jjdelcerro
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 43936 jjdelcerro
            throw new ExportException(e, targetFeature);
205 43925 jjdelcerro
        } finally {
206
            DisposeUtils.dispose(it);
207
            DisposeUtils.dispose(featureSet);
208
            DisposeUtils.dispose(target);
209 43939 jjdelcerro
        }
210 43925 jjdelcerro
    }
211 43939 jjdelcerro
212 43925 jjdelcerro
    protected void copyValues(Feature source, EditableFeature target) {
213 43939 jjdelcerro
        FeatureType sourceType = source.getType();
214 43925 jjdelcerro
        FeatureType targetType = target.getType();
215 43939 jjdelcerro
        for (FeatureAttributeDescriptor targetAttr : targetType) {
216 43925 jjdelcerro
            String targetAttrName = targetAttr.getName();
217
            String sourceAttrName = getAttributeNamesTranslator().getSourceName(targetAttrName);
218
            FeatureAttributeDescriptor sourceAttr = sourceType.getAttributeDescriptor(sourceAttrName);
219 43939 jjdelcerro
            if (sourceAttr != null) {
220 43925 jjdelcerro
                Object value = source.get(sourceAttrName);
221 43939 jjdelcerro
                if (value == null) {
222
                    if (targetAttr.allowNull()) {
223 43925 jjdelcerro
                        target.set(targetAttrName, null);
224
                    }
225
                } else {
226
                    target.set(targetAttrName, value);
227
                }
228
            }
229
        }
230
    }
231
232
}