From 31ff37baa3f5562ef959ec91aa3ea60b7c89f2fe Mon Sep 17 00:00:00 2001 From: ulrich Date: Tue, 07 Oct 2025 14:30:21 +0000 Subject: [PATCH] Logging erweitert. --- src/de/uhilger/neon/Handler.java | 108 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 91 insertions(+), 17 deletions(-) diff --git a/src/de/uhilger/neon/Handler.java b/src/de/uhilger/neon/Handler.java index 14d34d3..98ef1d9 100644 --- a/src/de/uhilger/neon/Handler.java +++ b/src/de/uhilger/neon/Handler.java @@ -22,6 +22,7 @@ import de.uhilger.neon.Action.Type; import de.uhilger.neon.entity.ActionDescriptor; import java.io.IOException; +import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Parameter; @@ -30,13 +31,15 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; /** - * Objekte der Klasse Handler nehmen Objekte entgegen die die Annotationen NeonActor enthalten. - * Deren mit NeonMethod annotierten Methoden stellt der Handler via HTTP bereit. + * Objekte der Klasse Handler nehmen Objekte entgegen die die Annotationen Actor enthalten. + * Deren mit Action annotierten Methoden stellt der Handler via HTTP bereit. * - * Wird ein Neon-Server mit der Klasse NeonFactory erzeugt, kann mit der Verwendung dieses Handlers - * die NeonFactory den Server selbsttaetig erstellen, ohne zusaetzlichen Boilerplate Code, den eine + * Wird ein Neon-Server mit der Klasse Factory erzeugt, kann mit der Verwendung dieses Handlers + * die Factory den Server selbsttaetig erstellen, ohne zusaetzlichen Boilerplate Code, den eine * eigene Anwendung mitbringen muesste. * * @author Ulrich Hilger @@ -70,6 +73,8 @@ * ausgefuehrt werden soll */ public void setActor(Type methodType, String route, String className) { + Logger.getLogger(Handler.class.getName()).log( + Level.FINER, "type {0} route {1} className {2}", new Object[]{methodType, route, className}); ActionDescriptor ad = new ActionDescriptor(); ad.className = className; ad.routeParams = new HashMap<>(); @@ -82,6 +87,8 @@ .split("/"); for (int i = 0; i < params.length; i++) { ad.routeParams.put(params[i], i); + Logger.getLogger(Handler.class.getName()).log( + Level.FINER, "ActionDescriptor param {0} no. {1}", new Object[]{params[i], i}); } ad.route = route.substring(0, pos - 1); } else { @@ -91,7 +98,19 @@ //Logger.getLogger(Handler.class.getName()) // .log(Level.INFO, "{0} {1} {2}", new Object[]{methodType, route, className}); - dispatcher.get(methodType).put(ad.route, ad); + //dispatcher.get(methodType).put(ad.route, ad); + Object adMapObj = dispatcher.get(methodType); + if(adMapObj instanceof HashMap) { + @SuppressWarnings("unchecked") + HashMap<String, ActionDescriptor> map = (HashMap) adMapObj; + map.put(ad.route, ad); + Logger.getLogger(Handler.class.getName()).log( + Level.FINER, "ActionDescriptor route {0} className {1}", new Object[]{route, className}); + //dispatcher.put(methodType, map); + } else { + Logger.getLogger(Handler.class.getName()).finer("ActionDescriptorMap nicht gefunden"); + } + } /** @@ -135,8 +154,10 @@ .getHttpContext() .getPath() .length()); - - Type requestMethod = Type.valueOf(exchange.getRequestMethod()); + String requestMethodStr = exchange.getRequestMethod(); + Logger.getLogger(Handler.class.getName()).log( + Level.FINER, "method {0} route {1}", new Object[]{requestMethodStr, route}); + Type requestMethod = Type.valueOf(requestMethodStr); /* Es wird erst geprueft, ob zu einer bestimmten Route ein Actor registriert wurde. Wenn kein Actor mit dieser @@ -147,10 +168,13 @@ Object md = dispatcher.get(requestMethod); if (md instanceof Map) { int pos = route.lastIndexOf("/"); + Logger.getLogger(Handler.class.getName()).log(Level.FINER, "pos {0}", pos); Object o = ((Map) md).get(route); if (!(o instanceof ActionDescriptor)) { while (!found && (pos > -1)) { String routeRest = route.substring(0, pos); + Logger.getLogger(Handler.class.getName()).log( + Level.FINER, "pos {0} routeRest {1}", new Object[]{pos, routeRest}); o = ((Map) md).get(routeRest); if (o instanceof ActionDescriptor) { found = true; @@ -163,31 +187,59 @@ handleRequest(exchange, o, route, route, requestMethod); } if (!found) { + Logger.getLogger(Handler.class.getName()).log(Level.FINER, "{0} not found ", route); o = dispatcher.get(requestMethod).get("/"); if (o instanceof ActionDescriptor) { handleRequest(exchange, o, route, route, requestMethod); + } else { + // kein ActionDescriptor für '/' + Logger.getLogger(Handler.class.getName()).log(Level.FINER, "Kein Actiondescriptor fuer '/'"); } } + } else { + // keine Actions fuer HTTP Methode + Logger.getLogger(Handler.class.getName()).log( + Level.FINER, "Kein Actions fuer HTTP-Methode {0}", requestMethodStr); } } - private void handleRequest(HttpExchange exchange, Object o, String route, String subroute, Type requestMethod) throws IOException { + private void handleRequest(HttpExchange exchange, Object o, String route, String subroute, + Type requestMethod) + throws IOException { + Logger.getLogger(Handler.class.getName()).log( + Level.FINER, "Handle Request route {0} subroute {1}", new Object[]{route, subroute}); ActionDescriptor ad = (ActionDescriptor) o; String actorClassName = ad.className; + Logger.getLogger(Handler.class.getName()).log( + Level.FINER, "Handle Request actor class name {0}", new Object[]{actorClassName}); try { - Class actorClass = Class.forName(actorClassName); + //Class actorClass = Class.forName(actorClassName); + Scanner s = new Scanner(o.getClass(), Actor.class); + Class actorClass = s.getCl().loadClass(actorClassName); + Logger.getLogger(Handler.class.getName()).log( + Level.FINER, "Handle Request actor class found: {0}", new Object[]{actorClass.getName()}); Method[] methods = actorClass.getMethods(); for (Method method : methods) { Action action = method.getAnnotation(Action.class); if (action != null) { - if ((action.route().equals("/") || action.route().startsWith(route)) && action.type().equals(requestMethod)) { + if ((action.route().equals("/") || + action.route().startsWith(route)) && action.type().equals(requestMethod)) { Object[] actionArgs = getActionArgs(exchange, method, ad, subroute); - Object actorObj = actorClass.getDeclaredConstructor().newInstance(); - addDataProvider(exchange, actorObj); - Object antwort = method.invoke(actorObj, actionArgs); - if (!action.handlesResponse()) { - respond(exchange, antwort); + @SuppressWarnings("unchecked") + Object conObj = actorClass.getDeclaredConstructor(); + if(conObj instanceof Constructor) { + Constructor con = (Constructor) conObj; + Object actorObj; + actorObj = con.newInstance(); + addDataProvider(exchange, actorObj); + Object antwort = method.invoke(actorObj, actionArgs); + if (!action.handlesResponse()) { + respond(exchange, antwort); + } + } else { + // kein Konstruktor + Logger.getLogger(Handler.class.getName()).info("Kein Konstruktor gefunden"); } } } @@ -196,6 +248,7 @@ InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { // Klasse nicht gefunden. Muss das geloggt oder sonstwie behandel werden? + Logger.getLogger(Handler.class.getName()).finer("Kein passende Actor-Klasse gefunden"); } //} } @@ -229,17 +282,38 @@ if (methodParam.getType().equals(HttpExchange.class)) { actionArgs[k] = exchange; } else { + Logger.getLogger(Handler.class.getName()).finer("method name " + methodParam.getName()); Integer i = ad.routeParams.getOrDefault(methodParam.getName(), -1); + Logger.getLogger(Handler.class.getName()).finer("param no " + i); if (i < 0) { - actionArgs[k] = queryParams.get(methodParam.getName()); + i = getArgNoFromArgStr(methodParam.getName()); + Logger.getLogger(Handler.class.getName()).finer("param no " + i); + if(i < 0) { + actionArgs[k] = queryParams.get(methodParam.getName()); + } else { + actionArgs[k] = routeParams[i]; + Logger.getLogger(Handler.class.getName()).finer("routeParam " + i + ": " + routeParams[i]); + } } else { actionArgs[k] = routeParams[i + 1]; - } + Logger.getLogger(Handler.class.getName()).finer("routeParam " + i+1 + ": " + routeParams[i + 1]); + } + Logger.getLogger(Handler.class.getName()).finer("ActionArgs " + k + ": " + actionArgs[k]); } ++k; } return actionArgs; } + + private int getArgNoFromArgStr(String argStr) { + int argNo = -1; + if(argStr.contains("arg")) { + String numStr = argStr.substring("arg".length()); + Logger.getLogger(Handler.class.getName()).finer("numStr " + numStr); + argNo = Integer.parseInt(numStr); + } + return argNo; + } private void addDataProvider(HttpExchange exchange, Object actorObj) { if (actorObj instanceof DataConsumer) { -- Gitblit v1.9.3