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 | } |