/* * This file is part of the OSMembrane project. * More informations under www.osmembrane.de * * The project is licensed under the GNU GENERAL PUBLIC LICENSE 3.0. * for more details about the license see http://www.osmembrane.de/license/ * * Source: $HeadURL$ ($Revision$) * Last changed: $Date$ */ package de.osmembrane.controller.actions; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JOptionPane; import javax.swing.KeyStroke; import de.osmembrane.Application; import de.osmembrane.controller.ActionRegistry; import de.osmembrane.exceptions.ControlledException; import de.osmembrane.exceptions.ExceptionSeverity; import de.osmembrane.model.ModelProxy; import de.osmembrane.model.pipeline.AbstractFunction; import de.osmembrane.model.pipeline.AbstractParameter; import de.osmembrane.model.settings.SettingType; import de.osmembrane.resources.Constants; import de.osmembrane.resources.Resource; import de.osmembrane.tools.HeadlessSafe; import de.osmembrane.tools.I18N; import de.osmembrane.tools.IconLoader.Size; import de.osmembrane.tools.PipelineExecutor; /** * Action to preview the generated pipeline. Like {@link ExecutePipelineAction}, * only faster and with direct display. * * @author tobias_kuhn * */ public class PreviewPipelineAction extends AbstractAction { private static final long serialVersionUID = 8099091858953447990L; /** * Creates a new {@link PreviewPipelineAction} */ public PreviewPipelineAction() { putValue( Action.NAME, I18N.getInstance().getString( "Controller.Actions.PreviewPipeline.Name")); putValue( Action.SHORT_DESCRIPTION, I18N.getInstance().getString( "Controller.Actions.PreviewPipeline.Description")); putValue(Action.SMALL_ICON, Resource.PROGRAM_ICON.getImageIcon( "preview_pipeline.png", Size.SMALL)); putValue(Action.LARGE_ICON_KEY, Resource.PROGRAM_ICON.getImageIcon( "preview_pipeline.png", Size.NORMAL)); putValue( Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_P, HeadlessSafe.getMenuShortcutKeyMask())); } @Override public void actionPerformed(ActionEvent e) { if (!(e.getSource() instanceof PipelineExecutor)) { ActionRegistry .getInstance() .get(ExecutePipelineAction.class) .actionPerformed( new ActionEvent(this, 0, "PreviewExection")); } else { /* Check if the pipeline is complete */ if (!ModelProxy.getInstance().getPipeline().isComplete()) { if (!(JOptionPane .showConfirmDialog( null, I18N.getInstance() .getString( "Controller.Actions.PipelineNotComplete"), I18N.getInstance() .getString( "Controller.Actions.PipelineNotComplete.Title"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION)) { return; } } /* the path to josm */ final String josmPath = (String) ModelProxy.getInstance() .getSettings().getValue(SettingType.DEFAULT_JOSM_PATH); /* proof if the josm binaries are available */ File josmFile = new File(josmPath); if (!josmFile.isFile() || !josmFile.canExecute() || !josmFile.canRead()) { Application .handleException(new ControlledException( this, ExceptionSeverity.WARNING, I18N.getInstance() .getString( "Controller.Actions.PreviewPipeline.JOSMNotFound"))); } /* the working directory */ final String workingDirectory = (String) ModelProxy.getInstance() .getSettings() .getValue(SettingType.DEFAULT_WORKING_DIRECTORY); final List<String> toBeLoadedFilesByJosm = new ArrayList<String>(); for (AbstractFunction function : ModelProxy.getInstance() .getPipeline().getFunctions()) { if (function.getActiveTask().getName().toLowerCase() .equals("write-xml")) { for (AbstractParameter param : function.getActiveTask() .getParameters()) { if (param.getName().toLowerCase().equals("file")) { toBeLoadedFilesByJosm.add(param.getValue()); } } } } List<String> cmdLine = new ArrayList<String>( toBeLoadedFilesByJosm.size() + 5); String javaPath = System.getProperty("java.home") + "/bin/java"; cmdLine.add(javaPath); cmdLine.add(String.format("-Xmx%sm", Constants.JOSM_HEAP_SIZE)); cmdLine.add("-jar"); cmdLine.add(josmPath); cmdLine.addAll(toBeLoadedFilesByJosm); ProcessBuilder processBuilder = new ProcessBuilder(cmdLine); try { processBuilder.directory(new File(workingDirectory)) .redirectErrorStream(false).start(); } catch (IOException e1) { Application .handleException(new ControlledException( this, ExceptionSeverity.WARNING, e1, I18N.getInstance() .getString( "Controller.Actions.PreviewPipelineAction.IOException"))); } } } }