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

History | View | Annotate | Download (15 KB)

1 43377 jjdelcerro
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 43400 jjdelcerro
import javax.swing.JOptionPane;
13 43594 jjdelcerro
import javax.swing.filechooser.FileNameExtensionFilter;
14 43377 jjdelcerro
import org.apache.commons.collections.CollectionUtils;
15
import org.apache.commons.io.FilenameUtils;
16
import org.apache.commons.lang3.ArrayUtils;
17 43400 jjdelcerro
import org.apache.commons.lang3.BooleanUtils;
18 43377 jjdelcerro
import org.apache.commons.lang3.StringUtils;
19
import org.gvsig.andami.IconThemeHelper;
20
import org.gvsig.andami.plugins.Extension;
21
import org.gvsig.app.ApplicationLocator;
22
import org.gvsig.app.ApplicationManager;
23
import org.gvsig.app.project.documents.view.ViewDocument;
24
import org.gvsig.app.project.documents.view.ViewManager;
25 43594 jjdelcerro
import org.gvsig.filedialogchooser.FileDialogChooser;
26 43377 jjdelcerro
import org.gvsig.fmap.dal.DALLocator;
27 43400 jjdelcerro
import org.gvsig.fmap.dal.DataManager;
28 43377 jjdelcerro
import org.gvsig.fmap.dal.feature.FeatureStore;
29
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
30
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorer;
31
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
32
import org.gvsig.fmap.dal.swing.DALSwingLocator;
33
import org.gvsig.fmap.dal.swing.jdbc.JDBCConnectionPanel;
34 43400 jjdelcerro
import org.gvsig.fmap.geom.primitive.Envelope;
35 43377 jjdelcerro
import org.gvsig.fmap.mapcontext.MapContextLocator;
36
import org.gvsig.fmap.mapcontext.MapContextManager;
37
import org.gvsig.fmap.mapcontext.layers.FLayer;
38
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
39
import org.gvsig.tools.ToolsLocator;
40 43400 jjdelcerro
import org.gvsig.tools.folders.FoldersManager;
41
import org.gvsig.tools.i18n.I18nManager;
42 43377 jjdelcerro
import org.gvsig.tools.swing.api.ToolsSwingLocator;
43
import org.gvsig.tools.swing.api.windowmanager.Dialog;
44
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
45
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
46
import org.gvsig.webbrowser.WebBrowserFactory;
47
import org.gvsig.webbrowser.WebBrowserPanel;
48
import org.h2.tools.Server;
49
50
51
public class H2SpatialExtension extends Extension {
52
53 43400 jjdelcerro
    public static String DAL_EXPLORER_NAME = "H2Spatial";
54
55 43377 jjdelcerro
    @Override
56
    public void initialize() {
57
    }
58
59
    @Override
60
    public boolean canQueryByAction() {
61
        return true;
62
    }
63
64
    @Override
65
    public void postInitialize() {
66
        MapContextManager mapContextMgr = MapContextLocator.getMapContextManager();
67
68
        IconThemeHelper.registerIcon("layer", "layer-icon-h2", this);
69
        mapContextMgr.registerIconLayer("H2Spatial", "layer-icon-h2");
70
    }
71
72
    @Override
73
    public void execute(String actionCommand) {
74 43400 jjdelcerro
        switch(actionCommand.toLowerCase()) {
75
        case "tools-h2spatial-show-admintool":
76 43377 jjdelcerro
            startserver();
77
            startbrowser();
78 43400 jjdelcerro
            break;
79
80
        case "tools-h2spatial-linklayer":
81 43377 jjdelcerro
            linkActiveLayers();
82 43400 jjdelcerro
            break;
83
84
        case "tools-h2spatial-import":
85
            importTables();
86
            break;
87
88
        case "tools-h2spatial-downloadosm":
89
            downloadOSM();
90
            break;
91 43377 jjdelcerro
        }
92
    }
93
94
    private void startserver()  {
95
        try {
96
            Server server = Server.createWebServer("-webPort","8082");
97
            server.start();
98
        } catch (SQLException ex) {
99
            if( ex.getCause() instanceof BindException ) {
100
                logger.warn("Can't start H2 web server, ? Already running ?");
101
            } else {
102
                logger.warn("Can't start H2 web server.",ex);
103
            }
104
        }
105
    }
106
107
    private List<FLyrVect> getSelectedLayers() {
108
        ApplicationManager application = ApplicationLocator.getManager();
109
        ViewDocument viewdoc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
110
        if( viewdoc == null ) {
111
            return null;
112
        }
113
        FLayer[] layers = viewdoc.getMapContext().getLayers().getActives();
114
        if( ArrayUtils.isEmpty(layers) ) {
115
            return null;
116
        }
117
        List<FLyrVect> r = new ArrayList<>();
118
        for( FLayer layer : layers ) {
119
            if( layer instanceof FLyrVect ) {
120
                FeatureStore store = ((FLyrVect)layer).getFeatureStore();
121
                if( store != null ) {
122
                    if( store.getParameters() instanceof FilesystemStoreParameters &&
123
                        StringUtils.equalsIgnoreCase(store.getProviderName(),"Shape") ) {
124
                        r.add((FLyrVect) layer);
125
                    }
126
                }
127
            }
128
        }
129
        if( r.isEmpty() ) {
130
            return null;
131
        }
132
        return r;
133
    }
134
135
    @Override
136
    public boolean isEnabled() {
137
        return true;
138
    }
139
140
    @Override
141
    public boolean isVisible() {
142
        return true;
143
    }
144
145
    @Override
146
    public boolean isEnabled(String action) {
147 43400 jjdelcerro
        ApplicationManager application = ApplicationLocator.getManager();
148
149 43377 jjdelcerro
        if( "tools-h2spatial-show-admintool".equalsIgnoreCase(action) ) {
150
            return true;
151
        }
152
        if( "tools-h2spatial-linklayer".equalsIgnoreCase(action) ) {
153
            return ! CollectionUtils.isEmpty(this.getSelectedLayers());
154
        }
155 43400 jjdelcerro
        if( "tools-h2spatial-import".equalsIgnoreCase(action) ) {
156
            return true;
157
        }
158
        if( "tools-h2spatial-downloadosm".equalsIgnoreCase(action) ) {
159
            ViewDocument viewDoc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
160
            if( viewDoc == null ) {
161
                return false;
162
            }
163
            Envelope env = viewDoc.getMapContext().getViewPort().getEnvelope();
164
            return !(env != null && env.isEmpty());
165
        }
166 43377 jjdelcerro
        return false;
167
    }
168
169
    @Override
170
    public boolean isVisible(String action) {
171
        return true;
172
    }
173
174
    private void startbrowser() {
175
        WindowManager winmanager = ToolsSwingLocator.getWindowManager();
176
        WebBrowserPanel webbrowser = WebBrowserFactory.createWebBrowserPanel();
177
        winmanager.showWindow(
178
            webbrowser.asJComponent(),
179
            ToolsLocator.getI18nManager().getTranslation("_H2_administration_tool"),
180
            WindowManager.MODE.WINDOW
181
        );
182
        webbrowser.setPage("http://localhost:8082");
183
184
    }
185
186 43400 jjdelcerro
    private void importTables() {
187
        I18nManager i18n = ToolsLocator.getI18nManager();
188
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
189 43402 jjdelcerro
        final ImportTable panel = new ImportTable();
190 43400 jjdelcerro
        final Dialog dlg = winmanager.createDialog(
191
            panel,
192
            i18n.getTranslation("_Select_files_to_import"),
193
            i18n.getTranslation("_Select_files_to_import_as_tables_in_H2_database"),
194
            WindowManager_v2.BUTTONS_OK_CANCEL
195
        );
196
        dlg.addActionListener(new ActionListener() {
197
            @Override
198
            public void actionPerformed(ActionEvent e) {
199
                if( dlg.getAction()==WindowManager_v2.BUTTONS_OK ) {
200
                    doImportTables(
201
                        panel.getExplorerParameters(),
202
                        panel.getFileType(),
203
                        panel.getFile(),
204
                        panel.getTableName(),
205
                        panel.getDeleteTables()
206
                    );
207
                }
208
            }
209
        });
210
        dlg.show(WindowManager.MODE.WINDOW);
211
    }
212
213
    private void doImportTables(JDBCServerExplorerParameters explorerParameters, String fileType, File file, String tableName, boolean deleteTables) {
214
        I18nManager i18n = ToolsLocator.getI18nManager();
215
        ApplicationManager application = ApplicationLocator.getManager();
216
217
        StringBuilder sql = new StringBuilder();
218
        switch(fileType.toLowerCase()) {
219
        case "gpx":
220
            sql.append("CALL GPXRead('");
221
            sql.append(file.getAbsolutePath());
222
            sql.append("', '");
223
            sql.append(tableName);
224 43401 jjdelcerro
            sql.append("');");
225 43400 jjdelcerro
            break;
226
        case "geojson":
227
            sql.append("CALL GeoJsonRead('");
228
            sql.append(file.getAbsolutePath());
229
            sql.append("', '");
230
            sql.append(tableName);
231
            sql.append("');");
232
            break;
233
        case "osm":
234
            sql.append("CALL OSMRead('");
235
            sql.append(file.getAbsolutePath());
236
            sql.append("', '");
237
            sql.append(tableName);
238
            sql.append("', ");
239
            sql.append(BooleanUtils.toStringTrueFalse(deleteTables));
240
            sql.append(");");
241
            break;
242
        default:
243
            return;
244
        }
245
        try {
246
            DataManager dataManager = DALLocator.getDataManager();
247
            JDBCServerExplorer explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
248
                explorerParameters.getExplorerName(),
249
                explorerParameters
250
            );
251
            explorer.execute(sql.toString());
252
        } catch(Exception ex) {
253
            logger.warn("Can't import file.",ex);
254
            application.messageDialog(
255
                i18n.getTranslation("_Cant_import_file.") +
256
                    "\n" +
257
                    i18n.getTranslation("_See_the_log_file_to_more_information"),
258 43651 jjdelcerro
                i18n.getTranslation("_Warning"),
259 43400 jjdelcerro
                JOptionPane.WARNING_MESSAGE
260
            );
261
        }
262
    }
