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