Statistics
| Revision:

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

History | View | Annotate | Download (18 KB)

1

    
2
package org.gvsig.h2spatial;
3

    
4
import java.awt.event.ActionEvent;
5
import java.io.File;
6
import java.net.BindException;
7
import java.net.URI;
8
import java.net.URISyntaxException;
9
import java.sql.SQLException;
10
import java.text.MessageFormat;
11
import java.util.ArrayList;
12
import java.util.List;
13
import javax.swing.JOptionPane;
14
import javax.swing.filechooser.FileNameExtensionFilter;
15
import org.apache.commons.collections.CollectionUtils;
16
import org.apache.commons.io.FilenameUtils;
17
import org.apache.commons.lang3.ArrayUtils;
18
import org.apache.commons.lang3.BooleanUtils;
19
import org.apache.commons.lang3.StringUtils;
20
import org.gvsig.andami.IconThemeHelper;
21
import org.gvsig.andami.plugins.Extension;
22
import org.gvsig.app.ApplicationLocator;
23
import org.gvsig.app.ApplicationManager;
24
import org.gvsig.app.project.documents.view.ViewDocument;
25
import org.gvsig.app.project.documents.view.ViewManager;
26
import org.gvsig.desktopopen.DesktopOpen;
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.DataServerExplorerParameters;
31
import org.gvsig.fmap.dal.feature.FeatureStore;
32
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
33
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorer;
34
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
35
import org.gvsig.fmap.dal.swing.DALSwingLocator;
36
import org.gvsig.fmap.dal.swing.jdbc.JDBCConnectionPanel;
37
import org.gvsig.fmap.geom.primitive.Envelope;
38
import org.gvsig.fmap.mapcontext.MapContextLocator;
39
import org.gvsig.fmap.mapcontext.MapContextManager;
40
import org.gvsig.fmap.mapcontext.layers.FLayer;
41
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
42
import org.gvsig.h2spatial.backup.Backup;
43
import org.gvsig.h2spatial.restore.Restore;
44
import org.gvsig.tools.ToolsLocator;
45
import org.gvsig.tools.folders.FoldersManager;
46
import org.gvsig.tools.i18n.I18nManager;
47
import org.gvsig.tools.swing.api.ToolsSwingLocator;
48
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
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.tools.util.ToolsUtilLocator;
53
import org.gvsig.webbrowser.WebBrowserFactory;
54
import org.gvsig.webbrowser.WebBrowserPanel;
55
import org.h2.tools.Server;
56

    
57

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

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

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

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

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

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

    
167
    @Override
168
    public boolean isVisible() {
169
        return true;
170
    }
171

    
172
    @Override
173
    public boolean isEnabled(String action) {
174
        ApplicationManager application = ApplicationLocator.getManager();
175
        switch(action.toLowerCase()) {
176
        case "tools-h2spatial-show-admintool":
177
            return true;
178
        
179
        case "tools-h2spatial-linklayer":
180
            return ! CollectionUtils.isEmpty(this.getSelectedLayers());
181

    
182
        case "tools-h2spatial-import":
183
            return true;
184

    
185
        case "tools-h2spatial-downloadosm":
186
            ViewDocument viewDoc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
187
            if( viewDoc == null ) {
188
                return false;
189
            }
190
            Envelope env = viewDoc.getMapContext().getViewPort().getEnvelope();
191
            return !(env != null && env.isEmpty());
192

    
193
        case "tools-h2spatial-shutdownserver":
194
            return true;
195
            
196
        case "tools-h2spatial-backup":
197
            return true;
198

    
199
        case "tools-h2spatial-restore":
200
            return true;
201
            
202
        default:
203
            return false;
204
        }
205

    
206
    }
207

    
208
    @Override
209
    public boolean isVisible(String action) {
210
        return true;
211
    }
212

    
213
    private void startbrowser() {
214
        try {
215
            WindowManager winmanager = ToolsSwingLocator.getWindowManager();
216
            WebBrowserPanel webbrowser = WebBrowserFactory.createWebBrowserPanel();
217
            winmanager.showWindow(
218
                    webbrowser.asJComponent(),
219
                    ToolsLocator.getI18nManager().getTranslation("_H2_administration_tool"),
220
                    WindowManager.MODE.WINDOW
221
            );
222
            webbrowser.setPage("http://localhost:8082");
223
            return;
224
        } catch (Throwable t) {
225
            logger.warn("Can't launch embedded web browser", t);
226
        }
227
        I18nManager i18n = ToolsLocator.getI18nManager();
228
        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
229
        int res = dialogs.confirmDialog(
230
                i18n.getTranslation(
231
                        "_Unable_to_start_the_builtin_internal_browser_Do_you_want_to_try_opening_the_system_browser"
232
                ),
233
                i18n.getTranslation("_H2_administration_tool"),
234
                JOptionPane.YES_NO_OPTION,
235
                JOptionPane.WARNING_MESSAGE,
236
                "_Show_H2_administration_tool_with_external_browser"
237
        );
238
        if (res != JOptionPane.YES_OPTION) {
239
            return;
240
        }
241
        try {
242
            DesktopOpen desktop = ToolsUtilLocator.getToolsUtilManager().createDesktopOpen();
243
            desktop.browse(new URI("http://localhost:8082"));
244
        } catch (URISyntaxException ex) {
245
            logger.warn("Can't launch external web browser", ex);
246
        }
247
    }
