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

History | View | Annotate | Download (11.8 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
import org.apache.commons.lang3.StringUtils;
30

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

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

    
59

    
60

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

    
71
    private static final Logger logger = LoggerFactory.getLogger(WizardVectorialDB.class);
72

    
73
    private static final String GEODB_WIZARD_TAB_NAME = "GeoDB";
74
        private DefaultViewPanel view = null;
75

    
76
        private PrepareContextView prepareContext;
77

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

    
89
        IWindow iw = PluginServices.getMDIManager().getActiveWindow();
90

    
91
        if (iw == null) {
92
            return;
93
        }
94

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

    
106
    @Override
107
        protected TablesListItem createTabeListItem(AbstractDBStoreParameters param) {
108
                return new TablesListItemVectorial(param, getMapCtrl(),this);
109
        }
110

    
111
    @Override
112
        public void setSettingsPanels(TablesListItem actTable) {
113
                super.setSettingsPanels(actTable);
114
        }
115

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

    
128
                return ((TablesListItemVectorial) actTable)
129
                                .getUserTableSettingsPanel(abrev);
130
        }
131

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

    
143
                        for (int i = 0; i < count; i++) {
144
                                TablesListItemVectorial item = (TablesListItemVectorial) selected[i];
145

    
146
                                dbParameters[i] = getParameterForTable(item);
147
                        }
148

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

    
154
                return null;
155
        }
156

    
157
    @Override
158
        public void execute() {
159
        executeWizard();
160
    }
161

    
162
    @Override
163
        public Object executeWizard() {
164
                MapControl mapControl = this.getMapCtrl();
165
        MapContext mc = mapControl.getMapContext();
166
        MapContextManager mapContextManager = MapContextLocator.getMapContextManager();
167
//        Boolean needCalculateEnvelope  = mc.getViewPort().getEnvelope() == null;
168
                TablesListItem[] tables = getSelectedTables();
169

    
170
                List<FLayer> all_layers = new ArrayList();
171
                String groupName = null;
172
                AbstractDBStoreParameters parameter;
173
                TablesListItem table;
174
                FeatureStore store;
175

    
176
                DataManager man = DALLocator.getDataManager();
177

    
178
        try {
179

    
180
            FLayer layer;
181
            for (int i = 0; i < tables.length; i++) {
182
                table = tables[i];
183
                UserTableSettingsPanel userTableSettingsPanel = table.getUserTableSettingsPanel();
184
                parameter = getParameterForTable(table);
185
                fixCRS(parameter);
186
                if (i == 0) {
187
                    String dbname = parameter.getDBName();
188
                    if( StringUtils.isEmpty(dbname) ) {
189
                        dbname = "Group";
190
                    }
191
                    String host = parameter.getHost();
192
                    if( StringUtils.isEmpty(host) ) {
193
                        groupName =  dbname;
194
                    } else {
195
                        groupName =  dbname + " (" + host + ")";
196
                    }
197
                }
198
                try {
199
                    store = (FeatureStore) man.openStore(
200
                                    parameter.getDataStoreName(),
201
                                    parameter);
202
                } catch (Exception e) {
203
                    logger.warn("While opening DB store.", e);
204
                    return null;
205
                }
206
                try {
207

    
208
                    layer = mapContextManager.createLayer(
209
                        userTableSettingsPanel.getUserLayerName(), 
210
                        store
211
                    );
212
                    all_layers.add(layer);
213
                } catch (Exception e) {
214
                    logger.warn("Can't create layer '"+userTableSettingsPanel.getUserLayerName()+"'.",e);
215
                }
216
            }
217

    
218
            if (all_layers.size() > 1) {
219
                FLayers group = new FLayers();
220
                group.setMapContext(mc);
221
                group.setParentLayer(mc.getLayers());
222
                group.setName(groupName);
223

    
224
                for( FLayer aLayer : all_layers) {
225
                    group.addLayer(aLayer);
226
                }
227
                if ( !(group.isOk())) {
228
                    // if the layer is not okay (it has errors) process them
229
                    processErrorsOfLayer(group, mapControl);
230
                }
231

    
232
                group.setVisible(true);
233
                mc.beginAtomicEvent();
234
                try {
235
                    try {
236
                        mapControl.addLayer(group);
237
                        group.dispose();
238
                    } catch (CancelationException e) {
239
                        logger.warn("Can't add group to mapcontext layers.",e);
240
                    }
241

    
242
                } finally {
243
                    mc.endAtomicEvent();
244
                }
245
                return null;
246
            } else if (all_layers.size() == 1) {
247
                layer = (FLayer) all_layers.get(0);
248
                if (!(layer.isOk())) {
249
                    // if the layer is not okay (it has errors) process them
250
                    processErrorsOfLayer(layer, mapControl);
251
                }
252

    
253
                layer.setVisible(true);
254
                mc.beginAtomicEvent();
255
                try {
256
                    try {
257
                        mapControl.addLayer(layer);
258
                    } catch (CancelationException e) {
259
                        return null;
260
                    }
261
                } finally {
262
                    mc.endAtomicEvent();
263
                }
264
                return null;
265

    
266
            }
267
//            if ( needCalculateEnvelope ) {
268
//                        Envelope env = null;
269
//                for( FLayer theLayer : all_layers) {
270
//                    try {
271
//                        if (env == null) {
272
//                            env = theLayer.getFullEnvelope();
273
//                        } else {
274
//                            env.add(theLayer.getFullEnvelope());
275
//                        }
276
//                    } catch(Exception ex) {
277
//                        // Ignore
278
//                    }
279
//                    
280
//                }                
281
//                mapControl.getViewPort().setEnvelope(env);
282
//            }            
283
            
284
        } finally {
285
            // Dispose all created layers. If they have been included into
286
            // a FLayers object, they will have been binded there.
287
            for (int i = 0; i < all_layers.size(); i++) {
288
                FLayer layer = (FLayer) all_layers.get(i);
289
                layer.dispose();
290
            }
291
                }
292
        return null;
293
        }
