Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.h2spatial.app / org.gvsig.h2spatial.app.mainplugin / src / main / java / org / gvsig / h2spatial / H2SpatialExtension.java @ 44841

History | View | Annotate | Download (15.8 KB)

1

    
2
package org.gvsig.h2spatial;
3

    
4
import java.awt.event.ActionEvent;
5
import java.awt.event.ActionListener;
6
import java.io.File;
7
import java.net.BindException;
8
import java.sql.SQLException;
9
import java.text.MessageFormat;
10
import java.util.ArrayList;
11
import java.util.List;
12
import java.util.logging.Level;
13
import java.util.logging.Logger;
14
import javax.swing.JOptionPane;
15
import javax.swing.filechooser.FileNameExtensionFilter;
16
import org.apache.commons.collections.CollectionUtils;
17
import org.apache.commons.io.FilenameUtils;
18
import org.apache.commons.lang3.ArrayUtils;
19
import org.apache.commons.lang3.BooleanUtils;
20
import org.apache.commons.lang3.StringUtils;
21
import org.gvsig.andami.IconThemeHelper;
22
import org.gvsig.andami.plugins.Extension;
23
import org.gvsig.app.ApplicationLocator;
24
import org.gvsig.app.ApplicationManager;
25
import org.gvsig.app.project.documents.view.ViewDocument;
26
import org.gvsig.app.project.documents.view.ViewManager;
27
import org.gvsig.filedialogchooser.FileDialogChooser;
28
import org.gvsig.fmap.dal.DALLocator;
29
import org.gvsig.fmap.dal.DataManager;
30
import org.gvsig.fmap.dal.DataServerExplorer;
31
import org.gvsig.fmap.dal.DataServerExplorerParameters;
32
import org.gvsig.fmap.dal.exception.InitializeException;
33
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
34
import org.gvsig.fmap.dal.feature.FeatureStore;
35
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
36
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorer;
37
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
38
import org.gvsig.fmap.dal.swing.DALSwingLocator;
39
import org.gvsig.fmap.dal.swing.jdbc.JDBCConnectionPanel;
40
import org.gvsig.fmap.geom.primitive.Envelope;
41
import org.gvsig.fmap.mapcontext.MapContextLocator;
42
import org.gvsig.fmap.mapcontext.MapContextManager;
43
import org.gvsig.fmap.mapcontext.layers.FLayer;
44
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
45
import org.gvsig.tools.ToolsLocator;
46
import org.gvsig.tools.folders.FoldersManager;
47
import org.gvsig.tools.i18n.I18nManager;
48
import org.gvsig.tools.swing.api.ToolsSwingLocator;
49
import org.gvsig.tools.swing.api.windowmanager.Dialog;
50
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
51
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
52
import org.gvsig.webbrowser.WebBrowserFactory;
53
import org.gvsig.webbrowser.WebBrowserPanel;
54
import org.h2.tools.Server;
55

    
56

    
57
@SuppressWarnings("UseSpecificCatch")
58
public class H2SpatialExtension extends Extension {
59

    
60
    public static String DAL_EXPLORER_NAME = "H2Spatial";
61
    
62
    @Override
63
    public void initialize() {
64
    }
65

    
66
    @Override
67
    public boolean canQueryByAction() {
68
        return true;
69
    }
70
    
71
    @Override
72
    public void postInitialize() {
73
        MapContextManager mapContextMgr = MapContextLocator.getMapContextManager();
74
        
75
        IconThemeHelper.registerIcon("layer", "layer-icon-h2", this);
76
        mapContextMgr.registerIconLayer("H2Spatial", "layer-icon-h2");
77
    }
78
    
79
    @Override
80
    public void execute(String actionCommand) {
81
        switch(actionCommand.toLowerCase()) {
82
        case "tools-h2spatial-show-admintool":
83
            startserver();
84
            startbrowser();
85
            break;
86
        
87
        case "tools-h2spatial-linklayer":
88
            linkActiveLayers();
89
            break;
90

    
91
        case "tools-h2spatial-import":
92
            importTables();
93
            break;
94

    
95
        case "tools-h2spatial-downloadosm":
96
            downloadOSM();
97
            break;
98
        case "tools-h2spatial-shutdownserver":
99
            shutdownserver();
100
            break;
101
        }
102
    }
103
    
104
    private void shutdownserver() {
105
      try {
106
        DataManager dataManager = DALLocator.getManager();
107
        DataServerExplorerParameters params = dataManager.createServerExplorerParameters(DAL_EXPLORER_NAME);
108
        JDBCServerExplorer server = (JDBCServerExplorer) dataManager.openServerExplorer(DAL_EXPLORER_NAME, params);
109
        server.execute("!SHUTDOWN");
110
      } catch (Exception ex) {
111
      }
112
    }
113
    
114
    private void startserver()  {
115
        try {
116
            Server server = Server.createWebServer("-webPort","8082");
117
            server.start();
118
        } catch (SQLException ex) {
119
            if( ex.getCause() instanceof BindException ) {
120
                logger.warn("Can't start H2 web server, ? Already running ?");
121
            } else {
122
                logger.warn("Can't start H2 web server.",ex);
123
            }
124
        }
125
    }
126

    
127
    private List<FLyrVect> getSelectedLayers() {
128
        ApplicationManager application = ApplicationLocator.getManager();
129
        ViewDocument viewdoc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
130
        if( viewdoc == null ) {
131
            return null;
132
        }
133
        FLayer[] layers = viewdoc.getMapContext().getLayers().getActives();
134
        if( ArrayUtils.isEmpty(layers) ) {
135
            return null;
136
        }
137
        List<FLyrVect> r = new ArrayList<>();
138
        for( FLayer layer : layers ) {
139
            if( layer instanceof FLyrVect ) {
140
                FeatureStore store = ((FLyrVect)layer).getFeatureStore();
141
                if( store != null ) {
142
                    if( store.getParameters() instanceof FilesystemStoreParameters &&
143
                        StringUtils.equalsIgnoreCase(store.getProviderName(),"Shape") ) {
144
                        r.add((FLyrVect) layer);
145
                    }
146
                }
147
            }
148
        }
149
        if( r.isEmpty() ) {
150
            return null;
151
        }
152
        return r;
153
    }
154
    
155
    @Override
156
    public boolean isEnabled() {
157
        return true;
158
    }
159

    
160
    @Override
161
    public boolean isVisible() {
162
        return true;
163
    }
164

    
165
    @Override
166
    public boolean isEnabled(String action) {
167
        ApplicationManager application = ApplicationLocator.getManager();
168

    
169
        if( "tools-h2spatial-show-admintool".equalsIgnoreCase(action) ) {
170
            return true;
171
        } 
172
        if( "tools-h2spatial-linklayer".equalsIgnoreCase(action) ) {
173
            return ! CollectionUtils.isEmpty(this.getSelectedLayers());
174
        }
175
        if( "tools-h2spatial-import".equalsIgnoreCase(action) ) {
176
            return true;
177
        }
178
        if( "tools-h2spatial-downloadosm".equalsIgnoreCase(action) ) {
179
            ViewDocument viewDoc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
180
            if( viewDoc == null ) {
181
                return false;
182
            }
183
            Envelope env = viewDoc.getMapContext().getViewPort().getEnvelope();
184
            return !(env != null && env.isEmpty());
185
        }
186
        return false;
187
    }
188

    
189
    @Override
190
    public boolean isVisible(String action) {
191
        return true;
192
    }
193

    
194
    private void startbrowser() {
195
        WindowManager winmanager = ToolsSwingLocator.getWindowManager();
196
        WebBrowserPanel webbrowser = WebBrowserFactory.createWebBrowserPanel();
197
        winmanager.showWindow(
198
            webbrowser.asJComponent(), 
199
            ToolsLocator.getI18nManager().getTranslation("_H2_administration_tool"), 
200
            WindowManager.MODE.WINDOW
201
        );
202
        webbrowser.setPage("http://localhost:8082");
203
        
204
    }
205
    
206
    private void importTables() {
207
        I18nManager i18n = ToolsLocator.getI18nManager();
208
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
209
        final ImportTable panel = new ImportTable();
210
        final Dialog dlg = winmanager.createDialog(
211
            panel,
212
            i18n.getTranslation("_Select_files_to_import"),
213
            i18n.getTranslation("_Select_files_to_import_as_tables_in_H2_database"),
214
            WindowManager_v2.BUTTONS_OK_CANCEL
215
        );
216
        dlg.addActionListener(new ActionListener() {
217
            @Override
218
            public void actionPerformed(ActionEvent e) {
219
                if( dlg.getAction()==WindowManager_v2.BUTTONS_OK ) {
220
                    doImportTables(
221
                        panel.getExplorerParameters(),
222
                        panel.getFileType(),
223
                        panel.getFile(),
224
                        panel.getTableName(),
225
                        panel.getDeleteTables()
226
                    );
227
                }
228
            }
229
        });
230
        dlg.show(WindowManager.MODE.WINDOW);
231
    }
232
    
233
    private void doImportTables(JDBCServerExplorerParameters explorerParameters, String fileType, File file, String tableName, boolean deleteTables) {
234
        I18nManager i18n = ToolsLocator.getI18nManager();
235
        ApplicationManager application = ApplicationLocator.getManager();
236

    
237
        StringBuilder sql = new StringBuilder();
238
        switch(fileType.toLowerCase()) {
239
        case "gpx":
240
            sql.append("CALL GPXRead('");
241
            sql.append(file.getAbsolutePath());
242
            sql.append("', '");
243
            sql.append(tableName);
244
            sql.append("');");
245
            break;
246
        case "geojson":
247
            sql.append("CALL GeoJsonRead('");
248
            sql.append(file.getAbsolutePath());
249
            sql.append("', '");
250
            sql.append(tableName);
251
            sql.append("');");
252
            break;
253
        case "osm":
254
            sql.append("CALL OSMRead('");
255
            sql.append(file.getAbsolutePath());
256
            sql.append("', '");
257
            sql.append(tableName);
258
            sql.append("', ");
259
            sql.append(BooleanUtils.toStringTrueFalse(deleteTables));
260
            sql.append(");");
261
            break;
262
        default:
263
            return;
264
        }
265
        try {
266
            DataManager dataManager = DALLocator.getDataManager();
267
            JDBCServerExplorer explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
268
                explorerParameters.getExplorerName(), 
269
                explorerParameters
270
            );
271
            explorer.execute(sql.toString());
272
        } catch(Exception ex) {
273
            logger.warn("Can't import file.",ex);
274
            application.messageDialog(
275
                i18n.getTranslation("_Cant_import_file.") + 
276
                    "\n" + 
277
                    i18n.getTranslation("_See_the_log_file_to_more_information"), 
278
                i18n.getTranslation("_Warning"), 
279
                JOptionPane.WARNING_MESSAGE
280
            );
281
        }
282
    }
