package pl.net.bluesoft.rnd.processtool.ui.basewidgets.editor; import com.vaadin.data.Property; import com.vaadin.data.Validator; import com.vaadin.ui.*; import org.aperteworkflow.scripting.ScriptProcessor; import org.aperteworkflow.scripting.ScriptProcessorRegistry; import org.aperteworkflow.scripting.ScriptValidationException; import org.aperteworkflow.util.vaadin.VaadinUtility; import org.vaadin.addon.customfield.CustomField; import pl.net.bluesoft.rnd.processtool.ProcessToolContext; import pl.net.bluesoft.rnd.processtool.ui.widgets.form.FormAwareField; import pl.net.bluesoft.rnd.util.i18n.I18NSource; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import static pl.net.bluesoft.rnd.processtool.ui.basewidgets.editor.EditorHelper.getLocalizedMessage; import static pl.net.bluesoft.util.lang.FormatUtil.nvl; /** * Created by IntelliJ IDEA. * User: zmalinowski * Date: 3/5/12 * Time: 9:57 AM */ public class ScriptCodeEditor extends CustomField implements FormAwareField { private Map<String, Property> formProperties; private final TextArea code; private static final Logger logger = Logger.getLogger(ScriptCodeEditor.class.getName()); public ScriptCodeEditor() { VerticalLayout compositionRoot = new VerticalLayout(); setCompositionRoot(compositionRoot); code = new TextArea(); code.setWidth("100%"); code.setNullRepresentation(""); compositionRoot.addComponent(code); HorizontalLayout hl = new HorizontalLayout(); Button save = new Button(getLocalizedMessage("script.editor.save")); save.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { validateAndSave(); } }); hl.addComponent(save); compositionRoot.addComponent(hl); } private void validateAndSave() throws Validator.InvalidValueException { if (code.getValue() == null || ((String) code.getValue()).trim().isEmpty()) { commit(); return; } try { ScriptProcessorRegistry registry = ProcessToolContext.Util.getThreadProcessToolContext().getRegistry().lookupService( ScriptProcessorRegistry.class.getName()); Property scriptType = formProperties.get("scriptEngineType"); if (scriptType == null || scriptType.getValue() == null || ((String) scriptType.getValue()).isEmpty()) throw new Validator.InvalidValueException("script.undefined.type"); ScriptProcessor scriptProcessor = registry.getScriptProcessor((String) scriptType.getValue()); if (scriptProcessor == null) throw new Validator.InvalidValueException("script.processor.not.found"); InputStream is = new ByteArrayInputStream(((String) code.getValue()).getBytes()); scriptProcessor.validate(is); code.commit(); showInfoNotification("validation.script.ok"); } catch (Validator.InvalidValueException e) { logger.log(Level.SEVERE, e.getMessage(), e); showWarningNotification(e.getMessage(), null); } catch (Exception e) { logger.log(Level.SEVERE, e.getMessage(), e); showWarningNotification("validation.script.error", e.getMessage()); } } private void showWarningNotification(String code, String message) { getApplication().getMainWindow().showNotification(getLocalizedMessage(code) + nvl(message), Window.Notification.TYPE_WARNING_MESSAGE); } private void showInfoNotification(String message) { getApplication().getMainWindow().showNotification(getLocalizedMessage(message), Window.Notification.TYPE_HUMANIZED_MESSAGE); } @Override public Class<?> getType() { return String.class; } @Override public void setFormProperties(Map<String, Property> map) { this.formProperties = map; } @Override public Property getPropertyDataSource() { return code.getPropertyDataSource(); } @Override public void setPropertyDataSource(Property newDataSource) { code.setPropertyDataSource(newDataSource); } }