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 | 166 ++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 109 insertions(+), 57 deletions(-) diff --git a/src/de/uhilger/neon/JarScanner.java b/src/de/uhilger/neon/JarScanner.java index d2c350c..23f8bd0 100644 --- a/src/de/uhilger/neon/JarScanner.java +++ b/src/de/uhilger/neon/JarScanner.java @@ -1,8 +1,20 @@ /* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ + neon - Embeddable HTTP Server based on jdk.httpserver + Copyright (C) 2024 Ulrich Hilger + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. + */ package de.uhilger.neon; import java.io.File; @@ -19,65 +31,93 @@ 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) { - log(Level.FINEST, zipentry.getName()); + @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")) { int pos = zName.indexOf(".class"); String fullClassName = zName.substring(0, pos); - log(Level.FINEST, "full class name: " + zName); + finest("full class name: " + zName); String fullClassNameDots = fullClassName.replace('/', '.'); - log(Level.FINEST, "full class name dots: " + fullClassNameDots); + finest("full class name dots: " + fullClassNameDots); String pkgName = getPackageName(fullClassNameDots); - log(Level.FINEST, " -- package name: " + pkgName); + 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)) { - log(Level.FINER, " ---- ACTOR ---- " + fullClassNameDots); - l.actorFound(c, h, contextName); + if (c.isAnnotationPresent(annotation)) { + finest(" ---- ACTOR ---- " + fullClassNameDots); + l.annotationFound(c, h, contextName); } else { - log(Level.FINER, "kein Actor " + fullClassNameDots); + finest("kein Actor " + fullClassNameDots); } } else { - log(Level.FINER, "class NOT loaded: " + zName); + finest("class NOT loaded: " + zName); } } catch (ClassNotFoundException ex) { - log(Level.FINER, " +++++ Class not found: " + ex.getMessage()); + finest(" +++++ Class not found: " + ex.getMessage()); } } } } - + private String getPackageName(String fullClassName) { String packageName; int pos = fullClassName.lastIndexOf("."); @@ -88,57 +128,69 @@ } return packageName; } - + public ClassLoader getUrlClassLoader(Class c) { - URL url; - ClassLoader urlCL = null; + ClassLoader cl = null; try { - url = getPath(c).toURL(); - log(Level.FINER, "url: " + url.getPath()); - urlCL = new URLClassLoader(new URL[]{url}); - } catch (URISyntaxException ex) { - log(Level.SEVERE, ex.getMessage()); + URL url = getPath(c).toURL(); + finer("url: " + url.getPath()); + 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(); - String className = c.getName(); - finer("this name: " + className); - - int pos = className.indexOf(".class"); - if(pos > -1) { - String classNameWoExt = className.substring(0, pos); + + public String getPathStr() { + if (path != null) { + return path.toString(); + } else { + return ""; } - String classNameWoPkg = className.substring(className.lastIndexOf(".") + 1); - finer("Class name: " + classNameWoPkg); + } + + public boolean isJar() { + return !getPathStr().toLowerCase().endsWith(".class"); + } + + private URI getPath(Class c) { + String className = c.getName(); + finest("this name: " + className); + 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; } - finer("path: " + jarPath); - return new URI(jarPath); + finest("path: " + 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