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

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