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

History | View | Annotate | Download (8.29 KB)

1

    
2
package org.gvsig.export.spi;
3

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

    
31
/**
32
 *
33
 * @author jjdelcerro
34
 */
35
public abstract class AbstractExportService 
36
        implements ExportService
37
    {
38
    protected static final Logger LOG = LoggerFactory.getLogger(AbstractExportService.class);
39

    
40
    private final ExportParameters parameters;
41
    private final Set<ExportFinishListener> finishListeners;
42
    protected AttributeNamesTranslator attributeNamesTranslator;
43
    private SimpleTaskStatus taskStatus;
44
    private final ExportServiceFactory factory;
45
    
46
    protected AbstractExportService(ExportServiceFactory factory, ExportParameters parameters) {
47
        this.factory = factory;
48
        this.parameters = parameters;
49
        this.finishListeners = new HashSet<>();
50
    }
51
    
52
    @Override
53
    public ExportParameters getParameters() {
54
        return this.parameters;
55
    }
56

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

    
62
    @Override
63
    public void addFinishListener(ExportFinishListener listener) {
64
        this.finishListeners.add(listener);
65
    }   
66
    
67
    protected void fireFinishedListener() {
68
        for (ExportFinishListener listener : finishListeners) {
69
            try {
70
                listener.finished(this);
71
            } catch(Exception ex) {
72
                
73
            }
74
        }
75
    }
76

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

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

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

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

    
113
    @Override
114
    public List<OpenDataStoreParameters> getTargetOpenStoreParameters() throws ExportException {
115
        List<OpenDataStoreParameters> r = new ArrayList<>();
116
        r.add(this.createTargetOpenStoreParameters());
117
        return r;
118
    }
119
    
120
    abstract protected DataServerExplorer createServerExplorer() throws ExportException;
121

    
122
    abstract protected NewDataStoreParameters createTargetNewStoreParameters() throws ExportException;
123

    
124
    abstract protected OpenDataStoreParameters createTargetOpenStoreParameters() throws ExportException;     
125

    
126
    
127
    protected static class InvalidGeometryException extends ExportException {
128

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

    
134
    @Override
135
    public void export(FeatureSet featureSet) throws ExportException {
136
        DataServerExplorer explorer = createServerExplorer();
137
        NewDataStoreParameters newStoreParameters = createTargetNewStoreParameters();
138
        OpenDataStoreParameters openStoreParameters = createTargetOpenStoreParameters();
139
        
140
        String providerName = newStoreParameters.getDataStoreName();
141
        String explorerName = explorer.getProviderName();
142

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

    
149
            DataManager dataManager = DALLocator.getDataManager();
150

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

    
154
            FeatureType theTargetFeatureType = target.getDefaultFeatureType();
155
            FeatureType theSourceFeatureType = featureSet.getDefaultFeatureType();
156

    
157
            ExportGeometryHelper geomHelper = null;
158
            if( this.getParameters() instanceof ExportParametersGeometry ) {
159
                geomHelper = ExportLocator.getServiceManager().createGeometryHelper(
160
                        (ExportParametersGeometry) this.getParameters(),
161
                        theTargetFeatureType, 
162
                        theSourceFeatureType
163
                );
164
                if( !geomHelper.canProcessGeometry() ) {
165
                    geomHelper = null;
166
                }
167
            }
168
            // ============================================
169
            
170
            target.edit(FeatureStore.MODE_APPEND);
171
            it = featureSet.fastIterator();
172

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

    
177
                Feature sourceFeature = (Feature) it.next();
178
                targetFeature = target.createNewFeature(theTargetFeatureType, true);
179
                copyValues(sourceFeature, targetFeature);
180
                
181
                if( geomHelper!=null ) {
182
                    switch(geomHelper.copyGeometry(sourceFeature,targetFeature)) {
183
                        case FixGeometryStatus.STATE_OK:
184
                            break;
185
                        case FixGeometryStatus.STATE_SKIP:
186
                            continue;
187
                        case FixGeometryStatus.STATE_ABORT:
188
                            throw new InvalidGeometryException(targetFeature, geomHelper.getLastErrorMessage());
189
                    }
190
                }
191
                
192
                target.insert(targetFeature);
193

    
194
                featureCount++;
195

    
196
                if (this.getTaskStatus().isCancellationRequested()) {
197
                    return;
198
                }
199
            }
200
            target.finishEditing();
201
            this.getTaskStatus().terminate();
202
            this.getTaskStatus().remove();
203
            fireFinishedListener();
204
        } catch (Exception e) {
205
            fireCancelledListeners();
206
            throw new ExportException(e, targetFeature);
207
        } finally {
208
            DisposeUtils.dispose(it);
209
            DisposeUtils.dispose(featureSet);
210
            DisposeUtils.dispose(target);
211
    }
212
    }
213
    
214
    protected void copyValues(Feature source, EditableFeature target) {
215
        FeatureType sourceType= source.getType();
216
        FeatureType targetType = target.getType();
217
        for( FeatureAttributeDescriptor targetAttr: targetType) {
218
            String targetAttrName = targetAttr.getName();
219
            String sourceAttrName = getAttributeNamesTranslator().getSourceName(targetAttrName);
220
            FeatureAttributeDescriptor sourceAttr = sourceType.getAttributeDescriptor(sourceAttrName);
221
            if( sourceAttr!=null ) {
222
                Object value = source.get(sourceAttrName);
223
                if( value == null ) {
224
                    if( targetAttr.allowNull() ) {
225
                        target.set(targetAttrName, null);
226
                    }
227
                } else {
228
                    target.set(targetAttrName, value);
229
                }
230
            }
231
        }
232
    }
233

    
234
    
235
}