/* Soot - a J*va Optimization Framework
* Copyright (C) 2004 Jennifer Lhotak
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
package ca.mcgill.sable.soot.interaction;
import soot.toolkits.graph.interaction.*;
import java.util.*;
public class DataKeeper {
private List flowInfoList;
private FlowInfo current;
private int total;
private int repeat;
private InteractionController controller;
public DataKeeper(InteractionController controller){
setController(controller);
}
public void stepBack(){
// this will be called from InteractionStepBack
// it will cause the most recent flow info data
// to be removed resulting in a blank if on iteration
// 0 or the results at this node from the
// previous iteration
// if it is the very fist node and
// very first iteration nothing will happen
// no where to go back to
if (getCurrent() == null) return;
int index = getFlowInfoList().indexOf(getCurrent());
FlowInfo previous;
FlowInfo clearTo;
// on first iter need to replace with empty
if (index > 0) {
previous = (FlowInfo)getFlowInfoList().get(index-1);
}
else {
// at first node and want to go back
previous = null;
}
clearTo = findLast();
setCurrent(previous);
getController().setEvent(new InteractionEvent(IInteractionConstants.CLEARTO, clearTo));
getController().handleEvent();
if (previous != null){
getController().setEvent(new InteractionEvent(IInteractionConstants.REPLACE, previous));
getController().handleEvent();
}
}
private FlowInfo findLast(){
Iterator it = getFlowInfoList().iterator();
FlowInfo retInfo = new FlowInfo("", getCurrent().unit(), getCurrent().isBefore());
while (it.hasNext()){
FlowInfo next = (FlowInfo)it.next();
if (getCurrent().equals(next)) break;
if (getCurrent().unit().equals(next.unit()) && (getCurrent().isBefore() == next.isBefore())){
retInfo = next;
}
}
return retInfo;
}
public void addFlowInfo(Object fi){
if (getFlowInfoList() == null){
setFlowInfoList(new ArrayList());
}
getFlowInfoList().add(fi);
setCurrent((FlowInfo)fi);
}
public boolean inMiddle(){
if (getFlowInfoList() == null) return false;
if (getFlowInfoList().indexOf(getCurrent()) == getFlowInfoList().size()-1) return false;
return true;
}
public boolean canGoBack(){
if (getFlowInfoList() == null) return false;
if (getFlowInfoList().size() == 0) return false;
if (getCurrent().equals(getFlowInfoList().get(0))) return false;
return true;
}
public void stepForward(){
int index = getFlowInfoList().indexOf(getCurrent());
FlowInfo next = (FlowInfo)getFlowInfoList().get(index+1);
getController().setEvent(new InteractionEvent(IInteractionConstants.REPLACE, next));
getController().handleEvent();
setCurrent(next);
}
public void stepForwardAuto(){
int index = getFlowInfoList().indexOf(getCurrent());
for (int i = index + 1; i < getFlowInfoList().size(); i++){
FlowInfo next = (FlowInfo)getFlowInfoList().get(i);
getController().setEvent(new InteractionEvent(IInteractionConstants.REPLACE, next));
getController().handleEvent();
setCurrent(next);
}
}
/**
* @return
*/
public FlowInfo getCurrent() {
return current;
}
/**
* @return
*/
public List getFlowInfoList() {
return flowInfoList;
}
/**
* @return
*/
public int getRepeat() {
return repeat;
}
/**
* @return
*/
public int getTotal() {
return total;
}
/**
* @param info
*/
public void setCurrent(FlowInfo info) {
current = info;
}
/**
* @param list
*/
public void setFlowInfoList(List list) {
flowInfoList = list;
}
/**
* @param i
*/
public void setRepeat(int i) {
repeat = i;
}
/**
* @param i
*/
public void setTotal(int i) {
total = i;
}
/**
* @return
*/
public InteractionController getController() {
return controller;
}
/**
* @param controller
*/
public void setController(InteractionController controller) {
this.controller = controller;
}
}