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 @ 575

History | View | Annotate | Download (11.3 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
    public void setValue(Object value) throws InvalidEntryException {
116
        EditingServiceParameter param = next();
117
        validateAndInsertValue(param, value);
118
    }
119

    
120
    private void validateAndInsertValue(EditingServiceParameter param,
121
        Object value) throws InvalidEntryException {
122
        if (param == selectionParameter) {
123

    
124
            if (value instanceof FeatureSelection) {
125

    
126
                // Before set value checks if all geometries selected are
127
                // instance of surface or multisurface
128
                FeatureSelection selection = (FeatureSelection) value;
129
                DisposableIterator it = null;
130

    
131
                if (selection.getSelectedCount() > 0) {
132
                    try {
133
                        it = selection.fastIterator();
134

    
135
                        while (it.hasNext()) {
136
                            Feature feature = (Feature) it.next();
137
                            Geometry geometry = feature.getDefaultGeometry();
138
                            GeometryType geometryType =
139
                                geometry.getGeometryType();
140

    
141
                            if (!geometryType
142
                                .isTypeOf(Geometry.TYPES.MULTISURFACE)
143
                                && !geometryType
144
                                    .isTypeOf(Geometry.TYPES.SURFACE)
145
                                && !geometryType
146
                                    .isTypeOf(Geometry.TYPES.MULTIPOLYGON)
147
                                && !geometryType
148
                                    .isTypeOf(Geometry.TYPES.POLYGON)
149
                                ) {
150

    
151
                                throw new InvalidEntryException(null);
152
                            }
153
                        }
154

    
155
                        values.put(selectionParameter, selection);
156

    
157
                    } catch (BaseException e) {
158
                        throw new InvalidEntryException(e);
159
                    } finally {
160
                        it.dispose();
161
                    }
162
                } else {
163
                    throw new InvalidEntryException(null);
164
                }
165

    
166
            }
167
        } else if (param == geometryParameter) {
168
            if (value instanceof Geometry && !(value instanceof Point)) {
169

    
170
                // Before set value checks if some geometry contains the
171
                // geometry received as parameter.
172
                Geometry geometry = (Geometry) value;
173
                FeatureSelection selection =
174
                    (FeatureSelection) values.get(selectionParameter);
175
                DisposableIterator it = null;
176

    
177
                try {
178
                    it = selection.fastIterator();
179

    
180
                    while (it.hasNext()) {
181
                        Feature feature = (Feature) it.next();
182
                        if (feature.getDefaultGeometry().contains(geometry)) {
183
                            values.put(param, value);
184
                            return;
185
                        }
186
                    }
187

    
188
                    if (values.get(geometryParameter) == null) {
189
                        throw new InvalidEntryException(null);
190
                    }
191
                } catch (BaseException e) {
192
                    throw new InvalidEntryException(e);
193
                } finally {
194
                    it.dispose();
195
                }
196
            }
197
        }
198
    }
199

    
200
    public void finishAndStore() throws FinishServiceException {
201
        FeatureSelection selected =
202
            (FeatureSelection) values.get(selectionParameter);
203
        Geometry geometry = (Geometry) values.get(geometryParameter);
204
        DisposableIterator it = null;
205

    
206
        try {
207
            if (!selected.isEmpty()) {
208
                it = selected.fastIterator();
209

    
210
                while (it.hasNext()) {
211
                    Feature feature = (Feature) it.next();
212
                    Geometry geometryFeature =
213
                        feature.getDefaultGeometry().cloneGeometry();
214

    
215
                    if (geometryFeature.contains(geometry)) {
216

    
217
                        Geometry newGeom = null;
218
                        if(geometryFeature instanceof Polygon){
219
                            newGeom = geometryFeature.cloneGeometry();
220
                        } else {
221
                            newGeom = geometryFeature.toPolygons();
222
                        }
223

    
224
                        if(newGeom instanceof MultiPolygon){
225
                            MultiPolygon newMultiPolygon = (MultiPolygon)newGeom;
226
                            for (int i = 0; i < newMultiPolygon.getPrimitivesNumber(); i++) {
227
                                Polygon primitive = (Polygon) newMultiPolygon.getPrimitiveAt(i);
228
                                if(primitive.contains(geometry)){
229
                                    addInteriorRings(primitive, geometry);
230
                                }
231
                            }
232
                        } else {
233
                            if(newGeom.contains(geometry)){
234
                                addInteriorRings((Polygon)newGeom, geometry);
235
                            }
236
                        }
237

    
238
                        EditingProviderServices editingProviderServices =
239
                            (EditingProviderServices) getProviderServices();
240

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

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

    
268
    public Geometry finish() throws FinishServiceException {
269
        return null;
270
    }
271

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

    
291
    public String getName() {
292
        return InternalPolygonEditingProviderFactory.PROVIDER_NAME;
293
    }
294

    
295
}