263
264 43377 jjdelcerro
    private void linkActiveLayers() {
265 43594 jjdelcerro
        I18nManager i18n = ToolsLocator.getI18nManager();
266 43377 jjdelcerro
        final List<FLyrVect> layers = this.getSelectedLayers();
267
        if( CollectionUtils.isEmpty(layers) ) {
268
            return;
269
        }
270
        final JDBCConnectionPanel jdbcConnectionPanel = DALSwingLocator.getSwingManager().createJDBCConnectionPanel();
271
        jdbcConnectionPanel.setConnectorFilter(new JDBCConnectionPanel.ConnectorFilter() {
272
            @Override
273
            public boolean accept(JDBCServerExplorerParameters parameters) {
274 43400 jjdelcerro
                return StringUtils.equalsIgnoreCase(parameters.getExplorerName(), DAL_EXPLORER_NAME);
275 43377 jjdelcerro
            }
276
        });
277
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
278
        final Dialog dlg = winmanager.createDialog(
279
            jdbcConnectionPanel.asJComponent(),
280 43594 jjdelcerro
            i18n.getTranslation("_Select_database"),
281 43377 jjdelcerro
            null,
282
            WindowManager_v2.BUTTONS_OK_CANCEL
283
        );
284
        dlg.addActionListener(new ActionListener() {
285
            @Override
286
            public void actionPerformed(ActionEvent e) {
287
                if( dlg.getAction()==WindowManager_v2.BUTTONS_OK ) {
288
                    JDBCServerExplorerParameters params = jdbcConnectionPanel.getServerExplorerParameters();
289
                    linkLayers(layers, params);
290
                }
291
            }
292
        });
293
        dlg.show(WindowManager.MODE.WINDOW);
294
    }
