Statistics
| Revision:

gvsig-vectorediting / org.gvsig.vectorediting / trunk / org.gvsig.vectorediting / org.gvsig.vectorediting.lib / org.gvsig.vectorediting.lib.prov / org.gvsig.vectorediting.lib.prov.internalpolygon / src / main / java / org / gvsig / vectorediting / lib / prov / internalpolygon / InternalPolygonEditingProvider.java @ 2204

History | View | Annotate | Download (11.4 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright ? 2007-2014 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 2
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

    
25
package org.gvsig.vectorediting.lib.prov.internalpolygon;
26

    
27
import java.util.ArrayList;
28
import java.util.HashMap;
29
import java.util.List;
30
import java.util.Map;
31

    
32
import org.gvsig.fmap.dal.exception.DataException;
33
import org.gvsig.fmap.dal.feature.EditableFeature;
34
import org.gvsig.fmap.dal.feature.Feature;
35
import org.gvsig.fmap.dal.feature.FeatureSelection;
36
import org.gvsig.fmap.dal.feature.FeatureStore;
37
import org.gvsig.fmap.geom.Geometry;
38
import org.gvsig.fmap.geom.GeometryException;
39
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
40
import org.gvsig.fmap.geom.primitive.Point;
41
import org.gvsig.fmap.geom.primitive.Polygon;
42
import org.gvsig.fmap.geom.type.GeometryType;
43
import org.gvsig.tools.dispose.DisposableIterator;
44
import org.gvsig.tools.dynobject.DynObject;
45
import org.gvsig.tools.exception.BaseException;
46
import org.gvsig.tools.service.spi.ProviderServices;
47
import org.gvsig.vectorediting.lib.api.DrawingStatus;
48
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
49
import org.gvsig.vectorediting.lib.api.EditingServiceParameter.TYPE;
50
import org.gvsig.vectorediting.lib.api.exceptions.DrawServiceException;
51
import org.gvsig.vectorediting.lib.api.exceptions.FinishServiceException;
52
import org.gvsig.vectorediting.lib.api.exceptions.InvalidEntryException;
53
import org.gvsig.vectorediting.lib.api.exceptions.StartServiceException;
54
import org.gvsig.vectorediting.lib.api.exceptions.StopServiceException;
55
import org.gvsig.vectorediting.lib.spi.AbstractEditingProvider;
56
import org.gvsig.vectorediting.lib.spi.DefaultEditingServiceParameter;
57
import org.gvsig.vectorediting.lib.spi.EditingProvider;
58
import org.gvsig.vectorediting.lib.spi.EditingProviderFactory;
59
import org.gvsig.vectorediting.lib.spi.EditingProviderServices;
60

    
61
public class InternalPolygonEditingProvider extends AbstractEditingProvider
62
    implements EditingProvider {
63

    
64
    private EditingServiceParameter selectionParameter;
65

    
66
    private EditingServiceParameter geometryParameter;
67

    
68
    private FeatureStore featureStore;
69

    
70
    private Map<EditingServiceParameter, Object> values;
71

    
72
    public InternalPolygonEditingProvider(ProviderServices services,
73
        DynObject parameters) {
74
        super(services);
75
        this.featureStore =
76
            (FeatureStore) parameters
77
                .getDynValue(EditingProviderFactory.FEATURE_STORE_FIELD);
78

    
79
        this.selectionParameter =
80
            new DefaultEditingServiceParameter("selection", "selection",
81
                TYPE.SELECTION);
82

    
83
        this.geometryParameter =
84
            new DefaultEditingServiceParameter("Draw geometry",
85
                "draw_geometry_to_internal_polygon", Geometry.TYPES.MULTISURFACE, TYPE.GEOMETRY);
86
    }
87

    
88
    public EditingServiceParameter next() {
89
        if (values.get(selectionParameter) == null) {
90
            return selectionParameter;
91
        } else if (values.get(geometryParameter) == null) {
92
            return geometryParameter;
93
        }
94

    
95
        return null;
96
    }
97

    
98
    public DrawingStatus getDrawingStatus(Point mousePosition)
99
        throws DrawServiceException {
100
        return null;
101
    }
102

    
103
    public void stop() throws StopServiceException {
104
        values.clear();
105
    }
106

    
107
    public List<EditingServiceParameter> getParameters() {
108
        List<EditingServiceParameter> list =
109
            new ArrayList<EditingServiceParameter>();
110
        list.add(selectionParameter);
111
        list.add(geometryParameter);
112
        return list;
113
    }
114

    
115
    @Override
116
    public void setValue(EditingServiceParameter parameter, Object value) throws InvalidEntryException {
117
        validateAndInsertValue(parameter, value);
118
    }
119

    
120
    public void setValue(Object value) throws InvalidEntryException {
121
        EditingServiceParameter param = next();
122
        validateAndInsertValue(param, value);
123
    }
124

    
125
    private void validateAndInsertValue(EditingServiceParameter param,
126
        Object value) throws InvalidEntryException {
127
        if (param == selectionParameter) {
128

    
129
            if (value instanceof FeatureSelection) {
130

    
131
                // Before set value checks if all geometries selected are
132
                // instance of surface or multisurface
133
                FeatureSelection selection = (FeatureSelection) value;
134
                DisposableIterator it = null;
135

    
136
                if (selection.getSelectedCount() > 0) {
137
                    try {
138
                        it = selection.fastIterator();
139

    
140
                        while (it.hasNext()) {
141
                            Feature feature = (Feature) it.next();
142
                            Geometry geometry = feature.getDefaultGeometry();
143
                            GeometryType geometryType =
144
                                geometry.getGeometryType();
145

    
146
                            if (!geometryType
147
                                .isTypeOf(Geometry.TYPES.MULTISURFACE)
148
                                && !geometryType
149
                                    .isTypeOf(Geometry.TYPES.SURFACE)
150
                                && !geometryType
151
                                    .isTypeOf(Geometry.TYPES.MULTIPOLYGON)
152
                                && !geometryType
153
                                    .isTypeOf(Geometry.TYPES.POLYGON)
154
                                ) {
155

    
156
                                throw new InvalidEntryException(null);
157
                            }
158
                        }
159

    
160
                        values.put(selectionParameter, selection);
161

    
162
                    } catch (BaseException e) {
163
                        throw new InvalidEntryException(e);
164
                    } finally {
165
                        it.dispose();
166
                    }
167
                } else {
168
                    throw new InvalidEntryException(null);
169
                }
170

    
171
            }
172
        } else if (param == geometryParameter) {
173
            if (value instanceof Geometry && !(value instanceof Point)) {
174

    
175
                // Before set value checks if some geometry contains the
176
                // geometry received as parameter.
177
                Geometry geometry = (Geometry) value;
178
                FeatureSelection selection =
179
                    (FeatureSelection) values.get(selectionParameter);
180
                DisposableIterator it = null;
181

    
182
                try {
183
                    it = selection.fastIterator();
184

    
185
                    while (it.hasNext()) {
186
                        Feature feature = (Feature) it.next();
187
                        if (feature.getDefaultGeometry().contains(geometry)) {
188
                            values.put(param, value);
189
                            return;
190
                        }
191
                    }
192

    
193
                    if (values.get(geometryParameter) == null) {
194
                        throw new InvalidEntryException(null);
195
                    }
196
                } catch (BaseException e) {
197
                    throw new InvalidEntryException(e);
198
                } finally {
199
                    it.dispose();
200
                }
201
            }
202
        }
203
    }
204

    
205
    public void finishAndStore() throws FinishServiceException {
206
        FeatureSelection selected =
207
            (FeatureSelection) values.get(selectionParameter);
208
        Geometry geometry = (Geometry) values.get(geometryParameter);
209
        DisposableIterator it = null;
210

    
211
        try {
212
            if (!selected.isEmpty()) {
213
                it = selected.fastIterator();
214

    
215
                while (it.hasNext()) {
216
                    Feature feature = (Feature) it.next();
217
                    Geometry geometryFeature =
218
                        feature.getDefaultGeometry().cloneGeometry();
219

    
220
                    if (geometryFeature.contains(geometry)) {
221

    
222
                        Geometry newGeom = null;
223
                        if(geometryFeature instanceof Polygon){
224
                            newGeom = geometryFeature.cloneGeometry();
225
                        } else {
226
                            newGeom = geometryFeature.toPolygons();
227
                        }
228

    
229
                        if(newGeom instanceof MultiPolygon){
230
                            MultiPolygon newMultiPolygon = (MultiPolygon)newGeom;
231
                            for (int i = 0; i < newMultiPolygon.getPrimitivesNumber(); i++) {
232
                                Polygon primitive = (Polygon) newMultiPolygon.getPrimitiveAt(i);
233
                                if(primitive.contains(geometry)){
234
                                    addInteriorRings(primitive, geometry);
235
                                }
236
                            }
237
                        } else {
238
                            if(newGeom.contains(geometry)){
239
                                addInteriorRings((Polygon)newGeom, geometry);
240
                            }
241
                        }
242

    
243
                        EditingProviderServices editingProviderServices =
244
                            (EditingProviderServices) getProviderServices();
245

    
246
                        EditableFeature editableFeature = feature.getEditable();
247
                        editableFeature.setDefaultGeometry(newGeom);
248
                        editingProviderServices.updateFeatureInFeatureStore(
249
                            editableFeature, featureStore);
250
                    }
251
                }
252
            }
253
        } catch (BaseException e) {
254
            throw new FinishServiceException(
255
                "Can't finalize " + this.getName(), e);
256
        } finally {
257
            it.dispose();
258
        }
259
    }
260

    
261
    private void addInteriorRings(Polygon polygon, Geometry geometry) throws GeometryException {
262
        if (geometry instanceof Polygon) {
263
            polygon.addInteriorRing((Polygon) geometry);
264
        } else {
265
            MultiPolygon multiPolygon = geometry.toPolygons();
266
            for (int i = 0; i < multiPolygon.getPrimitivesNumber(); i++) {
267
                Polygon surface = (Polygon) multiPolygon.getPrimitiveAt(i);
268
                polygon.addInteriorRing(surface);
269
            }
270
        }
271
    }
272

    
273
    public Geometry finish() throws FinishServiceException {
274
        return null;
275
    }
276

    
277
    public void start() throws StartServiceException, InvalidEntryException {
278
        this.values = new HashMap<EditingServiceParameter, Object>();
279
        FeatureSelection selected = null;
280
        if (featureStore != null) {
281
            try {
282
                selected = featureStore.getFeatureSelection();
283
            } catch (DataException e) {
284
                throw new StartServiceException(e);
285
            }
286
            if (selected.getSelectedCount() > 0) {
287
                try {
288
                    setValue(selected);
289
                } catch (InvalidEntryException e) {
290
                    throw new InvalidEntryException(e);
291
                }
292
            }
293
        }
294
    }
295

    
296
    public String getName() {
297
        return InternalPolygonEditingProviderFactory.PROVIDER_NAME;
298
    }
299

    
300
}