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 / vectorialdb / wizard / WizardVectorialDB.java @ 43359

History | View | Annotate | Download (11.2 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.geodb.vectorialdb.wizard;
25

    
26
import java.awt.Window;
27
import java.util.ArrayList;
28
import java.util.List;
29

    
30
import org.cresques.cts.IProjection;
31
import org.slf4j.Logger;
32
import org.slf4j.LoggerFactory;
33

    
34
import org.gvsig.andami.PluginServices;
35
import org.gvsig.andami.messages.NotificationManager;
36
import org.gvsig.andami.ui.mdiManager.IWindow;
37
import org.gvsig.app.prepareAction.PrepareContext;
38
import org.gvsig.app.prepareAction.PrepareContextView;
39
import org.gvsig.app.project.documents.view.gui.DefaultViewPanel;
40
import org.gvsig.fmap.dal.DALLocator;
41
import org.gvsig.fmap.dal.DataManager;
42
import org.gvsig.fmap.dal.DataStoreParameters;
43
import org.gvsig.fmap.dal.exception.DataException;
44
import org.gvsig.fmap.dal.feature.FeatureStore;
45
import org.gvsig.fmap.dal.serverexplorer.db.DBServerExplorer;
46
import org.gvsig.fmap.dal.store.db.DBStoreParameters;
47
import org.gvsig.fmap.geom.primitive.Envelope;
48
import org.gvsig.fmap.mapcontext.MapContext;
49
import org.gvsig.fmap.mapcontext.MapContextLocator;
50
import org.gvsig.fmap.mapcontext.MapContextManager;
51
import org.gvsig.fmap.mapcontext.layers.CancelationException;
52
import org.gvsig.fmap.mapcontext.layers.FLayer;
53
import org.gvsig.fmap.mapcontext.layers.FLayers;
54
import org.gvsig.fmap.mapcontrol.MapControl;
55

    
56

    
57

    
58
/**
59
 * Driver-independent GeoDB wizard. Queries the drivers to fill GUI controls.
60
 * Multi-table selection available.
61
 *
62
 * @author jldominguez
63
 *
64
 */
65
public class WizardVectorialDB extends WizardDB {
66
    private static final long serialVersionUID = -5002685263220038989L;
67

    
68
    private static final Logger logger = LoggerFactory.getLogger(WizardVectorialDB.class);
69

    
70
    private static final String GEODB_WIZARD_TAB_NAME = "GeoDB";
71
        private DefaultViewPanel view = null;
72

    
73
        private PrepareContextView prepareContext;
74

    
75
    /**
76
     * This method initializes this
77
     *
78
     */
79
    @Override
80
    protected void initialize() {
81
                super.initialize();
82
        setTabName(GEODB_WIZARD_TAB_NAME);
83
        setLayout(null);
84
        setSize(512, 478);
85

    
86
        IWindow iw = PluginServices.getMDIManager().getActiveWindow();
87

    
88
        if (iw == null) {
89
            return;
90
        }
91

    
92
        if ((iw instanceof DefaultViewPanel)) {
93
                 view = (DefaultViewPanel) iw;
94
             setMapCtrl(view.getMapControl());
95
        }
96
    }
97
    
98
    @Override
99
    protected List getTableList(DBServerExplorer explorer) throws DataException {
100
        return explorer.list(DBServerExplorer.MODE_GEOMETRY);
101
    }
102

    
103
    @Override
104
        protected TablesListItem createTabeListItem(DBStoreParameters param) {
105
                return new TablesListItemVectorial(param, getMapCtrl(),this);
106
        }
107

    
108
    @Override
109
        public void setSettingsPanels(TablesListItem actTable) {
110
                super.setSettingsPanels(actTable);
111
        }
112

    
113
    @Override
114
        protected UserTableSettingsPanel createSettingsPanel(
115
                        TablesListItem actTable) {
116
                if (actTable == null) {
117
                        return new UserTableSettingsVectorialPanel(null, null, "",
118
                                        getMapCtrl(), true, this, null, null);
119
                }
120
                String abrev = null;
121
                if (getMapCtrl() != null) {
122
                        abrev = getMapCtrl().getViewPort().getProjection().getAbrev();
123
                }
124

    
125
                return ((TablesListItemVectorial) actTable)
126
                                .getUserTableSettingsPanel(abrev);
127
        }
128

    
129
    @Override
130
        public DataStoreParameters[] getParameters() {
131
                try {
132
                        TablesListItem[] selected = getSelectedTables();
133
                        int count = selected.length;
134
                        DBStoreParameters[] dbParameters = new DBStoreParameters[count];
135
                        String strEPSG = null;
136
                        if (getMapCtrl() != null) {
137
                                strEPSG = getMapCtrl().getViewPort().getProjection().getAbrev();
138
                        }
139

    
140
                        for (int i = 0; i < count; i++) {
141
                                TablesListItemVectorial item = (TablesListItemVectorial) selected[i];
142

    
143
                                dbParameters[i] = getParameterForTable(item);
144
                        }
145

    
146
                        return dbParameters;
147
                } catch (Exception e) {
148
                        logger.warn("Error while creating jdbc layer: " + e.getMessage(), e);
149
                }
150

    
151
                return null;
152
        }
153

    
154
    @Override
155
        public void execute() {
156
                MapControl mapControl = this.getMapCtrl();
157
        MapContext mc = mapControl.getMapContext();
158
        MapContextManager mapContextManager = MapContextLocator.getMapContextManager();
159
                TablesListItem[] tables = getSelectedTables();
160

    
161
                List<FLayer> all_layers = new ArrayList();
162
                String groupName = null;
163
        Boolean needCalculateEnvelope  = mc.getViewPort().getEnvelope() == null;
164
                Envelope env = null;
165
                DBStoreParameters parameter;
166
                TablesListItem table;
167
                FeatureStore store;
168

    
169
                DataManager man = DALLocator.getDataManager();
170

    
171
        try {
172

    
173
            FLayer layer;
174
            for (int i = 0; i < tables.length; i++) {
175
                table = tables[i];
176
                UserTableSettingsPanel userTableSettingsPanel = table.getUserTableSettingsPanel();
177
                parameter = getParameterForTable(table);
178
                if (i == 0) {
179
                    groupName = parameter.getDBName() + " (" + parameter.getHost() + ")";
180
                }
181
                try {
182
                    store = (FeatureStore) man.openStore(
183
                                    parameter.getDataStoreName(),
184
                                    parameter);
185
                } catch (Exception e) {
186
                    logger.warn("While opening DB store.", e);
187
                    return;
188
                }
189
                try {
190

    
191
                    layer = mapContextManager.createLayer(
192
                        userTableSettingsPanel.getUserLayerName(), 
193
                        store
194
                    );
195
                    all_layers.add(layer);
196
                    if( needCalculateEnvelope ) {
197
                        if (env == null) {
198
                            env = layer.getFullEnvelope();
199
                        } else {
200
                            env.add(layer.getFullEnvelope());
201
                        }
202
                    }
203
                } catch (Exception e) {
204
                    logger.warn("Can't create layer '"+userTableSettingsPanel.getUserLayerName()+"'.",e);
205
                }
206
            }
207

    
208
            if (all_layers.size() > 1) {
209
                FLayers group = new FLayers();
210
                group.setMapContext(mc);
211
                group.setParentLayer(mc.getLayers());
212
                group.setName(groupName);
213

    
214
                for( FLayer aLayer : all_layers) {
215
                    group.addLayer(aLayer);
216
                }
217
                if ( !(group.isOk())) {
218
                    // if the layer is not okay (it has errors) process them
219
                    processErrorsOfLayer(group, mapControl);
220
                }
221

    
222
                group.setVisible(true);
223
                mc.beginAtomicEvent();
224
                try {
225
                    try {
226
                        mc.getLayers().addLayer(group);
227
                        group.dispose();
228
                    } catch (CancelationException e) {
229
                        logger.warn("Can't add group to mapcontext layers.",e);
230
                    }
231
                    if ( needCalculateEnvelope && env!=null ) {
232
                        mapControl.getViewPort().setEnvelope(env);
233
                    }
234
                } finally {
235
                    mc.endAtomicEvent();
236
                }
237
                return;
238
            } else {
239
                if (all_layers.size() == 1) {
240
                    layer = (FLayer) all_layers.get(0);
241
                    if (!(layer.isOk())) {
242
                        // if the layer is not okay (it has errors) process them
243
                        processErrorsOfLayer(layer, mapControl);
244
                    }
245

    
246
                    layer.setVisible(true);
247
                    mc.beginAtomicEvent();
248
                    try {
249
                        try {
250
                            mc.getLayers().addLayer(layer);
251
                        } catch (CancelationException e) {
252
                            return;
253
                        }
254

    
255
                        if ( needCalculateEnvelope && env!=null ) {
256
                            mapControl.getViewPort().setEnvelope(env);
257
                        }
258
                    } finally {
259
                        mc.endAtomicEvent();
260
                    }
261
                    return;
262
                }
263
            }
264
        } finally {
265
            // Dispose all created layers. If they have been included into
266
            // a FLayers object, they will have been binded there.
267
            for (int i = 0; i < all_layers.size(); i++) {
268
                FLayer layer = (FLayer) all_layers.get(i);
269
                layer.dispose();
270
            }
271
                }
272
        }
273

    
274
    @Override
275
        protected PrepareContext getPrepareDataStoreContext() {
276
                if (this.prepareContext == null) {
277
                        this.prepareContext = new PrepareContextView() {
278
                @Override
279
                                public Window getOwnerWindow() {
280
                                        return null;
281
                                }
282

    
283
                @Override
284
                                public MapControl getMapControl() {
285
                                        return WizardVectorialDB.this
286
                                                        .getMapCtrl();
287
                                }
288
                                
289
                @Override
290
                                public IProjection getViewProjection() {
291
                                        MapControl mapControl = getMapControl();
292
                                        if (mapControl!=null){
293
                                                return mapControl.getProjection();
294
                                        }
295
                                        return null;
296
                                }
297

    
298
                        };
299
                }
300
                return this.prepareContext;
301
        }
302

    
303
    @Override
304
        protected DBStoreParameters getParameterForTable(TablesListItem table) {
305
                DBStoreParameters parameters = table.getParameters();
306

    
307
                UserTableSettingsVectorialPanel userTableSettingsPanel = (UserTableSettingsVectorialPanel) table
308
                                .getUserTableSettingsPanel();
309

    
310
                Envelope _wa = userTableSettingsPanel.getWorkingArea();
311

    
312
                String geomField = userTableSettingsPanel.getGeoFieldName();
313
                String fidField = userTableSettingsPanel.getIdFieldName();
314
        //IF is a multiple PK, remove the {} symbols
315
        if (fidField.startsWith("{") && fidField.endsWith("}")) {
316
            fidField = fidField.substring(1, fidField.length()-1);
317
        }
318
        String[] pkFields = fidField.split(",");        
319
            
320
        String[] fields = table.getUserSelectedFieldsPanel()
321
                .getUserSelectedFields(pkFields, geomField);
322

    
323
                if (userTableSettingsPanel.isSqlActive()) {
324
                        String whereClause = userTableSettingsPanel.getWhereClause();
325
                        parameters.setBaseFilter(whereClause);
326
                } else {
327
                        parameters.setBaseFilter("");
328
                }
329

    
330
                parameters.setFields(fields);
331
                parameters.setDefaultGeometryField(geomField);
332
                if (_wa != null) {
333
                        parameters.setWorkingArea(_wa);
334
                }
335
                
336
        // ======= Setting PK from combo box
337
        if (pkFields != null) {
338
            parameters.setPkFields(pkFields);
339
        }
340
        // =========================
341

    
342
                IProjection proj_selected_by_user = userTableSettingsPanel.getProjection();
343
                parameters.setCRS(proj_selected_by_user);
344

    
345
                return parameters;
346

    
347
        }
348

    
349

    
350
}