295
296
    private void linkLayers(List<FLyrVect> layers, JDBCServerExplorerParameters params) {
297
        try {
298
            JDBCServerExplorer explorer = (JDBCServerExplorer) DALLocator.getDataManager().openServerExplorer(
299
                params.getExplorerName(),
300
                params
301
            );
302
            for( FLyrVect layer : layers ) {
303
                FilesystemStoreParameters layerParameters = (FilesystemStoreParameters)
304
                    layer.getFeatureStore().getParameters();
305
                File f = layerParameters.getFile();
306
                String sql = MessageFormat.format(
307
                    "CALL FILE_TABLE(''{0}'', ''{1}'')",
308
                    FilenameUtils.normalize(f.getAbsolutePath(), true),
309
                    layer.getName()
310
                );
311
                explorer.execute(sql);
312
            }
313
        } catch (Exception ex) {
314
        }
315
    }
316 43400 jjdelcerro
317
    private void downloadOSM() {
318
319
        I18nManager i18n = ToolsLocator.getI18nManager();
320
        FoldersManager foldersManager = ToolsLocator.getFoldersManager();
321
        ApplicationManager application = ApplicationLocator.getManager();
322
323
        ViewDocument viewDoc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
324
        if( viewDoc == null ) {
325
            return;
326
        }
327
        final Envelope env = viewDoc.getMapContext().getViewPort().getEnvelope();
328 43594 jjdelcerro
        final File[] files = application.showChooserDialog(
329 43400 jjdelcerro
            i18n.getTranslation("_Select_the_file_in_which_to_save_the_data"),
330 43594 jjdelcerro
            FileDialogChooser.SAVE_DIALOG,
331
            FileDialogChooser.FILES_ONLY,
332
            false,
333
            foldersManager.get("DataFolder"),
334
            new FileNameExtensionFilter(
335
                "OSM File (.osm, .osm.gz, .osm.bz2)",
336
                ".osm", ".osm.gz", ".osm.bz2"
337
            ),
338
            false
339 43400 jjdelcerro
        );
340 43594 jjdelcerro
341 43400 jjdelcerro
        if( !ArrayUtils.isEmpty(files) ) {
342
            final JDBCConnectionPanel jdbcConnectionPanel = DALSwingLocator.getSwingManager().createJDBCConnectionPanel();
343
            jdbcConnectionPanel.setConnectorFilter(new JDBCConnectionPanel.ConnectorFilter() {
344
                @Override
345
                public boolean accept(JDBCServerExplorerParameters parameters) {
346
                    return StringUtils.equalsIgnoreCase(parameters.getExplorerName(), DAL_EXPLORER_NAME);
347
                }
348
            });
349
            WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
350
            final Dialog dlg = winmanager.createDialog(
351
                jdbcConnectionPanel.asJComponent(),
352 43594 jjdelcerro
                i18n.getTranslation("_Select_database"),
353 43400 jjdelcerro
                null,
354
                WindowManager_v2.BUTTONS_OK_CANCEL
355
            );
356
            dlg.addActionListener(new ActionListener() {
357
                @Override
358
                public void actionPerformed(ActionEvent e) {
359
                    if( dlg.getAction()==WindowManager_v2.BUTTONS_OK ) {
360
                        doDownloadOSM(
361
                            env,
362
                            files[0],
363
                            jdbcConnectionPanel.getServerExplorerParameters()
364
                        );
365
                    }
366
                }
367
            });
368
            dlg.show(WindowManager.MODE.WINDOW);
369
        }
370
    }
