Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / app / gui / selectionByTheme / MySelectionByThemeListener.java @ 42086

History | View | Annotate | Download (11.4 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.app.gui.selectionByTheme;
25

    
26
import org.cresques.cts.IProjection;
27
import org.gvsig.andami.messages.NotificationManager;
28
import org.gvsig.fmap.dal.exception.DataException;
29
import org.gvsig.fmap.dal.exception.ReadException;
30
import org.gvsig.tools.dispose.DisposableIterator;
31
import org.gvsig.fmap.dal.feature.Feature;
32
import org.gvsig.fmap.dal.feature.FeatureQuery;
33
import org.gvsig.fmap.dal.feature.FeatureSelection;
34
import org.gvsig.fmap.dal.feature.FeatureSet;
35
import org.gvsig.fmap.dal.feature.FeatureStore;
36
import org.gvsig.fmap.dal.feature.FeatureType;
37
import org.gvsig.fmap.geom.Geometry;
38
import org.gvsig.fmap.mapcontext.layers.FLayer;
39
import org.gvsig.fmap.mapcontext.layers.vectorial.ContainsGeometryEvaluator;
40
import org.gvsig.fmap.mapcontext.layers.vectorial.CrossesGeometryEvaluator;
41
import org.gvsig.fmap.mapcontext.layers.vectorial.DisjointGeometryEvaluator;
42
import org.gvsig.fmap.mapcontext.layers.vectorial.EqualsGeometryEvaluator;
43
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
44
import org.gvsig.fmap.mapcontext.layers.vectorial.IntersectsGeometryEvaluator;
45
import org.gvsig.fmap.mapcontext.layers.vectorial.OverlapsGeometryEvaluator;
46
import org.gvsig.fmap.mapcontext.layers.vectorial.TouchesGeometryEvaluator;
47
import org.gvsig.fmap.mapcontext.layers.vectorial.WithinGeometryEvaluator;
48
import org.gvsig.tools.dispose.DisposeUtils;
49
import org.gvsig.tools.evaluator.Evaluator;
50
import org.gvsig.tools.evaluator.EvaluatorData;
51
import org.gvsig.tools.evaluator.EvaluatorException;
52
import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
53

    
54

    
55
/**
56
 * DOCUMENT ME!
57
 *
58
 * @author Fernando Gonz?lez Cort?s
59
 */
60
//TODO comentado para que compile
61
public class MySelectionByThemeListener implements SelectionByThemeListener {
62
        /**
63
         * @see org.gvsig.app.gui.selectionByTheme.SelectionByThemeListener#newSet(int,
64
         *      int, int)
65
         */
66
        public void newSet(FLayer[] toSelect, FLayer selectionLayer, int action) {
67
                long t1 = System.currentTimeMillis();
68

    
69
                if (selectionLayer instanceof FLyrVect) {
70
                        try {
71
                                FeatureSelection selection=(FeatureSelection)((FLyrVect)selectionLayer).getFeatureStore().getSelection();
72
                                SelectByTheme filter=new SelectByTheme(selection,selectionLayer.getMapContext().getProjection(),selection.getDefaultFeatureType().getDefaultGeometryAttributeName(), action);
73

    
74
                                for (int i = 0; i < toSelect.length; i++) {
75
                                        if (toSelect[i] instanceof FLyrVect) {
76
//                                                if (!selectionLayer.getFullEnvelope().intersects(toSelect[i].getFullEnvelope())){
77
//                                                        continue;
78
//                                                }
79
                                                FeatureStore storeToQuery = ((FLyrVect) toSelect[i]).getFeatureStore();
80
                                                FeatureQuery fQuery = storeToQuery
81
                                                                .createFeatureQuery();
82
                                                filter.setData(storeToQuery.getDefaultFeatureType(),storeToQuery.getDefaultFeatureType().getDefaultGeometryAttributeName(),null);
83

    
84
                                                fQuery.setFilter(filter);
85
                                                FeatureSet featureSet = null;
86
                                                try {
87
                                                        featureSet = storeToQuery.getFeatureSet(fQuery);
88
                                                        ((FeatureSelection) storeToQuery.getSelection())
89
                                                                        .deselectAll();
90
                                                        storeToQuery.setSelection(featureSet);
91
                                                } finally {
92
                                                        if (featureSet != null) {
93
                                                                featureSet.dispose();
94
                                                        }
95
                                                }
96
                                        }
97
                                }
98
                        } catch (ReadException e) {
99
                                NotificationManager.addError("error_selection_by_theme", e);
100
                        } catch (DataException e) {
101
                                NotificationManager.addError("error_selection_by_theme", e);
102
                        }
103

    
104
                }
105
                long t2 = System.currentTimeMillis();
106
                System.out
107
                                .println("Tiempo de consulta: " + (t2 - t1) + " milisegundos");
108
                // doSelection(toSelect, selectionLayer, action, false);
109
        }
110

    
111
        /**
112
         * @see org.gvsig.app.gui.selectionByTheme.SelectionByThemeListener#addToSet(int,
113
         *      int, int)
114
         */
115
        public void addToSet(FLayer[] toSelect, FLayer selectionLayer, int action) {
116
                long t1 = System.currentTimeMillis();
117

    
118
                if (selectionLayer instanceof FLyrVect) {
119
                        try {
120
                                FeatureSelection selection=(FeatureSelection)((FLyrVect)selectionLayer).getFeatureStore().getSelection();
121
                                SelectByTheme filter=new SelectByTheme(selection,selectionLayer.getMapContext().getProjection(),selection.getDefaultFeatureType().getDefaultGeometryAttributeName(), action);
122

    
123
                                for (int i = 0; i < toSelect.length; i++) {
124
                                        if (toSelect[i] instanceof FLyrVect) {
125
                                                if (!selectionLayer.getFullEnvelope().intersects(toSelect[i].getFullEnvelope())){
126
                                                        continue;
127
                                                }
128
                                                FeatureStore storeToQuery = ((FLyrVect) toSelect[i]).getFeatureStore();
129
                                                FeatureQuery fQuery = storeToQuery
130
                                                                .createFeatureQuery();
131
                                                filter.setData(storeToQuery.getDefaultFeatureType(),storeToQuery.getDefaultFeatureType().getDefaultGeometryAttributeName(),null);
132

    
133
                                                fQuery.setFilter(filter);
134
                                                FeatureSet newFeatureSet = null;
135
                                                FeatureSelection previousFeatureSet = null;
136
                                                try {
137
                                                        newFeatureSet = storeToQuery.getFeatureSet(fQuery);
138
                                                        previousFeatureSet= storeToQuery.getFeatureSelection();
139
                                                        previousFeatureSet.select(newFeatureSet);
140
                                                        storeToQuery.setSelection(previousFeatureSet);
141
                                                } finally {
142
                                                        if (newFeatureSet != null) {
143
                                                                newFeatureSet.dispose();
144
                                                        }
145
                                                        if (previousFeatureSet != null) {
146
                                                                previousFeatureSet.dispose();
147
                                                        }
148
                                                }
149
                                        }
150
                                }
151
                        } catch (ReadException e) {
152
                                NotificationManager.addError("error_selection_by_theme", e);
153
                        } catch (DataException e) {
154
                                NotificationManager.addError("error_selection_by_theme", e);
155
                        }
156

    
157
                }
158
                long t2 = System.currentTimeMillis();
159
                System.out
160
                                .println("Tiempo de consulta: " + (t2 - t1) + " milisegundos");
161
        }
162

    
163
        /**
164
         * @see org.gvsig.app.gui.selectionByTheme.SelectionByThemeListener#fromSet(int,
165
         *      int, int)
166
         */
167
        public void fromSet(FLayer[] toSelect, FLayer selectionLayer, int action) {
168
                long t1 = System.currentTimeMillis();
169
                if (selectionLayer instanceof FLyrVect) {
170
                        try {
171
                                FeatureSelection selection=(FeatureSelection)((FLyrVect)selectionLayer).getFeatureStore().getSelection();
172
                                SelectByTheme filter=new SelectByTheme(selection,selectionLayer.getMapContext().getProjection(),selection.getDefaultFeatureType().getDefaultGeometryAttributeName(), action);
173

    
174
                                for (int i = 0; i < toSelect.length; i++) {
175
                                        if (toSelect[i] instanceof FLyrVect) {
176
                                                if (!selectionLayer.getFullEnvelope().intersects(toSelect[i].getFullEnvelope())){
177
                                                        continue;
178
                                                }
179
                                                FeatureStore storeToQuery = ((FLyrVect) toSelect[i]).getFeatureStore();
180
                                                FeatureQuery fQuery = storeToQuery
181
                                                                .createFeatureQuery();
182
                                                filter.setData(storeToQuery.getDefaultFeatureType(),storeToQuery.getDefaultFeatureType().getDefaultGeometryAttributeName(),(FeatureSelection)storeToQuery.getSelection());
183

    
184
                                                fQuery.setFilter(filter);
185
                                                FeatureSet featureSet = null;
186
                                                try {
187
                                                        featureSet = storeToQuery.getFeatureSet(fQuery);
188
                                                        ((FeatureSelection) storeToQuery.getSelection())
189
                                                                        .deselectAll();
190
                                                        storeToQuery.setSelection(featureSet);
191
                                                } finally {
192
                                                        if (featureSet != null) {
193
                                                                featureSet.dispose();
194
                                                        }
195

    
196
                                                }
197
                                        }
198
                                }
199
                        } catch (ReadException e) {
200
                                NotificationManager.addError("error_selection_by_theme", e);
201
                        } catch (DataException e) {
202
                                NotificationManager.addError("error_selection_by_theme", e);
203
                        }
204

    
205
                }
206
                long t2 = System.currentTimeMillis();
207
                System.out
208
                                .println("Tiempo de consulta: " + (t2 - t1) + " milisegundos");
209
        }
210
        class SelectByTheme implements Evaluator{
211
                private FeatureSelection selection=null;
212
                private IProjection projection;
213
                private FeatureType featureType;
214
                private String geomName;
215
                private EvaluatorFieldsInfo info;
216
                private String nameSelectedGeom;
217
                private FeatureSelection featureSelection;
218
                private int action;
219
                private int index;
220

    
221
                public SelectByTheme(FeatureSelection selection, IProjection projection,String nameSelectedGeom, int action){
222
                        this.selection=selection;
223

    
224
                        this.projection=projection;
225
                        this.nameSelectedGeom=nameSelectedGeom;
226
                        this.action=action;
227
                        this.index=selection.getDefaultFeatureType().getIndex(nameSelectedGeom);
228
                }
229
                public void setData(FeatureType featureType, String geomName, FeatureSelection featureSelection){
230
                        this.featureType=featureType;
231
                        this.geomName=geomName;
232
                        this.featureSelection=featureSelection;
233
                        this.info=new EvaluatorFieldsInfo();
234
                        this.info.addFieldValue(geomName);
235
                }
236

    
237
                public Object evaluate(EvaluatorData data) throws EvaluatorException {
238
                        if (featureSelection!=null && !featureSelection.isSelected(((Feature)data.getContextValue("feature")))){
239
                                return new Boolean(false);
240
                        }
241
                        DisposableIterator features = null;
242
                        try {
243
                                features = selection.iterator();
244

    
245
                                while (features.hasNext()) {
246
                                        Feature feature = (Feature) features.next();
247
                                        Geometry geometry = feature.getGeometry(index);
248
                                        Evaluator eval = null;
249
                                        switch (action) {
250
                                        case SelectionByTheme.INTERSECTS:
251
                                                eval = new IntersectsGeometryEvaluator(geometry,
252
                                                                projection, featureType, geomName);
253
                                                break;
254
                                        case SelectionByTheme.CONTAINS:
255
                                                eval = new ContainsGeometryEvaluator(geometry,
256
                                                                projection, featureType, geomName);
257
                                                break;
258
                                        case SelectionByTheme.CROSSES:
259
                                                eval = new CrossesGeometryEvaluator(geometry,
260
                                                                projection, featureType, geomName);
261
                                                break;
262
                                        case SelectionByTheme.DISJOINT:
263
                                                eval = new DisjointGeometryEvaluator(geometry,
264
                                                                projection, featureType, geomName);
265
                                                break;
266
                                        case SelectionByTheme.EQUALS:
267
                                                eval = new EqualsGeometryEvaluator(geometry,
268
                                                                projection, featureType, geomName);
269
                                                break;
270
                                        case SelectionByTheme.OVERLAPS:
271
                                                eval = new OverlapsGeometryEvaluator(geometry,
272
                                                                projection, featureType, geomName);
273
                                                break;
274
                                        case SelectionByTheme.TOUCHES:
275
                                                eval = new TouchesGeometryEvaluator(geometry,
276
                                                                projection, featureType, geomName);
277
                                                break;
278
                                        case SelectionByTheme.WITHIN:
279
                                                eval = new WithinGeometryEvaluator(geometry,
280
                                                                projection, featureType, geomName);
281
                                                break;
282

    
283
                                        default:
284
                                                eval = new IntersectsGeometryEvaluator(geometry,
285
                                                                projection, featureType, geomName);
286
                                        break;
287
                                        }
288

    
289
                                        Boolean evaluate = (Boolean) eval.evaluate(data);
290
                                        if ((evaluate).booleanValue()) {
291
                                                return evaluate;
292
                                        }
293
                                }
294
                        } catch (DataException e) {
295
                                NotificationManager.addError("error_selection_by_theme", e);
296
                        } finally {
297
                                DisposeUtils.dispose(features);
298
                        }
299
                        return new Boolean(false);
300
                }
301

    
302
                public String getName() {
303
                        return "select by theme";
304
                }
305

    
306
                public String getSQL() {
307
                        // TODO Auto-generated method stub
308
                        return null;
309
                }
310
                public String getDescription() {
311
                        return getName();
312
                }
313
                public EvaluatorFieldsInfo getFieldsInfo() {
314
                        return info;
315
                }
316
        }
317
}