From 24ad39eec2a0fdca1ef9768de0b92e45a34c1a24 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Tue, 03 Dec 2024 13:35:37 +0000
Subject: [PATCH] Anwendungsspezifische Parameter im Scanner auf generisches Object-Array umgestellt 

---
 src/de/uhilger/neon/Factory.java |   17 +++++++-
 src/de/uhilger/neon/Scanner.java |   58 +++++++++++++----------------
 2 files changed, 41 insertions(+), 34 deletions(-)

diff --git a/src/de/uhilger/neon/Factory.java b/src/de/uhilger/neon/Factory.java
index ddbb717..3748d5b 100644
--- a/src/de/uhilger/neon/Factory.java
+++ b/src/de/uhilger/neon/Factory.java
@@ -397,7 +397,20 @@
 
   /* -------------- ScannerListener Implementierung --------------- */
   @Override
-  public void annotationFound(Class foundClass, Handler h, String contextName) {
-    wire(h, foundClass, contextName);
+  public void annotationFound(Class foundClass, Object[] params) {
+    Handler h = null;
+    String contextName = null;
+    for(Object param : params) {
+      if(param instanceof Handler) {
+        h = (Handler) param;
+      } else if(param instanceof String) {
+        contextName = (String) param;
+      }
+    }
+    if(h == null || contextName == null) {
+      Logger.getLogger(Factory.class.getName()).log(Level.FINER, "Handler oder contextName ist null");
+    } else {
+      wire(h, foundClass, contextName);
+    }
   }
 }
\ No newline at end of file
diff --git a/src/de/uhilger/neon/Scanner.java b/src/de/uhilger/neon/Scanner.java
index 8efdec0..1ebf846 100644
--- a/src/de/uhilger/neon/Scanner.java
+++ b/src/de/uhilger/neon/Scanner.java
@@ -70,7 +70,7 @@
   public Class getAnnotation() {
     return annotation;
   }
-
+  
   /**
    * Klassen suchen, die die dem Konstruktor gegebene Annotation besitzen.
    *
@@ -81,28 +81,17 @@
    * @param packageName Name der Package, die einschl. Unterpackages durchsucht wird, nur Klassen
    * dieser Package und ihrer Unterpackages werden geladen und auf die Anotation ueberprueft
    * @param l ein Objekt, das verstaendigt wird, wenn eine annotierte Klasse gefunden wurde
-   * @param h der Handler, dem die gefundene Klasse hinzugefuegt werden soll
-   * @param contextName Name des Kontext, dem gefundene Klassen hinzugefuegt werden sollen
+   * @param params Parameter, die an den Listener weitergereicht werden
    */