248

    
249
    private void importTables() {
250
        I18nManager i18n = ToolsLocator.getI18nManager();
251
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
252
        final ImportTable panel = new ImportTable();
253
        final Dialog dlg = winmanager.createDialog(
254
            panel,
255
            i18n.getTranslation("_Select_files_to_import"),
256
            i18n.getTranslation("_Select_files_to_import_as_tables_in_H2_database"),
257
            WindowManager_v2.BUTTONS_OK_CANCEL
258
        );
259
        dlg.addActionListener((ActionEvent e) -> {
260
            if( dlg.getAction()==WindowManager_v2.BUTTONS_OK ) {
261
                doImportTables(
262
                        panel.getExplorerParameters(),
263
                        panel.getFileType(),
264
                        panel.getFile(),
265
                        panel.getTableName(),
266
                        panel.getDeleteTables()
267
                );
268
            }
269
        });
270
        dlg.show(WindowManager.MODE.WINDOW);
271
    }
272
    
273
    private void doImportTables(JDBCServerExplorerParameters explorerParameters, String fileType, File file, String tableName, boolean deleteTables) {
274
        I18nManager i18n = ToolsLocator.getI18nManager();
275
        ApplicationManager application = ApplicationLocator.getManager();
276

    
277
        StringBuilder sql = new StringBuilder();
278
        switch(fileType.toLowerCase()) {
279
        case "gpx":
280
            sql.append("CALL GPXRead('");
281
            sql.append(file.getAbsolutePath());
282
            sql.append("', '");
283
            sql.append(tableName);
284
            sql.append("');");
285
            break;
286
        case "geojson":
287
            sql.append("CALL GeoJsonRead('");
288
            sql.append(file.getAbsolutePath());
289
            sql.append("', '");
290
            sql.append(tableName);
291
            sql.append("');");
292
            break;
293
        case "osm":
294
            sql.append("CALL OSMRead('");
295
            sql.append(file.getAbsolutePath());
296
            sql.append("', '");
297
            sql.append(tableName);
298
            sql.append("', ");
299
            sql.append(BooleanUtils.toStringTrueFalse(deleteTables));
300
            sql.append(");");
301
            break;
302
        default:
303
            return;
304
        }
305
        try {
306
            DataManager dataManager = DALLocator.getDataManager();
307
            JDBCServerExplorer explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
308
                explorerParameters.getExplorerName(), 
309
                explorerParameters
310
            );
311
            explorer.execute(sql.toString());
312
        } catch(Exception ex) {
313
            logger.warn("Can't import file.",ex);
314
            application.messageDialog(
315
                i18n.getTranslation("_Cant_import_file.") + 
316
                    "\n" + 
317
                    i18n.getTranslation("_See_the_log_file_to_more_information"), 
318
                i18n.getTranslation("_Warning"), 
319
                JOptionPane.WARNING_MESSAGE
320
            );
321
        }
322
    }
323
    
324
    private void linkActiveLayers() {
325
        I18nManager i18n = ToolsLocator.getI18nManager();
326
        final List<FLyrVect> layers = this.getSelectedLayers();
327
        if( CollectionUtils.isEmpty(layers) ) {
328
            return;
329
        }
330
        final JDBCConnectionPanel jdbcConnectionPanel = DALSwingLocator.getSwingManager().createJDBCConnectionPanel();
331
        jdbcConnectionPanel.setConnectorFilter((JDBCServerExplorerParameters parameters) -> StringUtils.equalsIgnoreCase(parameters.getExplorerName(), DAL_EXPLORER_NAME));
332
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
333
        final Dialog dlg = winmanager.createDialog(
334
            jdbcConnectionPanel.asJComponent(),
335
            i18n.getTranslation("_Select_database"),
336
            null, 
337
            WindowManager_v2.BUTTONS_OK_CANCEL
338
        );
339
        dlg.addActionListener((ActionEvent e) -> {
340
            if( dlg.getAction()==WindowManager_v2.BUTTONS_OK ) {
341
                JDBCServerExplorerParameters params = jdbcConnectionPanel.getServerExplorerParameters();
342
                linkLayers(layers, params);
343
            }
344
        });
345
        dlg.show(WindowManager.MODE.WINDOW);
346
    }
347
    
348
    private void linkLayers(List<FLyrVect> layers, JDBCServerExplorerParameters params) {
349
        try {
350
            JDBCServerExplorer explorer = (JDBCServerExplorer) DALLocator.getDataManager().openServerExplorer(
351
                params.getExplorerName(),
352
                params
353
            );
354
            for( FLyrVect layer : layers ) {
355
                FilesystemStoreParameters layerParameters = (FilesystemStoreParameters) 
356
                    layer.getFeatureStore().getParameters();
357
                File f = layerParameters.getFile();
358
                String sql = MessageFormat.format(
359
                    "CALL FILE_TABLE(''{0}'', ''{1}'')",
360
                    FilenameUtils.normalize(f.getAbsolutePath(), true),
361
                    layer.getName()
362
                );
363
                explorer.execute(sql);
364
            }
365
        } catch (Exception ex) {
366
        }
367
    }
