Revision 43020 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
26 26
import org.cresques.cts.IProjection;
27 27
import org.gvsig.andami.messages.NotificationManager;
28 28
import org.gvsig.fmap.dal.exception.DataException;
29
import org.gvsig.fmap.dal.exception.ReadException;
30 29
import org.gvsig.tools.dispose.DisposableIterator;
31 30
import org.gvsig.fmap.dal.feature.Feature;
32 31
import org.gvsig.fmap.dal.feature.FeatureQuery;
33 32
import org.gvsig.fmap.dal.feature.FeatureSelection;
34 33
import org.gvsig.fmap.dal.feature.FeatureSet;
35 34
import org.gvsig.fmap.dal.feature.FeatureStore;
36
import org.gvsig.fmap.dal.feature.FeatureType;
37 35
import org.gvsig.fmap.geom.Geometry;
38 36
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 37
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;
38
import org.gvsig.fmap.mapcontext.layers.vectorial.SpatialEvaluatorsFactory;
48 39
import org.gvsig.tools.dispose.DisposeUtils;
49 40
import org.gvsig.tools.evaluator.Evaluator;
50 41
import org.gvsig.tools.evaluator.EvaluatorData;
51 42
import org.gvsig.tools.evaluator.EvaluatorException;
52 43
import org.gvsig.tools.evaluator.EvaluatorFieldsInfo;
53 44

  
54

  
55
/**
56
 * DOCUMENT ME!
57
 *
58
 * @author Fernando Gonz?lez Cort?s
59
 */
60
//TODO comentado para que compile
61 45
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 46

  
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);
47
    @Override
48
    public void newSet(FLayer[] layersToSelect, FLayer selectionLayer, int action) {
49
        if (selectionLayer instanceof FLyrVect) {
50
            try {
51
                FeatureSelection selection = ((FLyrVect) selectionLayer).getFeatureStore().getFeatureSelection();
52
                SelectByTheme filter = new SelectByTheme(
53
                        selection,
54
                        selectionLayer.getMapContext().getProjection(),
55
                        action
56
                );
73 57

  
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);
58
                for (FLayer layerToSelect : layersToSelect) {
59
                    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);
71
                        }
72
                    }
73
                }
74
            } catch (Exception e) {
75
                NotificationManager.addError("error_selection_by_theme", e);
76
            }
77
        }
78
    }
83 79

  
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
			}
80
    @Override
81
    public void addToSet(FLayer[] layersToSelect, FLayer selectionLayer, int action) {
82
        if (selectionLayer instanceof FLyrVect) {
83
            try {
84
                FeatureSelection selection = ((FLyrVect) selectionLayer).getFeatureStore().getFeatureSelection();
85
                SelectByTheme filter = new SelectByTheme(
86
                        selection,
87
                        selectionLayer.getMapContext().getProjection(),
88
                        action
89
                );
103 90

  
104
		}
105
		long t2 = System.currentTimeMillis();
106
		System.out
107
				.println("Tiempo de consulta: " + (t2 - t1) + " milisegundos");
108
		// doSelection(toSelect, selectionLayer, action, false);
109
	}
91
                for (FLayer layerToSelect : layersToSelect) {
92
                    if (layerToSelect instanceof FLyrVect) {
93
                        if (!selectionLayer.getFullEnvelope().intersects(layerToSelect.getFullEnvelope())) {
94
                            continue;
95
                        }
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
                        }
111
                    }
112
                }
113
            } catch (Exception e) {
114
                NotificationManager.addError("error_selection_by_theme", e);
115
            }
116
        }
117
    }
110 118

  
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();
119
    @Override
120
    public void fromSet(FLayer[] layersToSelect, FLayer selectionLayer, int action) {
121
        if (selectionLayer instanceof FLyrVect) {
122
            try {
123
                FeatureSelection selection = ((FLyrVect) selectionLayer).getFeatureStore().getFeatureSelection();
124
                SelectByTheme filter = new SelectByTheme(
125
                        selection,
126
                        selectionLayer.getMapContext().getProjection(),
127
                        action
128
                );
117 129

  
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);
130
                for (FLayer layerToSelect : layersToSelect) {
131
                    if (layerToSelect instanceof FLyrVect) {
132
                        if (!selectionLayer.getFullEnvelope().intersects(layerToSelect.getFullEnvelope())) {
133
                            continue;
134
                        }
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
                        }
150
                    }
151
                }
152
            } catch (Exception e) {
153
                NotificationManager.addError("error_selection_by_theme", e);
154
            }
155
        }
156
    }
122 157

  
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);
158
    class SelectByTheme implements Evaluator {
132 159

  
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
			}
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;
156 167

  
157
		}
158
		long t2 = System.currentTimeMillis();
159
		System.out
160
				.println("Tiempo de consulta: " + (t2 - t1) + " milisegundos");
161
	}
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;
177
        }
162 178

  
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);
179
        public void setData(
180
                FeatureStore store,
181
                FeatureSelection featureSelection
182
            ) throws DataException {
183
            this.geomName = store.getDefaultFeatureType().getDefaultGeometryAttributeName();
184
            this.featureSelection = featureSelection;
185
            this.info = new EvaluatorFieldsInfo();
186
            this.info.addFieldValue(this.geomName);
187
        }
173 188

  
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());
189
        @Override
190
        public Object evaluate(EvaluatorData data) throws EvaluatorException {
191
            if (featureSelection != null && !featureSelection.isSelected(((Feature) data.getContextValue("feature")))) {
192
                return false;
193
            }
194
            DisposableIterator features = null;
195
            try {
196
                features = selection.fastIterator();
183 197

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

  
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
			}
260
                        default:
261
                            eval = SpatialEvaluatorsFactory.getInstance().intersects(
262
                                    geometry,
263
                                    projection,
264
                                    store
265
                            );
266
                            break;
267
                    }
204 268

  
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;
269
                    Boolean evaluate = (Boolean) eval.evaluate(data);
270
                    if ( evaluate) {
271
                        return evaluate;
272
                    }
273
                }
274
            } catch (DataException e) {
275
                NotificationManager.addError("error_selection_by_theme", e);
276
            } finally {
277
                DisposeUtils.dispose(features);
278
            }
279
            return false;
280
        }
220 281

  
221
		public SelectByTheme(FeatureSelection selection, IProjection projection,String nameSelectedGeom, int action){
222
			this.selection=selection;
282
        @Override
283
        public String getName() {
284
            return "select by theme";
285
        }
223 286

  
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
		}
287
        @Override
288
        public String getSQL() {
289
            return null;
290
        }
236 291

  
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.fastIterator();
292
        @Override
293
        public String getDescription() {
294
            return getName();
295
        }
244 296

  
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
	}
297
        @Override
298
        public EvaluatorFieldsInfo getFieldsInfo() {
299
            return info;
300
        }
301
    }
317 302
}

Also available in: Unified diff