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 @ 45911

History | View | Annotate | Download (16.3 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 java.util.logging.Level;
14
import java.util.logging.Logger;
15
import javax.swing.JOptionPane;
16
import javax.swing.filechooser.FileNameExtensionFilter;
17
import org.apache.commons.collections.CollectionUtils;
18
import org.apache.commons.io.FilenameUtils;
19
import org.apache.commons.lang3.ArrayUtils;
20
import org.apache.commons.lang3.BooleanUtils;
21
import org.apache.commons.lang3.StringUtils;
22
import org.gvsig.andami.IconThemeHelper;
23
import org.gvsig.andami.plugins.Extension;
24
import org.gvsig.app.ApplicationLocator;
25
import org.gvsig.app.ApplicationManager;
26
import org.gvsig.app.project.documents.view.ViewDocument;
27
import org.gvsig.app.project.documents.view.ViewManager;
28
import org.gvsig.desktopopen.DesktopOpen;
29
import org.gvsig.filedialogchooser.FileDialogChooser;
30
import org.gvsig.fmap.dal.DALLocator;
31
import org.gvsig.fmap.dal.DataManager;
32
import org.gvsig.fmap.dal.DataServerExplorerParameters;
33
import org.gvsig.fmap.dal.feature.FeatureStore;
34
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
35
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorer;
36
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
37
import org.gvsig.fmap.dal.swing.DALSwingLocator;
38
import org.gvsig.fmap.dal.swing.jdbc.JDBCConnectionPanel;
39
import org.gvsig.fmap.geom.primitive.Envelope;
40
import org.gvsig.fmap.mapcontext.MapContextLocator;
41
import org.gvsig.fmap.mapcontext.MapContextManager;
42
import org.gvsig.fmap.mapcontext.layers.FLayer;
43
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
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
        }
103
    }
104
    
105
    private void shutdownserver() {
106
      try {
107
        DataManager dataManager = DALLocator.getManager();
108
        DataServerExplorerParameters params = dataManager.createServerExplorerParameters(DAL_EXPLORER_NAME);
109
        JDBCServerExplorer server = (JDBCServerExplorer) dataManager.openServerExplorer(DAL_EXPLORER_NAME, params);
110
        server.execute("!SHUTDOWN");
111
      } catch (Exception ex) {
112
      }
113
    }
114
    
115
    private void startserver()  {
116
        try {
117
            Server server = Server.createWebServer("-webPort","8082");
118
            server.start();
119
        } catch (SQLException ex) {
120
            if( ex.getCause() instanceof BindException ) {
121
                logger.warn("Can't start H2 web server, ? Already running ?");
122
            } else {
123
                logger.warn("Can't start H2 web server.",ex);
124
            }
125
        }
126
    }
127

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

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

    
166
    @Override
167
    public boolean isEnabled(String action) {
168
        ApplicationManager application = ApplicationLocator.getManager();
169
        switch(action.toLowerCase()) {
170
        case "tools-h2spatial-show-admintool":
171
            return true;
172
        
173
        case "tools-h2spatial-linklayer":
174
            return ! CollectionUtils.isEmpty(this.getSelectedLayers());
175

    
176
        case "tools-h2spatial-import":
177
            return true;
178

    
179
        case "tools-h2spatial-downloadosm":
180
            ViewDocument viewDoc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
181
            if( viewDoc == null ) {
182
                return false;
183
            }
184
            Envelope env = viewDoc.getMapContext().getViewPort().getEnvelope();
185
            return !(env != null && env.isEmpty());
186

    
187
        case "tools-h2spatial-shutdownserver":
188
            return true;
189
            
190
        default:
191
            return false;
192
        }
193

    
194
    }
195

    
196
    @Override
197
    public boolean isVisible(String action) {
198
        return true;
199
    }
200

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

    
237
    private void importTables() {
238
        I18nManager i18n = ToolsLocator.getI18nManager();
239
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
240
        final ImportTable panel = new ImportTable();
241
        final Dialog dlg = winmanager.createDialog(
242
            panel,
243
            i18n.getTranslation("_Select_files_to_import"),
244
            i18n.getTranslation("_Select_files_to_import_as_tables_in_H2_database"),
245
            WindowManager_v2.BUTTONS_OK_CANCEL
246
        );
247
        dlg.addActionListener((ActionEvent e) -> {
248
            if( dlg.getAction()==WindowManager_v2.BUTTONS_OK ) {
249
                doImportTables(
250
                        panel.getExplorerParameters(),
251
                        panel.getFileType(),
252
                        panel.getFile(),
253
                        panel.getTableName(),
254
                        panel.getDeleteTables()
255
                );
256
            }
257
        });
258
        dlg.show(WindowManager.MODE.WINDOW);
259
    }
260
    
261
    private void doImportTables(JDBCServerExplorerParameters explorerParameters, String fileType, File file, String tableName, boolean deleteTables) {
262
        I18nManager i18n = ToolsLocator.getI18nManager();
263
        ApplicationManager application = ApplicationLocator.getManager();
264

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

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