package org.enhydra.jawe.base.panel.panels;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.swing.JOptionPane;
import org.enhydra.jawe.ResourceManager;
import org.enhydra.jawe.base.panel.PanelContainer;
import org.enhydra.shark.xpdl.XMLElement;
import org.enhydra.shark.xpdl.XMLUtil;
import org.enhydra.shark.xpdl.XPDLConstants;
import org.enhydra.shark.xpdl.elements.Condition;
import org.enhydra.shark.xpdl.elements.DataField;
import org.enhydra.shark.xpdl.elements.DataFields;
import org.enhydra.shark.xpdl.elements.Transition;
import org.enhydra.shark.xpdl.elements.WorkflowProcess;
public class XMLTransitionPanel extends XMLGroupPanel {
public XMLTransitionPanel(PanelContainer pc,
XMLElement myOwnerL,
Object[] elements,
String title,
boolean isVertical,
boolean hasBorder,
boolean hasEmptyBorder) {
super(pc,
myOwnerL,
Arrays.asList(elements),
title,
isVertical,
hasBorder,
hasEmptyBorder);
}
public XMLTransitionPanel(PanelContainer pc,
XMLElement myOwnerL,
List elements,
String title,
boolean isVertical,
boolean hasBorder,
boolean hasEmptyBorder) {
super(pc, myOwnerL, elements, title, isVertical, hasBorder, hasEmptyBorder);
}
public static final String DEFAULT_VARIABLE = "status";
@Override
public void setElements() {
super.setElements();
suggestCondition();
}
/**
* Suggest to automatically add a Condition if a name is specified
*/
protected void suggestCondition() {
Transition transition = (Transition)getOwner();
String name = transition.getName();
Condition condition = transition.getCondition();
String conditionType = (condition != null) ? condition.getType() : "";
String expression = (condition != null) ? condition.toValue() : "";
// check when transition name is specified and no existing condition
if (name != null && name.trim().length() > 0
&& conditionType.trim().length() == 0 || conditionType.equals(XPDLConstants.CONDITION_TYPE_CONDITION)
&& expression.trim().length() == 0) {
// check for existing variable
String variableName = checkDefaultVariable(transition);
if (variableName != null) {
// prompt to auto generate condition
String message = "<html>"
+ "<font size=\"3\">"
+ ResourceManager.getLanguageDependentString("GUIDE_AUTO_CONDITION")
+ "</font>"
+ "</html>";
int result = JOptionPane.showConfirmDialog(this.getRootPane(), message, ResourceManager.getLanguageDependentString("GUIDE_TITLE"), JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
// create default variable
createDefaultVariable(transition, variableName);
// set condition expression
populateExpression(transition, variableName, name);
}
}
}
}
/**
* Check for existence of the default variable
* @return name of the default variable, null if not created
*/
protected String checkDefaultVariable(Transition transition) {
String variableName = null;
// check for existing variables
WorkflowProcess process = (WorkflowProcess) transition.getParent().getParent();
Map dataFieldMap = XMLUtil.getPossibleDataFields(process);
if (dataFieldMap.isEmpty() || dataFieldMap.get(DEFAULT_VARIABLE) != null) {
variableName = DEFAULT_VARIABLE;
}
return variableName;
}
/**
* Create default variable if no existing variables
* @return name of the created variable, null if not created
*/
protected void createDefaultVariable(Transition transition, String variableName) {
WorkflowProcess process = (WorkflowProcess) transition.getParent().getParent();
Map dataFieldMap = XMLUtil.getPossibleDataFields(process);
if (dataFieldMap.isEmpty() || dataFieldMap.get(variableName) == null) {
// default variable does not exist, create new one
DataFields dfs = process.getDataFields();
DataField df = (DataField)dfs.generateNewElement();
df.setId(variableName);
dfs.add(df);
}
}
/**
* Add condition expression variable == 'value'
* @param variable
* @param value
*/
protected void populateExpression(Transition transition, String variable, String value) {
// set expression
String expression = variable + "=='" + value + "'";
Condition condition = transition.getCondition();
condition.setTypeCONDITION();
condition.setValue(expression);
// reset name to blank
transition.setName("");
}
}