368

    
369
    private void downloadOSM() {
370
        
371
        I18nManager i18n = ToolsLocator.getI18nManager();
372
        FoldersManager foldersManager = ToolsLocator.getFoldersManager();
373
        ApplicationManager application = ApplicationLocator.getManager();
374
        
375
        ViewDocument viewDoc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
376
        if( viewDoc == null ) {
377
            return;
378
        }
379
        final Envelope env = viewDoc.getMapContext().getViewPort().getEnvelope();
380
        final File[] files = application.showChooserDialog(
381
            i18n.getTranslation("_Select_the_file_in_which_to_save_the_data"), 
382
            FileDialogChooser.SAVE_DIALOG, 
383
            FileDialogChooser.FILES_ONLY, 
384
            false, 
385
            foldersManager.get("DataFolder"), 
386
            new FileNameExtensionFilter(
387
                "OSM File (.osm, .osm.gz, .osm.bz2)",
388
                ".osm", ".osm.gz", ".osm.bz2"
389
            ), 
390
            false
391
        );
392
        
393
        if( !ArrayUtils.isEmpty(files) ) {
394
            final JDBCConnectionPanel jdbcConnectionPanel = DALSwingLocator.getSwingManager().createJDBCConnectionPanel();
395
            jdbcConnectionPanel.setConnectorFilter((JDBCServerExplorerParameters parameters) -> 
396
                    StringUtils.equalsIgnoreCase(parameters.getExplorerName(), DAL_EXPLORER_NAME)
397
            );
398
            WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
399
            final Dialog dlg = winmanager.createDialog(
400
                jdbcConnectionPanel.asJComponent(),
401
                i18n.getTranslation("_Select_database"),
402
                null, 
403
                WindowManager_v2.BUTTONS_OK_CANCEL
404
            );
405
            dlg.addActionListener((ActionEvent e) -> {
406
                if( dlg.getAction()==WindowManager_v2.BUTTONS_OK ) {
407
                    doDownloadOSM(
408
                            env,
409
                            files[0], 
410
                            jdbcConnectionPanel.getServerExplorerParameters()
411
                    );
412
                }
413
            });
414
            dlg.show(WindowManager.MODE.WINDOW);
415
        }
416
    }
417
    
418
    private void doDownloadOSM(Envelope env, File f, JDBCServerExplorerParameters explorerParameters) {
419
        I18nManager i18n = ToolsLocator.getI18nManager();
420
        ApplicationManager application = ApplicationLocator.getManager();
421
        
422
        try {
423
            String sql = MessageFormat.format(
424
                "CALL ST_OSMDownloader(''{0}''::geometry, ''{1}'');",
425
                env.getGeometry().convertToWKT(),
426
                f.getAbsolutePath()
427
            );
428
            DataManager dataManager = DALLocator.getDataManager();
429
            JDBCServerExplorer explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
430
                explorerParameters.getExplorerName(), 
431
                explorerParameters
432
            );
433
            explorer.execute(sql);
434
        } catch(Exception ex) {
435
            logger.warn("Can't download from OSM.",ex);
436
            application.messageDialog(
437
                i18n.getTranslation("_Cant_download_from_OSM.") + 
438
                    "\n" + 
439
                    i18n.getTranslation("_See_the_log_file_to_more_information"), 
440
                i18n.getTranslation("_Warning"), 
441
                JOptionPane.WARNING_MESSAGE
442
            );
443
        }
444
    }
445
    
446
    private void backup() {
447
        I18nManager i18n = ToolsLocator.getI18nManager();
448
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
449
        final Backup panel = new Backup();
450
        final Dialog dlg = winmanager.createDialog(
451
                panel,
452
                i18n.getTranslation("_Backup"),
453
                i18n.getTranslation("_Backup_H2_database"),
454
                WindowManager_v2.BUTTONS_OK_CANCEL
455
        );
456
        dlg.addActionListener((ActionEvent e) -> {
457
            if (dlg.getAction() == WindowManager_v2.BUTTONS_OK) {
458
                panel.createBackup();
459
            }
460
        });
461
        dlg.show(WindowManager.MODE.WINDOW);
462
    }
463

    
464
    private void restore() {
465
        I18nManager i18n = ToolsLocator.getI18nManager();
466
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
467
        final Restore panel = new Restore();
468
        final Dialog dlg = winmanager.createDialog(
469
                panel,
470
                i18n.getTranslation("_Restore"),
471
                i18n.getTranslation("_Restore_H2_database"),
472
                WindowManager_v2.BUTTONS_OK_CANCEL
473
        );
474
        dlg.addActionListener((ActionEvent e) -> {
475
            if (dlg.getAction() == WindowManager_v2.BUTTONS_OK) {
476
                panel.restoreBackup();
477
            }
478
        });
479
        dlg.show(WindowManager.MODE.WINDOW);
480
    }
481

    
482
}