package ever.generic; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import ever.pipeline.AbstractLocalWorkflowAnalyzer; import ever.pipeline.Case; import ever.workflowRepresentation.EmptyProductException; import ever.workflowRepresentation.NotAProductException; import ever.workflowRepresentation.Product; import ever.workflowRepresentation.Sequence; import ever.workflowRepresentation.SimpleProduct; import ever.workflowRepresentation.Task; import ever.workflowRepresentation.Workflow; import ever.workflowRepresentation.WorkflowElement; /** *This Analyzer takes the raw string of an ingredient which was extracted by sundance and it splits ingredients lists in single ingredient. * Sundance can by default just extract one item per case frame. Therefore a set of pattern was integrated in Sundance to extract comma seperated lists (with and and or) * * @author Pol Schumacher, Wirtschaftsinformatik, Institut fuer Informatik, Goethe Universitaet Frankfurt * */ public class LocalProductSplitter extends AbstractLocalWorkflowAnalyzer { @Override public Case analyze(Case c) { Workflow wf = c.getWf(); LinkedList taskList = new LinkedList(); Sequence seq = wf.getTopSequence(); for(WorkflowElement wfe : seq.getAllElements()) { Task t; try { try { t = (Task)wfe; } catch (ClassCastException e1) { taskList.add(wfe); continue; } SimpleProduct p = (SimpleProduct)t.getNextInProduct(); HashSet toAdd = new HashSet(); while(p!=null) { String rawProduct = p.getName(); String [] split = rawProduct.split("(>comma)|(>COMMA)|( and )|( or )"); for(String s :split) { try { toAdd.add(new SimpleProduct(s, t.getId())); } catch (EmptyProductException e) { continue; } catch (NotAProductException e) { // TODO Auto-generated catch block e.printStackTrace(); } } t.removeInProduct(p); p=(SimpleProduct)t.getNextInProduct(); } for(Product pr : toAdd) t.addInProduct(pr); toAdd.clear(); p = (SimpleProduct)t.getNextOutProduct(); while(p!=null) { String rawProduct = p.getName(); String [] split = rawProduct.split("(>COMMA)|( and )|( or )"); for(String s :split) { try { toAdd.add(new SimpleProduct(s, t.getId())); } catch (EmptyProductException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NotAProductException e) { // TODO Auto-generated catch block e.printStackTrace(); } } t.removeOutProduct(p); p=(SimpleProduct)t.getNextOutProduct(); } for(Product pr : toAdd) t.addOutProduct(pr); } catch (ClassCastException e) { continue; } taskList.add(t); } seq.putAllElements(taskList); wf.setTopSequence(seq); c.setWf(wf); return c; } @Override public HashMap analyze(HashMap c) { // TODO Auto-generated method stub return null; } @Override public void analyze() { // TODO Auto-generated method stub } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } }