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 | } |