From 692dc7be9791f131bfb253c13363b75bc41b8467 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Sun, 01 Dec 2024 16:56:40 +0000
Subject: [PATCH] JarScanner umbenannt, das Laden von Klassen ohne Jar ebenfalls auf Scanner umgestellt

---
 src/de/uhilger/neon/Factory.java |   45 ++++++----------------
 src/de/uhilger/neon/Scanner.java |   60 ++++++++++++++++++++++++-----
 2 files changed, 61 insertions(+), 44 deletions(-)

diff --git a/src/de/uhilger/neon/Factory.java b/src/de/uhilger/neon/Factory.java
index 48ceb6d..7cb2a86 100644
--- a/src/de/uhilger/neon/Factory.java
+++ b/src/de/uhilger/neon/Factory.java
@@ -23,7 +23,6 @@
 import com.sun.net.httpserver.HttpContext;
 import com.sun.net.httpserver.HttpHandler;
 import com.sun.net.httpserver.HttpServer;
-import de.uhilger.neon.JarScanner.JarScannerListener;
 import de.uhilger.neon.entity.ContextDescriptor;
 import de.uhilger.neon.entity.NeonDescriptor;
 import de.uhilger.neon.entity.ServerDescriptor;
@@ -48,6 +47,7 @@
 import java.util.concurrent.Executors;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import de.uhilger.neon.Scanner.ScannerListener;
 
 /**
  * Einen Neon-Server aus einer Beschreibungsdatei herstellen
@@ -65,7 +65,7 @@
  * @author Ulrich Hilger
  * @version 1, 6.2.2024
  */
