Ultrakompakter HTTP Server
ulrich
2024-12-01 675190608e81f38a713c965071c36b49b0ef8027
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