package org.enhydra.shark.xpdl.elements; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.enhydra.shark.xpdl.XMLAttribute; import org.enhydra.shark.xpdl.XMLComplexElement; import org.enhydra.shark.xpdl.XMLElementChangeInfo; import org.enhydra.shark.xpdl.XMLElementChangeListener; import org.enhydra.shark.xpdl.XPDLConstants; public class Deadline extends XMLComplexElement implements XMLElementChangeListener { public static String DURATION_UNIT_DATETIME = "t"; public static String DURATION_UNIT_DATE = "d"; private DeadlineLimit refDeadlineLimit; private XMLAttribute attrDurationUnit; private DeadlineCondition refDeadlineCondition; public Deadline(Deadlines parent) { super(parent, true); parent.addListener(this); } protected void fillStructure() { //CUSTOM refDeadlineCondition = new DeadlineCondition(this); // min=1, max=1 ExceptionName refExceptionName = new ExceptionName(this); // min=1, max=1 refDeadlineLimit = new DeadlineLimit(this); //min=1, max=1 XMLAttribute attrExecution = new XMLAttribute(this, "Execution", false, new String[]{ XPDLConstants.EXECUTION_NONE, XPDLConstants.EXECUTION_ASYNCHR, XPDLConstants.EXECUTION_SYNCHR }, 1); attrDurationUnit = new XMLAttribute(this, "DurationUnit", false, new String[]{ XPDLConstants.DURATION_UNIT_D, XPDLConstants.DURATION_UNIT_h, XPDLConstants.DURATION_UNIT_m, XPDLConstants.DURATION_UNIT_s, DURATION_UNIT_DATETIME, DURATION_UNIT_DATE }, 0); add(attrExecution); add(refDeadlineCondition); add(refExceptionName); addCustomElements(); //END CUSTOM } public XMLAttribute getExecutionAttribute() { return (XMLAttribute) get("Execution"); } public String getExecution() { return getExecutionAttribute().toValue(); } public void setExecutionNONE() { getExecutionAttribute().setValue(XPDLConstants.EXECUTION_NONE); } public void setExecutionASYNCHR() { getExecutionAttribute().setValue(XPDLConstants.EXECUTION_ASYNCHR); } public void setExecutionSYNCHR() { getExecutionAttribute().setValue(XPDLConstants.EXECUTION_SYNCHR); } public XMLAttribute getDurationUnitAttribute() { return (XMLAttribute) get("DurationUnit"); } public String getDurationUnit() { return getDurationUnitAttribute().toValue(); } public String getDeadlineLimit() { return get("DeadlineLimit").toValue(); } public void setDeadlineLimit(String deadlineLimit) { set("DeadlineLimit", deadlineLimit); } public String getDeadlineCondition() { return get("DeadlineCondition").toValue(); } public void setDeadlineCondition(String deadlineCondition) { set("DeadlineCondition", deadlineCondition); } public String getExceptionName() { return get("ExceptionName").toValue(); } public void setExceptionName(String exceptionName) { set("ExceptionName", exceptionName); } //CUSTOM public void xmlElementChanged(XMLElementChangeInfo changedInfo) { Deadlines changedDeadlines = (Deadlines) changedInfo.getChangedElement(); if (changedDeadlines != null && changedDeadlines.size() > 0) { List deadlineList = changedInfo.getChangedSubElements(); Deadline changedDeadline = (Deadline) deadlineList.get(0); if (changedDeadline == this) { XMLAttribute durationUnit = (XMLAttribute) changedDeadline.get("DurationUnit"); String changedDeadlineLimit = changedDeadline.getDeadlineLimit(); if (changedDeadlineLimit != null && changedDeadlineLimit.trim().length() > 0) { char durationUnitChar = durationUnit.toValue().charAt(0); String variableCondition = ""; switch (durationUnitChar) { case 'D': variableCondition += (24 * 60 * 60 * 1000); break; case 'h': variableCondition += (60 * 60 * 1000); break; case 'm': variableCondition += (60 * 1000); break; case 's': variableCondition += 1000; } if (durationUnitChar != 'd' && durationUnitChar != 't') { variableCondition = "(" + changedDeadlineLimit + "*" + variableCondition + ")"; set("DeadlineCondition", "var " + durationUnitChar + "=new java.util.Date(); " + durationUnitChar + ".setTime(ACTIVITY_ACTIVATED_TIME.getTime()+" + variableCondition + "); " + durationUnitChar + ";"); } else if (durationUnitChar == 'd') { String condition = "var d = new java.text.SimpleDateFormat('dd/MM/yyyy'); d.parse(" + changedDeadlineLimit + ");"; set("DeadlineCondition", condition); } else if (durationUnitChar == 't') { String condition = "var d = new java.text.SimpleDateFormat('dd/MM/yyyy HH:mm'); d.parse(" + changedDeadlineLimit + ");"; set("DeadlineCondition", condition); } } } hideCustomElements(); } } public void addCustomElements() { add(attrDurationUnit); add(refDeadlineLimit); } public void hideCustomElements() { // set deadline limit from deadline condition String deadlineCondition = getDeadlineCondition(); if (deadlineCondition.contains("java.text.SimpleDateFormat")) { String deadlineLimit = ""; Pattern pattern = Pattern.compile("d.parse\\((.+)\\);"); Matcher matcher = pattern.matcher(deadlineCondition); if (matcher.find()) { deadlineLimit = matcher.group(1); } refDeadlineLimit.setValue(deadlineLimit); if (deadlineCondition.contains("dd/MM/yyyy HH:mm")) { attrDurationUnit.setValue(DURATION_UNIT_DATETIME); } else { attrDurationUnit.setValue(DURATION_UNIT_DATE); } } else { String deadlineLimit = ""; Pattern pattern = Pattern.compile("\\+\\(.+\\*"); Matcher matcher = pattern.matcher(deadlineCondition); if (matcher.find()) { String match = matcher.group(); deadlineLimit = match.substring(2, match.length()-1); } refDeadlineLimit.setValue(deadlineLimit); // set duration unit from deadline condition String durationUnit = XPDLConstants.DURATION_UNIT_D; pattern = Pattern.compile("\\*\\d+\\)"); matcher = pattern.matcher(deadlineCondition); if (matcher.find()) { String match = matcher.group(); String millis = match.substring(1, match.length()-1); if ("1000".equals(millis)) { durationUnit = XPDLConstants.DURATION_UNIT_s; } else if ("60000".equals(millis)) { durationUnit = XPDLConstants.DURATION_UNIT_m; } else if ("3600000".equals(millis)) { durationUnit = XPDLConstants.DURATION_UNIT_h; } else { durationUnit = XPDLConstants.DURATION_UNIT_D; } } attrDurationUnit.setValue(durationUnit); } // remove elements elements.remove(refDeadlineLimit); elements.remove(attrDurationUnit); } //END CUSTOM }