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 @ 45160

History | View | Annotate | Download (11 KB)

1
package org.gvsig.geodb;
2

    
3
import java.util.ArrayList;
4
import java.util.Arrays;
5
import java.util.List;
6
import java.util.Map;
7
import javax.swing.JComponent;
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.FeatureStore;
21
import org.gvsig.fmap.dal.store.db.DBStoreParameters;
22
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorer;
23
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
24
import org.gvsig.fmap.mapcontext.MapContext;
25
import org.gvsig.fmap.mapcontext.MapContextLocator;
26
import org.gvsig.fmap.mapcontext.MapContextManager;
27
import org.gvsig.fmap.mapcontext.layers.CancelationException;
28
import org.gvsig.fmap.mapcontext.layers.FLayer;
29
import org.gvsig.fmap.mapcontext.layers.FLayers;
30
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
31
import org.gvsig.fmap.mapcontrol.MapControl;
32
import static org.gvsig.geodb.AbstractWizardDB.LOGGER;
33
import org.gvsig.geodb.vectorialdb.visibility.VisibilityScaleSelector;
34
import org.gvsig.geodb.vectorialdb.visibility.LayerScaleVisibility;
35
import org.gvsig.tools.ToolsLocator;
36
import org.gvsig.tools.dynobject.DynObject;
37
import org.gvsig.tools.i18n.I18nManager;
38
import org.gvsig.tools.swing.api.ToolsSwingLocator;
39
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
40

    
41
/**
42
 *
43
 * @author jjdelcerro
44
 */
45
public class WizardDBVectorial extends AbstractWizardDB {
46
    
47
    public static final int NUMBER_OF_FEATURES_TO_ASK_FOR_VISIBILITY_SCALE = 500;
48
    public static final String LAYERS_SCALE_VISIBILITY_PARAMETER="layersScaleVisibility";
49

    
50
    public WizardDBVectorial() {
51
        super();
52
    }
53

    
54
    @Override
55
    protected boolean requireGeometry() {
56
        return true;
57
    }
58

    
59
    @Override
60
    public Object executeWizard() {
61
        DataManager man = DALLocator.getDataManager();
62
        MapContextManager mapContextManager = MapContextLocator.getMapContextManager();
63

    
64
        MapControl mapControl = this.getMapCtrl();
65
        MapContext mapContext = mapControl.getMapContext();
66

    
67
        String groupName = null;
68
        List<FLayer> all_layers = new ArrayList();
69

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

    
100
                    layer = mapContextManager.createLayer(
101
                            tableInfo.getDocumentName(),
102
                            store
103
                    );
104
                    checkForVisibilityScale(layer);
105
                    all_layers.add(layer);
106
                } catch (Exception e) {
107
                    LOGGER.warn("Can't create layer '" + tableInfo.getDocumentName() + "'.", e);
108
                }
109
            }
110

    
111
            if (all_layers.size() > 1) {
112
                FLayers group = new FLayers();
113
                group.setMapContext(mapContext);
114
                group.setParentLayer(mapContext.getLayers());
115
                group.setName(groupName);
116

    
117
                for (FLayer aLayer : all_layers) {
118
                    group.addLayer(aLayer);
119
                }
120
                if ( group.isOk() ) {
121
                    group.setVisible(true);
122
                    mapContext.beginAtomicEvent();
123
                    try {
124
                        mapControl.addLayer(group);
125
                        group.dispose();
126
                    } catch (CancelationException e) {
127
                        LOGGER.warn("Can't add group to mapcontext layers.", e);
128
                    } finally {
129
                        mapContext.endAtomicEvent();
130
                    }
131
                } else {
132
                    fireLayerErrorEvent(layer, mapControl);
133
                }
134

    
135
            } else if (all_layers.size() == 1) {
136
                layer = (FLayer) all_layers.get(0);
137
                if ( layer.isOk() ) {
138
                    layer.setVisible(true);
139
                    mapContext.beginAtomicEvent();
140
                    try {
141
                        mapControl.addLayer(layer);
142
                    } catch (CancelationException e) {
143
                        LOGGER.warn("Can't add group to mapcontext layers.", e);
144
                    } finally {
145
                        mapContext.endAtomicEvent();
146
                    }
147
                } else {
148
                    fireLayerErrorEvent(layer, mapControl);
149
                }
150
            }
151

    
152
        } finally {
153
            // Dispose all created layers. If they have been included into
154
            // a FLayers object, they will have been binded there.
155
            for (FLayer layer : all_layers) {
156
                layer.dispose();
157
            }
158
        }
