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

History | View | Annotate | Download (14.6 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 javax.swing.JOptionPane;
13
import org.apache.commons.collections.CollectionUtils;
14
import org.apache.commons.io.FilenameUtils;
15
import org.apache.commons.lang3.ArrayUtils;
16
import org.apache.commons.lang3.BooleanUtils;
17
import org.apache.commons.lang3.StringUtils;
18
import org.gvsig.andami.IconThemeHelper;
19
import org.gvsig.andami.plugins.Extension;
20
import org.gvsig.app.ApplicationLocator;
21
import org.gvsig.app.ApplicationManager;
22
import org.gvsig.app.project.documents.view.ViewDocument;
23
import org.gvsig.app.project.documents.view.ViewManager;
24
import org.gvsig.fmap.dal.DALLocator;
25
import org.gvsig.fmap.dal.DataManager;
26
import org.gvsig.fmap.dal.feature.FeatureStore;
27
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
28
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorer;
29
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
30
import org.gvsig.fmap.dal.swing.DALSwingLocator;
31
import org.gvsig.fmap.dal.swing.jdbc.JDBCConnectionPanel;
32
import org.gvsig.fmap.geom.primitive.Envelope;
33
import org.gvsig.fmap.mapcontext.MapContextLocator;
34
import org.gvsig.fmap.mapcontext.MapContextManager;
35
import org.gvsig.fmap.mapcontext.layers.FLayer;
36
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
37
import org.gvsig.tools.ToolsLocator;
38
import org.gvsig.tools.folders.FoldersManager;
39
import org.gvsig.tools.i18n.I18nManager;
40
import org.gvsig.tools.swing.api.ToolsSwingLocator;
41
import org.gvsig.tools.swing.api.windowmanager.Dialog;
42
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
43
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
44
import org.gvsig.webbrowser.WebBrowserFactory;
45
import org.gvsig.webbrowser.WebBrowserPanel;
46
import org.h2.tools.Server;
47

    
48

    
49
public class H2SpatialExtension extends Extension {
50

    
51
    public static String DAL_EXPLORER_NAME = "H2Spatial";
52
    
53
    @Override
54
    public void initialize() {
55
    }
56

    
57
    @Override
58
    public boolean canQueryByAction() {
59
        return true;
60
    }
61
    
62
    @Override
63
    public void postInitialize() {
64
        MapContextManager mapContextMgr = MapContextLocator.getMapContextManager();
65
        
66
        IconThemeHelper.registerIcon("layer", "layer-icon-h2", this);
67
        mapContextMgr.registerIconLayer("H2Spatial", "layer-icon-h2");
68
    }
69
    
70
    @Override
71
    public void execute(String actionCommand) {
72
        switch(actionCommand.toLowerCase()) {
73
        case "tools-h2spatial-show-admintool":
74
            startserver();
75
            startbrowser();
76
            break;
77
        
78
        case "tools-h2spatial-linklayer":
79
            linkActiveLayers();
80
            break;
81

    
82
        case "tools-h2spatial-import":
83
            importTables();
84
            break;
85

    
86
        case "tools-h2spatial-downloadosm":
87
            downloadOSM();
88
            break;
89
        }
90
    }
91
    
92
    private void startserver()  {
93
        try {
94
            Server server = Server.createWebServer("-webPort","8082");
95
            server.start();
96
        } catch (SQLException ex) {
97
            if( ex.getCause() instanceof BindException ) {
98
                logger.warn("Can't start H2 web server, ? Already running ?");
99
            } else {
100
                logger.warn("Can't start H2 web server.",ex);
101
            }
102
        }
103
    }
104

    
105
    private List<FLyrVect> getSelectedLayers() {
106
        ApplicationManager application = ApplicationLocator.getManager();
107
        ViewDocument viewdoc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
108
        if( viewdoc == null ) {
109
            return null;
110
        }
111
        FLayer[] layers = viewdoc.getMapContext().getLayers().getActives();
112
        if( ArrayUtils.isEmpty(layers) ) {
113
            return null;
114
        }
115
        List<FLyrVect> r = new ArrayList<>();
116
        for( FLayer layer : layers ) {
117
            if( layer instanceof FLyrVect ) {
118
                FeatureStore store = ((FLyrVect)layer).getFeatureStore();
119
                if( store != null ) {
120
                    if( store.getParameters() instanceof FilesystemStoreParameters &&
121
                        StringUtils.equalsIgnoreCase(store.getProviderName(),"Shape") ) {
122
                        r.add((FLyrVect) layer);
123
                    }
124
                }
125
            }
126
        }
127
        if( r.isEmpty() ) {
128
            return null;
129
        }
130
        return r;
131
    }
132
    
133
    @Override
134
    public boolean isEnabled() {
135
        return true;
136
    }
137

    
138
    @Override
139
    public boolean isVisible() {
140
        return true;
141
    }
142

    
143
    @Override
144
    public boolean isEnabled(String action) {
145
        ApplicationManager application = ApplicationLocator.getManager();
146

    
147
        if( "tools-h2spatial-show-admintool".equalsIgnoreCase(action) ) {
148
            return true;
149
        } 
150
        if( "tools-h2spatial-linklayer".equalsIgnoreCase(action) ) {
151
            return ! CollectionUtils.isEmpty(this.getSelectedLayers());
152
        }
153
        if( "tools-h2spatial-import".equalsIgnoreCase(action) ) {
154
            return true;
155
        }
156
        if( "tools-h2spatial-downloadosm".equalsIgnoreCase(action) ) {
157
            ViewDocument viewDoc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
158
            if( viewDoc == null ) {
159
                return false;
160
            }
161
            Envelope env = viewDoc.getMapContext().getViewPort().getEnvelope();
162
            return !(env != null && env.isEmpty());
163
        }
164
        return false;
165
    }
166

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

    
172
    private void startbrowser() {
173
        WindowManager winmanager = ToolsSwingLocator.getWindowManager();
174
        WebBrowserPanel webbrowser = WebBrowserFactory.createWebBrowserPanel();
175
        winmanager.showWindow(
176
            webbrowser.asJComponent(), 
177
            ToolsLocator.getI18nManager().getTranslation("_H2_administration_tool"), 
178
            WindowManager.MODE.WINDOW
179
        );
180
        webbrowser.setPage("http://localhost:8082");
181
        
182
    }
183
    
184
    private void importTables() {
185
        I18nManager i18n = ToolsLocator.getI18nManager();
186
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
187
        final importTable panel = new importTable();
188
        final Dialog dlg = winmanager.createDialog(
189
            panel,
190
            i18n.getTranslation("_Select_files_to_import"),
191
            i18n.getTranslation("_Select_files_to_import_as_tables_in_H2_database"),
192
            WindowManager_v2.BUTTONS_OK_CANCEL
193
        );
194
        dlg.addActionListener(new ActionListener() {
195
            @Override
196
            public void actionPerformed(ActionEvent e) {
197
                if( dlg.getAction()==WindowManager_v2.BUTTONS_OK ) {
198
                    doImportTables(
199
                        panel.getExplorerParameters(),
200
                        panel.getFileType(),
201
                        panel.getFile(),
202
                        panel.getTableName(),
203
                        panel.getDeleteTables()
204
                    );
205
                }
206
            }
207
        });
208
        dlg.show(WindowManager.MODE.WINDOW);
209
    }
210
    
211
    private void doImportTables(JDBCServerExplorerParameters explorerParameters, String fileType, File file, String tableName, boolean deleteTables) {
212
        I18nManager i18n = ToolsLocator.getI18nManager();
213
        ApplicationManager application = ApplicationLocator.getManager();
214

    
215
        StringBuilder sql = new StringBuilder();
216
        switch(fileType.toLowerCase()) {
217
        case "gpx":
218
            sql.append("CALL GPXRead('");
219
            sql.append(file.getAbsolutePath());
220
            sql.append("', '");
221
            sql.append(tableName);
222
            sql.append("', ");
223
            sql.append(BooleanUtils.toStringTrueFalse(deleteTables));
224
            sql.append(");");
225
            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("_Warning"), 
256
                i18n.getTranslation("_Cant_import_file.") + 
257
                    "\n" + 
258
                    i18n.getTranslation("_See_the_log_file_to_more_information"), 
259
                JOptionPane.WARNING_MESSAGE
260
            );
261
        }
262
    }
263
    
264
    private void linkActiveLayers() {
265
        final List<FLyrVect> layers = this.getSelectedLayers();
266
        if( CollectionUtils.isEmpty(layers) ) {
267
            return;
268
        }
269
        final JDBCConnectionPanel jdbcConnectionPanel = DALSwingLocator.getSwingManager().createJDBCConnectionPanel();
270
        jdbcConnectionPanel.setConnectorFilter(new JDBCConnectionPanel.ConnectorFilter() {
271
            @Override
272
            public boolean accept(JDBCServerExplorerParameters parameters) {
273
                return StringUtils.equalsIgnoreCase(parameters.getExplorerName(), DAL_EXPLORER_NAME);
274
            }
275
        });
276
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
277
        final Dialog dlg = winmanager.createDialog(
278
            jdbcConnectionPanel.asJComponent(),
279
            "Select database",
280
            null, 
281
            WindowManager_v2.BUTTONS_OK_CANCEL
282
        );
283
        dlg.addActionListener(new ActionListener() {
284
            @Override
285
            public void actionPerformed(ActionEvent e) {
286
                if( dlg.getAction()==WindowManager_v2.BUTTONS_OK ) {
287
                    JDBCServerExplorerParameters params = jdbcConnectionPanel.getServerExplorerParameters();
288
                    linkLayers(layers, params);
289
                }
290
            }
291
        });
292
        dlg.show(WindowManager.MODE.WINDOW);
293
    }
294
    
295
    private void linkLayers(List<FLyrVect> layers, JDBCServerExplorerParameters params) {
296
        try {
297
            JDBCServerExplorer explorer = (JDBCServerExplorer) DALLocator.getDataManager().openServerExplorer(
298
                params.getExplorerName(),
299
                params
300
            );
301
            for( FLyrVect layer : layers ) {
302
                FilesystemStoreParameters layerParameters = (FilesystemStoreParameters) 
303
                    layer.getFeatureStore().getParameters();
304
                File f = layerParameters.getFile();
305
                String sql = MessageFormat.format(
306
                    "CALL FILE_TABLE(''{0}'', ''{1}'')",
307
                    FilenameUtils.normalize(f.getAbsolutePath(), true),
308
                    layer.getName()
309
                );
310
                explorer.execute(sql);
311
            }
312
        } catch (Exception ex) {
313
        }
314
    }
315

    
316
    private void downloadOSM() {
317
        
318
        I18nManager i18n = ToolsLocator.getI18nManager();
319
        FoldersManager foldersManager = ToolsLocator.getFoldersManager();
320
        ApplicationManager application = ApplicationLocator.getManager();
321
        
322
        ViewDocument viewDoc = (ViewDocument) application.getActiveDocument(ViewManager.TYPENAME);
323
        if( viewDoc == null ) {
324
            return;
325
        }
326
        final Envelope env = viewDoc.getMapContext().getViewPort().getEnvelope();
327
        final File[] files = application.showSaveFileDialog(
328
            i18n.getTranslation("_Select_the_file_in_which_to_save_the_data"), 
329
            foldersManager.get("DataFolder")
330
        );
331
        if( !ArrayUtils.isEmpty(files) ) {
332
            final JDBCConnectionPanel jdbcConnectionPanel = DALSwingLocator.getSwingManager().createJDBCConnectionPanel();
333
            jdbcConnectionPanel.setConnectorFilter(new JDBCConnectionPanel.ConnectorFilter() {
334
                @Override
335
                public boolean accept(JDBCServerExplorerParameters parameters) {
336
                    return StringUtils.equalsIgnoreCase(parameters.getExplorerName(), DAL_EXPLORER_NAME);
337
                }
338
            });
339
            WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
340
            final Dialog dlg = winmanager.createDialog(
341
                jdbcConnectionPanel.asJComponent(),
342
                "Select database",
343
                null, 
344
                WindowManager_v2.BUTTONS_OK_CANCEL
345
            );
346
            dlg.addActionListener(new ActionListener() {
347
                @Override
348
                public void actionPerformed(ActionEvent e) {
349
                    if( dlg.getAction()==WindowManager_v2.BUTTONS_OK ) {
350
                        doDownloadOSM( 
351
                            env, 
352
                            files[0], 
353
                            jdbcConnectionPanel.getServerExplorerParameters()
354
                        );
355
                    }
356
                }
357
            });
358
            dlg.show(WindowManager.MODE.WINDOW);
359
        }
360
    }
361
    
362
    private void doDownloadOSM(Envelope env, File f, JDBCServerExplorerParameters explorerParameters) {
363
        I18nManager i18n = ToolsLocator.getI18nManager();
364
        ApplicationManager application = ApplicationLocator.getManager();
365
        
366
        try {
367
            String sql = MessageFormat.format(
368
                "CALL ST_OSMDownloader(''{0}'':geometry, ''{1}'');",
369
                env.getGeometry().convertToWKT(),
370
                f.getAbsolutePath()
371
            );
372
            DataManager dataManager = DALLocator.getDataManager();
373
            JDBCServerExplorer explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
374
                explorerParameters.getExplorerName(), 
375
                explorerParameters
376
            );
377
            explorer.execute(sql);
378
        } catch(Exception ex) {
379
            logger.warn("Can't download from OSM.",ex);
380
            application.messageDialog(
381
                i18n.getTranslation("_Warning"), 
382
                i18n.getTranslation("_Cant_download_from_OSM.") + 
383
                    "\n" + 
384
                    i18n.getTranslation("_See_the_log_file_to_more_information"), 
385
                JOptionPane.WARNING_MESSAGE
386
            );
387
        }
388
    }
389
}