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 |
} |