371
372
    private void doDownloadOSM(Envelope env, File f, JDBCServerExplorerParameters explorerParameters) {
373
        I18nManager i18n = ToolsLocator.getI18nManager();
374
        ApplicationManager application = ApplicationLocator.getManager();
375
376
        try {
377
            String sql = MessageFormat.format(
378 43428 jjdelcerro
                "CALL ST_OSMDownloader(''{0}''::geometry, ''{1}'');",
379 43400 jjdelcerro
                env.getGeometry().convertToWKT(),
380
                f.getAbsolutePath()
381
            );
382
            DataManager dataManager = DALLocator.getDataManager();
383
            JDBCServerExplorer explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
384
                explorerParameters.getExplorerName(),
385
                explorerParameters
386
            );
387
            explorer.execute(sql);
388
        } catch(Exception ex) {
389
            logger.warn("Can't download from OSM.",ex);
390
            application.messageDialog(
391
                i18n.getTranslation("_Cant_download_from_OSM.") +
392
                    "\n" +
393
                    i18n.getTranslation("_See_the_log_file_to_more_information"),
394 43651 jjdelcerro
                i18n.getTranslation("_Warning"),
395 43400 jjdelcerro
                JOptionPane.WARNING_MESSAGE
396
            );
397
        }
398
    }
399 43377 jjdelcerro
}