Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.annotation / org.gvsig.annotation.lib / org.gvsig.annotation.lib.impl / src / main / java / org / gvsig / annotation / impl / DefaultAnnotationCreationService.java @ 42488

History | View | Annotate | Download (16.7 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.annotation.impl;
25

    
26
import java.io.File;
27
import java.io.FileOutputStream;
28
import java.io.IOException;
29
import java.io.InputStream;
30
import java.io.OutputStream;
31

    
32
import org.gvsig.annotation.AnnotationCreationException;
33
import org.gvsig.annotation.AnnotationCreationFinishAction;
34
import org.gvsig.annotation.AnnotationCreationService;
35
import org.gvsig.annotation.AnnotationDataTypes;
36
import org.gvsig.annotation.AnnotationManager;
37
import org.gvsig.annotation.calculator.AnnotationPositionCalculationException;
38
import org.gvsig.annotation.calculator.AnnotationPositionCalculator;
39
import org.gvsig.annotation.calculator.AnnotationPositionCalculatorCreationException;
40
import org.gvsig.fmap.dal.DALLocator;
41
import org.gvsig.fmap.dal.DataManager;
42
import org.gvsig.fmap.dal.DataTypes;
43
import org.gvsig.fmap.dal.exception.DataException;
44
import org.gvsig.fmap.dal.exception.InitializeException;
45
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
46
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
47
import org.gvsig.fmap.dal.feature.EditableFeature;
48
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
49
import org.gvsig.fmap.dal.feature.EditableFeatureType;
50
import org.gvsig.fmap.dal.feature.Feature;
51
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
52
import org.gvsig.fmap.dal.feature.FeatureSet;
53
import org.gvsig.fmap.dal.feature.FeatureStore;
54
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
55
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
56
import org.gvsig.fmap.geom.Geometry;
57
import org.gvsig.tools.ToolsLocator;
58
import org.gvsig.tools.dispose.DisposableIterator;
59
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
60
import org.gvsig.tools.task.AbstractMonitorableTask;
61
import org.gvsig.tools.task.SimpleTaskStatus;
62
import org.gvsig.tools.task.TaskStatusManager;
63

    
64
import org.apache.commons.lang3.StringUtils;
65
import org.slf4j.Logger;
66
import org.slf4j.LoggerFactory;
67

    
68

    
69
/**
70
 * Default {@link AnnotationCreationService} implementation.
71
 * 
72
 * @author gvSIG Team
73
 * @version $Id$
74
 */
75
public class DefaultAnnotationCreationService extends AbstractMonitorableTask implements AnnotationCreationService {
76
        private static final Logger LOG = LoggerFactory.getLogger(DefaultAnnotationCreationService.class);
77
        private static final String TEMPLATE_NAME = "template.gvslab";
78
        private static DataManager dataManager = DALLocator.getDataManager();
79

    
80
        private AnnotationManager manager;
81
        private FeatureStore sourceStore;
82

    
83
        private int sourceFontTypeAttribute = -1;
84
        private int sourceFontStyleAttribute = -1;
85
        private int sourceFontColorAttribute = -1;
86
        private int sourceRotationAttribute = -1;
87
        private int sourceHeigthAttribute = -1;
88
        private AnnotationPositionCalculator annotationPositionCalculator = null;
89

    
90
        private String destinationGeometryAttributeName = null;
91

    
92
        private AnnotationCreationFinishAction annotationCreationFinishAction = null; 
93

    
94
        /**
95
         * {@link DefaultAnnotationCreationService} constructor with a
96
         * {@link AnnotationManager}.
97
         * 
98
         * @param manager
99
         *            to use in the service
100
         * @throws DataException 
101
         */
102
        public DefaultAnnotationCreationService(FeatureStore featureStore, AnnotationManager manager) throws DataException {
103
                super("annotation");
104
            this.sourceStore = featureStore; 
105
                this.manager = manager;
106
                destinationGeometryAttributeName = featureStore.getDefaultFeatureType().getDefaultGeometryAttributeName();
107
        }
108

    
109
        public AnnotationManager getManager() {
110
                return this.manager;
111
        }
112

    
113
        public FeatureStore createAnnotationStore(String destinationShapeFile, int textValueAttribute)
114
        throws AnnotationCreationException {                
115
                try {
116
                        if (destinationShapeFile == null){
117
                                throw new AnnotationCreationException("File can not be null");
118
                        }        
119

    
120
                        String destinationShapeFileWithoutExtension = destinationShapeFile.toLowerCase().replaceAll("\\.shp", "");
121
                        if (destinationShapeFileWithoutExtension.length() == destinationShapeFile.length()-4){
122
                                destinationShapeFileWithoutExtension =  destinationShapeFile.substring(0, destinationShapeFile.length()-4);
123
                        }else{
124
                                destinationShapeFileWithoutExtension = destinationShapeFile;
125
                        }                        
126

    
127
                        NewFeatureStoreParameters newFeatureStoreParameters = (NewFeatureStoreParameters)dataManager.createNewStoreParameters("FilesystemExplorer", "Shape");
128
                        newFeatureStoreParameters.setDynValue("shpfile", destinationShapeFileWithoutExtension + ".shp");
129
                        newFeatureStoreParameters.setDynValue("dbffile", destinationShapeFileWithoutExtension + ".dbf");
130
                        newFeatureStoreParameters.setDynValue("shxfile", destinationShapeFileWithoutExtension + ".shx");
131
                        newFeatureStoreParameters.setDynValue("crs", sourceStore.getDefaultFeatureType().getDefaultSRS());
132

    
133
                        EditableFeatureType editableFeatureType = sourceStore.getDefaultFeatureType().getEditable();//newFeatureStoreParameters.getDefaultFeatureType().getEditable();
134
                        FeatureAttributeDescriptor[] featureAttributeDescriptors = editableFeatureType.getAttributeDescriptors();
135
                        for (int i=featureAttributeDescriptors.length-1  ; i>=0 ; i--){
136
                                editableFeatureType.remove(i);
137
                        }
138
                        initializeFeatureType(editableFeatureType);
139
                        newFeatureStoreParameters.setDefaultFeatureType(editableFeatureType);
140

    
141
                        dataManager.newStore("FilesystemExplorer", "Shape", newFeatureStoreParameters, true);
142

    
143
                        //If there is not an annotationPositionCalculator it gets the default 
144
                        if (annotationPositionCalculator == null){
145
                                annotationPositionCalculator = manager.getDefaultAnnotationPositionCalculator();
146
                        }        
147

    
148
                        FeatureStore destinationStore = (FeatureStore) dataManager.openStore("Shape", newFeatureStoreParameters);
149

    
150
                        copyFeatureStore(sourceStore, 
151
                                        destinationStore,
152
                                        textValueAttribute);        
153

    
154
                        try {
155
                                copyLegend(destinationStore);
156
                        } catch (IOException e) {
157
                                LOG.error("Error copying the legend");
158
                        }
159

    
160
                        if (annotationCreationFinishAction != null){
161
                                annotationCreationFinishAction.finished(destinationStore);
162
                        }
163

    
164
                        return destinationStore;
165
                } catch (InitializeException e) {
166
                        throw new AnnotationCreationException(e);
167
                } catch (ProviderNotRegisteredException e) {
168
                        throw new AnnotationCreationException(e);
169
                } catch (ValidateDataParametersException e) {
170
                        throw new AnnotationCreationException(e);
171
                } catch (DynFieldNotFoundException e) {
172
                        throw new AnnotationCreationException(e);
173
                } catch (DataException e) {
174
                        throw new AnnotationCreationException(e);
175
                } catch (AnnotationPositionCalculatorCreationException e) {
176
                        throw new AnnotationCreationException(e);
177
                }                         
178
        }        
179

    
180
        public FeatureStore createAnnotationStore(String destinationShapeFile,
181
                        String textValueAttributeName) throws AnnotationCreationException {
182
                try {
183
                        return createAnnotationStore(destinationShapeFile, getIndex(textValueAttributeName));
184
                } catch (DataException e) {
185
                        throw new AnnotationCreationException(e);
186
                }                        
187
        }
188

    
189
        private void initializeFeatureType(EditableFeatureType editableFeatureType) throws DataException
190
        {                
191
                EditableFeatureAttributeDescriptor geometryType = editableFeatureType.add(destinationGeometryAttributeName, DataTypes.GEOMETRY);
192
                geometryType.setAllowNull(false);                
193
                geometryType.setGeometryType(Geometry.TYPES.POINT).setGeometrySubType(Geometry.SUBTYPES.GEOM2D);
194
                geometryType.setSRS(sourceStore.getDefaultFeatureType().getDefaultSRS());
195
                geometryType.setObjectClass(Geometry.class);
196
                editableFeatureType.setDefaultGeometryAttributeName(destinationGeometryAttributeName);
197

    
198
                editableFeatureType.add(AnnotationManager.TEXTVALUE_ATTRIBUTE_NAME, AnnotationDataTypes.TEXT, 256).setAllowNull(true);
199
                editableFeatureType.add(AnnotationManager.FONTTYPE_ATTRIBUTE_NAME, AnnotationDataTypes.FONTTYPE, 30).setAllowNull(true);
200
                editableFeatureType.add(AnnotationManager.FONTSTYLE_ATTRIBUTE_NAME, AnnotationDataTypes.FONTSTYLE, 30).setAllowNull(true);
201
                editableFeatureType.add(AnnotationManager.FONTCOLOR_ATTRIBUTE_NAME, AnnotationDataTypes.FONTCOLOR, 20).setAllowNull(true);
202
                editableFeatureType.add(AnnotationManager.FONTROTATION_ATTRIBUTE_NAME, AnnotationDataTypes.FONTROTATION, 5).setAllowNull(true);
203
                editableFeatureType.add(AnnotationManager.FONTHEGTH_ATTRIBUTE_NAME, AnnotationDataTypes.FONTHEIGHT, 5).setAllowNull(true);
204
        }
205

    
206
        private AttributeInserter createInserter(int attributePosition, Object defaultValue)
207
        {
208
                if (attributePosition > -1){
209
                        return new StoreAttributeInserter(attributePosition);
210
                }else{
211
                        return new DefaultAttributeInserter(defaultValue);
212
                }
213
        }
214

    
215
        private void copyFeatureStore(FeatureStore sourceStore,
216
                        FeatureStore destinationStore, int textAttribute)
217
        throws AnnotationCreationException, DataException {                
218
                FeatureSet featureSet = null;
219
                DisposableIterator iterator = null;
220
                
221
                try{
222
                        //Start the edition
223
                        destinationStore.edit();
224

    
225
                        //Copy data
226
                        featureSet = sourceStore.getFeatureSet();
227
                        iterator = featureSet.fastIterator();
228
                        
229
                        
230
                        taskStatus.setRangeOfValues(0, featureSet.getSize());
231
        
232
                        //Create the attribute inserter's
233
                        AttributeInserter fontTypeAttributeInserter = createInserter(sourceFontTypeAttribute, manager.getDefaultFontType());                
234
                        AttributeInserter fontStyleAttributeInserter = createInserter(sourceFontStyleAttribute, manager.getDefaultFontStyle());                
235
                        AttributeInserter fontColorAttributeInserter = createInserter(sourceFontColorAttribute, manager.getDefaultFontColor());                
236
                        AttributeInserter fontRotationAttributeInserter = createInserter(sourceRotationAttribute, manager.getDefaultFontRotation());                
237
                        AttributeInserter fontHeigthAttributeInserter = createInserter(sourceHeigthAttribute, manager.getDefaultFontHeight());                
238
        
239
                        Feature sourceFeature;
240
                        long featureCount = 0;
241
                        while (iterator.hasNext()) {                        
242
                                sourceFeature = (Feature) iterator.next();
243
        
244
                                EditableFeature destinationFeature = destinationStore.createNewFeature().getEditable();
245
                                try {
246
                                        destinationFeature.set(destinationGeometryAttributeName, annotationPositionCalculator.getAnnotationPosition(sourceFeature));
247
                                } catch (AnnotationPositionCalculationException e) {
248
                                        LOG.error("Not possible to get the point for the geometry", e);                                
249
                                }
250
                        String s = (String) sourceFeature.get(textAttribute);
251
                if (StringUtils.isEmpty(s)) {
252
                    s = this.getManager().getDefaultTextValue();
253
                }
254
                                destinationFeature.set(AnnotationManager.TEXTVALUE_ATTRIBUTE_NAME, s);
255
                                destinationFeature.set(AnnotationManager.FONTTYPE_ATTRIBUTE_NAME, fontTypeAttributeInserter.getValue(sourceFeature));
256
                                destinationFeature.set(AnnotationManager.FONTSTYLE_ATTRIBUTE_NAME, fontStyleAttributeInserter.getValue(sourceFeature));
257
                                destinationFeature.set(AnnotationManager.FONTCOLOR_ATTRIBUTE_NAME, fontColorAttributeInserter.getValue(sourceFeature));
258
                                destinationFeature.set(AnnotationManager.FONTROTATION_ATTRIBUTE_NAME, fontRotationAttributeInserter.getValue(sourceFeature));
259
                                destinationFeature.set(AnnotationManager.FONTHEGTH_ATTRIBUTE_NAME, fontHeigthAttributeInserter.getValue(sourceFeature));
260
        
261
                                destinationStore.insert(destinationFeature);
262
                            featureCount++;  
263
                            this.taskStatus.setCurValue(featureCount);
264
            
265
                    if (this.taskStatus.isCancellationRequested()) {
266
                            destinationStore.cancelEditing();
267
                            this.taskStatus.cancel();
268
                        return;
269
                    }
270
                        }
271
                }finally{
272

    
273
                        //Finish the edition
274
                        if(destinationStore.isEditing()){
275
                                destinationStore.finishEditing();
276
                        }
277
        
278
                        //Dispose resources
279
                        if(iterator != null){
280
                                iterator.dispose();        
281
                        }
282
                        if(featureSet != null){
283
                                featureSet.dispose();
284
                        }
285
                        
286
                        if(this.taskStatus.isRunning()){
287
                                this.taskStatus.terminate();
288
                        }
289
                //this.taskStatus.remove();
290
                }
291
        }
292

    
293
        private void copyLegend(FeatureStore destinationStore) throws ValidateDataParametersException, DataException, IOException {
294
                FilesystemServerExplorer filesystemServerExplorer = (FilesystemServerExplorer)destinationStore.getExplorer();
295
                File target = filesystemServerExplorer.getResourcePath(destinationStore, "gvslab");
296

    
297
                //Copy the template
298
                InputStream in = getClass().getClassLoader().getResourceAsStream(TEMPLATE_NAME);
299
                OutputStream out = null;
300

    
301
                out = new FileOutputStream(target);
302

    
303
                byte[] buf = new byte[1024];
304
                int len;
305
                while ((len = in.read(buf)) > 0) { 
306
                        out.write(buf, 0, len); 
307
                } 
308
                in.close();
309
                out.close();                 
310
        }
311

    
312
        private void checkAttribute(int index, int[] type) throws DataException{
313
                if (index >= sourceStore.getDefaultFeatureType().size()){
314
                        throw new IllegalArgumentException("Attribute not found");
315
                }
316
                int datatype = sourceStore.getDefaultFeatureType().getAttributeDescriptor(index).getDataType().getType();
317
                
318
                boolean validType = false;
319
                if(type != null) {
320
                        for (int i = 0; i < type.length; i++) {
321
                                if(datatype == type[i]) {
322
                                        validType = true;
323
                                }
324
                        }
325
                }
326
                
327
                if (!validType) {
328
                        throw new IllegalArgumentException("The Attribute has not have the fine type");
329
                }
330
        }
331

    
332

    
333
        public void setFontTypeAttribute(int index) throws DataException {
334
                checkAttribute(index, new int[]{AnnotationDataTypes.FONTTYPE});
335
                this.sourceFontTypeAttribute = index;                
336
        }
337

    
338
        public void setFontStyleAttribute(int index) throws DataException {
339
                checkAttribute(index, new int[]{AnnotationDataTypes.FONTSTYLE});
340
                this.sourceFontStyleAttribute = index;                
341
        }
342

    
343
        public void setFontColorAttribute(int index) throws DataException {
344
                checkAttribute(index, new int[]{AnnotationDataTypes.FONTCOLOR});
345
                this.sourceFontColorAttribute = index;                
346
        }
347

    
348
        public void setFontHeigthAttribute(int index) throws DataException {
349
                checkAttribute(index, new int[]{AnnotationDataTypes.FONTHEIGHT, DataTypes.INT, DataTypes.LONG, DataTypes.FLOAT});
350
                this.sourceHeigthAttribute = index;                
351
        }
352

    
353
        public void setFontRotationAttribute(int index) throws DataException {
354
                checkAttribute(index, new int[]{AnnotationDataTypes.FONTROTATION});
355
                this.sourceRotationAttribute = index;                
356
        }
357

    
358
        public void setAnnotationPositionCalculator(
359
                        AnnotationPositionCalculator annotationPositionCalculator) {                
360
                this.annotationPositionCalculator = annotationPositionCalculator;                
361
        }
362

    
363
        public int getIndex(String attributeName) throws DataException{
364
                FeatureAttributeDescriptor featureAttributeDescriptor = sourceStore.getDefaultFeatureType().getAttributeDescriptor(attributeName);
365
                if (featureAttributeDescriptor != null){
366
                        return featureAttributeDescriptor.getIndex();
367
                }
368
                return -1;
369
        }
370

    
371
        public void setFontColorAttribute(String attributeName) throws DataException {
372
                setFontColorAttribute(getIndex(attributeName));                
373
        }
374

    
375
        public void setFontHeigthAttribute(String attributeName) throws DataException {
376
                setFontHeigthAttribute(getIndex(attributeName));                                
377
        }
378

    
379
        public void setFontRotationAttribute(String attributeName) throws DataException {
380
                setFontRotationAttribute(getIndex(attributeName));                                
381
        }
382

    
383
        public void setFontStyleAttribute(String attributeName) throws DataException {
384
                setFontStyleAttribute(getIndex(attributeName));                                
385
        }
386

    
387
        public void setFontTypeAttribute(String attributeName) throws DataException {
388
                setFontTypeAttribute(getIndex(attributeName));                                
389
        }
390

    
391

    
392
        public FeatureStore getFeatureStore() {
393
                return sourceStore;
394
        }
395

    
396
        private interface AttributeInserter{
397
                public Object getValue(Feature feature);
398
        }
399

    
400

    
401
        private class StoreAttributeInserter implements AttributeInserter{
402
                private int attributePosition = -1;
403

    
404
                public StoreAttributeInserter(int attributePosition) {
405
                        super();
406
                        this.attributePosition = attributePosition;                        
407
                }
408

    
409
                public Object getValue(Feature feature){
410
                        return feature.get(attributePosition);
411
                }
412
        }
413

    
414
        private class DefaultAttributeInserter implements AttributeInserter{
415
                private Object defaultValue = null;
416

    
417
                public DefaultAttributeInserter(Object defaultValue) {
418
                        super();        
419
                        this.defaultValue = defaultValue;
420
                }
421

    
422
                public Object getValue(Feature feature){
423
                        return defaultValue;
424
                }
425
        }
426

    
427
        public AnnotationCreationFinishAction getAnnotationCreationFinishAction() {
428
                return annotationCreationFinishAction;
429
        }
430

    
431

    
432
        public void setAnnotationCreationFinishAction(
433
                        AnnotationCreationFinishAction annotationCreationFinishAction) {
434
                this.annotationCreationFinishAction = annotationCreationFinishAction;        
435
        }
436
}