Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.geodb.app / org.gvsig.geodb.app.mainplugin / src / main / java / org / gvsig / geodb / WizardDBVectorial.java @ 45440

History | View | Annotate | Download (11.7 KB)

1
package org.gvsig.geodb;
2

    
3
import java.awt.event.ActionEvent;
4
import java.util.ArrayList;
5
import java.util.Arrays;
6
import java.util.List;
7
import java.util.Map;
8
import javax.swing.SwingUtilities;
9
import org.apache.commons.codec.binary.Hex;
10
import org.apache.commons.lang3.StringUtils;
11
import org.gvsig.andami.PluginServices;
12
import org.gvsig.andami.PluginsLocator;
13
import org.gvsig.andami.PluginsManager;
14
import org.gvsig.fmap.dal.DALLocator;
15
import org.gvsig.fmap.dal.DataManager;
16
import org.gvsig.fmap.dal.DataStore;
17
import org.gvsig.fmap.dal.DataStoreParameters;
18
import org.gvsig.fmap.dal.exception.DataException;
19
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
20
import org.gvsig.fmap.dal.feature.FeatureSet;
21
import org.gvsig.fmap.dal.feature.FeatureStore;
22
import org.gvsig.fmap.dal.store.db.DBStoreParameters;
23
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorer;
24
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
25
import org.gvsig.fmap.mapcontext.MapContext;
26
import org.gvsig.fmap.mapcontext.MapContextLocator;
27
import org.gvsig.fmap.mapcontext.MapContextManager;
28
import org.gvsig.fmap.mapcontext.layers.CancelationException;
29
import org.gvsig.fmap.mapcontext.layers.FLayer;
30
import org.gvsig.fmap.mapcontext.layers.FLayers;
31
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
32
import org.gvsig.fmap.mapcontrol.MapControl;
33
import static org.gvsig.geodb.AbstractWizardDB.LOGGER;
34
import org.gvsig.geodb.vectorialdb.visibility.VisibilityScaleSelector;
35
import org.gvsig.geodb.vectorialdb.visibility.LayerScaleVisibility;
36
import org.gvsig.tools.ToolsLocator;
37
import org.gvsig.tools.dispose.DisposeUtils;
38
import org.gvsig.tools.dynobject.DynObject;
39
import org.gvsig.tools.i18n.I18nManager;
40
import org.gvsig.tools.swing.api.ToolsSwingLocator;
41
import org.gvsig.tools.swing.api.windowmanager.Dialog;
42
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
43
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
44

    
45
/**
46
 *
47
 * @author gvSIG Team
48
 */
