Added offline mode to Client
+ Saving the user ID in Settings + Loading the user ID from Settings in Client if the server can't be reached
This commit is contained in:
		| @@ -10,6 +10,7 @@ import javax.xml.bind.JAXBContext; | ||||
| import javax.xml.bind.JAXBException; | ||||
| import javax.xml.bind.Marshaller; | ||||
|  | ||||
| import envoy.exception.EnvoyException; | ||||
| import envoy.schema.ObjectFactory; | ||||
| import envoy.schema.Sync; | ||||
| import envoy.schema.User; | ||||
| @@ -29,14 +30,18 @@ public class Client { | ||||
| 	private ObjectFactory	objectFactory	= new ObjectFactory(); | ||||
| 	private Config			config; | ||||
| 	private User			sender, recipient; | ||||
| 	private boolean			online			= false; | ||||
|  | ||||
| 	private static final Logger logger = Logger.getLogger(Client.class.getSimpleName()); | ||||
|  | ||||
| 	public Client(Config config, String username) { | ||||
| 	public Client(Config config, String userName) throws EnvoyException { | ||||
| 		this.config	= config; | ||||
| 		sender		= getUser(username); | ||||
|  | ||||
| 		logger.info("ID: " + sender.getID()); | ||||
| 		sender		= getUser(userName); | ||||
| 		 | ||||
| 		// Update the user ID in the cache | ||||
| 		Settings.getInstance().setUserID(sender.getID()); | ||||
| 		 | ||||
| 		logger.info("Client user ID: " + sender.getID()); | ||||
| 	} | ||||
|  | ||||
| 	private <T, R> R post(String uri, T body, Class<R> responseBodyClass) { | ||||
| @@ -48,7 +53,6 @@ public class Client { | ||||
| 		client.close(); | ||||
|  | ||||
| 		return responseBody; | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| @@ -63,9 +67,7 @@ public class Client { | ||||
| 		user.setID(-1); | ||||
| 		sendSync.getUsers().add(user); | ||||
|  | ||||
| 		Sync returnSendSync = post( | ||||
| 				String | ||||
| 					.format("%s:%d/envoy-server/rest/sync/syncData?userId=%d", config.getServer(), config.getPort(), 0), | ||||
| 		Sync returnSendSync = post(String.format("%s:%d/envoy-server/rest/sync/syncData?userId=%d", config.getServer(), config.getPort(), 0), | ||||
| 				sendSync, | ||||
| 				Sync.class); | ||||
| 		return returnSendSync; | ||||
| @@ -77,29 +79,33 @@ public class Client { | ||||
| 	 *  | ||||
| 	 * @param name - the name of the {@link User} | ||||
| 	 * @return a {@link User} with the specified name | ||||
| 	 * @throws EnvoyException if the server does not return the requested ID | ||||
| 	 * @since Envoy v0.1-alpha | ||||
| 	 */ | ||||
| 	private User getUser(String name) { | ||||
| 	private User getUser(String name) throws EnvoyException { | ||||
| 		// Create a sync with only a user with the requested name | ||||
| 		Sync	senderSync	= objectFactory.createSync(); | ||||
| 		User	user		= objectFactory.createUser(); | ||||
| 		user.setName(name); | ||||
| 		senderSync.getUsers().add(user); | ||||
|  | ||||
| 		Sync returnSenderSync = post( | ||||
| 				String | ||||
| 					.format("%s:%d/envoy-server/rest/sync/syncData?userId=%d", config.getServer(), config.getPort(), 0), | ||||
| 				senderSync, | ||||
| 				Sync.class); | ||||
| 		try { | ||||
| 			Sync sync = post(String.format("%s:%d/envoy-server/rest/sync/syncData?userId=%d", config.getServer(), config.getPort(), 0), | ||||
| 					senderSync, | ||||
| 					Sync.class); | ||||
|  | ||||
| 		User returnSender = objectFactory.createUser(); | ||||
|  | ||||
| 		if (returnSenderSync.getUsers().size() == 1) { | ||||
| 			returnSender = returnSenderSync.getUsers().get(0); | ||||
| 		} else { | ||||
| 			logger.warning("ERROR exiting..."); | ||||
| 			// Expecting a single user with an ID | ||||
| 			if (sync.getUsers().size() == 1) { | ||||
| 				online = true; | ||||
| 				return sync.getUsers().get(0); | ||||
| 			} else throw new EnvoyException("Unexpected response from Envoy Server"); | ||||
| 		} catch (Exception e) { | ||||
| 			logger.warning("Could not connect to server, trying offline mode."); | ||||
| 			if (Settings.getInstance().getUserID() != -1) { | ||||
| 				user.setID(Settings.getInstance().getUserID()); | ||||
| 				return user; | ||||
| 			} else throw new EnvoyException("Could not enter offline mode."); | ||||
| 		} | ||||
|  | ||||
| 		return returnSender; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| @@ -134,7 +140,8 @@ public class Client { | ||||
| 	 * their updated UserStatus to the client.) <br> | ||||
| 	 *  | ||||
| 	 * @param userId the id of the {@link Client} who sends the {@link Sync} | ||||
| 	 * @param sync the sync object (yet to be converted from java class to sync.xml) | ||||
| 	 * @param sync   the sync object (yet to be converted from java class to | ||||
| 	 *               sync.xml) | ||||
| 	 * @return a returnSync.xml file | ||||
| 	 * @since Envoy v0.1-alpha | ||||
| 	 */ | ||||
| @@ -151,10 +158,7 @@ public class Client { | ||||
| 		} | ||||
|  | ||||
| 		// Send sync | ||||
| 		return post(String | ||||
| 			.format("%s:%d/envoy-server/rest/sync/syncData?userId=%d", config.getServer(), config.getPort(), userId), | ||||
| 				sync, | ||||
| 				Sync.class); | ||||
| 		return post(String.format("%s:%d/envoy-server/rest/sync/syncData?userId=%d", config.getServer(), config.getPort(), userId), sync, Sync.class); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| @@ -182,4 +186,9 @@ public class Client { | ||||
| 	 * @since Envoy v0.1-alpha | ||||
| 	 */ | ||||
| 	public boolean hasRecipient() { return recipient != null; } | ||||
|  | ||||
| 	/** | ||||
| 	 * @return {@code true} if a connection to the server could be established | ||||
| 	 */ | ||||
| 	public boolean isOnline() { return online; } | ||||
| } | ||||
|   | ||||
| @@ -27,6 +27,7 @@ public class Settings { | ||||
|  | ||||
| 	// Actual settings accessible by the rest of the application | ||||
| 	private String				username; | ||||
| 	private long				userID; | ||||
| 	private String				email; | ||||
| 	private boolean				enterToSend	= true; | ||||
| 	private Map<String, Theme>	themes; | ||||
| @@ -66,6 +67,7 @@ public class Settings { | ||||
| 	@SuppressWarnings("unchecked") | ||||
| 	private void load() { | ||||
| 		setUsername(prefs.get("username", "")); | ||||
| 		setUserID(prefs.getLong("userID", -1)); | ||||
| 		setEmail(prefs.get("email", "")); | ||||
| 		setEnterToSend(prefs.getBoolean("enterToSend", true)); | ||||
| 		setCurrentTheme(prefs.get("theme", "dark")); | ||||
| @@ -73,9 +75,9 @@ public class Settings { | ||||
| 		// Load themes from theme file | ||||
| 		try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(themeFile))) { | ||||
| 			Object obj = in.readObject(); | ||||
| 			if(obj instanceof HashMap) themes = (Map<String, Theme>) obj; | ||||
| 			if (obj instanceof HashMap) themes = (Map<String, Theme>) obj; | ||||
| 		} catch (IOException | ClassNotFoundException e) { | ||||
| 			themes = new HashMap<>(); | ||||
| 			themes			= new HashMap<>(); | ||||
| 			currentTheme	= "dark"; | ||||
| 			e.printStackTrace(); | ||||
| 		} | ||||
| @@ -90,20 +92,21 @@ public class Settings { | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * updates prefs when save button is clicked | ||||
| 	 * Updates the preferences when the save button is clicked. | ||||
| 	 *  | ||||
| 	 * @throws IOException | ||||
| 	 * @since Envoy v0.2-alpha | ||||
| 	 */ | ||||
| 	public void save() throws IOException{ | ||||
| 	public void save() throws IOException { | ||||
| 		prefs.put("username", getUsername()); | ||||
| 		prefs.putLong("userID", getUserID()); | ||||
| 		prefs.put("email", getEmail()); | ||||
| 		prefs.put("theme", currentTheme); | ||||
| 		prefs.putBoolean("enterToSend", isEnterToSend()); | ||||
| 		 | ||||
|  | ||||
| 		// Save themes to theme file | ||||
| 		themeFile.createNewFile(); | ||||
| 		try(ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(themeFile))) { | ||||
| 		try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(themeFile))) { | ||||
| 			out.writeObject(themes); | ||||
| 		} | ||||
| 	} | ||||
| @@ -145,6 +148,16 @@ public class Settings { | ||||
| 	 */ | ||||
| 	public void setUsername(String username) { this.username = username; } | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the userID | ||||
| 	 */ | ||||
| 	public long getUserID() { return userID; } | ||||
|  | ||||
| 	/** | ||||
| 	 * @param userID the userID to set | ||||
| 	 */ | ||||
| 	public void setUserID(long userID) { this.userID = userID; } | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the email associated with that user. | ||||
| 	 * @since Envoy v0.2-alpha | ||||
|   | ||||
| @@ -16,7 +16,7 @@ import envoy.exception.EnvoyException; | ||||
|  | ||||
| /** | ||||
|  * Starts the Envoy client and prompts the user to enter their name. | ||||
|  *  | ||||
|  * <br> | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>Startup.java</strong><br> | ||||
|  * Created: <strong>12 Oct 2019</strong><br> | ||||
| @@ -48,19 +48,34 @@ public class Startup { | ||||
| 		// Override configuration values with command line arguments | ||||
| 		if (args.length > 0) config.load(args); | ||||
|  | ||||
| 		// Check if all configuration values have been initialized | ||||
| 		if (!config.isInitialized()) { | ||||
| 			logger.severe("Server or port are not defined. Exiting..."); | ||||
| 			JOptionPane.showMessageDialog(null, "Error loading configuration values.", "Configuration error", JOptionPane.ERROR_MESSAGE); | ||||
| 			System.exit(1); | ||||
| 		} | ||||
|  | ||||
| 		// Ask the user for their user name | ||||
| 		String userName = JOptionPane.showInputDialog("Please enter your username"); | ||||
| 		if (userName == null || userName.isEmpty()) { | ||||
| 			logger.severe("User name is not set or empty. Exiting..."); | ||||
| 			System.exit(1); | ||||
| 		} | ||||
| 		Client	client	= new Client(config, userName); | ||||
| 		LocalDB	localDB	= new LocalDB(client.getSender()); | ||||
|  | ||||
| 		// Acquire the client user (with ID) either from the server or from the local | ||||
| 		// cache (Preferences), which triggers offline mode | ||||
| 		Client client; | ||||
| 		try { | ||||
| 			client = new Client(config, userName); | ||||
| 		} catch (Exception e1) { | ||||
| 			logger.log(Level.SEVERE, "Failed to acquire client user ID", e1); | ||||
| 			JOptionPane.showMessageDialog(null, e1.toString(), "Client error", JOptionPane.ERROR_MESSAGE); | ||||
| 			System.exit(1); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		// Load the local database | ||||
| 		LocalDB localDB = new LocalDB(client.getSender()); | ||||
| 		try { | ||||
| 			localDB.initializeDBFile(config.getLocalDB()); | ||||
| 		} catch (EnvoyException e) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user