Statistics
| Revision:

gvsig-scripting / org.gvsig.scripting / trunk / org.gvsig.scripting / org.gvsig.scripting.app / org.gvsig.scripting.app.mainplugin / src / main / java / org / gvsig / scripting / app / extension / ScriptingExtension.java @ 583

History | View | Annotate | Download (13.7 KB)

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

    
24
import java.io.File;
25
import java.io.IOException;
26
import java.nio.file.FileVisitResult;
27
import java.nio.file.Files;
28
import java.nio.file.Path;
29
import java.nio.file.Paths;
30
import java.nio.file.SimpleFileVisitor;
31
import java.nio.file.attribute.BasicFileAttributes;
32
import java.util.ArrayList;
33
import java.util.Arrays;
34
import java.util.List;
35

    
36
import javax.swing.JOptionPane;
37
import org.apache.commons.io.FileUtils;
38

    
39
import org.gvsig.andami.IconThemeHelper;
40
import org.gvsig.andami.PluginsLocator;
41
import org.gvsig.andami.PluginsManager;
42
import org.gvsig.andami.plugins.Extension;
43
import org.gvsig.app.ApplicationLocator;
44
import org.gvsig.app.ApplicationManager;
45
import org.gvsig.installer.lib.api.InstallerLocator;
46
import org.gvsig.installer.lib.api.InstallerManager;
47
import org.gvsig.scripting.ScriptingBaseScript;
48
import org.gvsig.scripting.ScriptingFolder;
49
import org.gvsig.scripting.ScriptingLocator;
50
import org.gvsig.scripting.ScriptingManager;
51
import org.gvsig.scripting.swing.api.JScriptingComposer;
52
import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
53
import org.gvsig.scripting.swing.api.ScriptingUIManager;
54
import org.gvsig.tools.dynobject.DynObject;
55
import org.gvsig.tools.service.spi.ProviderFactory;
56
import org.gvsig.tools.service.spi.ProviderManager;
57
import org.gvsig.tools.swing.api.ToolsSwingLocator;
58
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
59
import org.gvsig.tools.swing.impl.windowmanager.DefaultWindowManager;
60
import org.slf4j.Logger;
61
import org.slf4j.LoggerFactory;
62
import org.gvsig.installer.lib.spi.InstallerProviderLocator;
63
import org.gvsig.tools.ToolsLocator;
64
import org.gvsig.tools.i18n.I18nManager;
65

    
66
public class ScriptingExtension extends Extension {
67

    
68
    private static final Logger logger = LoggerFactory.getLogger(ScriptingExtension.class);
69

    
70
    @Override
71
    public void execute(String actionCommand) {
72
        this.execute(actionCommand, null);
73
    }
74

    
75
    @Override
76
    public void execute(String command, Object[] args) {
77
        ScriptingUIManager uimanager = ScriptingSwingLocator.getUIManager();
78
        WindowManager winmanager = ToolsSwingLocator.getWindowManager();
79

    
80
        if ("tools-scripting-launcher".equalsIgnoreCase(command)) {
81
            winmanager.showWindow(uimanager.createLauncher(), uimanager.getTranslation("Scripting_Launcher"), WindowManager.MODE.TOOL);
82

    
83
        } else if ("tools-scripting-composer".equalsIgnoreCase(command)) {
84
            DynObject preferences = this.getPlugin().getPluginProperties();
85
            Boolean composerUseHisWindowManager = (Boolean) preferences.getDynValue("ComposerUseHisWindowManager");
86
            ScriptingUIManager uiManager = ScriptingSwingLocator.getUIManager();
87
            if (composerUseHisWindowManager) {
88
                winmanager = new DefaultWindowManager();
89
                uiManager.setWindowManager(winmanager);
90
            }
91
            JScriptingComposer composer = uimanager.createComposer();
92
            uiManager.showWindow(composer, uimanager.getTranslation("Scripting_Composer"));
93

    
94
        } else {
95
            ScriptingBaseScript script = uimanager.getManager().getScript(command);
96
            if (script != null) {
97
                script.run(args);
98
            } else {
99
                ApplicationManager application = ApplicationLocator.getManager();
100
                application.messageDialog("Can't locate script '" + command + "'.", "ScriptLaunch", JOptionPane.OK_OPTION);
101
            }
102
        }
103
    }
104

    
105
    public void initialize() {
106
        IconThemeHelper.registerIcon("action", "tools-scripting-launcher", this);
107
        IconThemeHelper.registerIcon("action", "tools-scripting-composer", this);
108
        IconThemeHelper.registerIcon("action", "tools-scripting-console-jython", this);
109
    }
110

    
111
    private void addLinkToPreviousVersion(ScriptingManager manager) {
112

    
113
        String contents = "[Unit]\n"
114
                + "type = Folder\n"
115
                + "name = Previous version\n"
116
                + "description =\n"
117
                + "createdBy =\n"
118
                + "version =\n"
119
                + "\n"
120
                + "[Folder]\n"
121
                + "path = ../../org.gvsig.scripting.app.extension/scripts\n\n\n";
122
        File previousVersion = new File(manager.getUserFolder().getFile(), "previous_version.inf");
123
        if (!previousVersion.exists()) {
124
            try {
125
                FileUtils.writeStringToFile(previousVersion, contents);
126
            } catch (IOException ex) {
127
                logger.warn("Can't create ScriptingFolder file in '" + previousVersion.getAbsolutePath() + "'.", ex);
128
            }
129
        }
130
    }
131

    
132
    @Override
133
    public void postInitialize() {
134
        super.postInitialize();
135
        ScriptingManager manager = ScriptingLocator.getManager();
136
        PluginsManager pluginManager = PluginsLocator.getManager();
137

    
138
        File home = this.getPlugin().getPluginHomeFolder();
139
        manager.setHomeFolder(home);
140

    
141
        this.addLinkToPreviousVersion(manager);
142

    
143
        List<File> pluginsFolders = new ArrayList<>();
144
        for (File f : pluginManager.getPluginsFolders()) {
145
            pluginsFolders.addAll(Arrays.asList(f.listFiles()));
146
        }
147

    
148
        for (File pluginFolder : pluginsFolders) {
149
            File scriptsFolder = new File(pluginFolder, "scripting/scripts");
150
            if (scriptsFolder.exists()) {
151
                manager.registerSystemFolder(pluginFolder.getName(), scriptsFolder);
152
            }
153
            File libFolder = new File(pluginFolder, "scripting/lib");
154
            if (libFolder.exists()) {
155
                manager.addLibFolder(libFolder);
156
            }
157
        }
158
        pluginManager.addStartupTask(
159
                "ExecuteAutorunScripts",
160
                new ExecuteAutorunScriptsOnStartup(),
161
                true,
162
                600
163
        );
164

    
165
        manager.setPackagesFolder(pluginManager.getInstallFolder());
166

    
167
        File localAddonRepositoryFolder = new File(manager.getRootUserFolder(), "addons");
168
        if (!localAddonRepositoryFolder.exists()) {
169
            try {
170
                FileUtils.forceMkdir(localAddonRepositoryFolder);
171
            } catch (IOException ex) {
172
                logger.info("Can't create addons folder in '" + localAddonRepositoryFolder.getAbsolutePath() + "'.", ex);
173
            }
174
        }
175
        ProviderManager providerManager = InstallerProviderLocator.getProviderManager();
176
        InstallerManager installerManager = InstallerLocator.getInstallerManager();
177

    
178
        ProviderFactory factory = manager.getInstallerFactory();
179
        providerManager.addProviderFactory(factory);
180
        installerManager.setDefaultLocalAddonRepository(
181
                localAddonRepositoryFolder,
182
                factory.getName()
183
        );
184
        factory = manager.getHelpInstallerFactory();
185
        providerManager.addProviderFactory(factory);
186
        installerManager.setDefaultLocalAddonRepository(
187
                manager.getHelpManager().getHelpRoots().get(0),
188
                factory.getName()
189
        );
190
    }
191

    
192
    @Override
193
    public boolean isEnabled() {
194
        return true;
195
    }
196

    
197
    @Override
198
    public boolean isVisible() {
199
        return true;
200
    }
201

    
202
    private static class ExecuteAutorunScriptsOnStartup implements Runnable {
203

    
204
        @Override
205
        public void run() {
206
            Thread th = new Thread(new ExecuteAutorunScripts());
207
            th.start();
208
        }
209
    }
210

    
211
    private static class ExecuteAutorunScripts implements Runnable {
212

    
213
        @Override
214
        public void run() {
215
            final ScriptingManager manager = ScriptingLocator.getManager();
216
            manager.loadEngines();
217
            
218
            final PluginsManager pluginManager = PluginsLocator.getManager();
219
            final ApplicationManager application = ApplicationLocator.getManager();
220
            final I18nManager i18nManager = ToolsLocator.getI18nManager();
221

    
222
//            try {
223
//                ScriptingHelpManager helpmanager = manager.getHelpManager();
224
//                PluginServices plugin = pluginManager.getPlugin(this);
225
//                File scriptingfolder = new File(plugin.getPluginDirectory(), "scripting");
226
//                File helpfolder = new File(scriptingfolder, "help");
227
//                for (File folder : helpfolder.listFiles()) {
228
//                    File helpindex = new File(folder, "help-index.xml");
229
//                    try {
230
//                        if( helpindex.exists() ) {
231
//                            helpmanager.addMethods(helpindex.toURI().toURL());
232
//                        }
233
//                    } catch (Exception e) {
234
//                        logger.info("Can't add metothods from '" + helpindex.getAbsolutePath() + "'.", e);
235
//                    }
236
//                }
237
//            } catch (Exception e) {
238
//                logger.info("Can't add metothods.", e);
239
//            }
240
            try {
241
                List<File> pluginsFolders = new ArrayList<>();
242
                for (File f : pluginManager.getPluginsFolders()) {
243
                    pluginsFolders.addAll(Arrays.asList(f.listFiles()));
244
                }
245

    
246
                File autorun_file = null;
247
                ScriptingBaseScript autorun;
248
                application.message(
249
                        i18nManager.getTranslation("_Searching_autorun_scripts_Xhorizontal_ellipsisX"),
250
                        JOptionPane.INFORMATION_MESSAGE
251
                );
252
                for (File pluginFolder : pluginsFolders) {
253
                    autorun_file = new File(pluginFolder, "scripting/scripts/autorun.inf");
254
                    if (autorun_file.exists()) {
255
                        logger.info("running autorun script '" + autorun_file.getAbsolutePath() + "'.");
256
                        autorun = manager.getScript(autorun_file);
257
                        try {
258
                            application.message(
259
                                    i18nManager.getTranslation(
260
                                            "_Running_autorun_script_from_XnameX",
261
                                            new String[]{autorun.getFile().getParentFile().getName()}
262
                                    ),
263
                                    JOptionPane.INFORMATION_MESSAGE
264
                            );
265
                        } catch (Exception ex) {
266
                            // Ignore it
267
                        }
268
                        try {
269
                            autorun.run();
270
                        } catch (Exception ex) {
271
                            logger.warn("Can't execute autorun from '" + autorun_file.getAbsolutePath() + "'.", ex);
272
                        }
273
                    }
274
                }
275

    
276
                SimpleFileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {
277
                    @Override
278
                    public FileVisitResult visitFile(Path path, BasicFileAttributes bfa) throws IOException {
279
                        File file = path.toFile();
280
                        if ("autorun.inf".equalsIgnoreCase(file.getName())) {
281
                            if (file.exists()) {
282
                                logger.info("running autorun script '" + file.getAbsolutePath() + "'.");
283
                                ScriptingBaseScript autorun = manager.getScript(file);
284
                                try {
285
                                    application.message(
286
                                            i18nManager.getTranslation(
287
                                                    "_Running_autorun_script_from_XnameX",
288
                                                    new String[]{autorun.getFile().getParentFile().getName()}
289
                                            ),
290
                                            JOptionPane.INFORMATION_MESSAGE
291
                                    );
292
                                } catch (Exception ex) {
293
                                    // Ignore
294
                                }
295
                                try {
296
                                    autorun.run();
297
                                } catch (Exception ex) {
298
                                    logger.warn("Can't execute autorun from '" + file.getAbsolutePath() + "'.", ex);
299
                                }
300
                            }
301
                        }
302
                        return FileVisitResult.CONTINUE;
303
                    }
304
                };
305
                try {
306
                    Files.walkFileTree(Paths.get(manager.getRootUserFolder().toURI()), visitor);
307
                    List<ScriptingFolder> folders = manager.getAlternativeUserFolders();
308
                    for (ScriptingFolder folder : folders) {
309
                        Files.walkFileTree(Paths.get(folder.getFile().toURI()), visitor);
310
                    }
311
                } catch (Exception ex) {
312
                    logger.warn("Can't execute autoruns in home.", ex);
313
                }
314
            } finally {
315
                logger.info("Running autorun scripts terminated.");
316
                application.message("", JOptionPane.INFORMATION_MESSAGE);
317
            }
318
        }
319

    
320
    }
321
}