[virtualcommons-svn] SF.net SVN: virtualcommons:[484] foraging/trunk/src/main/java/edu/asu/ commons
Status: Beta
Brought to you by:
alllee
From: <db...@us...> - 2010-03-09 00:42:53
|
Revision: 484 http://virtualcommons.svn.sourceforge.net/virtualcommons/?rev=484&view=rev Author: dbarge Date: 2010-03-09 00:42:46 +0000 (Tue, 09 Mar 2010) Log Message: ----------- Issues resolved This version includes changes for 1) Code changes to incorporate the UI improvements/suggestions that came up last meeting 2) Code changes to incorporate the implementation of the simplified version of the sanctioning system. Issues unresolved 1) The field of vision circle is out of sync and not centered. Modified Paths: -------------- foraging/trunk/src/main/java/edu/asu/commons/foraging/client/ClientDataModel.java foraging/trunk/src/main/java/edu/asu/commons/foraging/client/ForagingClient.java foraging/trunk/src/main/java/edu/asu/commons/foraging/client/GameWindow2D.java foraging/trunk/src/main/java/edu/asu/commons/foraging/client/SubjectView.java foraging/trunk/src/main/java/edu/asu/commons/foraging/conf/RoundConfiguration.java foraging/trunk/src/main/java/edu/asu/commons/foraging/model/ClientData.java foraging/trunk/src/main/java/edu/asu/commons/foraging/model/GroupDataModel.java foraging/trunk/src/main/java/edu/asu/commons/foraging/server/ForagingServer.java Added Paths: ----------- foraging/trunk/src/main/java/edu/asu/commons/foraging/event/SanctionRankingRequest.java foraging/trunk/src/main/java/edu/asu/commons/foraging/event/SanctionUpdateEvent.java foraging/trunk/src/main/java/edu/asu/commons/foraging/model/SanctionMechanism.java Modified: foraging/trunk/src/main/java/edu/asu/commons/foraging/client/ClientDataModel.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/client/ClientDataModel.java 2010-03-08 19:01:37 UTC (rev 483) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/client/ClientDataModel.java 2010-03-09 00:42:46 UTC (rev 484) @@ -19,6 +19,7 @@ import edu.asu.commons.foraging.model.GroupDataModel; import edu.asu.commons.foraging.model.RegulationData; import edu.asu.commons.foraging.model.Resource; +import edu.asu.commons.foraging.model.SanctionMechanism; import edu.asu.commons.net.Identifier; import edu.asu.commons.util.Duration; @@ -130,8 +131,10 @@ return groupDataModel.getActiveEnforcementMechanism(); } - - + public SanctionMechanism getActiveSanctionMechanism() { + return groupDataModel.getActiveSanctionMechanism(); + } + public void initialize(GroupDataModel groupDataModel) { clear(); this.groupDataModel = groupDataModel; Modified: foraging/trunk/src/main/java/edu/asu/commons/foraging/client/ForagingClient.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/client/ForagingClient.java 2010-03-08 19:01:37 UTC (rev 483) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/client/ForagingClient.java 2010-03-09 00:42:46 UTC (rev 484) @@ -33,6 +33,7 @@ import edu.asu.commons.foraging.event.RegulationUpdateEvent; import edu.asu.commons.foraging.event.ResetTokenDistributionRequest; import edu.asu.commons.foraging.event.RoundStartedEvent; +import edu.asu.commons.foraging.event.SanctionUpdateEvent; import edu.asu.commons.foraging.event.ShowInstructionsRequest; import edu.asu.commons.foraging.event.SynchronizeClientEvent; import edu.asu.commons.util.Duration; @@ -224,7 +225,6 @@ } }); - addEventProcessor(new EventTypeProcessor<ClientMessageEvent>(ClientMessageEvent.class) { public void handle(ClientMessageEvent event) { gameWindow2D.displayErrorMessage(event.toString(),0); @@ -248,6 +248,13 @@ gameWindow2D.displayActiveRegulation(); } }); + + addEventProcessor(new EventTypeProcessor<SanctionUpdateEvent>(SanctionUpdateEvent.class) { + public void handle(final SanctionUpdateEvent event) { + dataModel.setGroupDataModel(event.getGroupDataModel()); + gameWindow2D.displaySanctionMechanism(); + } + }); } public boolean canPerformRealTimeSanction() { 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-08 19:01:37 UTC (rev 483) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/client/GameWindow2D.java 2010-03-09 00:42:46 UTC (rev 484) @@ -25,8 +25,10 @@ import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; +import javax.swing.ButtonGroup; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextPane; @@ -48,6 +50,7 @@ import edu.asu.commons.foraging.event.QuizCompletedEvent; import edu.asu.commons.foraging.event.RealTimeSanctionRequest; import edu.asu.commons.foraging.event.ResetTokenDistributionRequest; +import edu.asu.commons.foraging.event.SanctionRankingRequest; import edu.asu.commons.foraging.event.SubmitRegulationRequest; import edu.asu.commons.foraging.model.ClientData; import edu.asu.commons.foraging.model.Direction; @@ -67,7 +70,7 @@ * @author <a href='mailto:All...@as...'>Allen Lee</a> * @version $Revision$ */ -public class GameWindow2D extends JPanel implements GameWindow { +public class GameWindow2D extends JPanel implements GameWindow, ActionListener { private static final long serialVersionUID = -7733523846114902166L; @@ -128,6 +131,8 @@ (int) Math.floor(size.getHeight() * 0.85)); subjectView = new SubjectView(subjectViewSize, dataModel); // subjectView.addKeyListener(this); + this.currentRankingInformation = new int [2]; + this.currentRankingInformation[0] = this.currentRankingInformation[1] = -1; initGuiComponents(); } @@ -149,8 +154,16 @@ }); } + public void resetSanctionRanks() { + this.currentRankingInformation[0] = this.currentRankingInformation[1] = -1; + } + + public void sendSanctionDecisionVotes() { + System.out.println("Sanction votes ready to be sent."); + client.transmit(new SanctionRankingRequest(client.getId(), currentRankingInformation)); + resetSanctionRanks(); + } - /** * In certain cases, init() _can_ be called before endRound() is finished. Need to lock * access! @@ -288,6 +301,26 @@ } } + private void startSanctionVotingTimer() { + if (timer == null) { + duration = Duration.create(dataModel.getRoundConfiguration().getSanctionVotingDuration()); + timer = new Timer(1000, new ActionListener() { + public void actionPerformed(ActionEvent event) { + if (duration.hasExpired()) { + timeLeftLabel.setText("Voting is now disabled. Next round begins shortly."); + timer.stop(); + timer = null; + sendSanctionDecisionVotes(); + displayVotingWaitMessage(); + } + else { + timeLeftLabel.setText( String.format("Voting period will now end in %d seconds.", duration.getTimeLeft() / 1000L) ); + } + } + }); + timer.start(); + } + } private void startRegulationSubmissionTimer() { if (timer == null) { @@ -320,7 +353,8 @@ timeLeftLabel.setText("Chat is now disabled."); timer.stop(); timer = null; - initializeRegulationPanel(); + initializeSanctionDecisionPanel(); + //initializeRegulationPanel(); } else { timeLeftLabel.setText( String.format("Chat will end in %d seconds.", duration.getTimeLeft() / 1000L) ); @@ -768,6 +802,19 @@ } }); } + + public void displaySanctionMechanism() { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + System.out.println("Inside display sanction"); + instructionsBuilder.delete(0, instructionsBuilder.length()); + instructionsBuilder.append("<hr/><h2>Sanction choice voted : </h2><hr/><p>").append(dataModel.getActiveSanctionMechanism().getDescription()).append("</p>"); + instructionsBuilder.append("<hr/><h2>Active enforcement mechanism</h2><hr/><p>").append(dataModel.getActiveEnforcementMechanism().getDescription()).append("</p>"); + setInstructions(instructionsBuilder.toString()); + addCenterComponent(instructionsScrollPane); + } + }); + } private void displayVotingWaitMessage() { setInstructions("<h3>Please wait while we finish collecting information from all the participants.</h3>"); @@ -854,7 +901,69 @@ } }); } + + public void actionPerformed (ActionEvent e) { + String choice = group.getSelection().getActionCommand(); + int buttonNo = Integer.parseInt(choice); + System.out.println("Choice : "+choice); + System.out.println("Button : "+buttonNo); + //currentRankingInformation[buttonNo] = 1; + currentRankingInformation[0] = buttonNo; + } + + private JPanel getDecisionPanel() { + + if (decisionPanel == null) { + decisionPanel = new JPanel(new BorderLayout()); + decisionPanel.setBackground(Color.GRAY); + + HtmlEditorPane editorPane = createInstructionsEditorPane(); + JScrollPane scrollPane = new JScrollPane(editorPane); + editorPane.setText(dataModel.getRoundConfiguration().getSanctionInstructions()); + decisionPanel.add(scrollPane, BorderLayout.PAGE_START); + + group = new ButtonGroup(); + + JPanel rankPanel = new JPanel(); + rankPanel.setBackground(Color.WHITE); + rankPanel.setLayout(new BoxLayout (rankPanel, BoxLayout.Y_AXIS)); + rankPanel.setBorder(BorderFactory.createTitledBorder("Voting Options")); + + JLabel sanctionText = new JLabel("Please select one of the below voting options"); + + rankPanel.add(Box.createVerticalStrut(5)); + + rankPanel.add(sanctionText); + + rankPanel.add(Box.createVerticalStrut(8)); + + noSanction = new JRadioButton("No Sanctioning [No one can sanction/reduce tokens]"); + noSanction.setActionCommand("0"); + group.add(noSanction); + noSanction.addActionListener(this); + rankPanel.add(noSanction); + + rankPanel.add(Box.createVerticalStrut(8)); + + sanction = new JRadioButton("Allow Sanctioning [Everyone can sanction each other]"); + sanction.setActionCommand("1"); + group.add(sanction); + sanction.addActionListener(this); + rankPanel.add(sanction); + + decisionPanel.add(rankPanel); + } + group.clearSelection(); + return decisionPanel; + } + + public void initializeSanctionDecisionPanel() { + addCenterComponent(getDecisionPanel()); + startSanctionVotingTimer(); + } + + public void initializeRegulationPanel() { // getRegulationPanel().initialize(); // System.out.println("Initialization done"); @@ -877,6 +986,14 @@ } return submitRegulationPanel; } + + private JPanel decisionPanel; + private ButtonGroup group; + private JRadioButton sanction; + private JRadioButton noSanction; + private int currentRankingInformation[]; + + public void initializeChatPanel() { //new code Modified: foraging/trunk/src/main/java/edu/asu/commons/foraging/client/SubjectView.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/client/SubjectView.java 2010-03-08 19:01:37 UTC (rev 483) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/client/SubjectView.java 2010-03-09 00:42:46 UTC (rev 484) @@ -40,7 +40,7 @@ private final ClientDataModel dataModel; - public final static Color FIELD_OF_VISION_COLOR = new Color(255, 255, 255, 30); + public final static Color FIELD_OF_VISION_COLOR = new Color(255, 255, 255, 150); // associates a Duration with a piece of token consumed at the given Point - // the duration is used to render the token as shrinking. Modified: foraging/trunk/src/main/java/edu/asu/commons/foraging/conf/RoundConfiguration.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/conf/RoundConfiguration.java 2010-03-08 19:01:37 UTC (rev 483) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/conf/RoundConfiguration.java 2010-03-09 00:42:46 UTC (rev 484) @@ -287,6 +287,10 @@ return getIntProperty("chat-duration", 120); } + public int getSanctionVotingDuration() { + return getIntProperty("sanction-voting-duration", 30); + } + public int getRegulationSubmissionDuration() { return getIntProperty("regulation-submission-duration", 60); } @@ -307,10 +311,8 @@ return getIntProperty("enforcement-display-duration", 30); } - - public String getSanctionInstructions() { - return getProperty("sanction-instructions"); + return getProperty("sanction-instructions","<h2>Please read the below mentioned instructions</h2>.<ul> <li> Please make your choice within the next 30 seconds. <li>The votes of all group participants will determine the outcome.</ul>"); } public boolean isAlwaysInExplicitCollectionMode() { Added: foraging/trunk/src/main/java/edu/asu/commons/foraging/event/SanctionRankingRequest.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/event/SanctionRankingRequest.java (rev 0) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/event/SanctionRankingRequest.java 2010-03-09 00:42:46 UTC (rev 484) @@ -0,0 +1,21 @@ +package edu.asu.commons.foraging.event; + +import edu.asu.commons.event.AbstractEvent; +import edu.asu.commons.net.Identifier; + +public class SanctionRankingRequest extends AbstractEvent{ + + private static final long serialVersionUID = 6453457534654365745L; + + private int[] rankings; + + public SanctionRankingRequest(Identifier id, int[] ranking) { + super(id); + this.rankings = ranking; + } + + public int[] getRankings() { + return rankings; + } + +} Added: foraging/trunk/src/main/java/edu/asu/commons/foraging/event/SanctionUpdateEvent.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/event/SanctionUpdateEvent.java (rev 0) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/event/SanctionUpdateEvent.java 2010-03-09 00:42:46 UTC (rev 484) @@ -0,0 +1,21 @@ +package edu.asu.commons.foraging.event; + +import edu.asu.commons.event.AbstractEvent; +import edu.asu.commons.foraging.model.GroupDataModel; +import edu.asu.commons.net.Identifier; + +public class SanctionUpdateEvent extends AbstractEvent{ + + private static final long serialVersionUID = 3456876534653456891L; + + private GroupDataModel groupDataModel; + + public SanctionUpdateEvent(Identifier id, GroupDataModel groupDataModel) { + super(id); + this.groupDataModel = groupDataModel; + } + + public GroupDataModel getGroupDataModel() { + return groupDataModel; + } +} Modified: foraging/trunk/src/main/java/edu/asu/commons/foraging/model/ClientData.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/model/ClientData.java 2010-03-08 19:01:37 UTC (rev 483) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/model/ClientData.java 2010-03-09 00:42:46 UTC (rev 484) @@ -33,6 +33,7 @@ private int[] regulationRankings; private int[] enforcementRankings; + private int[] sanctionRankings; private ForagingRole foragingRole = ForagingRole.HARVEST; @@ -529,6 +530,14 @@ public void setRegulationRankings(int[] regulationRankings) { this.regulationRankings = regulationRankings; } + + public void setSanctionRankings(int[] sanctionRankings) { + this.sanctionRankings = sanctionRankings; + } + + public int[] getSanctionRankings() { + return sanctionRankings; + } public int[] getEnforcementRankings() { return enforcementRankings; 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-08 19:01:37 UTC (rev 483) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/model/GroupDataModel.java 2010-03-09 00:42:46 UTC (rev 484) @@ -22,6 +22,7 @@ import edu.asu.commons.foraging.event.MonitorTaxEvent; import edu.asu.commons.foraging.event.PostRoundSanctionRequest; import edu.asu.commons.foraging.event.RegulationRankingRequest; +import edu.asu.commons.foraging.event.SanctionRankingRequest; import edu.asu.commons.foraging.event.SubmitRegulationRequest; import edu.asu.commons.foraging.event.SynchronizeClientEvent; import edu.asu.commons.foraging.event.TokenCollectedEvent; @@ -63,8 +64,9 @@ private volatile int receivedEnforcementRankings = 0; private volatile int receivedRegulationRankings = 0; - + private volatile int receivedSanctionRankings = 0; private EnforcementMechanism activeEnforcementMechanism = EnforcementMechanism.NONE; + private SanctionMechanism activeSanctionMechanism = SanctionMechanism.NOSANCTION; private RegulationData activeRegulation; private List<ClientData> waitingMonitors; @@ -195,6 +197,10 @@ public void setActiveRegulation(RegulationData activeRegulation) { this.activeRegulation = activeRegulation; } + + public void setActiveEnforcementMechanism(EnforcementMechanism enforcementMechanism) { + this.activeEnforcementMechanism = enforcementMechanism; + } // FIXME: this algorithm is very similar to generateRegulationRankings, extract to other method. public EnforcementMechanism generateEnforcementRankings() { @@ -246,11 +252,52 @@ } return activeEnforcementMechanism; } + + public SanctionMechanism generateSanctionRankings() { + resetSanctionRankingCount(); + // FIXME: change to round config parameter instead? + double[] sanctionVotingTally = new double[SanctionMechanism.values().length]; + Arrays.fill(sanctionVotingTally, 0.0d); + int maxRankingIndex = 0; + double maxRankingValue = 0.0d; + for (ClientData clientData: clients.values()) { + int[] sanctionRankings = clientData.getSanctionRankings(); + System.out.println("Server ranks: "+sanctionRankings[0]+" "+sanctionRankings[1]); + logger.info("XXX: sanction rankings: " + sanctionRankings); + for (int rank = 0; rank < sanctionRankings.length; rank++) { + // 0 is top choice + int actualSanctionIndex = sanctionRankings[rank]; + if (actualSanctionIndex == -1) { + // nothing selected for this rank + continue; + } + sanctionVotingTally[actualSanctionIndex] += rankToValue(rank); + //sanctionVotingTally[actualSanctionIndex] += rankToValue(actualSanctionIndex); + // keep a tally of the max index so we don't have to make another pass. + if (sanctionVotingTally[actualSanctionIndex] > maxRankingValue) { + maxRankingValue = sanctionVotingTally[actualSanctionIndex]; + maxRankingIndex = actualSanctionIndex; + } + } + } + activeSanctionMechanism = SanctionMechanism.get(maxRankingIndex); + logger.info("Active sanction mechanism: " + activeSanctionMechanism.getTitle() + " with rank " + maxRankingValue); + + setActiveEnforcementMechanism(EnforcementMechanism.get(maxRankingIndex)); + logger.info("Active enforcement mechanism: " + activeEnforcementMechanism.getTitle() + " with rank " + maxRankingValue); + + return activeSanctionMechanism; + } + private void resetEnforcementRankingCount() { receivedEnforcementRankings = 0; } + private void resetSanctionRankingCount() { + receivedSanctionRankings = 0; + } + private void resetRegulationRankingCount() { receivedRegulationRankings = 0; } @@ -293,6 +340,7 @@ clearResourceDistribution(); tokensCollectedDuringInterval = 0; activeEnforcementMechanism = EnforcementMechanism.NONE; + activeSanctionMechanism = SanctionMechanism.NOSANCTION; submittedRegulations.clear(); activeMonitor = null; } @@ -669,6 +717,10 @@ return activeEnforcementMechanism; } + public SanctionMechanism getActiveSanctionMechanism() { + return activeSanctionMechanism; + } + public ClientData getActiveMonitor() { return activeMonitor; } @@ -684,6 +736,11 @@ receivedRegulationRankings++; } + public void submitSanctionRanking(SanctionRankingRequest request) { + clients.get(request.getId()).setSanctionRankings(request.getRankings()); + receivedSanctionRankings++; + } + public boolean isRotatingMonitor() { return activeEnforcementMechanism != null && activeEnforcementMechanism.isRotatingMonitor(); } @@ -691,6 +748,10 @@ public boolean hasReceivedAllRegulationRankings() { return receivedRegulationRankings >= clients.size(); } + + public boolean hasReceivedAllSanctionRankings() { + return receivedSanctionRankings >= clients.size(); + } public List<RegulationData> getSubmittedRegulations() { return submittedRegulations; Added: foraging/trunk/src/main/java/edu/asu/commons/foraging/model/SanctionMechanism.java =================================================================== --- foraging/trunk/src/main/java/edu/asu/commons/foraging/model/SanctionMechanism.java (rev 0) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/model/SanctionMechanism.java 2010-03-09 00:42:46 UTC (rev 484) @@ -0,0 +1,35 @@ +package edu.asu.commons.foraging.model; + +public enum SanctionMechanism { + + NOSANCTION("No Sanctioning","Everybody can harvest. Nobody can subtract tokens from others"), + ALLOWSANCTION("Everybody can sanction","Every participant can reduce the tokens of other participants by pressing the number key associated with that participant."); + + + private final String title; + private final String description; + + SanctionMechanism(String title, String description) { + this.title = title; + this.description = description; + } + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + + public static SanctionMechanism get(int index) { + if (index < values().length && index >= 0) { + return values()[index]; + } + System.err.println("Returning NONE. No sanction mechanism for out-of-bounds index: " + index); + return NOSANCTION; +// throw new IllegalArgumentException("No enforcement mechanism for index: " + index); + } + +} 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-08 19:01:37 UTC (rev 483) +++ foraging/trunk/src/main/java/edu/asu/commons/foraging/server/ForagingServer.java 2010-03-09 00:42:46 UTC (rev 484) @@ -51,6 +51,8 @@ import edu.asu.commons.foraging.event.RegulationUpdateEvent; import edu.asu.commons.foraging.event.ResetTokenDistributionRequest; import edu.asu.commons.foraging.event.RoundStartedEvent; +import edu.asu.commons.foraging.event.SanctionRankingRequest; +import edu.asu.commons.foraging.event.SanctionUpdateEvent; import edu.asu.commons.foraging.event.ShowInstructionsRequest; import edu.asu.commons.foraging.event.SubmitRegulationRequest; import edu.asu.commons.foraging.event.SynchronizeClientEvent; @@ -61,6 +63,7 @@ import edu.asu.commons.foraging.model.GroupDataModel; import edu.asu.commons.foraging.model.RegulationData; import edu.asu.commons.foraging.model.ResourceDispenser; +import edu.asu.commons.foraging.model.SanctionMechanism; import edu.asu.commons.foraging.model.ServerDataModel; import edu.asu.commons.foraging.util.ForagingSaveFileConverter; import edu.asu.commons.net.Dispatcher; @@ -299,6 +302,16 @@ } }); + addEventProcessor(new EventTypeProcessor<SanctionRankingRequest>(SanctionRankingRequest.class) { + public void handle(final SanctionRankingRequest 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()); @@ -457,6 +470,13 @@ } } + private void sendSanctionRankingUpdate(GroupDataModel group) { + group.generateSanctionRankings(); + for (Identifier id: group.getClientIdentifiers()) { + transmit(new SanctionUpdateEvent(id, group)); + } + } + private void sendEnforcementUpdate(GroupDataModel group) { group.generateEnforcementRankings(); for (Identifier id: group.getClientIdentifiers()) { @@ -465,6 +485,8 @@ } private void handleEnforcementSanctionRequest(RealTimeSanctionRequest request) { + System.out.println("**************Inside the handleEnforcementSanction"); + ClientData sourceClient = clients.get(request.getSource()); ClientData targetClient = clients.get(request.getTarget()); @@ -579,15 +601,22 @@ } private void handleRealTimeSanctionRequest(RealTimeSanctionRequest request) { + System.out.println("**************Inside the handleRealTimeSanction"); + ClientData targetClient = clients.get(request.getTarget()); ClientData sourceClient = clients.get(request.getSource()); // validate request - boolean invalidSanctionRequest = sourceClient.getCurrentTokens() == 0 || targetClient.getCurrentTokens() == 0 || sourceClient.getGroupDataModel().isResourceDistributionEmpty(); + //FIXME:Added a new test condition to check for the simplified version of sanctioning + boolean invalidSanctionRequest = sourceClient.getCurrentTokens() == 0 || targetClient.getCurrentTokens() == 0 || sourceClient.getGroupDataModel().isResourceDistributionEmpty() || (sourceClient.getGroupDataModel().getActiveSanctionMechanism()== SanctionMechanism.NOSANCTION); if ( invalidSanctionRequest ) { // ignore the sanction request, send a message to the sanctioner. logger.warning("Ignoring token reduction request, sending new client error message event to : " + sourceClient.getId()); - transmit(new ClientMessageEvent(sourceClient.getId(), - String.format("Ignoring token reduction request: # %d does not have any tokens to reduce.", targetClient.getAssignedNumber()))); + if (sourceClient.getGroupDataModel().getActiveSanctionMechanism()== SanctionMechanism.NOSANCTION) + transmit(new ClientMessageEvent(sourceClient.getId(), + String.format("Ignoring token reduction request: Sanctioning not allowed in this round", targetClient.getAssignedNumber()))); + else + transmit(new ClientMessageEvent(sourceClient.getId(), + String.format("Ignoring token reduction request: # %d does not have any tokens to reduce.", targetClient.getAssignedNumber()))); return; } sourceClient.sanctionCost(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |