[virtualcommons-svn] SF.net SVN: virtualcommons:[497] foraging/trunk/src/main/java/edu/asu/ commons
Status: Beta
Brought to you by:
alllee
From: <al...@us...> - 2010-03-29 20:10:55
|
Revision: 497 http://virtualcommons.svn.sourceforge.net/virtualcommons/?rev=497&view=rev Author: alllee Date: 2010-03-29 20:10:49 +0000 (Mon, 29 Mar 2010) Log Message: ----------- - adding persistable quiz response event (slight duplication with irrigation experiments, should consider moving it up into the csidex framework) - added logic to persist enforcement ranking requests. round initialization now occurs before we block on a quiz signal or the round signal, which should allow us to persist any quiz response events, chat events, etc - added round started and ended marker events to the persistable event stream - TODO: fix EnforcementRanking and SanctionRanking logic duplication Modified Paths: -------------- foraging/trunk/src/main/java/edu/asu/commons/foraging/client/ChatPanel.java foraging/trunk/src/main/java/edu/asu/commons/foraging/client/GameWindow2D.java foraging/trunk/src/main/java/edu/asu/commons/foraging/event/RoundStartedEvent.java foraging/trunk/src/main/java/edu/asu/commons/foraging/model/GroupDataModel.java foraging/trunk/src/main/java/edu/asu/commons/foraging/model/ServerDataModel.java foraging/trunk/src/main/java/edu/asu/commons/foraging/server/ForagingServer.java foraging/trunk/src/main/java/edu/asu/commons/foraging/util/ForagingSaveFileConverter.java Added Paths: ----------- foraging/trunk/src/main/java/edu/asu/commons/foraging/event/QuizResponseEvent.java Modified: foraging/trunk/src/main/java/edu/asu/commons/foraging/client/ChatPanel.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/client/ChatPanel.java 2010-03-29 19:20:08 UTC (rev 496) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/client/ChatPanel.java 2010-03-29 20:10:49 UTC (rev 497) @@ -59,9 +59,10 @@ this.clientId = client.getId(); client.getEventChannel().add(this, new EventTypeProcessor<ChatEvent>(ChatEvent.class) { public void handle(final ChatEvent chatEvent) { - displayMessage(getChatHandle(chatEvent.getSource()) + " -> " - // FIXME: either "all" or "you". - + getChatHandle(chatEvent.getTarget()), chatEvent.toString()); + displayMessage(getChatHandle(chatEvent.getSource()) +// FIXME: either "all" or "you". +// + " -> " + getChatHandle(chatEvent.getTarget()) + ,chatEvent.toString()); } }); } @@ -117,8 +118,9 @@ return; } client.transmit(new ChatRequest(clientId, message, targetIdentifier)); - displayMessage(getChatHandle(clientId) + " -> " - + getChatHandle(targetIdentifier), message); + displayMessage(getChatHandle(clientId) +// + " -> " + getChatHandle(targetIdentifier) + , message); chatField.requestFocusInWindow(); chatField.setText(""); } Modified: foraging/trunk/src/main/java/edu/asu/commons/foraging/client/GameWindow2D.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/client/GameWindow2D.java 2010-03-29 19:20:08 UTC (rev 496) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/client/GameWindow2D.java 2010-03-29 20:10:49 UTC (rev 497) @@ -18,9 +18,9 @@ import java.awt.event.MouseEvent; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Iterator; -import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Properties; @@ -52,6 +52,7 @@ import edu.asu.commons.foraging.event.EnforcementRankingRequest; import edu.asu.commons.foraging.event.PostRoundSanctionUpdateEvent; import edu.asu.commons.foraging.event.QuizCompletedEvent; +import edu.asu.commons.foraging.event.QuizResponseEvent; import edu.asu.commons.foraging.event.RealTimeSanctionRequest; import edu.asu.commons.foraging.event.ResetTokenDistributionRequest; import edu.asu.commons.foraging.event.SubmitRegulationRequest; @@ -196,8 +197,6 @@ List<String> incorrectAnswers = new ArrayList<String>(); List<String> correctAnswers = new ArrayList<String>(); - // FIXME: always send a quiz response event. - // iterate through expected answers for (Map.Entry<String, String> entry : configuration.getQuizAnswers().entrySet()) { String questionNumber = entry.getKey(); @@ -211,6 +210,9 @@ correctAnswers.add(questionNumber); } } + + client.transmit(new QuizResponseEvent(client.getId(), actualAnswers, incorrectAnswers)); + if (incorrectAnswers.isEmpty()) { // notify the server and also notify the participant. StringBuilder builder = new StringBuilder(configuration.getInstructions()); Added: foraging/trunk/src/main/java/edu/asu/commons/foraging/event/QuizResponseEvent.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/event/QuizResponseEvent.java (rev 0) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/event/QuizResponseEvent.java 2010-03-29 20:10:49 UTC (rev 497) @@ -0,0 +1,44 @@ +package edu.asu.commons.foraging.event; + +import java.util.List; +import java.util.Properties; + +import edu.asu.commons.event.AbstractPersistableEvent; +import edu.asu.commons.event.ClientRequest; +import edu.asu.commons.net.Identifier; + +/** + * $Id: QuizResponseEvent.java 461 2010-02-05 00:28:28Z alllee $ + * + * A client's quiz responses for a given quiz page. + * + * + * @author <a href='mailto:All...@as...'>Allen Lee</a> + * @version $Rev: 461 $ + */ +public class QuizResponseEvent extends AbstractPersistableEvent implements ClientRequest { + + private static final long serialVersionUID = -7081410122722056083L; + + private Properties responses; + + private List<String> incorrectAnswers; + + public QuizResponseEvent(Identifier id, Properties responses, List<String> incorrectAnswers) { + super(id); + this.responses = responses; + this.incorrectAnswers = incorrectAnswers; + } + + public Properties getResponses() { + return responses; + } + + public List<String> getIncorrectAnswers() { + return incorrectAnswers; + } + + public String toString() { + return id + " quiz page response: " + responses + "\n\t incorrect: " + incorrectAnswers; + } +} Modified: foraging/trunk/src/main/java/edu/asu/commons/foraging/event/RoundStartedEvent.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/event/RoundStartedEvent.java 2010-03-29 19:20:08 UTC (rev 496) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/event/RoundStartedEvent.java 2010-03-29 20:10:49 UTC (rev 497) @@ -17,7 +17,7 @@ * accordingly. * * - * @author <a href='al...@cs...'>Allen Lee</a> + * @author <a href='mailto:all...@as...'>Allen Lee</a> * @version $Revision$ */ public class RoundStartedEvent extends AbstractEvent implements ExperimentUpdateEvent { Modified: foraging/trunk/src/main/java/edu/asu/commons/foraging/model/GroupDataModel.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/model/GroupDataModel.java 2010-03-29 19:20:08 UTC (rev 496) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/model/GroupDataModel.java 2010-03-29 20:10:49 UTC (rev 497) @@ -79,11 +79,7 @@ public GroupDataModel(ServerDataModel serverDataModel) { this(serverDataModel, nextGroupId++); } - - public GroupDataModel(ServerDataModel serverDataModel, int groupId) { - this(serverDataModel, (long) groupId); - } - + public GroupDataModel(ServerDataModel serverDataModel, long groupId) { this.serverDataModel = serverDataModel; this.groupId = groupId; @@ -703,6 +699,10 @@ return addedResources; } + public long getGroupId() { + return groupId; + } + public String toString() { return "Group #" + groupId; } Modified: foraging/trunk/src/main/java/edu/asu/commons/foraging/model/ServerDataModel.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/model/ServerDataModel.java 2010-03-29 19:20:08 UTC (rev 496) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/model/ServerDataModel.java 2010-03-29 20:10:49 UTC (rev 497) @@ -4,7 +4,9 @@ import java.awt.Point; import java.io.IOException; import java.io.ObjectInputStream; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; @@ -238,6 +240,12 @@ groups.addAll(clientsToGroups.values()); return groups; } + + public List<GroupDataModel> getOrderedGroups() { + ArrayList<GroupDataModel> groups = new ArrayList<GroupDataModel>(clientsToGroups.values()); + Collections.sort(groups); + return groups; + } protected ClientData getClientData(Identifier id) { return getGroup(id).getClientData(id); Modified: foraging/trunk/src/main/java/edu/asu/commons/foraging/server/ForagingServer.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/server/ForagingServer.java 2010-03-29 19:20:08 UTC (rev 496) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/server/ForagingServer.java 2010-03-29 20:10:49 UTC (rev 497) @@ -3,6 +3,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -20,6 +21,8 @@ import edu.asu.commons.event.EndRoundRequest; import edu.asu.commons.event.EventTypeProcessor; import edu.asu.commons.event.FacilitatorRegistrationRequest; +import edu.asu.commons.event.RoundEndedMarkerEvent; +import edu.asu.commons.event.RoundStartedMarkerEvent; import edu.asu.commons.event.SetConfigurationEvent; import edu.asu.commons.experiment.AbstractExperiment; import edu.asu.commons.experiment.StateMachine; @@ -45,6 +48,7 @@ import edu.asu.commons.foraging.event.PostRoundSanctionRequest; import edu.asu.commons.foraging.event.PostRoundSanctionUpdateEvent; import edu.asu.commons.foraging.event.QuizCompletedEvent; +import edu.asu.commons.foraging.event.QuizResponseEvent; import edu.asu.commons.foraging.event.RealTimeSanctionRequest; import edu.asu.commons.foraging.event.RegulationRankingRequest; import edu.asu.commons.foraging.event.RegulationSubmissionUpdateEvent; @@ -270,18 +274,29 @@ } }); - // FIXME: start new implementation here. addEventProcessor(new EventTypeProcessor<EnforcementRankingRequest>(EnforcementRankingRequest.class) { public void handle(final EnforcementRankingRequest request) { - logger.info("received enforcement ranking request: " + request.getRankings()); + logger.info("received enforcement ranking request: " + Arrays.asList(request.getRankings())); GroupDataModel group = serverDataModel.getGroup(request.getId()); group.submitEnforcementRanking(request); if (group.hasReceivedAllEnforcementRankings()) { sendEnforcementUpdate(group); } + // FIXME: this is duplicated. + group.submitSanctionRanking(request); + if (group.hasReceivedAllSanctionRankings()) { + sendSanctionRankingUpdate(group); + } } }); + addEventProcessor(new EventTypeProcessor<QuizResponseEvent>(QuizResponseEvent.class) { + public void handle(final QuizResponseEvent event) { + // XXX: can get rid of this event processor once we verify that the persister is storing it properly + logger.info("Received quiz response: " + event); + } + }); + addEventProcessor(new EventTypeProcessor<RegulationRankingRequest>(RegulationRankingRequest.class) { public void handle(final RegulationRankingRequest request) { GroupDataModel group = serverDataModel.getGroup(request.getId()); @@ -292,16 +307,6 @@ } }); - addEventProcessor(new EventTypeProcessor<EnforcementRankingRequest>(EnforcementRankingRequest.class) { - public void handle(final EnforcementRankingRequest request) { - GroupDataModel group = serverDataModel.getGroup(request.getId()); - group.submitSanctionRanking(request); - if (group.hasReceivedAllSanctionRankings()) { - sendSanctionRankingUpdate(group); - } - } - }); - addEventProcessor(new EventTypeProcessor<SubmitRegulationRequest>(SubmitRegulationRequest.class) { public void handle(final SubmitRegulationRequest request) { GroupDataModel group = serverDataModel.getGroup(request.getId()); @@ -656,6 +661,7 @@ } } }); + // FIXME: what is the point of this? addEventProcessor(new EventTypeProcessor<TreatmentTypeRequest>(TreatmentTypeRequest.class) { public void handle(TreatmentTypeRequest event) { // FIXME: assign groups? @@ -771,16 +777,17 @@ Utils.sleep(SERVER_SLEEP_INTERVAL); break; case WAITING: - getLogger().info("Waiting for facilitator signal to start next round."); + // initialize the round so that + // the persister is set up for this next round. + initializeRound(); + getLogger().info("Round is initialized: now waiting for facilitator signal to start next round."); if (getCurrentRoundConfiguration().isQuizEnabled()) { getLogger().info("Waiting for all quizzes to be submitted."); Utils.waitOn(quizSignal); } - // new code - System.out.println("Going to send the RoundStarted Event"); + // then wait for the signal from the facilitator to actually start the round (a chat session might occur or a voting session). Utils.waitOn(roundSignal); - // initialize the start of a new round. - initializeRound(); + // actually start the round once we receive the facilitator signal. startRound(); break; default: @@ -866,6 +873,7 @@ private void stopRound() { serverState = ServerState.WAITING; + persister.store(new RoundEndedMarkerEvent()); sendEndRoundEvents(); if (getCurrentRoundConfiguration().isPostRoundSanctioningEnabled()) { // stop most of the round but don't persist/cleanup yet. @@ -978,7 +986,6 @@ // set up the resource dispenser, generates the initial resource distributions for the // groups, must be done after creating the client group relationships. resourceDispenser.initialize(); - } private void startRound() { @@ -990,7 +997,7 @@ System.out.println("Sending the round started event"); transmit(new RoundStartedEvent(id, data.getGroupDataModel())); } - + persister.store(new RoundStartedMarkerEvent()); // start timers currentRoundDuration = roundConfiguration.getRoundDuration(); if (roundConfiguration.isVotingAndRegulationEnabled()) { Modified: foraging/trunk/src/main/java/edu/asu/commons/foraging/util/ForagingSaveFileConverter.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/util/ForagingSaveFileConverter.java 2010-03-29 19:20:08 UTC (rev 496) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/util/ForagingSaveFileConverter.java 2010-03-29 20:10:49 UTC (rev 497) @@ -254,7 +254,8 @@ Map<Identifier, ClientSpatialDistribution> clientSpatialDistributionMap) { ArrayList<GroupDataModel> groups = new ArrayList<GroupDataModel>(serverDataModel.getGroups()); for (GroupDataModel group: groups) { - String groupLabel = "Group #" + groups.indexOf(group); +// String groupLabel = "Group #" + groups.indexOf(group); + String groupLabel = group.toString(); writer.println("Identifier, Group, # tokens, row stdev, column stdev"); double groupWeightedSpatialMetric = 0.0d; int totalTokens = 0; @@ -314,7 +315,8 @@ Map<Identifier, ClientSpatialDistribution> clientSpatialDistributionMap) { ArrayList<GroupDataModel> groups = new ArrayList<GroupDataModel>(serverDataModel.getGroups()); for (GroupDataModel group: groups) { - String groupLabel = "Group # " + groups.indexOf(group); +// String groupLabel = "Group # " + groups.indexOf(group); + String groupLabel = group.toString(); writer.println("Time, Identifier, Group, # tokens, row stdev, column stdev"); double groupWeightedSpatialMetric = 0.0d; int totalTokens = 0; @@ -409,7 +411,7 @@ } writer.println( String.format("%s, %s, %s, %s", - "Group #" + groups.indexOf(group), + group, Utils.join(',', clientTokens), group.getResourceDistributionSize(), totalConsumedGroupTokens, @@ -447,7 +449,7 @@ for (GroupDataModel group: groups) { SortedSet<ChatRequest> chatRequests = chatRequestMap.get(group); if (chatRequests != null) { - writer.println("Group #" + groups.indexOf(group)); + writer.println(group.toString()); for (ChatRequest request: chatRequests) { writer.println(String.format("%s: %s (%s)", request.getSource(), request.toString(), (request.getCreationTime() - first.getCreationTime())/1000L)); } @@ -498,7 +500,7 @@ String line = String.format("%s, %s, %d, %d, %s, %s", savedRoundData.toSecondString(event), clientData.getId(), - groups.indexOf(group), + group.getGroupId(), client.moves, movementEvent.getDirection(), "movement event" @@ -517,7 +519,7 @@ clientData.getId(), location.x, location.y, - groups.indexOf(group), + group.getGroupId(), client.tokens, "token collected event"); writer.println(line); @@ -734,6 +736,7 @@ String groupNumber = "Group-" + groupIndex; // tokenProbabilityGroupNumberHeader.add(groupNumber + " avg token P"); // tokensLeftGroupNumberHeader.add(groupNumber + " tokens left"); + List<Identifier> ids = new ArrayList<Identifier>(groups.get(groupIndex).getOrderedClientIdentifiers()); for (int i = 0; i < ids.size(); i++) { Identifier id = ids.get(i); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |