Persisting cache in PersistentLocalDb
This commit is contained in:
		| @@ -1,5 +1,6 @@ | |||||||
| package envoy.client.data; | package envoy.client.data; | ||||||
|  |  | ||||||
|  | import java.io.Serializable; | ||||||
| import java.util.LinkedList; | import java.util.LinkedList; | ||||||
| import java.util.Queue; | import java.util.Queue; | ||||||
| import java.util.function.Consumer; | import java.util.function.Consumer; | ||||||
| @@ -18,12 +19,13 @@ import envoy.client.util.EnvoyLog; | |||||||
|  * @author Kai S. K. Engelbart |  * @author Kai S. K. Engelbart | ||||||
|  * @since Envoy v0.3-alpha |  * @since Envoy v0.3-alpha | ||||||
|  */ |  */ | ||||||
| public class Cache<T> implements Consumer<T> { | public class Cache<T> implements Consumer<T>, Serializable { | ||||||
|  |  | ||||||
| 	private final Queue<T>			elements	= new LinkedList<>(); | 	private final Queue<T>			elements	= new LinkedList<>(); | ||||||
| 	private transient Consumer<T>	processor; | 	private transient Consumer<T>	processor; | ||||||
|  |  | ||||||
| 	private static final Logger logger = EnvoyLog.getLogger(Cache.class.getSimpleName()); | 	private static final Logger logger = EnvoyLog.getLogger(Cache.class.getSimpleName()); | ||||||
|  | 	private static final long	serialVersionUID	= 7343544675545545076L; | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Adds an element to the cache. | 	 * Adds an element to the cache. | ||||||
|   | |||||||
| @@ -24,8 +24,8 @@ public abstract class LocalDb { | |||||||
| 	protected Map<String, User>					users	= new HashMap<>(); | 	protected Map<String, User>					users	= new HashMap<>(); | ||||||
| 	protected List<Chat>						chats	= new ArrayList<>(); | 	protected List<Chat>						chats	= new ArrayList<>(); | ||||||
| 	protected IdGenerator						idGenerator; | 	protected IdGenerator						idGenerator; | ||||||
| 	protected Cache<Message>					messageCache; | 	protected Cache<Message>					messageCache	= new Cache<>(); | ||||||
| 	protected Cache<MessageStatusChangeEvent>	statusCache; | 	protected Cache<MessageStatusChangeEvent>	statusCache		= new Cache<>(); | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Initializes a storage space for a user-specific list of chats. | 	 * Initializes a storage space for a user-specific list of chats. | ||||||
| @@ -52,12 +52,12 @@ public abstract class LocalDb { | |||||||
| 	public void loadUsers() throws Exception {} | 	public void loadUsers() throws Exception {} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Loads all chat data of the client user. | 	 * Loads all data of the client user. | ||||||
| 	 * | 	 * | ||||||
| 	 * @throws Exception if the loading process failed | 	 * @throws Exception if the loading process failed | ||||||
| 	 * @since Envoy v0.3-alpha | 	 * @since Envoy v0.3-alpha | ||||||
| 	 */ | 	 */ | ||||||
| 	public void loadChats() throws Exception {} | 	public void loadUserData() throws Exception {} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Loads the ID generator. Any exception thrown during this process is ignored. | 	 * Loads the ID generator. Any exception thrown during this process is ignored. | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ import envoy.util.SerializationUtils; | |||||||
|  */ |  */ | ||||||
| public class PersistentLocalDb extends LocalDb { | public class PersistentLocalDb extends LocalDb { | ||||||
|  |  | ||||||
| 	private File localDBDir, localDBFile, usersFile, idGeneratorFile; | 	private File localDBDir, localDBFile, usersFile, idGeneratorFile, messageCacheFile, statusCacheFile; | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Initializes an empty local database without a directory. All changes made to | 	 * Initializes an empty local database without a directory. All changes made to | ||||||
| @@ -63,7 +63,9 @@ public class PersistentLocalDb extends LocalDb { | |||||||
| 	@Override | 	@Override | ||||||
| 	public void initializeUserStorage() { | 	public void initializeUserStorage() { | ||||||
| 		if (user == null) throw new NullPointerException("Client user is null"); | 		if (user == null) throw new NullPointerException("Client user is null"); | ||||||
| 		localDBFile = new File(localDBDir, user.getId() + ".db"); | 		localDBFile			= new File(localDBDir, user.getId() + ".db"); | ||||||
|  | 		messageCacheFile	= new File(localDBDir, user.getId() + "_message_cache.db"); | ||||||
|  | 		statusCacheFile		= new File(localDBDir, user.getId() + "_status_cache.db"); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	@Override | 	@Override | ||||||
| @@ -71,8 +73,12 @@ public class PersistentLocalDb extends LocalDb { | |||||||
| 		// Save users | 		// Save users | ||||||
| 		SerializationUtils.write(usersFile, users); | 		SerializationUtils.write(usersFile, users); | ||||||
|  |  | ||||||
| 		// Save chats | 		// Save user data | ||||||
| 		if (user != null) SerializationUtils.write(localDBFile, chats); | 		if (user != null) { | ||||||
|  | 			SerializationUtils.write(localDBFile, chats); | ||||||
|  | 			SerializationUtils.write(messageCacheFile, messageCache); | ||||||
|  | 			SerializationUtils.write(statusCacheFile, statusCache); | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		// Save id generator | 		// Save id generator | ||||||
| 		if (hasIdGenerator()) SerializationUtils.write(idGeneratorFile, idGenerator); | 		if (hasIdGenerator()) SerializationUtils.write(idGeneratorFile, idGenerator); | ||||||
| @@ -82,7 +88,11 @@ public class PersistentLocalDb extends LocalDb { | |||||||
| 	public void loadUsers() throws ClassNotFoundException, IOException { users = SerializationUtils.read(usersFile, HashMap.class); } | 	public void loadUsers() throws ClassNotFoundException, IOException { users = SerializationUtils.read(usersFile, HashMap.class); } | ||||||
|  |  | ||||||
| 	@Override | 	@Override | ||||||
| 	public void loadChats() throws ClassNotFoundException, IOException { chats = SerializationUtils.read(localDBFile, ArrayList.class); } | 	public void loadUserData() throws ClassNotFoundException, IOException { | ||||||
|  | 		chats			= SerializationUtils.read(localDBFile, ArrayList.class); | ||||||
|  | 		messageCache	= SerializationUtils.read(messageCacheFile, Cache.class); | ||||||
|  | 		statusCache		= SerializationUtils.read(statusCacheFile, Cache.class); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	@Override | 	@Override | ||||||
| 	public void loadIdGenerator() { | 	public void loadIdGenerator() { | ||||||
|   | |||||||
| @@ -138,7 +138,7 @@ public class Startup { | |||||||
| 		// Initialize chats in local database | 		// Initialize chats in local database | ||||||
| 		try { | 		try { | ||||||
| 			localDb.initializeUserStorage(); | 			localDb.initializeUserStorage(); | ||||||
| 			localDb.loadChats(); | 			localDb.loadUserData(); | ||||||
| 		} catch (FileNotFoundException e) { | 		} catch (FileNotFoundException e) { | ||||||
| 			// The local database file has not yet been created, probably first login | 			// The local database file has not yet been created, probably first login | ||||||
| 		} catch (Exception e) { | 		} catch (Exception e) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user