From e52bef21012dce5fb38e28f3cd7ef45c81813606 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Tue, 24 Feb 2026 12:21:38 +0000
Subject: [PATCH] Die Abhaengigkeit von Gson entfernt und stattdessen die Verwendung von nanosjson eingebaut.
---
src/de/uhilger/neon/Factory.java | 27 ---------
src/de/uhilger/neon/entity/NeonDescriptor.java | 114 +++++++++++++++++++++++++++++++++++++
2 files changed, 113 insertions(+), 28 deletions(-)
diff --git a/src/de/uhilger/neon/Factory.java b/src/de/uhilger/neon/Factory.java
index 9f8c1fb..9a66ec9 100644
--- a/src/de/uhilger/neon/Factory.java
+++ b/src/de/uhilger/neon/Factory.java
@@ -18,7 +18,6 @@
package de.uhilger.neon;
import de.uhilger.neon.entity.ActorDescriptor;
-import com.google.gson.Gson;
import com.sun.net.httpserver.Authenticator;
import com.sun.net.httpserver.Filter;
import com.sun.net.httpserver.HttpContext;
@@ -28,8 +27,6 @@
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;
@@ -70,30 +67,6 @@
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)
diff --git a/src/de/uhilger/neon/entity/NeonDescriptor.java b/src/de/uhilger/neon/entity/NeonDescriptor.java
index 8c5c06b..8d00cc9 100644
--- a/src/de/uhilger/neon/entity/NeonDescriptor.java
+++ b/src/de/uhilger/neon/entity/NeonDescriptor.java
@@ -17,7 +17,20 @@
*/
package de.uhilger.neon.entity;
+import com.grack.nanojson.JsonArray;
+import com.grack.nanojson.JsonObject;
+import com.grack.nanojson.JsonParser;
+import com.grack.nanojson.JsonParserException;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
+import java.util.Objects;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
/**
* Objekte der Klasse NeonDescriptor beschreiben einen Neon-Server
@@ -35,5 +48,104 @@
public AuthenticatorDescriptor authenticator;
public List<ServerDescriptor> server;
public List<WsServerDescriptor> wsserver;
-
+
+ /**
+ * Den NeonDescriptor aus einer in JSON abgefassten Serverbeschreibungsdatei lesen.
+ *
+ * vgl. https://uhilger.de/data/pg/neon/anleitung.adoc#srv-desc
+ *
+ * @param fileName Name und ggf. Pfad zur Serverbeschreibung
+ */
+ public void read(String fileName) {
+ try {
+ File f = new File(fileName);
+ JsonObject serverDesc = JsonParser.object().from(new FileReader(f));
+
+ //NeonDescriptor d = new NeonDescriptor();
+ this.instanceName = serverDesc.getString("instanceName");
+ this.contentType = serverDesc.getString("contentType");
+ this.contentId = serverDesc.getString("contentId");
+ this.contentDescription = serverDesc.getString("contentDescription");
+ this.instanceDescription = serverDesc.getString("instanceDescription");
+ this.actorPackages = getArray(serverDesc, "actorPackages");
+
+ JsonObject authObj = serverDesc.getObject("authenticator");
+ if (null != authObj) {
+ this.authenticator = new AuthenticatorDescriptor();
+ this.authenticator.className = authObj.getString("className");
+ this.authenticator.attributes = getAttrMap(authObj, "attributes");
+ }
+ JsonArray serverArray = serverDesc.getArray("server");
+ this.server = new ArrayList<>();
+ Iterator serverIterator = serverArray.iterator();
+ while (serverIterator.hasNext()) {
+ Object iteratorObject = serverIterator.next();
+ if (iteratorObject instanceof JsonObject) {
+ JsonObject serverObject = (JsonObject) iteratorObject;
+ ServerDescriptor sd = new ServerDescriptor();
+ sd.name = serverObject.getString("name");
+ sd.port = serverObject.getInt("port", 0);
+ sd.contexts = new ArrayList<>();
+ JsonArray contextsArray = serverObject.getArray("contexts");
+ Iterator contextIterator = contextsArray.iterator();
+ while (contextIterator.hasNext()) {
+ Object contextObj = contextIterator.next();
+ if (contextObj instanceof JsonObject) {
+ JsonObject context = (JsonObject) contextObj;
+ ContextDescriptor cd = new ContextDescriptor();
+ cd.className = context.getString("className");
+ cd.sharedHandler = context.getBoolean("sharedHandler");
+ cd.contextPath = context.getString("contextPath");
+ if (context.containsKey("filter")) {
+ cd.filter = getArray(context, "filter");
+ }
+ cd.authenticator = context.getString("authenticator");
+ cd.attributes = getAttrMap(context, "attributes");
+ sd.contexts.add(cd);
+ }
+ }
+ this.server.add(sd);
+ }
+ }
+ //return d;
+ } catch (JsonParserException | FileNotFoundException ex) {
+ Logger.getLogger(NeonDescriptor.class.getName()).severe(ex.getMessage());
+ //return null;
+ }
+ }
+
+ /**
+ * Die Eintraege eines einfachen JSON-Array in eine String-Liste uebertragen
+ * @param src das Objekt, aus dem die Inhalte des JSON-Arrays gelesen werden
+ * @param name der Name des zu lesenden JSON-Arrays
+ * @return der Inhalt des JSON-Arrays als String-Liste
+ */
+ private List<String> getArray(JsonObject src, String name) {
+ return src.getArray(name)
+ .stream()
+ .map((o) -> Objects.toString(o, null))
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * Eine Liste von Attributen (Schluessel/Wert-Paare) aus einem JSON-Objekt
+ * in eine Map uebertragen.
+ *
+ * @param src das JSON-Objekt, aus dem die Attribute gelesen werden sollen
+ * @param name der Name des JSON-Elements, das die Attribute enthaelt
+ * @return eine Map mit den gelesenen Attributen
+ */
+ private HashMap<String, String> getAttrMap(JsonObject src, String name) {
+ HashMap<String, String> map = new HashMap<>();
+ JsonObject attrObj = src.getObject(name);
+ Iterator attributeIterator = attrObj.keySet().iterator();
+ while (attributeIterator.hasNext()) {
+ Object keyObj = attributeIterator.next();
+ if (keyObj instanceof String) {
+ String key = (String) keyObj;
+ map.put(key, attrObj.get(key).toString());
+ }
+ }
+ return map;
+ }
}
\ No newline at end of file
--
Gitblit v1.9.3