Statistics
| Revision:

gvsig-raster / org.gvsig.raster.postgis / trunk / org.gvsig.raster.postgis / org.gvsig.raster.postgis.app.postgisrasterclient / src / main / java / org / gvsig / raster / postgis / app / postgisrasterclient / gui / LayerLoaderManager.java @ 3907

History | View | Annotate | Download (11.4 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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 2
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
 */
22
package org.gvsig.raster.postgis.app.postgisrasterclient.gui;
23

    
24
import java.util.List;
25

    
26
import javax.swing.JOptionPane;
27

    
28
import org.gvsig.andami.PluginServices;
29
import org.gvsig.andami.ui.mdiManager.IWindow;
30
import org.gvsig.fmap.dal.DALLocator;
31
import org.gvsig.fmap.dal.DataManager;
32
import org.gvsig.fmap.dal.DataStoreParameters;
33
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
34
import org.gvsig.fmap.dal.exception.DataException;
35
import org.gvsig.fmap.dal.exception.InitializeException;
36
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
37
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
38
import org.gvsig.fmap.dal.feature.FeatureStore;
39
import org.gvsig.fmap.dal.serverexplorer.db.DBServerExplorerParameters;
40
import org.gvsig.fmap.mapcontext.MapContext;
41
import org.gvsig.fmap.mapcontext.MapContextLocator;
42
import org.gvsig.fmap.mapcontext.MapContextManager;
43
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
44
import org.gvsig.fmap.mapcontext.layers.FLayer;
45
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
46
import org.gvsig.raster.fmap.layers.FLyrRaster;
47
import org.gvsig.raster.postgis.io.PostGISRasterDataParameters;
48
import org.gvsig.raster.postgis.io.PostGISRasterServerExplorer;
49
import org.gvsig.raster.postgis.io.PostGISRasterServerExplorerParameters;
50
import org.gvsig.raster.postgis.swing.AddLayerUI;
51
import org.gvsig.raster.util.RasterNotLoadException;
52
import org.slf4j.Logger;
53
import org.slf4j.LoggerFactory;
54

    
55
/**
56
 * Manager to load layers in TOC. There are some strategies, load a entire layer
57
 * or load subdatasets depending on the user selection or the layer structure.
58
 * 
59
 * @author Nacho Brodin (nachobrodin@gmail.com)
60
 */
61
public class LayerLoaderManager {
62
        private static int                  ALL_SUBDATASETS       = -2;
63
        private static int                  ENTIRE                = -1;
64
        
65
        private static Logger               logger                = LoggerFactory.getLogger(AddPostGISRasterLayerWizard.class.getName());
66
        private AddLayerUI                  apiUI                 = null;
67
        private DBServerExplorerParameters  dbExplorerParameters  = null;
68
        private MapContext                  mapContext            = null;
69
        
70
        public LayerLoaderManager(AddLayerUI ui) {
71
                this.apiUI = ui;
72
        }
73
        
74
        /**
75
         * Assigns a {@link DBServerExplorerParameters} 
76
         * @param params
77
         */
78
        public void setDBServerExplorerParameters(DBServerExplorerParameters params) {
79
                this.dbExplorerParameters = params;
80
        }
81
        
82
        /**
83
         * Gets the {@link DBServerExplorerParameters}
84
         * @return {@link DBServerExplorerParameters}
85
         */
86
        public DBServerExplorerParameters getDBServerExplorerParameters() {
87
                return this.dbExplorerParameters;
88
        }
89
        
90
        /**
91
         * Return FLayers if user performs multi selection.
92
         */
93
        public void loadLayers() {
94
                if(dbExplorerParameters == null)
95
                        return;
96
                
97
                List<Object> tables = apiUI.getSelectedTables();
98
                
99
                //Para una tabla seleccionada
100
                if(tables.size() == 1) {
101
                        TableListItem item = (TableListItem)tables.get(0);
102
                        String schema = item.getSchema();
103
                        String table = item.getTableName();
104
                        
105
                        //Sin subdatasets
106
                        if(getNumberOfColumns(schema, table) == 1) {
107
                                loadOneLayer(item, ENTIRE);
108
                        } 
109
                        //Con subdatasets
110
                        else { 
111
                                int[] subdatasets = apiUI.getSelectedSubdatasets();
112
                                if(subdatasets == null || subdatasets.length <= 0) {
113
                                        loadOneLayer(item, ALL_SUBDATASETS);
114
                                } else {
115
                                        long cols = getNumberOfColumns(schema, table);
116
                                        for (int i = 0; i < cols; i++) {
117
                                                loadOneLayer(item, i + 1);
118
                                        }
119
                                }
120
                        }
121
                }
122
                
123
                //Para m?s de una tabla seleccionada (se usan todos los subdatasets)
124
                if(tables.size() > 1) {
125
                        for (int i = 0; i < tables.size(); i++) {
126
                                TableListItem item = (TableListItem)tables.get(i);
127
                                String schema = item.getSchema();
128
                                String table = item.getTableName();
129
                                long subdatasets = getNumberOfColumns(schema, table);
130
                                if(subdatasets == 1) {
131
                                        loadOneLayer(item, ENTIRE);
132
                                } 
133
                                if(subdatasets > 1) {
134
                                        loadOneLayer(item, ALL_SUBDATASETS);
135
                                }
136
                        }
137
                }
138

    
139
        }
140
        
141
        /**
142
         * Loads only one layer
143
         * @param item
144
         * @param subdataset
145
         */
146
        private void loadOneLayer(TableListItem item, int subdataset) {
147
                String host = dbExplorerParameters.getHost();
148
                if(host.compareTo("localhost") == 0)
149
                        host = "127.0.0.1";
150
                Integer port = dbExplorerParameters.getPort();
151
                String dbname = dbExplorerParameters.getDBName();
152
                String user = dbExplorerParameters.getUser();
153
                String password = dbExplorerParameters.getPassword();
154
                String schema = item.getSchema();
155
                String table = item.getTableName();
156
                String connString = null;
157
                if(schema == null)
158
                        connString = "PG:host='" + host + "' port='" + port + "' dbname='" + dbname + "' user='" + user + "' password='" + password + "' table='" + table + "'";
159
                else
160
                        connString = "PG:host='" + host + "' port='" + port + "' dbname='" + dbname + "' user='" + user + "' password='" + password + "' schema='" + schema + "' table='" + table + "'";
161
                
162
                if(subdataset == ALL_SUBDATASETS)
163
                        connString += " mode='2'";
164
                
165
                if(subdataset >= 0)
166
                        connString += " column='rast' where='rid = "+ subdataset + "'";
167
                
168
                try {
169
                        FLayer layer = createLayer(getFormatedRasterFileName(connString), connString, item, getNumberOfColumns(schema, table));
170

    
171
                        //Adds the layer to the view
172
                        getMapContext().beginAtomicEvent();
173
                        layer.setVisible(true);
174
                        getMapContext().getLayers().addLayer(layer);
175
                        getMapContext().callLegendChanged();
176
                        getMapContext().endAtomicEvent();
177
                        getMapContext().invalidate();
178
                } catch (LoadLayerException e) {
179
                        logger.info("Error creating layer: " + e.getMessage(), e);
180
                        //showConnectionErrorMessage(PluginServices.getText(this, "error_creating_layer") + "");
181
                }
182
        }
183
        
184
        /**
185
         * Gets the MapContext
186
         * @return
187
         */
188
        private MapContext getMapContext() {
189
                if(mapContext == null) {
190
                        IWindow[] w = PluginServices.getMDIManager().getAllWindows();
191
                        for (int i = 0; i < w.length; i++) {
192
                                if (w[i] instanceof org.gvsig.app.project.documents.view.gui.AbstractViewPanel) {
193
                                        mapContext = ((org.gvsig.app.project.documents.view.gui.AbstractViewPanel)w[i]).getMapControl().getMapContext();
194
                                }
195
                        }
196
                }
197
                return mapContext;
198
        }
199
        
200
        /**
201
         * Builds a new raster layer
202
         * @param fileName
203
         * @return
204
         * @throws RasterNotLoadException 
205
         * @throws LoadLayerException 
206
         */
207
        @SuppressWarnings("deprecation")
208
        public FLyrRaster createLayer(String layerName, String conn, TableListItem item, long nColumns) throws LoadLayerException {
209
                DataManager dataManager = DALLocator.getDataManager();
210
                DefaultFLyrRaster lyr = null;
211
                try {
212
                        PostGISRasterServerExplorerParameters explorerParams = (PostGISRasterServerExplorerParameters) dataManager.createServerExplorerParameters(PostGISRasterServerExplorer.NAME);
213
                        explorerParams.setHost(conn);
214
                        PostGISRasterServerExplorer explorer = (PostGISRasterServerExplorer) dataManager.openServerExplorer(PostGISRasterServerExplorer.NAME,explorerParams);
215
                        PostGISRasterDataParameters storeParameters = (PostGISRasterDataParameters)explorer.getStoredParameters();
216
                        storeParameters.setURI(conn);
217
                        storeParameters.setDBExplorer(item.getExplorer());
218
                        storeParameters.setNumberOfBlocks(nColumns);
219
                        storeParameters.setDBStoreParameters(item.getDBStoreParameters());
220
                        storeParameters.setDBExplorerParameters(dbExplorerParameters);
221
                        
222
                        MapContextManager mcm = MapContextLocator.getMapContextManager();
223
                        
224
                        if(apiUI.isLayerTiled()) {
225
                                DataManager manager = DALLocator.getDataManager();
226
                                TileDataParameters tileParams = null;
227
                                try {
228
                                        tileParams = (TileDataParameters) manager.createStoreParameters("Tile Store");
229
                                } catch (InitializeException e) {
230
                                        throw new LoadLayerException("", e);
231
                                } catch (ProviderNotRegisteredException e) {
232
                                        throw new LoadLayerException("", e);
233
                                }
234
                                tileParams.setDataParameters(storeParameters);
235
                                lyr = (DefaultFLyrRaster) mcm.createLayer(layerName, tileParams);
236
                                //dataStore = dataManager.createStore(tileParams);
237
                        } else {
238
                                lyr = (DefaultFLyrRaster) mcm.createLayer(layerName, storeParameters);
239
                                //dataStore = dataManager.createStore(storeParameters);
240
                        }
241
                } catch (ValidateDataParametersException e) {
242
                        throw new LoadLayerException("Error validating parameters", e);
243
                } catch (InitializeException e) {
244
                        throw new LoadLayerException("Error initializating layer.", e);
245
                } catch (ProviderNotRegisteredException e) {
246
                        throw new LoadLayerException("Provider not registered.", e);
247
                } 
248
                
249
                return lyr;
250
        }
251
        
252
        /**
253
         * Gets the number of column of the selected table
254
         * @param schema
255
         * @param table
256
         * @return
257
         */
258
        @SuppressWarnings("deprecation")
259
        public long getNumberOfColumns(String schema, String table) {
260
                DataManager manager = DALLocator.getDataManager();
261
                try {
262
                        DataStoreParameters params = manager.createStoreParameters("PostgreSQL");
263

    
264
                        params.setDynValue("host", dbExplorerParameters.getHost());
265
                        params.setDynValue("port", dbExplorerParameters.getPort());
266
                        params.setDynValue("dbuser", dbExplorerParameters.getUser());
267
                        params.setDynValue("password", dbExplorerParameters.getPassword());
268
                        params.setDynValue("schema",  schema);
269
                        params.setDynValue("dbname", dbExplorerParameters.getDBName());
270
                        params.setDynValue("table", table);
271

    
272
                        FeatureStore store = (FeatureStore)manager.createStore(params);
273
                        long size = store.getFeatureCount();
274
                        store.dispose();
275
                        return size;
276
                } catch (DataException e) {
277
                        return 0;
278
                } catch (ValidateDataParametersException e) {
279
                        return 0;
280
                }
281
        }
282
        
283
        /**
284
         * Gets the name of a raster file
285
         */
286
        private String getFormatedRasterFileName(String name) {
287
                String newName = "";
288
                String schema = null;
289
                String table = null;
290
                int index = name.indexOf(" schema='") + 8;
291
                if(index != -1) {
292
                        try {
293
                                schema = name.substring(index + 1, name.indexOf("'", index + 1)); 
294
                                newName += schema + ".";
295
                        } catch (StringIndexOutOfBoundsException e) {
296
                        }
297
                }
298
                index = name.indexOf(" table='") + 7;
299
                if(index != -1) {
300
                        try {
301
                                table = name.substring(index + 1, name.indexOf("'", index + 1));
302
                                newName += table;
303
                        } catch (StringIndexOutOfBoundsException e) {
304
                        }
305
                }
306
                return newName;
307
        }
308
        
309
        /**
310
         * Shows an error
311
         * @param _msg
312
         */
313
        public void showConnectionErrorMessage(String _msg) {
314
                String msg = (_msg.length() > 300) ? "" : (": " + _msg);
315
                String title = PluginServices.getText(this, "connection_error");
316
                JOptionPane.showMessageDialog(apiUI.getComponent(), title + msg, title,
317
                                JOptionPane.ERROR_MESSAGE);
318
        }
319
        
320
        /**
321
         * Shows a information window
322
         * @param _msg
323
         */
324
        public void showConnectionInfoMessage(String _msg) {
325
                String msg = (_msg.length() > 300) ? "" : (": " + _msg);
326
                String title = PluginServices.getText(this, "warning");
327
                JOptionPane.showMessageDialog(apiUI.getComponent(), title + msg, title,
328
                                JOptionPane.WARNING_MESSAGE);
329
        }
330
}