283
    
284
    private void linkActiveLayers() {
285
        I18nManager i18n = ToolsLocator.getI18nManager();
286
        final List<FLyrVect> layers = this.getSelectedLayers();
287
        if( CollectionUtils.isEmpty(layers) ) {
288
            return;
289
        }
290
        final JDBCConnectionPanel jdbcConnectionPanel = DALSwingLocator.getSwingManager().createJDBCConnectionPanel();
291
        jdbcConnectionPanel.setConnectorFilter(new JDBCConnectionPanel.ConnectorFilter() {
292
            @Override
293
            public boolean accept(JDBCServerExplorerParameters parameters) {
294
                return StringUtils.equalsIgnoreCase(parameters.getExplorerName(), DAL_EXPLORER_NAME);
295
            }
296
        });
297
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
298
        final Dialog dlg = winmanager.createDialog(
299
            jdbcConnectionPanel.asJComponent(),
300
            i18n.getTranslation("_Select_database"),
301
            null, 
302
            WindowManager_v2.BUTTONS_OK_CANCEL
303
        );
304
        dlg.addActionListener(new ActionListener() {
305
            @Override
306
            public void actionPerformed(ActionEvent e) {
307
                if( dlg.getAction()==WindowManager_v2.BUTTONS_OK ) {
308
                    JDBCServerExplorerParameters params = jdbcConnectionPanel.getServerExplorerParameters();
309
                    linkLayers(layers, params);
310
                }
311
            }
312
        });
313
        dlg.show(WindowManager.MODE.WINDOW);
314
    }
