Revision 43704 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

View differences:

MySelectionByThemeListener.java
23 23
 */
24 24
package org.gvsig.app.gui.selectionByTheme;
25 25

  
26
import org.apache.commons.lang3.mutable.MutableLong;
26 27
import org.cresques.cts.IProjection;
27
import org.gvsig.andami.messages.NotificationManager;
28
import org.gvsig.fmap.dal.exception.DataException;
29
import org.gvsig.tools.dispose.DisposableIterator;
30 28
import org.gvsig.fmap.dal.feature.Feature;
31 29
import org.gvsig.fmap.dal.feature.FeatureQuery;
32 30
import org.gvsig.fmap.dal.feature.FeatureSelection;
......
36 34
import org.gvsig.fmap.mapcontext.layers.FLayer;
37 35
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
38 36
import org.gvsig.fmap.mapcontext.layers.vectorial.SpatialEvaluatorsFactory;
37
import org.gvsig.tools.ToolsLocator;
39 38
import org.gvsig.tools.dispose.DisposeUtils;
40 39
import org.gvsig.tools.evaluator.Evaluator;
41
import org.gvsig.tools.evaluator.EvaluatorData;
42
import org.gvsig.tools.evaluator.EvaluatorException;
43
import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
40
import org.gvsig.tools.exception.BaseException;
41
import org.gvsig.tools.i18n.I18nManager;
42
import org.gvsig.tools.task.SimpleTaskStatus;
43
import org.gvsig.tools.visitor.VisitCanceledException;
44
import org.gvsig.tools.visitor.Visitor;
45
import org.slf4j.Logger;
46
import org.slf4j.LoggerFactory;
44 47

  
45 48
public class MySelectionByThemeListener implements SelectionByThemeListener {
49
    private static final Logger logger = LoggerFactory.getLogger(MySelectionByThemeListener.class);
46 50

  
47 51
    @Override
48
    public void newSet(FLayer[] layersToSelect, FLayer selectionLayer, int action) {
52
    public void newSet(FLayer[] layersToSelect, FLayer selectionLayer, final int action, final SimpleTaskStatus status) {
49 53
        if (selectionLayer instanceof FLyrVect) {
54
            logger.info("SelectByLayer begin newSet, action "+action);
55
            status.message(getActionLabel(action));
56
            status.setIndeterminate();
50 57
            try {
58
                if( action == SelectionByTheme.INTERSECTS ) {
59
                    IntersectOperation operation = new IntersectOperation();
60
                    for (FLayer layerToSelect : layersToSelect) {
61
                        if (layerToSelect instanceof FLyrVect) {
62
                            FeatureStore store1 = ((FLyrVect) selectionLayer).getFeatureStore();
63
                            FeatureStore store2 = ((FLyrVect) layerToSelect).getFeatureStore();
64
                            FeatureSelection selection = operation.execute(
65
                                    store1, store2, status
66
                            );
67
                            if( selection!=null ) {
68
                                store2.setSelection(selection);
69
                            }
70
                        }
71
                    }
72
                    return;
73
                }
51 74
                FeatureSelection selection = ((FLyrVect) selectionLayer).getFeatureStore().getFeatureSelection();
52
                SelectByTheme filter = new SelectByTheme(
53
                        selection,
54
                        selectionLayer.getMapContext().getProjection(),
55
                        action
56
                );
57

  
75
                final IProjection projection = selectionLayer.getMapContext().getProjection();
58 76
                for (FLayer layerToSelect : layersToSelect) {
59 77
                    if (layerToSelect instanceof FLyrVect) {
60
                        FeatureStore storeToQuery = ((FLyrVect) layerToSelect).getFeatureStore();
61
                        FeatureQuery fQuery = storeToQuery.createFeatureQuery();
62
                        filter.setData(storeToQuery, null);
63
                        fQuery.setFilter(filter);
64
                        FeatureSet featureSet = null;
65
                        try {
66
                            featureSet = storeToQuery.getFeatureSet(fQuery);
67
                            storeToQuery.getFeatureSelection().deselectAll();
68
                            storeToQuery.setSelection(featureSet);
69
                        } finally {
70
                            DisposeUtils.disposeQuietly(featureSet);
78
                        final FeatureStore storeToQuery = ((FLyrVect) layerToSelect).getFeatureStore();
79
                        final FeatureSelection newSelection = storeToQuery.createFeatureSelection();
80
                        final MutableLong count = new MutableLong(0);
81
                        status.setRangeOfValues(0, selection.getSelectedCount());
82
                        status.message(getActionLabel(action));
83
                        selection.accept(new Visitor() {
84
                            @Override
85
                            public void visit(Object o) throws VisitCanceledException, BaseException {
86
                                if( status.isCancellationRequested() ) {
87
                                    throw new VisitCanceledException();
88
                                }
89
                                Feature f = (Feature)o;
90
                                FeatureSet featureSet = null;
91
                                try {
92
                                    Geometry geometry = f.getDefaultGeometry();
93
                                    Evaluator filter = createEvaluatorFromAction(action, projection, geometry, storeToQuery);
94
                                    FeatureQuery fQuery = storeToQuery.createFeatureQuery();
95
                                    fQuery.setFilter(filter);
96
                                    featureSet = storeToQuery.getFeatureSet(fQuery);
97
                                    newSelection.select(featureSet);
98
                                } finally {
99
                                    DisposeUtils.disposeQuietly(featureSet);
100
                                }
101
                                count.add(1);
102
                                status.setCurValue(count.longValue());
103
                            }
104
                        });
105
                        if( status.isCancellationRequested() ) {
106
                            status.cancel();
107
                            break;
71 108
                        }
109
                        storeToQuery.setSelection(newSelection);
72 110
                    }
73 111
                }
74 112
            } catch (Exception e) {
75
                NotificationManager.addError("error_selection_by_theme", e);
113
                logger.warn("error_selection_by_theme", e);
114
            } finally {
115
                logger.info("SelectByLayer end newSet.");
76 116
            }
77 117
        }
78 118
    }
79 119

  
80 120
    @Override
81
    public void addToSet(FLayer[] layersToSelect, FLayer selectionLayer, int action) {
121
    public void addToSet(FLayer[] layersToSelect, FLayer selectionLayer, final int action, final SimpleTaskStatus status) {
82 122
        if (selectionLayer instanceof FLyrVect) {
123
            logger.info("SelectByLayer begin addToSet, action "+action);
124
            status.message(getActionLabel(action));
125
            status.setIndeterminate();
83 126
            try {
84 127
                FeatureSelection selection = ((FLyrVect) selectionLayer).getFeatureStore().getFeatureSelection();
85
                SelectByTheme filter = new SelectByTheme(
86
                        selection,
87
                        selectionLayer.getMapContext().getProjection(),
88
                        action
89
                );
90

  
128
                final IProjection projection = selectionLayer.getMapContext().getProjection();
91 129
                for (FLayer layerToSelect : layersToSelect) {
92 130
                    if (layerToSelect instanceof FLyrVect) {
93
                        if (!selectionLayer.getFullEnvelope().intersects(layerToSelect.getFullEnvelope())) {
94
                            continue;
131
                        final FeatureStore storeToQuery = ((FLyrVect) layerToSelect).getFeatureStore();
132
                        final FeatureSelection newSelection = storeToQuery.createFeatureSelection();
133
                        final MutableLong count = new MutableLong(0);
134
                        status.setRangeOfValues(0, selection.getSelectedCount());
135
                        status.message(getActionLabel(action));
136
                        selection.accept(new Visitor() {
137
                            @Override
138
                            public void visit(Object o) throws VisitCanceledException, BaseException {
139
                                if( status.isCancellationRequested() ) {
140
                                    throw new VisitCanceledException();
141
                                }
142
                                Feature f = (Feature)o;
143
                                FeatureSet featureSet = null;
144
                                try {
145
                                    Geometry geometry = f.getDefaultGeometry();
146
                                    Evaluator filter = createEvaluatorFromAction(action, projection, geometry, storeToQuery);
147
                                    FeatureQuery fQuery = storeToQuery.createFeatureQuery();
148
                                    fQuery.setFilter(filter);
149
                                    featureSet = storeToQuery.getFeatureSet(fQuery);
150
                                    newSelection.select(featureSet);
151
                                } finally {
152
                                    DisposeUtils.disposeQuietly(featureSet);
153
                                }
154
                                count.add(1);
155
                                status.setCurValue(count.longValue());
156
                            }
157
                        });
158
                        if( status.isCancellationRequested() ) {
159
                            status.cancel();
160
                            break;
95 161
                        }
96
                        FeatureStore storeToQuery = ((FLyrVect) layerToSelect).getFeatureStore();
97
                        FeatureQuery fQuery = storeToQuery.createFeatureQuery();
98
                        filter.setData(storeToQuery, null);
99
                        fQuery.setFilter(filter);
100
                        FeatureSet newFeatureSet = null;
101
                        FeatureSelection previousFeatureSet = null;
102
                        try {
103
                            newFeatureSet = storeToQuery.getFeatureSet(fQuery);
104
                            previousFeatureSet = storeToQuery.getFeatureSelection();
105
                            previousFeatureSet.select(newFeatureSet);
106
                            storeToQuery.setSelection(previousFeatureSet);
107
                        } finally {
108
                            DisposeUtils.disposeQuietly(newFeatureSet);
109
                            DisposeUtils.disposeQuietly(previousFeatureSet);
110
                        }
162
                        storeToQuery.getFeatureSelection().select(newSelection);
111 163
                    }
112 164
                }
113 165
            } catch (Exception e) {
114
                NotificationManager.addError("error_selection_by_theme", e);
166
                logger.warn("error_selection_by_theme", e);
115 167
            }
168
            logger.info("SelectByLayer end addToSet.");
116 169
        }
117 170
    }
118 171

  
119 172
    @Override
120
    public void fromSet(FLayer[] layersToSelect, FLayer selectionLayer, int action) {
173
    public void fromSet(FLayer[] layersToSelect, FLayer selectionLayer, final int action, final SimpleTaskStatus status) {
121 174
        if (selectionLayer instanceof FLyrVect) {
175
            logger.info("SelectByLayer begin fromSet, action "+getActionLabel(action));
176
            status.message(getActionLabel(action));
177
            status.setIndeterminate();
122 178
            try {
123 179
                FeatureSelection selection = ((FLyrVect) selectionLayer).getFeatureStore().getFeatureSelection();
124
                SelectByTheme filter = new SelectByTheme(
125
                        selection,
126
                        selectionLayer.getMapContext().getProjection(),
127
                        action
128
                );
129

  
180
                final IProjection projection = selectionLayer.getMapContext().getProjection();
130 181
                for (FLayer layerToSelect : layersToSelect) {
131 182
                    if (layerToSelect instanceof FLyrVect) {
132
                        if (!selectionLayer.getFullEnvelope().intersects(layerToSelect.getFullEnvelope())) {
133
                            continue;
183
                        final FeatureStore storeToQuery = ((FLyrVect) layerToSelect).getFeatureStore();
184
                        final FeatureSelection currentSelection = storeToQuery.getFeatureSelection();
185
                        final FeatureSelection newSelection = storeToQuery.createFeatureSelection();
186
                        final MutableLong count = new MutableLong(0);
187
                        status.setRangeOfValues(0, selection.getSelectedCount());
188
                        status.message(getActionLabel(action));
189
                        selection.accept(new Visitor() {
190
                            @Override
191
                            public void visit(Object o) throws VisitCanceledException, BaseException {
192
                                if( status.isCancellationRequested() ) {
193
                                    throw new VisitCanceledException();
194
                                }
195
                                Feature f = (Feature)o;
196
                                if( !currentSelection.isSelected(f) ) {
197
                                    return;
198
                                }
199
                                FeatureSet featureSet = null;
200
                                try {
201
                                    Geometry geometry = f.getDefaultGeometry();
202
                                    Evaluator filter = createEvaluatorFromAction(action, projection, geometry, storeToQuery);
203
                                    FeatureQuery fQuery = storeToQuery.createFeatureQuery();
204
                                    fQuery.setFilter(filter);
205
                                    featureSet = storeToQuery.getFeatureSet(fQuery);
206
                                    newSelection.select(featureSet);
207
                                } finally {
208
                                    DisposeUtils.disposeQuietly(featureSet);
209
                                }
210
                                count.add(1);
211
                                status.setCurValue(count.longValue());
212
                            }
213
                        });
214
                        if( status.isCancellationRequested() ) {
215
                            status.cancel();
216
                            break;
134 217
                        }
135
                        FeatureStore storeToQuery = ((FLyrVect) layerToSelect).getFeatureStore();
136
                        FeatureQuery fQuery = storeToQuery.createFeatureQuery();
137
                        filter.setData(
138
                                storeToQuery,
139
                                (FeatureSelection) storeToQuery.getSelection()
140
                        );
141
                        fQuery.setFilter(filter);
142
                        FeatureSet featureSet = null;
143
                        try {
144
                            featureSet = storeToQuery.getFeatureSet(fQuery);
145
                            storeToQuery.getFeatureSelection().deselectAll();
146
                            storeToQuery.setSelection(featureSet);
147
                        } finally {
148
                            DisposeUtils.disposeQuietly(featureSet);
149
                        }
218
                        storeToQuery.getFeatureSelection().select(newSelection);
150 219
                    }
151 220
                }
152 221
            } catch (Exception e) {
153
                NotificationManager.addError("error_selection_by_theme", e);
222
                logger.warn("error_selection_by_theme", e);
154 223
            }
224
            logger.info("SelectByLayer end fromSet.");
155 225
        }
156 226
    }
157

  
158
    class SelectByTheme implements Evaluator {
159

  
160
        private FeatureSelection selection = null;
161
        private final IProjection projection;
162
        private FeatureStore store;
163
        private String geomName;
164
        private EvaluatorFieldsInfo info;
165
        private FeatureSelection featureSelection;
166
        private final int action;
167

  
168
        
169
        public SelectByTheme(
170
                FeatureSelection selection,
171
                IProjection projection,
172
                int action
173
        ) {
174
            this.selection = selection;
175
            this.projection = projection;
176
            this.action = action;
227
    
228
    private String getActionLabel(int action) {
229
        I18nManager i18n = ToolsLocator.getI18nManager();
230
        switch (action) {
231
            case SelectionByTheme.INTERSECTS:
232
                return i18n.getTranslation("Intersecten_con");
233
            case SelectionByTheme.CONTAINS:
234
                return i18n.getTranslation("Contengan");
235
            case SelectionByTheme.CROSSES:
236
                return i18n.getTranslation("Crucen_con");
237
            case SelectionByTheme.DISJOINT:
238
                return i18n.getTranslation("Sean_disjuntos_a");
239
            case SelectionByTheme.EQUALS:
240
                return i18n.getTranslation("Sean_iguales_a");
241
            case SelectionByTheme.OVERLAPS:
242
                return i18n.getTranslation("Se_superponen_a");
243
            case SelectionByTheme.TOUCHES:
244
                return i18n.getTranslation("Toquen");
245
            case SelectionByTheme.WITHIN:
246
                return i18n.getTranslation("Esten_contenidos_en");
247
            default:
248
                return i18n.getTranslation("Intersecten_con");
177 249
        }
250
    }
251
    
252
    private Evaluator createEvaluatorFromAction(int action, IProjection projection, Geometry geometry, FeatureStore store) {
253
        Evaluator eval;
254
        switch (action) {
255
            case SelectionByTheme.INTERSECTS:
256
                eval = SpatialEvaluatorsFactory.getInstance().intersects(
257
                        geometry,
258
                        projection,
259
                        store
260
                );
261
                break;
262
            case SelectionByTheme.CONTAINS:
263
                eval = SpatialEvaluatorsFactory.getInstance().contains(
264
                        geometry,
265
                        projection,
266
                        store
267
                );
268
                break;
269
            case SelectionByTheme.CROSSES:
270
                eval = SpatialEvaluatorsFactory.getInstance().crosses(
271
                        geometry,
272
                        projection,
273
                        store
274
                );
275
                break;
276
            case SelectionByTheme.DISJOINT:
277
                eval = SpatialEvaluatorsFactory.getInstance().disjoint(
278
                        geometry,
279
                        projection,
280
                        store
281
                );
282
                break;
283
            case SelectionByTheme.EQUALS:
284
                eval = SpatialEvaluatorsFactory.getInstance().equals(
285
                        geometry,
286
                        projection,
287
                        store
288
                );
289
                break;
290
            case SelectionByTheme.OVERLAPS:
291
                eval = SpatialEvaluatorsFactory.getInstance().overlaps(
292
                        geometry,
293
                        projection,
294
                        store
295
                );
296
                break;
297
            case SelectionByTheme.TOUCHES:
298
                eval = SpatialEvaluatorsFactory.getInstance().touches(
299
                        geometry,
300
                        projection,
301
                        store
302
                );
303
                break;
304
            case SelectionByTheme.WITHIN:
305
                eval = SpatialEvaluatorsFactory.getInstance().within(
306
                        geometry,
307
                        projection,
308
                        store
309
                );
310
                break;
178 311

  
179
        public void setData(
180
                FeatureStore store,
181
                FeatureSelection featureSelection
182
            ) throws DataException {
183
            this.store = store;
184
            this.geomName = store.getDefaultFeatureType().getDefaultGeometryAttributeName();
185
            this.featureSelection = featureSelection;
186
            this.info = new EvaluatorFieldsInfo();
187
            this.info.addFieldValue(this.geomName);
312
            default:
313
                eval = SpatialEvaluatorsFactory.getInstance().intersects(
314
                        geometry,
315
                        projection,
316
                        store
317
                );
318
                break;
188 319
        }
189

  
190
        @Override
191
        public Object evaluate(EvaluatorData data) throws EvaluatorException {
192
            if (featureSelection != null && !featureSelection.isSelected(((Feature) data.getContextValue("feature")))) {
193
                return false;
194
            }
195
            DisposableIterator features = null;
196
            try {
197
                features = selection.fastIterator();
198

  
199
                while (features.hasNext()) {
200
                    Feature feature = (Feature) features.next();
201
                    Geometry geometry = feature.getGeometry(geomName);
202
                    Evaluator eval;
203
                    switch (action) {
204
                        case SelectionByTheme.INTERSECTS:
205
                            eval = SpatialEvaluatorsFactory.getInstance().intersects(
206
                                    geometry,
207
                                    projection,
208
                                    store
209
                            );
210
                            break;
211
                        case SelectionByTheme.CONTAINS:
212
                            eval = SpatialEvaluatorsFactory.getInstance().contains(
213
                                    geometry,
214
                                    projection,
215
                                    store
216
                            );
217
                            break;
218
                        case SelectionByTheme.CROSSES:
219
                            eval = SpatialEvaluatorsFactory.getInstance().crosses(
220
                                    geometry,
221
                                    projection,
222
                                    store
223
                            );
224
                            break;
225
                        case SelectionByTheme.DISJOINT:
226
                            eval = SpatialEvaluatorsFactory.getInstance().disjoint(
227
                                    geometry,
228
                                    projection,
229
                                    store
230
                            );
231
                            break;
232
                        case SelectionByTheme.EQUALS:
233
                            eval = SpatialEvaluatorsFactory.getInstance().equals(
234
                                    geometry,
235
                                    projection,
236
                                    store
237
                            );
238
                            break;
239
                        case SelectionByTheme.OVERLAPS:
240
                            eval = SpatialEvaluatorsFactory.getInstance().overlaps(
241
                                    geometry,
242
                                    projection,
243
                                    store
244
                            );
245
                            break;
246
                        case SelectionByTheme.TOUCHES:
247
                            eval = SpatialEvaluatorsFactory.getInstance().touches(
248
                                    geometry,
249
                                    projection,
250
                                    store
251
                            );
252
                            break;
253
                        case SelectionByTheme.WITHIN:
254
                            eval = SpatialEvaluatorsFactory.getInstance().within(
255
                                    geometry,
256
                                    projection,
257
                                    store
258
                            );
259
                            break;
260

  
261
                        default:
262
                            eval = SpatialEvaluatorsFactory.getInstance().intersects(
263
                                    geometry,
264
                                    projection,
265
                                    store
266
                            );
267
                            break;
268
                    }
269

  
270
                    Boolean evaluate = (Boolean) eval.evaluate(data);
271
                    if ( evaluate) {
272
                        return evaluate;
273
                    }
274
                }
275
            } catch (DataException e) {
276
                NotificationManager.addError("error_selection_by_theme", e);
277
            } finally {
278
                DisposeUtils.dispose(features);
279
            }
280
            return false;
281
        }
282

  
283
        @Override
284
        public String getName() {
285
            return "select by theme";
286
        }
287

  
288
        @Override
289
        public String getSQL() {
290
            return null;
291
        }
292

  
293
        @Override
294
        public String getDescription() {
295
            return getName();
296
        }
297

  
298
        @Override
299
        public EvaluatorFieldsInfo getFieldsInfo() {
300
            return info;
301
        }
320
        return eval;
302 321
    }
303 322
}

Also available in: Unified diff