Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / extGeoDB / src / org / gvsig / geodb / vectorialdb / wizard / WizardVectorialDB.java @ 35183

History | View | Annotate | Download (12.8 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *   Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *   +34 963862235
28
 *   gvsig@gva.es
29
 *   www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   Prodevelop Integraci?n de Tecnolog?as SL
34
 *   Conde Salvatierra de ?lava , 34-10
35
 *   46004 Valencia
36
 *   Spain
37
 *
38
 *   +34 963 510 612
39
 *   +34 963 510 968
40
 *   gis@prodevelop.es
41
 *   http://www.prodevelop.es
42
 */
43
package org.gvsig.geodb.vectorialdb.wizard;
44

    
45
import java.awt.Window;
46
import java.util.ArrayList;
47
import java.util.Iterator;
48
import java.util.List;
49

    
50
import org.cresques.cts.IProjection;
51
import org.slf4j.Logger;
52
import org.slf4j.LoggerFactory;
53

    
54
import org.gvsig.andami.PluginServices;
55
import org.gvsig.andami.messages.NotificationManager;
56
import org.gvsig.andami.ui.mdiManager.IWindow;
57
import org.gvsig.app.ApplicationLocator;
58
import org.gvsig.app.ApplicationManager;
59
import org.gvsig.app.prepareAction.PrepareContext;
60
import org.gvsig.app.prepareAction.PrepareContextView;
61
import org.gvsig.app.project.documents.view.gui.DefaultViewPanel;
62
import org.gvsig.fmap.dal.DALLocator;
63
import org.gvsig.fmap.dal.DataManager;
64
import org.gvsig.fmap.dal.DataStoreParameters;
65
import org.gvsig.fmap.dal.exception.ReadException;
66
import org.gvsig.fmap.dal.feature.FeatureStore;
67
import org.gvsig.fmap.dal.serverexplorer.db.DBServerExplorer;
68
import org.gvsig.fmap.dal.store.db.DBStoreParameters;
69
import org.gvsig.fmap.geom.primitive.Envelope;
70
import org.gvsig.fmap.mapcontext.MapContext;
71
import org.gvsig.fmap.mapcontext.layers.CancelationException;
72
import org.gvsig.fmap.mapcontext.layers.FLayer;
73
import org.gvsig.fmap.mapcontext.layers.FLayers;
74
import org.gvsig.fmap.mapcontext.layers.LayerFactory;
75
import org.gvsig.fmap.mapcontrol.MapControl;
76

    
77

    
78

    
79
/**
80
 * Driver-independent GeoDB wizard. Queries the drivers to fill GUI controls.
81
 * Multi-table selection available.
82
 *
83
 * @author jldominguez
84
 *
85
 */
86
public class WizardVectorialDB extends WizardDB {
87
    private static final long serialVersionUID = -5002685263220038989L;
88

    
89
    private static Logger logger = LoggerFactory
90
                        .getLogger(WizardVectorialDB.class.getName());
91

    
92
    private static final String GEODB_WIZARD_TAB_NAME = "GeoDB";
93
        private DefaultViewPanel view = null;
94

    
95
        private PrepareContextView prepareContext;
96

    
97
    /**
98
     * This method initializes this
99
     *
100
     * @return void
101
     */
102
    protected void initialize() {
103
                super.initialize();
104
        setTabName(GEODB_WIZARD_TAB_NAME);
105
        setLayout(null);
106
        setSize(512, 478);
107

    
108
        IWindow iw = PluginServices.getMDIManager().getActiveWindow();
109

    
110
        if (iw == null) {
111
            return;
112
        }
113

    
114
        if ((iw instanceof DefaultViewPanel)) {
115
                 view = (DefaultViewPanel) iw;
116
             setMapCtrl(view.getMapControl());
117
        }
118
    }
119

    
120

    
121
        protected TablesListItem createTabeListItem(DBServerExplorer dbExplorer,
122
                        DBStoreParameters param) {
123
                return new TablesListItemVectorial(dbExplorer, param, getMapCtrl(),
124
                                this);
125
        }
126

    
127
        public void setSettingsPanels(TablesListItem actTable) {
128
                super.setSettingsPanels(actTable);
129
        }
130

    
131
        protected UserTableSettingsPanel createSettingsPanel(
132
                        TablesListItem actTable) {
133
                if (actTable == null) {
134
                        return new UserTableSettingsVectorialPanel(null, null, "",
135
                                        getMapCtrl(), true, this, null, null);
136
                }
137
                String abrev = null;
138
                if (getMapCtrl() != null) {
139
                        abrev = getMapCtrl().getViewPort().getProjection().getAbrev();
140
                }
141

    
142
                return ((TablesListItemVectorial) actTable)
143
                                .getUserTableSettingsPanel(abrev);
144
        }
145

    
146

    
147
        public DataStoreParameters[] getParameters() {
148
                try {
149
                        TablesListItem[] selected = getSelectedTables();
150
                        int count = selected.length;
151
                        DBStoreParameters[] dbParameters = new DBStoreParameters[count];
152
                        String strEPSG = null;
153
                        if (getMapCtrl() != null) {
154
                                strEPSG = getMapCtrl().getViewPort().getProjection().getAbrev();
155
                        }
156

    
157
                        for (int i = 0; i < count; i++) {
158
                                TablesListItemVectorial item = (TablesListItemVectorial) selected[i];
159

    
160
                                dbParameters[i] = getParameterForTable(item);
161
                        }
162

    
163
                        return dbParameters;// layerArrayToGroup(all_layers, groupName);
164
                } catch (Exception e) {
165
                        logger.error("While creating jdbc layer: " + e.getMessage(), e);
166
                        NotificationManager.addError("Error al cargar la capa: "
167
                                        + e.getMessage(), e);
168
                }
169

    
170
                return null;
171
        }
172

    
173
        public void execute() {
174
                MapControl mapControl = this.getMapCtrl();
175
                IProjection proj = null;
176
                TablesListItem[] tables = getSelectedTables();
177

    
178

    
179
                List all_layers = new ArrayList();
180
                String strEPSG = mapControl.getViewPort().getProjection().getAbrev();
181
                LayerFactory layerFactory = LayerFactory.getInstance();
182
                String groupName = null;
183
                Envelope env = null;
184
                DBStoreParameters parameter;
185
                TablesListItem table;
186
                FeatureStore store, storeToAdd;
187

    
188
                DataManager man = DALLocator.getDataManager();
189

    
190
                ApplicationManager appGvSIGMan = ApplicationLocator.getManager();
191
                PrepareContext context = this.getPrepareDataStoreContext();
192

    
193

    
194
        try {
195

    
196
            FLayer layer;
197
            for (int i = 0; i < tables.length; i++) {
198
                table = tables[i];
199
                UserTableSettingsVectorialPanel userTableSettingsPanel =
200
                    (UserTableSettingsVectorialPanel) table
201
                        .getUserTableSettingsPanel();
202
                parameter = getParameterForTable(table);
203
                if (i == 0) {
204
                    groupName =
205
                        parameter.getDBName() + " (" + parameter.getHost()
206
                            + ")";
207
                }
208
                try {
209
                    parameter =
210
                        (DBStoreParameters) appGvSIGMan
211
                            .prepareOpenDataStoreParameters(parameter, context);
212

    
213
                } catch (Exception e2) {
214
                    NotificationManager.addError(e2);
215
                    continue;
216
                }
217

    
218
                try {
219
                    store = (FeatureStore) man.createStore(parameter);
220
                } catch (Exception e) {
221
                    NotificationManager.addError(e);
222
                    return;
223
                }
224

    
225
                try {
226
                    storeToAdd =
227
                        (FeatureStore) appGvSIGMan.pepareOpenDataSource(store,
228
                            context);
229
                } catch (Exception e) {
230
                    NotificationManager.addError(e);
231
                    store.dispose();
232
                    continue;
233
                }
234

    
235
                try {
236

    
237
                    layer =
238
                        layerFactory.createLayer(
239
                            userTableSettingsPanel.getUserLayerName(),
240
                            storeToAdd);
241
                    all_layers.add(layer);
242
                    if (env == null) {
243
                        env = layer.getFullEnvelope();
244
                    } else {
245
                        env.add(layer.getFullEnvelope());
246
                    }
247
                    storeToAdd.dispose();
248
                } catch (Exception e) {
249
                    storeToAdd.dispose();
250
                    NotificationManager.addError(e);
251
                }
252
            }
253

    
254
            MapContext mc = mapControl.getMapContext();
255
            FLayers root = mapControl.getMapContext().getLayers();
256
            if (all_layers.size() > 1) {
257
                FLayers group = new FLayers();// (mc,root);
258
                group.setMapContext(mc);
259
                group.setParentLayer(root);
260
                group.setName(groupName);
261

    
262
                Iterator iter = all_layers.iterator();
263
                while (iter.hasNext()) {
264
                    group.addLayer((FLayer) iter.next());
265
                }
266

    
267
                if ((group != null) && !(group.isOk())) {
268
                    // if the layer is not okay (it has errors) process them
269
                    processErrorsOfLayer(group, mapControl);
270
                }
271

    
272
                if (group != null) {
273
                    group.setVisible(true);
274
                    mapControl.getMapContext().beginAtomicEvent();
275
                    try {
276
                        // checkProjection(group, mapControl.getViewPort());
277
                        try {
278
                            mapControl.getMapContext().getLayers()
279
                                .addLayer(group);
280
                            group.dispose();
281
                        } catch (CancelationException e) {
282
                            // TODO Auto-generated catch block
283
                            e.printStackTrace();
284
                        }
285
                        if (mapControl.getViewPort().getExtent() == null) {
286
                            mapControl.getViewPort().setEnvelope(env);
287
                        }
288
                    } finally {
289
                        mapControl.getMapContext().endAtomicEvent();
290
                    }
291
                    return;
292
                }
293
            } else
294
                if (all_layers.size() == 1) {
295
                    layer = (FLayer) all_layers.get(0);
296
                    if (!(layer.isOk())) {
297
                        // if the layer is not okay (it has errors) process them
298
                        processErrorsOfLayer(layer, mapControl);
299
                    }
300

    
301
                    layer.setVisible(true);
302
                    mapControl.getMapContext().beginAtomicEvent();
303
                    // checkProjection(all_layers[0], mapControl.getViewPort());
304
                    try {
305
                        try {
306
                            mapControl.getMapContext().getLayers()
307
                                .addLayer(layer);
308
                        } catch (CancelationException e) {
309
                            return;
310
                        }
311

    
312
                        if (mapControl.getViewPort().getExtent() == null) {
313
                            try {
314
                                mapControl.getViewPort().setEnvelope(
315
                                    layer.getFullEnvelope());
316
                            } catch (ReadException e) {
317
                                NotificationManager.addError(e);
318
                                return;
319
                            }
320
                        }
321
                    } finally {
322

    
323
                        mapControl.getMapContext().endAtomicEvent();
324
                    }
325
                    return;
326
                }
327
        } finally {
328
            // Dispose all created layers. If they have been included into
329
            // a FLayers object, they will have been binded there.
330
            for (int i = 0; i < all_layers.size(); i++) {
331
                FLayer layer = (FLayer) all_layers.get(i);
332
                layer.dispose();
333
            }
334
                }
335
        }
336

    
337
        protected PrepareContext getPrepareDataStoreContext() {
338
                if (this.prepareContext == null) {
339
                        this.prepareContext = new PrepareContextView() {
340
                                public Window getOwnerWindow() {
341
                                        return null;
342
                                }
343

    
344
                                public MapControl getMapControl() {
345
                                        return WizardVectorialDB.this
346
                                                        .getMapCtrl();
347
                                }
348

    
349
                        };
350
                }
351
                return this.prepareContext;
352
        }
353

    
354
        protected DBStoreParameters getParameterForTable(TablesListItem table) {
355
                DBStoreParameters parameters = table.getParameters();
356

    
357
                String strEPSG = null;
358
                if (getMapCtrl() != null) {
359
                        strEPSG = getMapCtrl().getViewPort().getProjection().getAbrev();
360
                }
361

    
362
                UserTableSettingsVectorialPanel userTableSettingsPanel = (UserTableSettingsVectorialPanel) table
363
                                .getUserTableSettingsPanel();
364

    
365
                Envelope _wa = userTableSettingsPanel.getWorkingArea();
366

    
367
                String geomField = userTableSettingsPanel.getGeoFieldName();
368
                String fidField = userTableSettingsPanel.getIdFieldName();
369
                if (!(fidField.startsWith("{") && fidField.endsWith("}"))) {
370
                        parameters.setPkFields(new String[] { fidField });
371
                        fidField = null;
372
                }
373
                String[] fields = table.getUserSelectedFieldsPanel()
374
                                .getUserSelectedFields(fidField, geomField);
375

    
376
                if (userTableSettingsPanel.isSqlActive()) {
377
                        String whereClause = userTableSettingsPanel.getWhereClause();
378
                        parameters.setBaseFilter(whereClause);
379
                } else {
380
                        parameters.setBaseFilter("");
381
                }
382

    
383
                parameters.setFields(fields);
384
                parameters.setDefaultGeometryField(geomField);
385
                if (_wa != null) {
386
                        parameters.setWorkingArea(_wa);
387
                }
388

    
389
                parameters.setCRS(strEPSG);
390

    
391
                return parameters;
392

    
393
        }
394

    
395

    
396
}