source: subversion/applications/editors/josm/plugins/CommandLine/src/org/openstreetmap/josm/plugins/commandline/CommandLine.java

Last change on this file was 34656, checked in by donvip, 7 months ago

fix UnnecessaryParentheses? warnings

File size: 27.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.plugins.commandline;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.BorderLayout;
8import java.awt.Cursor;
9import java.awt.GraphicsEnvironment;
10import java.awt.event.KeyEvent;
11import java.awt.event.MouseEvent;
12import java.io.File;
13import java.io.IOException;
14import java.io.InputStream;
15import java.io.OutputStream;
16import java.io.OutputStreamWriter;
17import java.io.PrintWriter;
18import java.net.URL;
19import java.nio.charset.StandardCharsets;
20import java.nio.file.Files;
21import java.nio.file.StandardCopyOption;
22import java.util.ArrayList;
23import java.util.Arrays;
24import java.util.Collection;
25import java.util.List;
26import java.util.zip.ZipEntry;
27import java.util.zip.ZipInputStream;
28
29import javax.swing.JMenu;
30import javax.swing.JOptionPane;
31import javax.swing.JTextField;
32import javax.swing.JToolBar;
33import javax.swing.SwingUtilities;
34
35import org.openstreetmap.josm.actions.mapmode.MapMode;
36import org.openstreetmap.josm.command.SequenceCommand;
37import org.openstreetmap.josm.data.Preferences;
38import org.openstreetmap.josm.data.UndoRedoHandler;
39import org.openstreetmap.josm.data.imagery.ImageryInfo;
40import org.openstreetmap.josm.data.osm.BBox;
41import org.openstreetmap.josm.data.osm.DataSet;
42import org.openstreetmap.josm.data.osm.Node;
43import org.openstreetmap.josm.data.osm.OsmPrimitive;
44import org.openstreetmap.josm.data.osm.Relation;
45import org.openstreetmap.josm.data.osm.Way;
46import org.openstreetmap.josm.gui.MainApplication;
47import org.openstreetmap.josm.gui.MainMenu;
48import org.openstreetmap.josm.gui.MapFrame;
49import org.openstreetmap.josm.gui.PleaseWaitRunnable;
50import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
51import org.openstreetmap.josm.gui.layer.GpxLayer;
52import org.openstreetmap.josm.gui.layer.ImageryLayer;
53import org.openstreetmap.josm.gui.layer.Layer;
54import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField;
55import org.openstreetmap.josm.io.GpxWriter;
56import org.openstreetmap.josm.io.OsmWriter;
57import org.openstreetmap.josm.io.OsmWriterFactory;
58import org.openstreetmap.josm.plugins.Plugin;
59import org.openstreetmap.josm.plugins.PluginInformation;
60import org.openstreetmap.josm.spi.preferences.Config;
61import org.openstreetmap.josm.tools.HttpClient;
62import org.openstreetmap.josm.tools.Logging;
63import org.openstreetmap.josm.tools.SubclassFilteredCollection;
64import org.openstreetmap.josm.tools.Utils;
65
66public class CommandLine extends Plugin {
67    protected JTextField textField;
68    protected JTextField historyField;
69    private String prefix;
70    private Mode mode;
71    private ArrayList<Command> commands;
72    private JMenu commandMenu;
73    protected Command currentCommand;
74    protected String commandSymbol;
75    protected History history;
76    protected MapFrame currentMapFrame;
77    protected MapMode previousMode;
78
79    static final String pluginDir = Preferences.main().getPluginsDirectory().getAbsolutePath() + "/CommandLine/";
80
81    public CommandLine(PluginInformation info) {
82        super(info);
83        commandSymbol = ": ";
84        history = new History(100);
85        historyField = new DisableShortcutsOnFocusGainedTextField();
86        textField = new CommandTextField();
87
88        MainMenu mainMenu = MainApplication.getMenu();
89        if (mainMenu != null) {
90            commandMenu = mainMenu.addMenu("Commands", tr("Commands"), KeyEvent.VK_O,
91                    mainMenu.getDefaultMenuPos(), ht("/Plugin/CommandLine"));
92            MainMenu.add(commandMenu, new CommandLineAction(this));
93        }
94        loadCommands();
95        setMode(Mode.IDLE);
96    }
97
98    public void startCommand(String commandName) {
99        Command command = findCommand(commandName, true);
100        if (command != null) {
101            startCommand(command);
102        }
103    }
104
105    protected void startCommand(Command command) {
106        MapFrame map = MainApplication.getMap();
107        if (map == null)
108            return;
109        DataSet ds = MainApplication.getLayerManager().getEditDataSet();
110        if (ds == null)
111            return;
112        currentCommand = command;
113        currentCommand.resetLoading();
114        parseSelection(ds.getSelected());
115        if (!(map.mapMode instanceof AnyAction
116           || map.mapMode instanceof DummyAction
117           || map.mapMode instanceof LengthAction
118           || map.mapMode instanceof NodeAction
119           || map.mapMode instanceof PointAction
120           || map.mapMode instanceof RelationAction
121           || map.mapMode instanceof WayAction)) {
122            previousMode = map.mapMode;
123        }
124        if (currentCommand.currentParameterNum < currentCommand.parameters.size())
125            setMode(Mode.SELECTION);
126        else
127            runTool();
128    }
129
130    @Override
131    public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
132        currentMapFrame = newFrame;
133        if (oldFrame == null && newFrame != null) {
134            JToolBar tb = new JToolBar();
135            tb.setLayout(new BorderLayout());
136            tb.setFloatable(false);
137            tb.setOrientation(JToolBar.HORIZONTAL);
138            tb.add(historyField, BorderLayout.NORTH);
139            tb.add(textField, BorderLayout.SOUTH);
140            currentMapFrame.add(tb, BorderLayout.NORTH);
141            printHistory("Loaded CommandLine, version " + getPluginInformation().version);
142        }
143    }
144
145    protected void printHistory(final String text) {
146        SwingUtilities.invokeLater(() -> historyField.setText(text));
147    }
148
149    private void loadCommands() {
150        commands = new Loader(getPluginDirs().getUserDataDirectory(false)).load();
151        if (commands.isEmpty()) {
152            if (!GraphicsEnvironment.isHeadless() && JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(MainApplication.getMainFrame(),
153                    tr("No command has been found. Would you like to download and install default commands now?"),
154                    tr("No command found"), JOptionPane.YES_NO_CANCEL_OPTION)) {
155                try {
156                    downloadAndInstallDefaultCommands();
157                    commands = new Loader(getPluginDirs().getUserDataDirectory(false)).load();
158                    JOptionPane.showMessageDialog(MainApplication.getMainFrame(), tr("Default commands have been successfully installed"),
159                            tr("Success"), JOptionPane.INFORMATION_MESSAGE);
160                } catch (IOException e) {
161                    Logging.warn(e);
162                    JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
163                            tr("Failed to download and install default commands.\n\nError: {0}", e.getMessage()),
164                            tr("Warning"), JOptionPane.WARNING_MESSAGE);
165                }
166            }
167        }
168        for (Command command : commands) {
169            commandMenu.add(new CommandAction(command, this));
170        }
171    }
172
173    private void downloadAndInstallDefaultCommands() throws IOException {
174        String url = Config.getPref().get("commandline.default.commands.url",
175                "https://github.com/Foxhind/JOSM-CommandLine-commands/archive/master.zip");
176        try (ZipInputStream zis = new ZipInputStream(HttpClient.create(new URL(url)).connect().getContent(), StandardCharsets.UTF_8)) {
177            File dir = getPluginDirs().getUserDataDirectory(false);
178            if (!dir.exists()) {
179                dir.mkdirs();
180            }
181            ZipEntry entry = null;
182            while ((entry = zis.getNextEntry()) != null) {
183                if (!entry.isDirectory()) {
184                    String name = entry.getName();
185                    if (name.contains("/")) {
186                        name = name.substring(name.lastIndexOf("/"));
187                    }
188                    File file = new File(dir + File.separator + name);
189                    Logging.info("Installing command file: "+file);
190                    if (!file.createNewFile()) {
191                        throw new IOException("Could not create file: " + file.getAbsolutePath());
192                    }
193                    // Write file
194                    Files.copy(zis, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
195                    // Set last modification date
196                    long time = entry.getTime();
197                    if (time > -1) {
198                        file.setLastModified(time);
199                    }
200                }
201            }
202        }
203    }
204
205    private Command findCommand(String text, boolean strict) {
206        for (int i = 0; i < commands.size(); i++) {
207            if (strict) {
208                if (commands.get(i).name.equalsIgnoreCase(text)) {
209                    return commands.get(i);
210                }
211            } else if (commands.get(i).name.toLowerCase().startsWith(text.toLowerCase()) && text.length() > 1) {
212                return commands.get(i);
213            }
214        }
215        return null;
216    }
217
218    protected void setMode(Mode targetMode) {
219        DataSet currentDataSet = MainApplication.getLayerManager().getEditDataSet();
220        if (currentDataSet != null) {
221            currentDataSet.clearSelection();
222            MainApplication.getMap().mapView.repaint();
223        }
224        if (targetMode == Mode.IDLE) {
225            mode = Mode.IDLE;
226            currentCommand = null;
227            prefix = tr("Command") + commandSymbol;
228            textField.setText(prefix);
229        } else if (targetMode == Mode.SELECTION) {
230            mode = Mode.SELECTION;
231            Parameter currentParameter = currentCommand.parameters.get(currentCommand.currentParameterNum);
232            prefix = tr(currentParameter.description == null ? currentParameter.name : currentParameter.description);
233            if (currentParameter.getRawValue() instanceof Relay)
234                prefix = prefix + " (" + ((Relay) currentParameter.getRawValue()).getOptionsString() + ")";
235            prefix += commandSymbol;
236            String value = currentParameter.getValue();
237            textField.setText(prefix + value);
238            Type currentType = currentParameter.type;
239            MapMode action = null;
240            switch (currentType) {
241            case POINT:
242                action = new PointAction(this);
243                break;
244            case WAY:
245                action = new WayAction(this);
246                break;
247            case NODE:
248                action = new NodeAction(this);
249                break;
250            case RELATION:
251                action = new RelationAction(this);
252                break;
253            case ANY:
254                action = new AnyAction(this);
255                break;
256            case LENGTH:
257                action = new LengthAction(this);
258                break;
259            case USERNAME:
260                loadParameter(Config.getPref().get("osm-server.username", null), true);
261                action = new DummyAction(this);
262                break;
263            case IMAGERYURL:
264                Layer layer = MainApplication.getLayerManager().getActiveLayer();
265                if (layer != null) {
266                    if (!(layer instanceof ImageryLayer)) {
267                        List<ImageryLayer> imageryLayers = MainApplication.getLayerManager().getLayersOfType(ImageryLayer.class);
268                        if (imageryLayers.size() == 1) {
269                            layer = imageryLayers.get(0);
270                        } else {
271                            endInput();
272                            return;
273                        }
274                    }
275                }
276                if (layer != null) {
277                    ImageryInfo info = ((ImageryLayer) layer).getInfo();
278                    String url = info.getUrl();
279                    loadParameter(url.isEmpty() ? info.getImageryType().getTypeString() : url, true);
280                }
281                action = new DummyAction(this);
282                break;
283            case IMAGERYOFFSET:
284                Layer olayer = MainApplication.getLayerManager().getActiveLayer();
285                if (olayer != null) {
286                    if (!(olayer instanceof AbstractTileSourceLayer)) {
287                        @SuppressWarnings("rawtypes")
288                        List<AbstractTileSourceLayer> imageryLayers = MainApplication.getLayerManager().getLayersOfType(
289                                AbstractTileSourceLayer.class);
290                        if (imageryLayers.size() == 1) {
291                            olayer = imageryLayers.get(0);
292                        } else {
293                            endInput();
294                            return;
295                        }
296                    }
297                }
298                loadParameter((String.valueOf(((AbstractTileSourceLayer<?>) olayer).getDisplaySettings().getDx()) + "," +
299                               String.valueOf(((AbstractTileSourceLayer<?>) olayer).getDisplaySettings().getDy())), true);
300                action = new DummyAction(this);
301                break;
302            default:
303                action = new DummyAction(this);
304                break;
305            }
306            currentMapFrame.selectMapMode(action);
307            activate();
308            textField.select(prefix.length(), textField.getText().length());
309        } else if (targetMode == Mode.PROCESSING) {
310            mode = Mode.PROCESSING;
311            prefix = tr("Processing...");
312            textField.setText(prefix);
313            MainApplication.getMap().mapView.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
314        }
315    }
316
317    public void activate() {
318        textField.requestFocus();
319        textField.setCaretPosition(textField.getText().length());
320    }
321
322    public void deactivate() {
323        MainApplication.getMap().mapView.requestFocus();
324    }
325
326    public void abortInput() {
327        printHistory(tr("Aborted") + ".");
328        endInput();
329    }
330
331    public void endInput() {
332        setMode(Mode.IDLE);
333        MainApplication.getMap().selectMapMode(previousMode);
334        MainApplication.getMap().mapView.repaint();
335    }
336
337    public void loadParameter(Object obj, boolean next) {
338        if (currentCommand.loadObject(obj)) {
339            if (currentCommand.hasNextParameter()) {
340                if (next) {
341                    Parameter currentParameter = currentCommand.parameters.get(currentCommand.currentParameterNum);
342                    String prefix = tr(currentParameter.description == null ? currentParameter.name : currentParameter.description);
343                    prefix += commandSymbol;
344                    String value = currentParameter.getValue();
345                    printHistory(prefix + value);
346                    currentCommand.nextParameter();
347                    setMode(Mode.SELECTION);
348                }
349            } else {
350                runTool();
351            }
352        } else {
353            Logging.info("Invalid argument");
354            endInput();
355        }
356    }
357
358    private void parseSelection(Collection<OsmPrimitive> selection) {
359        boolean ok = false;
360        for (OsmPrimitive obj : selection) {
361            ok = currentCommand.loadObject(obj);
362            if (!ok)
363                break;
364        }
365        if (ok) {
366            currentCommand.nextParameter();
367        } else {
368            currentCommand.resetLoading();
369        }
370    }
371
372    private final class CommandTextField extends DisableShortcutsOnFocusGainedTextField {
373        @Override
374        protected void processKeyEvent(KeyEvent e) {
375            if (e.getID() == KeyEvent.KEY_PRESSED) {
376                int code = e.getKeyCode();
377                if (code == KeyEvent.VK_ENTER) {
378                    String commandText = textField.getText().substring(prefix.length());
379                    switch (mode) {
380                    case IDLE:
381                        if (commandText.isEmpty()) {
382                            commandText = history.getLastItem();
383                        } else {
384                            history.addItem(commandText);
385                        }
386                        Command command = findCommand(commandText, true);
387                        if (command != null) {
388                            startCommand(command);
389                        } else {
390                            setMode(Mode.IDLE);
391                        }
392                        break;
393                    case SELECTION:
394                        if (currentMapFrame.mapMode instanceof WayAction
395                         || currentMapFrame.mapMode instanceof NodeAction
396                         || currentMapFrame.mapMode instanceof RelationAction
397                         || currentMapFrame.mapMode instanceof AnyAction) {
398                            Collection<OsmPrimitive> selected = MainApplication.getLayerManager().getEditDataSet().getSelected();
399                            if (!selected.isEmpty())
400                                loadParameter(selected, true);
401                        } else {
402                            loadParameter(commandText, currentCommand.parameters.get(currentCommand.currentParameterNum).maxInstances == 1);
403                        }
404                        break;
405                    case ADJUSTMENT:
406                    default:
407                        break;
408                    }
409                    e.consume();
410                } else if (code == KeyEvent.VK_UP) {
411                    textField.setText(prefix + history.getPrevItem());
412                    e.consume();
413                } else if (code == KeyEvent.VK_DOWN) {
414                    textField.setText(prefix + history.getNextItem());
415                    e.consume();
416                } else if (code == KeyEvent.VK_BACK_SPACE || code == KeyEvent.VK_LEFT) {
417                    if (textField.getCaretPosition() <= prefix.length())
418                        e.consume();
419                } else if (code == KeyEvent.VK_HOME) {
420                    setCaretPosition(prefix.length());
421                    e.consume();
422                } else if (code == KeyEvent.VK_ESCAPE) {
423                    if (textField.getText().length() == prefix.length() && mode == Mode.IDLE)
424                        deactivate();
425                    else
426                        endInput();
427                    e.consume();
428                } else if (code == KeyEvent.VK_DELETE || code == KeyEvent.VK_RIGHT || code == KeyEvent.VK_END) {
429                } else {
430                    e.consume();
431                }
432                if (textField.getCaretPosition() < prefix.length() ||
433                        (textField.getSelectionStart() < prefix.length() && textField.getSelectionStart() > 0))
434                    e.consume();
435            }
436            if (e.getID() == KeyEvent.KEY_TYPED)
437                if (textField.getCaretPosition() < prefix.length() ||
438                        (textField.getSelectionStart() < prefix.length() && textField.getSelectionStart() > 0))
439                    e.consume();
440            super.processKeyEvent(e);
441            if (textField.getText().length() < prefix.length()) { // Safe
442                setMode(mode);
443            }
444            if (e.getID() == KeyEvent.KEY_TYPED) {
445                if (e.getKeyChar() > 'A' && e.getKeyChar() < 'z') {
446                    Command command = findCommand(textField.getText().substring(prefix.length()), false);
447                    if (command != null) {
448                        int currentPos = textField.getSelectionStart() == 0 ? textField.getCaretPosition() : textField.getSelectionStart();
449                        textField.setText(prefix + command.name);
450                        textField.setCaretPosition(currentPos);
451                        textField.select(currentPos, prefix.length() + command.name.length());
452                    }
453                }
454            }
455        }
456
457        @Override
458        protected void processMouseEvent(MouseEvent e) {
459            super.processMouseEvent(e);
460            if (e.getButton() == MouseEvent.BUTTON1 && e.getID() == MouseEvent.MOUSE_RELEASED) {
461                if (textField.getSelectionStart() > 0 && textField.getSelectionStart() < prefix.length())
462                    textField.setSelectionStart(prefix.length());
463                else if (textField.getCaretPosition() < prefix.length())
464                    textField.setCaretPosition(prefix.length());
465            }
466        }
467    }
468
469    private static class ToolProcess {
470        public Process process;
471        public volatile boolean running;
472    }
473
474    // Thanks to Upliner
475    public void runTool() {
476        setMode(Mode.PROCESSING);
477        String commandToRun = currentCommand.run;
478        final boolean tracks = currentCommand.tracks;
479        final ArrayList<Parameter> parameters = currentCommand.parameters;
480
481        for (Parameter parameter : currentCommand.parameters) {
482            commandToRun = commandToRun.replace("{" + parameter.name + "}", parameter.getValue());
483        }
484        for (Parameter parameter : currentCommand.optParameters) {
485            commandToRun = commandToRun.replace("{" + parameter.name + "}", parameter.getValue());
486        }
487        String[] listToRun = commandToRun.split(" ");
488
489        // create the process
490        final Object syncObj = new Object();
491
492        ProcessBuilder builder;
493        builder = new ProcessBuilder(listToRun);
494        builder.directory(getPluginDirs().getUserDataDirectory(false));
495
496        final StringBuilder debugstr = new StringBuilder();
497
498        // debug: print resulting cmdline
499        for (String s : builder.command()) {
500            debugstr.append(s + " ");
501        }
502        debugstr.append("\n");
503        Logging.info(debugstr.toString());
504
505        final ToolProcess tp = new ToolProcess();
506        try {
507            tp.process = builder.start();
508        } catch (final IOException e) {
509            synchronized (debugstr) {
510                Logging.error(
511                        tr("Error executing the script:") + ' ' +
512                        debugstr.toString() + e.getMessage() + '\n' + Arrays.toString(e.getStackTrace()));
513            }
514            return;
515        }
516        tp.running = true;
517
518        // redirect child process's stderr to JOSM stderr
519        new Thread(() -> {
520            try {
521                byte[] buffer = new byte[1024];
522                InputStream errStream = tp.process.getErrorStream();
523                int len;
524                while ((len = errStream.read(buffer)) > 0) {
525                    synchronized (debugstr) {
526                        debugstr.append(new String(buffer, 0, len, StandardCharsets.UTF_8));
527                    }
528                    System.err.write(buffer, 0, len);
529                }
530            } catch (IOException e) {
531                Logging.warn(e);
532            }
533        }).start();
534
535        // Write stdin stream
536        Thread osmWriteThread = new Thread(() -> {
537            BBox bbox = null;
538            final OutputStream outputStream = tp.process.getOutputStream();
539            PrintWriter printWriter = null;
540            try {
541                printWriter = new PrintWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));
542            } catch (Exception e1) {
543                Logging.error(e1);
544            }
545            final OsmWriter osmWriter = OsmWriterFactory.createOsmWriter(printWriter, true, null);
546            Collection<OsmPrimitive> refObjects = currentCommand.getDepsObjects();
547            Collection<OsmPrimitive> pObjects;
548            osmWriter.header();
549            Collection<OsmPrimitive> contents = new ArrayList<>();
550            for (OsmPrimitive primitive1 : refObjects) {
551                contents.add(primitive1);
552                if (bbox == null)
553                    bbox = new BBox(primitive1.getBBox());
554                else
555                    bbox.addPrimitive(primitive1, 0.0);
556            }
557            osmWriter.writeNodes(new SubclassFilteredCollection<OsmPrimitive, Node>(contents, Node.class::isInstance));
558            osmWriter.writeWays(new SubclassFilteredCollection<OsmPrimitive, Way>(contents, Way.class::isInstance));
559            osmWriter.writeRelations(new SubclassFilteredCollection<OsmPrimitive, Relation>(contents, Relation.class::isInstance));
560            osmWriter.footer();
561            osmWriter.flush();
562
563            for (Parameter parameter : parameters) {
564                if (!parameter.isOsm())
565                    continue;
566                contents = new ArrayList<>();
567                osmWriter.header();
568                pObjects = parameter.getParameterObjects();
569                for (OsmPrimitive primitive2 : pObjects) {
570                    contents.add(primitive2);
571                    if (bbox == null)
572                        bbox = new BBox(primitive2.getBBox());
573                    else
574                        bbox.addPrimitive(primitive2, 0.0);
575                }
576                osmWriter.writeNodes(new SubclassFilteredCollection<OsmPrimitive, Node>(contents, Node.class::isInstance));
577                osmWriter.writeWays(new SubclassFilteredCollection<OsmPrimitive, Way>(contents, Way.class::isInstance));
578                osmWriter.writeRelations(new SubclassFilteredCollection<OsmPrimitive, Relation>(contents, Relation.class::isInstance));
579                osmWriter.footer();
580                osmWriter.flush();
581            }
582
583            if (tracks) {
584                try (GpxWriter gpxWriter = new GpxWriter(printWriter)) {
585                    GpxFilter gpxFilter = new GpxFilter();
586                    gpxFilter.initBboxFilter(bbox);
587                    List<GpxLayer> gpxLayers = MainApplication.getLayerManager().getLayersOfType(GpxLayer.class);
588                    for (GpxLayer gpxLayer : gpxLayers) {
589                        gpxFilter.addGpxData(gpxLayer.data);
590                    }
591                    gpxWriter.write(gpxFilter.getGpxData());
592                } catch (IOException e2) {
593                    Logging.warn(e2);
594                }
595            }
596            Utils.close(osmWriter);
597            synchronized (syncObj) {
598                if (currentCommand.asynchronous) {
599                    tp.running = false;
600                    syncObj.notifyAll();
601                }
602            }
603        });
604
605        // Read stdout stream
606        final DataSet currentDataSet = MainApplication.getLayerManager().getEditDataSet();
607        final CommandLine that = this;
608        Thread osmParseThread = new Thread(() -> {
609            try {
610                final OsmToCmd osmToCmd = new OsmToCmd(that, currentDataSet);
611                String commandName = currentCommand.name;
612                final InputStream inputStream = tp.process.getInputStream();
613                osmToCmd.parseStream(inputStream);
614                final List<org.openstreetmap.josm.command.Command> cmdlist = osmToCmd.getCommandList();
615                if (!cmdlist.isEmpty()) {
616                    final SequenceCommand cmd = new SequenceCommand(commandName, cmdlist);
617                    SwingUtilities.invokeLater(() -> UndoRedoHandler.getInstance().add(cmd));
618                }
619            } catch (Exception e) {
620                Logging.warn(e);
621            } finally {
622                synchronized (syncObj) {
623                    tp.running = false;
624                    syncObj.notifyAll();
625                }
626            }
627        });
628
629        osmParseThread.start();
630        osmWriteThread.start();
631
632        synchronized (syncObj) {
633            try {
634                syncObj.wait(Config.getPref().getInt("commandline.timeout", 20000));
635            } catch (InterruptedException e) {
636                Logging.warn(e);
637            }
638        }
639        if (tp.running) {
640            new Thread(new PleaseWaitRunnable(currentCommand.name) {
641                @Override
642                protected void realRun() {
643                    try {
644                        progressMonitor.indeterminateSubTask(null);
645                        synchronized (syncObj) {
646                            if (tp.running)
647                                syncObj.wait();
648                        }
649                    } catch (InterruptedException e) {
650                        Logging.warn(e);
651                    }
652                }
653
654                @Override
655                protected void cancel() {
656                    synchronized (syncObj) {
657                        tp.running = false;
658                        tp.process.destroy();
659                        syncObj.notifyAll();
660                        endInput();
661                    }
662                }
663
664                @Override
665                protected void finish() {
666                }
667            }).start();
668        }
669        endInput();
670    }
671}
Note: See TracBrowser for help on using the repository browser.