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

History | View | Annotate | Download (14.5 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
            break;
224
        case "geojson":
225
            sql.append("CALL GeoJsonRead('");
226
            sql.append(file.getAbsolutePath());
227
            sql.append("', '");
228
            sql.append(tableName);
229
            sql.append("');");
230
            break;
231
        case "osm":
232
            sql.append("CALL OSMRead('");
233
            sql.append(file.getAbsolutePath());
234
            sql.append("', '");
235
            sql.append(tableName);
236
            sql.append("', ");
237
            sql.append(BooleanUtils.toStringTrueFalse(deleteTables));
238
            sql.append(");");
239
            break;
240
        default:
241
            return;
242
        }
243
        try {
244
            DataManager dataManager = DALLocator.getDataManager();
245
            JDBCServerExplorer explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
246
                explorerParameters.getExplorerName(), 
247
                explorerParameters
248
            );
249
            explorer.execute(sql.toString());
250
        } catch(Exception ex) {
251
            logger.warn("Can't import file.",ex);
252
            application.messageDialog(
253
                i18n.getTranslation("_Warning"), 
254
                i18n.getTranslation("_Cant_import_file.") + 
255
                    "\n" + 
256
                    i18n.getTranslation("_See_the_log_file_to_more_information"), 
257
                JOptionPane.WARNING_MESSAGE
258
            );
259
        }
260
    }
261
    
262
    private void linkActiveLayers() {
263
        final List<FLyrVect> layers = this.getSelectedLayers();
264
        if( CollectionUtils.isEmpty(layers) ) {
265
            return;
266
        }
267
        final JDBCConnectionPanel jdbcConnectionPanel = DALSwingLocator.getSwingManager().createJDBCConnectionPanel();
268
        jdbcConnectionPanel.setConnectorFilter(new JDBCConnectionPanel.ConnectorFilter() {
269
            @Override
270
            public boolean accept(JDBCServerExplorerParameters parameters) {
271
                return StringUtils.equalsIgnoreCase(parameters.getExplorerName(), DAL_EXPLORER_NAME);
272
            }
273
        });
274
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
275
        final Dialog dlg = winmanager.createDialog(
276
            jdbcConnectionPanel.asJComponent(),
277
            "Select database",
278
            null, 
279
            WindowManager_v2.BUTTONS_OK_CANCEL
280
        );
281
        dlg.addActionListener(new ActionListener() {
282
            @Override
283
            public void actionPerformed(ActionEvent e) {
284
                if( dlg.getAction()==WindowManager_v2.BUTTONS_OK ) {
285
                    JDBCServerExplorerParameters params = jdbcConnectionPanel.getServerExplorerParameters();
286
                    linkLayers(layers, params);
287
                }
288
            }
289
        });
290
        dlg.show(WindowManager.MODE.WINDOW);
291
    }
292
    
293
    private void linkLayers(List<FLyrVect> layers, JDBCServerExplorerParameters params) {
294
        try {
295
            JDBCServerExplorer explorer = (JDBCServerExplorer) DALLocator.getDataManager().openServerExplorer(
296
                params.getExplorerName(),
297
                params
298
            );
299
            for( FLyrVect layer : layers ) {
300
                FilesystemStoreParameters layerParameters = (FilesystemStoreParameters) 
301
                    layer.getFeatureStore().getParameters();
302
                File f = layerParameters.getFile();
303
                String sql = MessageFormat.format(
304
                    "CALL FILE_TABLE(''{0}'', ''{1}'')",
305
                    FilenameUtils.normalize(f.getAbsolutePath(), true),
306
                    layer.getName()
307
                );
308
                explorer.execute(sql);
309
            }
310
        } catch (Exception ex) {
311
        }
312
    }
313

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