Ultrakompakter HTTP Server
ulrich
2024-12-03 24ad39eec2a0fdca1ef9768de0b92e45a34c1a24
Anwendungsspezifische Parameter im Scanner auf generisches Object-Array umgestellt 
2 files modified
81 ■■■■ changed files
src/de/uhilger/neon/Factory.java 15 ●●●●● patch | view | raw | blame | history
src/de/uhilger/neon/Scanner.java 66 ●●●● patch | view | raw | blame | history
src/de/uhilger/neon/Factory.java
@@ -397,7 +397,20 @@
  /* -------------- ScannerListener Implementierung --------------- */
  @Override
  public void annotationFound(Class foundClass, Handler h, String contextName) {
  public void annotationFound(Class foundClass, Object[] params) {
    Handler h = null;
    String contextName = null;
    for(Object param : params) {
      if(param instanceof Handler) {
        h = (Handler) param;
      } else if(param instanceof String) {
        contextName = (String) param;
      }
    }
    if(h == null || contextName == null) {
      Logger.getLogger(Factory.class.getName()).log(Level.FINER, "Handler oder contextName ist null");
    } else {
    wire(h, foundClass, contextName);
  }
}
}
src/de/uhilger/neon/Scanner.java
@@ -81,14 +81,31 @@
   * @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 ein Objekt, das 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
   * @param params Parameter, die an den Listener weitergereicht werden
   */
  public void process(ScannerListener l, String packageName, Handler h, String contextName) {
  public void process(ScannerListener l, String packageName, Object... params) {
    if (isJar()) {
      processZipContent(packageName, l, h, contextName);
      processZipContent(packageName, l, params);
    } else {
      processClasses(l, packageName, h, contextName);
      processClasses(l, packageName, params);
    }
  }
  private void processZipContent(String packageName, ScannerListener l, Object... params) {
    try {
      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(zipentry, packageName, l, params);
        } else {
          // ZIP-Dir muss nicht bearbeitet werden
        }
      }
    } catch (IOException ex) {
      log(Level.SEVERE, ex.getLocalizedMessage());
    }
  }
@@ -99,29 +116,9 @@
   * @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 ein Objekt, das 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
   * @param params Parameter, die an den Listener weitergereicht werden
   */
  private void processZipContent(String packageName, ScannerListener l, Handler h, String contextName) {
    try {
      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(zipentry, packageName, l, h, contextName);
        } else {
          // ZIP-Dir muss nicht bearbeitet werden
        }
      }
    } catch (IOException ex) {
      log(Level.SEVERE, ex.getLocalizedMessage());
    }
  }
  @SuppressWarnings("unchecked")
  private void processZipEntry(ZipEntry zipentry, String packageName, ScannerListener l, Handler h, String contextName) {
  private void processZipEntry(ZipEntry zipentry, String packageName, ScannerListener l, Object... params) {
    finest(zipentry.getName());
    String zName = zipentry.getName();
    if (zName.toLowerCase().endsWith(".class")) {
@@ -138,7 +135,7 @@
          if (c != null) {
            if (c.isAnnotationPresent(annotation)) {
              finest(" ---- ACTOR ---- " + fullClassNameDots);
              l.annotationFound(c, h, contextName);
              l.annotationFound(c, params);
            } else {
              finest("kein Actor " + fullClassNameDots);
            }
@@ -158,11 +155,9 @@
   * @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 ein Objekt, das 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
   * @param params Parameter, die an den Listener weitergereicht werden
   */
  @SuppressWarnings("unchecked")
  private void processClasses(ScannerListener l, String packageName, Handler h, String contextName) {
  private void processClasses(ScannerListener l, String packageName, Object... params) {
    ClassLoader cl = getCl();
    InputStream stream = cl.getResourceAsStream(packageName.replaceAll("[.]", "/"));
    BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
@@ -175,14 +170,14 @@
                  + line.substring(0, line.lastIndexOf('.')));
          if (actorClass != null && actorClass.isAnnotationPresent(getAnnotation())) {
            //wire(h, actorClass, contextName);
            l.annotationFound(actorClass, h, contextName);
            l.annotationFound(actorClass, params);
          }
        } catch (ClassNotFoundException ex) {
          // Klasse nicht gefunden. Muss das geloggt oder sonstwie behandel werden?
        }
      } else {
        //wireActors(js, packageName + "." + line, h, contextName);
        processClasses(l, packageName + "." + line, h, contextName);
        processClasses(l, packageName + "." + line, params);
      }
    }
  }
@@ -262,7 +257,6 @@
  }
  public interface ScannerListener {
    public void annotationFound(Class foundClass, Handler h, String contextName);
    public void annotationFound(Class foundClass, Object... params);
  }
}