package senseiTests.domainsTest;
class Answerer implements StateTransferInfoPanelUser, StateTransferAnswerer
{
public Answerer(int delay)
{
answer = new PhaseAnswer();
ui=null;
current=null;
output=null;
this.delay=delay;
}
public void setListener(TransferInfoPrintable output)
{
this.output=output;
}
public synchronized void setAutomatic()
{
ui=null;
}
public synchronized void setAutomaticDelay(int newDelay)
{
delay=newDelay;
}
public synchronized int getAutomaticDelay()
{
return delay;
}
public synchronized void doDelay()
{
try{Thread.currentThread().sleep(delay);}catch(InterruptedException ex){}
}
public synchronized void setManual(StateTransferInfoPanel ui)
{
this.ui=ui;
}
/**
* called when the confirm button is pressed. Cannot be called after makeUnvisible()
*/
public synchronized void confirmed(int phase, boolean finished)
{
answer.set(phase,finished);
notifyAll();
ui.makeUnvisible();
}
/**
* Informs that the phase has changed. The associated substring should be returned, or null if it's not valid
* or displayable
*/
public String phaseChanged(int phase)
{
return current==null? null : current.getColour(phase);
}
public void onAssumeState(ColoursSubgroup subgroup)
{
if (output!=null)
output.showAssumeState(subgroup.getId());
}
//shows the current sync_transfer process, requesting the new phase coordination
public synchronized PhaseAnswer onSyncTranfer(ColoursSubgroup subgroup, int coordinator, int phase)
{
current=subgroup;
if (output!=null)
output.showSyncTransferFields(subgroup.getId(), coordinator, phase, phase, false);
if (ui==null)
{
answer.set(phase,false);
doDelay();
}
else
{
ui.showSyncTransferFields(subgroup.getId(), coordinator, phase, phase, false);
try{wait();}catch(InterruptedException ex){}
}
current=null;
return answer;
}
//shows the current interrupt_transfer process, requesting the new phase coordination
public synchronized PhaseAnswer onInterruptTransfer(ColoursSubgroup subgroup, int phase)
{
current=subgroup;
if (output!=null)
output.showInterruptTransferFields(subgroup.getId(), phase, MAX_NUM_PHASES, phase, false);
if (ui==null)
{
answer.set(phase,false);
doDelay();
}
else
{
ui.showInterruptTransferFields(subgroup.getId(), phase, MAX_NUM_PHASES, phase, false);
try{wait();}catch(InterruptedException ex){}
}
current=null;
return answer;
}
//shows the current continue_transfer process, requesting the new phase coordination
public synchronized PhaseAnswer onContinueTransfer(ColoursSubgroup subgroup, int joiningMember, int phase, int joiningPhase, int maxPhases)
{
current=subgroup;
if (output!=null)
output.showContinueTransferFields(subgroup.getId(), joiningMember, phase, maxPhases, joiningPhase, phase, maxPhases==0);
if (ui==null)
{
answer.set(0,maxPhases==0);
doDelay();
}
else
{
ui.showContinueTransferFields(subgroup.getId(), joiningMember, phase, maxPhases, joiningPhase, phase, maxPhases==0);
try{wait();}catch(InterruptedException ex){}
}
current=null;
return answer;
}
//shows the current start_transfer process, requesting the new phase coordination
public synchronized PhaseAnswer onStartTransfer(ColoursSubgroup subgroup, int joiningMember, int phase, int maxPhases)
{
current=subgroup;
if (output!=null)
output.showStartTransferFields(subgroup.getId(), joiningMember, phase, maxPhases, phase, maxPhases==0);
if (ui==null)
{
answer.set(0,maxPhases==0);
doDelay();
}
else
{
ui.showStartTransferFields(subgroup.getId(), joiningMember, phase, maxPhases, phase, maxPhases==0);
try{wait();}catch(InterruptedException ex){}
}
current=null;
return answer;
}
//shows the current get_state process, requesting the new phase coordination and the state
public synchronized PhaseAnswer onGetState(ColoursSubgroup subgroup, int phase, int maxPhases)
{
current=subgroup;
boolean finished=(phase+1)>=maxPhases;
if (output!=null)
output.showGetStateFields(subgroup.getId(), phase, maxPhases, phase, finished);
if (ui==null)
{
answer.set(phase,finished);
doDelay();
}
else
{
ui.showGetStateFields(subgroup.getId(), phase, maxPhases, phase, finished);
try{wait();}catch(InterruptedException ex){}
}
current=null;
return answer;
}
//shows the current set_state process
public synchronized void onSetState(ColoursSubgroup subgroup, String subState, int phase)
{
current=subgroup;
if (output!=null)
output.showSetStateFields(subgroup.getId(), subState, phase);
if (ui==null)
doDelay();
else
{
ui.showSetStateFields(subgroup.getId(), subState, phase);
try{wait();}catch(InterruptedException ex){}
}
current=null;
}
//shows the current stop_transfer process
public synchronized void onStopTransfer(ColoursSubgroup subgroup, int joiningMember, boolean transferFinished)
{
current=subgroup;
if (output!=null)
output.showStopTransferFields(subgroup.getId(), joiningMember, transferFinished);
if (ui==null)
doDelay();
else
{
ui.showStopTransferFields(subgroup.getId(), joiningMember, transferFinished);
try{wait();}catch(InterruptedException ex){}
}
current=null;
}
//shows the current get_state process, on a one-step process
public synchronized void onGetState(ColoursSubgroup subgroup)
{
current=subgroup;
if (output!=null)
output.showGetStateFields(subgroup.getId());
if (ui==null)
{
doDelay();
}
else
{
ui.showGetStateFields(subgroup.getId());
try{wait();}catch(InterruptedException ex){}
}
current=null;
}
//shows the current set_state process, on a one-step process
public synchronized void onSetState(ColoursSubgroup subgroup, String subState)
{
current=subgroup;
if (output!=null)
output.showSetStateFields(subgroup.getId(), subState);
if (ui==null)
doDelay();
else
{
ui.showSetStateFields(subgroup.getId(), subState);
try{wait();}catch(InterruptedException ex){}
}
current=null;
}
int delay;
PhaseAnswer answer;
StateTransferInfoPanel ui;
ColoursSubgroup current;
TransferInfoPrintable output;
}