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