[virtualcommons-svn] commit/irrigation: 5 new changesets
Status: Beta
Brought to you by:
alllee
From: Bitbucket <com...@bi...> - 2012-02-24 00:17:32
|
5 new commits in irrigation: https://bitbucket.org/virtualcommons/irrigation/changeset/75afdb421872/ changeset: 75afdb421872 user: alllee date: 2012-02-24 01:14:12 summary: adding facilitator debriefing template and helper methods to RoundConfiguration / ServerConfiguration affected #: 2 files diff -r 3cc04bd7027cd7c764542f1228500c17fd3fb2ff -r 75afdb421872e317a55e3836973423a04fd98fcc src/main/java/edu/asu/commons/irrigation/conf/RoundConfiguration.java --- a/src/main/java/edu/asu/commons/irrigation/conf/RoundConfiguration.java +++ b/src/main/java/edu/asu/commons/irrigation/conf/RoundConfiguration.java @@ -7,6 +7,7 @@ import edu.asu.commons.conf.ExperimentRoundParameters; import edu.asu.commons.irrigation.client.ClientDataModel; import edu.asu.commons.irrigation.model.ClientData; +import edu.asu.commons.irrigation.model.ServerDataModel; import edu.asu.commons.util.Duration; /** @@ -177,7 +178,7 @@ private void populateClientEarnings(ClientData data, ServerConfiguration serverConfiguration, NumberFormat currencyFormatter) { data.setGrandTotalIncome(currencyFormatter.format(serverConfiguration.getTotalIncome(data))); - data.setTotalDollarsEarnedThisRound(currencyFormatter.format(serverConfiguration.getTotalTokenEarnings(data))); + data.setTotalDollarsEarnedThisRound(currencyFormatter.format(serverConfiguration.getTokenEarningsThisRound(data))); data.setQuizEarnings(currencyFormatter.format(serverConfiguration.getQuizEarnings(data))); } @@ -240,4 +241,15 @@ return template.render(); } + public String generateFacilitatorDebriefing(ServerDataModel serverDataModel) { + ST template = createStringTemplate(getProperty("facilitator-debriefing")); + ServerConfiguration serverConfiguration = getParentConfiguration(); + NumberFormat formatter = NumberFormat.getCurrencyInstance(); + for (ClientData data: serverDataModel.getClientDataMap().values()) { + populateClientEarnings(data, serverConfiguration, formatter); + } + template.add("clientDataList", serverDataModel.getClientDataMap().values()); + return template.render(); + } + } diff -r 3cc04bd7027cd7c764542f1228500c17fd3fb2ff -r 75afdb421872e317a55e3836973423a04fd98fcc src/main/java/edu/asu/commons/irrigation/conf/ServerConfiguration.java --- a/src/main/java/edu/asu/commons/irrigation/conf/ServerConfiguration.java +++ b/src/main/java/edu/asu/commons/irrigation/conf/ServerConfiguration.java @@ -61,9 +61,7 @@ private final static String[] PRIORITY_STRINGS = { "A", "B", "C", "D", "E" }; - - - public String toPriorityString(int clientPriority) { + public static String toPriorityString(int clientPriority) { // bounds check if (clientPriority >= 0 && clientPriority < PRIORITY_STRINGS.length) { return PRIORITY_STRINGS[clientPriority]; @@ -110,6 +108,10 @@ return data.getTotalTokens() * getDollarsPerToken(); } + public double getTokenEarningsThisRound(ClientData data) { + return data.getAllTokensEarnedThisRound() * getDollarsPerToken(); + } + public double getQuizEarnings(ClientData data) { return data.getCorrectQuizAnswers() * getQuizCorrectAnswerReward(); } https://bitbucket.org/virtualcommons/irrigation/changeset/c3138ee991dc/ changeset: c3138ee991dc user: alllee date: 2012-02-24 01:14:44 summary: replacing getPriorityString() implementation with ServerConfiguration static method and adding toString() affected #: 1 file diff -r 75afdb421872e317a55e3836973423a04fd98fcc -r c3138ee991dc6dce71deaccce2833f8d642b45e7 src/main/java/edu/asu/commons/irrigation/model/ClientData.java --- a/src/main/java/edu/asu/commons/irrigation/model/ClientData.java +++ b/src/main/java/edu/asu/commons/irrigation/model/ClientData.java @@ -79,16 +79,8 @@ return getAssignedNumber() - 1; } - // FIXME: logic duplicated with ServerConfiguration.toPriorityString(int priority); - private final static String[] PRIORITY_STRINGS = { "A", "B", "C", "D", "E" }; - public String getPriorityString() { - // bounds check - int priority = getPriority(); - if (priority >= 0 && priority < PRIORITY_STRINGS.length) { - return PRIORITY_STRINGS[priority]; - } - return "Position not found"; + return ServerConfiguration.toPriorityString(getPriority()); } public void openGate(){ @@ -262,6 +254,11 @@ public int compareTo(ClientData o) { return Integer.valueOf(assignedNumber).compareTo(o.assignedNumber); } + + @Override + public String toString() { + return String.format("%s Position %s", id, getPriorityString()); + } } https://bitbucket.org/virtualcommons/irrigation/changeset/d7a67c00d0bb/ changeset: d7a67c00d0bb user: alllee date: 2012-02-24 01:15:43 summary: cleaning up canal rendering a bit, avoiding range errors when < 5 clients are present in a group. affected #: 1 file diff -r c3138ee991dc6dce71deaccce2833f8d642b45e7 -r d7a67c00d0bb57083f1dc66356a9da9901e55b25 src/main/java/edu/asu/commons/irrigation/client/CanalPanel.java --- a/src/main/java/edu/asu/commons/irrigation/client/CanalPanel.java +++ b/src/main/java/edu/asu/commons/irrigation/client/CanalPanel.java @@ -49,7 +49,7 @@ private int reservoirWidth = 100; - private double canalHeightMultiplier = 1.2d; + private double canalHeightMultiplier = 0.8d; private int gateBuffer = 20; @@ -99,23 +99,21 @@ graphics2D.setColor(Color.BLUE); graphics2D.fillRect(0, 0, reservoirHeight, reservoirWidth); - // draws the canal leading up to the gates - for (int i = 0; i < NUMBER_OF_GATES - 1; i++) { - ClientData clientData = sortedClientDataList.get(i); + for (ClientData clientData : sortedClientDataList) { + int priority = clientData.getPriority(); + Gate gate = gates[priority]; + // draw the irrigation canal if (clientDataModel.getClientData().isDownstreamAndOutOfRange(clientData)) { graphics2D.setColor(Color.WHITE); - graphics2D.fillRect(gates[i].getX(), gates[i].getY(), - gates[i].getWidth(), gates[i].getHeight()); + graphics2D.fillRect(gate.getX(), gate.getY(), + gate.getWidth(), gate.getHeight()); } else { graphics2D.setColor(Color.BLUE); - graphics2D.fillRect(gates[i].getX(), gates[i].getY(), - gates[i].getWidth(), gates[i].getHeight()); + graphics2D.fillRect(gate.getX(), gate.getY(), + gate.getWidth(), gate.getHeight()); } - } - for (ClientData clientData : sortedClientDataList) { - int priority = clientData.getPriority(); - Gate gate = gates[priority]; + // draw the irrigation gate inlets if (clientDataModel.getClientData().isImmediateNeighbor(clientData)) { graphics2D.setColor(Color.BLUE); graphics2D.fillRect(gate.getOpeningsX(), gate.getOpeningsY(), https://bitbucket.org/virtualcommons/irrigation/changeset/cb612fe975b9/ changeset: cb612fe975b9 user: alllee date: 2012-02-24 01:16:37 summary: adding facilitator message event support affected #: 2 files diff -r d7a67c00d0bb57083f1dc66356a9da9901e55b25 -r cb612fe975b97f64190351dddcbfffda6d6f178c src/main/java/edu/asu/commons/irrigation/facilitator/Facilitator.java --- a/src/main/java/edu/asu/commons/irrigation/facilitator/Facilitator.java +++ b/src/main/java/edu/asu/commons/irrigation/facilitator/Facilitator.java @@ -1,7 +1,5 @@ package edu.asu.commons.irrigation.facilitator; -import java.awt.Dimension; - import javax.swing.JFrame; import javax.swing.SwingUtilities; @@ -9,12 +7,14 @@ import edu.asu.commons.event.BeginRoundRequest; import edu.asu.commons.event.EndRoundRequest; import edu.asu.commons.event.EventTypeProcessor; +import edu.asu.commons.event.FacilitatorMessageEvent; import edu.asu.commons.facilitator.BaseFacilitator; import edu.asu.commons.irrigation.conf.RoundConfiguration; import edu.asu.commons.irrigation.conf.ServerConfiguration; import edu.asu.commons.irrigation.events.FacilitatorEndRoundEvent; import edu.asu.commons.irrigation.events.RegistrationEvent; import edu.asu.commons.irrigation.model.ServerDataModel; +import edu.asu.commons.ui.UserInterfaceUtils; /** * $Id$ @@ -38,16 +38,24 @@ private void initializeEventProcessors() { addEventProcessor(new EventTypeProcessor<RegistrationEvent>(RegistrationEvent.class) { + @Override public void handle(RegistrationEvent registrationEvent) { facilitatorWindow.addInstructions(registrationEvent.getRoundConfiguration().getInstructions()); } }); addEventProcessor(new EventTypeProcessor<FacilitatorEndRoundEvent>(FacilitatorEndRoundEvent.class) { + @Override public void handle(FacilitatorEndRoundEvent event) { facilitatorWindow.endRound(event); getServerConfiguration().nextRound(); } }); + addEventProcessor(new EventTypeProcessor<FacilitatorMessageEvent>(FacilitatorMessageEvent.class) { + @Override + public void handle(FacilitatorMessageEvent event) { + facilitatorWindow.addMessage(event.toString()); + } + }); } void initialize() { @@ -59,18 +67,13 @@ public static void main(String[] args) { Runnable createGuiRunnable = new Runnable() { public void run() { - Dimension dimension = new Dimension(800, 600); Facilitator facilitator = new Facilitator(); facilitator.initialize(); facilitator.connect(); JFrame frame = new JFrame(); frame.setTitle("Facilitator window: " + facilitator.getId()); - frame.setPreferredSize(dimension); - - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.getContentPane().add(facilitator.getFacilitatorWindow()); - frame.pack(); - frame.setVisible(true); + frame.add(facilitator.getFacilitatorWindow()); + UserInterfaceUtils.maximize(frame); } }; SwingUtilities.invokeLater(createGuiRunnable); diff -r d7a67c00d0bb57083f1dc66356a9da9901e55b25 -r cb612fe975b97f64190351dddcbfffda6d6f178c src/main/java/edu/asu/commons/irrigation/server/IrrigationServer.java --- a/src/main/java/edu/asu/commons/irrigation/server/IrrigationServer.java +++ b/src/main/java/edu/asu/commons/irrigation/server/IrrigationServer.java @@ -112,16 +112,23 @@ @Override public void handle(BeginRoundRequest event) { if (! event.getId().equals(getFacilitatorId())) { - getLogger().warning( - String.format("facilitator is [%s] but received begin round request from non-facilitator [%s]", getFacilitatorId(), event.getId())); + sendFacilitatorMessage( + String.format("facilitator is [%s] but received begin round request from non-facilitator [%s]", + getFacilitatorId(), event.getId())); return; } // ignore the request if not every group has submit their tokens. if (isTokenInvestmentComplete()) { + sendFacilitatorMessage("Starting round."); synchronized (roundSignal) { roundSignal.notifyAll(); } } + else { + sendFacilitatorMessage( + String.format("Cannot start round, %d of %d clients have submitted token investments", + submittedClients, clients.size())); + } } }); addEventProcessor(new EventTypeProcessor<EndRoundRequest>(EndRoundRequest.class) { @@ -176,12 +183,9 @@ @Override public void handle(SocketIdentifierUpdateRequest request) { SocketIdentifier socketId = request.getSocketIdentifier(); - //getLogger().info("socket id from client: " + socketId); - //getLogger().info("station number from client: " + socketId.getStationNumber()); - //getLogger().info("station number from event: " + request.getStationNumber()); ClientData clientData = clients.get(socketId); if (clientData == null) { - getLogger().warning("No client data available for socket: " + socketId); + sendFacilitatorMessage("No client data available for socket: " + socketId); return; } SocketIdentifier clientSocketId = (SocketIdentifier) clientData.getId(); @@ -191,7 +195,7 @@ addEventProcessor(new EventTypeProcessor<ConnectionEvent>(ConnectionEvent.class) { @Override public void handle(ConnectionEvent event) { - getLogger().info("incoming connection: " + event); + sendFacilitatorMessage("incoming connection: " + event); // handle incoming connections Identifier identifier = event.getId(); ClientData clientData = new ClientData(identifier); @@ -205,7 +209,7 @@ addEventProcessor(new EventTypeProcessor<DisconnectionRequest>(DisconnectionRequest.class) { @Override public void handle(DisconnectionRequest request) { - getLogger().warning("irrigation server handling disconnection request: " + request); + sendFacilitatorMessage("irrigation server handling disconnection request: " + request); Identifier disconnectedClientId = request.getId(); if (disconnectedClientId.equals(getFacilitatorId())) { getLogger().warning("Disconnecting facilitator."); @@ -226,7 +230,7 @@ ClientData sendingClient = clients.get(source); if (Identifier.ALL.equals(target)) { // relay to all clients in this client's group. - sendFacilitatorMessage(String.format("%s sending [ %s ] to all group participants", request.getSource(), request)); + sendFacilitatorMessage(String.format("%s -> ALL: [ %s ]", request.getSource(), request)); boolean restrictedVisibility = getRoundConfiguration().isRestrictedVisibility(); for (ClientData clientData: clients.get(source).getGroupDataModel().getClientDataMap().values()) { Identifier targetId = clientData.getId(); @@ -234,7 +238,7 @@ continue; } if (restrictedVisibility && ! sendingClient.isImmediateNeighbor(clientData)) { - sendFacilitatorMessage(String.format("%s out of range of %s, not sending message [%s]", clientData, sendingClient, request.getMessage())); + sendFacilitatorMessage(String.format("%s was out of range of %s, not sending message [%s]", clientData, sendingClient, request.getMessage())); continue; } ChatEvent chatEvent = new ChatEvent(targetId, request.getMessage(), source, true); @@ -242,7 +246,7 @@ } } else { - getLogger().info(String.format("%s sending [%s] to target [%s]", request.getSource(), request, request.getTarget())); + sendFacilitatorMessage(String.format("%s->%s: [%s]", request.getSource(), request.getTarget(), request.toString())); ChatEvent chatEvent = new ChatEvent(request.getTarget(), request.getMessage(), request.getSource()); transmit(chatEvent); } @@ -253,7 +257,7 @@ @Override public void handle(InvestedTokensEvent event) { if (isTokenInvestmentComplete()) { - getLogger().severe("Trying to invest more tokens but token investment is already complete:" + event); + sendFacilitatorMessage("Trying to invest more tokens but token investment is already complete:" + event); return; } clients.get(event.getId()).setInvestedTokens(event.getInvestedTokens()); @@ -262,6 +266,7 @@ // everyone's submitted their tokens so we can calculate the available bandwidth and // notify each client initializeInfrastructureEfficiency(); + sendFacilitatorMessage("Token investment is complete, ready to start the round."); } } }); https://bitbucket.org/virtualcommons/irrigation/changeset/84f2fd3f32f8/ changeset: 84f2fd3f32f8 user: alllee date: 2012-02-24 01:17:18 summary: replacing facilitator debriefing with StringTemplate affected #: 3 files diff -r cb612fe975b97f64190351dddcbfffda6d6f178c -r 84f2fd3f32f88e70e3bd87b0285f7fb32ef55f9d src/main/java/edu/asu/commons/irrigation/facilitator/FacilitatorWindow.java --- a/src/main/java/edu/asu/commons/irrigation/facilitator/FacilitatorWindow.java +++ b/src/main/java/edu/asu/commons/irrigation/facilitator/FacilitatorWindow.java @@ -4,9 +4,6 @@ import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.HashMap; -import java.util.Map; -import java.util.TreeSet; import javax.swing.BoxLayout; import javax.swing.JButton; @@ -22,10 +19,7 @@ import edu.asu.commons.irrigation.events.FacilitatorEndRoundEvent; import edu.asu.commons.irrigation.events.ShowGameScreenshotRequest; import edu.asu.commons.irrigation.events.ShowQuizRequest; -import edu.asu.commons.irrigation.model.ClientData; -import edu.asu.commons.irrigation.model.GroupDataModel; import edu.asu.commons.irrigation.model.ServerDataModel; -import edu.asu.commons.net.Identifier; import edu.asu.commons.ui.HtmlEditorPane; import edu.asu.commons.ui.UserInterfaceUtils; @@ -215,33 +209,9 @@ * @return */ public void endRound(FacilitatorEndRoundEvent event) { - builder = new StringBuilder(); ServerDataModel model = event.getServerDataModel(); - builder.append("<h3>Facilitator Debriefing:</h3>"); - builder.append("<table><thead><th>Participant</th><th>Current tokens</th><th>Current Income</th><th>Total Income</th></thead><tbody>"); - Map<Identifier, ClientData> clientDataMap = new HashMap<Identifier, ClientData>(); - for (GroupDataModel group: model.getAllGroupDataModels()) { - clientDataMap.putAll(group.getClientDataMap()); - } - TreeSet<Identifier> orderedSet = new TreeSet<Identifier>(clientDataMap.keySet()); - for (Identifier clientId : orderedSet) { - ClientData data = clientDataMap.get(clientId); - // FIXME: hack... inject the configuration into the client data so that getIncome() will return something appropriate. - // should just refactor getIncome or remove it from ClientData entirely. - builder.append(String.format( - "<tr><td>%s</td>" + - "<td align='center'>%d</td>" + - "<td align='center'>$%3.2f</td>" + - "<td align='center'>$%3.2f</td></tr>", - clientId.toString(), - data.getAllTokensEarnedThisRound(), - data.getAllTokensEarnedThisRound() * model.getRoundConfiguration().getDollarsPerToken(), - data.getTotalTokens() * model.getRoundConfiguration().getDollarsPerToken()+ facilitator.getServerConfiguration().getShowUpPayment())); - } - builder.append("</tbody></table><hr>"); - if (event.isLastRound()) { - builder.append("<h2><font color='blue'>The experiment is over. Please prepare payments.</font></h2>"); - } + builder = new StringBuilder(model.generateFacilitatorDebriefing()); + setText(builder.toString()); } diff -r cb612fe975b97f64190351dddcbfffda6d6f178c -r 84f2fd3f32f88e70e3bd87b0285f7fb32ef55f9d src/main/java/edu/asu/commons/irrigation/model/ServerDataModel.java --- a/src/main/java/edu/asu/commons/irrigation/model/ServerDataModel.java +++ b/src/main/java/edu/asu/commons/irrigation/model/ServerDataModel.java @@ -79,6 +79,16 @@ GroupDataModel group = clientsToGroups.get(clientId); return group.getClientDataMap(); } + + public Map<Identifier, ClientData> getClientDataMap() { + Map<Identifier, ClientData> clientDataMap = new HashMap<Identifier, ClientData>(); + for (Map.Entry<Identifier, GroupDataModel> entry : clientsToGroups.entrySet()) { + Identifier id = entry.getKey(); + GroupDataModel group = entry.getValue(); + clientDataMap.put(id, group.getClientData(id)); + } + return clientDataMap; + } public void clear() { for (Iterator<GroupDataModel> iter = clientsToGroups.values().iterator(); iter.hasNext(); ) { @@ -114,4 +124,8 @@ public ServerConfiguration getExperimentConfiguration() { return roundConfiguration.getParentConfiguration(); } + + public String generateFacilitatorDebriefing() { + return roundConfiguration.generateFacilitatorDebriefing(this); + } } diff -r cb612fe975b97f64190351dddcbfffda6d6f178c -r 84f2fd3f32f88e70e3bd87b0285f7fb32ef55f9d src/main/resources/configuration/asu/2011/pretest/irrigation.xml --- a/src/main/resources/configuration/asu/2011/pretest/irrigation.xml +++ b/src/main/resources/configuration/asu/2011/pretest/irrigation.xml @@ -408,11 +408,12 @@ You are in position {clientData.priorityString} and received {clientData.totalDollarsEarnedThisRound} this past round. Your <b>total income</b> is <b>{clientData.grandTotalIncome}</b>, including - the {showUpPayment} show-up bonus - {if (clientData.quizEarnings)} - and {clientData.quizEarnings} for answering {clientData.correctQuizAnswers} quiz questions correctly - {endif} + the {showUpPayment} show-up bonus and {clientData.quizEarnings} for + answering {clientData.correctQuizAnswers} quiz questions correctly. </p> + {if (self.practiceRound)} + <p><b>NOTE: this was a practice round and did not contribute to your earnings.</b></p> + {endif} {if (showExitInstructions)} <h2>Exit Survey</h2><hr> @@ -489,4 +490,19 @@ <entry key="restricted-visibility-instructions"><![CDATA[{if (self.restrictedVisibility)}<b>NOTE:</b> In this experiment you can <b>only communicate with and observe the actions of your immediate neighbors</b>.{endif}]]></entry> +<entry key="facilitator-debriefing"> +<![CDATA[ +<h3>Round {self.roundNumber} results</h3> +<hr> +<table border=1 cellspacing=3 cellpadding=3> +<tr><th>Participant</th><th>Current tokens</th><th>Current income</th><th>Quiz earnings</th><th>Total income</th></tr> +{clientDataList: {data | +<tr align="RIGHT"><td>{data.id}</td><td>{data.allTokensEarnedThisRound}</td><td>{data.totalDollarsEarnedThisRound}</td><td>{data.quizEarnings}</td><td>{data.grandTotalIncome}</td></tr> +}} +</table> +{if (self.lastRound)} +<h2><font color='blue'>The experiment is over. Please prepare payments.</font></h2> +{endif} +]]> +</entry></properties> Repository URL: https://bitbucket.org/virtualcommons/irrigation/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. |