@@ -40,7 +40,7 @@ public class Startup {
 | 
			
		||||
		items.put("homeDirectory",
 | 
			
		||||
				new ConfigItem<>("homeDirectory", "h", File::new, new File(System.getProperty("user.home"), ".envoy-server"), true));
 | 
			
		||||
		items.put("fileLevelBarrier", new ConfigItem<>("fileLevelBarrier", "fb", Level::parse, Level.SEVERE, true));
 | 
			
		||||
		items.put("consoleLevelBarrier", new ConfigItem<>("consoleLevelBarrier", "cb", Level::parse, Level.INFO, true));
 | 
			
		||||
		items.put("consoleLevelBarrier", new ConfigItem<>("consoleLevelBarrier", "cb", Level::parse, Level.FINE, true));
 | 
			
		||||
 | 
			
		||||
		final var config = new Config();
 | 
			
		||||
		config.load(items);
 | 
			
		||||
 
 | 
			
		||||
@@ -4,12 +4,14 @@ import java.io.ByteArrayInputStream;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.ObjectInputStream;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import com.jenkov.nioserver.IMessageProcessor;
 | 
			
		||||
import com.jenkov.nioserver.Message;
 | 
			
		||||
import com.jenkov.nioserver.WriteProxy;
 | 
			
		||||
 | 
			
		||||
import envoy.server.processors.ObjectProcessor;
 | 
			
		||||
import envoy.util.EnvoyLog;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Handles incoming objects.<br>
 | 
			
		||||
@@ -25,6 +27,8 @@ public class ObjectMessageProcessor implements IMessageProcessor {
 | 
			
		||||
 | 
			
		||||
	private final Set<ObjectProcessor<?>> processors;
 | 
			
		||||
 | 
			
		||||
	private static final Logger logger = EnvoyLog.getLogger(ObjectMessageProcessor.class);
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * The constructor to set the {@link ObjectProcessor}s.
 | 
			
		||||
	 *
 | 
			
		||||
@@ -39,11 +43,11 @@ public class ObjectMessageProcessor implements IMessageProcessor {
 | 
			
		||||
		try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(message.sharedArray, message.offset + 4, message.length - 4))) {
 | 
			
		||||
			Object obj = in.readObject();
 | 
			
		||||
			if (obj == null) {
 | 
			
		||||
				System.out.println("received a null object");
 | 
			
		||||
				logger.warning("Received a null object");
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			System.out.println("Read object: " + obj);
 | 
			
		||||
			logger.fine("Received " + obj);
 | 
			
		||||
 | 
			
		||||
			// Process object
 | 
			
		||||
			processors.stream().filter(p -> p.getInputClass().isInstance(obj)).forEach((@SuppressWarnings("rawtypes") ObjectProcessor p) -> {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,12 @@
 | 
			
		||||
package envoy.server.net;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import com.jenkov.nioserver.Message;
 | 
			
		||||
import com.jenkov.nioserver.WriteProxy;
 | 
			
		||||
 | 
			
		||||
import envoy.util.EnvoyLog;
 | 
			
		||||
import envoy.util.SerializationUtils;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -21,6 +23,8 @@ public class ObjectWriteProxy {
 | 
			
		||||
 | 
			
		||||
	private final WriteProxy writeProxy;
 | 
			
		||||
 | 
			
		||||
	private static final Logger logger = EnvoyLog.getLogger(ObjectWriteProxy.class);
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Creates an instance of {@link ObjectWriteProxy}.
 | 
			
		||||
	 *
 | 
			
		||||
@@ -40,7 +44,7 @@ public class ObjectWriteProxy {
 | 
			
		||||
		final Message response = writeProxy.getMessage();
 | 
			
		||||
		response.socketId = recipientSocketID;
 | 
			
		||||
 | 
			
		||||
		System.out.println("Sending object " + obj);
 | 
			
		||||
		logger.fine("Sending " + obj);
 | 
			
		||||
 | 
			
		||||
		// Serialize object to byte array
 | 
			
		||||
		final byte[] objBytes = SerializationUtils.writeToByteArray(obj);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,14 @@
 | 
			
		||||
package envoy.server.processors;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import envoy.event.ElementOperation;
 | 
			
		||||
import envoy.event.contact.ContactOperationEvent;
 | 
			
		||||
import envoy.server.data.PersistenceManager;
 | 
			
		||||
import envoy.server.net.ConnectionManager;
 | 
			
		||||
import envoy.server.net.ObjectWriteProxy;
 | 
			
		||||
import envoy.util.EnvoyLog;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Project: <strong>envoy-server-standalone</strong><br>
 | 
			
		||||
@@ -19,6 +21,7 @@ import envoy.server.net.ObjectWriteProxy;
 | 
			
		||||
public class ContactOperationProcessor implements ObjectProcessor<ContactOperationEvent> {
 | 
			
		||||
 | 
			
		||||
	private static final ConnectionManager connectionManager = ConnectionManager.getInstance();
 | 
			
		||||
	private static final Logger				logger				= EnvoyLog.getLogger(ContactOperationProcessor.class);
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void process(ContactOperationEvent evt, long socketId, ObjectWriteProxy writeProxy) throws IOException {
 | 
			
		||||
@@ -27,7 +30,7 @@ public class ContactOperationProcessor implements ObjectProcessor<ContactOperati
 | 
			
		||||
				final long userID = ConnectionManager.getInstance().getUserIdBySocketId(socketId);
 | 
			
		||||
				final long contactId = evt.get().getID();
 | 
			
		||||
 | 
			
		||||
				System.out.printf("Adding user %s to the contact list of user %d.%n", evt.get(), userID);
 | 
			
		||||
				logger.fine(String.format("Adding user %s to the contact list of user %d.%n", evt.get(), userID));
 | 
			
		||||
				PersistenceManager.getInstance().addUserContact(userID, contactId);
 | 
			
		||||
 | 
			
		||||
				// Notify the contact if online
 | 
			
		||||
@@ -36,7 +39,7 @@ public class ContactOperationProcessor implements ObjectProcessor<ContactOperati
 | 
			
		||||
							new ContactOperationEvent(PersistenceManager.getInstance().getUserByID(userID).toCommon(), ElementOperation.ADD));
 | 
			
		||||
				break;
 | 
			
		||||
			default:
 | 
			
		||||
				System.err.printf("Received %s with an unsupported operation.%n", evt);
 | 
			
		||||
				logger.warning(String.format("Received %s with an unsupported operation.%n", evt));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ package envoy.server.processors;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import javax.persistence.EntityExistsException;
 | 
			
		||||
 | 
			
		||||
@@ -11,6 +12,7 @@ import envoy.event.MessageStatusChangeEvent;
 | 
			
		||||
import envoy.server.data.PersistenceManager;
 | 
			
		||||
import envoy.server.net.ConnectionManager;
 | 
			
		||||
import envoy.server.net.ObjectWriteProxy;
 | 
			
		||||
import envoy.util.EnvoyLog;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Project: <strong>envoy-server-standalone</strong><br>
 | 
			
		||||
@@ -22,6 +24,8 @@ import envoy.server.net.ObjectWriteProxy;
 | 
			
		||||
 */
 | 
			
		||||
public class GroupMessageProcessor implements ObjectProcessor<GroupMessage> {
 | 
			
		||||
 | 
			
		||||
	private static final Logger logger = EnvoyLog.getLogger(GroupCreationProcessor.class);
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void process(GroupMessage groupMessage, long socketID, ObjectWriteProxy writeProxy) {
 | 
			
		||||
		groupMessage.nextStatus();
 | 
			
		||||
@@ -29,7 +33,7 @@ public class GroupMessageProcessor implements ObjectProcessor<GroupMessage> {
 | 
			
		||||
		try {
 | 
			
		||||
			writeProxy.write(socketID, new MessageStatusChangeEvent(groupMessage));
 | 
			
		||||
		} catch (IOException e) {
 | 
			
		||||
			System.err.println("Could not send messageStatusChangeEvent to the sender of this groupMessage with ID: " + groupMessage.getID());
 | 
			
		||||
			logger.warning("Could not send messageStatusChangeEvent to the sender of this groupMessage with ID: " + groupMessage.getID());
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -48,7 +52,7 @@ public class GroupMessageProcessor implements ObjectProcessor<GroupMessage> {
 | 
			
		||||
		try {
 | 
			
		||||
			PersistenceManager.getInstance().addMessage(new envoy.server.data.GroupMessage(groupMessage, new Date()));
 | 
			
		||||
		} catch (EntityExistsException e) {
 | 
			
		||||
			System.err.println("Received a groupMessage with an ID that already exists");
 | 
			
		||||
			logger.warning("Received a groupMessage with an ID that already exists");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -57,7 +61,7 @@ public class GroupMessageProcessor implements ObjectProcessor<GroupMessage> {
 | 
			
		||||
			// If recipient is online, send the groupMessage directly
 | 
			
		||||
			writeProxy.write(connectionManager.getSocketId(memberID), groupMessage);
 | 
			
		||||
		} catch (IOException e) {
 | 
			
		||||
			System.err.println("Recipient online. Failed to send message" + groupMessage.getID());
 | 
			
		||||
			logger.warning("Recipient online. Failed to send message" + groupMessage.getID());
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,14 @@
 | 
			
		||||
package envoy.server.processors;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import envoy.data.IDGenerator;
 | 
			
		||||
import envoy.event.IDGeneratorRequest;
 | 
			
		||||
import envoy.server.data.ConfigItem;
 | 
			
		||||
import envoy.server.data.PersistenceManager;
 | 
			
		||||
import envoy.server.net.ObjectWriteProxy;
 | 
			
		||||
import envoy.util.EnvoyLog;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Project: <strong>envoy-server-standalone</strong><br>
 | 
			
		||||
@@ -20,15 +22,16 @@ import envoy.server.net.ObjectWriteProxy;
 | 
			
		||||
public class IDGeneratorRequestProcessor implements ObjectProcessor<IDGeneratorRequest> {
 | 
			
		||||
 | 
			
		||||
	private static final long ID_RANGE = 200;
 | 
			
		||||
	private static final Logger	logger		= EnvoyLog.getLogger(IDGeneratorRequestProcessor.class);
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Class<IDGeneratorRequest> getInputClass() { return IDGeneratorRequest.class; }
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void process(IDGeneratorRequest input, long socketID, ObjectWriteProxy writeProxy) throws IOException {
 | 
			
		||||
		System.out.println("Received id generation request.");
 | 
			
		||||
		logger.fine("Received id generation request.");
 | 
			
		||||
		var generator = createIDGenerator();
 | 
			
		||||
		System.out.println("Sending new id generator " + generator);
 | 
			
		||||
		logger.info("Sending new id generator " + generator);
 | 
			
		||||
		writeProxy.write(socketID, generator);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ package envoy.server.processors;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import javax.persistence.NoResultException;
 | 
			
		||||
 | 
			
		||||
@@ -15,6 +16,7 @@ import envoy.server.data.Message;
 | 
			
		||||
import envoy.server.data.PersistenceManager;
 | 
			
		||||
import envoy.server.net.ConnectionManager;
 | 
			
		||||
import envoy.server.net.ObjectWriteProxy;
 | 
			
		||||
import envoy.util.EnvoyLog;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This {@link ObjectProcessor} handles {@link LoginCredentials}.<br>
 | 
			
		||||
@@ -32,16 +34,18 @@ public class LoginCredentialProcessor implements ObjectProcessor<LoginCredential
 | 
			
		||||
	private final PersistenceManager	persistenceManager	= PersistenceManager.getInstance();
 | 
			
		||||
	private final ConnectionManager		connectionManager	= ConnectionManager.getInstance();
 | 
			
		||||
 | 
			
		||||
	private static final Logger logger = EnvoyLog.getLogger(LoginCredentialProcessor.class);
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void process(LoginCredentials input, long socketID, ObjectWriteProxy writeProxy) throws IOException {
 | 
			
		||||
		UserStatusChangeProcessor.setWriteProxy(writeProxy);
 | 
			
		||||
		System.out.println(String.format("Received login credentials %s from socket ID %d", input, socketID));
 | 
			
		||||
		logger.info(String.format("Received login credentials %s from socket ID %d", input, socketID));
 | 
			
		||||
 | 
			
		||||
		envoy.server.data.User user = getUser(input, socketID, writeProxy);
 | 
			
		||||
 | 
			
		||||
		// Not logged in successfully
 | 
			
		||||
		if (user == null) {
 | 
			
		||||
			System.out.println("Rejecting handshake on socket " + socketID);
 | 
			
		||||
			logger.info("Rejecting handshake on socket " + socketID);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		connectionManager.registerUser(user.getID(), socketID);
 | 
			
		||||
@@ -52,25 +56,25 @@ public class LoginCredentialProcessor implements ObjectProcessor<LoginCredential
 | 
			
		||||
		UserStatusChangeProcessor.updateUserStatus(user);
 | 
			
		||||
 | 
			
		||||
		// Complete handshake
 | 
			
		||||
		System.out.println("Sending user...");
 | 
			
		||||
		logger.fine("Sending user...");
 | 
			
		||||
		writeProxy.write(socketID, user.toCommon());
 | 
			
		||||
		System.out.println("Acquiring pending messages for the client...");
 | 
			
		||||
		logger.fine("Acquiring pending messages for the client...");
 | 
			
		||||
		List<Message> pendingMessages = PersistenceManager.getInstance().getPendingMessages(user);
 | 
			
		||||
		for (Message msg : pendingMessages)
 | 
			
		||||
			if (msg.getStatus() == MessageStatus.SENT) {
 | 
			
		||||
				System.out.println("Sending message " + msg.toCommon());
 | 
			
		||||
				logger.info("Sending message " + msg.toCommon());
 | 
			
		||||
				writeProxy.write(socketID, msg.toCommon());
 | 
			
		||||
				msg.setReceivedDate(new Date());
 | 
			
		||||
				msg.setStatus(MessageStatus.RECEIVED);
 | 
			
		||||
				if (connectionManager.isOnline(msg.getSender().getID())) {
 | 
			
		||||
					var evt = new MessageStatusChangeEvent(msg.toCommon());
 | 
			
		||||
					System.out.println("Sending messageStatusChangeEvent to sender " + evt);
 | 
			
		||||
					logger.info("Sending messageStatusChangeEvent to sender " + evt);
 | 
			
		||||
					writeProxy.write(connectionManager.getSocketId(msg.getSender().getID()), evt);
 | 
			
		||||
				}
 | 
			
		||||
				PersistenceManager.getInstance().updateMessage(msg);
 | 
			
		||||
			} else {
 | 
			
		||||
				var evt = new MessageStatusChangeEvent(msg.toCommon());
 | 
			
		||||
				System.out.println("Sending messageStatusChangeEvent " + evt);
 | 
			
		||||
				logger.info("Sending messageStatusChangeEvent " + evt);
 | 
			
		||||
				writeProxy.write(socketID, evt);
 | 
			
		||||
			}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ package envoy.server.processors;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import javax.persistence.EntityExistsException;
 | 
			
		||||
 | 
			
		||||
@@ -11,6 +12,7 @@ import envoy.event.MessageStatusChangeEvent;
 | 
			
		||||
import envoy.server.data.PersistenceManager;
 | 
			
		||||
import envoy.server.net.ConnectionManager;
 | 
			
		||||
import envoy.server.net.ObjectWriteProxy;
 | 
			
		||||
import envoy.util.EnvoyLog;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This {@link ObjectProcessor} handles incoming {@link Message}s.<br>
 | 
			
		||||
@@ -25,6 +27,8 @@ import envoy.server.net.ObjectWriteProxy;
 | 
			
		||||
 */
 | 
			
		||||
public class MessageProcessor implements ObjectProcessor<Message> {
 | 
			
		||||
 | 
			
		||||
	private static final Logger logger = EnvoyLog.getLogger(MessageProcessor.class);
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void process(Message message, long socketID, ObjectWriteProxy writeProxy) {
 | 
			
		||||
		message.nextStatus();
 | 
			
		||||
@@ -36,14 +40,14 @@ public class MessageProcessor implements ObjectProcessor<Message> {
 | 
			
		||||
			try {
 | 
			
		||||
				writeProxy.write(socketID, new MessageStatusChangeEvent(message));
 | 
			
		||||
			} catch (IOException e) {
 | 
			
		||||
				System.err.println("Could not send messageStatusChangeEvent to the sender of this message with ID: " + message.getID());
 | 
			
		||||
				logger.warning("Could not send messageStatusChangeEvent to the sender of this message with ID: " + message.getID());
 | 
			
		||||
				e.printStackTrace();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		try {
 | 
			
		||||
			PersistenceManager.getInstance().addMessage(new envoy.server.data.Message(message));
 | 
			
		||||
		} catch (EntityExistsException e) {
 | 
			
		||||
			System.err.println("Received a message with an id that already exists");
 | 
			
		||||
			logger.warning("Received a message with an id that already exists");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -54,9 +58,8 @@ public class MessageProcessor implements ObjectProcessor<Message> {
 | 
			
		||||
			// Update the message status to RECEIVED
 | 
			
		||||
			message.setReceivedDate(new Date());
 | 
			
		||||
			message.nextStatus();
 | 
			
		||||
 | 
			
		||||
		} catch (IOException e) {
 | 
			
		||||
			System.err.println("Recipient online. Failed to send message" + message.getID());
 | 
			
		||||
			logger.warning("Recipient online. Failed to send message" + message.getID());
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package envoy.server.processors;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import envoy.data.User.UserStatus;
 | 
			
		||||
import envoy.event.UserStatusChangeEvent;
 | 
			
		||||
@@ -8,6 +9,7 @@ import envoy.server.data.PersistenceManager;
 | 
			
		||||
import envoy.server.data.User;
 | 
			
		||||
import envoy.server.net.ConnectionManager;
 | 
			
		||||
import envoy.server.net.ObjectWriteProxy;
 | 
			
		||||
import envoy.util.EnvoyLog;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This processor handles incoming {@link UserStatusChangeEvent}.<br>
 | 
			
		||||
@@ -24,6 +26,8 @@ public class UserStatusChangeProcessor implements ObjectProcessor<UserStatusChan
 | 
			
		||||
	private static ObjectWriteProxy		writeProxy;
 | 
			
		||||
	private static PersistenceManager	persistenceManager	= PersistenceManager.getInstance();
 | 
			
		||||
 | 
			
		||||
	private static final Logger logger = EnvoyLog.getLogger(UserStatusChangeProcessor.class);
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Class<UserStatusChangeEvent> getInputClass() { return UserStatusChangeEvent.class; }
 | 
			
		||||
 | 
			
		||||
@@ -31,11 +35,10 @@ public class UserStatusChangeProcessor implements ObjectProcessor<UserStatusChan
 | 
			
		||||
	public void process(UserStatusChangeEvent input, long socketID, ObjectWriteProxy writeProxy) throws IOException {
 | 
			
		||||
		// new status should not equal old status
 | 
			
		||||
		if (input.get().equals(persistenceManager.getUserByID(input.getID()).getStatus())) {
 | 
			
		||||
			System.out.println("Received an unnecessary UserStatusChangeEvent");
 | 
			
		||||
			logger.warning("Received an unnecessary UserStatusChangeEvent");
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		updateUserStatus(input);
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -47,10 +50,11 @@ public class UserStatusChangeProcessor implements ObjectProcessor<UserStatusChan
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	public static void updateUserStatus(User user) {
 | 
			
		||||
		// handling for newly logged in clients
 | 
			
		||||
 | 
			
		||||
		// Handling for newly logged in clients
 | 
			
		||||
		persistenceManager.updateContact(user);
 | 
			
		||||
 | 
			
		||||
		// handling for contacts that are already online
 | 
			
		||||
		// Handling for contacts that are already online
 | 
			
		||||
		notifyContacts(user);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -75,7 +79,7 @@ public class UserStatusChangeProcessor implements ObjectProcessor<UserStatusChan
 | 
			
		||||
				if (connectionManager.isOnline(contact.getID())) writeProxy.write(connectionManager.getSocketId(contact.getID()), evt);
 | 
			
		||||
		} catch (IOException e) {
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
			System.err.println("Could not notify online contacts of user " + evt.getID() + " that his status has been changed");
 | 
			
		||||
			logger.warning("Could not notify online contacts of user " + evt.getID() + " that his status has been changed");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user