/*******************************************************************************
* gMix open source project - https://svs.informatik.uni-hamburg.de/gmix/
* Copyright (C) 2014 SVS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
package userGeneratedContent.testbedPlugIns.layerPlugIns.layer3outputStrategy.dlpaBasic_v0_001;
import java.util.Arrays;
import java.util.HashMap;
import staticContent.framework.AnonNode;
import staticContent.framework.config.Settings;
import staticContent.framework.interfaces.Layer2RecodingSchemeMix;
import staticContent.framework.message.MixMessage;
import staticContent.framework.message.Reply;
import staticContent.framework.message.Request;
import staticContent.framework.userDatabase.User;
import staticContent.framework.userDatabase.UserDatabase;
public class OutputSlot {
private AnonNode anonNode;
private HashMap<User, MixMessage> messagesToSend;
private boolean isRequestSlot;
private long timeOfOutput;
private Settings settings;
private UserDatabase userDatabase;
private Layer2RecodingSchemeMix recodingScheme;
public OutputSlot(boolean isRequestSlot, long timeOfOutput, AnonNode anonNode) {
this.settings = anonNode.getSettings();
this.userDatabase = anonNode.getUserDatabase();
this.messagesToSend = new HashMap<User, MixMessage>(settings.getPropertyAsInt("DLPA_BASIC_DEFAULT_SLOT_SIZE"));
this.isRequestSlot = isRequestSlot;
this.timeOfOutput = timeOfOutput;
this.anonNode = anonNode;
this.recodingScheme = anonNode.getRecodingLayerControllerMix();
}
public boolean isUsedBy(User user) {
synchronized (userDatabase) {
return messagesToSend.containsKey(user);
}
}
public void addMessage(MixMessage mixMessage) {
synchronized (userDatabase) {
messagesToSend.put(mixMessage.getOwner(), mixMessage);
}
}
public void putOutMessages() {
// create dummies if needed
int normalMessages;
int dummyCounter = 0;
synchronized (userDatabase) { // TODO: remove
normalMessages = messagesToSend.size();
User[] users = userDatabase.getAllUsers();
for (User user: users) {
MixMessage mixMessage = messagesToSend.get(user);
if (mixMessage == null) {
if (isRequestSlot)
mixMessage = recodingScheme.generateDummy(user);
else
mixMessage = recodingScheme.generateDummyReply(user);
dummyCounter++;
}
messagesToSend.put(user, mixMessage);
}
System.out.println("Mix " +anonNode.PUBLIC_PSEUDONYM +" putting out slot (" +dummyCounter +" dummies and " +normalMessages +" normal messages)"); // TODO: remove
MixMessage[] messages = isRequestSlot ? messagesToSend.values().toArray(new Request[0]): messagesToSend.values().toArray(new Reply[0]);
Arrays.sort(messages);
// send messages
if (isRequestSlot) {
for (MixMessage request: messages)
anonNode.putOutRequest((Request) request);
} else {
for (MixMessage reply: messages)
anonNode.putOutReply((Reply) reply);
}
messagesToSend.clear();
}
}
public int getNumerOfMessagesContained() {
synchronized (userDatabase) {
return messagesToSend.size();
}
}
public long getTimeOfOutput() {
synchronized (userDatabase) {
return timeOfOutput;
}
}
}