summaryrefslogtreecommitdiffstats
path: root/Essentials/src/com/earth2me/essentials/storage/AsyncStorageObjectHolder.java
diff options
context:
space:
mode:
Diffstat (limited to 'Essentials/src/com/earth2me/essentials/storage/AsyncStorageObjectHolder.java')
-rw-r--r--Essentials/src/com/earth2me/essentials/storage/AsyncStorageObjectHolder.java141
1 files changed, 141 insertions, 0 deletions
diff --git a/Essentials/src/com/earth2me/essentials/storage/AsyncStorageObjectHolder.java b/Essentials/src/com/earth2me/essentials/storage/AsyncStorageObjectHolder.java
new file mode 100644
index 000000000..bf3301e41
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/storage/AsyncStorageObjectHolder.java
@@ -0,0 +1,141 @@
+package com.earth2me.essentials.storage;
+
+import com.earth2me.essentials.IConf;
+import com.earth2me.essentials.IEssentials;
+import java.io.File;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.logging.Level;
+import org.bukkit.Bukkit;
+
+
+public abstract class AsyncStorageObjectHolder<T extends StorageObject> implements IConf, IStorageObjectHolder<T>
+{
+ private transient T data;
+ private final transient ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
+ private final transient Class<T> clazz;
+ protected final transient IEssentials ess;
+
+ public AsyncStorageObjectHolder(final IEssentials ess, final Class<T> clazz)
+ {
+ this.ess = ess;
+ this.clazz = clazz;
+ try
+ {
+ this.data = clazz.newInstance();
+ }
+ catch (Exception ex)
+ {
+ Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
+ }
+ }
+
+ public T getData()
+ {
+ return data;
+ }
+
+ public void acquireReadLock()
+ {
+ rwl.readLock().lock();
+ }
+
+ public void acquireWriteLock()
+ {
+ while (rwl.getReadHoldCount() > 0)
+ {
+ rwl.readLock().unlock();
+ }
+ rwl.writeLock().lock();
+ rwl.readLock().lock();
+ }
+
+ public void close()
+ {
+ unlock();
+ }
+
+ public void unlock()
+ {
+ if (rwl.isWriteLockedByCurrentThread())
+ {
+ rwl.writeLock().unlock();
+ new StorageObjectDataWriter();
+ }
+ while (rwl.getReadHoldCount() > 0)
+ {
+ rwl.readLock().unlock();
+ }
+ }
+
+ @Override
+ public void reloadConfig()
+ {
+ new StorageObjectDataReader();
+ }
+
+ public abstract File getStorageFile();
+
+
+ private class StorageObjectDataWriter extends AbstractDelayedYamlFileWriter
+ {
+ public StorageObjectDataWriter()
+ {
+ super(ess, getStorageFile());
+ }
+
+ @Override
+ public StorageObject getObject()
+ {
+ acquireReadLock();
+ return getData();
+ }
+
+ @Override
+ public void onFinish()
+ {
+ unlock();
+ }
+ }
+
+
+ private class StorageObjectDataReader extends AbstractDelayedYamlFileReader<T>
+ {
+ public StorageObjectDataReader()
+ {
+ super(ess, getStorageFile(), clazz);
+ }
+
+ @Override
+ public void onStart()
+ {
+ rwl.writeLock().lock();
+ }
+
+ @Override
+ public void onSuccess(final T object)
+ {
+ if (object != null)
+ {
+ data = object;
+ }
+ rwl.writeLock().unlock();
+ }
+
+ @Override
+ public void onException()
+ {
+ if (data == null)
+ {
+ try
+ {
+ data = clazz.newInstance();
+ }
+ catch (Exception ex)
+ {
+ Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex);
+ }
+ }
+ rwl.writeLock().unlock();
+ }
+ }
+}