-public class Factory implements JarScannerListener {
+public class Factory implements ScannerListener {
 
   public Factory() {
     listeners = new ArrayList<>();
@@ -138,8 +138,8 @@
 
       if (packageNames == null) {
         packageNames = d.actorPackages;
-      }
-      addContexts(starter, d, server, sd.contexts, packageNames, sdp);
+      }      
+      addContexts(new Scanner(starter, Actor.class), d, server, sd.contexts, packageNames, sdp);
 
       server.setExecutor(Executors.newFixedThreadPool(10));
       server.start();
@@ -167,7 +167,7 @@
     return auth;
   }
 
-  private void addContexts(Class c, NeonDescriptor d, HttpServer server, List contextList, List<String> packageNames,
+  private void addContexts(Scanner scn, NeonDescriptor d, HttpServer server, List contextList, List<String> packageNames,
           List<DataProvider> sdp)
           throws ClassNotFoundException, NoSuchMethodException, InstantiationException,
           IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException {
@@ -187,8 +187,8 @@
         ctxAttrs.putAll(cd.attributes);
         if (h instanceof Handler) {
           for (String packageName : packageNames) {
-            wireActors(c,
-                    packageName, Actor.class, (Handler) h,
+            wireActors(scn,
+                    packageName, (Handler) h,
                     cd.attributes.get("contextName"));
             ctx.getAttributes().put("serverDataProviderList", sdp);
           }
@@ -266,32 +266,11 @@
   }
 
   @SuppressWarnings("unchecked")
-  private void wireActors(Class c, String packageName, Class annotation, Handler h, String contextName) {
-    JarScanner js = new JarScanner(c, annotation);
-    if (!js.isJar()) {
-      ClassLoader cl = c.getClassLoader();
-      InputStream stream = cl
-              .getResourceAsStream(packageName.replaceAll("[.]", "/"));
-      BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
-      Iterator i = reader.lines().iterator();
-      while (i.hasNext()) {
-        String line = i.next().toString();
-        if (line.endsWith(".class")) {
-          try {
-            Class actorClass = cl.loadClass(packageName + "."
-                    + line.substring(0, line.lastIndexOf('.')));
-            if (actorClass != null && actorClass.isAnnotationPresent(annotation)) {
-              wire(h, actorClass, contextName);
-            }
-          } catch (ClassNotFoundException ex) {
-            // Klasse nicht gefunden. Muss das geloggt oder sonstwie behandel werden?
-          }
-        } else {
-          wireActors(c, packageName + "." + line, annotation, h, contextName);
-        }
-      }
+  private void wireActors(Scanner scn, String packageName, /*Class annotation, */Handler h, String contextName) {
+    if (!scn.isJar()) {
+      scn.processClasses(this, packageName, h, contextName);
     } else {
-      js.processZipContent(packageName, this, h, contextName);
+      scn.processZipContent(packageName, this, h, contextName);
     }
   }
 
@@ -427,7 +406,7 @@
     }
   }
 
-  /* -------------- JarScannerListener Implementierung --------------- */
+  /* -------------- ScannerListener Implementierung --------------- */
   @Override
   public void annotationFound(Class foundClass, Handler h, String contextName) {
     wire(h, foundClass, contextName);
diff --git a/src/de/uhilger/neon/JarScanner.java b/src/de/uhilger/neon/Scanner.java
similarity index 73%
rename from src/de/uhilger/neon/JarScanner.java
rename to src/de/uhilger/neon/Scanner.java
index 23f8bd0..d328c83 100644
--- a/src/de/uhilger/neon/JarScanner.java
+++ b/src/de/uhilger/neon/Scanner.java
@@ -17,46 +17,55 @@
  */
 package de.uhilger.neon;
 
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.Enumeration;
+import java.util.Iterator;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
 /**
- * Die Klasse JarScanner enthaelt Methoden, um fuer eine Klasse zu bestimmen, in welcher JAR-Datei
+ * Die Klasse Scanner enthaelt Methoden, um fuer eine Klasse zu bestimmen, in welcher JAR-Datei
  * sie liegt und diese JAR-Datei nach Klassen zu durchsuchen.
  *
  * @author Ulrich Hilger
  * @version 0.1, 30.11.2024
  */
-public final class JarScanner {
+public final class Scanner {
 
   private final URI path;
   private final Class annotation;
+
   private final Class cls;
   private final ClassLoader urlCL;
 
   /**
-   * Einen JarScanner erzeugen, der das Archiv, in dem sich eine gegebene Klasse befindet, nach
+   * Einen Scanner erzeugen, der das Archiv, in dem sich eine gegebene Klasse befindet, nach
    * Klassen durchsucht, die eine bestimmte Annotation besitzen
    *
    * @param c eine Klasse die sich im Archiv befindet, das durchsucht werden soll
    * @param annotation die Annotation, nach der gesucht wird
    */
-  public JarScanner(Class c, Class annotation) {
+  public Scanner(Class c, Class annotation) {
     this.annotation = annotation;
     this.cls = c;
     this.urlCL = getUrlClassLoader(cls);
     this.path = getPath(c);
- }
+  }
+
+  public Class getAnnotation() {
+    return annotation;
+  }
 
   /**
    * Den Inhalt einer Jar-Datei nach Klassen durchsuchen, die die dem Konstruktor gegebene
@@ -64,11 +73,11 @@
    *
    * @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 eine Klasse, die verstaendigt wird, wenn eine annotierte Klasse gefunden wurde
+   * @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
    */
-  public void processZipContent(String packageName, JarScannerListener l, Handler h, String contextName) {
+  public void processZipContent(String packageName, ScannerListener l, Handler h, String contextName) {
     try {
       ZipFile zipfile = new ZipFile(new File(path));
       Enumeration en = zipfile.entries();
@@ -87,7 +96,7 @@
   }
 
   @SuppressWarnings("unchecked")
-  private void processZipEntry(ZipEntry zipentry, String packageName, JarScannerListener l, Handler h, String contextName) {
+  private void processZipEntry(ZipEntry zipentry, String packageName, ScannerListener l, Handler h, String contextName) {
     finest(zipentry.getName());
     String zName = zipentry.getName();
     if (zName.toLowerCase().endsWith(".class")) {
@@ -118,6 +127,31 @@
     }
   }
 
+  public void processClasses(ScannerListener l, String packageName, Handler h, String contextName) {
+      ClassLoader cl = getCl();
+      InputStream stream = cl.getResourceAsStream(packageName.replaceAll("[.]", "/"));
+      BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
+      Iterator i = reader.lines().iterator();
+      while (i.hasNext()) {
+        String line = i.next().toString();
+        if (line.endsWith(".class")) {
+          try {
+            Class actorClass = cl.loadClass(packageName + "."
+                    + line.substring(0, line.lastIndexOf('.')));
+            if (actorClass != null && actorClass.isAnnotationPresent(getAnnotation())) {
+              //wire(h, actorClass, contextName);
+              l.annotationFound(actorClass, h, contextName);
+            }
+          } 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);
+        }
+      }
+  }
+  
   private String getPackageName(String fullClassName) {
     String packageName;
     int pos = fullClassName.lastIndexOf(".");
@@ -127,6 +161,10 @@
       packageName = fullClassName;
     }
     return packageName;
+  }
+
+  public ClassLoader getCl() {
+    return cls.getClassLoader();
   }
 
   public ClassLoader getUrlClassLoader(Class c) {
@@ -171,7 +209,7 @@
     try {
       return new URI(jarPath);
     } catch (URISyntaxException ex) {
-      Logger.getLogger(JarScanner.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+      Logger.getLogger(Scanner.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
       return null;
     }
   }
@@ -185,10 +223,10 @@
   }
 
   private void log(Level l, String msg) {
-    Logger.getLogger(JarScanner.class.getName()).log(l, msg);
+    Logger.getLogger(Scanner.class.getName()).log(l, msg);
   }
 
-  public interface JarScannerListener {
+  public interface ScannerListener {
 
     public void annotationFound(Class foundClass, Handler h, String contextName);
   }

--
Gitblit v1.9.3