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

History | View | Annotate | Download (11.3 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
import java.util.logging.Level;
36

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

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

    
67
public class ScriptingExtension extends Extension {
68

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

    
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.booleanValue()) {
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
        ProviderFactory factory = manager.getInstallerFactory();
177
        providerManager.addProviderFactory(factory);
178

    
179
        InstallerManager installerManager = InstallerLocator.getInstallerManager();
180
        installerManager.setDefaultLocalAddonRepository(
181
                localAddonRepositoryFolder,
182
                factory.getName()
183
        );
184
    }
185

    
186
    public boolean isEnabled() {
187
        return true;
188
    }
189

    
190
    public boolean isVisible() {
191
        return true;
192
    }
193

    
194
    private static class ExecuteAutorunScriptsOnStartup implements Runnable {
195

    
196
        public void run() {
197
            Thread th = new Thread(new ExecuteAutorunScripts());
198
            th.start();
199
        }
200
    }
201

    
202
    private static class ExecuteAutorunScripts implements Runnable {
203

    
204
        public void run() {
205
            final ScriptingManager manager = ScriptingLocator.getManager();
206
            PluginsManager pluginManager = PluginsLocator.getManager();
207

    
208
            try {
209
                ScriptingHelpManager helpmanager = manager.getHelpManager();
210
                PluginServices plugin = pluginManager.getPlugin(this);
211
                File scriptingfolder = new File(plugin.getPluginDirectory(), "scripting");
212
                File helpfolder = new File(scriptingfolder, "help");
213
                for (File folder : helpfolder.listFiles()) {
214
                    File helpindex = new File(folder, "IdeHelpIndex.xml");
215
                    try {
216
                        helpmanager.addMethods(helpindex.toURI().toURL());
217
                    } catch (Exception e) {
218
                        logger.info("Can't add metothods from '" + helpindex.getAbsolutePath() + "'.", e);
219
                    }
220
                }
221
            } catch (Exception e) {
222
                logger.info("Can't add metothods.", e);
223
            }
224

    
225
            List<File> pluginsFolders = new ArrayList<File>();
226
            for (File f : pluginManager.getPluginsFolders()) {
227
                pluginsFolders.addAll(Arrays.asList(f.listFiles()));
228
            }
229

    
230
            File autorun_file = null;
231
            ScriptingBaseScript autorun = null;
232
            for (File pluginFolder : pluginsFolders) {
233
                autorun_file = new File(pluginFolder, "scripting/scripts/autorun.inf");
234
                if (autorun_file.exists()) {
235
                    logger.info("running autorun script '" + autorun_file.getAbsolutePath() + "'.");
236
                    autorun = manager.getScript(autorun_file);
237
                    try {
238
                        autorun.run();
239
                    } catch (Exception ex) {
240
                        logger.warn("Can't execute autorun from '" + autorun_file.getAbsolutePath() + "'.", ex);
241
                    }
242
                }
243
            }
244

    
245
            SimpleFileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {
246
                @Override
247
                public FileVisitResult visitFile(Path path, BasicFileAttributes bfa) throws IOException {
248
                    File file = path.toFile();
249
                    if ("autorun.inf".equalsIgnoreCase(file.getName())) {
250
                        if (file.exists()) {
251
                            logger.info("running autorun script '" + file.getAbsolutePath() + "'.");
252
                            ScriptingBaseScript autorun = manager.getScript(file);
253
                            try {
254
                                autorun.run();
255
                            } catch (Exception ex) {
256
                                logger.warn("Can't execute autorun from '" + file.getAbsolutePath() + "'.", ex);
257
                            }
258
                        }
259
                    }
260
                    return FileVisitResult.CONTINUE;
261
                }
262
            };
263
            try {
264
                Files.walkFileTree(Paths.get(manager.getRootUserFolder().toURI()), visitor);
265
                List<ScriptingFolder> folders = manager.getAlternativeUserFolders();
266
                for (ScriptingFolder folder : folders) {
267
                    Files.walkFileTree(Paths.get(folder.getFile().toURI()), visitor);
268
                }
269
            } catch (Exception ex) {
270
                logger.warn("Can't execute autoruns in home.", ex);
271
            }
272
            logger.info("Running autorun scripts terminated.");
273

    
274
        }
275

    
276
    }
277
}