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
	 delvh
					delvh