Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / app / extension / InitializeApplicationExtension.java @ 44855

History | View | Annotate | Download (22 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or modify it under
7
 * the terms of the GNU General Public License as published by the Free Software
8
 * Foundation; either version 3 of the License, or (at your option) any later
9
 * version.
10
 *
11
 * This program is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14
 * details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with
17
 * this program; if not, write to the Free Software Foundation, Inc., 51
18
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us at info AT
21
 * gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.app.extension;
24

    
25
import java.awt.GridBagConstraints;
26
import java.beans.PropertyVetoException;
27
import java.io.BufferedReader;
28
import java.io.File;
29
import java.io.InputStream;
30
import java.io.InputStreamReader;
31
import java.io.StringWriter;
32
import java.util.ArrayList;
33
import java.util.HashMap;
34
import java.util.List;
35
import java.util.Map;
36
import java.util.Objects;
37
import java.util.Properties;
38
import java.util.prefs.Preferences;
39
import javax.swing.JOptionPane;
40
import org.apache.commons.io.FileUtils;
41
import org.apache.commons.io.FilenameUtils;
42
import org.apache.commons.lang3.StringUtils;
43

    
44
import org.gvsig.andami.IconThemeHelper;
45
import org.gvsig.andami.PluginServices;
46
import org.gvsig.andami.PluginsLocator;
47
import org.gvsig.andami.PluginsManager;
48
import org.gvsig.andami.actioninfo.ActionInfoManager;
49
import org.gvsig.andami.plugins.Extension;
50
import org.gvsig.andami.ui.mdiManager.IWindow;
51
import org.gvsig.app.ApplicationLocator;
52
import org.gvsig.app.ApplicationManager;
53
import static org.gvsig.app.extension.ProjectExtension.PROJECT_FILE_CHOOSER_ID;
54
import org.gvsig.app.project.ProjectManager;
55
import org.gvsig.app.project.ProjectPreferences;
56
import org.gvsig.app.project.documents.view.ViewDocument;
57
import org.gvsig.app.project.documents.view.ViewManager;
58
import org.gvsig.app.project.documents.view.gui.IView;
59
import org.gvsig.app.project.documents.view.toolListeners.InfoListener;
60
import org.gvsig.app.util.BaseOpenErrorHandler;
61
import org.gvsig.expressionevaluator.Expression;
62
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
63
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
64
import org.gvsig.fmap.dal.DALLocator;
65
import org.gvsig.fmap.dal.DataManager;
66
import org.gvsig.fmap.dal.DataServerExplorerPool;
67
import org.gvsig.fmap.dal.DataServerExplorerPoolEntry;
68
import org.gvsig.fmap.dal.DatabaseWorkspaceManager;
69
import org.gvsig.fmap.dal.OpenErrorHandler;
70
import org.gvsig.fmap.dal.feature.AbstractDataProfile;
71
import org.gvsig.fmap.dal.resource.ResourceManager;
72
import org.gvsig.fmap.dal.resource.exception.DisposeResorceManagerException;
73
import static org.gvsig.fmap.dal.serverexplorer.filesystem.swing.FilesystemExplorerWizardPanelController.OPEN_LAYER_FILE_CHOOSER_ID;
74
import org.gvsig.installer.lib.api.InstallerLocator;
75
import org.gvsig.installer.lib.api.InstallerManager;
76
import org.gvsig.installer.lib.api.PackageInfo;
77
import org.gvsig.tools.ToolsLocator;
78
import org.gvsig.tools.bookmarksandhistory.Bookmark;
79
import org.gvsig.tools.bookmarksandhistory.Bookmarks;
80
import org.gvsig.tools.bookmarksandhistory.History;
81
import org.gvsig.tools.dataTypes.CoercionException;
82
import org.gvsig.tools.dataTypes.DataType;
83
import org.gvsig.tools.dataTypes.DataTypes;
84
import org.gvsig.tools.dynobject.DynObject;
85
import org.gvsig.tools.dynobject.Tags;
86
import org.gvsig.tools.folders.FoldersManager;
87
import org.gvsig.tools.i18n.I18nManager;
88
import org.gvsig.tools.resourcesstorage.FilesResourcesStorage;
89
import org.gvsig.tools.swing.api.SimpleImage;
90
import org.gvsig.tools.swing.api.ToolsSwingLocator;
91
import org.gvsig.tools.swing.api.ToolsSwingManager;
92
import org.slf4j.Logger;
93
import org.slf4j.LoggerFactory;
94

    
95
@SuppressWarnings("UseSpecificCatch")
96
public class InitializeApplicationExtension extends Extension {
97

    
98
    private static final Logger LOGGER = LoggerFactory.getLogger(InitializeApplicationExtension.class);
99

    
100
    // Copiadas de org.gvsig.coreplugin.PreferencesExtension
101
    public static final String PROJECTS_FOLDER_PROPERTY_NAME = "ProjectsFolder";
102
    public static final String DATA_FOLDER_PROPERTY_NAME = "DataFolder";
103
    public static final String TEMPLATES_FOLDER_PROPERTY_NAME = "TemplatesFolder";
104
    public static final String SYMBOL_LIBRARY_FOLDER_PROPERTY_NAME = "SymbolLibraryFolder";
105

    
106
    private OpenErrorHandler openErrorHandler = null;
107

    
108
    private static class SimpleImageDataProfile extends AbstractDataProfile {
109

    
110
        public SimpleImageDataProfile() {
111
            super("Image", SimpleImage.class);
112
        }
113

    
114
        @Override
115
        public Object createData(Object data, Tags tags) {
116
            final ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
117
            SimpleImage image = toolsSwingManager.createSimpleImage(data);
118
            return image;
119
        }
120

    
121
        @Override
122
        public Object coerce(DataType dataType, Object data, Tags tags) throws CoercionException {
123
            final ToolsSwingManager toolsSwingManager;
124
            final SimpleImage image;
125
            try {
126
                switch (dataType.getType()) {
127
                    case DataTypes.BYTEARRAY:
128
                        toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
129
                        image = toolsSwingManager.createSimpleImage(data);
130
                        return image.toBytearray();
131
                    case DataTypes.STRING:
132
                        toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
133
                        image = toolsSwingManager.createSimpleImage(data);
134
                        return image.toString();
135
                    default:
136
                        break;
137
                }
138
            } catch (Exception ex) {
139
                throw new CoercionException("Can't convert imagen to " + dataType.getName(), ex);
140
            }
141
            throw new CoercionException("Can't convert imagen to " + dataType.getName());
142
        }
143

    
144
    }
145

    
146
    @Override
147
    public void initialize() {
148
        DALLocator.registerFeatureTypeDefinitionsManager(DefaultFeatureTypeDefinitionsManager.class);
149

    
150
        ExpressionEvaluatorLocator.getManager().registerClassLoader(this.getClass().getClassLoader());
151

    
152
        DataManager dataManager = DALLocator.getDataManager();
153
        dataManager.registerDataProfile(new SimpleImageDataProfile());
154

    
155
        InfoListener.initializeExtensionPoint();
156

    
157
        initLastPath();
158
        registerIcons();
159
        loadExpressionBookmarks();
160
        loadExpressionHistory();
161
        loadHistoryAndBookmarks();
162
    }
163

    
164
    public void loadHistoryAndBookmarks() {
165
        PluginsManager pluginmgr = PluginsLocator.getManager();
166
        File folder = pluginmgr.getApplicationHomeFolder();
167
        String nameFolder = "bookmarks";
168

    
169
        File storageFolder = new File(folder, nameFolder);
170
        try {
171
            if (!storageFolder.exists()) {
172
                storageFolder.mkdir();
173
            }
174
        } catch (Exception ex) {
175
            LOGGER.warn("Not able to create bookmarks folder. Load and save of bookmarks will be deactivated", ex);
176
            //Stop trying to load bookmarks and not create listener to save them
177
            return;
178
        }
179
        FilesResourcesStorage bookmarksResources = new FilesResourcesStorage(storageFolder.getAbsolutePath());
180
        ToolsLocator.getBookmarksAndHistoryManager().setPrimaryStorage(bookmarksResources);
181
        ToolsLocator.getBookmarksAndHistoryManager().load();
182
        PluginsManager pluginManager = PluginsLocator.getManager();
183
        pluginManager.addShutdownTask("saveBookmarksAndHistory", () -> {
184
          ToolsLocator.getBookmarksAndHistoryManager().save();
185
        }, false, 100);
186

    
187
    }
188

    
189
    public void loadExpressionHistory() {
190
        PluginsManager pluginManager = PluginsLocator.getManager();
191
        final PluginServices plugin = pluginManager.getPlugin(this);
192
        DynObject pluginProperties = plugin.getPluginProperties();
193
        List<Expression> dynBookmarks = (List<Expression>) pluginProperties.getDynValue("expressionHistory");
194
        if (dynBookmarks == null) {
195
            return;
196
        }
197
        final ExpressionEvaluatorManager expressionManager = ExpressionEvaluatorLocator.getExpressionEvaluatorManager();
198
        History<Expression> history = expressionManager.getHistory();
199
        for (Expression expression : dynBookmarks) {
200
            history.add(expression);
201
        }
202
        pluginManager.addShutdownTask("saveExpressionHistory", new Runnable() {
203
            @Override
204
            public void run() {
205
                DynObject properties = plugin.getPluginProperties();
206
                ArrayList<Expression> var = new ArrayList<>();
207
                for (Expression expression : history) {
208
                    var.add(expression);
209
                }
210
                properties.setDynValue("expressionHistory", var);
211
            }
212
        }, false, 100);
213

    
214
    }
215

    
216
    public void loadExpressionBookmarks() {
217
        PluginsManager pluginManager = PluginsLocator.getManager();
218
        final PluginServices plugin = pluginManager.getPlugin(this);
219
        DynObject pluginProperties = plugin.getPluginProperties();
220
        Map<String, Expression> dynBookmarks = (Map<String, Expression>) pluginProperties.getDynValue("expressionBookmarks");
221
        if (dynBookmarks == null) {
222
            return;
223
        }
224
        final ExpressionEvaluatorManager expressionManager = ExpressionEvaluatorLocator.getExpressionEvaluatorManager();
225
        Bookmarks<Expression> bookmarks = expressionManager.getBookmarks();
226
        for (String key : dynBookmarks.keySet()) {
227
            Expression bookmark = dynBookmarks.get(key);
228
            bookmarks.add(bookmark);
229
        }
230
        pluginManager.addShutdownTask("saveExpressionBookmarks", new Runnable() {
231
            @Override
232
            public void run() {
233
                DynObject properties = plugin.getPluginProperties();
234
                Map<String, Expression> var = new HashMap<>();
235
                for (Bookmark<Expression> bookmark : bookmarks) {
236
                    var.put(bookmark.getName(), bookmark.getValue());
237
                }
238
                properties.setDynValue("expressionBookmarks", var);
239
            }
240
        }, false, 100);
241

    
242
    }
243

    
244
    private void initLastPath() {
245
        Preferences prefs = Preferences.userRoot().node("gvsig.foldering");
246
        FoldersManager folderManager = ToolsLocator.getFoldersManager();
247
        String v;
248

    
249
        v = prefs.get(DATA_FOLDER_PROPERTY_NAME, folderManager.getHome().getAbsolutePath());
250
        folderManager.setLastPath(OPEN_LAYER_FILE_CHOOSER_ID, new File(v));
251

    
252
        v = prefs.get(PROJECTS_FOLDER_PROPERTY_NAME, folderManager.getHome().getAbsolutePath());
253
        folderManager.setLastPath(PROJECT_FILE_CHOOSER_ID, new File(v));
254

    
255
        v = prefs.get("LegendsFolder", folderManager.getHome().getAbsolutePath());
256
        folderManager.setLastPath("LegendsFolder", new File(v));
257
    }
258

    
259
    @Override
260
    public void postInitialize() {
261
        PluginsManager pluginManager = PluginsLocator.getManager();
262

    
263
        openErrorHandler = new BaseOpenErrorHandler();
264
        ApplicationLocator.getManager().getDataManager().setOpenErrorHandler(openErrorHandler);
265

    
266
        DALLocator.getResourceManager().startResourceCollector(
267
                3 * (60 * 1000), // minutes --> miliseconds
268
                null);
269

    
270
        // showAddOnManagerOnStartIfNeed();
271
        ProjectPreferences projectPreferences = ApplicationLocator.getProjectManager().getProjectPreferences();
272
        if (projectPreferences.getOpenWithANewMaximizedView()) {
273
            pluginManager.addStartupTask(
274
                    "showNewViewMaximized",
275
                    new ShowNewMaximizedView(),
276
                    true,
277
                    750
278
            );
279
        }
280
        pluginManager.addStartupTask("OpenLayerOnStart", new OpenLayerOnStart(), true, 740);
281

    
282
        pluginManager.addStartupTask("ApplicationStartedMessage", new Runnable() {
283
            @Override
284
            public void run() {
285
                I18nManager i18n = ToolsLocator.getI18nManager();
286
                ApplicationManager application = ApplicationLocator.getManager();
287
                application.message(
288
                        i18n.getTranslation("StatusBar.Aplicacion_iniciada"),
289
                        JOptionPane.INFORMATION_MESSAGE
290
                );
291
            }
292
        }, true, -1);
293

    
294
        pluginManager.addStartupTask("ConnectoToDefaultWorkspace", () -> {
295
            connectToDefaultWorkspace();
296
        }, false, 500);
297
    }
298

    
299
    private void connectToDefaultWorkspace() {
300
        String workspaceName = null;
301
        try {
302
            DataManager dataManager = DALLocator.getDataManager();
303
            PluginsManager pluginManager = PluginsLocator.getPluginsManager();
304
            PluginServices plugin = pluginManager.getPlugin(this);
305
            DynObject preferences = plugin.getPluginProperties();
306
            if ((Boolean) (preferences.getDynValue("connectAutomaticallyToDatabaseWorkspace"))) {
307
                workspaceName = (String) preferences.getDynValue("databaseWorkspaceToConnect");
308
                DataServerExplorerPool pool = dataManager.getDataServerExplorerPool();
309
                DataServerExplorerPoolEntry entry = pool.get(workspaceName);
310
                if (entry != null) {
311
                    DatabaseWorkspaceManager workspace = dataManager.createDatabaseWorkspaceManager(
312
                            entry.getExplorerParameters()
313
                    );
314
                    if (workspace != null && workspace.isValid()) {
315
                        workspace.connect();
316
                    }
317
                }
318
            }
319
        } catch (Exception ex) {
320
            LOGGER.warn("Can't connect to default workspace (" + Objects.toString(workspaceName) + ").", ex);
321
        }
322
    }
323

    
324
    private void showAddOnManagerOnStartIfNeed() {
325
        PluginsManager pluginManager = PluginsLocator.getManager();
326
        PluginServices plugin = pluginManager.getPlugin(this);
327
        DynObject pluginProperties = plugin.getPluginProperties();
328
        Map<String, Boolean> showAddOnmanagerOnStart = null;
329
        try {
330
            showAddOnmanagerOnStart = (Map<String, Boolean>) pluginProperties.getDynValue("showAddOnmanagerOnStart");
331
        } catch (Exception ex) {
332
            // Do nothing
333
        }
334
        if (showAddOnmanagerOnStart == null) {
335
            showAddOnmanagerOnStart = new HashMap<>();
336
            pluginProperties.setDynValue("showAddOnmanagerOnStart", showAddOnmanagerOnStart);
337
        }
338
        Boolean showAddOnmanagerOnStartForCurrentVersion = showAddOnmanagerOnStart.get(pluginManager.getApplicationVersion().fullFormat());
339

    
340
        if (showAddOnmanagerOnStartForCurrentVersion == null || showAddOnmanagerOnStartForCurrentVersion) {
341
            pluginManager.addStartupTask(
342
                    "showAddOnmanagerOnStart",
343
                    new ShowAddOnManagerOnStart(),
344
                    true,
345
                    500
346
            );
347
        }
348
    }
349

    
350
    private static class ShowNewMaximizedView implements Runnable {
351

    
352
        @Override
353
        public void run() {
354
            ApplicationManager application = ApplicationLocator.getManager();
355
            ProjectManager projectManager = application.getProjectManager();
356

    
357
            ViewManager viewManager = (ViewManager) projectManager.getDocumentManager(ViewManager.TYPENAME);
358
            ViewDocument view = (ViewDocument) viewManager.createDocument();
359
            projectManager.getCurrentProject().add(view);
360

    
361
            IView viewWindow = (IView) viewManager.getMainWindow(view);
362

    
363
            application.getUIManager().addWindow(viewWindow, GridBagConstraints.CENTER);
364
            try {
365
                application.getUIManager().setMaximum((IWindow) viewWindow, true);
366
            } catch (PropertyVetoException e) {
367
                LOGGER.info("Can't maximize view.", e);
368
            }
369
        }
370

    
371
    }
372

    
373
    private static class ShowAddOnManagerOnStart implements Runnable {
374

    
375
        @Override
376
        public void run() {
377
            ApplicationManager application = ApplicationLocator.getManager();
378
            I18nManager i18nManager = ToolsLocator.getI18nManager();
379
            PluginsManager pluginManager = PluginsLocator.getManager();
380
            PluginServices plugin = pluginManager.getPlugin(this);
381
            DynObject pluginProperties = plugin.getPluginProperties();
382

    
383
            String msg = i18nManager.getTranslation("_Instalar_complementos_adicionales_no_disponibles_durante_el_proceso_de_instalacion");
384
            int resp = application.confirmDialog(
385
                    msg,
386
                    i18nManager.getTranslation("_Finalizando_proceso_de_instalacion"),
387
                    JOptionPane.YES_NO_OPTION,
388
                    JOptionPane.QUESTION_MESSAGE
389
            );
390
            if (resp == JOptionPane.YES_OPTION) {
391
                ActionInfoManager actionManager = PluginsLocator.getActionInfoManager();
392
                actionManager.execute(
393
                        "tools-addonsmanager",
394
                        new Object[]{"skipBundleSelection"}
395
                );
396
            }
397
            Map<String, Boolean> showAddOnmanagerOnStart = (Map<String, Boolean>) pluginProperties.getDynValue("showAddOnmanagerOnStart");
398
            showAddOnmanagerOnStart.put(pluginManager.getApplicationVersion().fullFormat(), Boolean.FALSE);
399
        }
400
    }
401

    
402
    private void registerIcons() {
403
        IconThemeHelper.registerIcon("action", "edit-clear", this);
404
        IconThemeHelper.registerIcon("action", "edit-copy", this);
405
        IconThemeHelper.registerIcon("action", "edit-cut", this);
406
        IconThemeHelper.registerIcon("action", "edit-delete", this);
407
        IconThemeHelper.registerIcon("action", "edit-find", this);
408
        IconThemeHelper.registerIcon("action", "edit-find-replace", this);
409
        IconThemeHelper.registerIcon("action", "edit-paste", this);
410
        IconThemeHelper.registerIcon("action", "edit-redo", this);
411
        IconThemeHelper.registerIcon("action", "edit-select-all", this);
412
        IconThemeHelper.registerIcon("action", "edit-undo", this);
413
        IconThemeHelper.registerIcon("action", "edit-undo-redo-actions", this);
414
        IconThemeHelper.registerIcon("action", "document-print", this);
415

    
416
        IconThemeHelper.registerIcon("toolbar-go", "go-next", this);
417
        IconThemeHelper.registerIcon("toolbar-go", "go-previous", this);
418
        IconThemeHelper.registerIcon("toolbar-go", "go-next-fast", this);
419
        IconThemeHelper.registerIcon("toolbar-go", "go-previous-fast", this);
420
        IconThemeHelper.registerIcon("toolbar-go", "go-first", this);
421
        IconThemeHelper.registerIcon("toolbar-go", "go-last", this);
422

    
423
    }
424

    
425
    @Override
426
    public void execute(String actionCommand) {
427

    
428
    }
429

    
430
    @Override
431
    public boolean isEnabled() {
432
        return false;
433
    }
434

    
435
    @Override
436
    public boolean isVisible() {
437
        return false;
438
    }
439

    
440
    private void addToLogInfo() {
441
        String info[] = this.getStringInfo().split("\n");
442
        for (String line : info) {
443
            LOGGER.info(line);
444
        }
445
    }
446

    
447
    public String getStringInfo() {
448
        ApplicationManager application = ApplicationLocator.getManager();
449
        PluginsManager pluginmgr = PluginsLocator.getManager();
450
        InstallerManager installmgr = InstallerLocator.getInstallerManager();
451

    
452
        StringWriter writer = new StringWriter();
453

    
454
        Properties props = System.getProperties();
455

    
456
        // OS information
457
        String osName = props.getProperty("os.name");
458
        writer.write("OS\n");
459
        writer.write("    name   : " + osName + "\n");
460
        writer.write("    arch   : " + props.get("os.arch") + "\n");
461
        writer.write("    version: " + props.get("os.version") + "\n");
462
        if (osName.startsWith("Linux")) {
463
            try {
464
                String[] command = {"lsb_release", "-a"};
465
                Process p = Runtime.getRuntime().exec(command);
466
                InputStream is = p.getInputStream();
467
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
468
                String line;
469
                while ((line = reader.readLine()) != null) {
470
                    writer.write("    " + line + "\n");
471
                }
472
            } catch (Exception ex) {
473
                writer.write("Can't get detailled os information (lsb_release -a).");
474
            }
475
        }
476

    
477
        // JRE information
478
        writer.write("JRE\n");
479
        writer.write("    vendor : " + props.get("java.vendor") + "\n");
480
        writer.write("    version: " + props.get("java.version") + "\n");
481
        writer.write("    home   : " + props.get("java.home") + "\n");
482

    
483
        writer.write("gvSIG\n");
484
        writer.write("    version                 : " + application.getVersion().getLongFormat() + "\n");
485
        writer.write("    locale language         : " + application.getLocaleLanguage() + "\n");
486
        writer.write("    application forlder     : " + pluginmgr.getApplicationFolder() + "\n");
487
        writer.write("    install forlder         : " + pluginmgr.getInstallFolder() + "\n");
488
        writer.write("    application home forlder: " + pluginmgr.getApplicationHomeFolder() + "\n");
489
        writer.write("    plugins forlder         : " + StringUtils.join(pluginmgr.getPluginsFolders()) + "\n");
490

    
491
        try {
492
            PackageInfo[] pkgs = installmgr.getInstalledPackages();
493
            writer.write("Installed packages\n");
494
            for (PackageInfo pkg : pkgs) {
495
                writer.write("    ");
496
                writer.write(pkg.toStringCompact());
497
                writer.write("\n");
498
            }
499
        } catch (Throwable e) {
500
            writer.write("Can't get installed package information.");
501
        }
502
        return writer.toString();
503
    }
504

    
505
    @Override
506
    public void terminate() {
507
        ResourceManager resMan = DALLocator.getResourceManager();
508
        resMan.stopResourceCollector();
509
        try {
510
            resMan.dispose();
511
        } catch (DisposeResorceManagerException e) {
512
            LOGGER.warn(e.getMessageStack());
513
        }
514
        super.terminate();
515
    }
516
}