From d3cc22c6082522c7518fe6e12010f11413b4e0c4 Mon Sep 17 00:00:00 2001
From: ulrich <ulli@ulrichs-mac.fritz.box>
Date: Mon, 24 Nov 2025 17:19:28 +0000
Subject: [PATCH] WsServerDescriptor hinzugefuegt
---
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