package org.freeplane.plugin.script.filter; import java.awt.KeyboardFocusManager; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import javax.swing.JOptionPane; import org.freeplane.core.util.TextUtils; import org.freeplane.features.filter.FilterCancelledException; import org.freeplane.features.filter.condition.ASelectableCondition; import org.freeplane.features.map.NodeModel; import org.freeplane.n3.nanoxml.XMLElement; import org.freeplane.plugin.script.ExecuteScriptException; import org.freeplane.plugin.script.ScriptingEngine; public class ScriptCondition extends ASelectableCondition { private static final String SCRIPT_FILTER_DESCRIPTION_RESOURCE = "plugins/script_filter"; private static final String SCRIPT_FILTER_ERROR_RESOURCE = "plugins/script_filter_error"; static final String NAME = "script_condition"; static final String SCRIPT = "SCRIPT"; final private String script; static ASelectableCondition load(final XMLElement element) { return new ScriptCondition(element.getAttribute(SCRIPT, null)); } public ScriptCondition(final String script) { super(); this.script = script; } public boolean checkNode(final NodeModel node) { final ByteArrayOutputStream out = new ByteArrayOutputStream(); final PrintStream printStream = new PrintStream(out); final Object result; try { result = ScriptingEngine.executeScript(node, script, printStream); if(result instanceof Boolean) return (Boolean) result; if(result instanceof Number) return ((Number) result).doubleValue() != 0; printStream.println(this + ": got '" + result + "' for " + node); printStream.close(); final String info = TextUtils.format(SCRIPT_FILTER_ERROR_RESOURCE, createDescription(), node.toString(), String.valueOf(result)); cancel(info, true); } catch (ExecuteScriptException e) { printStream.close(); final String info = TextUtils.format(SCRIPT_FILTER_ERROR_RESOURCE, createDescription(), node.toString(), out.toString()); cancel(info, false); } return false; } private void cancel(final String info, boolean cancel) { if(cancel){ JOptionPane.showMessageDialog(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(), info, TextUtils.getText("error"), JOptionPane.ERROR_MESSAGE); } else{ final int result = JOptionPane.showConfirmDialog(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(), info, TextUtils.getText("error"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE); if(result == JOptionPane.OK_OPTION) return; } throw new FilterCancelledException(info); } @Override protected String createDescription() { return TextUtils.format(SCRIPT_FILTER_DESCRIPTION_RESOURCE, script); } public void fillXML(final XMLElement child) { super.fillXML(child); child.setAttribute(SCRIPT, script); } @Override protected String getName() { return NAME; } }