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 |