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
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.Objects;
7
import java.util.Set;
8
import org.apache.commons.lang3.StringUtils;
9
import org.gvsig.export.ExportAttributes;
10
import org.gvsig.export.ExportException;
11
import org.gvsig.export.ExportLocator;
12
import org.gvsig.export.ExportParameters;
13
import org.gvsig.export.ExportParametersGeometry;
14
import org.gvsig.export.spi.ExportServiceManager.FixGeometryStatus;
15
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
public abstract class AbstractExportService
38
        implements ExportService {
39

    
40
    protected static final Logger LOG = LoggerFactory.getLogger(AbstractExportService.class);
41

    
42
    private final ExportParameters parameters;
43
    private final Set<ExportFinishListener> finishListeners;
44
//    protected AttributeNamesTranslator attributeNamesTranslator;
45
    private SimpleTaskStatus taskStatus;
46
    private final ExportServiceFactory factory;
47

    
48
    protected AbstractExportService(ExportServiceFactory factory, ExportParameters parameters) {
49
        this.factory = factory;
50
        this.parameters = parameters;
51
        this.finishListeners = new HashSet<>();
52
    }
53

    
54
    @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
    }
68

    
69
    protected void fireFinishedListener() {
70
        for (ExportFinishListener listener : finishListeners) {
71
            try {
72
                listener.finished(this);
73
            } catch (Exception ex) {
74

    
75
            }
76
        }
77
    }
78

    
79
    protected void fireCancelledListeners() {
80
        for (ExportFinishListener listener : finishListeners) {
81
            try {
82
                listener.cancelled(this);
83
            } catch (Exception ex) {
84

    
85
            }
86
        }
87
    }
88

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

    
97
    @Override
98
    public void setTaskStatus(SimpleTaskStatus taskStatus) {
99
        this.taskStatus = taskStatus;
100
    }
101

    
102
    @Override
103
    public boolean isCancellationRequested() {
104
        return this.getTaskStatus().isCancellationRequested();
105
    }
106

    
107
    @Override
108
    public void cancelRequest() {
109
        this.getTaskStatus().cancelRequest();
110
    }
111

    
112
//    @Override
113
//    public AttributeNamesTranslator getAttributeNamesTranslator() {
114
//        if (attributeNamesTranslator == null) {
115
//            this.attributeNamesTranslator = ExportLocator.getServiceManager().createAttributeNamesTranslator();
116
//        }
117
//        return this.attributeNamesTranslator;
118
//    }
119
    @Override
120
    public List<OpenDataStoreParameters> getTargetOpenStoreParameters() throws ExportException {
121
        List<OpenDataStoreParameters> r = new ArrayList<>();
122
        r.add(this.createTargetOpenStoreParameters());
123
        return r;
124
    }
125

    
126
    abstract protected DataServerExplorer createServerExplorer() throws ExportException;
127

    
128
    abstract protected NewDataStoreParameters createTargetNewStoreParameters() throws ExportException;
129

    
130
    abstract protected OpenDataStoreParameters createTargetOpenStoreParameters() throws ExportException;
131

    
132
    protected static class InvalidGeometryException extends ExportException {
133

    
134
        public InvalidGeometryException(Feature feature, String checkMessage) {
135
            super(checkMessage, feature);
136
        }
137
    }
138

    
139
    @Override
