[virtualcommons-svn] commit/irrigation: alllee: fixing client-debriefing template by adding a trans
Status: Beta
Brought to you by:
alllee
From: Bitbucket <com...@bi...> - 2012-02-02 02:25:07
|
1 new commit in irrigation: https://bitbucket.org/virtualcommons/irrigation/changeset/cd8b8aba3bfd/ changeset: cd8b8aba3bfd user: alllee date: 2012-02-02 03:24:57 summary: fixing client-debriefing template by adding a transient self boolean to ClientData representing whether or not that ClientData is the same as the one running the client interface + package refactoring affected #: 30 files diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e 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 @@ -11,7 +11,7 @@ import javax.swing.JPanel; import javax.swing.Timer; -import edu.asu.commons.irrigation.server.ClientData; +import edu.asu.commons.irrigation.model.ClientData; /** * $Id$ diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/client/ChatPanel.java --- a/src/main/java/edu/asu/commons/irrigation/client/ChatPanel.java +++ b/src/main/java/edu/asu/commons/irrigation/client/ChatPanel.java @@ -94,8 +94,7 @@ private void sendMessage() { String message = chatField.getText(); if (message != null && ! message.isEmpty() && targetIdentifier != null) { - displayMessage(String.format("%s : ", getChatHandle(getClientId())), - message); + displayMessage(getChatHandle(getClientId()), message); chatField.setText(""); irrigationClient.transmit(new ChatRequest(getClientId(), message, targetIdentifier)); } @@ -157,8 +156,10 @@ } public void displayMessage(String chatHandle, String message) { - // String chatHandle = getChatHandle(source); final StyledDocument document = messageWindow.getStyledDocument(); + if (!chatHandle.endsWith(":")) { + chatHandle = chatHandle.concat(":"); + } try { document.insertString(0, chatHandle, document.getStyle("bold")); document.insertString(chatHandle.length(), message + "\n", document.getStyle("italic")); @@ -170,7 +171,7 @@ } public void initialize(List<Identifier> participants) { - displayMessage("", " ---- chat round starting ---- "); + displayMessage("System Message", " ---- chat round starting ---- "); if (HANDLES != null) { return; } @@ -193,7 +194,7 @@ public void handle(final ChatEvent chatEvent) { SwingUtilities.invokeLater(new Runnable() { public void run() { - displayMessage(String.format("%s : ", getChatHandle(chatEvent.getSource()), getChatHandle(chatEvent.getTarget())), + displayMessage(getChatHandle(chatEvent.getSource()), chatEvent.toString()); } }); diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/client/ClientDataModel.java --- a/src/main/java/edu/asu/commons/irrigation/client/ClientDataModel.java +++ b/src/main/java/edu/asu/commons/irrigation/client/ClientDataModel.java @@ -12,8 +12,8 @@ import edu.asu.commons.irrigation.conf.ServerConfiguration; import edu.asu.commons.irrigation.events.ClientUpdateEvent; import edu.asu.commons.irrigation.events.RoundStartedEvent; -import edu.asu.commons.irrigation.server.ClientData; -import edu.asu.commons.irrigation.server.GroupDataModel; +import edu.asu.commons.irrigation.model.ClientData; +import edu.asu.commons.irrigation.model.GroupDataModel; import edu.asu.commons.net.Identifier; /** @@ -109,8 +109,10 @@ } public List<ClientData> getClientDataSortedByPriority() { - ArrayList<ClientData> clientDataList = new ArrayList<ClientData>(getGroupDataModel().getClientDataMap().values()); - // sort by position. + Map<Identifier, ClientData> clientDataMap = getGroupDataModel().getClientDataMap(); + clientDataMap.get(getId()).setSelf(true); + ArrayList<ClientData> clientDataList = new ArrayList<ClientData>(clientDataMap.values()); + // sort by priority Collections.sort(clientDataList, new Comparator<ClientData>() { public int compare(ClientData a, ClientData b) { return Integer.valueOf(a.getPriority()).compareTo(b.getPriority()); diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/client/ExperimentGameWindow.java --- a/src/main/java/edu/asu/commons/irrigation/client/ExperimentGameWindow.java +++ b/src/main/java/edu/asu/commons/irrigation/client/ExperimentGameWindow.java @@ -31,8 +31,8 @@ import edu.asu.commons.irrigation.conf.ServerConfiguration; import edu.asu.commons.irrigation.events.EndRoundEvent; import edu.asu.commons.irrigation.events.QuizResponseEvent; -import edu.asu.commons.irrigation.server.ClientData; -import edu.asu.commons.irrigation.server.GroupDataModel; +import edu.asu.commons.irrigation.model.ClientData; +import edu.asu.commons.irrigation.model.GroupDataModel; import edu.asu.commons.ui.HtmlEditorPane; import edu.asu.commons.ui.HtmlEditorPane.FormActionEvent; import edu.asu.commons.ui.UserInterfaceUtils; diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/client/GamePanel.java --- a/src/main/java/edu/asu/commons/irrigation/client/GamePanel.java +++ b/src/main/java/edu/asu/commons/irrigation/client/GamePanel.java @@ -26,7 +26,7 @@ import org.jfree.data.xy.XYSeriesCollection; import edu.asu.commons.irrigation.conf.ServerConfiguration; -import edu.asu.commons.irrigation.server.ClientData; +import edu.asu.commons.irrigation.model.ClientData; /** * $Id$ * diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/client/InfrastructureEfficiencyChartPanel.java --- a/src/main/java/edu/asu/commons/irrigation/client/InfrastructureEfficiencyChartPanel.java +++ b/src/main/java/edu/asu/commons/irrigation/client/InfrastructureEfficiencyChartPanel.java @@ -13,7 +13,7 @@ import org.jfree.data.xy.XYSeriesCollection; import edu.asu.commons.irrigation.conf.RoundConfiguration; -import edu.asu.commons.irrigation.server.GroupDataModel; +import edu.asu.commons.irrigation.model.GroupDataModel; /** * $Id$ diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/client/MiddleScorePanel.java --- a/src/main/java/edu/asu/commons/irrigation/client/MiddleScorePanel.java +++ b/src/main/java/edu/asu/commons/irrigation/client/MiddleScorePanel.java @@ -7,7 +7,7 @@ import javax.swing.JLabel; import javax.swing.JPanel; -import edu.asu.commons.irrigation.server.ClientData; +import edu.asu.commons.irrigation.model.ClientData; /** * $Id$ diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/client/MiddleWindowPanel.java --- a/src/main/java/edu/asu/commons/irrigation/client/MiddleWindowPanel.java +++ b/src/main/java/edu/asu/commons/irrigation/client/MiddleWindowPanel.java @@ -8,7 +8,7 @@ import javax.swing.JLabel; import javax.swing.JPanel; -import edu.asu.commons.irrigation.server.ClientData; +import edu.asu.commons.irrigation.model.ClientData; /** * $Id$ diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/client/ScoreBoxPanel.java --- a/src/main/java/edu/asu/commons/irrigation/client/ScoreBoxPanel.java +++ b/src/main/java/edu/asu/commons/irrigation/client/ScoreBoxPanel.java @@ -7,8 +7,8 @@ import javax.swing.JLabel; import javax.swing.JPanel; -import edu.asu.commons.irrigation.server.ClientData; -import edu.asu.commons.irrigation.server.GroupDataModel; +import edu.asu.commons.irrigation.model.ClientData; +import edu.asu.commons.irrigation.model.GroupDataModel; /** * $Id$ diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/client/TokenInvestmentPieChartPanel.java --- a/src/main/java/edu/asu/commons/irrigation/client/TokenInvestmentPieChartPanel.java +++ b/src/main/java/edu/asu/commons/irrigation/client/TokenInvestmentPieChartPanel.java @@ -13,8 +13,8 @@ import org.jfree.data.general.DefaultPieDataset; import org.jfree.data.general.PieDataset; -import edu.asu.commons.irrigation.server.ClientData; -import edu.asu.commons.irrigation.server.GroupDataModel; +import edu.asu.commons.irrigation.model.ClientData; +import edu.asu.commons.irrigation.model.GroupDataModel; import edu.asu.commons.net.Identifier; /** diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e 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 @@ -6,7 +6,7 @@ import edu.asu.commons.conf.ExperimentRoundParameters; import edu.asu.commons.irrigation.client.ClientDataModel; -import edu.asu.commons.irrigation.server.ClientData; +import edu.asu.commons.irrigation.model.ClientData; import edu.asu.commons.util.Duration; /** diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e 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 @@ -9,7 +9,7 @@ import org.stringtemplate.v4.ST; import edu.asu.commons.conf.ExperimentConfiguration; -import edu.asu.commons.irrigation.server.ClientData; +import edu.asu.commons.irrigation.model.ClientData; /** * $Id$ @@ -99,7 +99,8 @@ } public String getChatDurationInMinutes() { - return assistant.inMinutes(getChatDuration()) + " minutes"; + long minutes = assistant.inMinutes(getChatDuration()); + return String.format("%d minute%s", minutes, (minutes > 1) ? "s" : ""); } public double getTotalIncome(ClientData data) { diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/data/IrrigationSaveFileConverter.java --- a/src/main/java/edu/asu/commons/irrigation/data/IrrigationSaveFileConverter.java +++ b/src/main/java/edu/asu/commons/irrigation/data/IrrigationSaveFileConverter.java @@ -17,9 +17,9 @@ import edu.asu.commons.experiment.SaveFileProcessor; import edu.asu.commons.experiment.SavedRoundData; import edu.asu.commons.irrigation.conf.RoundConfiguration; -import edu.asu.commons.irrigation.server.ClientData; -import edu.asu.commons.irrigation.server.GroupDataModel; -import edu.asu.commons.irrigation.server.ServerDataModel; +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; /** diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/events/BeginChatRoundRequest.java --- a/src/main/java/edu/asu/commons/irrigation/events/BeginChatRoundRequest.java +++ b/src/main/java/edu/asu/commons/irrigation/events/BeginChatRoundRequest.java @@ -2,7 +2,7 @@ import edu.asu.commons.event.AbstractEvent; import edu.asu.commons.event.FacilitatorRequest; -import edu.asu.commons.irrigation.server.GroupDataModel; +import edu.asu.commons.irrigation.model.GroupDataModel; import edu.asu.commons.net.Identifier; /** diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/events/ClientUpdateEvent.java --- a/src/main/java/edu/asu/commons/irrigation/events/ClientUpdateEvent.java +++ b/src/main/java/edu/asu/commons/irrigation/events/ClientUpdateEvent.java @@ -2,7 +2,7 @@ import edu.asu.commons.event.AbstractEvent; import edu.asu.commons.event.ExperimentUpdateEvent; -import edu.asu.commons.irrigation.server.GroupDataModel; +import edu.asu.commons.irrigation.model.GroupDataModel; import edu.asu.commons.net.Identifier; /** diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/events/EndRoundEvent.java --- a/src/main/java/edu/asu/commons/irrigation/events/EndRoundEvent.java +++ b/src/main/java/edu/asu/commons/irrigation/events/EndRoundEvent.java @@ -2,7 +2,7 @@ import edu.asu.commons.event.AbstractEvent; import edu.asu.commons.event.ExperimentUpdateEvent; -import edu.asu.commons.irrigation.server.GroupDataModel; +import edu.asu.commons.irrigation.model.GroupDataModel; import edu.asu.commons.net.Identifier; /** diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/events/FacilitatorEndRoundEvent.java --- a/src/main/java/edu/asu/commons/irrigation/events/FacilitatorEndRoundEvent.java +++ b/src/main/java/edu/asu/commons/irrigation/events/FacilitatorEndRoundEvent.java @@ -1,7 +1,7 @@ package edu.asu.commons.irrigation.events; import edu.asu.commons.event.AbstractEvent; -import edu.asu.commons.irrigation.server.ServerDataModel; +import edu.asu.commons.irrigation.model.ServerDataModel; import edu.asu.commons.net.Identifier; /** diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/events/InfrastructureUpdateEvent.java --- a/src/main/java/edu/asu/commons/irrigation/events/InfrastructureUpdateEvent.java +++ b/src/main/java/edu/asu/commons/irrigation/events/InfrastructureUpdateEvent.java @@ -4,8 +4,8 @@ import edu.asu.commons.event.AbstractEvent; import edu.asu.commons.event.ExperimentUpdateEvent; -import edu.asu.commons.irrigation.server.ClientData; -import edu.asu.commons.irrigation.server.GroupDataModel; +import edu.asu.commons.irrigation.model.ClientData; +import edu.asu.commons.irrigation.model.GroupDataModel; import edu.asu.commons.net.Identifier; /** diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/events/RegistrationEvent.java --- a/src/main/java/edu/asu/commons/irrigation/events/RegistrationEvent.java +++ b/src/main/java/edu/asu/commons/irrigation/events/RegistrationEvent.java @@ -3,7 +3,7 @@ import edu.asu.commons.event.AbstractEvent; import edu.asu.commons.event.ExperimentUpdateEvent; import edu.asu.commons.irrigation.conf.RoundConfiguration; -import edu.asu.commons.irrigation.server.ClientData; +import edu.asu.commons.irrigation.model.ClientData; import edu.asu.commons.net.Identifier; /** diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/events/RoundStartedEvent.java --- a/src/main/java/edu/asu/commons/irrigation/events/RoundStartedEvent.java +++ b/src/main/java/edu/asu/commons/irrigation/events/RoundStartedEvent.java @@ -1,7 +1,7 @@ package edu.asu.commons.irrigation.events; import edu.asu.commons.event.AbstractEvent; -import edu.asu.commons.irrigation.server.GroupDataModel; +import edu.asu.commons.irrigation.model.GroupDataModel; import edu.asu.commons.net.Identifier; /** diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e 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 @@ -18,7 +18,7 @@ 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.server.ServerDataModel; +import edu.asu.commons.irrigation.model.ServerDataModel; import edu.asu.commons.net.ClientDispatcher; import edu.asu.commons.net.DispatcherFactory; import edu.asu.commons.net.Identifier; diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e 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 @@ -18,9 +18,9 @@ import edu.asu.commons.irrigation.events.ShowGameScreenshotRequest; import edu.asu.commons.irrigation.events.ShowInstructionsRequest; import edu.asu.commons.irrigation.events.ShowQuizRequest; -import edu.asu.commons.irrigation.server.ClientData; -import edu.asu.commons.irrigation.server.GroupDataModel; -import edu.asu.commons.irrigation.server.ServerDataModel; +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; diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/model/ClientData.java --- /dev/null +++ b/src/main/java/edu/asu/commons/irrigation/model/ClientData.java @@ -0,0 +1,254 @@ +package edu.asu.commons.irrigation.model; + +import java.io.Serializable; + +import edu.asu.commons.irrigation.conf.RoundConfiguration; +import edu.asu.commons.irrigation.conf.ServerConfiguration; +import edu.asu.commons.net.Identifier; + +/** + * $Id$ + * + * Stores client-specific information used by the server. + * + * FIXME: need additional fields: + * total tokens collected in a round + * minus tokens subtracted by others + * minus tokens subtracted by sanctioning others + * + * @author <a href='mailto:all...@as...'>Allen Lee</a>, Deepali Bhagvat + * @version $Revision$ + */ + +public class ClientData implements Serializable { + + private static final long serialVersionUID = 5281922601551921005L; + + private Identifier id; + + private GroupDataModel groupDataModel; + + private int waterCollected = 0; + + private int availableFlowCapacity; + + private int investedTokens; + + private int assignedNumber; + + private int correctQuizAnswers = 0; + + private RoundConfiguration roundConfiguration; + + private int totalTokens; + + private boolean gateOpen = false; + + // transient formatted earnings data set by RoundConfiguration while generating debriefing text + private String quizEarnings; + private String grandTotalIncome; + private String totalDollarsEarnedThisRound; + + // represents whether or not this ClientData is for the client in question. + private transient boolean self = false; + + public ClientData(Identifier id) { + this.id = id; + } + + public boolean isGateClosed(){ + return ! gateOpen; + } + + public boolean isGateOpen(){ + return gateOpen; + } + + /** + * The actual bandwidth allocated to this client. + */ + public void setAvailableFlowCapacity(int availableFlowCapacity) { + this.availableFlowCapacity = availableFlowCapacity; + } + + public int getAvailableFlowCapacity(){ + return availableFlowCapacity; + } + + public int getPriority() { + 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"; + } + + public void openGate(){ + gateOpen = true; + } + + public void closeGate(){ + gateOpen = false; + } + + /** + * get and set the Tokens that are contributed by this client. + * * @param contributedTokens + */ + public void setInvestedTokens(int investedTokens) { + this.investedTokens = investedTokens; + } + + public int getInvestedTokens(){ + return investedTokens; + } + + public int getUninvestedTokens() { + return roundConfiguration.getMaximumTokenInvestment() - investedTokens; + } + + public GroupDataModel getGroupDataModel() { + return groupDataModel; + } + public void setGroupDataModel(GroupDataModel group) { + this.groupDataModel = group; + } + public Identifier getId() { + return id; + } + + public void setRoundConfiguration(RoundConfiguration roundConfiguration) { + this.roundConfiguration = roundConfiguration; + } + + /** + * Resets this client data's instance variables at the end of the round. + * + */ + public void resetEndRound() { + closeGate(); + investedTokens = 0; + waterCollected = 0; + } + + public void resetAllTokens() { + resetEndRound(); + totalTokens = 0; + } + + public int getAssignedNumber() { + return assignedNumber; + } + + public void setAssignedNumber(int assignedNumber) { + this.assignedNumber = assignedNumber; + } + + public int getTotalTokens() { + return totalTokens; + } + + + public RoundConfiguration getRoundConfiguration(){ + return roundConfiguration; + } + /** + * This would initialize the clientData before the start of each download. + * + */ + public void init(int availableFlowCapacity) { + closeGate(); + setAvailableFlowCapacity(availableFlowCapacity); + } + + public void addTokensEarnedThisRoundToTotal() { + totalTokens += getAllTokensEarnedThisRound(); + } + + /** + * Returns the current number of tokens given to this participant. + * @return + */ + public int getAllTokensEarnedThisRound(){ + return getTokensEarnedFromWaterCollected() + getUninvestedTokens(); + } + + public String getTotalDollarsEarnedThisRound() { + return totalDollarsEarnedThisRound; + } + + /** + * Reward function table correlating water usage to tokens earned. + * + * @param value + * @return + */ + public int getTokensEarnedFromWaterCollected() { + return ServerConfiguration.getTokensEarned(waterCollected); + } + + + public void collectWater() { + waterCollected += availableFlowCapacity; + } + + public int getWaterCollected(){ + return waterCollected; + } + + public void setId(Identifier id) { + this.id = id; + } + + public boolean isImmediateNeighbor(ClientData otherClientData) { + int thisPosition = getPriority(); + int otherPosition = otherClientData.getPriority(); + return (thisPosition == otherPosition) || (thisPosition == otherPosition + 1) || (thisPosition == otherPosition - 1); + } + + public int getCorrectQuizAnswers() { + return correctQuizAnswers; + } + + public void setCorrectQuizAnswers(int correctQuizAnswers) { + this.correctQuizAnswers = correctQuizAnswers; + } + + public String getQuizEarnings() { + return quizEarnings; + } + + public void setQuizEarnings(String quizEarnings) { + this.quizEarnings = quizEarnings; + } + + public String getGrandTotalIncome() { + return grandTotalIncome; + } + + public void setGrandTotalIncome(String grandTotalIncome) { + this.grandTotalIncome = grandTotalIncome; + } + + public void setTotalDollarsEarnedThisRound(String totalDollarsEarnedThisRound) { + this.totalDollarsEarnedThisRound = totalDollarsEarnedThisRound; + } + + public boolean isSelf() { + return self; + } + + public void setSelf(boolean current) { + this.self = current; + } +} + + diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/model/GroupDataModel.java --- /dev/null +++ b/src/main/java/edu/asu/commons/irrigation/model/GroupDataModel.java @@ -0,0 +1,249 @@ +package edu.asu.commons.irrigation.model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +import edu.asu.commons.event.EventChannel; +import edu.asu.commons.experiment.DataModel; +import edu.asu.commons.irrigation.conf.RoundConfiguration; +import edu.asu.commons.irrigation.conf.ServerConfiguration; +import edu.asu.commons.net.Identifier; + +/** + * $Id$ + * + * Data model for a single Group of clients. Each Group manages its own unique resource shared among + * its own participants. + * + * @author <a href='mailto:All...@as...'>Allen Lee</a> + * @version $Rev$ + */ +public class GroupDataModel implements DataModel<ServerConfiguration, RoundConfiguration> { + + private static final long serialVersionUID = 5817418171228817123L; + + private transient Logger logger = Logger.getLogger(GroupDataModel.class.getName()); + + private final Map<Identifier, ClientData> clients = new LinkedHashMap<Identifier, ClientData>(); + + private RoundConfiguration roundConfiguration; + + private transient ServerDataModel serverDataModel; + + + private int currentlyAvailableFlowCapacity = 0; + private int maximumAvailableWaterFlow = 0; + + private int infrastructureEfficiency; + // infrastructure efficiency before investment (but post decline) + private int infrastructureEfficiencyBeforeInvestment; + + private int totalContributedTokens = 0; + + + public GroupDataModel(ServerDataModel serverDataModel) { + this.serverDataModel = serverDataModel; + setRoundConfiguration(serverDataModel.getRoundConfiguration()); + } + + public ClientData getClientData(Identifier id) { + return clients.get(id); + } + + public List<Identifier> getAllClientIdentifiers() { + return new ArrayList<Identifier>(clients.keySet()); + } + + public void addClient(ClientData clientData) { + clients.put(clientData.getId(), clientData); + clientData.setAssignedNumber(clients.size()); + } + + public int size() { + return clients.size(); + } + + public void removeClient(Identifier id) { + clients.remove(id); + } + + public boolean isFull() { + return clients.size() == getRoundConfiguration().getClientsPerGroup(); + } + + public void clear() { + clients.clear(); + } + + public Map<Identifier, ClientData> getClientDataMap() { + return Collections.unmodifiableMap(clients); + } + + public int getAvailableClientFlowCapacity() { + return Math.min(currentlyAvailableFlowCapacity, getRoundConfiguration().getMaximumClientFlowCapacity()); + } + + public RoundConfiguration getRoundConfiguration() { + return roundConfiguration; + } + + public int getTotalContributedTokens() { + return totalContributedTokens; + } + + public void initializeInfrastructure() { + // for practice round and first round, initialize to initial infrastructure efficiency + //setting the total contributed Bandwidth = 0 , so that for every round, + // fresh totalContributed tokens are calculated + totalContributedTokens = 0; + for(ClientData clientData : getClientDataMap().values()) { + totalContributedTokens += clientData.getInvestedTokens(); + } + updateInfrastructureEfficiency(totalContributedTokens); + currentlyAvailableFlowCapacity = maximumAvailableWaterFlow = getActualWaterDeliveryCapacity(); + } + + private void updateInfrastructureEfficiency(int totalContributedTokens) { + RoundConfiguration roundConfiguration = getRoundConfiguration(); + // initialize infrastructure efficiency + if ( roundConfiguration.shouldResetInfrastructureEfficiency() ) { + infrastructureEfficiency = roundConfiguration.getInitialInfrastructureEfficiency(); + } + else { + // degrade by infrastructure-degradation-factor, clamp at 0 + infrastructureEfficiency = Math.max(infrastructureEfficiency - roundConfiguration.getInfrastructureDegradationFactor(), 0); + } + // set original infrastructure efficiency before token contributions + getLogger().info("initial infrastructure efficiency: " + infrastructureEfficiency); + infrastructureEfficiencyBeforeInvestment = infrastructureEfficiency; + // add total invested tokens to infrastructure efficiency, clamp at + // 100 + infrastructureEfficiency = Math.min(100, totalContributedTokens + infrastructureEfficiency); + } + + /** + * This function maps flow capacity to infrastructure efficiency. Returns an int representing + * the flow capacity given the infrastructure efficiency. + * this needs to be designed. + * @param totalTokens + * @return + */ + public int calculateIrrigationCapacity(final int infrastructureEfficiency) { + if (infrastructureEfficiency <= 45) { + return 0; + } + else if (infrastructureEfficiency <= 51) { + return 5; + } + else if (infrastructureEfficiency <= 55) { + return 10; + } + else if (infrastructureEfficiency <= 58) { + return 15; + } + else if (infrastructureEfficiency <= 61) { + return 20; + } + else if (infrastructureEfficiency <= 65) { + return 25; + } + else if (infrastructureEfficiency <= 70) { + return 30; + } + else if (infrastructureEfficiency <= 80) { + return 35; + } + else if (infrastructureEfficiency <= 100) { + return 40; + } + return 40; + } + + public int getIrrigationCapacityBeforeInvestment() { +// return Math.min(calculateFlowCapacity(initialInfrastructureEfficiency), getRoundConfiguration().getWaterSupplyCapacity()); + return calculateIrrigationCapacity(infrastructureEfficiencyBeforeInvestment); + } + + /** + * Returns the theoretical maximum amount of water that the infrastructure can handle. + * This is independent of the actual water supply. + */ + public int getIrrigationCapacity() { + return calculateIrrigationCapacity(infrastructureEfficiency); +// return Math.min(calculateFlowCapacity(infrastructureEfficiency), getRoundConfiguration().getWaterSupplyCapacity()); + } + + /** + * Returns the actual maximum amount of water that can pass through the canal, which is the minimum + * of the irrigation capacity and the water supply. + * @return + */ + public int getActualWaterDeliveryCapacity() { + return Math.min(getIrrigationCapacity(), getRoundConfiguration().getWaterSupplyCapacity()); + } + + public void resetCurrentlyAvailableFlowCapacity() { + currentlyAvailableFlowCapacity = maximumAvailableWaterFlow; + } + + public void allocateWater(ClientData clientData) { + int maximumClientFlowCapacity = getRoundConfiguration().getMaximumClientFlowCapacity(); + if (currentlyAvailableFlowCapacity >= maximumClientFlowCapacity) { + currentlyAvailableFlowCapacity -= maximumClientFlowCapacity; + clientData.setAvailableFlowCapacity(maximumClientFlowCapacity); + } + else { + clientData.setAvailableFlowCapacity(currentlyAvailableFlowCapacity); + currentlyAvailableFlowCapacity = 0; + } + clientData.collectWater(); + } + + public int getMaximumAvailableWaterFlow() { + return maximumAvailableWaterFlow; + } + + public int getInfrastructureEfficiency() { + return infrastructureEfficiency; + } + + public int getInfrastructureEfficiencyBeforeInvestment() { + return infrastructureEfficiencyBeforeInvestment; + } + + public Logger getLogger() { + if (logger == null) { + logger = Logger.getLogger(getClass().getName()); + } + return logger; + } + + + public void setRoundConfiguration(RoundConfiguration roundConfiguration) { + this.roundConfiguration = roundConfiguration; + } + + @Override + public EventChannel getEventChannel() { + return serverDataModel.getEventChannel(); + } + + public ServerDataModel getServerDataModel() { + return serverDataModel; + } + + public void setServerDataModel(ServerDataModel serverDataModel) { + this.serverDataModel = serverDataModel; + } + + @Override + public ServerConfiguration getExperimentConfiguration() { + return roundConfiguration.getParentConfiguration(); + } + +} + diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/model/ServerDataModel.java --- /dev/null +++ b/src/main/java/edu/asu/commons/irrigation/model/ServerDataModel.java @@ -0,0 +1,110 @@ +package edu.asu.commons.irrigation.model; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import edu.asu.commons.event.EventChannel; +import edu.asu.commons.experiment.DataModel; +import edu.asu.commons.irrigation.conf.RoundConfiguration; +import edu.asu.commons.irrigation.conf.ServerConfiguration; +import edu.asu.commons.net.Identifier; + +/** + * $Id$ + * + * + * @author <a href='mailto:All...@as...'>Allen Lee</a> + * @version $Rev$ + */ +public class ServerDataModel implements DataModel<ServerConfiguration, RoundConfiguration> { + + private static final long serialVersionUID = -2633842942700901843L; + + // maps client Identifiers to the Group that client belongs to. + private final Map<Identifier, GroupDataModel> clientsToGroups = new HashMap<Identifier, GroupDataModel>(); + + private RoundConfiguration roundConfiguration; + + private transient EventChannel eventChannel; + + public RoundConfiguration getRoundConfiguration() { + return roundConfiguration; + } + + public void setRoundConfiguration(RoundConfiguration roundConfiguration) { + this.roundConfiguration = roundConfiguration; + for (GroupDataModel group: clientsToGroups.values()) { + group.setRoundConfiguration(roundConfiguration); + } + } + + public synchronized void addClient(ClientData clientData) { + // iterate through all existing groups + for (GroupDataModel group : clientsToGroups.values()) { + if (!group.isFull()) { + addClientToGroup(clientData, group); + return; + } + } + GroupDataModel group = new GroupDataModel(this); + addClientToGroup(clientData, group); + return; + } + + public Set<GroupDataModel> getAllGroupDataModels() { + return new HashSet<GroupDataModel>(clientsToGroups.values()); + } + + public GroupDataModel getGroupDataModel(Identifier id) { + return clientsToGroups.get(id); + } + + + private void addClientToGroup(ClientData clientData, GroupDataModel group) { + clientData.setRoundConfiguration(roundConfiguration); + group.addClient(clientData); + clientData.setGroupDataModel(group); + clientsToGroups.put(clientData.getId(), group); + } + + public Map<Identifier, ClientData> getClientDataMap(Identifier clientId) { + GroupDataModel group = clientsToGroups.get(clientId); + return group.getClientDataMap(); + } + + public void clear() { + for (Iterator<GroupDataModel> iter = clientsToGroups.values().iterator(); iter.hasNext(); ) { + GroupDataModel group = iter.next(); + group.clear(); + iter.remove(); + } + } + + public void removeClient(Identifier id) { + GroupDataModel groupDataModel = clientsToGroups.remove(id); + groupDataModel.removeClient(id); + } + + public EventChannel getEventChannel() { + return eventChannel; + } + + public void setEventChannel(EventChannel eventChannel) { + this.eventChannel = eventChannel; + } + + @Override + public List<Identifier> getAllClientIdentifiers() { + return new ArrayList<Identifier>(clientsToGroups.keySet()); + } + + @Override + public ServerConfiguration getExperimentConfiguration() { + return roundConfiguration.getParentConfiguration(); + } +} diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/server/ClientData.java --- a/src/main/java/edu/asu/commons/irrigation/server/ClientData.java +++ /dev/null @@ -1,243 +0,0 @@ -package edu.asu.commons.irrigation.server; - -import java.io.Serializable; - -import edu.asu.commons.irrigation.conf.RoundConfiguration; -import edu.asu.commons.irrigation.conf.ServerConfiguration; -import edu.asu.commons.net.Identifier; - -/** - * $Id$ - * - * Stores client-specific information used by the server. - * - * FIXME: need additional fields: - * total tokens collected in a round - * minus tokens subtracted by others - * minus tokens subtracted by sanctioning others - * - * @author <a href='mailto:all...@as...'>Allen Lee</a>, Deepali Bhagvat - * @version $Revision$ - */ - -public class ClientData implements Serializable { - - private static final long serialVersionUID = 5281922601551921005L; - - private Identifier id; - - private GroupDataModel groupDataModel; - - private int waterCollected = 0; - - private int availableFlowCapacity; - - private int investedTokens; - - private int assignedNumber; - - private int correctQuizAnswers = 0; - - private RoundConfiguration roundConfiguration; - - private int totalTokens; - - private boolean gateOpen = false; - - // transient formatted earnings data set by RoundConfiguration while generating debriefing text - private String quizEarnings; - private String grandTotalIncome; - private String totalDollarsEarnedThisRound; - - public ClientData(Identifier id) { - this.id = id; - } - - public boolean isGateClosed(){ - return ! gateOpen; - } - - public boolean isGateOpen(){ - return gateOpen; - } - - /** - * The actual bandwidth allocated to this client. - */ - public void setAvailableFlowCapacity(int availableFlowCapacity) { - this.availableFlowCapacity = availableFlowCapacity; - } - - public int getAvailableFlowCapacity(){ - return availableFlowCapacity; - } - - public int getPriority() { - 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"; - } - - public void openGate(){ - gateOpen = true; - } - - public void closeGate(){ - gateOpen = false; - } - - /** - * get and set the Tokens that are contributed by this client. - * * @param contributedTokens - */ - public void setInvestedTokens(int investedTokens) { - this.investedTokens = investedTokens; - } - - public int getInvestedTokens(){ - return investedTokens; - } - - public int getUninvestedTokens() { - return roundConfiguration.getMaximumTokenInvestment() - investedTokens; - } - - public GroupDataModel getGroupDataModel() { - return groupDataModel; - } - public void setGroupDataModel(GroupDataModel group) { - this.groupDataModel = group; - } - public Identifier getId() { - return id; - } - - public void setRoundConfiguration(RoundConfiguration roundConfiguration) { - this.roundConfiguration = roundConfiguration; - } - - /** - * Resets this client data's instance variables at the end of the round. - * - */ - public void resetEndRound() { - closeGate(); - investedTokens = 0; - waterCollected = 0; - } - - public void resetAllTokens() { - resetEndRound(); - totalTokens = 0; - } - - public int getAssignedNumber() { - return assignedNumber; - } - - public void setAssignedNumber(int assignedNumber) { - this.assignedNumber = assignedNumber; - } - - public int getTotalTokens() { - return totalTokens; - } - - - public RoundConfiguration getRoundConfiguration(){ - return roundConfiguration; - } - /** - * This would initialize the clientData before the start of each download. - * - */ - public void init(int availableFlowCapacity) { - closeGate(); - setAvailableFlowCapacity(availableFlowCapacity); - } - - public void addTokensEarnedThisRoundToTotal() { - totalTokens += getAllTokensEarnedThisRound(); - } - - /** - * Returns the current number of tokens given to this participant. - * @return - */ - public int getAllTokensEarnedThisRound(){ - return getTokensEarnedFromWaterCollected() + getUninvestedTokens(); - } - - public String getTotalDollarsEarnedThisRound() { - return totalDollarsEarnedThisRound; - } - - /** - * Reward function table correlating water usage to tokens earned. - * - * @param value - * @return - */ - public int getTokensEarnedFromWaterCollected() { - return ServerConfiguration.getTokensEarned(waterCollected); - } - - - public void collectWater() { - waterCollected += availableFlowCapacity; - } - - public int getWaterCollected(){ - return waterCollected; - } - - public void setId(Identifier id) { - this.id = id; - } - - public boolean isImmediateNeighbor(ClientData otherClientData) { - int thisPosition = getPriority(); - int otherPosition = otherClientData.getPriority(); - return (thisPosition == otherPosition) || (thisPosition == otherPosition + 1) || (thisPosition == otherPosition - 1); - } - - public int getCorrectQuizAnswers() { - return correctQuizAnswers; - } - - public void setCorrectQuizAnswers(int correctQuizAnswers) { - this.correctQuizAnswers = correctQuizAnswers; - } - - public String getQuizEarnings() { - return quizEarnings; - } - - public void setQuizEarnings(String quizEarnings) { - this.quizEarnings = quizEarnings; - } - - public String getGrandTotalIncome() { - return grandTotalIncome; - } - - public void setGrandTotalIncome(String grandTotalIncome) { - this.grandTotalIncome = grandTotalIncome; - } - - public void setTotalDollarsEarnedThisRound(String totalDollarsEarnedThisRound) { - this.totalDollarsEarnedThisRound = totalDollarsEarnedThisRound; - } -} - - diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/server/GroupDataModel.java --- a/src/main/java/edu/asu/commons/irrigation/server/GroupDataModel.java +++ /dev/null @@ -1,249 +0,0 @@ -package edu.asu.commons.irrigation.server; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; - -import edu.asu.commons.event.EventChannel; -import edu.asu.commons.experiment.DataModel; -import edu.asu.commons.irrigation.conf.RoundConfiguration; -import edu.asu.commons.irrigation.conf.ServerConfiguration; -import edu.asu.commons.net.Identifier; - -/** - * $Id$ - * - * Data model for a single Group of clients. Each Group manages its own unique resource shared among - * its own participants. - * - * @author <a href='mailto:All...@as...'>Allen Lee</a> - * @version $Rev$ - */ -public class GroupDataModel implements DataModel<ServerConfiguration, RoundConfiguration> { - - private static final long serialVersionUID = 5817418171228817123L; - - private transient Logger logger = Logger.getLogger(GroupDataModel.class.getName()); - - private final Map<Identifier, ClientData> clients = new LinkedHashMap<Identifier, ClientData>(); - - private RoundConfiguration roundConfiguration; - - private transient ServerDataModel serverDataModel; - - - private int currentlyAvailableFlowCapacity = 0; - private int maximumAvailableWaterFlow = 0; - - private int infrastructureEfficiency; - // infrastructure efficiency before investment (but post decline) - private int infrastructureEfficiencyBeforeInvestment; - - private int totalContributedTokens = 0; - - - public GroupDataModel(ServerDataModel serverDataModel) { - this.serverDataModel = serverDataModel; - setRoundConfiguration(serverDataModel.getRoundConfiguration()); - } - - public ClientData getClientData(Identifier id) { - return clients.get(id); - } - - public List<Identifier> getAllClientIdentifiers() { - return new ArrayList<Identifier>(clients.keySet()); - } - - public void addClient(ClientData clientData) { - clients.put(clientData.getId(), clientData); - clientData.setAssignedNumber(clients.size()); - } - - public int size() { - return clients.size(); - } - - public void removeClient(Identifier id) { - clients.remove(id); - } - - public boolean isFull() { - return clients.size() == getRoundConfiguration().getClientsPerGroup(); - } - - public void clear() { - clients.clear(); - } - - public Map<Identifier, ClientData> getClientDataMap() { - return Collections.unmodifiableMap(clients); - } - - public int getAvailableClientFlowCapacity() { - return Math.min(currentlyAvailableFlowCapacity, getRoundConfiguration().getMaximumClientFlowCapacity()); - } - - public RoundConfiguration getRoundConfiguration() { - return roundConfiguration; - } - - public int getTotalContributedTokens() { - return totalContributedTokens; - } - - public void initializeInfrastructure() { - // for practice round and first round, initialize to initial infrastructure efficiency - //setting the total contributed Bandwidth = 0 , so that for every round, - // fresh totalContributed tokens are calculated - totalContributedTokens = 0; - for(ClientData clientData : getClientDataMap().values()) { - totalContributedTokens += clientData.getInvestedTokens(); - } - updateInfrastructureEfficiency(totalContributedTokens); - currentlyAvailableFlowCapacity = maximumAvailableWaterFlow = getActualWaterDeliveryCapacity(); - } - - private void updateInfrastructureEfficiency(int totalContributedTokens) { - RoundConfiguration roundConfiguration = getRoundConfiguration(); - // initialize infrastructure efficiency - if ( roundConfiguration.shouldResetInfrastructureEfficiency() ) { - infrastructureEfficiency = roundConfiguration.getInitialInfrastructureEfficiency(); - } - else { - // degrade by infrastructure-degradation-factor, clamp at 0 - infrastructureEfficiency = Math.max(infrastructureEfficiency - roundConfiguration.getInfrastructureDegradationFactor(), 0); - } - // set original infrastructure efficiency before token contributions - getLogger().info("initial infrastructure efficiency: " + infrastructureEfficiency); - infrastructureEfficiencyBeforeInvestment = infrastructureEfficiency; - // add total invested tokens to infrastructure efficiency, clamp at - // 100 - infrastructureEfficiency = Math.min(100, totalContributedTokens + infrastructureEfficiency); - } - - /** - * This function maps flow capacity to infrastructure efficiency. Returns an int representing - * the flow capacity given the infrastructure efficiency. - * this needs to be designed. - * @param totalTokens - * @return - */ - public int calculateIrrigationCapacity(final int infrastructureEfficiency) { - if (infrastructureEfficiency <= 45) { - return 0; - } - else if (infrastructureEfficiency <= 51) { - return 5; - } - else if (infrastructureEfficiency <= 55) { - return 10; - } - else if (infrastructureEfficiency <= 58) { - return 15; - } - else if (infrastructureEfficiency <= 61) { - return 20; - } - else if (infrastructureEfficiency <= 65) { - return 25; - } - else if (infrastructureEfficiency <= 70) { - return 30; - } - else if (infrastructureEfficiency <= 80) { - return 35; - } - else if (infrastructureEfficiency <= 100) { - return 40; - } - return 40; - } - - public int getIrrigationCapacityBeforeInvestment() { -// return Math.min(calculateFlowCapacity(initialInfrastructureEfficiency), getRoundConfiguration().getWaterSupplyCapacity()); - return calculateIrrigationCapacity(infrastructureEfficiencyBeforeInvestment); - } - - /** - * Returns the theoretical maximum amount of water that the infrastructure can handle. - * This is independent of the actual water supply. - */ - public int getIrrigationCapacity() { - return calculateIrrigationCapacity(infrastructureEfficiency); -// return Math.min(calculateFlowCapacity(infrastructureEfficiency), getRoundConfiguration().getWaterSupplyCapacity()); - } - - /** - * Returns the actual maximum amount of water that can pass through the canal, which is the minimum - * of the irrigation capacity and the water supply. - * @return - */ - public int getActualWaterDeliveryCapacity() { - return Math.min(getIrrigationCapacity(), getRoundConfiguration().getWaterSupplyCapacity()); - } - - public void resetCurrentlyAvailableFlowCapacity() { - currentlyAvailableFlowCapacity = maximumAvailableWaterFlow; - } - - public void allocateWater(ClientData clientData) { - int maximumClientFlowCapacity = getRoundConfiguration().getMaximumClientFlowCapacity(); - if (currentlyAvailableFlowCapacity >= maximumClientFlowCapacity) { - currentlyAvailableFlowCapacity -= maximumClientFlowCapacity; - clientData.setAvailableFlowCapacity(maximumClientFlowCapacity); - } - else { - clientData.setAvailableFlowCapacity(currentlyAvailableFlowCapacity); - currentlyAvailableFlowCapacity = 0; - } - clientData.collectWater(); - } - - public int getMaximumAvailableWaterFlow() { - return maximumAvailableWaterFlow; - } - - public int getInfrastructureEfficiency() { - return infrastructureEfficiency; - } - - public int getInfrastructureEfficiencyBeforeInvestment() { - return infrastructureEfficiencyBeforeInvestment; - } - - public Logger getLogger() { - if (logger == null) { - logger = Logger.getLogger(getClass().getName()); - } - return logger; - } - - - public void setRoundConfiguration(RoundConfiguration roundConfiguration) { - this.roundConfiguration = roundConfiguration; - } - - @Override - public EventChannel getEventChannel() { - return serverDataModel.getEventChannel(); - } - - public ServerDataModel getServerDataModel() { - return serverDataModel; - } - - public void setServerDataModel(ServerDataModel serverDataModel) { - this.serverDataModel = serverDataModel; - } - - @Override - public ServerConfiguration getExperimentConfiguration() { - return roundConfiguration.getParentConfiguration(); - } - -} - diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e 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 @@ -37,6 +37,9 @@ import edu.asu.commons.irrigation.events.ShowInstructionsRequest; import edu.asu.commons.irrigation.events.ShowQuizRequest; import edu.asu.commons.irrigation.events.ShowTokenInvestmentScreenRequest; +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.Dispatcher; import edu.asu.commons.net.Identifier; import edu.asu.commons.net.SocketIdentifier; diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e src/main/java/edu/asu/commons/irrigation/server/ServerDataModel.java --- a/src/main/java/edu/asu/commons/irrigation/server/ServerDataModel.java +++ /dev/null @@ -1,110 +0,0 @@ -package edu.asu.commons.irrigation.server; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import edu.asu.commons.event.EventChannel; -import edu.asu.commons.experiment.DataModel; -import edu.asu.commons.irrigation.conf.RoundConfiguration; -import edu.asu.commons.irrigation.conf.ServerConfiguration; -import edu.asu.commons.net.Identifier; - -/** - * $Id$ - * - * - * @author <a href='mailto:All...@as...'>Allen Lee</a> - * @version $Rev$ - */ -public class ServerDataModel implements DataModel<ServerConfiguration, RoundConfiguration> { - - private static final long serialVersionUID = -2633842942700901843L; - - // maps client Identifiers to the Group that client belongs to. - private final Map<Identifier, GroupDataModel> clientsToGroups = new HashMap<Identifier, GroupDataModel>(); - - private RoundConfiguration roundConfiguration; - - private transient EventChannel eventChannel; - - public RoundConfiguration getRoundConfiguration() { - return roundConfiguration; - } - - public void setRoundConfiguration(RoundConfiguration roundConfiguration) { - this.roundConfiguration = roundConfiguration; - for (GroupDataModel group: clientsToGroups.values()) { - group.setRoundConfiguration(roundConfiguration); - } - } - - public synchronized void addClient(ClientData clientData) { - // iterate through all existing groups - for (GroupDataModel group : clientsToGroups.values()) { - if (!group.isFull()) { - addClientToGroup(clientData, group); - return; - } - } - GroupDataModel group = new GroupDataModel(this); - addClientToGroup(clientData, group); - return; - } - - public Set<GroupDataModel> getAllGroupDataModels() { - return new HashSet<GroupDataModel>(clientsToGroups.values()); - } - - public GroupDataModel getGroupDataModel(Identifier id) { - return clientsToGroups.get(id); - } - - - private void addClientToGroup(ClientData clientData, GroupDataModel group) { - clientData.setRoundConfiguration(roundConfiguration); - group.addClient(clientData); - clientData.setGroupDataModel(group); - clientsToGroups.put(clientData.getId(), group); - } - - public Map<Identifier, ClientData> getClientDataMap(Identifier clientId) { - GroupDataModel group = clientsToGroups.get(clientId); - return group.getClientDataMap(); - } - - public void clear() { - for (Iterator<GroupDataModel> iter = clientsToGroups.values().iterator(); iter.hasNext(); ) { - GroupDataModel group = iter.next(); - group.clear(); - iter.remove(); - } - } - - public void removeClient(Identifier id) { - GroupDataModel groupDataModel = clientsToGroups.remove(id); - groupDataModel.removeClient(id); - } - - public EventChannel getEventChannel() { - return eventChannel; - } - - public void setEventChannel(EventChannel eventChannel) { - this.eventChannel = eventChannel; - } - - @Override - public List<Identifier> getAllClientIdentifiers() { - return new ArrayList<Identifier>(clientsToGroups.keySet()); - } - - @Override - public ServerConfiguration getExperimentConfiguration() { - return roundConfiguration.getParentConfiguration(); - } -} diff -r d1297849a7ca83a02f28ff7188ad826751754ce7 -r cd8b8aba3bfd94931c8ec1b1d214a5d12e2b9a8e 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 @@ -376,7 +376,7 @@ <th>Total dollars earned</th></tr> {dataModel.clientDataSortedByPriority: {clientData| - <tr align='center' bgcolor='#{if (clientData.priority==dataModel.priority)}FFFFCC{else}CCCCCC{endif}'> + <tr align='center' bgcolor='#{if (clientData.self)}FFFFCC{else}CCCCCC{endif}'><td>{clientData.priorityString}</td><td>{self.tokenEndowment}</td><td>{clientData.investedTokens}</td> 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. |