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

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

    
64

    
65
public class ScriptingExtension extends Extension {
66

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

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

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

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

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

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

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

    
110
    private void addLinkToPreviousVersion(ScriptingManager manager) {
111

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

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

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

    
140
        this.addLinkToPreviousVersion(manager);
141
        
142
        List<File> pluginsFolders = new ArrayList<>();
143
        for (File f : pluginManager.getPluginsFolders()) {
144
            pluginsFolders.addAll(Arrays.asList(f.listFiles()));
145
        }
146

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

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

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

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

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

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

    
201
    private static class ExecuteAutorunScriptsOnStartup implements Runnable {
202

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

    
210
    private static class ExecuteAutorunScripts implements Runnable {
211

    
212
        @Override
213
        public void run() {
214
            final ScriptingManager manager = ScriptingLocator.getManager();
215
            PluginsManager pluginManager = PluginsLocator.getManager();
216

    
217
//            try {
218
//                ScriptingHelpManager helpmanager = manager.getHelpManager();
219
//                PluginServices plugin = pluginManager.getPlugin(this);
220
//                File scriptingfolder = new File(plugin.getPluginDirectory(), "scripting");
221
//                File helpfolder = new File(scriptingfolder, "help");
222
//                for (File folder : helpfolder.listFiles()) {
223
//                    File helpindex = new File(folder, "help-index.xml");
224
//                    try {
225
//                        if( helpindex.exists() ) {
226
//                            helpmanager.addMethods(helpindex.toURI().toURL());
227
//                        }
228
//                    } catch (Exception e) {
229
//                        logger.info("Can't add metothods from '" + helpindex.getAbsolutePath() + "'.", e);
230
//                    }
231
//                }
232
//            } catch (Exception e) {
233
//                logger.info("Can't add metothods.", e);
234
//            }
235

    
236
            List<File> pluginsFolders = new ArrayList<>();
237
            for (File f : pluginManager.getPluginsFolders()) {
238
                pluginsFolders.addAll(Arrays.asList(f.listFiles()));
239
            }
240

    
241
            File autorun_file = null;
242
            ScriptingBaseScript autorun;
243
            for (File pluginFolder : pluginsFolders) {
244
                autorun_file = new File(pluginFolder, "scripting/scripts/autorun.inf");
245
                if (autorun_file.exists()) {
246
                    logger.info("running autorun script '" + autorun_file.getAbsolutePath() + "'.");
247
                    autorun = manager.getScript(autorun_file);
248
                    try {
249
                        autorun.run();
250
                    } catch (Exception ex) {
251
                        logger.warn("Can't execute autorun from '" + autorun_file.getAbsolutePath() + "'.", ex);
252
                    }
253
                }
254
            }
255

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

    
285
        }
286

    
287
    }
288
}