294

    
295
    @Override
296
        protected PrepareContext getPrepareDataStoreContext() {
297
                if (this.prepareContext == null) {
298
                        this.prepareContext = new PrepareContextView() {
299
                @Override
300
                                public Window getOwnerWindow() {
301
                                        return null;
302
                                }
303

    
304
                @Override
305
                                public MapControl getMapControl() {
306
                                        return WizardVectorialDB.this
307
                                                        .getMapCtrl();
308
                                }
309
                                
310
                @Override
311
                                public IProjection getViewProjection() {
312
                                        MapControl mapControl = getMapControl();
313
                                        if (mapControl!=null){
314
                                                return mapControl.getProjection();
315
                                        }
316
                                        return null;
317
                                }
318

    
319
                        };
320
                }
321
                return this.prepareContext;
322
        }
323

    
324
    @Override
325
        protected AbstractDBStoreParameters getParameterForTable(TablesListItem table) {
326
                AbstractDBStoreParameters parameters = table.getParameters();
327

    
328
                UserTableSettingsVectorialPanel userTableSettingsPanel = (UserTableSettingsVectorialPanel) table
329
                                .getUserTableSettingsPanel();
330

    
331
                Envelope _wa = userTableSettingsPanel.getWorkingArea();
332

    
333
                String geomField = userTableSettingsPanel.getGeoFieldName();
334
                String fidField = userTableSettingsPanel.getIdFieldName();
335
        //IF is a multiple PK, remove the {} symbols
336
        if (fidField.startsWith("{") && fidField.endsWith("}")) {
337
            fidField = fidField.substring(1, fidField.length()-1);
338
        }
339
        String[] pkFields = fidField.split(",");        
340
            
341
        String[] fields = table.getUserSelectedFieldsPanel()
342
                .getUserSelectedFields(pkFields, geomField);
343

    
344
                if (userTableSettingsPanel.isSqlActive()) {
345
                        String whereClause = userTableSettingsPanel.getWhereClause();
346
                        parameters.setBaseFilter(whereClause);
347
                } else {
348
                        parameters.setBaseFilter("");
349
                }
350

    
351
                parameters.setFields(fields);
352
                parameters.setDefaultGeometryField(geomField);
353
                if (_wa != null) {
354
                        parameters.setWorkingArea(_wa);
355
                }
356
                
357
        // ======= Setting PK from combo box
358
        if (pkFields != null) {
359
            parameters.setPkFields(pkFields);
360
        }
361
        // =========================
362

    
363
                IProjection proj_selected_by_user = userTableSettingsPanel.getProjection();
364
                parameters.setCRS(proj_selected_by_user);
365

    
366
                return parameters;
367

    
368
        }
369

    
370
}