From 3165eca0caddc44d4067c0e9802ae9eb04be4c81 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 10 May 2021 02:06:49 +0300 Subject: [PATCH] refactoring: add mc.utils.pool --- settings.gradle | 1 + utils/build.gradle | 5 ++++ utils/gradle.properties | 2 ++ .../main/java/mc/utils}/pool/Passivable.java | 2 +- .../pool/PassivablePooledObjectFactory.java | 18 +++++++++++ .../mc/utils/pool/WideClassObjectPool.java | 30 +++++++++++++++++++ 6 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 utils/build.gradle create mode 100644 utils/gradle.properties rename {protocol/src/main/java/mc/protocol => utils/src/main/java/mc/utils}/pool/Passivable.java (67%) create mode 100644 utils/src/main/java/mc/utils/pool/PassivablePooledObjectFactory.java create mode 100644 utils/src/main/java/mc/utils/pool/WideClassObjectPool.java diff --git a/settings.gradle b/settings.gradle index b3ac878..20fd988 100644 --- a/settings.gradle +++ b/settings.gradle @@ -10,6 +10,7 @@ rootProject.projectDir.toPath().resolve('gradle.properties').readLines().forEach rootProject.name = map.get('project.name') +include('utils') include('protocol-new') //include('protocol') //include('server') \ No newline at end of file diff --git a/utils/build.gradle b/utils/build.gradle new file mode 100644 index 0000000..7c8a3e4 --- /dev/null +++ b/utils/build.gradle @@ -0,0 +1,5 @@ +apply from: rootDir.toPath().resolve('logic.gradle').toFile() + +dependencies { + implementation libs.objpool +} diff --git a/utils/gradle.properties b/utils/gradle.properties new file mode 100644 index 0000000..dfe1133 --- /dev/null +++ b/utils/gradle.properties @@ -0,0 +1,2 @@ +# suppress inspection "UnusedProperty" for whole file +module.name=utils \ No newline at end of file diff --git a/protocol/src/main/java/mc/protocol/pool/Passivable.java b/utils/src/main/java/mc/utils/pool/Passivable.java similarity index 67% rename from protocol/src/main/java/mc/protocol/pool/Passivable.java rename to utils/src/main/java/mc/utils/pool/Passivable.java index 856f776..2008ce0 100644 --- a/protocol/src/main/java/mc/protocol/pool/Passivable.java +++ b/utils/src/main/java/mc/utils/pool/Passivable.java @@ -1,4 +1,4 @@ -package mc.protocol.pool; +package mc.utils.pool; public interface Passivable { diff --git a/utils/src/main/java/mc/utils/pool/PassivablePooledObjectFactory.java b/utils/src/main/java/mc/utils/pool/PassivablePooledObjectFactory.java new file mode 100644 index 0000000..070a25a --- /dev/null +++ b/utils/src/main/java/mc/utils/pool/PassivablePooledObjectFactory.java @@ -0,0 +1,18 @@ +package mc.utils.pool; + +import org.apache.commons.pool2.BasePooledObjectFactory; +import org.apache.commons.pool2.PooledObject; +import org.apache.commons.pool2.impl.DefaultPooledObject; + +public abstract class PassivablePooledObjectFactory extends BasePooledObjectFactory { + + @Override + public PooledObject wrap(T obj) { + return new DefaultPooledObject<>(obj); + } + + @Override + public void passivateObject(PooledObject pooledObject) { + pooledObject.getObject().passivate(); + } +} diff --git a/utils/src/main/java/mc/utils/pool/WideClassObjectPool.java b/utils/src/main/java/mc/utils/pool/WideClassObjectPool.java new file mode 100644 index 0000000..1b61f91 --- /dev/null +++ b/utils/src/main/java/mc/utils/pool/WideClassObjectPool.java @@ -0,0 +1,30 @@ +package mc.utils.pool; + +import lombok.RequiredArgsConstructor; +import org.apache.commons.pool2.ObjectPool; +import org.apache.commons.pool2.impl.GenericObjectPool; + +import java.util.HashMap; +import java.util.Map; + +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class WideClassObjectPool { + + private final Map mapPool = new HashMap<>(); + + @SuppressWarnings("unused") + public ObjectPool getPool(Class clazz) { + return mapPool.computeIfAbsent(clazz, tClass -> new GenericObjectPool(new WideClassFactory(clazz))); + } + + @RequiredArgsConstructor + private static class WideClassFactory extends PassivablePooledObjectFactory { + + private final Class clazz; + + @Override + public R create() throws Exception { + return clazz.getDeclaredConstructor().newInstance(); + } + } +}