159
        return null;
160
    }
161

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

    
181
                layer.setMaxScale(scaleAboveDenominator);
182
                layer.setMinScale(scaleBelowDenominator);
183
                return;
184
            }
185
        }
186
        
187
        if (layer instanceof FLyrVect) {
188
            FLyrVect lyrVect = (FLyrVect)layer;
189
            FeatureStore store = lyrVect.getFeatureStore();
190
            if((store.getExplorer() instanceof JDBCServerExplorer)
191
                    && (store.getFeatures().size()>NUMBER_OF_FEATURES_TO_ASK_FOR_VISIBILITY_SCALE) ){
192
                askUserForVisibilityScale(layer);
193
            }
194
        }
195
    }
196

    
197
    private void askUserForVisibilityScale(FLayer layer) {
198
        if (!SwingUtilities.isEventDispatchThread()) {
199
            SwingUtilities.invokeLater(new Runnable() {
200
                @Override
201
                public void run() {
202
                    askUserForVisibilityScale(layer);
203
                }
204
            });
205
            return;
206
        }
207
        
208
        
209
        VisibilityScaleSelector visibilityScaleSelector = new VisibilityScaleSelector();
210

    
211
        I18nManager i18nManager = ToolsLocator.getI18nManager();
212
        WindowManager winManager = ToolsSwingLocator.getWindowManager();
213
        
214
        winManager.showWindow(
215
                (JComponent) visibilityScaleSelector, 
216
                i18nManager.getTranslation("select_visibility_scale"), 
217
                WindowManager.MODE.DIALOG
218
        );
219
        
220
        
221
        if (visibilityScaleSelector.isOkPressed()) {
222
            layer.setMaxScale(visibilityScaleSelector.getScaleAboveDenominator());
223
            layer.setMinScale(visibilityScaleSelector.getScaleBelowDenominator());
224
            if(visibilityScaleSelector.getRememberAnswer()){
225
                PluginsManager pluginManager = PluginsLocator.getPluginsManager();
226
                PluginServices plugin = pluginManager.getPlugin(ExtDB_Spatial.class);
227
                DynObject pluginProperties = plugin.getPluginProperties();
228
                String layerKey = buildLayerKey(layer);
229
                String layerLabel = buildLayerLabel(layer);
230
                if(layerKey != null && layerLabel != null){
231
                    Map<String, LayerScaleVisibility> layersScaleVisibility = (Map) pluginProperties.getDynValue(LAYERS_SCALE_VISIBILITY_PARAMETER);
232
                    LayerScaleVisibility layerScaleVisibility = new LayerScaleVisibility();
233
                    layerScaleVisibility.setScaleAboveDenominator(visibilityScaleSelector.getScaleAboveDenominator());
234
                    layerScaleVisibility.setScaleBelowDenominator(visibilityScaleSelector.getScaleBelowDenominator());
235
                    layerScaleVisibility.setLabel(layerLabel);
236
                    layersScaleVisibility.put(layerKey, layerScaleVisibility);
237
                }
238
            }
239
        }
240
    }
241

    
242
    private String buildLayerKey(FLayer layer) {
243
        if(layer!=null){
244
            DataStore dataStore = ((FLyrVect)layer).getDataStore();
245
            if(dataStore != null){
246
                DataStoreParameters parameters = dataStore.getParameters();
247
                if(parameters != null){
248
                    return Arrays.toString(Hex.encodeHex(parameters.toByteArray()));
249
                }
250
            }
251
        }
252
        return null;
253
    }
254

    
255
    private String buildLayerLabel(FLayer layer) {
256
        
257
        if(layer!=null){
258
            DataStore dataStore = ((FLyrVect)layer).getDataStore();
259
            if(dataStore != null){
260
                    StringBuilder builder = new StringBuilder();
261
                    DataStoreParameters parameters = dataStore.getParameters();
262
                    if(parameters != null && parameters instanceof DBStoreParameters){
263
                        JDBCStoreParameters jdbcParameters = (JDBCStoreParameters)parameters;
264
                        builder.append(jdbcParameters.getDBName());
265
                        builder.append(".");
266
                        builder.append(jdbcParameters.getSchema());
267
                        builder.append(".");
268
                        builder.append(jdbcParameters.getTable());
269
                        return builder.toString();
270
                }
271
            }
272
        }
273
        return null;
274
    }
275
}