package org.imixs.marty.util;
import java.util.List;
import java.util.StringTokenizer;
import java.util.logging.Logger;
import org.imixs.workflow.ItemCollection;
/**
* The WorkitemHelper provides methods to clone, compare and sort workitems.
*
* @author rsoika
*
*/
public class WorkitemHelper {
private static Logger logger = Logger.getLogger(WorkitemHelper.class.getName());
/**
* This method clones the given workItem with a minimum of attributes.
*
* @param aWorkitem
* @return
*/
public static ItemCollection clone(ItemCollection aWorkitem) {
ItemCollection clone = new ItemCollection();
// clone the standard WorkItem properties
clone.replaceItemValue("Type", aWorkitem.getItemValue("Type"));
clone.replaceItemValue("$UniqueID", aWorkitem.getItemValue("$UniqueID"));
clone.replaceItemValue("$UniqueIDRef",
aWorkitem.getItemValue("$UniqueIDRef"));
clone.replaceItemValue("$ModelVersion",
aWorkitem.getItemValue("$ModelVersion"));
clone.replaceItemValue("$ProcessID",
aWorkitem.getItemValue("$ProcessID"));
clone.replaceItemValue("$Created", aWorkitem.getItemValue("$Created"));
clone.replaceItemValue("$Modified", aWorkitem.getItemValue("$Modified"));
clone.replaceItemValue("$isAuthor", aWorkitem.getItemValue("$isAuthor"));
clone.replaceItemValue("txtName", aWorkitem.getItemValue("txtName"));
clone.replaceItemValue("txtWorkflowStatus",
aWorkitem.getItemValue("txtWorkflowStatus"));
clone.replaceItemValue("txtWorkflowGroup",
aWorkitem.getItemValue("txtWorkflowGroup"));
clone.replaceItemValue("namCreator",
aWorkitem.getItemValue("namCreator"));
clone.replaceItemValue("namCurrentEditor",
aWorkitem.getItemValue("namCurrentEditor"));
clone.replaceItemValue("namOwner", aWorkitem.getItemValue("namOwner"));
clone.replaceItemValue("namTeam", aWorkitem.getItemValue("namTeam"));
clone.replaceItemValue("namManager", aWorkitem.getItemValue("namManager"));
clone.replaceItemValue("namassist", aWorkitem.getItemValue("namassist"));
clone.replaceItemValue("txtWorkflowSummary",
aWorkitem.getItemValue("txtWorkflowSummary"));
clone.replaceItemValue("txtWorkflowAbstract",
aWorkitem.getItemValue("txtWorkflowAbstract"));
clone.replaceItemValue("txtWorkflowImageURL",
aWorkitem.getItemValue("txtWorkflowImageURL"));
// clone the marty WorkItem properties....
if (aWorkitem.hasItem("txtName"))
clone.replaceItemValue("txtName", aWorkitem.getItemValue("txtName"));
if (aWorkitem.hasItem("txtProcessName"))
clone.replaceItemValue("txtProcessName",
aWorkitem.getItemValue("txtProcessName"));
if (aWorkitem.hasItem("txtSpaceName"))
clone.replaceItemValue("txtSpaceName",
aWorkitem.getItemValue("txtSpaceName"));
if (aWorkitem.hasItem("datdate"))
clone.replaceItemValue("datdate", aWorkitem.getItemValue("datdate"));
if (aWorkitem.hasItem("datFrom"))
clone.replaceItemValue("datFrom", aWorkitem.getItemValue("datFrom"));
if (aWorkitem.hasItem("datTo"))
clone.replaceItemValue("datTo", aWorkitem.getItemValue("datTo"));
if (aWorkitem.hasItem("numsequencenumber"))
clone.replaceItemValue("numsequencenumber",
aWorkitem.getItemValue("numsequencenumber"));
return clone;
}
/**
* This method tests if a given WorkItem matches a filter expression. The
* expression is expected in a column separated list of reg expressions for
* Multiple properties. - e.g.:
*
* <code>(txtWorkflowGroup:Invoice)($ProcessID:1...)</code>
*
* @param workitem
* - workItem to be tested
* @param filter
* - combined regex to test different fields
* @return - true if filter matches filter expression.
*/
public static boolean matches(ItemCollection workitem, String filter) {
if (filter == null || "".equals(filter.trim()))
return true;
// split columns
StringTokenizer regexTokens = new StringTokenizer(filter, ")");
while (regexTokens.hasMoreElements()) {
String regEx = regexTokens.nextToken();
// remove columns
regEx.replace("(", "");
regEx.replace(")", "");
regEx.replace(",", "");
// test if ':' found
if (regEx.indexOf(':') > -1) {
regEx = regEx.trim();
String itemName = regEx.substring(0, regEx.indexOf(':'));
regEx = regEx.substring(regEx.indexOf(':') + 1);
@SuppressWarnings("unchecked")
List<Object> itemValues = workitem.getItemValue(itemName);
for (Object aValue : itemValues) {
if (!aValue.toString().matches(regEx)) {
logger.fine("Value '" + aValue + "' did not match : "
+ regEx);
return false;
}
}
}
}
// workitem matches criteria
return true;
}
}