package pl.net.bluesoft.rnd.processtool.ui.basewidgets.editor;
import com.vaadin.data.Property;
import com.vaadin.data.Validator;
import com.vaadin.ui.Button;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.TextField;
import com.vaadin.ui.Window;
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.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
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: 1:51 PM
*/
public class ScriptUrlEditor extends CustomField implements FormAwareField {
private final TextField url;
private Map<String, Property> formProperties;
private static final Logger logger = Logger.getLogger(ScriptUrlEditor.class.getName());
public ScriptUrlEditor() {
HorizontalLayout hl = new HorizontalLayout();
hl.setSpacing(true);
setCompositionRoot(hl);
url = new TextField();
url.setNullRepresentation("");
url.setWidth("100%");
hl.setWidth("100%");
hl.addComponent(url);
hl.setExpandRatio(url, 1.0f);
Button save = new Button(getLocalizedMessage("script.url.editor.save"));
hl.addComponent(save);
save.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
validateAndSave();
}
});
}
private void validateAndSave() {
if (url.getValue() == null || ((String) url.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 URL((String) url.getValue()).openStream();
scriptProcessor.validate(is);
url.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 url.getPropertyDataSource();
}
@Override
public void setPropertyDataSource(Property newDataSource) {
url.setPropertyDataSource(newDataSource);
}
}