Added documentation, refined exception handling
This commit is contained in:
		@@ -33,8 +33,23 @@ public class Client {
 | 
			
		||||
	private User			sender, recipient;
 | 
			
		||||
	private boolean			online			= false;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Initializes the client. At this state, the client user has yet to be
 | 
			
		||||
	 * initialized, which can be done by calling {@link Client#onlineInit(String).
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param config The {@link Config} instance to use in this client
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Client(Config config) { this.config = config; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Enters the online mode by acquiring a user ID from the server.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param userName the name of the client user
 | 
			
		||||
	 * @throws EnvoyException if the online mode could not be entered or the request
 | 
			
		||||
	 *                        failed for some other reason
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void onlineInit(String userName) throws EnvoyException {
 | 
			
		||||
		sender	= getUser(userName);
 | 
			
		||||
		online	= true;
 | 
			
		||||
@@ -52,10 +67,8 @@ public class Client {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns a {@code Map<String, User>} of all users on the server with their
 | 
			
		||||
	 * user names as keys.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @return Sync - List of all users on the server.
 | 
			
		||||
	 * @return a {@code Map<String, User>} of all users on the server with their
 | 
			
		||||
	 *         user names as keys
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Map<String, User> getUsers() {
 | 
			
		||||
@@ -138,9 +151,12 @@ public class Client {
 | 
			
		||||
	 * @param sync   the sync object (yet to be converted from java class to
 | 
			
		||||
	 *               sync.xml)
 | 
			
		||||
	 * @return a returnSync.xml file
 | 
			
		||||
	 * @throws EnvoyException if the client is not in online mode
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Sync sendSync(long userId, Sync sync) {
 | 
			
		||||
	public Sync sendSync(long userId, Sync sync) throws EnvoyException {
 | 
			
		||||
		if(!isOnline())
 | 
			
		||||
			throw new EnvoyException("Client is not in online mode");
 | 
			
		||||
		// Print sync XML to console
 | 
			
		||||
		JAXBContext jc;
 | 
			
		||||
		try {
 | 
			
		||||
@@ -162,6 +178,12 @@ public class Client {
 | 
			
		||||
	 */
 | 
			
		||||
	public User getSender() { return sender; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Sets the client user which is used to send messages.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param sender the client user to set
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setSender(User sender) { this.sender = sender; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -173,7 +195,7 @@ public class Client {
 | 
			
		||||
	/**
 | 
			
		||||
	 * Sets the recipient.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param recipient - the recipient to set
 | 
			
		||||
	 * @param recipient the recipient to set
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setRecipient(User recipient) { this.recipient = recipient; }
 | 
			
		||||
@@ -186,6 +208,7 @@ public class Client {
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return {@code true} if a connection to the server could be established
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public boolean isOnline() { return online; }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -36,10 +36,10 @@ import envoy.schema.User;
 | 
			
		||||
 */
 | 
			
		||||
public class LocalDB {
 | 
			
		||||
 | 
			
		||||
	private File		localDBDir, localDBFile, usersFile;
 | 
			
		||||
	private User		user;
 | 
			
		||||
	private File				localDBDir, localDBFile, usersFile;
 | 
			
		||||
	private User				user;
 | 
			
		||||
	private Map<String, User>	users	= new HashMap<>();
 | 
			
		||||
	private List<Chat>	chats	= new ArrayList<>();
 | 
			
		||||
	private List<Chat>			chats	= new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
	private ObjectFactory	objectFactory	= new ObjectFactory();
 | 
			
		||||
	private DatatypeFactory	datatypeFactory;
 | 
			
		||||
@@ -54,38 +54,38 @@ public class LocalDB {
 | 
			
		||||
	 * Constructs an empty local database. To serialize any chats to the file
 | 
			
		||||
	 * system, call {@link LocalDB#initializeDBFile(File)}.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param localDBDir the directory in which to store users and chats
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public LocalDB(File localDBDir) throws IOException {
 | 
			
		||||
		this.localDBDir = localDBDir;
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		try {
 | 
			
		||||
			datatypeFactory = DatatypeFactory.newInstance();
 | 
			
		||||
		} catch (DatatypeConfigurationException e) {
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		// Initialize local database directory
 | 
			
		||||
		if (localDBDir.exists() && !localDBDir.isDirectory())
 | 
			
		||||
			throw new IOException(String.format("LocalDBDir '%s' is not a directory!", localDBDir.getAbsolutePath()));
 | 
			
		||||
		usersFile	= new File(localDBDir, "users.db");
 | 
			
		||||
		usersFile = new File(localDBDir, "users.db");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Initializes the local database and fills it with values
 | 
			
		||||
	 * if the user has already sent or received messages.
 | 
			
		||||
	 * Creates a database file for a user-specific list of chats.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param localDBDir the directory where we wish to save/load the database from.
 | 
			
		||||
	 * @throws EnvoyException if the directory selected is not an actual directory.
 | 
			
		||||
	 * @throws NullPointerException if the client user is not yet specified
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void initializeDBFile() throws EnvoyException {
 | 
			
		||||
	public void initializeDBFile() {
 | 
			
		||||
		if (user == null) throw new NullPointerException("Client user is null");
 | 
			
		||||
		localDBFile	= new File(localDBDir, user.getID() + ".db");
 | 
			
		||||
		localDBFile = new File(localDBDir, user.getID() + ".db");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Saves the database into a file for future use.
 | 
			
		||||
	 * Stores all users to the local database. If the client user is specified, the
 | 
			
		||||
	 * chats related to this user are stored as well.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @throws IOException if something went wrong during saving
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
@@ -98,30 +98,36 @@ public class LocalDB {
 | 
			
		||||
		write(localDBFile, chats);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Loads all users that are stored in the local database.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @throws EnvoyException if the loading process failed
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	@SuppressWarnings("unchecked")
 | 
			
		||||
	public void loadUsers() throws ClassNotFoundException, IOException { users = read(usersFile, HashMap.class); }
 | 
			
		||||
	public void loadUsers() throws EnvoyException { users = read(usersFile, HashMap.class); }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Loads all chats saved by Envoy for the client user.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @throws EnvoyException         if something fails while loading.
 | 
			
		||||
	 * @throws IOException
 | 
			
		||||
	 * @throws ClassNotFoundException
 | 
			
		||||
	 * @throws EnvoyException if the loading process failed
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	@SuppressWarnings("unchecked")
 | 
			
		||||
	public void loadChats() throws ClassNotFoundException, IOException { chats = read(localDBFile, ArrayList.class); }
 | 
			
		||||
	public void loadChats() throws EnvoyException { chats = read(localDBFile, ArrayList.class); }
 | 
			
		||||
 | 
			
		||||
	private <T> T read(File file, Class<T> serializedClass) throws ClassNotFoundException, IOException {
 | 
			
		||||
	private <T> T read(File file, Class<T> serializedClass) throws EnvoyException {
 | 
			
		||||
		if (file == null) throw new NullPointerException("File is null");
 | 
			
		||||
		try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(file))) {
 | 
			
		||||
			return serializedClass.cast(in.readObject());
 | 
			
		||||
		} catch (ClassNotFoundException | IOException e) {
 | 
			
		||||
			throw e;
 | 
			
		||||
			throw new EnvoyException("Could not load serialized object", e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private <T> void write(File file, T obj) throws IOException {
 | 
			
		||||
		if (file == null) throw new NullPointerException("File is null");
 | 
			
		||||
		if (obj == null) throw new NullPointerException("Object to serialize is null");
 | 
			
		||||
		if (!file.exists()) {
 | 
			
		||||
			file.getParentFile().mkdirs();
 | 
			
		||||
			file.createNewFile();
 | 
			
		||||
@@ -306,7 +312,8 @@ public class LocalDB {
 | 
			
		||||
	public void clearUnreadMessagesSync() { unreadMessagesSync.getMessages().clear(); }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the users
 | 
			
		||||
	 * @return a {@code Map<String, User>} of all users stored locally with their user names as keys
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Map<String, User> getUsers() { return users; }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -238,9 +238,8 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
		contentPane.revalidate();
 | 
			
		||||
 | 
			
		||||
		loadUsersAndChats();
 | 
			
		||||
		
 | 
			
		||||
		if(client.isOnline())
 | 
			
		||||
			startSyncThread(Config.getInstance().getSyncTimeout());
 | 
			
		||||
 | 
			
		||||
		if (client.isOnline()) startSyncThread(Config.getInstance().getSyncTimeout());
 | 
			
		||||
 | 
			
		||||
		contentPane.revalidate();
 | 
			
		||||
	}
 | 
			
		||||
@@ -342,7 +341,11 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
			new Thread(() -> {
 | 
			
		||||
 | 
			
		||||
				// Synchronize
 | 
			
		||||
				localDB.applySync(client.sendSync(client.getSender().getID(), localDB.fillSync(client.getSender().getID())));
 | 
			
		||||
				try {
 | 
			
		||||
					localDB.applySync(client.sendSync(client.getSender().getID(), localDB.fillSync(client.getSender().getID())));
 | 
			
		||||
				} catch (Exception e) {
 | 
			
		||||
					logger.log(Level.SEVERE, "Could not perform sync", e);
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// Process unread messages
 | 
			
		||||
				localDB.addUnreadMessagesToLocalDB();
 | 
			
		||||
 
 | 
			
		||||
@@ -97,7 +97,7 @@ public class Startup {
 | 
			
		||||
		try {
 | 
			
		||||
			localDB.initializeDBFile();
 | 
			
		||||
			localDB.loadChats();
 | 
			
		||||
		} catch (EnvoyException | ClassNotFoundException | IOException e) {
 | 
			
		||||
		} catch (EnvoyException e) {
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
			JOptionPane.showMessageDialog(null,
 | 
			
		||||
					"Error while loading local database: " + e.toString() + "\nChats will not be stored locally.",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user