restored compatibility with envoy common (and envoy server standalone)
This commit is contained in:
		@@ -3,7 +3,9 @@ package envoy.client.data;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
 | 
			
		||||
import envoy.data.*;
 | 
			
		||||
import envoy.event.*;
 | 
			
		||||
import envoy.event.GroupResizeEvent;
 | 
			
		||||
import envoy.event.MessageStatusChangeEvent;
 | 
			
		||||
import envoy.event.NameChangeEvent;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Stores information about the current {@link User} and their {@link Chat}s.
 | 
			
		||||
@@ -19,7 +21,7 @@ import envoy.event.*;
 | 
			
		||||
public abstract class LocalDB {
 | 
			
		||||
 | 
			
		||||
	protected User								user;
 | 
			
		||||
	protected Map<String, User>					users			= new HashMap<>();
 | 
			
		||||
	protected Map<String, Contact>				users			= new HashMap<>();
 | 
			
		||||
	protected List<Chat>						chats			= new ArrayList<>();
 | 
			
		||||
	protected IDGenerator						idGenerator;
 | 
			
		||||
	protected Cache<Message>					messageCache	= new Cache<>();
 | 
			
		||||
@@ -69,12 +71,12 @@ public abstract class LocalDB {
 | 
			
		||||
	 *         user names as keys
 | 
			
		||||
	 * @since Envoy Client v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Map<String, User> getUsers() { return users; }
 | 
			
		||||
	public Map<String, Contact> getUsers() { return users; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param users the users to set
 | 
			
		||||
	 */
 | 
			
		||||
	public void setUsers(Map<String, User> users) { this.users = users; }
 | 
			
		||||
	public void setUsers(Map<String, Contact> users) { this.users = users; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return all saved {@link Chat} objects that list the client user as the
 | 
			
		||||
@@ -161,7 +163,7 @@ public abstract class LocalDB {
 | 
			
		||||
	 * @since Envoy Client v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public void replaceContactName(NameChangeEvent event) {
 | 
			
		||||
		chats.stream().map(Chat::getRecipient).filter(c -> c.getID() == event.getId()).findAny().ifPresent(c -> c.setName(event.get()));
 | 
			
		||||
		chats.stream().map(Chat::getRecipient).filter(c -> c.getID() == event.getID()).findAny().ifPresent(c -> c.setName(event.get()));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -180,10 +182,10 @@ public abstract class LocalDB {
 | 
			
		||||
			.ifPresent(group -> {
 | 
			
		||||
				switch (event.getOperation()) {
 | 
			
		||||
					case ADD:
 | 
			
		||||
						group.getMemberIDs().add(event.get());
 | 
			
		||||
						group.getContacts().add(event.get());
 | 
			
		||||
						break;
 | 
			
		||||
					case REMOVE:
 | 
			
		||||
						group.getMemberIDs().remove(event.get());
 | 
			
		||||
						group.getContacts().remove(event.get());
 | 
			
		||||
						break;
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@ import java.io.IOException;
 | 
			
		||||
import java.net.Socket;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import javax.naming.TimeLimitExceededException;
 | 
			
		||||
@@ -15,7 +16,8 @@ import envoy.client.data.LocalDB;
 | 
			
		||||
import envoy.client.event.SendEvent;
 | 
			
		||||
import envoy.data.*;
 | 
			
		||||
import envoy.event.*;
 | 
			
		||||
import envoy.event.ContactOperationEvent.Operation;
 | 
			
		||||
import envoy.event.contact.ContactOperationEvent;
 | 
			
		||||
import envoy.event.contact.ContactSearchResult;
 | 
			
		||||
import envoy.util.EnvoyLog;
 | 
			
		||||
import envoy.util.SerializationUtils;
 | 
			
		||||
 | 
			
		||||
@@ -40,9 +42,9 @@ public class Client implements Closeable {
 | 
			
		||||
	private boolean		online;
 | 
			
		||||
 | 
			
		||||
	// Asynchronously initialized during handshake
 | 
			
		||||
	private volatile User		sender;
 | 
			
		||||
	private volatile Contacts	contacts;
 | 
			
		||||
	private volatile boolean	rejected;
 | 
			
		||||
	private volatile User					sender;
 | 
			
		||||
	private volatile Set<? extends Contact>	contacts;
 | 
			
		||||
	private volatile boolean				rejected;
 | 
			
		||||
 | 
			
		||||
	// Configuration and logging
 | 
			
		||||
	private static final ClientConfig	config	= ClientConfig.getInstance();
 | 
			
		||||
@@ -67,7 +69,6 @@ public class Client implements Closeable {
 | 
			
		||||
	public void performHandshake(LoginCredentials credentials, Cache<Message> receivedMessageCache)
 | 
			
		||||
			throws TimeLimitExceededException, IOException, InterruptedException {
 | 
			
		||||
		if (online) throw new IllegalStateException("Handshake has already been performed successfully");
 | 
			
		||||
 | 
			
		||||
		// Establish TCP connection
 | 
			
		||||
		logger.info(String.format("Attempting connection to server %s:%d...", config.getServer(), config.getPort()));
 | 
			
		||||
		socket = new Socket(config.getServer(), config.getPort());
 | 
			
		||||
@@ -77,8 +78,7 @@ public class Client implements Closeable {
 | 
			
		||||
		receiver = new Receiver(socket.getInputStream());
 | 
			
		||||
 | 
			
		||||
		// Register user creation processor, contact list processor and message cache
 | 
			
		||||
		receiver.registerProcessor(User.class, sender -> this.sender = sender);
 | 
			
		||||
		receiver.registerProcessor(Contacts.class, contacts -> this.contacts = contacts);
 | 
			
		||||
		receiver.registerProcessor(User.class, sender -> { this.sender = sender; contacts = sender.getContacts(); });
 | 
			
		||||
		receiver.registerProcessor(Message.class, receivedMessageCache);
 | 
			
		||||
		receiver.registerProcessor(HandshakeRejectionEvent.class, evt -> { rejected = true; EventBus.getInstance().dispatch(evt); });
 | 
			
		||||
 | 
			
		||||
@@ -92,7 +92,7 @@ public class Client implements Closeable {
 | 
			
		||||
 | 
			
		||||
		// Wait for a maximum of five seconds to acquire the sender object
 | 
			
		||||
		long start = System.currentTimeMillis();
 | 
			
		||||
		while (sender == null || contacts == null) {
 | 
			
		||||
		while (sender == null) {
 | 
			
		||||
 | 
			
		||||
			// Quit immediately after handshake rejection
 | 
			
		||||
			// This method can then be called again
 | 
			
		||||
@@ -151,8 +151,9 @@ public class Client implements Closeable {
 | 
			
		||||
		// Process contact searches
 | 
			
		||||
		receiver.registerProcessor(ContactSearchResult.class, EventBus.getInstance()::dispatch);
 | 
			
		||||
 | 
			
		||||
		receiver.registerProcessor(Contacts.class,
 | 
			
		||||
				contacts -> EventBus.getInstance().dispatch(new ContactOperationEvent(contacts.getContacts().get(0), Operation.ADD)));
 | 
			
		||||
		receiver.registerProcessor(Contact.class,
 | 
			
		||||
				contacts -> EventBus.getInstance()
 | 
			
		||||
					.dispatch(new ContactOperationEvent(contacts.getContacts().iterator().next(), ElementOperation.ADD)));
 | 
			
		||||
 | 
			
		||||
		// Process group size changes
 | 
			
		||||
		receiver.registerProcessor(GroupResizeEvent.class, evt -> { localDB.updateGroup(evt); EventBus.getInstance().dispatch(evt); });
 | 
			
		||||
@@ -218,10 +219,10 @@ public class Client implements Closeable {
 | 
			
		||||
	 *         user names as keys
 | 
			
		||||
	 * @since Envoy Client v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Map<String, User> getUsers() {
 | 
			
		||||
	public Map<String, Contact> getUsers() {
 | 
			
		||||
		checkOnline();
 | 
			
		||||
		Map<String, User> users = new HashMap<>();
 | 
			
		||||
		contacts.getContacts().forEach(u -> users.put(u.getName(), u));
 | 
			
		||||
		Map<String, Contact> users = new HashMap<>();
 | 
			
		||||
		contacts.forEach(u -> users.put(u.getName(), u));
 | 
			
		||||
		return users;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -245,10 +246,10 @@ public class Client implements Closeable {
 | 
			
		||||
	/**
 | 
			
		||||
	 * Sets the client user which is used to send messages.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param sender the client user to set
 | 
			
		||||
	 * @param clientUser the client user to set
 | 
			
		||||
	 * @since Envoy Client v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setSender(User sender) { this.sender = sender; }
 | 
			
		||||
	public void setSender(User clientUser) { this.sender = clientUser; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the {@link Receiver} used by this {@link Client}
 | 
			
		||||
@@ -265,11 +266,11 @@ public class Client implements Closeable {
 | 
			
		||||
	 * @return the contacts of this {@link Client}
 | 
			
		||||
	 * @since Envoy Client v0.3-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Contacts getContacts() { return contacts; }
 | 
			
		||||
	public Set<? extends Contact> getContacts() { return contacts; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param contacts the contacts to set
 | 
			
		||||
	 * @since Envoy Client v0.3-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setContacts(Contacts contacts) { this.contacts = contacts; }
 | 
			
		||||
	public void setContacts(Set<? extends Contact> contacts) { this.contacts = contacts; }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@ package envoy.client.net;
 | 
			
		||||
import java.util.function.Consumer;
 | 
			
		||||
 | 
			
		||||
import envoy.client.data.LocalDB;
 | 
			
		||||
import envoy.data.User;
 | 
			
		||||
import envoy.event.EventBus;
 | 
			
		||||
import envoy.event.UserStatusChangeEvent;
 | 
			
		||||
 | 
			
		||||
@@ -26,7 +27,7 @@ public class UserStatusChangeProcessor implements Consumer<UserStatusChangeEvent
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void accept(UserStatusChangeEvent evt) {
 | 
			
		||||
		localDB.getUsers().values().stream().filter(u -> u.getID() == evt.getID()).findFirst().get().setStatus(evt.get());
 | 
			
		||||
		localDB.getUsers().values().stream().filter(u -> u.getID() == evt.getID()).map(User.class::cast).findFirst().get().setStatus(evt.get());
 | 
			
		||||
		EventBus.getInstance().dispatch(evt);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,15 +3,16 @@ package envoy.client.ui;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.logging.Level;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import envoy.client.data.Chat;
 | 
			
		||||
import envoy.client.data.LocalDB;
 | 
			
		||||
import envoy.client.event.MessageCreationEvent;
 | 
			
		||||
import envoy.client.net.Client;
 | 
			
		||||
import envoy.client.net.WriteProxy;
 | 
			
		||||
import envoy.data.Contact;
 | 
			
		||||
import envoy.data.Message;
 | 
			
		||||
import envoy.data.MessageBuilder;
 | 
			
		||||
import envoy.data.User;
 | 
			
		||||
import envoy.event.EventBus;
 | 
			
		||||
import envoy.event.MessageStatusChangeEvent;
 | 
			
		||||
import envoy.event.UserStatusChangeEvent;
 | 
			
		||||
@@ -26,7 +27,7 @@ import javafx.scene.input.KeyEvent;
 | 
			
		||||
 * Project: <strong>envoy-client</strong><br>
 | 
			
		||||
 * File: <strong>ChatSceneController.java</strong><br>
 | 
			
		||||
 * Created: <strong>26.03.2020</strong><br>
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author Kai S. K. Engelbart
 | 
			
		||||
 * @since Envoy Client v0.1-beta
 | 
			
		||||
 */
 | 
			
		||||
@@ -39,7 +40,7 @@ public final class ChatSceneController {
 | 
			
		||||
	private ListView<Message> messageList;
 | 
			
		||||
 | 
			
		||||
	@FXML
 | 
			
		||||
	private ListView<User> userList;
 | 
			
		||||
	private ListView<Contact> userList;
 | 
			
		||||
 | 
			
		||||
	@FXML
 | 
			
		||||
	private Button postButton;
 | 
			
		||||
@@ -95,13 +96,13 @@ public final class ChatSceneController {
 | 
			
		||||
		this.writeProxy	= writeProxy;
 | 
			
		||||
 | 
			
		||||
		// TODO: handle offline mode
 | 
			
		||||
		userList.setItems(FXCollections.observableList(client.getContacts().getContacts()));
 | 
			
		||||
		// userList.getItems().addAll(localDB.getChats().stream().map(Chat::getRecipient).collect(Collectors.toList()));
 | 
			
		||||
		// userList.setItems(FXCollections.observableList(client.getContacts()));
 | 
			
		||||
		userList.setItems(FXCollections.observableList(localDB.getUser().getContacts().stream().collect(Collectors.toList())));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@FXML
 | 
			
		||||
	private void userListClicked() {
 | 
			
		||||
		final User user = userList.getSelectionModel().getSelectedItem();
 | 
			
		||||
		final Contact user = userList.getSelectionModel().getSelectedItem();
 | 
			
		||||
		if (user != null && (currentChat == null || user.getID() != currentChat.getRecipient().getID())) {
 | 
			
		||||
			contactLabel.setText(user.getName());
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ import envoy.client.net.Client;
 | 
			
		||||
import envoy.client.net.WriteProxy;
 | 
			
		||||
import envoy.client.ui.container.LoginDialog;
 | 
			
		||||
import envoy.data.Message;
 | 
			
		||||
import envoy.data.User;
 | 
			
		||||
import envoy.data.User.UserStatus;
 | 
			
		||||
import envoy.exception.EnvoyException;
 | 
			
		||||
import envoy.util.EnvoyLog;
 | 
			
		||||
@@ -28,7 +29,7 @@ import javafx.stage.Stage;
 | 
			
		||||
 * Project: <strong>envoy-client</strong><br>
 | 
			
		||||
 * File: <strong>Startup.java</strong><br>
 | 
			
		||||
 * Created: <strong>26.03.2020</strong><br>
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author Kai S. K. Engelbart
 | 
			
		||||
 * @since Envoy Client v0.1-beta
 | 
			
		||||
 */
 | 
			
		||||
@@ -121,7 +122,12 @@ public final class Startup extends Application {
 | 
			
		||||
			writeProxy.flushCache();
 | 
			
		||||
		} else
 | 
			
		||||
			// Set all contacts to offline mode
 | 
			
		||||
			localDB.getUsers().values().stream().filter(u -> u != localDB.getUser()).forEach(u -> u.setStatus(UserStatus.OFFLINE));
 | 
			
		||||
			localDB.getUsers()
 | 
			
		||||
				.values()
 | 
			
		||||
				.stream()
 | 
			
		||||
				.filter(u -> u instanceof User && u != localDB.getUser())
 | 
			
		||||
				.map(User.class::cast)
 | 
			
		||||
				.forEach(u -> u.setStatus(UserStatus.OFFLINE));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -164,5 +170,6 @@ public final class Startup extends Application {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@SuppressWarnings("javadoc")
 | 
			
		||||
	public static void main(String[] args) { launch(args); }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package envoy.client.ui;
 | 
			
		||||
 | 
			
		||||
import envoy.data.Contact;
 | 
			
		||||
import envoy.data.User;
 | 
			
		||||
import javafx.scene.control.Label;
 | 
			
		||||
import javafx.scene.control.ListCell;
 | 
			
		||||
@@ -9,22 +10,24 @@ import javafx.scene.layout.VBox;
 | 
			
		||||
 * Project: <strong>envoy-client</strong><br>
 | 
			
		||||
 * File: <strong>UserListCell.java</strong><br>
 | 
			
		||||
 * Created: <strong>28.03.2020</strong><br>
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author Kai S. K. Engelbart
 | 
			
		||||
 * @since Envoy Client v0.1-beta
 | 
			
		||||
 */
 | 
			
		||||
public class UserListCell extends ListCell<User> {
 | 
			
		||||
public class UserListCell extends ListCell<Contact> {
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * {@inheritDoc}
 | 
			
		||||
	 */
 | 
			
		||||
	@Override
 | 
			
		||||
	protected void updateItem(User user, boolean empty) {
 | 
			
		||||
		super.updateItem(user, empty);
 | 
			
		||||
		if (!empty && user != null) {
 | 
			
		||||
			final Label	name	= new Label(user.getName());
 | 
			
		||||
			final Label	status	= new Label(user.getStatus().toString());
 | 
			
		||||
			setGraphic(new VBox(name, status));
 | 
			
		||||
	protected void updateItem(Contact contact, boolean empty) {
 | 
			
		||||
		super.updateItem(contact, empty);
 | 
			
		||||
		if (!empty && contact != null) {
 | 
			
		||||
			final Label name = new Label(contact.getName());
 | 
			
		||||
			if (contact instanceof User) {
 | 
			
		||||
				final Label status = new Label(((User) contact).getStatus().toString());
 | 
			
		||||
				setGraphic(new VBox(name, status));
 | 
			
		||||
			} else setGraphic(new VBox(name));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -65,7 +65,7 @@ public class LoginDialog extends JDialog {
 | 
			
		||||
 | 
			
		||||
	private static final ClientConfig	config				= ClientConfig.getInstance();
 | 
			
		||||
	private static final Logger			logger				= EnvoyLog.getLogger(LoginDialog.class);
 | 
			
		||||
	private static final long			serialVersionUID = 0L;
 | 
			
		||||
	private static final long			serialVersionUID	= 0L;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Displays a dialog enabling the user to enter their user name and password.
 | 
			
		||||
@@ -143,7 +143,7 @@ public class LoginDialog extends JDialog {
 | 
			
		||||
			try {
 | 
			
		||||
				// Try entering offline mode
 | 
			
		||||
				localDB.loadUsers();
 | 
			
		||||
				User clientUser = localDB.getUsers().get(credentials.getIdentifier());
 | 
			
		||||
				User clientUser = (User) localDB.getUsers().get(credentials.getIdentifier());
 | 
			
		||||
				if (clientUser == null) throw new EnvoyException("Could not enter offline mode: user name unknown");
 | 
			
		||||
				client.setSender(clientUser);
 | 
			
		||||
				JOptionPane.showMessageDialog(null,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user