From e769991440c44cb4d2eaee606ef2ec8ce92f7937 Mon Sep 17 00:00:00 2001 From: Tulis <79586741+Tulis12@users.noreply.github.com> Date: Wed, 13 Aug 2025 19:17:06 +0200 Subject: [PATCH] add: jitpack, MissingParameterException, proper error handling, @Init annotation with useful params, instead of generic ones --- README.md | 129 ++++++++++++ img.png | Bin 0 -> 33404 bytes pom.xml | 10 +- .../{GenericInitializer.java => Init.java} | 4 +- .../Annotations/InitializeCommand.java | 12 -- .../autoinitializer/AutomaticInitializer.java | 184 +++++++++++++----- .../MissingParameterException.java | 7 + 7 files changed, 286 insertions(+), 60 deletions(-) create mode 100644 README.md create mode 100644 img.png rename src/main/java/dev/tulis/autoinitializer/Annotations/{GenericInitializer.java => Init.java} (67%) delete mode 100644 src/main/java/dev/tulis/autoinitializer/Annotations/InitializeCommand.java create mode 100644 src/main/java/dev/tulis/autoinitializer/MissingParameterException.java diff --git a/README.md b/README.md new file mode 100644 index 0000000..5f6246f --- /dev/null +++ b/README.md @@ -0,0 +1,129 @@ +
+ + @TuliAutoInitializer + +
+ +
+ GitHub Created At + GitHub last commit + Jitpack + GitHub Release Date + Made by Tulis +
+ +## What is it? +It's a Java project for initializing classes automatically, +a little like Spring uses Beans. You can avoid a mess like this: + +```java +new Command(); +new Command2(); + +new Event(); +new Event2(); +``` + +and instead use `@Init` annotation to initialize the class (using your constructor configuration) automatically: + +```java +new AutomaticInitializer.Builder() + .setPackageName("(the main package to look for classes)") + .addInitVariable(Integer.class, 123) // You can add as many as you want + .addInitVariable(MyMainClass.class, mainClassObject) // Or none if you want the default constructor + .run(); +``` + +and for the class: + +```java +@Init +public class Test { + public Test(Integer i, MyMainClass myMainClass) { + System.out.println("Hi from test! My int value: " + i); + myMainClass.registerEvent(this); // You can initialize the event here for example! + } +} +``` + +## Installation +Install TuliAutoInitializer by Maven or Gradle using Jitpack, or my self-hosted gitea (on git.tulisiowice.top): + +### Repos: + +```xml + + + jitpack.io + https://jitpack.io + + +``` + +```xml + + + gitea + https://git.tulisiowice.top/api/packages/Tulis/maven + + +``` + +### The package: + +```xml + // Jitpack + com.github.Tulis12 + TuliAutoInitializer + latest-version // If you don't know it, check the Jitpack badge! + +``` + +```xml + // Gitea + dev.tulis + TuliAutoInitializer + latest-version + +``` + +## All annotation's parameters + +### `initializeWithoutParameters = true` +Tries to use the default constructor of class (the one without parameters), defaults to false (using the configuration of the builder). + +```java +@Init(initializeWithoutParameters = true) +public class Test { + public Test() { + System.out.println("Will use this instead!"); + } + + public Test(Integer i1, Integer i2) { + System.out.println("Won't use this!"); + } +} +``` + +The Initializer won't force use of default constructor (for example, if its private), will instead throw `NoSuchMethodException`, `IllegalAccessException` respectively. + +### `initializeOnlyWith = { Integer.class, MyMainClass.class }` +Will use only those two, even if there are more. In case of multiple values with the same class, will take the one first added in the builder, defaults to an empty array (will use the configuration of builder). + +```java +@Init(initializeOnlyWith = { Integer.class, MyMainClass.class }) +public class Test { + public Test(Integer integer, MyMainClass myMainClass) { + System.out.println("Will use this, even if in builder there is more."); + } + + public Test(Integer integer, String string, MyMainClass myMainClass) { + System.out.println("Won't use this!"); + } +} +``` + +Remember, if there is no class (with a value) provided in the builder, but you will try to use it here, the builder will throw `MissingParameterException`. + +## License +Released under the MIT license. \ No newline at end of file diff --git a/img.png b/img.png new file mode 100644 index 0000000000000000000000000000000000000000..89472b8e4c39a89adebcfc9cacce26ddfef5ec4e GIT binary patch literal 33404 zcmeAS@N?(olHy`uVBq!ia0y~yUxV% zQuQiw3m8Da#=fE;F*!T6L?J0PJu}Z%{r&F!>I#`Dw(8-gz6QPp&Z!xh9#uuD!Bu`C z$yM3OmMQA?cD!6R6;>6w1-Ypui3%0DIeEoa6}C!XgRSz4tw6&1N_I9yDQQ+gE^bg2 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 FCIBGWDvJOB literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index c42e5cc..2dbbd6e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,8 +5,8 @@ 4.0.0 dev.tulis - TuliAutoInitializer - 1.0-SNAPSHOT + tuliautoinitializer + 1.1 21 @@ -38,6 +38,10 @@ reflections 0.10.2 + + org.slf4j + slf4j-api + 2.0.17 + - \ No newline at end of file diff --git a/src/main/java/dev/tulis/autoinitializer/Annotations/GenericInitializer.java b/src/main/java/dev/tulis/autoinitializer/Annotations/Init.java similarity index 67% rename from src/main/java/dev/tulis/autoinitializer/Annotations/GenericInitializer.java rename to src/main/java/dev/tulis/autoinitializer/Annotations/Init.java index 0ffa563..f1c62a9 100644 --- a/src/main/java/dev/tulis/autoinitializer/Annotations/GenericInitializer.java +++ b/src/main/java/dev/tulis/autoinitializer/Annotations/Init.java @@ -7,5 +7,7 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) -public @interface GenericInitializer { +public @interface Init { + boolean initializeWithoutParameters() default false; + Class[] initializeOnlyWith() default {}; } \ No newline at end of file diff --git a/src/main/java/dev/tulis/autoinitializer/Annotations/InitializeCommand.java b/src/main/java/dev/tulis/autoinitializer/Annotations/InitializeCommand.java deleted file mode 100644 index c4f8c14..0000000 --- a/src/main/java/dev/tulis/autoinitializer/Annotations/InitializeCommand.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.tulis.autoinitializer.Annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface InitializeCommand { - String commandName(); -} \ No newline at end of file diff --git a/src/main/java/dev/tulis/autoinitializer/AutomaticInitializer.java b/src/main/java/dev/tulis/autoinitializer/AutomaticInitializer.java index c473017..b730cf0 100644 --- a/src/main/java/dev/tulis/autoinitializer/AutomaticInitializer.java +++ b/src/main/java/dev/tulis/autoinitializer/AutomaticInitializer.java @@ -1,73 +1,169 @@ package dev.tulis.autoinitializer; -import dev.tulis.autoinitializer.Annotations.GenericInitializer; -import dev.tulis.autoinitializer.Annotations.InitializeCommand; +import dev.tulis.autoinitializer.Annotations.Init; import org.reflections.Reflections; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.lang.reflect.Constructor; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; +import java.lang.reflect.InvocationTargetException; +import java.util.*; public class AutomaticInitializer { - String packageName; - Class mainClass; - Object mainClassObject; - private final Logger logger = Logger.getLogger("dev.tulis.autoinitializer"); - private boolean loggerEnabled = true; + private final String packageName; + private final LinkedHashMap, List> classes; + private final Logger log = LoggerFactory.getLogger(AutomaticInitializer.class); - public AutomaticInitializer(String packageName, Class mainClass, Object mainClassObject) { - this.packageName = packageName; - this.mainClass = mainClass; - this.mainClassObject = mainClassObject; + private AutomaticInitializer(Builder builder) throws NoSuchMethodException, IllegalAccessException, RuntimeException { + packageName = builder.getPackageName(); + classes = builder.getClasses(); + System.setProperty("org.slf4j.simpleLogger.log.org.reflections", "off"); - Logger.getLogger("org.reflections").setLevel(Level.OFF); + init(); } private T castObject(Object obj, Class clazz) { return clazz.cast(obj); } - public void setLoggerEnabled(boolean enabled) { - loggerEnabled = enabled; - if(!enabled) logger.setLevel(Level.OFF); else logger.setLevel(Level.WARNING); - } - - public boolean isLoggerEnabled() { - return loggerEnabled; - } - - public void initializeCommands() { + public void init() throws NoSuchMethodException, IllegalAccessException, RuntimeException { Reflections reflections = new Reflections(packageName); - Set> autoInitClasses = reflections.getTypesAnnotatedWith(InitializeCommand.class); + Set> autoInitClasses = reflections.getTypesAnnotatedWith(Init.class); + + List> paramTypes = new ArrayList<>(); + List objects = new ArrayList<>(); + + for(Map.Entry, List> entry : classes.entrySet()) { + for(Object object : entry.getValue()) { + paramTypes.add(entry.getKey()); + objects.add(castObject(object, entry.getKey())); + } + } for (Class clazz : autoInitClasses) { + Init init = clazz.getAnnotation(Init.class); + + if(init.initializeOnlyWith().length != 0) { + List> paramTypesLocal = new ArrayList<>(); + List objectsLocal = new ArrayList<>(); + + for(Class initClazz : init.initializeOnlyWith()) { + if(!classes.containsKey(initClazz)) { + throw new MissingParameterException( + String.format( + "You didn't provide a value for: %s (requested by: %s).", + initClazz.getName(), + clazz.getName() + ) + ); + } + + for(Object object : classes.get(initClazz)) { + paramTypesLocal.add(initClazz); + objectsLocal.add(castObject(object, initClazz)); + } + } + + try { + Constructor ctor = clazz.getDeclaredConstructor( + paramTypesLocal.toArray(new Class[0]) + ); + + ctor.newInstance(objectsLocal.toArray()); + + log.debug( + "Initialized: {}, but only with: {}.", + clazz.getSimpleName(), + Arrays.toString(paramTypesLocal.toArray()) + ); + } catch (Exception e) { + log.warn(e.getMessage()); + } + + continue; + } + + if(init.initializeWithoutParameters()) { + try { + Constructor ctor = clazz.getConstructor(); + ctor.newInstance(); + } catch (Exception e) { + log.warn(e.getMessage()); + } + + continue; + } + try { - Constructor ctor = clazz.getDeclaredConstructor(mainClass); - ctor.newInstance(castObject(mainClassObject, mainClass)); + Constructor ctor = clazz.getDeclaredConstructor(paramTypes.toArray(new Class[0])); + ctor.newInstance(objects.toArray()); - InitializeCommand annotation = clazz.getAnnotation(InitializeCommand.class); - - logger.info("Zainicjalizowano komendę: " + annotation.commandName()); - } catch (Exception e) { - logger.warning(e.getMessage()); + log.debug("Initialized: {}", clazz.getSimpleName()); + } catch (NoSuchMethodException e) { + throw new NoSuchMethodException( + String.format( + "Class %s has no constructor for: %s.", + clazz.getName(), + Arrays.toString(paramTypes.toArray()) + ) + ); + } catch (InstantiationException e) { + throw new RuntimeException( + String.format( + "Class %s is not a proper class (eg. is abstract or is a interface!).", + clazz.getName() + ) + ); + } catch (InvocationTargetException e) { + throw new RuntimeException( + String.format( + "Class %s occurred an exception (%s) when being initialized.", + clazz.getName(), + e.getCause().fillInStackTrace() + ) + ); + } catch (IllegalAccessException e) { + throw new IllegalAccessException( + String.format( + "Class %s has private or protected access to its constructor.", + clazz.getName() + ) + ); } } } - public void initializeGenerics() { - Reflections reflections = new Reflections(packageName); - Set> autoInitClasses = reflections.getTypesAnnotatedWith(GenericInitializer.class); + public static class Builder { + private String packageName; + private final LinkedHashMap, List> classes = new LinkedHashMap<>(); - for (Class clazz : autoInitClasses) { - try { - Constructor ctor = clazz.getDeclaredConstructor(mainClass); - ctor.newInstance(castObject(mainClassObject, mainClass)); + public Builder setPackageName(String packageName) { + this.packageName = packageName; + return this; + } - logger.info("Zainicjalizowano klasę ogólną: " + clazz.getSimpleName()); - } catch (Exception e) { - logger.warning(e.getMessage()); - } + public Builder addInitVariable(Class classInit, Object objectInit) { + List objects = classes.getOrDefault(classInit, new ArrayList<>()); + objects.add(objectInit); + classes.put(classInit, objects); + + return this; + } + + public String getPackageName() { + return packageName; + } + + public LinkedHashMap, List> getClasses() { + return classes; + } + + public AutomaticInitializer run() throws NoSuchMethodException, IllegalAccessException, RuntimeException { + return new AutomaticInitializer(this); + } + + public AutomaticInitializer build() throws NoSuchMethodException, IllegalAccessException, RuntimeException { + return run(); } } } \ No newline at end of file diff --git a/src/main/java/dev/tulis/autoinitializer/MissingParameterException.java b/src/main/java/dev/tulis/autoinitializer/MissingParameterException.java new file mode 100644 index 0000000..4bec3ea --- /dev/null +++ b/src/main/java/dev/tulis/autoinitializer/MissingParameterException.java @@ -0,0 +1,7 @@ +package dev.tulis.autoinitializer; + +public class MissingParameterException extends RuntimeException { + public MissingParameterException(String message) { + super(message); + } +} \ No newline at end of file