315
    
316
    private void linkLayers(List<FLyrVect> layers, JDBCServerExplorerParameters params) {
317
        try {
318
            JDBCServerExplorer explorer = (JDBCServerExplorer) DALLocator.getDataManager().openServerExplorer(
319
                params.getExplorerName(),
320
                params
321
            );
322
            for( FLyrVect layer : layers ) {
323
                FilesystemStoreParameters layerParameters = (FilesystemStoreParameters) 
324
                    layer.getFeatureStore().getParameters();
325
                File f = layerParameters.getFile();
326
                String sql = MessageFormat.format(
327
                    "CALL FILE_TABLE(''{0}'', ''{1}'')",
328
                    FilenameUtils.normalize(f.getAbsolutePath(), true),
329
                    layer.getName()
330
                );
331
                explorer.execute(sql);
332
            }
333
        } catch (Exception ex) {
334
        }
335
    }
336

    
337
    private void downloadOSM() {
338
        
339
        I18nManager i18n = ToolsLocator.getI18nManager();
340
        FoldersManager foldersManager = ToolsLocator.getFoldersManager();
341
        ApplicationManager application = ApplicationLocator.getManager();
342
        
343
        ViewDocument viewDoc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
344
        if( viewDoc == null ) {
345
            return;
346
        }
347
        final Envelope env = viewDoc.getMapContext().getViewPort().getEnvelope();
348
        final File[] files = application.showChooserDialog(
349
            i18n.getTranslation("_Select_the_file_in_which_to_save_the_data"), 
350
            FileDialogChooser.SAVE_DIALOG, 
351
            FileDialogChooser.FILES_ONLY, 
352
            false, 
353
            foldersManager.get("DataFolder"), 
354
            new FileNameExtensionFilter(
355
                "OSM File (.osm, .osm.gz, .osm.bz2)",
356
                ".osm", ".osm.gz", ".osm.bz2"
357
            ), 
358
            false
359
        );
360
        
361
        if( !ArrayUtils.isEmpty(files) ) {
362
            final JDBCConnectionPanel jdbcConnectionPanel = DALSwingLocator.getSwingManager().createJDBCConnectionPanel();
363
            jdbcConnectionPanel.setConnectorFilter(new JDBCConnectionPanel.ConnectorFilter() {
364
                @Override
365
                public boolean accept(JDBCServerExplorerParameters parameters) {
366
                    return StringUtils.equalsIgnoreCase(parameters.getExplorerName(), DAL_EXPLORER_NAME);
367
                }
368
            });
369
            WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
370
            final Dialog dlg = winmanager.createDialog(
371
                jdbcConnectionPanel.asJComponent(),
372
                i18n.getTranslation("_Select_database"),
373
                null, 
374
                WindowManager_v2.BUTTONS_OK_CANCEL
375
            );
376
            dlg.addActionListener(new ActionListener() {
377
                @Override
378
                public void actionPerformed(ActionEvent e) {
379
                    if( dlg.getAction()==WindowManager_v2.BUTTONS_OK ) {
380
                        doDownloadOSM( 
381
                            env, 
382
                            files[0], 
383
                            jdbcConnectionPanel.getServerExplorerParameters()
384
                        );
385
                    }
386
                }
387
            });
388
            dlg.show(WindowManager.MODE.WINDOW);
389
        }
390
    }
391
    
392
    private void doDownloadOSM(Envelope env, File f, JDBCServerExplorerParameters explorerParameters) {
393
        I18nManager i18n = ToolsLocator.getI18nManager();
394
        ApplicationManager application = ApplicationLocator.getManager();
395
        
396
        try {
397
            String sql = MessageFormat.format(
398
                "CALL ST_OSMDownloader(''{0}''::geometry, ''{1}'');",
399
                env.getGeometry().convertToWKT(),
400
                f.getAbsolutePath()
401
            );
402
            DataManager dataManager = DALLocator.getDataManager();
403
            JDBCServerExplorer explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
404
                explorerParameters.getExplorerName(), 
405
                explorerParameters
406
            );
407
            explorer.execute(sql);
408
        } catch(Exception ex) {
409
            logger.warn("Can't download from OSM.",ex);
410
            application.messageDialog(
411
                i18n.getTranslation("_Cant_download_from_OSM.") + 
412
                    "\n" + 
413
                    i18n.getTranslation("_See_the_log_file_to_more_information"), 
414
                i18n.getTranslation("_Warning"), 
415
                JOptionPane.WARNING_MESSAGE
416
            );
417
        }
418
    }
419
}