From 675190608e81f38a713c965071c36b49b0ef8027 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Sun, 01 Dec 2024 09:52:46 +0000
Subject: [PATCH] Test fuer getResourceAsStream ergaenzt
---
src/de/uhilger/neon/Factory.java | 73 ++++++++++++++++++++++++++++++++++++
1 files changed, 73 insertions(+), 0 deletions(-)
diff --git a/src/de/uhilger/neon/Factory.java b/src/de/uhilger/neon/Factory.java
index ff5977d..ba46730 100644
--- a/src/de/uhilger/neon/Factory.java
+++ b/src/de/uhilger/neon/Factory.java
@@ -124,6 +124,17 @@
public void runInstance(Class c, NeonDescriptor d, List<String> packageNames, List<DataProvider> sdp)
throws ClassNotFoundException, NoSuchMethodException, InstantiationException,
IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException {
+
+ Logger.getLogger(Factory.class.getName()).log(Level.FINER, System.getProperty("java.class.path"));
+ Class pingClass = c.getClassLoader().loadClass("de.uhilger.neonbaselokal.actor.Ping");
+ if(pingClass != null) {
+ Logger.getLogger(Factory.class.getName()).log(Level.FINER,
+ pingClass.getName() + " " + pingClass.getPackageName() +
+ " " + pingClass.getSimpleName());
+ } else {
+ Logger.getLogger(Factory.class.getName()).log(Level.FINER, "pingClass not found");
+ }
+
List serverList = d.server;
Iterator<ServerDescriptor> serverIterator = serverList.iterator();
while (serverIterator.hasNext()) {
@@ -291,11 +302,73 @@
ClassLoader cl = js.getUrlClassLoader(c);
js.processZipContent(cl, new File(path), packageName, this, h, contextName);
}
+ //listClasses(c, packageName);
} catch (URISyntaxException ex) {
Logger.getLogger(Factory.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
}
}
+ /**
+ * Diese Testmethode zeigt, dass die Methode getResourceAsStream nicht funktioniert wie
+ * dokumentiert.
+ *
+ * 1. Sie liefert den Inhalt einer gegebenen Package mitsamt Unterpackages als
+ * Stream, wenn sie auf eine Packagestruktur angewendet wird, die unverpackt in einem
+ * Verzeichnis des Dateisystems liegt.
+ *
+ * 2. Sie liefert - faelschlicherweise - null bzw. einen leeren Stream, wenn die Packagestruktur
+ * in einem Jar verpackt ist.
+ *
+ * Saemtliche Versuche, ueber den ClassPath oder die Pfadangabe der Package das Verhalten zu
+ * aendern, gehen bislang fehl (z.B. / oder . als Separator,
+ * / oder . zu Beginn enthalten oder nicht, realative oder absolute packagepfadangabe).
+ * Es ist auch unerheblich, ob
+ * Class.getResourceAsStream oder Class.getClassLoader().getResourceAsStream verwendet wird.
+ *
+ * Unabhaengig davon, ob und wie letztlich im Fall 2. oben die Methode getResourceAsStream
+ * dazu zu bringen waere, eine Inhaltsliste fuer eine Package zu liefern ist allein die
+ * Tatsache, dass sich die Methode unterschiedlich verhaelt bereits ein
+ * schwerer Bug.
+ *
+ * @param c
+ * @param packageName
+ */
+ private void listClasses(Class c, String packageName) {
+ Logger.getLogger(Factory.class.getName()).log(Level.FINER, "packageName: " + packageName);
+ //ClassLoader cl = c.getClassLoader();
+ String newPackageName = packageName.replaceAll("[.]", "/");
+ Logger.getLogger(Factory.class.getName()).log(Level.FINER, "newPackageName: " + newPackageName);
+ InputStream stream = c
+ .getResourceAsStream(newPackageName);
+ if(stream != null) {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
+ Iterator i = reader.lines().iterator();
+ Logger.getLogger(Factory.class.getName()).log(Level.FINER, Long.toString(reader.lines().count()));
+ while (i.hasNext()) {
+ String line = i.next().toString();
+ Logger.getLogger(Factory.class.getName()).log(Level.FINER, "class to inspect: " + line);
+ if (line.endsWith(".class")) {
+ try {
+ Class actorClass = c.getClassLoader().loadClass(packageName + "."
+ + line.substring(0, line.lastIndexOf('.')));
+ if (actorClass != null && actorClass.isAnnotationPresent(Actor.class)) {
+ Logger.getLogger(Factory.class.getName()).log(Level.FINER, "ACTOR");
+ } else {
+ Logger.getLogger(Factory.class.getName()).log(Level.FINER, "no actor");
+ }
+ } catch (ClassNotFoundException ex) {
+ Logger.getLogger(Factory.class.getName()).log(Level.FINER, "Klasse nicht gefunden");
+ }
+ } else {
+ listClasses(c, packageName + "." + line);
+ }
+ }
+ } else {
+ Logger.getLogger(Factory.class.getName()).log(Level.FINER, "stream ist null");
+ }
+ }
+
+
/*
Eine Action-Annotation enthaelt gewoehnlich die Route,
die 'unterhalb' des Kontextpfades als 'Ausloeser' zur
--
Gitblit v1.9.3