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

History | View | Annotate | Download (10.3 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 46709 fdiaz
import java.util.Objects;
7 43925 jjdelcerro
import java.util.Set;
8 44270 omartinez
import org.apache.commons.lang3.StringUtils;
9
import org.gvsig.export.ExportAttributes;
10 43925 jjdelcerro
import org.gvsig.export.ExportException;
11
import org.gvsig.export.ExportLocator;
12
import org.gvsig.export.ExportParameters;
13 43936 jjdelcerro
import org.gvsig.export.ExportParametersGeometry;
14
import org.gvsig.export.spi.ExportServiceManager.FixGeometryStatus;
15 43925 jjdelcerro
import org.gvsig.fmap.dal.DALLocator;
16
import org.gvsig.fmap.dal.DataManager;
17
import org.gvsig.fmap.dal.DataServerExplorer;
18
import org.gvsig.fmap.dal.NewDataStoreParameters;
19
import org.gvsig.fmap.dal.OpenDataStoreParameters;
20
import org.gvsig.fmap.dal.feature.EditableFeature;
21
import org.gvsig.fmap.dal.feature.Feature;
22
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
23
import org.gvsig.fmap.dal.feature.FeatureSet;
24
import org.gvsig.fmap.dal.feature.FeatureStore;
25
import org.gvsig.fmap.dal.feature.FeatureType;
26
import org.gvsig.tools.ToolsLocator;
27
import org.gvsig.tools.dispose.DisposableIterator;
28
import org.gvsig.tools.dispose.DisposeUtils;
29
import org.gvsig.tools.task.SimpleTaskStatus;
30
import org.slf4j.Logger;
31
import org.slf4j.LoggerFactory;
32
33
/**
34
 *
35
 * @author jjdelcerro
36
 */
37 43939 jjdelcerro
public abstract class AbstractExportService
38
        implements ExportService {
39
40 43925 jjdelcerro
    protected static final Logger LOG = LoggerFactory.getLogger(AbstractExportService.class);
41
42
    private final ExportParameters parameters;
43
    private final Set<ExportFinishListener> finishListeners;
44 44386 omartinez
//    protected AttributeNamesTranslator attributeNamesTranslator;
45 43925 jjdelcerro
    private SimpleTaskStatus taskStatus;
46
    private final ExportServiceFactory factory;
47 43939 jjdelcerro
48 43925 jjdelcerro
    protected AbstractExportService(ExportServiceFactory factory, ExportParameters parameters) {
49
        this.factory = factory;
50
        this.parameters = parameters;
51
        this.finishListeners = new HashSet<>();
52
    }
53 43939 jjdelcerro
54 43925 jjdelcerro
    @Override
55
    public ExportParameters getParameters() {
56
        return this.parameters;
57
    }
58
59
    @Override
60
    public ExportServiceFactory getFactory() {
61
        return factory;
62
    }
63
64
    @Override
65
    public void addFinishListener(ExportFinishListener listener) {
66
        this.finishListeners.add(listener);
67 43939 jjdelcerro
    }
68
69 43925 jjdelcerro
    protected void fireFinishedListener() {
70
        for (ExportFinishListener listener : finishListeners) {
71
            try {
72
                listener.finished(this);
73 43939 jjdelcerro
            } catch (Exception ex) {
74
75 43925 jjdelcerro
            }
76
        }
77
    }
78
79
    protected void fireCancelledListeners() {
80
        for (ExportFinishListener listener : finishListeners) {
81
            try {
82
                listener.cancelled(this);
83 43939 jjdelcerro
            } catch (Exception ex) {
84
85 43925 jjdelcerro
            }
86
        }
87
    }
88
89
    @Override
90
    public SimpleTaskStatus getTaskStatus() {
91 43939 jjdelcerro
        if (this.taskStatus == null) {
92 43925 jjdelcerro
            this.taskStatus = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("Export");
93
        }
94
        return this.taskStatus;
95
    }
96 43939 jjdelcerro
97 43925 jjdelcerro
    @Override
98 44573 jjdelcerro
    public void setTaskStatus(SimpleTaskStatus taskStatus) {
99
        this.taskStatus = taskStatus;
100
    }
101
102
    @Override
103 43925 jjdelcerro
    public boolean isCancellationRequested() {
104
        return this.getTaskStatus().isCancellationRequested();
105
    }
106
107
    @Override
108
    public void cancelRequest() {
109
        this.getTaskStatus().cancelRequest();
110
    }
111
112 44386 omartinez
//    @Override
113
//    public AttributeNamesTranslator getAttributeNamesTranslator() {
114
//        if (attributeNamesTranslator == null) {
115
//            this.attributeNamesTranslator = ExportLocator.getServiceManager().createAttributeNamesTranslator();
116
//        }
117
//        return this.attributeNamesTranslator;
118
//    }
119 43925 jjdelcerro
    @Override
120
    public List<OpenDataStoreParameters> getTargetOpenStoreParameters() throws ExportException {
121
        List<OpenDataStoreParameters> r = new ArrayList<>();
122
        r.add(this.createTargetOpenStoreParameters());
123
        return r;
124
    }
125 43939 jjdelcerro
126 43925 jjdelcerro
    abstract protected DataServerExplorer createServerExplorer() throws ExportException;
127
128
    abstract protected NewDataStoreParameters createTargetNewStoreParameters() throws ExportException;
129
130 43939 jjdelcerro
    abstract protected OpenDataStoreParameters createTargetOpenStoreParameters() throws ExportException;
131 43925 jjdelcerro
132 43936 jjdelcerro
    protected static class InvalidGeometryException extends ExportException {
133
134
        public InvalidGeometryException(Feature feature, String checkMessage) {
135
            super(checkMessage, feature);
136
        }
137
    }
138
139 43925 jjdelcerro
    @Override
140
    public void export(FeatureSet featureSet) throws ExportException {
141
        DataServerExplorer explorer = createServerExplorer();
142
        NewDataStoreParameters newStoreParameters = createTargetNewStoreParameters();
143
        OpenDataStoreParameters openStoreParameters = createTargetOpenStoreParameters();
144 43939 jjdelcerro
145 43925 jjdelcerro
        String providerName = newStoreParameters.getDataStoreName();
146
        String explorerName = explorer.getProviderName();
147
148
        DisposableIterator it = null;
149
        FeatureStore target = null;
150 43936 jjdelcerro
        EditableFeature targetFeature = null;
151 43925 jjdelcerro
        try {
152 46709 fdiaz
            try {
153
                 LOG.info("Start export "+Objects.toString(openStoreParameters));
154
            } catch (Throwable t){
155
                 LOG.info("Start export");
156
            }
157 43925 jjdelcerro
            this.getTaskStatus().setRangeOfValues(0, featureSet.getSize());
158
159
            DataManager dataManager = DALLocator.getDataManager();
160
161
            dataManager.newStore(explorerName, providerName, newStoreParameters, true);
162
            target = (FeatureStore) dataManager.openStore(providerName, openStoreParameters);
163
164 44395 omartinez
            FeatureType theTargetFeatureType;
165
            if (this.getParameters().getExportAttributes().isActive()) {
166
                theTargetFeatureType = this.getParameters().getExportAttributes().getTargetFeatureType();
167
            } else {
168
                theTargetFeatureType = target.getDefaultFeatureType();
169
            }
170 43936 jjdelcerro
            FeatureType theSourceFeatureType = featureSet.getDefaultFeatureType();
171 43925 jjdelcerro
172 43936 jjdelcerro
            ExportGeometryHelper geomHelper = null;
173 43939 jjdelcerro
            if (this.getParameters() instanceof ExportParametersGeometry) {
174 43936 jjdelcerro
                geomHelper = ExportLocator.getServiceManager().createGeometryHelper(
175
                        (ExportParametersGeometry) this.getParameters(),
176 43939 jjdelcerro
                        theTargetFeatureType,
177 43936 jjdelcerro
                        theSourceFeatureType
178
                );
179 43939 jjdelcerro
                if (!geomHelper.canProcessGeometry()) {
180 43936 jjdelcerro
                    geomHelper = null;
181
                }
182
            }
183
            // ============================================
184 43939 jjdelcerro
185 43925 jjdelcerro
            target.edit(FeatureStore.MODE_APPEND);
186
            it = featureSet.fastIterator();
187
188 46709 fdiaz
            LOG.info("Created target");
189 44395 omartinez
            long featureCount = 1;
190 43925 jjdelcerro
            while (it.hasNext()) {
191 43936 jjdelcerro
                this.getTaskStatus().setCurValue(featureCount);
192 43925 jjdelcerro
193 43936 jjdelcerro
                Feature sourceFeature = (Feature) it.next();
194 44270 omartinez
                targetFeature = target.createNewFeature(true); //theTargetFeatureType, true);
195 43936 jjdelcerro
                copyValues(sourceFeature, targetFeature);
196 43939 jjdelcerro
197
                if (geomHelper != null) {
198
                    switch (geomHelper.copyGeometry(sourceFeature, targetFeature)) {
199 43936 jjdelcerro
                        case FixGeometryStatus.STATE_OK:
200
                            break;
201
                        case FixGeometryStatus.STATE_SKIP:
202
                            continue;
203
                        case FixGeometryStatus.STATE_ABORT:
204
                            throw new InvalidGeometryException(targetFeature, geomHelper.getLastErrorMessage());
205
                    }
206 43925 jjdelcerro
                }
207 43939 jjdelcerro
208 43936 jjdelcerro
                target.insert(targetFeature);
209 43925 jjdelcerro
210
                featureCount++;
211
212
                if (this.getTaskStatus().isCancellationRequested()) {
213 47028 fdiaz
                    LOG.info("Export cancelled by user.");
214
                    this.getTaskStatus().abort();
215
                    FeatureStore.cancelEditingQuietly(target);
216
                    fireCancelledListeners();
217 43925 jjdelcerro
                    return;
218
                }
219
            }
220
            target.finishEditing();
221
            this.getTaskStatus().terminate();
222
            this.getTaskStatus().remove();
223
            fireFinishedListener();
224 46709 fdiaz
            LOG.info("End export");
225 47028 fdiaz
        } catch (Throwable e) {
226 46709 fdiaz
            LOG.warn("Can't export", e);
227 46608 fdiaz
            FeatureStore.cancelEditingQuietly(target);
228 43925 jjdelcerro
            fireCancelledListeners();
229 43936 jjdelcerro
            throw new ExportException(e, targetFeature);
230 43925 jjdelcerro
        } finally {
231
            DisposeUtils.dispose(it);
232
            DisposeUtils.dispose(featureSet);
233
            DisposeUtils.dispose(target);
234 43939 jjdelcerro
        }
235 43925 jjdelcerro
    }
236 43939 jjdelcerro
237 43925 jjdelcerro
    protected void copyValues(Feature source, EditableFeature target) {
238 43939 jjdelcerro
        FeatureType sourceType = source.getType();
239 43925 jjdelcerro
        FeatureType targetType = target.getType();
240 44395 omartinez
        ExportAttributes exp = this.getParameters().getExportAttributes();
241
        boolean isActive = exp.isActive();
242 43939 jjdelcerro
        for (FeatureAttributeDescriptor targetAttr : targetType) {
243 47059 jjdelcerro
            if( !target.canSetValue(targetAttr, null) ) {
244
//            if (targetAttr.isReadOnly() || targetAttr.isComputed()) {
245 44354 omartinez
                continue;
246
            }
247 43925 jjdelcerro
            String targetAttrName = targetAttr.getName();
248 44270 omartinez
            //translate field
249 44395 omartinez
            FeatureAttributeDescriptor sourceAttr;
250 44801 omartinez
            String sourceAttrName;
251 44395 omartinez
            if (isActive) {
252
                sourceAttrName = exp.getSourceName(targetAttrName);
253
                for (ExportAttributes.ExportAttribute exportAttribute : exp) {
254
                    if (StringUtils.equals(exportAttribute.getNewName(), targetAttrName)) {
255
                        sourceAttrName = exportAttribute.getName();
256 46000 omartinez
                        break;
257 44395 omartinez
                    }
258 44270 omartinez
                }
259 44395 omartinez
260 46568 fdiaz
                sourceAttr = sourceType.getAttributeDescriptorFromAll(sourceAttrName);
261 44395 omartinez
            } else {
262
                sourceAttrName = targetAttrName;
263 46568 fdiaz
                sourceAttr = sourceType.getAttributeDescriptorFromAll(targetAttrName);
264 44801 omartinez
            }
265 43939 jjdelcerro
            if (sourceAttr != null) {
266 44801 omartinez
                Object value = source.get(sourceAttrName);
267 43939 jjdelcerro
                if (value == null) {
268
                    if (targetAttr.allowNull()) {
269 43925 jjdelcerro
                        target.set(targetAttrName, null);
270
                    }
271
                } else {
272
                    target.set(targetAttrName, value);
273
                }
274 45453 omartinez
            } else if (sourceAttr==null && source.hasValue(sourceAttrName)) {
275
                    Object value = source.get(sourceAttrName);
276 44801 omartinez
                    target.set(targetAttrName, value);
277
                }
278 43925 jjdelcerro
            }
279
        }
280
    }
281