From 47e67b0aa12758fcbe6eb68f95a35ceb66c268e7 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Sun, 01 Dec 2024 16:25:09 +0000
Subject: [PATCH] Code aufgeraeumt

---
 src/de/uhilger/neon/JarScanner.java |  122 ++++++++++++++++++++++++++--------------
 1 files changed, 79 insertions(+), 43 deletions(-)

diff --git a/src/de/uhilger/neon/JarScanner.java b/src/de/uhilger/neon/JarScanner.java
index f0cd8ab..23f8bd0 100644
--- a/src/de/uhilger/neon/JarScanner.java
+++ b/src/de/uhilger/neon/JarScanner.java
@@ -31,34 +31,63 @@
 import java.util.zip.ZipFile;
 
 /**
- * Die Klasse JarScanner enthaelt Methoden, um fuer eine Klasse zu bestimmen, in 
- * welcher JAR-Datei sie liegt und diese JAR-Datei nach Klassen zu durchsuchen.
- * 
+ * Die Klasse JarScanner 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 class JarScanner {
-  
-  
-  public void processZipContent(ClassLoader urlCL, File archive, String packageName, JarScannerListener l, Handler h, String contextName) {
+public final class JarScanner {
+
+  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
+   * 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) {
+    this.annotation = annotation;
+    this.cls = c;
+    this.urlCL = getUrlClassLoader(cls);
+    this.path = getPath(c);
+ }
+
+  /**
+   * 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 eine Klasse, die 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) {
     try {
-      ZipFile zipfile = new ZipFile(archive);
+      ZipFile zipfile = new ZipFile(new File(path));
       Enumeration en = zipfile.entries();
+      //ClassLoader cl = getUrlClassLoader(cls);
       while (en.hasMoreElements()) {
         ZipEntry zipentry = (ZipEntry) en.nextElement();
         if (!zipentry.isDirectory()) {
-          processZipEntry(urlCL, zipentry, packageName, l, h, contextName);
+          processZipEntry(zipentry, packageName, l, h, contextName);
         } else {
           // ZIP-Dir muss nicht bearbeitet werden
         }
       }
-      zipfile.close();
     } catch (IOException ex) {
       log(Level.SEVERE, ex.getLocalizedMessage());
     }
   }
 
-  private void processZipEntry(ClassLoader urlCL, ZipEntry zipentry, String packageName, JarScannerListener l, Handler h, String contextName) {
+  @SuppressWarnings("unchecked")
+  private void processZipEntry(ZipEntry zipentry, String packageName, JarScannerListener l, Handler h, String contextName) {
     finest(zipentry.getName());
     String zName = zipentry.getName();
     if (zName.toLowerCase().endsWith(".class")) {
@@ -70,13 +99,12 @@
       String pkgName = getPackageName(fullClassNameDots);
       finest(" -- package name: " + pkgName);
       if (null != urlCL && pkgName.toLowerCase().startsWith(packageName)) {
-        Class c = null;
         try {
-          c = urlCL.loadClass(fullClassNameDots);
+          Class c = urlCL.loadClass(fullClassNameDots);
           if (c != null) {
-            if (c.isAnnotationPresent(Actor.class)) {
+            if (c.isAnnotationPresent(annotation)) {
               finest(" ---- ACTOR ---- " + fullClassNameDots);
-              l.actorFound(c, h, contextName);
+              l.annotationFound(c, h, contextName);
             } else {
               finest("kein Actor " + fullClassNameDots);
             }
@@ -89,7 +117,7 @@
       }
     }
   }
-  
+
   private String getPackageName(String fullClassName) {
     String packageName;
     int pos = fullClassName.lastIndexOf(".");
@@ -100,61 +128,69 @@
     }
     return packageName;
   }
-  
+
   public ClassLoader getUrlClassLoader(Class c) {
-    URL url;
-    ClassLoader urlCL = null;
+    ClassLoader cl = null;
     try {
-      url = getPath(c).toURL();
+      URL url = getPath(c).toURL();
       finer("url: " + url.getPath());
-      urlCL = new URLClassLoader(new URL[]{url});
-    } catch (URISyntaxException ex) {
-      log(Level.SEVERE, ex.getMessage());
+      cl = new URLClassLoader(new URL[]{url});
     } catch (MalformedURLException ex) {
       log(Level.SEVERE, ex.getMessage());
     } finally {
-      return urlCL;
+      return cl;
     }
   }
-  
-  public URI getPath(Class c) throws URISyntaxException {
-    //Class c = this.getClass();
+
+  public String getPathStr() {
+    if (path != null) {
+      return path.toString();
+    } else {
+      return "";
+    }
+  }
+
+  public boolean isJar() {
+    return !getPathStr().toLowerCase().endsWith(".class");
+  }
+
+  private URI getPath(Class c) {
     String className = c.getName();
     finest("this name: " + className);
-    
-    int pos = className.indexOf(".class");
-    if(pos > -1) {
-      String classNameWoExt = className.substring(0, pos);
-    }
-    String classNameWoPkg = className.substring(className.lastIndexOf(".") + 1);
+    String classNameWoPkg = c.getSimpleName();//className.substring(className.lastIndexOf(".") + 1);
     finest("Class name: " + classNameWoPkg);
     String classPath = c.getResource(classNameWoPkg + ".class").getPath();
-    pos = classPath.indexOf("!");
+    int pos = classPath.indexOf("!");
     String jarPath;
-    if(pos > -1) {
+    if (pos > -1) {
       jarPath = /*"jar:" + */ classPath.substring(0, pos);
     } else {
       jarPath = classPath;
     }
     finest("path: " + jarPath);
-    return new URI(jarPath);
+    try {
+      return new URI(jarPath);
+    } catch (URISyntaxException ex) {
+      Logger.getLogger(JarScanner.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
+      return null;
+    }
   }
-  
+
   private void finest(String msg) {
     log(Level.FINEST, msg);
   }
-  
+
   private void finer(String msg) {
     log(Level.FINER, msg);
   }
-  
+
   private void log(Level l, String msg) {
     Logger.getLogger(JarScanner.class.getName()).log(l, msg);
   }
-  
-  
+
   public interface JarScannerListener {
-    public void actorFound(Class actorClass, Handler h, String contextName);
+
+    public void annotationFound(Class foundClass, Handler h, String contextName);
   }
-  
+
 }

--
Gitblit v1.9.3