package org.jbpm.ui.custom;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.jface.dialogs.Dialog;
import org.jbpm.ui.DesignerLogger;
import org.jbpm.ui.bsh.BSHDecisionModel;
import org.jbpm.ui.common.model.Decision;
import org.jbpm.ui.common.model.Delegable;
import org.jbpm.ui.common.model.GraphElement;
import org.jbpm.ui.common.model.ProcessDefinition;
import org.jbpm.ui.common.model.Transition;
import org.jbpm.ui.dialog.BSHEditorDialog;
import bsh.ParseException;
import bsh.Parser;
public class BSHCellEditorProvider extends DelegableProvider implements IDecisionProvider {
@Override
public String showConfigurationDialog(Delegable delegable) {
ProcessDefinition definition = ((GraphElement) delegable).getProcessDefinition();
List<Transition> transitions = ((Decision) delegable).getLeavingTransitions();
List<String> transitionNames = new ArrayList<String>();
for (Transition transition : transitions) {
transitionNames.add(transition.getName());
}
BSHEditorDialog dialog = new BSHEditorDialog(
delegable.getDelegationConfiguration(),
transitionNames,
definition.getVariablesList());
if (dialog.open() == Dialog.OK) {
return dialog.getResult();
}
return null;
}
@Override
public boolean validateValue(Delegable delegable) {
try {
String configuration = delegable.getDelegationConfiguration();
Parser parser = new Parser(new ByteArrayInputStream(configuration.getBytes()));
while(!parser.Line()) {
parser.popNode();
}
return configuration.trim().length() > 0;
} catch (ParseException e) {
DesignerLogger.logErrorWithoutDialog("BSH parser exception", e);
return false;
}
}
public Set<String> getTransitionNames(Decision decision) {
try {
BSHDecisionModel model = new BSHDecisionModel(decision.getDelegationConfiguration(), decision.getProcessDefinition().getVariablesList());
if (model != null)
return new HashSet<String>(model.getTransitionNames());
} catch (Exception e) {
}
return new HashSet<String>();
}
public String getDefaultTransitionName(Decision decision) {
try {
BSHDecisionModel model = new BSHDecisionModel(decision.getDelegationConfiguration(), decision.getProcessDefinition().getVariablesList());
if (model != null)
return model.getDefaultTransitionName();
} catch (Exception e) {
}
return null;
}
public void transitionRenamed(Decision decision, String oldName, String newName) {
String conf = decision.getDelegationConfiguration();
conf = conf.replaceAll(Pattern.quote("\"" + oldName + "\""), Matcher.quoteReplacement("\"" + newName + "\""));
decision.setDelegationConfiguration(conf);
}
}