49
@SuppressWarnings("UseSpecificCatch")
50
public class WizardDBVectorial extends AbstractWizardDB {
51
    
52
    public static final int NUMBER_OF_FEATURES_TO_ASK_FOR_VISIBILITY_SCALE = 10000;
53
    public static final String LAYERS_SCALE_VISIBILITY_PARAMETER="layersScaleVisibility";
54

    
55
    public WizardDBVectorial() {
56
        super();
57
    }
58

    
59
    @Override
60
    protected boolean requireGeometry() {
61
        return true;
62
    }
63

    
64
    @Override
65
    public Object executeWizard() {
66
        DataManager man = DALLocator.getDataManager();
67
        MapContextManager mapContextManager = MapContextLocator.getMapContextManager();
68

    
69
        MapControl mapControl = this.getMapCtrl();
70
        MapContext mapContext = mapControl.getMapContext();
71

    
72
        String groupName = null;
73
        List<FLayer> all_layers = new ArrayList();
74

    
75
        try {
76
            FLayer layer = null;
77
            for (TableInfo tableInfo : this.getTablesInformation()) {
78
                if (!tableInfo.isSelected()) {
79
                    continue;
80
                }
81
                DBStoreParameters parameter = tableInfo.getParameters();
82
                if (groupName == null) {
83
                    String dbname = parameter.getDBName();
84
                    if (StringUtils.isEmpty(dbname)) {
85
                        dbname = "Group";
86
                    }
87
                    String host = parameter.getHost();
88
                    if (StringUtils.isEmpty(host)) {
89
                        groupName = dbname;
90
                    } else {
91
                        groupName = dbname + " (" + host + ")";
92
                    }
93
                }
94
                FeatureStore store;
95
                try {
96
                    store = (FeatureStore) man.openStore(
97
                            parameter.getDataStoreName(),
98
                            parameter);
99
                } catch (Exception e) {
100
                    LOGGER.warn("While opening DB store.", e);
101
                    return null;
102
                }
103
                try {
104

    
105
                    layer = mapContextManager.createLayer(
106
                            tableInfo.getDocumentName(),
107
                            store
108
                    );
109
                    checkForVisibilityScale(layer);
110
                    all_layers.add(layer);
111
                } catch (Exception e) {
112
                    LOGGER.warn("Can't create layer '" + tableInfo.getDocumentName() + "'.", e);
113
                } finally {
114
                    DisposeUtils.disposeQuietly(store);
115
                }
116
            }
117

    
118
            if (all_layers.size() > 1) {
119
                FLayers group = new FLayers();
120
                group.setMapContext(mapContext);
121
                group.setParentLayer(mapContext.getLayers());
122
                group.setName(groupName);
123

    
124
                for (FLayer aLayer : all_layers) {
125
                    group.addLayer(aLayer);
126
                }
127
                if ( group.isOk() ) {
128
                    group.setVisible(true);
129
                    mapContext.beginAtomicEvent();
130
                    try {
131
                        mapControl.addLayer(group);
132
                        group.dispose();
133
                    } catch (CancelationException e) {
134
                        LOGGER.warn("Can't add group to mapcontext layers.", e);
135
                    } finally {
136
                        mapContext.endAtomicEvent();
137
                    }
138
                } else {
139
                    fireLayerErrorEvent(layer, mapControl);
140
                }
141

    
142
            } else if (all_layers.size() == 1) {
143
                layer = (FLayer) all_layers.get(0);
144
                if ( layer.isOk() ) {
145
                    layer.setVisible(true);
146
                    mapContext.beginAtomicEvent();
147
                    try {
148
                        mapControl.addLayer(layer);
149
                    } catch (CancelationException e) {
150
                        LOGGER.warn("Can't add group to mapcontext layers.", e);
151
                    } finally {
152
                        mapContext.endAtomicEvent();
153
                    }
154
                } else {
155
                    fireLayerErrorEvent(layer, mapControl);
156
                }
157
            }
158

    
159
        } finally {
160
            // Dispose all created layers. If they have been included into
161
            // a FLayers object, they will have been binded there.
162
            for (FLayer layer : all_layers) {
163
                layer.dispose();
164
            }
165
        }
166
        return null;
167
    }
168

    
169
    private void fireLayerErrorEvent(FLayer lyr, MapControl mapControl) {
170
        mapControl.getMapContext().callNewErrorEvent(null);
171
    }
172
    
173
    
174
        private void checkForVisibilityScale(FLayer layer) throws DataException, ValidateDataParametersException {
175
        
176
        PluginsManager pluginManager = PluginsLocator.getPluginsManager();
177
        PluginServices plugin = pluginManager.getPlugin(ExtDB_Spatial.class);
178
        DynObject pluginProperties = plugin.getPluginProperties();
179
        
180
        Map<String, LayerScaleVisibility> layersScaleVisibility = (Map) pluginProperties.getDynValue(LAYERS_SCALE_VISIBILITY_PARAMETER);
181
        String layerKey = buildLayerKey(layer);
182
        if(layerKey != null) {
183
            LayerScaleVisibility layerScaleVisibility = layersScaleVisibility.get(layerKey);
184
            if(layerScaleVisibility!=null){
185
                int scaleAboveDenominator = layerScaleVisibility.getScaleAboveDenominator();
186
                int scaleBelowDenominator = layerScaleVisibility.getScaleBelowDenominator();
187

    
188
                layer.setMaxScale(scaleAboveDenominator);
189
                layer.setMinScale(scaleBelowDenominator);
190
                return;
191
            }
192
        }
193
        
194
        if (layer instanceof FLyrVect) {
195
            FLyrVect lyrVect = (FLyrVect)layer;
196
            FeatureStore store = lyrVect.getFeatureStore();
197
            
198
            if(store.getExplorer() instanceof JDBCServerExplorer) {
199
                FeatureSet fset = store.getFeatureSet();
200
                if(fset.size()>NUMBER_OF_FEATURES_TO_ASK_FOR_VISIBILITY_SCALE) {
201
                    askUserForVisibilityScale(layer);
202
                }
203
                DisposeUtils.disposeQuietly(fset);
204
            }
205
        }
206
    }
207

    
208
    private void askUserForVisibilityScale(FLayer layer) {
209
        if (!SwingUtilities.isEventDispatchThread()) {
210
            try {
211
                SwingUtilities.invokeAndWait(() -> {askUserForVisibilityScale(layer);});
212
            } catch (Exception ex) {
213
                LOGGER.warn("Con show selection wisivility scale dialog.", ex);
214
            }
215
            return;
216
        }
217
        I18nManager i18n = ToolsLocator.getI18nManager();
218
        WindowManager_v2 winManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
219
        
220
        VisibilityScaleSelector visibilityScaleSelector = new VisibilityScaleSelector();
221
        Dialog dialog = winManager.createDialog(
222
                visibilityScaleSelector.asJComponent(), 
223
                i18n.getTranslation("select_visibility_scale"), 
224
                null, 
225
                WindowManager_v2.BUTTONS_OK_CANCEL
226
        );
227
        dialog.addActionListener((ActionEvent e) -> {
228
            if (dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
229
                layer.setMaxScale(visibilityScaleSelector.getScaleAboveDenominator());
230
                layer.setMinScale(visibilityScaleSelector.getScaleBelowDenominator());
231
                if(visibilityScaleSelector.getRememberAnswer()){
232
                    PluginsManager pluginManager = PluginsLocator.getPluginsManager();
233
                    PluginServices plugin = pluginManager.getPlugin(ExtDB_Spatial.class);
234
                    DynObject pluginProperties = plugin.getPluginProperties();
235
                    String layerKey = buildLayerKey(layer);
236
                    String layerLabel = buildLayerLabel(layer);
237
                    if(layerKey != null && layerLabel != null){
238
                        Map<String, LayerScaleVisibility> layersScaleVisibility = (Map) pluginProperties.getDynValue(LAYERS_SCALE_VISIBILITY_PARAMETER);
239
                        LayerScaleVisibility layerScaleVisibility = new LayerScaleVisibility();
240
                        layerScaleVisibility.setScaleAboveDenominator(visibilityScaleSelector.getScaleAboveDenominator());
241
                        layerScaleVisibility.setScaleBelowDenominator(visibilityScaleSelector.getScaleBelowDenominator());
242
                        layerScaleVisibility.setLabel(layerLabel);
243
                        layersScaleVisibility.put(layerKey, layerScaleVisibility);
244
                    }
245
                }
246
            }
247
        });
248
        dialog.show(WindowManager.MODE.DIALOG);
249
    }
250

    
251
    private String buildLayerKey(FLayer layer) {
252
        if(layer!=null){
253
            DataStore dataStore = ((FLyrVect)layer).getDataStore();
254
            if(dataStore != null){
255
                DataStoreParameters parameters = dataStore.getParameters();
256
                if(parameters != null){
257
                    return Arrays.toString(Hex.encodeHex(parameters.toByteArray()));
258
                }
259
            }
260
        }
261
        return null;
262
    }
263

    
264
    private String buildLayerLabel(FLayer layer) {
265
        
266
        if(layer!=null){
267
            DataStore dataStore = ((FLyrVect)layer).getDataStore();
268
            if(dataStore != null){
269
                    StringBuilder builder = new StringBuilder();
270
                    DataStoreParameters parameters = dataStore.getParameters();
271
                    if(parameters != null && parameters instanceof DBStoreParameters){
272
                        JDBCStoreParameters jdbcParameters = (JDBCStoreParameters)parameters;
273
                        builder.append(jdbcParameters.getDBName());
274
                        builder.append(".");
275
                        builder.append(jdbcParameters.getSchema());
276
                        builder.append(".");
277
                        builder.append(jdbcParameters.getTable());
278
                        return builder.toString();
279
                }
280
            }
281
        }
282
        return null;
283
    }
284
}