Revision 46089

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/DefaultEditableFeature.java
518 518
                continue;
519 519
            }
520 520
            String attrname = attr.getName();
521
            if( sourceType.getAttributeDescriptor(attrname)==null ) {
521
            if( sourceType.getAttributeDescriptorFromAll(attrname)==null ) {
522 522
              continue;
523 523
            }
524 524
            Object value = source.get(attrname);
trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.app/org.gvsig.app.mainplugin/src/main/java/org/gvsig/app/project/documents/view/dalactions/AddFilterToLayerAction.java
1
package org.gvsig.app.project.documents.view.dalactions;
2

  
3
import java.awt.event.ActionEvent;
4
import javax.swing.AbstractAction;
5
import javax.swing.Action;
6
import org.gvsig.app.ApplicationLocator;
7
import org.gvsig.app.ApplicationManager;
8
import org.gvsig.app.project.documents.view.ViewDocument;
9
import org.gvsig.expressionevaluator.Expression;
10
import org.gvsig.fmap.dal.DataStore;
11
import org.gvsig.fmap.dal.feature.FeatureQuery;
12
import org.gvsig.fmap.dal.feature.FeatureStore;
13
import org.gvsig.fmap.dal.swing.AbstractDALActionFactory;
14
import org.gvsig.tools.ToolsLocator;
15
import org.gvsig.tools.i18n.I18nManager;
16
import org.gvsig.tools.swing.api.ToolsSwingLocator;
17
import org.slf4j.Logger;
18
import org.slf4j.LoggerFactory;
19
import org.gvsig.fmap.dal.swing.DALActionFactory.DALActionContext;
20
import org.gvsig.fmap.dal.swing.DALSwingLocator;
21
import org.gvsig.fmap.dal.swing.DataSwingManager;
22
import org.gvsig.fmap.mapcontext.layers.FLayer;
23
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
24

  
25
/**
26
 *
27
 * @author jjdelcerro
28
 */
29
@SuppressWarnings("UseSpecificCatch")
30
public class AddFilterToLayerAction 
31
        extends AbstractAction 
32
    {
33

  
34
    public static class AddFilterToLayerActionFactory extends AbstractDALActionFactory {
35

  
36
        public static final String ACTION_NAME = "AddFilterToLayerAction";
37
    
38
        public AddFilterToLayerActionFactory() {
39
            super(ACTION_NAME);
40
        }
41

  
42
        @Override
43
        public Action createAction(DALActionContext context) {
44
            return new AddFilterToLayerAction(context);
45
        }
46
		
47
		public static void selfRegister() {
48
            DataSwingManager dalSwingManager = DALSwingLocator.getSwingManager();
49
            dalSwingManager.registerStoreAction(new AddFilterToLayerAction.AddFilterToLayerActionFactory());
50
        }
51
    }
52
    
53
    private static final Logger LOGGER = LoggerFactory.getLogger(AddFilterToLayerAction.class);
54
    
55
    private final DALActionContext context;
56

  
57
    public AddFilterToLayerAction(DALActionContext context) {
58
        this.context = context;
59
        I18nManager i18n = ToolsLocator.getI18nManager();
60
        this.putValue(
61
                Action.ACTION_COMMAND_KEY, 
62
                AddFilterToLayerActionFactory.ACTION_NAME
63
        );
64
        this.putValue(
65
                Action.SHORT_DESCRIPTION, 
66
                i18n.getTranslation("_Add_filter_to_layer")
67
        );
68
        this.putValue(
69
                Action.SMALL_ICON, 
70
                ToolsSwingLocator.getIconThemeManager().getCurrent().get("filter-by-attributes-layer")
71
        );
72
    }
73
	
74
	private FLyrVect getFLyrVect(FeatureStore store) {
75
		ApplicationManager aplication = ApplicationLocator.getApplicationManager();
76
		FLayer layer = aplication.getCurrentLayer();
77
		if(layer instanceof FLyrVect && ((FLyrVect)layer).getFeatureStore()==store) {
78
			return (FLyrVect) layer;
79
		}
80
		ViewDocument viewDoc = (ViewDocument) aplication.getActiveDocument(ViewDocument.class);
81
		if (viewDoc==null) {
82
			return null;
83
		}
84
		for (FLayer layer1 : viewDoc.getMapContext().getLayers().getLayers(null)) {
85
			if (layer1 instanceof FLyrVect && ((FLyrVect)layer1).getFeatureStore()==store) {
86
				return (FLyrVect) layer1;
87
			}
88
		}
89
		return null;
90
	}
91
    
92
    @Override
93
    public void actionPerformed(ActionEvent e) {
94
        try {
95
            DataStore store = this.context.getStore();
96
            if( !(store instanceof FeatureStore) ) {
97
                return ;
98
            }
99
            FeatureStore featureStore = (FeatureStore) store;
100
			FLyrVect layer = getFLyrVect(featureStore);
101
			
102
            FeatureQuery query = this.context.getQuery();
103
            FeatureQuery layerQuery = null;
104
            if (query != null){
105
                Expression expFilter = query.getExpressionFilter();
106
                if (expFilter != null && !expFilter.isEmpty()){
107
                    if( layerQuery==null ) {
108
                        layerQuery = featureStore.createFeatureQuery();
109
                    }
110
                    layerQuery.addFilter(expFilter);
111
                    layerQuery.retrievesAllAttributes();
112
                }
113
                if( query.hasOrder() ) {
114
                    if( layerQuery==null ) {
115
                        layerQuery = featureStore.createFeatureQuery();
116
                    }
117
                    layerQuery.getOrder().copyFrom(query.getOrder());
118
                }
119
                if( layerQuery==null ) {
120
//                  # Si el usuario pulso en OK sin haber introducido un filtro quitamos
121
//                  # el filtro que pudiese tener la capa.
122
                    layer.setBaseQuery(null);
123
                } else {
124
                    layer.setBaseQuery(layerQuery);
125
                }
126
//              # Por ultimo forzamos un repintado de la vista.
127
				layer.getMapContext().invalidate();
128
            }
129
        
130
        } catch (Exception ex) {
131
            LOGGER.warn("Can't build selecction.", ex);
132
        }
133
    }
134

  
135
}
trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.app/org.gvsig.app.mainplugin/src/main/java/org/gvsig/app/project/documents/view/dalactions/CreateTemporalLayerAction.java
1
package org.gvsig.app.project.documents.view.dalactions;
2

  
3
import java.awt.event.ActionEvent;
4
import java.io.File;
5
import java.util.HashMap;
6
import java.util.Map;
7
import java.util.UUID;
8
import javax.swing.AbstractAction;
9
import javax.swing.Action;
10
import org.gvsig.app.ApplicationLocator;
11
import org.gvsig.app.ApplicationManager;
12
import org.gvsig.app.project.documents.Document;
13
import org.gvsig.app.project.documents.view.ViewDocument;
14
import org.gvsig.app.project.documents.view.gui.IView;
15
import org.gvsig.expressionevaluator.Expression;
16
import org.gvsig.fmap.dal.DALLocator;
17
import org.gvsig.fmap.dal.DataManager;
18
import org.gvsig.fmap.dal.DataServerExplorerParameters;
19
import org.gvsig.fmap.dal.DataStore;
20
import org.gvsig.fmap.dal.DataStoreParameters;
21
import org.gvsig.fmap.dal.DataTypes;
22
import org.gvsig.fmap.dal.feature.EditableFeature;
23
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
24
import org.gvsig.fmap.dal.feature.EditableFeatureType;
25
import org.gvsig.fmap.dal.feature.Feature;
26
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
27
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
28
import org.gvsig.fmap.dal.feature.FeatureQuery;
29
import org.gvsig.fmap.dal.feature.FeatureSet;
30
import org.gvsig.fmap.dal.feature.FeatureStore;
31
import org.gvsig.fmap.dal.feature.FeatureType;
32
import org.gvsig.fmap.dal.store.jdbc.JDBCNewStoreParameters;
33
import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer;
34
import org.gvsig.fmap.dal.swing.AbstractDALActionFactory;
35
import org.gvsig.tools.ToolsLocator;
36
import org.gvsig.tools.i18n.I18nManager;
37
import org.gvsig.tools.swing.api.ToolsSwingLocator;
38
import org.slf4j.Logger;
39
import org.slf4j.LoggerFactory;
40
import org.gvsig.fmap.dal.swing.DALActionFactory.DALActionContext;
41
import org.gvsig.fmap.dal.swing.DALSwingLocator;
42
import org.gvsig.fmap.dal.swing.DataSwingManager;
43
import org.gvsig.fmap.mapcontext.MapContextLocator;
44
import org.gvsig.fmap.mapcontext.layers.FLayer;
45
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
46
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
47
import org.gvsig.fmap.mapcontext.rendering.legend.IVectorLegend;
48
import org.gvsig.tools.dataTypes.DataType;
49
import org.gvsig.tools.dispose.DisposeUtils;
50
import org.gvsig.tools.folders.FoldersManager;
51
import org.gvsig.tools.namestranslator.NamesTranslator;
52
import org.gvsig.tools.util.HasAFile;
53

  
54
/**
55
 *
56
 * @author jjdelcerro
57
 */
58
@SuppressWarnings("UseSpecificCatch")
59
public class CreateTemporalLayerAction
60
	extends AbstractAction {
61

  
62
	public static class CreateTemporalLayerActionFactory extends AbstractDALActionFactory {
63

  
64
		public static final String ACTION_NAME = "CreateTemporalLayerAction";
65

  
66
		public CreateTemporalLayerActionFactory() {
67
			super(ACTION_NAME);
68
		}
69

  
70
		@Override
71
		public Action createAction(DALActionContext context) {
72
			return new CreateTemporalLayerAction(context);
73
		}
74

  
75
		public static void selfRegister() {
76
			DataSwingManager dalSwingManager = DALSwingLocator.getSwingManager();
77
			dalSwingManager.registerStoreAction(new CreateTemporalLayerAction.CreateTemporalLayerActionFactory());
78
		}
79
	}
80

  
81
	private static final Logger LOGGER = LoggerFactory.getLogger(CreateTemporalLayerAction.class);
82

  
83
	private final DALActionContext context;
84

  
85
	public CreateTemporalLayerAction(DALActionContext context) {
86
		this.context = context;
87
		I18nManager i18n = ToolsLocator.getI18nManager();
88
		this.putValue(
89
			Action.ACTION_COMMAND_KEY,
90
			CreateTemporalLayerActionFactory.ACTION_NAME
91
		);
92
		this.putValue(
93
			Action.SHORT_DESCRIPTION,
94
			i18n.getTranslation("_Create_layer_filtered")
95
		);
96
		this.putValue(
97
			Action.SMALL_ICON,
98
			ToolsSwingLocator.getIconThemeManager().getCurrent().get("view-layer-add")
99
		);
100
	}
101

  
102
	private FeatureStore createTemporaryH2Store(String name, FeatureType ft_sourceStore, FeatureQuery query) throws Exception {
103
		FoldersManager foldersManager = ToolsLocator.getFoldersManager();
104
		File tempFile = foldersManager.getUniqueTemporaryFile(name + UUID.randomUUID().toString());
105

  
106
		// crear SERVER STORE
107
		DataManager dataManager = DALLocator.getDataManager();
108
		DataServerExplorerParameters serverParameters = dataManager.createServerExplorerParameters("H2Spatial");
109
		((HasAFile) serverParameters).setFile(tempFile);
110
		JDBCServerExplorer serverExplorer = (JDBCServerExplorer) dataManager.openServerExplorer("H2Spatial", serverParameters);
111

  
112
		//Crear tablas en server store
113
		JDBCNewStoreParameters newParametersTarget = serverExplorer.getAddParameters();
114
		newParametersTarget.setDynValue("Table", name);
115
		EditableFeatureType ft_targetStore = dataManager.createFeatureType();
116
		ft_targetStore.addAll(ft_sourceStore);
117
		boolean ignoreDefaultGeometry = false;
118

  
119
		for (EditableFeatureAttributeDescriptor column : query.getExtraColumn().getColumns()) {
120
			if (column.getType() == DataTypes.GEOMETRY) {
121
				ignoreDefaultGeometry = true;
122
			}
123
		}
124
		for (FeatureAttributeDescriptor attr : ft_sourceStore) {
125
			DataType dataType = attr.getDataType();
126
			EditableFeatureAttributeDescriptor eattr = ft_targetStore.getEditableAttributeDescriptor(attr.getName());
127
			if (dataType.isContainer()) {
128
				ft_targetStore.remove(attr.getName());
129
				continue;
130
			}
131
			if (dataType.getType() == DataTypes.GEOMETRY && ignoreDefaultGeometry) {
132
				ft_targetStore.remove(attr.getName());
133
				continue;
134
			}
135
			if (eattr.isComputed()) {
136
				eattr.setFeatureAttributeEmulator((FeatureAttributeEmulator) null);
137
			}
138
			if (eattr.isPrimaryKey()) {
139
				eattr.setIsPrimaryKey(false);
140
			}
141
			if (!eattr.allowIndexDuplicateds()) {
142
				eattr.setAllowIndexDuplicateds(true);
143
			}
144
		}
145
		Map<String, EditableFeatureAttributeDescriptor> allExtraColumns = new HashMap<>();
146
		for (EditableFeatureAttributeDescriptor column : ft_sourceStore.getExtraColumns().getColumns()) {
147
			allExtraColumns.put(column.getName(), column);
148
		}
149
		for (EditableFeatureAttributeDescriptor column : query.getExtraColumn().getColumns()) {
150
			allExtraColumns.put(column.getName(), column);
151
		}
152
		if (allExtraColumns.size() > 0) {
153
			for (EditableFeatureAttributeDescriptor column : allExtraColumns.values()) {
154
				DataType dataType = column.getDataType();
155
				if (!dataType.isContainer()) {
156
					EditableFeatureAttributeDescriptor attr;
157
//					if (column.getType() == DataTypes.GEOMETRY) {
158
//						attr = ft_targetStore.add(column.getName(), DataTypes.GEOMETRY);
159
//						//attr.setGeometryType(column.getGeomType().getType(), column.getGeomType().getSubType());
160
//					} else {
161
//						attr = ft_targetStore.add(column.getName(), column.getType(), column.getSize());
162
//					}
163
					attr = ft_targetStore.add(column.getName(), column.getType());
164
					attr.copyFrom(column);
165
					attr.setFeatureAttributeEmulator((Expression)null);
166
				}
167
			}
168
		}
169
		NamesTranslator tr = NamesTranslator.createBaseTranslator();
170
		for (FeatureAttributeDescriptor attr : ft_targetStore) {
171
			tr.addSource(attr.getName());
172
		}
173
		String suggestedPk = tr.getSuggestion("ID");
174
		EditableFeatureAttributeDescriptor pkAttr = ft_targetStore.add(suggestedPk, DataTypes.LONG);
175
		pkAttr.setIsPrimaryKey(true);
176
		newParametersTarget.setDefaultFeatureType(ft_targetStore);
177

  
178
		serverExplorer.add("H2Spatial", newParametersTarget, true);
179

  
180
		DataStoreParameters openParametersTarget = dataManager.createStoreParameters("H2Spatial");
181
		openParametersTarget.setDynValue("database_file", tempFile);
182
		openParametersTarget.setDynValue("Table", name);
183

  
184
		//Creaci?n del store con los resultados
185
		FeatureStore storeResults = (FeatureStore) dataManager.openStore("H2Spatial", openParametersTarget);
186
		return storeResults;
187

  
188
	}
189

  
190
	private FLyrVect getFLyrVect(FeatureStore store) {
191
		ApplicationManager aplication = ApplicationLocator.getApplicationManager();
192
		FLayer layer = aplication.getCurrentLayer();
193
		if (layer instanceof FLyrVect && ((FLyrVect) layer).getFeatureStore() == store) {
194
			return (FLyrVect) layer;
195
		}
196
		ViewDocument viewDoc = (ViewDocument) aplication.getActiveDocument(ViewDocument.class);
197
		if (viewDoc == null) {
198
			return null;
199
		}
200
		for (FLayer layer1 : viewDoc.getMapContext().getLayers().getLayers(null)) {
201
			if (layer1 instanceof FLyrVect && ((FLyrVect) layer1).getFeatureStore() == store) {
202
				return (FLyrVect) layer1;
203
			}
204
		}
205
		return null;
206
	}
207

  
208
	@Override
209
	public void actionPerformed(ActionEvent e) {
210
		FeatureStore featureStore = null;
211
		FeatureStore targetStore = null;
212
		FeatureSet fs = null;
213
		ApplicationManager aplication = ApplicationLocator.getApplicationManager();
214
		try {
215
			Document viewDoc = aplication.getActiveDocument(ViewDocument.class);
216
			if (viewDoc == null) {
217
				//msgbox
218
				return;
219
			}
220
			DataStore store = this.context.getStore();
221
			if (!(store instanceof FeatureStore)) {
222
				return;
223
			}
224
			featureStore = (FeatureStore) store;
225

  
226
			FeatureQuery query = this.context.getQuery();
227
			targetStore = createTemporaryH2Store(featureStore.getName() + "_filtered", featureStore.getDefaultFeatureTypeQuietly(), query);
228

  
229
			fs = featureStore.getFeatureSet(query);
230
			targetStore.edit(FeatureStore.MODE_APPEND);
231
			long n = 0;
232
			String pkName = targetStore.getDefaultFeatureTypeQuietly().getPrimaryKey()[0].getName();
233
			for (Feature f : fs) {
234
				EditableFeature newf = targetStore.createNewFeature(f);
235
				newf.set(pkName, n++);
236
				targetStore.insert(newf);
237
			}
238
			targetStore.finishEditingQuietly();
239
			FLyrVect layer = (FLyrVect) MapContextLocator.getMapContextManager().createLayer(targetStore.getName(), targetStore);
240
			layer.setTemporary(true);
241

  
242
			FLyrVect sourceLayer = getFLyrVect(featureStore);
243
			if (sourceLayer != null) {
244
				layer.setProjection(sourceLayer.getProjection());
245
				if (!query.hasGroupByColumns()) {
246
					try {
247
						if (sourceLayer != null && sourceLayer.getGeometryType() == layer.getGeometryType()) {
248
							ILegend legend = sourceLayer.getLegend().cloneLegend();
249
							layer.setLegend((IVectorLegend) legend);
250
						}
251
					} catch (Exception ex) {
252
						LOGGER.warn("Not able to apply same legend", ex);
253
					}
254
				}
255
			}
256

  
257
			IView view = (IView) viewDoc.getMainWindow();
258
			view.getMapControl().addLayer(layer);
259

  
260
		} catch (Exception ex) {
261
			LOGGER.warn("Can't create filtered layer.", ex);
262
			FeatureStore.cancelEditingQuietly(targetStore);
263
			//msgbox
264
		} finally {
265
			DisposeUtils.disposeQuietly(fs);
266
			DisposeUtils.disposeQuietly(featureStore);
267
			DisposeUtils.disposeQuietly(targetStore);
268
		}
269

  
270
	}
271

  
272
}
trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.app/org.gvsig.app.mainplugin/src/main/java/org/gvsig/app/project/documents/view/ViewManager.java
48 48
import org.gvsig.app.project.documents.actions.PasteDocumentAction;
49 49
import org.gvsig.app.project.documents.gui.IDocumentWindow;
50 50
import org.gvsig.app.project.documents.gui.WindowLayout;
51
import org.gvsig.app.project.documents.view.dalactions.AddFilterToLayerAction.AddFilterToLayerActionFactory;
52
import org.gvsig.app.project.documents.view.dalactions.CreateTemporalLayerAction;
51 53
import org.gvsig.app.project.documents.view.dalactions.ViewZoomAction.ViewZoomActionFactory;
52 54
import org.gvsig.app.project.documents.view.gui.DefaultViewPanel;
53 55
import org.gvsig.app.project.documents.view.gui.ViewProperties;
......
490 492
        }
491 493
        ViewDocumentStoresRepository.selfRegister();
492 494
        ViewZoomActionFactory.selfRegister();
495
        AddFilterToLayerActionFactory.selfRegister();
496
        CreateTemporalLayerAction.CreateTemporalLayerActionFactory.selfRegister();
493 497
    }
494 498

  
495 499
    @SuppressWarnings("rawtypes")

Also available in: Unified diff