From 801c44389e6b6c5b2f1b0a4561376e559afe0fde Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Mon, 30 Aug 2021 08:09:48 -0400 Subject: [PATCH] Schema hell --- src/main/java/com/volmit/iris/Iris.java | 17 +++++++ .../com/volmit/iris/core/loader/IrisData.java | 20 +++++++++ .../iris/core/loader/ResourceLoader.java | 4 +- .../volmit/iris/core/project/IrisProject.java | 37 +++++++++++++++ .../iris/core/project/SchemaBuilder.java | 45 +++++++++++++++++-- 5 files changed, 118 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 2a21bd84c..aa9b4c0ad 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -202,6 +202,23 @@ public class Iris extends VolmitPlugin implements Listener { return v; } + public static KList> getClasses(String s, Class slicedClass) { + JarScanner js = new JarScanner(instance.getJarFile(), s); + KList> v = new KList<>(); + J.attempt(js::scan); + for (Class i : js.getClasses()) { + if (slicedClass == null || i.isAnnotationPresent(slicedClass)) { + try { + v.add(i); + } catch (Throwable ignored) { + + } + } + } + + return v; + } + public static KList initialize(String s) { return initialize(s, null); } diff --git a/src/main/java/com/volmit/iris/core/loader/IrisData.java b/src/main/java/com/volmit/iris/core/loader/IrisData.java index 3c6f5aed7..006e18f9e 100644 --- a/src/main/java/com/volmit/iris/core/loader/IrisData.java +++ b/src/main/java/com/volmit/iris/core/loader/IrisData.java @@ -80,6 +80,7 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { private ResourceLoader scriptLoader; private ResourceLoader caveLoader; private ResourceLoader ravineLoader; + private KMap> possibleSnippets; private Gson gson; private Gson snippetLoader; private GsonBuilder builder; @@ -206,6 +207,7 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { } public synchronized void hotloaded() { + possibleSnippets = new KMap<>(); builder = new GsonBuilder() .addDeserializationExclusionStrategy(this) .addSerializationExclusionStrategy(this) @@ -450,4 +452,22 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { } }; } + + public KList getPossibleSnippets(String f) { + return possibleSnippets.computeIfAbsent(f, (k) -> { + KList l = new KList<>(); + + File snippetFolder = new File(getDataFolder(), "snippet/" + f); + + if(snippetFolder.exists() && snippetFolder.isDirectory()) + { + for(File i : snippetFolder.listFiles()) + { + l.add("snippet/" + f + "/" + i.getName().split("\\Q.\\E")[0]); + } + } + + return l; + }); + } } \ No newline at end of file diff --git a/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java b/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java index dbf9d5e02..d76619eb6 100644 --- a/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java +++ b/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java @@ -88,7 +88,9 @@ public class ResourceLoader { } o.put("fileMatch", new JSONArray(fm.toArray())); - o.put("schema", new SchemaBuilder(objectClass, manager).compute()); + o.put("url", "./.iris/schema/" + getFolderName() + "-schema.json"); + File a = new File(getManager().getDataFolder(), ".iris/schema/" + getFolderName() + "-schema.json"); + J.attemptAsync(() -> IO.writeAll(a, new SchemaBuilder(objectClass, manager).compute().toString(4))); return o; } diff --git a/src/main/java/com/volmit/iris/core/project/IrisProject.java b/src/main/java/com/volmit/iris/core/project/IrisProject.java index df46c2c34..7c9ed8bb9 100644 --- a/src/main/java/com/volmit/iris/core/project/IrisProject.java +++ b/src/main/java/com/volmit/iris/core/project/IrisProject.java @@ -35,11 +35,13 @@ import com.volmit.iris.engine.object.IrisObject; import com.volmit.iris.engine.object.IrisObjectPlacement; import com.volmit.iris.engine.object.IrisRegion; import com.volmit.iris.engine.object.IrisSpawner; +import com.volmit.iris.engine.object.annotations.Snippet; import com.volmit.iris.engine.platform.PlatformChunkGenerator; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.exceptions.IrisException; +import com.volmit.iris.util.format.Form; import com.volmit.iris.util.io.IO; import com.volmit.iris.util.json.JSONArray; import com.volmit.iris.util.json.JSONObject; @@ -274,6 +276,41 @@ public class IrisProject { } } + for(Class i : Iris.getClasses("com.volmit.iris.engine.object.", Snippet.class)) + { + try + { + String snipType = i.getDeclaredAnnotation(Snippet.class).value(); + JSONObject o = new JSONObject(); + KList fm = new KList<>(); + + for (int g = 1; g < 8; g++) { + fm.add("/snippet/" + snipType + Form.repeat("/*", g) + ".json"); + } + + o.put("fileMatch", new JSONArray(fm.toArray())); + o.put("url", "./.iris/schema/snippet/" + snipType + "-schema.json"); + schemas.put(o); + File a = new File(dm.getDataFolder(), ".iris/schema/snippet/" + snipType + "-schema.json"); + J.attemptAsync(() -> { + try + { + IO.writeAll(a, new SchemaBuilder(i, dm).compute().toString(4)); + } + + catch(Throwable e) + { + e.printStackTrace(); + } + }); + } + + catch(Throwable e) + { + e.printStackTrace(); + } + } + settings.put("json.schemas", schemas); ws.put("settings", settings); diff --git a/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java b/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java index a707201ac..eb515151b 100644 --- a/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java +++ b/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java @@ -120,10 +120,6 @@ public class SchemaBuilder { JSONObject property = buildProperty(k, c); - if (property.getBoolean("!required")) { - required.put(k.getName()); - } - property.remove("!required"); properties.put(k.getName(), property); } @@ -134,6 +130,21 @@ public class SchemaBuilder { o.put("properties", properties); + + if(c.isAnnotationPresent(Snippet.class)) + { + JSONObject anyOf = new JSONObject(); + JSONArray arr = new JSONArray(); + JSONObject str = new JSONObject(); + str.put("type", "string"); + arr.put(o); + arr.put(str); + anyOf.put("anyOf", arr); + anyOf.put("description", getDescription(c)); + + return anyOf; + } + return o; } @@ -554,6 +565,32 @@ public class SchemaBuilder { prop.put("type", type); prop.put("description", d.toString("\n")); + if(k.getType().isAnnotationPresent(Snippet.class)) + { + JSONObject anyOf = new JSONObject(); + JSONArray arr = new JSONArray(); + JSONObject str = new JSONObject(); + str.put("type", "string"); + String key = "enum-snippet-" + k.getType().getDeclaredAnnotation(Snippet.class).value(); + str.put("$ref", "#/definitions/"+key); + + if (!definitions.containsKey(key)) { + JSONObject j = new JSONObject(); + JSONArray snl = new JSONArray(); + data.getPossibleSnippets(k.getType().getDeclaredAnnotation(Snippet.class).value()).forEach(snl::put); + j.put("enum", snl); + definitions.put(key, j); + } + + arr.put(prop); + arr.put(str); + anyOf.put("anyOf", arr); + anyOf.put("description", d.toString("\n")); + anyOf.put("!required", k.isAnnotationPresent(Required.class)); + + return anyOf; + } + return prop; }