Ultrakompakter HTTP Server
ulrich
15 hours ago 786064bea6eec2b80a7771ed4b3f4bd36a2547d0
src/de/uhilger/neon/Factory.java
@@ -17,7 +17,7 @@
 */
package de.uhilger.neon;
import com.google.gson.Gson;
import de.uhilger.neon.entity.ActorDescriptor;
import com.sun.net.httpserver.Authenticator;
import com.sun.net.httpserver.Filter;
import com.sun.net.httpserver.HttpContext;
@@ -27,17 +27,12 @@
import de.uhilger.neon.entity.NeonDescriptor;
import de.uhilger.neon.entity.ServerDescriptor;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -67,35 +62,11 @@
 */
public class Factory implements ScannerListener {
  
  private Map<String, List<TempActor>> actorMap;
  private Map<String, List<ActorDescriptor>> actorMap;
  public Factory() {
    listeners = new ArrayList<>();
    actorMap = new HashMap<>();
  }
  /**
   * Beschreibungsdatei lesen
   *
   * @param file die Datei, die den Server beschreibt
   * @return ein Objekt, das den Server beschreibt
   * @throws IOException wenn die Datei nicht gelesen werden konnte
   */
  public NeonDescriptor readDescriptor(File file) throws IOException {
    //Logger logger = Logger.getLogger(Factory.class.getName());
    //logger.log(Level.INFO, "reading NeonDescriptor from {0}", file.getAbsolutePath());
    StringBuilder sb = new StringBuilder();
    BufferedReader r = new BufferedReader(new FileReader(file));
    String line = r.readLine();
    while (line != null) {
      sb.append(line);
      line = r.readLine();
    }
    r.close();
    Gson gson = new Gson();
    return gson.fromJson(sb.toString(), NeonDescriptor.class);
  }
  public void runInstance(Class c, NeonDescriptor d)
@@ -131,7 +102,7 @@
          IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException {
    Logger.getLogger(Factory.class.getName()).log(Level.FINER, System.getProperty("java.class.path"));
    List<ServerDescriptor> serverList = d.server;
    for (ServerDescriptor sd : serverList) {
      HttpServer server = HttpServer.create(new InetSocketAddress(sd.port), 0);
@@ -152,23 +123,34 @@
      server.setExecutor(Executors.newFixedThreadPool(10));
      server.start();
    }
    fireInstanceStarted();
   fireInstanceStarted();
  }
  private Authenticator createAuthenticator(NeonDescriptor d) {
    Logger.getLogger(Factory.class.getName()).log(
            Level.FINER, "{0} ", new Object[]{"creating Authenticator"});
    Authenticator auth = null;
    if (d.authenticator != null) {
      try {
      Logger.getLogger(Factory.class.getName()).log(
              Level.FINER, "Authenticator className {0} ", new Object[]{d.authenticator.className});
        Object authObj = Class.forName(d.authenticator.className)
                .getDeclaredConstructor().newInstance();
        if (authObj instanceof Authenticator) {
          auth = (Authenticator) authObj;
          Logger.getLogger(Factory.class.getName()).log(
                  Level.FINER, "Authenticator className {0} created", new Object[]{d.authenticator.className});
          return auth;
        }
      } catch (ClassNotFoundException | NoSuchMethodException | SecurityException
              | InstantiationException | IllegalAccessException | IllegalArgumentException
              | InvocationTargetException ex) {
        // Klasse nicht gefunden. Muss das geloggt oder sonstwie behandel werden?
        Logger.getLogger(Factory.class.getName()).log(
              Level.FINER, "Authenticator className {0} not created, error {1}",
                new Object[]{d.authenticator.className, ex.getLocalizedMessage()});
        return null;
      }
    }
@@ -194,8 +176,8 @@
         */
        ctxAttrs.putAll(cd.attributes);
        ctxAttrs.put("serverDataProviderList", sdp);
        if (h instanceof Handler handler) {
          wire(handler, cd.attributes.get("contextName"));
        if (h instanceof Handler) {
          wire((Handler) h, cd.attributes.get("contextName"));
        }
        if (cd.authenticator instanceof String) {
          if (!(auth instanceof Authenticator)) {
@@ -212,8 +194,8 @@
            //
            Object filterObj = Class.forName(filterClassName)
                    .getDeclaredConstructor().newInstance();
            if (filterObj instanceof Filter filter) {
              ctx.getFilters().add(filter);
            if (filterObj instanceof Filter) {
              ctx.getFilters().add((Filter) filterObj);
            }
          }
        }
@@ -348,10 +330,13 @@
   * @param contextName Name des Kontext, dem der Handler zugeordnet ist
   */
  private void wire(Handler h, String contextName) {
    List<TempActor> actorList = actorMap.get(contextName);
    Iterator<TempActor> i = actorList.iterator();
    List<ActorDescriptor> actorList = actorMap.get(contextName);
    Iterator<ActorDescriptor> i = actorList.iterator();
    while(i.hasNext()) {
      TempActor actor = i.next();
      ActorDescriptor actor = i.next();
      Logger.getLogger(Factory.class.getName()).log(
              Level.FINER, "actorClassName {0} route {1}",
              new Object[]{actor.getActorClassName(), actor.getRoute()});
      h.setActor(actor.getHttpMethod(), actor.getRoute(), actor.getActorClassName());
    }
  }
@@ -379,7 +364,7 @@
      l.serverCreated(server);
    }
  }
  private void fireHandlerCreated(HttpContext ctx, HttpHandler h) {
    for (FactoryListener l : listeners) {
      l.handlerCreated(ctx, h);
@@ -413,13 +398,13 @@
      if (action != null) {
        List<String> actionHandlers = Arrays.asList(action.handler());
        for (String contextName : actionHandlers) {
           TempActor tempActor = new TempActor();
           ActorDescriptor tempActor = new ActorDescriptor();
           tempActor.setContextName(contextName);
           tempActor.setHttpMethod(action.type());
           tempActor.setRoute(action.route());
           tempActor.setActorClassName(foundClass.getName());
           
           List<TempActor> actorList = actorMap.get(contextName);
           List<ActorDescriptor> actorList = actorMap.get(contextName);
           if(actorList == null) {
             actorList = new ArrayList<>();
           }