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

History | View | Annotate | Download (10.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

    
36
import javax.swing.JOptionPane;
37

    
38
import org.gvsig.andami.IconThemeHelper;
39
import org.gvsig.andami.PluginServices;
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.installer.lib.spi.InstallerProviderLocator;
48
import org.gvsig.scripting.ScriptingBaseScript;
49
import org.gvsig.scripting.ScriptingFolder;
50
import org.gvsig.scripting.ScriptingHelpManager;
51
import org.gvsig.scripting.ScriptingLocator;
52
import org.gvsig.scripting.ScriptingManager;
53
import org.gvsig.scripting.swing.api.JScriptingComposer;
54
import org.gvsig.scripting.swing.api.ScriptingSwingLocator;
55
import org.gvsig.scripting.swing.api.ScriptingUIManager;
56
import org.gvsig.tools.dynobject.DynObject;
57
import org.gvsig.tools.service.spi.ProviderFactory;
58
import org.gvsig.tools.service.spi.ProviderManager;
59
import org.gvsig.tools.swing.api.ToolsSwingLocator;
60
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
61
import org.gvsig.tools.swing.impl.windowmanager.DefaultWindowManager;
62
import org.slf4j.Logger;
63
import org.slf4j.LoggerFactory;
64

    
65
public class ScriptingExtension extends Extension {
66

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

    
69
    public void execute(String actionCommand) {
70
        this.execute(actionCommand, null);
71
    }
72

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

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

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

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

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

    
109
    @Override
110
    public void postInitialize() {
111
        super.postInitialize();
112
        ScriptingManager manager = ScriptingLocator.getManager();
113
        PluginsManager pluginManager = PluginsLocator.getManager();
114

    
115
        File home = this.getPlugin().getPluginHomeFolder();
116
        manager.setHomeFolder(home);
117
        File home_1_0 = new File(home.getParentFile(), "org.gvsig.scripting.app.extension");
118
        File home_scripts_1_0 = new File(home_1_0, "scripts");
119
        manager.addAlternativeUserFolder(home_scripts_1_0, "Usuario (1.0)", "Scripts de usuario (1.0)");
120

    
121
        List<File> pluginsFolders = new ArrayList<>();
122
        for (File f : pluginManager.getPluginsFolders()) {
123
            pluginsFolders.addAll(Arrays.asList(f.listFiles()));
124
        }
125

    
126
        for (File pluginFolder : pluginsFolders) {
127
            File scriptsFolder = new File(pluginFolder, "scripting/scripts");
128
            if (scriptsFolder.exists()) {
129
                manager.registerSystemFolder(pluginFolder.getName(), scriptsFolder);
130
            }
131
            File libFolder = new File(pluginFolder, "scripting/lib");
132
            if (libFolder.exists()) {
133
                manager.addLibFolder(libFolder);
134
            }
135
        }
136
        pluginManager.addStartupTask(
137
                "ExecuteAutorunScripts",
138
                new ExecuteAutorunScriptsOnStartup(),
139
                true,
140
                600
141
        );
142

    
143
        manager.setPackagesFolder(pluginManager.getInstallFolder());
144
                
145
        ProviderManager providerManager = InstallerProviderLocator.getProviderManager();
146
        ProviderFactory factory = manager.getInstallerFactory();
147
        providerManager.addProviderFactory(factory);
148

    
149
        InstallerManager installerManager = InstallerLocator.getInstallerManager();
150
        installerManager.setDefaultLocalAddonRepository(
151
                manager.getRootUserFolder(),
152
                factory.getName()
153
        );     
154
    }
155

    
156
    public boolean isEnabled() {
157
        return true;
158
    }
159

    
160
    public boolean isVisible() {
161
        return true;
162
    }
163

    
164
    private static class ExecuteAutorunScriptsOnStartup implements Runnable {
165

    
166
        public void run() {
167
            Thread th = new Thread(new ExecuteAutorunScripts());
168
            th.start();
169
        }
170
    }
171

    
172
    private static class ExecuteAutorunScripts implements Runnable {
173

    
174
        public void run() {
175
            final ScriptingManager manager = ScriptingLocator.getManager();
176
            PluginsManager pluginManager = PluginsLocator.getManager();
177

    
178
            try {
179
                ScriptingHelpManager helpmanager = manager.getHelpManager();
180
                PluginServices plugin = pluginManager.getPlugin(this);
181
                File scriptingfolder = new File(plugin.getPluginDirectory(), "scripting");
182
                File helpfolder = new File(scriptingfolder, "help");
183
                for (File folder : helpfolder.listFiles()) {
184
                    File helpindex = new File(folder, "IdeHelpIndex.xml");
185
                    try {
186
                        helpmanager.addMethods(helpindex.toURI().toURL());
187
                    } catch (Exception e) {
188
                        logger.info("Can't add metothods from '" + helpindex.getAbsolutePath() + "'.", e);
189
                    }
190
                }
191
            } catch (Exception e) {
192
                logger.info("Can't add metothods.", e);
193
            }
194

    
195
            List<File> pluginsFolders = new ArrayList<File>();
196
            for (File f : pluginManager.getPluginsFolders()) {
197
                pluginsFolders.addAll(Arrays.asList(f.listFiles()));
198
            }
199

    
200
            File autorun_file = null;
201
            ScriptingBaseScript autorun = null;
202
            for (File pluginFolder : pluginsFolders) {
203
                autorun_file = new File(pluginFolder, "scripting/scripts/autorun.inf");
204
                if (autorun_file.exists()) {
205
                    logger.info("running autorun script '" + autorun_file.getAbsolutePath() + "'.");
206
                    autorun = manager.getScript(autorun_file);
207
                    try {
208
                        autorun.run();
209
                    } catch (Exception ex) {
210
                        logger.warn("Can't execute autorun from '" + autorun_file.getAbsolutePath() + "'.", ex);
211
                    }
212
                }
213
            }
214

    
215
            SimpleFileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {
216
                @Override
217
                public FileVisitResult visitFile(Path path, BasicFileAttributes bfa) throws IOException {
218
                    File file = path.toFile();
219
                    if ("autorun.inf".equalsIgnoreCase(file.getName())) {
220
                        if (file.exists()) {
221
                            logger.info("running autorun script '" + file.getAbsolutePath() + "'.");
222
                            ScriptingBaseScript autorun = manager.getScript(file);
223
                            try {
224
                                autorun.run();
225
                            } catch (Exception ex) {
226
                                logger.warn("Can't execute autorun from '" + file.getAbsolutePath() + "'.", ex);
227
                            }
228
                        }
229
                    }
230
                    return FileVisitResult.CONTINUE;
231
                }
232
            };
233
            try {
234
                Files.walkFileTree(Paths.get(manager.getRootUserFolder().toURI()), visitor);
235
                List<ScriptingFolder> folders = manager.getAlternativeUserFolders();
236
                for (ScriptingFolder folder : folders) {
237
                    Files.walkFileTree(Paths.get(folder.getFile().toURI()), visitor);
238
                }
239
            } catch (Exception ex) {
240
                logger.warn("Can't execute autoruns in home.", ex);
241
            }
242
            logger.info("Running autorun scripts terminated.");
243

    
244
        }
245

    
246
    }
247
}