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