use of com.github.dedis.popstellar.model.objects.Election in project popstellar by dedis.
the class ElectionHandler method handleElectionSetup.
/**
* Process an ElectionSetup message.
*
* @param context the HandlerContext of the message
* @param electionSetup the message that was received
*/
public static void handleElectionSetup(HandlerContext context, ElectionSetup electionSetup) {
LAORepository laoRepository = context.getLaoRepository();
Channel channel = context.getChannel();
MessageID messageId = context.getMessageId();
if (channel.isLaoChannel()) {
Lao lao = laoRepository.getLaoByChannel(channel);
Log.d(TAG, "handleElectionSetup: channel " + channel + " name " + electionSetup.getName());
Election election = new Election(lao.getId(), electionSetup.getCreation(), electionSetup.getName());
election.setChannel(channel.subChannel(election.getId()));
election.setElectionQuestions(electionSetup.getQuestions());
election.setStart(electionSetup.getStartTime());
election.setEnd(electionSetup.getEndTime());
election.setEventState(OPENED);
// Once the election is created, we subscribe to the election channel
context.getMessageSender().subscribe(election.getChannel()).subscribe();
Log.d(TAG, "election id " + election.getId());
lao.updateElection(election.getId(), election);
lao.updateWitnessMessage(messageId, electionSetupWitnessMessage(messageId, election));
}
}
use of com.github.dedis.popstellar.model.objects.Election in project popstellar by dedis.
the class ElectionHandler method handleCastVote.
/**
* Process a CastVote message.
*
* @param context the HandlerContext of the message
* @param castVote the message that was received
*/
public static void handleCastVote(HandlerContext context, CastVote castVote) {
LAORepository laoRepository = context.getLaoRepository();
Channel channel = context.getChannel();
MessageID messageId = context.getMessageId();
PublicKey senderPk = context.getSenderPk();
Log.d(TAG, "handleCastVote: channel " + channel);
Lao lao = laoRepository.getLaoByChannel(channel);
Election election = laoRepository.getElectionByChannel(channel);
// Verify the vote was created before the end of the election or the election is not closed yet
if (election.getEndTimestamp() >= castVote.getCreation() || election.getState() != CLOSED) {
// Retrieve previous cast vote message stored for the given sender
Optional<MessageID> previousMessageIdOption = election.getMessageMap().entrySet().stream().filter(entry -> senderPk.equals(entry.getValue())).map(Map.Entry::getKey).findFirst();
// Retrieve the creation time of the previous cast vote, if doesn't exist replace with min
// value
long previousMessageCreation = previousMessageIdOption.map(s -> laoRepository.getMessageById().get(s)).map(MessageGeneral::getData).map(CastVote.class::cast).map(CastVote::getCreation).orElse(Long.MIN_VALUE);
// Verify the current cast vote message is the last one received
if (previousMessageCreation <= castVote.getCreation()) {
election.putVotesBySender(senderPk, castVote.getVotes());
election.putSenderByMessageId(senderPk, messageId);
lao.updateElection(election.getId(), election);
}
}
}
use of com.github.dedis.popstellar.model.objects.Election in project popstellar by dedis.
the class ElectionHandler method handleElectionEnd.
/**
* Process an ElectionEnd message.
*
* @param context the HandlerContext of the message
* @param electionEnd the message that was received
*/
@SuppressWarnings("unused")
public static void handleElectionEnd(HandlerContext context, ElectionEnd electionEnd) {
LAORepository laoRepository = context.getLaoRepository();
Channel channel = context.getChannel();
Log.d(TAG, "handleElectionEnd: channel " + channel);
Lao lao = laoRepository.getLaoByChannel(channel);
Election election = laoRepository.getElectionByChannel(channel);
election.setEventState(CLOSED);
lao.updateElection(election.getId(), election);
}
use of com.github.dedis.popstellar.model.objects.Election in project popstellar by dedis.
the class ElectionHandler method handleElectionResult.
/**
* Process an ElectionResult message.
*
* @param context the HandlerContext of the message
* @param electionResult the message that was received
*/
public static void handleElectionResult(HandlerContext context, ElectionResult electionResult) throws DataHandlingException {
LAORepository laoRepository = context.getLaoRepository();
Channel channel = context.getChannel();
Log.d(TAG, "handling election result");
Lao lao = laoRepository.getLaoByChannel(channel);
Election election = laoRepository.getElectionByChannel(channel);
List<ElectionResultQuestion> resultsQuestions = electionResult.getElectionQuestionResults();
Log.d(TAG, "size of resultsQuestions is " + resultsQuestions.size());
if (resultsQuestions.isEmpty())
throw new DataHandlingException(electionResult, "the questions results is empty");
election.setResults(resultsQuestions);
election.setEventState(RESULTS_READY);
lao.updateElection(election.getId(), election);
}
use of com.github.dedis.popstellar.model.objects.Election in project popstellar by dedis.
the class ElectionHandlerTest method setup.
@Before
public void setup() throws GeneralSecurityException, IOException {
lenient().when(keyManager.getMainKeyPair()).thenReturn(SENDER_KEY);
lenient().when(keyManager.getMainPublicKey()).thenReturn(SENDER);
laoRepository = new LAORepository();
when(messageSender.subscribe(any())).then(args -> Completable.complete());
laoRepository = new LAORepository();
messageHandler = new MessageHandler(DataRegistryModule.provideDataRegistry(), keyManager);
// Create one LAO
lao = new Lao(CREATE_LAO.getName(), CREATE_LAO.getOrganizer(), CREATE_LAO.getCreation());
lao.setLastModified(lao.getCreation());
// Create one Roll Call and add it to the LAO
rollCall = new RollCall(lao.getId(), Instant.now().getEpochSecond(), "roll call 1");
lao.setRollCalls(new HashMap<String, RollCall>() {
{
put(rollCall.getId(), rollCall);
}
});
// Create one Election and add it to the LAO
election = new Election(lao.getId(), Instant.now().getEpochSecond(), "election 1");
election.setStart(Instant.now().getEpochSecond());
election.setEnd(Instant.now().getEpochSecond() + 20L);
election.setChannel(lao.getChannel().subChannel(election.getId()));
electionQuestion = new ElectionQuestion("question", "Plurality", false, Arrays.asList("a", "b"), election.getId());
election.setElectionQuestions(Collections.singletonList(electionQuestion));
lao.setElections(new HashMap<String, Election>() {
{
put(election.getId(), election);
}
});
// Add the LAO to the LAORepository
laoRepository.getLaoById().put(lao.getId(), new LAOState(lao));
laoRepository.setAllLaoSubject();
// Add the CreateLao message to the LAORepository
MessageGeneral createLaoMessage = new MessageGeneral(SENDER_KEY, CREATE_LAO, GSON);
laoRepository.getMessageById().put(createLaoMessage.getMessageId(), createLaoMessage);
}
Aggregations