package senseiTests.domainsTest;
import sensei.middleware.gms.*;
import sensei.middleware.domains.*;
import senseiTests.middleware.domainsTest.AddColourMessage;
import senseiTests.middleware.domainsTest.RemColourMessage;
import senseiTests.middleware.domainsTest.ColourPhaseCoordination;
import senseiTests.middleware.domainsTest.ColourState;
import senseiTests.middleware.domainsTest.Factory;
class ColoursSubgroupStateHandler extends StateHandlerBaseImpl implements ColoursSubgroup
{
public ColoursSubgroupStateHandler(DomainGroupHandler groupHandler, ColoursSubgroupUser user,
Factory factory, StateTransferAnswerer answerer) throws Exception
{
this.user=user;
this.answerer=answerer;
this.factory=factory;
state=new StateKeeper();
this.groupHandler=groupHandler;
}
public void setIdentity(int identity)
{
id=identity;
}
public void setState(String substates[])
{
state.setState(substates);
user.changedState(id, state.toString());
}
public String getAColour()
{
return state.generateRandomSubState();
}
public void addColour(String colour) throws Exception
{
groupHandler.syncCastDomainMessage(factory.createAddColourMessage(id,colour), true);
}
public void remColour() throws Exception
{
groupHandler.syncCastDomainMessage(factory.createRemColourMessage(id), true);
}
public int getId()
{
return id;
}
public String getColour(int pos)
{
return state.getSubState(pos);
}
public void regenerateState()
{
state.generateRandomState();
user.changedState(id, state.toString());
}
public void assumeState()
{
state.generateRandomState();
answerer.onAssumeState(this);
user.changedState(id, state.toString());
}
public void syncTransfer(int coordinator, PhaseCoordinationHolder p)
{
ColourPhaseCoordination phase = (ColourPhaseCoordination) (p.value);
int number = phase==null? 0 : phase.nextPhase;
PhaseAnswer answer = answerer.onSyncTranfer(this, coordinator, number);
if (phase==null)
p.value=factory.createCoordinationPhase(answer.phase,answer.phase,0,answer.finished);
else
{
phase=factory.createCoordinationPhase(phase.phase, phase.nextPhase, phase.numPhases, phase.transferFinished);
answer.convert(phase);
p.value=phase;
}
}
public void interruptTransfer(PhaseCoordinationHolder p)
{
ColourPhaseCoordination phaseC = (ColourPhaseCoordination) (p.value);
ColourPhaseCoordination phase=
factory.createCoordinationPhase(phaseC.phase, phaseC.nextPhase, phaseC.numPhases, phaseC.transferFinished);
answerer.onInterruptTransfer(this, phase.nextPhase).convert(phase);
p.value=phase;
}
public void continueTransfer(int[] joining_members, PhaseCoordinationHolder coordPhase, PhaseCoordination joining)
{
ColourPhaseCoordination phaseC = (ColourPhaseCoordination) (coordPhase.value);
ColourPhaseCoordination phase=
factory.createCoordinationPhase(phaseC.phase, phaseC.nextPhase, phaseC.numPhases, phaseC.transferFinished);
answerer.onContinueTransfer(this, joining_members[0], phase.nextPhase,
((ColourPhaseCoordination)joining).nextPhase, state.getNumberOfSubStates()).convert(phase);
coordPhase.value=phase;
}
public void startTransfer(int[] joining_members, PhaseCoordinationHolder p)
{
ColourPhaseCoordination phaseC = (ColourPhaseCoordination) (p.value);
ColourPhaseCoordination phase=
factory.createCoordinationPhase(phaseC.phase, phaseC.nextPhase, phaseC.numPhases, phaseC.transferFinished);
answerer.onStartTransfer(this, joining_members[0], phase.nextPhase, state.getNumberOfSubStates()).convert(phase);
p.value=phase;
}
public State getState(PhaseCoordinationHolder p)
{
ColourPhaseCoordination phaseC = (ColourPhaseCoordination) (p.value);
ColourPhaseCoordination phase=
factory.createCoordinationPhase(phaseC.phase, phaseC.nextPhase, phaseC.numPhases, phaseC.transferFinished);
int states=state.getNumberOfSubStates();
PhaseAnswer answer = answerer.onGetState(this, phase.nextPhase, states);
answer.convert(phase, states, true);
p.value=phase;
return factory.createState(state.getSubState(answer.phase));
}
public void setState(State s, PhaseCoordination p)
{
ColourPhaseCoordination phase = (ColourPhaseCoordination) p;
ColourState state = (ColourState)s;
this.state.setSubState(state.chain, phase.phase, phase.numPhases);
user.changedState(id, this.state.toString());
answerer.onSetState(this, state.chain, phase.phase);
}
public void stopTransfer(int[] joining_members, boolean transferFinished)
{
if (transferFinished && !state.isValidatedState())
state.validateState();
answerer.onStopTransfer(this, joining_members[0], transferFinished);
}
public void processPTPMessage(int sender, Message msg)
{
System.out.println("processPTPMessage");
}
public void processCastMessage(int sender, Message msg)
{
boolean ok;
if (msg instanceof AddColourMessage)
{
AddColourMessage message = (AddColourMessage) msg;
state.addSubState(message.colour);
ok=true;
}
else if (msg instanceof RemColourMessage)
ok = state.removeSubState();
else
ok=false;
if (ok)
user.changedState(id, state.toString());
}
public void memberAccepted(int identity, GroupHandler handler, View theView)
{
this.groupHandler = (DomainGroupHandler) (handler);
}
public void changingView()
{
}
public void installView(View theView)
{
}
public void excludedFromGroup()
{
}
StateKeeper state;
boolean onTransfer;
int id;
DomainGroupHandler groupHandler;
ColoursSubgroupUser user;
StateTransferAnswerer answerer;
Factory factory;
};