Changeset 25107 in osm


Ignore:
Timestamp:
2011-01-22T12:18:25+01:00 (14 years ago)
Author:
guggis
Message:

'Now caches compiled scripts, if possible. Fixes OutOfMemory when running groovy scripts.'

Location:
applications/editors/josm/plugins/scripting
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/scripting/build.xml

    r25073 r25107  
    2727<project name="scripting" default="dist" basedir=".">
    2828
    29         <property name="commit.message" value="Added preferences editor for scripting engines" />
     29        <property name="commit.message" value="Now caches compiled scripts, if possible. Fixes OutOfMemory when running groovy scripts." />
    3030        <property name="plugin.main.version" value="3751" />
    3131
  • applications/editors/josm/plugins/scripting/scripts/AddHouseNumbers.groovy

    r25019 r25107  
     1
    12/*
    23 * This scripts sets a sequence of house numbers on the currently selected nodes.
     
    67
    78import java.awt.BorderLayout;
     9import javax.swing.JComponent;
     10
     11import java.awt.event.KeyEvent;
     12
     13import javax.swing.KeyStroke;
    814
    915import groovy.swing.SwingBuilder;
     
    3036import javax.swing.JLabel;
    3137
     38import javax.swing.Action;
    3239import javax.swing.BorderFactory;
    3340import javax.swing.JTextField;
     
    3845
    3946class AddHouseNumberDialog extends JDialog {
     47       
     48        static private AddHouseNumberDialog instance;
     49        static def  AddHouseNumberDialog getInstance() {
     50                if (instance == null){
     51                        instance = new AddHouseNumberDialog()
     52                }
     53                return instance
     54        }
    4055       
    4156        private JTextField tfStart;
     
    5267                <html>
    5368                Enter the <strong>first house number</strong> to be applied to the currently selected nodes
    54                 and the amount by which the house number is <strong>incremented</strong>.
     69                and the <strong>increment</strong> between consecutive house numbers.
    5570                </html>
    5671                """
     
    6176                SwingBuilder swing = new SwingBuilder()
    6277                return swing.panel(){
     78                        emptyBorder([5,5,5,5],parent:true)
    6379                        gridBagLayout()
    6480                        label(text: "Start:",
     
    6783                        )
    6884                        tfStart = textField(constraints: gbc(gridx:1,gridy:0,weightx:1.0, weighty:0.0, fill: GridBagConstraints.HORIZONTAL, insets:[2,2,2,2]))
     85                        SelectAllOnFocusGainedDecorator.decorate(tfStart)
    6986                        label(text: "Increment:", horizontalAlignment: JLabel.LEFT, constraints: gbc(gridx:0,gridy:1,weightx:0.0, weighty:0.0, anchor: GridBagConstraints.WEST, insets:[2,2,2,2]))
    7087                        tfIncrement = textField(constraints: gbc(gridx:1,gridy:1,weightx:1.0, weighty:0.0, fill: GridBagConstraints.HORIZONTAL, anchor: GridBagConstraints.WEST, insets:[2,2,2,2]))
     88                        SelectAllOnFocusGainedDecorator.decorate(tfIncrement)
    7189                        panel(constraints: gbc(gridx:0,gridy:2,weightx:1.0, weighty:1.0, gridwidth:2, fill: GridBagConstraints.BOTH, insets:[2,2,2,2]))
     90                        tfIncrement.text = "2"
    7291                }
    7392        }
     
    7695                SwingBuilder swing = new SwingBuilder()
    7796                return swing.panel(layout: new FlowLayout(FlowLayout.CENTER)) {
     97                    def actApply = action(name: "Apply", smallIcon: ImageProvider.get("ok"), closure: {apply(); setVisible(false)})
     98                        def btnApply = button(action: actApply)
     99                        btnApply.setFocusable(true)
     100                        btnApply.registerKeyboardAction(actApply, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0, false), JComponent.WHEN_FOCUSED)
     101                                                       
    78102                        button(text: "Cancel", icon: ImageProvider.get("cancel"), actionPerformed: {setVisible(false)})
    79                         button(text: "Apply", icon: ImageProvider.get("ok"), actionPerformed: {
    80                                 apply()
    81                                 setVisible(false)
    82                         })
    83103                }
    84104        }
    85        
     105               
    86106        def apply() {
    87107                def start
     108                def incr
    88109                try {
    89110                        start = tfStart.text.trim().toInteger()
     111                        incr = tfIncrement.text.trim().toInteger()
    90112                } catch(NumberFormatException e){
    91113                        e.printStackTrace()
    92114                        return
    93115                }
    94                 def incr
    95                 try  {
    96                         incr = tfIncrement.text.trim().toInteger()
    97                 } catch(NumberFormatException e){
    98                         e.printStackTrace()
    99                         return
    100                 }
    101                 def nodes = getCurrentlySelectedNodes()
    102                 def cmds = []
    103                 nodes.each {Node n ->
     116                def cmds = getCurrentlySelectedNodes().collect { Node n ->
    104117                        Node nn = new Node(n)
    105118                        nn.put("addr:housenumber", start.toString())
    106119                        start += incr
    107                         cmds << new ChangeCommand(n, nn)                       
     120                        return new ChangeCommand(n, nn)                 
    108121                }
    109122                if (cmds.isEmpty()) return
     
    112125       
    113126        def build() {
    114                 setTitle("Set house numbers")
     127                title = "Set house numbers"
    115128                def cp = getContentPane()
    116129                cp.setLayout(new BorderLayout())
     
    121134       
    122135        def getCurrentDataSet() {
    123                 def layer = Main?.map?.mapView?.getActiveLayer()
     136                def layer = Main?.map?.mapView?.activeLayer
    124137                if (layer == null) return null
    125138                if (! (layer instanceof OsmDataLayer)) return null
     
    142155}
    143156
    144 def dialog = new AddHouseNumberDialog()
    145 dialog.setVisible(true)
     157AddHouseNumberDialog.instance.setVisible(true)
     158
  • applications/editors/josm/plugins/scripting/src/org/openstreetmap/josm/plugins/scripting/RunScriptDialog.java

    r25071 r25107  
    1414import java.io.FileReader;
    1515import java.io.IOException;
    16 import java.net.MalformedURLException;
    17 import java.net.URL;
    18 import java.net.URLClassLoader;
    1916import java.util.Collections;
    2017import java.util.LinkedList;
    2118import java.util.List;
    2219import java.util.logging.Logger;
    23 import java.util.regex.Matcher;
    24 import java.util.regex.Pattern;
    25 
    26 import javax.activation.MimetypesFileTypeMap;
     20
     21import javax.script.Compilable;
     22import javax.script.CompiledScript;
    2723import javax.script.ScriptEngine;
    28 import javax.script.ScriptEngineFactory;
    29 import javax.script.ScriptEngineManager;
    3024import javax.script.ScriptException;
    3125import javax.swing.AbstractAction;
     
    4640import org.openstreetmap.josm.gui.widgets.HtmlPanel;
    4741import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
     42import org.openstreetmap.josm.plugins.scripting.preferences.PreferenceKeys;
    4843import org.openstreetmap.josm.tools.ImageProvider;
    4944import org.openstreetmap.josm.tools.WindowGeometry;
     
    5348 * running a script.</p>
    5449 */
    55 public class RunScriptDialog extends JDialog {
     50public class RunScriptDialog extends JDialog implements PreferenceKeys{
    5651        static private final Logger logger = Logger.getLogger(RunScriptDialog.class.getName());
    57        
    58         /**
    59          * <p>The preferences key for the script file history.</p>
    60          */
    61         static private final String PREF_KEY_FILE_HISTORY = "scripting.RunScriptDialog.file-history";
    62        
    63         /**
    64          * <p>The preferences key for the last script file name entered in the script file
    65          * selection field.</p>
    66          */     
    67         static private final String PREF_KEY_LAST_FILE = "scripting.RunScriptDialog.last-file";
    6852
    6953        /** the input field for the script file name */
     
    227211                        HelpAwareOptionPane.showOptionDialog(
    228212                                        RunScriptDialog.this,
    229                                         tr("The script file ''{0}'' isn't readable.", f.toString()),
     213                                        tr("The script file ''{0}'' isn''t readable.", f.toString()),
    230214                                        tr("File not readable"),
    231215                                        JOptionPane.ERROR_MESSAGE,
     
    263247                                        "<html>"
    264248                                        + tr(
    265                                                 "<p>The script can''t be executed, becasue there are currently no scripting engines installed.</p>"
     249                                                "<p>The script can''t be executed, because there are currently no scripting engines installed.</p>"
    266250                                                + "<p>Refer to the online help for information about how to install a scripting engine with JOSM.</p>"                                         
    267251                                        )                                       
     
    308292                        final ScriptEngine engine = getScriptEngine(f);
    309293                        if (engine == null) return;
     294               
    310295                        SwingUtilities.invokeLater(
    311296                            new Runnable() {
     
    313298                                        FileReader reader = null;
    314299                                                try {
    315                                                         reader = new FileReader(f);
    316                                                         engine.eval(reader);
     300                                                        if (engine instanceof Compilable) {
     301                                                                CompiledScript script = CompiledScriptCache.getInstance().compile((Compilable)engine,f);
     302                                                                logger.info("running compiled script for " + f);
     303                                                                script.eval();
     304                                                        } else {
     305                                                                reader = new FileReader(f);                                                             
     306                                                                engine.eval(reader);
     307                                                        }
    317308                                                } catch(ScriptException e){
    318309                                                        warnExecutingScriptFailed(e);
     
    327318                            }
    328319                    );
     320                       
    329321                        setVisible(false);             
    330322                }       
  • applications/editors/josm/plugins/scripting/src/org/openstreetmap/josm/plugins/scripting/ScriptEngineProvider.java

    r25071 r25107  
    77import java.io.IOException;
    88import java.io.InputStream;
     9import java.lang.reflect.Field;
    910import java.net.MalformedURLException;
    1011import java.net.URL;
     
    4445        private final List<File> scriptEngineJars = new ArrayList<File>();
    4546        private MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();
     47        private ClassLoader scriptClassLoader = getClass().getClassLoader();
    4648               
    4749        protected void loadMimeTypesMap() {
     
    8183                        scriptEngineJars.add(new File(jar));
    8284                }               
     85                scriptClassLoader = buildClassLoader();
    8386        }
    8487       
     
    151154         */
    152155        public ScriptEngine getEngineByName(String name) {
    153                 ScriptEngineManager mgr = new ScriptEngineManager(buildClassLoader());
     156                ScriptEngineManager mgr = new ScriptEngineManager(scriptClassLoader);
    154157                return mgr.getEngineByName(name);
    155158        }
     
    201204                        }
    202205                }
     206                buildClassLoader();
    203207                loadScriptEngineFactories();
    204208                fireContentsChanged(this, 0, scriptEngineJars.size());
  • applications/editors/josm/plugins/scripting/src/org/openstreetmap/josm/plugins/scripting/ScriptEngineSelectionDialog.java

    r25071 r25107  
    1313import java.awt.event.MouseAdapter;
    1414import java.awt.event.MouseEvent;
    15 import java.util.List;
    1615
    1716import javax.script.ScriptEngine;
    18 import javax.script.ScriptEngineFactory;
    1917import javax.swing.AbstractAction;
    2018import javax.swing.BorderFactory;
     
    2220import javax.swing.JComponent;
    2321import javax.swing.JDialog;
    24 import javax.swing.JLabel;
    2522import javax.swing.JList;
    2623import javax.swing.JOptionPane;
    2724import javax.swing.JPanel;
    2825import javax.swing.KeyStroke;
    29 import javax.swing.ListCellRenderer;
    3026import javax.swing.ListSelectionModel;
    31 import javax.swing.UIManager;
    3227import javax.swing.event.ListSelectionEvent;
    3328import javax.swing.event.ListSelectionListener;
     
    3833import org.openstreetmap.josm.gui.help.HelpUtil;
    3934import org.openstreetmap.josm.gui.widgets.HtmlPanel;
     35import org.openstreetmap.josm.plugins.scripting.ui.ScriptEngineCellRenderer;
    4036import org.openstreetmap.josm.tools.ImageProvider;
    4137import org.openstreetmap.josm.tools.WindowGeometry;
    42 import org.openstreetmap.josm.plugins.scripting.ui.ScriptEngineCellRenderer;
    4338
    4439/**
  • applications/editors/josm/plugins/scripting/src/org/openstreetmap/josm/plugins/scripting/preferences/PreferenceKeys.java

    r25071 r25107  
    99         */
    1010        String PREF_KEY_SCRIPTING_ENGINE_JARS = "scripting.engine-jars";
    11 
     11       
     12        /**
     13         * <p>The preferences key for the script file history.</p>
     14         */
     15        String PREF_KEY_FILE_HISTORY = "scripting.RunScriptDialog.file-history";
     16       
     17        /**
     18         * <p>The preferences key for the last script file name entered in the script file
     19         * selection field.</p>
     20         */     
     21        String PREF_KEY_LAST_FILE = "scripting.RunScriptDialog.last-file";
    1222}
Note: See TracChangeset for help on using the changeset viewer.