140
    public void export(FeatureSet featureSet) throws ExportException {
141
        DataServerExplorer explorer = createServerExplorer();
142
        NewDataStoreParameters newStoreParameters = createTargetNewStoreParameters();
143
        OpenDataStoreParameters openStoreParameters = createTargetOpenStoreParameters();
144

    
145
        String providerName = newStoreParameters.getDataStoreName();
146
        String explorerName = explorer.getProviderName();
147

    
148
        DisposableIterator it = null;
149
        FeatureStore target = null;
150
        EditableFeature targetFeature = null;
151
        try {
152
            try {
153
                 LOG.info("Start export "+Objects.toString(openStoreParameters));
154
            } catch (Throwable t){
155
                 LOG.info("Start export");              
156
            }
157
            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
            FeatureType theTargetFeatureType;
165
            if (this.getParameters().getExportAttributes().isActive()) {
166
                theTargetFeatureType = this.getParameters().getExportAttributes().getTargetFeatureType();
167
            } else {
168
                theTargetFeatureType = target.getDefaultFeatureType();
169
            }
170
            FeatureType theSourceFeatureType = featureSet.getDefaultFeatureType();
171

    
172
            ExportGeometryHelper geomHelper = null;
173
            if (this.getParameters() instanceof ExportParametersGeometry) {
174
                geomHelper = ExportLocator.getServiceManager().createGeometryHelper(
175
                        (ExportParametersGeometry) this.getParameters(),
176
                        theTargetFeatureType,
177
                        theSourceFeatureType
178
                );
179
                if (!geomHelper.canProcessGeometry()) {
180
                    geomHelper = null;
181
                }
182
            }
183
            // ============================================
184

    
185
            target.edit(FeatureStore.MODE_APPEND);
186
            it = featureSet.fastIterator();
187

    
188
            LOG.info("Created target");
189
            long featureCount = 1;
190
            while (it.hasNext()) {
191
                this.getTaskStatus().setCurValue(featureCount);
192

    
193
                Feature sourceFeature = (Feature) it.next();
194
                targetFeature = target.createNewFeature(true); //theTargetFeatureType, true);
195
                copyValues(sourceFeature, targetFeature);
196

    
197
                if (geomHelper != null) {
198
                    switch (geomHelper.copyGeometry(sourceFeature, targetFeature)) {
199
                        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
                }
207

    
208
                target.insert(targetFeature);
209

    
210
                featureCount++;
211

    
212
                if (this.getTaskStatus().isCancellationRequested()) {
213
                    LOG.info("Export cancelled by user.");
214
                    this.getTaskStatus().abort();
215
                    FeatureStore.cancelEditingQuietly(target);
216
                    fireCancelledListeners();
217
                    return;
218
                }
219
            }
220
            target.finishEditing();
221
            this.getTaskStatus().terminate();
222
            this.getTaskStatus().remove();
223
            fireFinishedListener();
224
            LOG.info("End export");
225
        } catch (Throwable e) {
226
            LOG.warn("Can't export", e);
227
            FeatureStore.cancelEditingQuietly(target);
228
            fireCancelledListeners();
229
            throw new ExportException(e, targetFeature);
230
        } finally {
231
            DisposeUtils.dispose(it);
232
            DisposeUtils.dispose(featureSet);
233
            DisposeUtils.dispose(target);
234
        }
235
    }
236

    
237
    protected void copyValues(Feature source, EditableFeature target) {
238
        FeatureType sourceType = source.getType();
239
        FeatureType targetType = target.getType();
240
        ExportAttributes exp = this.getParameters().getExportAttributes();
241
        boolean isActive = exp.isActive();
242
        for (FeatureAttributeDescriptor targetAttr : targetType) {
243
            if( !target.canSetValue(targetAttr, null) ) {
244
//            if (targetAttr.isReadOnly() || targetAttr.isComputed()) {
245
                continue;
246
            }
247
            String targetAttrName = targetAttr.getName();
248
            //translate field
249
            FeatureAttributeDescriptor sourceAttr;
250
            String sourceAttrName;            
251
            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
                        break;
257
                    }
258
                }
259

    
260
                sourceAttr = sourceType.getAttributeDescriptorFromAll(sourceAttrName);
261
            } else {
262
                sourceAttrName = targetAttrName;
263
                sourceAttr = sourceType.getAttributeDescriptorFromAll(targetAttrName);
264
            }            
265
            if (sourceAttr != null) {
266
                Object value = source.get(sourceAttrName);                
267
                if (value == null) {
268
                    if (targetAttr.allowNull()) {
269
                        target.set(targetAttrName, null);
270
                    }
271
                } else {
272
                    target.set(targetAttrName, value);
273
                }
274
            } else if (sourceAttr==null && source.hasValue(sourceAttrName)) {
275
                    Object value = source.get(sourceAttrName);
276
                    target.set(targetAttrName, value);
277
                }
278
            }
279
        }
280
    }
281

    
282