diff --git a/api/src/main/java/com/instancify/scriptify/api/script/function/ScriptFunctionManager.java b/api/src/main/java/com/instancify/scriptify/api/script/function/ScriptFunctionManager.java index e615048..948a8fe 100644 --- a/api/src/main/java/com/instancify/scriptify/api/script/function/ScriptFunctionManager.java +++ b/api/src/main/java/com/instancify/scriptify/api/script/function/ScriptFunctionManager.java @@ -1,6 +1,7 @@ package com.instancify.scriptify.api.script.function; import com.instancify.scriptify.api.script.function.definition.ScriptFunctionDefinition; +import com.instancify.scriptify.api.script.function.definition.factory.ScriptFunctionDefinitionFactory; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; @@ -11,6 +12,20 @@ */ public interface ScriptFunctionManager { + /** + * Retrieves function definition factory. + * + * @return ScriptFunctionDefinitionFactory + */ + ScriptFunctionDefinitionFactory getFunctionDefinitionFactory(); + + /** + * Set the function definition factory. + * + * @param factory ScriptFunctionDefinitionFactory + */ + void setFunctionDefinitionFactory(ScriptFunctionDefinitionFactory factory); + /** * Retrieves all registered functions. * diff --git a/api/src/main/java/com/instancify/scriptify/api/script/function/definition/factory/ScriptFunctionDefinitionFactory.java b/api/src/main/java/com/instancify/scriptify/api/script/function/definition/factory/ScriptFunctionDefinitionFactory.java new file mode 100644 index 0000000..336a357 --- /dev/null +++ b/api/src/main/java/com/instancify/scriptify/api/script/function/definition/factory/ScriptFunctionDefinitionFactory.java @@ -0,0 +1,19 @@ +package com.instancify.scriptify.api.script.function.definition.factory; + +import com.instancify.scriptify.api.script.function.ScriptFunction; +import com.instancify.scriptify.api.script.function.definition.ScriptFunctionDefinition; + +/** + * Script function definition factory. + * Allows to create custom factory for creating specific definitions. + */ +public interface ScriptFunctionDefinitionFactory { + + /** + * Creates a function definition. + * + * @param function ScriptFunction + * @return ScriptFunctionDefinition + */ + ScriptFunctionDefinition create(ScriptFunction function); +} diff --git a/build.gradle.kts b/build.gradle.kts index f1156d3..2fd6d2e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ java { allprojects { group = "com.instancify.scriptify" - version = "1.4.2-SNAPSHOT" + version = "1.4.3-SNAPSHOT" } subprojects { diff --git a/common/src/main/java/com/instancify/scriptify/common/script/function/CommonFunctionManager.java b/common/src/main/java/com/instancify/scriptify/common/script/function/CommonFunctionManager.java index bc87d18..debcc5e 100644 --- a/common/src/main/java/com/instancify/scriptify/common/script/function/CommonFunctionManager.java +++ b/common/src/main/java/com/instancify/scriptify/common/script/function/CommonFunctionManager.java @@ -1,5 +1,6 @@ package com.instancify.scriptify.common.script.function; +import com.instancify.scriptify.api.script.function.definition.factory.ScriptFunctionDefinitionFactory; import com.instancify.scriptify.common.script.function.impl.crypto.ScriptFunctionBase64Decode; import com.instancify.scriptify.common.script.function.impl.crypto.ScriptFunctionBase64Encode; import com.instancify.scriptify.common.script.function.impl.crypto.ScriptFunctionMD5; @@ -18,6 +19,15 @@ public class CommonFunctionManager extends StandardFunctionManager { public CommonFunctionManager() { + this.init(); + } + + public CommonFunctionManager(ScriptFunctionDefinitionFactory functionDefinitionFactory) { + super(functionDefinitionFactory); + this.init(); + } + + private void init() { this.register(new ScriptFunctionPrint()); this.register(new ScriptFunctionExistsFile()); this.register(new ScriptFunctionDeleteFile()); diff --git a/core/src/main/java/com/instancify/scriptify/core/script/constant/StandardConstantManager.java b/core/src/main/java/com/instancify/scriptify/core/script/constant/StandardConstantManager.java index b460636..d65f4bf 100644 --- a/core/src/main/java/com/instancify/scriptify/core/script/constant/StandardConstantManager.java +++ b/core/src/main/java/com/instancify/scriptify/core/script/constant/StandardConstantManager.java @@ -7,6 +7,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Objects; public class StandardConstantManager implements ScriptConstantManager { @@ -19,6 +20,7 @@ public class StandardConstantManager implements ScriptConstantManager { @Override public void register(ScriptConstant constant) { + Objects.requireNonNull(constant, "constant cannot be null"); if (!constants.containsKey(constant.getName())) { constants.put(constant.getName(), constant); } else { diff --git a/core/src/main/java/com/instancify/scriptify/core/script/function/StandardFunctionManager.java b/core/src/main/java/com/instancify/scriptify/core/script/function/StandardFunctionManager.java index 81e618a..50d220a 100644 --- a/core/src/main/java/com/instancify/scriptify/core/script/function/StandardFunctionManager.java +++ b/core/src/main/java/com/instancify/scriptify/core/script/function/StandardFunctionManager.java @@ -3,16 +3,37 @@ import com.instancify.scriptify.api.script.function.ScriptFunction; import com.instancify.scriptify.api.script.function.ScriptFunctionManager; import com.instancify.scriptify.api.script.function.definition.ScriptFunctionDefinition; -import com.instancify.scriptify.core.script.function.definition.ScriptFunctionDefinitionImpl; +import com.instancify.scriptify.api.script.function.definition.factory.ScriptFunctionDefinitionFactory; +import com.instancify.scriptify.core.script.function.definition.factory.StandardFunctionDefinitionFactory; import org.jetbrains.annotations.UnmodifiableView; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Objects; public class StandardFunctionManager implements ScriptFunctionManager { private final Map functions = new HashMap<>(); + private ScriptFunctionDefinitionFactory functionDefinitionFactory; + + public StandardFunctionManager() { + this(new StandardFunctionDefinitionFactory()); + } + + public StandardFunctionManager(ScriptFunctionDefinitionFactory functionDefinitionFactory) { + this.setFunctionDefinitionFactory(functionDefinitionFactory); + } + + @Override + public ScriptFunctionDefinitionFactory getFunctionDefinitionFactory() { + return functionDefinitionFactory; + } + + @Override + public void setFunctionDefinitionFactory(ScriptFunctionDefinitionFactory functionDefinitionFactory) { + this.functionDefinitionFactory = Objects.requireNonNull(functionDefinitionFactory, "functionDefinitionFactory cannot be null"); + } @Override public @UnmodifiableView Map getFunctions() { @@ -21,8 +42,13 @@ public class StandardFunctionManager implements ScriptFunctionManager { @Override public void register(ScriptFunction function) { + Objects.requireNonNull(function, "function cannot be null"); if (!functions.containsKey(function.getName())) { - functions.put(function.getName(), new ScriptFunctionDefinitionImpl(function)); + ScriptFunctionDefinition definition = functionDefinitionFactory.create(function); + if (definition == null) { + throw new UnsupportedOperationException("Function definition factory has not created definition"); + } + functions.put(function.getName(), definition); } else { throw new IllegalStateException("The function with name '" + function.getName() + "' already exists"); } diff --git a/core/src/main/java/com/instancify/scriptify/core/script/function/definition/factory/StandardFunctionDefinitionFactory.java b/core/src/main/java/com/instancify/scriptify/core/script/function/definition/factory/StandardFunctionDefinitionFactory.java new file mode 100644 index 0000000..e707323 --- /dev/null +++ b/core/src/main/java/com/instancify/scriptify/core/script/function/definition/factory/StandardFunctionDefinitionFactory.java @@ -0,0 +1,14 @@ +package com.instancify.scriptify.core.script.function.definition.factory; + +import com.instancify.scriptify.api.script.function.ScriptFunction; +import com.instancify.scriptify.api.script.function.definition.ScriptFunctionDefinition; +import com.instancify.scriptify.api.script.function.definition.factory.ScriptFunctionDefinitionFactory; +import com.instancify.scriptify.core.script.function.definition.ScriptFunctionDefinitionImpl; + +public class StandardFunctionDefinitionFactory implements ScriptFunctionDefinitionFactory { + + @Override + public ScriptFunctionDefinition create(ScriptFunction function) { + return new ScriptFunctionDefinitionImpl(function); + } +}