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 / project / documents / view / dalactions / CreateTemporalLayerAction.java @ 46089

History | View | Annotate | Download (10.1 KB)

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
}