-  public void process(ScannerListener l, String packageName, Handler h, String contextName) {
+  public void process(ScannerListener l, String packageName, Object... params) {
     if (isJar()) {
-      processZipContent(packageName, l, h, contextName);
+      processZipContent(packageName, l, params);
     } else {
-      processClasses(l, packageName, h, contextName);
+      processClasses(l, packageName, params);
     }
   }
 
-  /**
-   * Den Inhalt einer Jar-Datei nach Klassen durchsuchen, die die dem Konstruktor gegebene
-   * Annotation besitzen.
-   *
-   * @param packageName Name der Package, die einschl. Unterpackages durchsucht wird, nur Klassen
-   * dieser Package und ihrer Unterpackages werden geladen und auf die Anotation ueberprueft
-   * @param l ein Objekt, das verstaendigt wird, wenn eine annotierte Klasse gefunden wurde
-   * @param h der Handler, dem die gefundene Klasse hinzugefuegt werden soll
-   * @param contextName Name des Kontext, dem gefundene Klassen hinzugefuegt werden sollen
-   */
-  private void processZipContent(String packageName, ScannerListener l, Handler h, String contextName) {
+  private void processZipContent(String packageName, ScannerListener l, Object... params) {
     try {
       ZipFile zipfile = new ZipFile(new File(path));
       Enumeration en = zipfile.entries();
@@ -110,7 +99,7 @@
       while (en.hasMoreElements()) {
         ZipEntry zipentry = (ZipEntry) en.nextElement();
         if (!zipentry.isDirectory()) {
-          processZipEntry(zipentry, packageName, l, h, contextName);
+          processZipEntry(zipentry, packageName, l, params);
         } else {
           // ZIP-Dir muss nicht bearbeitet werden
         }
@@ -119,9 +108,17 @@
       log(Level.SEVERE, ex.getLocalizedMessage());
     }
   }
-
-  @SuppressWarnings("unchecked")
-  private void processZipEntry(ZipEntry zipentry, String packageName, ScannerListener l, Handler h, String contextName) {
+         
+  /**
+   * Den Inhalt einer Jar-Datei nach Klassen durchsuchen, die die dem Konstruktor gegebene
+   * Annotation besitzen.
+   *
+   * @param packageName Name der Package, die einschl. Unterpackages durchsucht wird, nur Klassen
+   * dieser Package und ihrer Unterpackages werden geladen und auf die Anotation ueberprueft
+   * @param l ein Objekt, das verstaendigt wird, wenn eine annotierte Klasse gefunden wurde
+   * @param params Parameter, die an den Listener weitergereicht werden
+   */
+  private void processZipEntry(ZipEntry zipentry, String packageName, ScannerListener l, Object... params) {
     finest(zipentry.getName());
     String zName = zipentry.getName();
     if (zName.toLowerCase().endsWith(".class")) {
@@ -138,7 +135,7 @@
           if (c != null) {
             if (c.isAnnotationPresent(annotation)) {
               finest(" ---- ACTOR ---- " + fullClassNameDots);
-              l.annotationFound(c, h, contextName);
+              l.annotationFound(c, params);
             } else {
               finest("kein Actor " + fullClassNameDots);
             }
@@ -151,18 +148,16 @@
       }
     }
   }
-
+  
   /**
    * Einen Ordner mit Klassen durchsuchen
    *
    * @param packageName Name der Package, die einschl. Unterpackages durchsucht wird, nur Klassen
    * dieser Package und ihrer Unterpackages werden geladen und auf die Anotation ueberprueft
    * @param l ein Objekt, das verstaendigt wird, wenn eine annotierte Klasse gefunden wurde
-   * @param h der Handler, dem die gefundene Klasse hinzugefuegt werden soll
-   * @param contextName Name des Kontext, dem gefundene Klassen hinzugefuegt werden sollen
+   * @param params Parameter, die an den Listener weitergereicht werden
    */
-  @SuppressWarnings("unchecked")
-  private void processClasses(ScannerListener l, String packageName, Handler h, String contextName) {
+  private void processClasses(ScannerListener l, String packageName, Object... params) {
     ClassLoader cl = getCl();
     InputStream stream = cl.getResourceAsStream(packageName.replaceAll("[.]", "/"));
     BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
@@ -175,18 +170,18 @@
                   + line.substring(0, line.lastIndexOf('.')));
           if (actorClass != null && actorClass.isAnnotationPresent(getAnnotation())) {
             //wire(h, actorClass, contextName);
-            l.annotationFound(actorClass, h, contextName);
+            l.annotationFound(actorClass, params);
           }
         } catch (ClassNotFoundException ex) {
           // Klasse nicht gefunden. Muss das geloggt oder sonstwie behandel werden?
         }
       } else {
         //wireActors(js, packageName + "." + line, h, contextName);
-        processClasses(l, packageName + "." + line, h, contextName);
+        processClasses(l, packageName + "." + line, params);
       }
     }
   }
-
+  
   private String getPackageName(String fullClassName) {
     String packageName;
     int pos = fullClassName.lastIndexOf(".");
@@ -262,7 +257,6 @@
   }
 
   public interface ScannerListener {
-
-    public void annotationFound(Class foundClass, Handler h, String contextName);
+    public void annotationFound(Class foundClass, Object... params);
   }
 }
\ No newline at end of file

--
Gitblit v1.9.3