package org.seqcode.projects.seqview.model; import java.util.*; import org.seqcode.gsebricks.verbs.Expander; public class MultipleExpanderModel<IN,OUT> extends SeqViewModel implements Runnable { private boolean newinput; private LinkedList<Expander<IN,OUT>> expanders; private IN input; private ArrayList<OUT> result; public MultipleExpanderModel() { super(); expanders = new LinkedList<Expander<IN,OUT>>(); newinput = false; } public synchronized void run() { while(keepRunning()) { try { if (!newinput) { wait(); } } catch (InterruptedException ex) { } if (newinput) { try { result = new ArrayList<OUT>(); for(Expander<IN,OUT> expander : expanders) { Iterator<OUT>iter = expander.execute(input); while (iter.hasNext()) { result.add(iter.next()); } } } catch (Exception ex) { ex.printStackTrace(); } newinput = false; notifyListeners(); } } } public synchronized void addExpander(Expander<IN,OUT> exp) { expanders.addLast(exp); } public synchronized void setInput(IN i) { if (newinput == false) { if (!i.equals(input)) { input = i; newinput = true; } else { notifyListeners(); } } } public Iterator<OUT> getResults() { if (newinput == false) { return result.iterator(); } else { // or should we throw some exception? return null; } } public boolean isReady() {return !newinput;} }