diff --git a/pom.xml b/pom.xml
index 8c9c62d..9f890f5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,11 +9,12 @@
TraQtor
- traqtor-framework
+
+ traqtor-aio
diff --git a/traqtor-aio/pom.xml b/traqtor-aio/pom.xml
new file mode 100644
index 0000000..58a8dc9
--- /dev/null
+++ b/traqtor-aio/pom.xml
@@ -0,0 +1,54 @@
+
+
+ 4.0.0
+
+ link.pagan
+ traqtor
+ 0.0.1-SNAPSHOT
+
+ link.pagan
+ traqtor-aio
+ 0.0.1-SNAPSHOT
+ jar
+ TraQtor / AIO
+
+ UTF-8
+ 11
+ 11
+
+
+
+
+ org.junit
+ junit-bom
+ 5.7.1
+ pom
+ import
+
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ test
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.12.1
+
+
+
+
+
+ maven-compiler-plugin
+ 3.8.1
+
+
+ maven-surefire-plugin
+ 2.22.2
+
+
+
+
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/_api/BinaryCommand.java b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/BinaryCommand.java
new file mode 100644
index 0000000..1c0e990
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/BinaryCommand.java
@@ -0,0 +1,24 @@
+// package link.pagan.traqtor._api;
+
+// import link.pagan.traqtor._api.result.CommandExecResult;
+
+// /**
+// *
+// * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+// */
+// public abstract class BinaryCommand extends UnaryCommand {
+
+// protected R arg2;
+
+// public CommandExecResult subexec(BinaryCommand subcommand) {
+// subcommand.setResultHolder(result);
+// subcommand.setArg(arg);
+// subcommand.setArg2(arg2);
+// return subcommand.exec();
+// }
+
+// public void setArg2(R arg2) {
+// this.arg2 = arg2;
+// }
+
+// }
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/_api/Commanded.java b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/Commanded.java
new file mode 100644
index 0000000..3852bb7
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/Commanded.java
@@ -0,0 +1,9 @@
+package link.pagan.traqtor._api;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public interface Commanded {
+
+}
\ No newline at end of file
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/_api/Executor.java b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/Executor.java
new file mode 100644
index 0000000..663b137
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/Executor.java
@@ -0,0 +1,31 @@
+//package link.pagan.traqtor._api;
+//
+//import link.pagan.traqtor._api.result.CommandExecResult;
+//import link.pagan.traqtor._api.result.CommandExecResultStatus;
+//
+///**
+// *
+// * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+// */
+//public abstract class Executor> extends Commanded {
+//
+//
+//
+// @SuppressWarnings("unchecked")
+// public CommandExecResult execute(Command command) {
+// CommandExecResult result = new CommandExecResult();
+// command.setResultHolder(result);
+// command.exec((T) this);
+// if (!mute) {
+// if (paranoindLoggin) {
+// result.print();
+// } else {
+// if (result.getStatus() != CommandExecResultStatus.DONE) {
+// result.print();
+// }
+// }
+// }
+// return result;
+// }
+//
+//}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/_api/UnaryCommand.java b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/UnaryCommand.java
new file mode 100644
index 0000000..6a9f99a
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/UnaryCommand.java
@@ -0,0 +1,77 @@
+package link.pagan.traqtor._api;
+
+import link.pagan.traqtor._api.result.CommandExecResult;
+import link.pagan.traqtor._api.result.message.CommandExecMessage;
+import link.pagan.traqtor._api.result.message.CommandExecMessageStatus;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public abstract class UnaryCommand {
+
+ private static boolean paranoindLoggin = false;
+ private static boolean mute = true;
+
+ public static void enableParanoindLoggin() {
+ enableLog();
+ paranoindLoggin = true;
+ }
+
+ public static void enableLog() {
+ mute = false;
+ }
+
+ protected CommandExecResult result;
+ protected T arg;
+
+ public abstract CommandExecResult exec();
+
+ public CommandExecResult subexec(UnaryCommand subcommand) {
+ subcommand.setResultHolder(result);
+ subcommand.setArg(arg);
+ return subcommand.exec();
+ }
+
+ protected CommandExecResult fail(String message) {
+ result.add(new CommandExecMessage(CommandExecMessageStatus.FAIL, message));
+ return result;
+ }
+
+ protected CommandExecResult info(String message) {
+ result.add(new CommandExecMessage(CommandExecMessageStatus.INFO, message));
+ return result;
+ }
+
+ protected CommandExecResult warn(String message) {
+ result.add(new CommandExecMessage(CommandExecMessageStatus.WARN, message));
+ return result;
+ }
+
+ protected CommandExecResult done(String message) {
+ result.add(new CommandExecMessage(CommandExecMessageStatus.DONE, message));
+ return result;
+ }
+
+ protected CommandExecResult done() {
+ result.add(new CommandExecMessage(CommandExecMessageStatus.DONE, "OK"));
+ return result;
+ }
+
+ public void setResultHolder(CommandExecResult result) {
+ this.result = result;
+ }
+
+ public void setArg(T arg) {
+ this.arg = arg;
+ }
+
+ public static boolean paranoidLoggingEnabled() {
+ return paranoindLoggin;
+ }
+
+ public static boolean mute() {
+ return mute;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/_api/result/CommandExecResult.java b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/result/CommandExecResult.java
new file mode 100644
index 0000000..68e9db2
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/result/CommandExecResult.java
@@ -0,0 +1,42 @@
+package link.pagan.traqtor._api.result;
+
+import java.util.ArrayList;
+import link.pagan.traqtor._api.result.message.CommandExecMessage;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class CommandExecResult {
+
+ final ArrayList messages;
+
+ public CommandExecResult() {
+ this.messages = new ArrayList();
+ }
+
+ public void add(CommandExecMessage message) {
+ this.messages.add(message);
+ }
+
+ public boolean OK () {
+ return this.getStatus() != CommandExecResultStatus.FAIL;
+ }
+
+ public CommandExecResultStatus getStatus() {
+ int status = 100;
+ for (CommandExecMessage message : messages) {
+ if (status > message.getStatus().getCode()) {
+ status = message.getStatus().getCode();
+ }
+ }
+ return CommandExecResultStatus.ofCode(status);
+ }
+
+ public void print() {
+ for (CommandExecMessage message : messages) {
+ message.print();
+ }
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/_api/result/CommandExecResultStatus.java b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/result/CommandExecResultStatus.java
new file mode 100644
index 0000000..72a82ac
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/result/CommandExecResultStatus.java
@@ -0,0 +1,27 @@
+package link.pagan.traqtor._api.result;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public enum CommandExecResultStatus {
+ DONE(0),
+ WARN(-1),
+ FAIL(-2);
+
+ int code;
+
+ private CommandExecResultStatus(int code) {
+ this.code = code;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public static CommandExecResultStatus ofCode (int code) {
+ if (code < -1) return FAIL;
+ if (code == -1) return WARN;
+ return DONE;
+ }
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/_api/result/message/CommandExecMessage.java b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/result/message/CommandExecMessage.java
new file mode 100644
index 0000000..da8fb75
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/result/message/CommandExecMessage.java
@@ -0,0 +1,33 @@
+package link.pagan.traqtor._api.result.message;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class CommandExecMessage {
+
+ final CommandExecMessageStatus status;
+ final String message;
+
+ public CommandExecMessage(CommandExecMessageStatus status, String message) {
+ this.status = status;
+ this.message = message;
+ }
+
+ public CommandExecMessageStatus getStatus() {
+ return status;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void print() {
+// if (status.getCode() < 0) {
+ System.out.println(status.toString() + " : " + message);
+// } else {
+// System.out.println(status.toString() + " : " + message);
+// }
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/_api/result/message/CommandExecMessageStatus.java b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/result/message/CommandExecMessageStatus.java
new file mode 100644
index 0000000..b947457
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/_api/result/message/CommandExecMessageStatus.java
@@ -0,0 +1,28 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor._api.result.message;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public enum CommandExecMessageStatus {
+ INFO(1),
+ DONE(0),
+ WARN(-1),
+ FAIL(-2);
+
+ int code;
+
+ private CommandExecMessageStatus(int code) {
+ this.code = code;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/api/API.java b/traqtor-aio/src/main/java/link/pagan/traqtor/api/API.java
new file mode 100644
index 0000000..09c082e
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/api/API.java
@@ -0,0 +1,303 @@
+package link.pagan.traqtor.api;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import link.pagan.traqtor._api.UnaryCommand;
+import link.pagan.traqtor._api.result.CommandExecResult;
+import link.pagan.traqtor._api.result.message.CommandExecMessage;
+import link.pagan.traqtor._api.result.message.CommandExecMessageStatus;
+import link.pagan.traqtor.api.project.Project;
+import link.pagan.traqtor.api.project.universe.UniverseProject;
+import link.pagan.traqtor.api.workspace.Workspace;
+import link.pagan.traqtor.schema.data.DataTypeSchema;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class API {
+
+ private static boolean workspaceExists (CommandExecResult result, Traqtor traqtor) {
+ if (traqtor.workspace() == null) {
+ result.add(new CommandExecMessage(CommandExecMessageStatus.FAIL, "No workspace initialized"));
+ return false;
+ }
+ return true;
+ }
+
+ public static class CreateWorkspace extends UnaryCommand {
+
+ private final Name name;
+ private final String path;
+
+ public CreateWorkspace() {
+ this(Workspace.DEFAULT_WORKSPACE_NAME);
+ }
+
+ public CreateWorkspace(Name name) {
+ this(name, null);
+ }
+
+ public CreateWorkspace(Name name, String path) {
+ this.name = name;
+ this.path = path;
+ }
+
+ @Override
+ public CommandExecResult exec() {
+ if (arg.workspace() != null) {
+ return fail("There is an open workspace - please close this first, before creating new one");
+ }
+ arg.workspace(new Workspace());
+ arg.workspace().name(name);
+ subexec(new API.WorkspaceLoadDataTypeSchema(Name.of("traqtor", "basic")));
+ if (!result.OK()) {
+ arg.workspace(null);
+ return result;
+ }
+
+ if (path != null) {
+ subexec(new SaveAsWorkspace(path));
+ if (!result.OK()) {
+ arg.workspace(null);
+ return result;
+ }
+ }
+ return done();
+ }
+
+ }
+
+ public static class SaveAsWorkspace extends UnaryCommand {
+
+ private final String workspacePath;
+
+ public SaveAsWorkspace(String workspacePath) {
+ this.workspacePath = workspacePath;
+ }
+
+ @Override
+ public CommandExecResult exec() {
+ File workspaceDir = new File(workspacePath);
+ if (!workspaceDir.exists()) {
+ if (!workspaceDir.mkdir()) {
+ return fail("Failed to create workspace root directory at " + workspacePath);
+ } else {
+ info("Workspace root directory created at " + workspacePath);
+ }
+ } else {
+ if (workspaceDir.listFiles().length > 0) {
+ return fail("Root directory is not empty, failed to assing " + workspacePath + " as root for workspace");
+ }
+ }
+ File workspaceFile = new File(workspacePath, Workspace.JSON_FILENAME + ".json");
+ if (!workspaceFile.exists()) {
+ try {
+ if (!workspaceFile.createNewFile()) {
+ return fail("Failed to create " + Workspace.JSON_FILENAME + ".json in workspace root directory");
+ }
+ } catch (IOException ex) {
+ return fail("IO erorr while creating " + Workspace.JSON_FILENAME + ".json in workspace root directory");
+ }
+ }
+
+ String hold = arg.workspace().root();
+ arg.workspace().root(workspacePath);
+ subexec(new SaveWorkspace());
+ if (!result.OK()) {
+ arg.workspace().root(hold);
+ return result;
+ }
+
+ return done();
+ }
+
+ }
+
+ public static class SaveWorkspace extends UnaryCommand {
+
+ @Override
+ public CommandExecResult exec() {
+ String workspacePath = arg.workspace().root();
+ if (arg.workspace().root() == null) {
+ return fail("Workspace was not saved before - use \"save as\" command for the first save");
+ }
+ File workspaceFile = new File(workspacePath, Workspace.JSON_FILENAME + ".json");
+
+ if (!workspaceFile.exists()) {
+ return fail("Failed to save, " + Workspace.JSON_FILENAME + ".json does not exist, workspace corrupted?");
+ }
+
+ if (!workspaceFile.canWrite()) {
+ return fail("Can not write " + Workspace.JSON_FILENAME + ".json - permission denied");
+ }
+
+ try {
+ arg.workspace().mapper().writeValue(workspaceFile, arg.workspace());
+ } catch (IOException ex) {
+ System.err.println(ex);
+ return fail("Failed to write " + Workspace.JSON_FILENAME + ".json");
+ }
+
+ //TODO add project save
+// for (Project project : arg.workspace().projects()) {
+// subexec(new )
+// }
+
+ arg.workspace().dirty(false);
+
+ return done();
+ }
+
+ }
+
+ public static class LoadWorkspace extends UnaryCommand {
+
+ private final String workspacePath;
+
+ public LoadWorkspace(String workspacePath) {
+ this.workspacePath = workspacePath;
+ }
+
+ @Override
+ public CommandExecResult exec() {
+ File workspaceFile = new File(workspacePath, Workspace.JSON_FILENAME + ".json");
+ if (!workspaceFile.exists()) {
+ return fail("No " + Workspace.JSON_FILENAME + ".json file found in selected directory, missed?");
+ }
+
+ ObjectMapper mapper = new ObjectMapper();
+ SimpleModule module = new SimpleModule();
+ module.addDeserializer(Workspace.class, new Workspace.WorkspaceDeserializer());
+ mapper.registerModule(module);
+
+ Workspace workspace = null;
+ try {
+ workspace = mapper.readValue(workspaceFile, Workspace.class);
+ } catch (IOException ex) {
+ System.err.println(ex);
+ return fail("Failed to read " + workspaceFile.getAbsolutePath());
+ }
+ workspace.root(workspacePath);
+ HashMap schemas = workspace.dataTypeSchemas();
+ for (Name name : schemas.keySet()) {
+ if (schemas.get(name) == null) {
+ DataTypeSchema loaded = arg.dataTypeSchemas.get(name);
+ if (loaded == null) {
+ warn("Shema with name " + name.asDotted() + " was not found in system. Preload or give up");
+ } else {
+ schemas.put(name, loaded);
+ info("Shema " + name.asDotted() + " was found and loaded into workspace on load");
+ }
+ }
+ }
+
+ arg.workspace(workspace);
+ return done();
+ }
+ }
+
+ public static class WorkspaceLoadDataTypeSchema extends UnaryCommand {
+
+ private final Name name;
+
+ public WorkspaceLoadDataTypeSchema(Name name) {
+ this.name = name;
+ }
+
+ @Override
+ public CommandExecResult exec() {
+ if (!workspaceExists(result, arg)) {
+ return result;
+ }
+ DataTypeSchema schema = arg.dataTypeSchemas.get(this.name);
+ if (schema == null) {
+ return fail("Unable to load data type schema by name " + name.asDotted());
+ }
+ arg.workspace().dataTypeSchemas().put(schema.getName(), schema);
+ return done();
+ }
+
+ }
+
+ public static class WorkspaceCreateUniverseProject extends UnaryCommand {
+
+ private final Name name;
+ private final Name schema;
+
+ public WorkspaceCreateUniverseProject(Name name, Name schema) {
+ this.name = name;
+ this.schema = schema;
+ }
+
+ @Override
+ public CommandExecResult exec() {
+ if (!workspaceExists(result, arg)) {
+ return result;
+ }
+ Workspace workspace = arg.workspace();
+ DataTypeSchema dataTypeSchema = workspace.dataTypeSchemas().get(schema);
+ if (dataTypeSchema == null) {
+ return fail("Data type schema with name " + schema.asDotted() + " was not found");
+ }
+ if (workspace.projects().containsKey(this.name)) {
+ return fail("Project with name " + this.name + " already exists");
+ }
+
+ Project project = new UniverseProject(name, dataTypeSchema);
+ workspace.projects().put(project.name(), project);
+ workspace.dirty(true);
+
+ CommandExecResult saveResult = arg.execute(new API.SaveWorkspace());
+ if (!saveResult.OK()) {
+ return fail("Failed to save workspace, after project addition");
+ }
+
+ return done();
+ }
+
+ }
+
+ public static class ProjectSave extends UnaryCommand {
+
+ private final Name name;
+ private final Name schema;
+
+ public ProjectSave(Name name, Name schema) {
+ this.name = name;
+ this.schema = schema;
+ }
+
+ @Override
+ public CommandExecResult exec() {
+ if (!workspaceExists(result, arg)) {
+ return result;
+ }
+ Workspace workspace = arg.workspace();
+ DataTypeSchema dataTypeSchema = workspace.dataTypeSchemas().get(schema);
+ if (dataTypeSchema == null) {
+ return fail("Data type schema with name " + schema.asDotted() + " was not found");
+ }
+ if (workspace.projects().containsKey(this.name)) {
+ return fail("Project with name " + this.name + " already exists");
+ }
+
+ Project project = new UniverseProject(name, dataTypeSchema);
+ workspace.projects().put(project.name(), project);
+ workspace.dirty(true);
+
+ CommandExecResult saveResult = arg.execute(new API.SaveWorkspace());
+ if (!saveResult.OK()) {
+ return fail("Failed to save workspace, after project addition");
+ }
+
+ return done();
+ }
+
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/api/Traqtor.java b/traqtor-aio/src/main/java/link/pagan/traqtor/api/Traqtor.java
new file mode 100644
index 0000000..2a1ceae
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/api/Traqtor.java
@@ -0,0 +1,63 @@
+package link.pagan.traqtor.api;
+
+import java.util.HashMap;
+import java.util.Map;
+import link.pagan.traqtor._api.UnaryCommand;
+import link.pagan.traqtor._api.Commanded;
+import link.pagan.traqtor._api.result.CommandExecResult;
+import link.pagan.traqtor._api.result.CommandExecResultStatus;
+import link.pagan.traqtor.api.workspace.Workspace;
+import link.pagan.traqtor.schema.basic.data.DataTypeSchemaReferenceImplementation;
+import link.pagan.traqtor.schema.data.DataTypeSchema;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class Traqtor implements Commanded {
+
+ private Workspace workspace;
+
+ Map dataTypeSchemas;
+
+ public static Traqtor init() {
+ Traqtor traqtor = new Traqtor();
+ traqtor.registerDataTypeSchema(new DataTypeSchemaReferenceImplementation());
+ return traqtor;
+ }
+
+ private void registerDataTypeSchema(DataTypeSchema schema) {
+ this.dataTypeSchemas.put(schema.getName(), schema);
+ }
+
+ private Traqtor() {
+ this.dataTypeSchemas = new HashMap<>();
+ }
+
+ public Workspace workspace() {
+ return workspace;
+ }
+
+ public void workspace(Workspace workspace) {
+ this.workspace = workspace;
+ }
+
+ public CommandExecResult execute(UnaryCommand command) {
+ CommandExecResult result = new CommandExecResult();
+ command.setResultHolder(result);
+ command.setArg(this);
+ command.exec();
+ if (!UnaryCommand.mute()) {
+ if (UnaryCommand.paranoidLoggingEnabled()) {
+ result.print();
+ } else {
+ if (result.getStatus() != CommandExecResultStatus.DONE) {
+ result.print();
+ }
+ }
+ }
+ return result;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/Project.java b/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/Project.java
new file mode 100644
index 0000000..9f0c02c
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/Project.java
@@ -0,0 +1,42 @@
+package link.pagan.traqtor.api.project;
+
+import link.pagan.traqtor._api.Commanded;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public abstract class Project implements Commanded {
+
+ private final ProjectType type;
+ private Name name;
+ private boolean dirty;
+
+ public Project(ProjectType type, Name name) {
+ this.type = type;
+ this.name = name;
+ this.dirty = true;
+ }
+
+ public ProjectType type() {
+ return type;
+ }
+
+ public Name name() {
+ return name;
+ }
+
+ public void name(Name name) {
+ this.name = name;
+ }
+
+ public boolean dirty() {
+ return dirty;
+ }
+
+ public void dirty(boolean dirty) {
+ this.dirty = dirty;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/ProjectType.java b/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/ProjectType.java
new file mode 100644
index 0000000..89f3c0e
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/ProjectType.java
@@ -0,0 +1,74 @@
+package link.pagan.traqtor.api.project;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import java.io.IOException;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public enum ProjectType {
+ UNIVERSE("universe"),
+ DATABASE("database"),
+ FRONTEND("frontend"),
+ BACKEND("backend");
+
+ String jsonValue;
+
+ private ProjectType(String jsonValue) {
+ this.jsonValue = jsonValue;
+ }
+
+ public static final class ProjectTypeSerializer extends StdSerializer {
+
+ private static final long serialVersionUID = 1L;
+
+ public ProjectTypeSerializer() {
+ this(null);
+ }
+
+ public ProjectTypeSerializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public void serialize(ProjectType value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+ gen.writeString(value.jsonValue);
+ }
+
+ }
+
+ public static final class ProjectTypeDeserializer extends StdDeserializer {
+
+ private static final long serialVersionUID = 1L;
+
+ public ProjectTypeDeserializer() {
+ this(null);
+ }
+
+ public ProjectTypeDeserializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public ProjectType deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+ JsonNode stringType = parser.getCodec().readTree(parser);
+ String type = stringType.asText();
+ for (ProjectType pt : values()) {
+ if (pt.jsonValue.equals(type)) {
+ return pt;
+ }
+ }
+ return null;
+ }
+
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/backend/BackendProject.java b/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/backend/BackendProject.java
new file mode 100644
index 0000000..a867a3b
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/backend/BackendProject.java
@@ -0,0 +1,22 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.api.project.backend;
+
+import link.pagan.traqtor.api.project.Project;
+import link.pagan.traqtor.api.project.ProjectType;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class BackendProject extends Project {
+
+ public BackendProject(Name name) {
+ super(ProjectType.BACKEND, name);
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/database/DatabaseProject.java b/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/database/DatabaseProject.java
new file mode 100644
index 0000000..1a233e7
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/database/DatabaseProject.java
@@ -0,0 +1,22 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.api.project.database;
+
+import link.pagan.traqtor.api.project.Project;
+import link.pagan.traqtor.api.project.ProjectType;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class DatabaseProject extends Project {
+
+ public DatabaseProject(Name name) {
+ super(ProjectType.DATABASE, name);
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/frontend/FrontendProject.java b/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/frontend/FrontendProject.java
new file mode 100644
index 0000000..7289b61
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/frontend/FrontendProject.java
@@ -0,0 +1,22 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.api.project.frontend;
+
+import link.pagan.traqtor.api.project.Project;
+import link.pagan.traqtor.api.project.ProjectType;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class FrontendProject extends Project {
+
+ public FrontendProject(Name name) {
+ super(ProjectType.FRONTEND, name);
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/universe/UniverseProject.java b/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/universe/UniverseProject.java
new file mode 100644
index 0000000..5351221
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/api/project/universe/UniverseProject.java
@@ -0,0 +1,22 @@
+package link.pagan.traqtor.api.project.universe;
+
+import link.pagan.traqtor.api.project.Project;
+import link.pagan.traqtor.api.project.ProjectType;
+import link.pagan.traqtor.schema.data.DataTypeSchema;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class UniverseProject extends Project {
+
+ DataTypeSchema dataTypeSchema;
+
+ public UniverseProject(Name name, DataTypeSchema dataTypeSchema) {
+ super(ProjectType.UNIVERSE, name);
+ this.dataTypeSchema = dataTypeSchema;
+
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/api/workspace/Workspace.java b/traqtor-aio/src/main/java/link/pagan/traqtor/api/workspace/Workspace.java
new file mode 100644
index 0000000..fe028b5
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/api/workspace/Workspace.java
@@ -0,0 +1,188 @@
+package link.pagan.traqtor.api.workspace;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import link.pagan.traqtor._api.Commanded;
+import link.pagan.traqtor.api.project.Project;
+import link.pagan.traqtor.generator.blueprint.universe.AtomBlueprint;
+import link.pagan.traqtor.generator.blueprint.universe.LinkBlueprint;
+import link.pagan.traqtor.generator.blueprint.universe.LinkType;
+import link.pagan.traqtor.generator.blueprint.universe.ParticleBlueprint;
+import link.pagan.traqtor.generator.blueprint.universe.UniverseBlueprint;
+import link.pagan.traqtor.schema.data.DataTypeSchema;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class Workspace implements Commanded {
+
+ public static final String JSON_FILENAME = "workspace";
+ public static final Name DEFAULT_WORKSPACE_NAME = Name.of("workspace");
+
+ private final ObjectMapper mapper;
+
+ private boolean dirty;
+
+ private String root;
+
+ private Name name;
+ private HashMap schemas;
+ private HashMap projects;
+
+ public Workspace() {
+ this.mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
+
+ SimpleModule module = new SimpleModule();
+ module.addSerializer(Workspace.class, new Workspace.WorkspaceSerializer());
+
+ module.addSerializer(UniverseBlueprint.class, new UniverseBlueprint.UniverseBlueprintSerializer());
+ module.addSerializer(Name.class, new Name.NameSerializer());
+ module.addDeserializer(Name.class, new Name.NameDeserializer());
+ module.addSerializer(ParticleBlueprint.class, new ParticleBlueprint.ParticleBlueprintSerializer());
+ module.addSerializer(AtomBlueprint.class, new AtomBlueprint.AtomBlueprintSerializer());
+ module.addSerializer(LinkBlueprint.class, new LinkBlueprint.LinkBlueprintSerializer());
+ module.addSerializer(LinkType.class, new LinkType.LinkTypeSerializer());
+ mapper.registerModule(module);
+ this.dirty = true;
+ this.projects = new HashMap<>();
+ this.schemas = new HashMap<>();
+ }
+
+ public Name name() {
+ return name;
+ }
+
+ public String root() {
+ return root;
+ }
+
+ public void root(String root) {
+ this.root = root;
+ }
+
+ public void name(Name name) {
+ this.name = name;
+ }
+
+ public ObjectMapper mapper() {
+ return mapper;
+ }
+
+ public boolean dirty() {
+ return dirty;
+ }
+
+ public void dirty(boolean dirty) {
+ this.dirty = dirty;
+ }
+
+ public HashMap dataTypeSchemas() {
+ return schemas;
+ }
+
+ public HashMap projects() {
+ return projects;
+ }
+
+ public static final class WorkspaceSerializer extends StdSerializer {
+
+ private static final long serialVersionUID = 1L;
+
+ public WorkspaceSerializer() {
+ this(null);
+ }
+
+ public WorkspaceSerializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public void serialize(Workspace value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+ gen.writeStartObject();
+ gen.writeObjectField("name", value.name);
+ gen.writeBooleanField("pretty", value.mapper.isEnabled(SerializationFeature.INDENT_OUTPUT));
+ gen.writeArrayFieldStart("schemas");
+ ArrayList schemaNames = new ArrayList<>();
+ for (Name schemaName : value.schemas.keySet()) {
+ schemaNames.add(schemaName);
+ }
+ schemaNames.sort(Name.COMPARATOR);
+ for (Name name : schemaNames) {
+ gen.writeObject(name);
+ }
+ gen.writeEndArray();
+
+ gen.writeArrayFieldStart("projects");
+ ArrayList projectNames = new ArrayList<>();
+ for (Name projectName : value.projects.keySet()) {
+ projectNames.add(projectName);
+ }
+ projectNames.sort(Name.COMPARATOR);
+ for (Name name : projectNames) {
+ gen.writeObject(name);
+ }
+ gen.writeEndArray();
+
+ gen.writeEndObject();
+ }
+
+ }
+
+ public static final class WorkspaceDeserializer extends StdDeserializer {
+
+ private static final long serialVersionUID = 1L;
+
+ public WorkspaceDeserializer() {
+ this(null);
+ }
+
+ public WorkspaceDeserializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public Workspace deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
+ Workspace workspace = new Workspace();
+
+ JsonNode node = parser.getCodec().readTree(parser);
+ boolean pretty = node.get("pretty").asBoolean(false);
+
+ if (pretty) {
+ workspace.mapper.enable(SerializationFeature.INDENT_OUTPUT);
+ } else {
+ workspace.mapper.disable(SerializationFeature.INDENT_OUTPUT);
+ }
+
+ Name name = workspace.mapper.treeToValue(node.get("name"), Name.class);
+ workspace.name(name);
+
+ for (JsonNode schema : node.get("schemas")) {
+ Name readValue = workspace.mapper.readValue(schema.toString(), Name.class);
+ workspace.schemas.put(readValue, null);
+ }
+
+ for (JsonNode project : node.get("projects")) {
+ workspace.projects.put(workspace.mapper.readValue(project.asText(), Name.class), null);
+ }
+
+ workspace.dirty = false;
+ return workspace;
+ }
+
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/framework/data/DatabaseDataObject.java b/traqtor-aio/src/main/java/link/pagan/traqtor/framework/data/DatabaseDataObject.java
new file mode 100644
index 0000000..e780acf
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/framework/data/DatabaseDataObject.java
@@ -0,0 +1,13 @@
+//package link.pagan.traqtor.framework.data;
+//
+//import org.apache.cayenne.BaseDataObject;
+//
+///**
+// *
+// * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+// */
+//public class DatabaseDataObject extends BaseDataObject {
+//
+// private static final long serialVersionUID = 1448137394405559485L;
+//
+//}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/framework/logic/Registry.java b/traqtor-aio/src/main/java/link/pagan/traqtor/framework/logic/Registry.java
new file mode 100644
index 0000000..c18fcc6
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/framework/logic/Registry.java
@@ -0,0 +1,14 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.framework.logic;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class Registry {
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/framework/logic/Resource.java b/traqtor-aio/src/main/java/link/pagan/traqtor/framework/logic/Resource.java
new file mode 100644
index 0000000..945f7fa
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/framework/logic/Resource.java
@@ -0,0 +1,14 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.framework.logic;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class Resource {
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/framework/logic/Service.java b/traqtor-aio/src/main/java/link/pagan/traqtor/framework/logic/Service.java
new file mode 100644
index 0000000..eee8d1b
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/framework/logic/Service.java
@@ -0,0 +1,14 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.framework.logic;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class Service {
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/R.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/R.java
new file mode 100644
index 0000000..489abac
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/R.java
@@ -0,0 +1,30 @@
+package link.pagan.traqtor.generator;
+
+import link.pagan.traqtor.generator.blueprint.database.builder.ColumnBlueprintBuilder;
+import link.pagan.traqtor.generator.blueprint.database.builder.DatabaseBlueprintBuilder;
+import link.pagan.traqtor.generator.blueprint.database.builder.SchemeBlueprintBuilder;
+import link.pagan.traqtor.generator.blueprint.database.builder.TableBlueprintBuilder;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class R {
+
+ public static DatabaseBlueprintBuilder database() {
+ return new DatabaseBlueprintBuilder();
+ }
+
+ public static SchemeBlueprintBuilder schema() {
+ return new SchemeBlueprintBuilder();
+ }
+
+ public static TableBlueprintBuilder table() {
+ return new TableBlueprintBuilder();
+ }
+
+ public static ColumnBlueprintBuilder column() {
+ return new ColumnBlueprintBuilder();
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/ProjectBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/ProjectBlueprint.java
new file mode 100644
index 0000000..f3f4118
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/ProjectBlueprint.java
@@ -0,0 +1,20 @@
+package link.pagan.traqtor.generator.blueprint;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public abstract class ProjectBlueprint {
+
+
+
+// String name;
+// Name rootPackage;
+// String description;
+
+//
+// public void assemble() {
+//
+// }
+//
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/backend/BackendBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/backend/BackendBlueprint.java
new file mode 100644
index 0000000..04f59d8
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/backend/BackendBlueprint.java
@@ -0,0 +1,14 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.generator.blueprint.backend;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class BackendBlueprint {
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/ColumnBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/ColumnBlueprint.java
new file mode 100644
index 0000000..4efb09f
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/ColumnBlueprint.java
@@ -0,0 +1,27 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.generator.blueprint.database;
+
+import link.pagan.traqtor.util.Name;
+import link.pagan.traqtor.schema.data.DataType;
+
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class ColumnBlueprint {
+
+ Name name;
+ DataType dataType;
+
+ public ColumnBlueprint(Name name) {
+ this.name = name;
+ }
+
+
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/DatabaseBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/DatabaseBlueprint.java
new file mode 100644
index 0000000..f8cebe4
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/DatabaseBlueprint.java
@@ -0,0 +1,19 @@
+package link.pagan.traqtor.generator.blueprint.database;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class DatabaseBlueprint {
+
+ String name;
+ // private List schemas;
+ // private DatabaseAdapter databaseAdapter;
+
+ public DatabaseBlueprint(String name) {
+ this.name = name;
+ }
+
+
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/SchemeBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/SchemeBlueprint.java
new file mode 100644
index 0000000..3d002b1
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/SchemeBlueprint.java
@@ -0,0 +1,14 @@
+package link.pagan.traqtor.generator.blueprint.database;
+
+import java.util.ArrayList;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class SchemeBlueprint {
+
+ String name;
+ ArrayList tables;
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/TableBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/TableBlueprint.java
new file mode 100644
index 0000000..8f695be
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/TableBlueprint.java
@@ -0,0 +1,19 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.generator.blueprint.database;
+
+import java.util.ArrayList;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class TableBlueprint {
+
+ String name;
+ ArrayList columns;
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/ColumnBlueprintBuilder.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/ColumnBlueprintBuilder.java
new file mode 100644
index 0000000..6a59da9
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/ColumnBlueprintBuilder.java
@@ -0,0 +1,55 @@
+package link.pagan.traqtor.generator.blueprint.database.builder;
+
+import link.pagan.traqtor.generator.blueprint.database.ColumnBlueprint;
+import link.pagan.traqtor.util.Name;
+import link.pagan.traqtor.schema.data.DataType;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class ColumnBlueprintBuilder {
+
+ private Name name;
+ private boolean pk;
+ private DataType dataType;
+
+ public ColumnBlueprintBuilder() {
+ this.pk = false;
+ }
+
+ public boolean pk() {
+ return this.pk;
+ }
+
+ public ColumnBlueprintBuilder pk(boolean pk) {
+ this.pk = pk;
+ return this;
+ }
+
+ public ColumnBlueprintBuilder name(Name name) {
+ this.name = name;
+ return this;
+ }
+
+
+ public Name name() {
+ return name;
+ }
+
+ public DataType dataType() {
+ return dataType;
+ }
+
+ public ColumnBlueprintBuilder dataType(DataType dataType) {
+ this.dataType = dataType;
+ return this;
+ }
+
+ public ColumnBlueprint build() {
+ return new ColumnBlueprint(name);
+ }
+
+
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/DatabaseBlueprintBuilder.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/DatabaseBlueprintBuilder.java
new file mode 100644
index 0000000..bdc82d1
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/DatabaseBlueprintBuilder.java
@@ -0,0 +1,57 @@
+package link.pagan.traqtor.generator.blueprint.database.builder;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import link.pagan.traqtor.util.Name;
+import link.pagan.traqtor.schema.data.mapping.database.DatabaseAdapter;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class DatabaseBlueprintBuilder {
+
+ private Name name;
+ private DatabaseAdapter adapter;
+ private final List schemas;
+
+ public DatabaseBlueprintBuilder() {
+ this.schemas = new ArrayList();
+ }
+
+ public Name name() {
+ return name;
+ }
+
+ public DatabaseBlueprintBuilder name(Name name) {
+ this.name = name;
+ return this;
+ }
+
+ public DatabaseAdapter adapter() {
+ return adapter;
+ }
+
+ public DatabaseBlueprintBuilder adapter(DatabaseAdapter adapter) {
+ this.adapter = adapter;
+ return this;
+ }
+
+ public DatabaseBlueprintBuilder schemas(SchemeBlueprintBuilder... schemas) {
+ if (schemas != null) {
+ Collections.addAll(this.schemas, schemas);
+ }
+ return this;
+ }
+
+ public SchemeBlueprintBuilder scheme(Name name) {
+ for (SchemeBlueprintBuilder sbb : schemas) {
+ if (sbb.name().equals(name)) {
+ return sbb;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/SchemeBlueprintBuilder.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/SchemeBlueprintBuilder.java
new file mode 100644
index 0000000..c0401dd
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/SchemeBlueprintBuilder.java
@@ -0,0 +1,46 @@
+package link.pagan.traqtor.generator.blueprint.database.builder;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class SchemeBlueprintBuilder {
+
+ private Name name;
+ private final List tables;
+
+ public SchemeBlueprintBuilder() {
+ this.tables = new ArrayList();
+ }
+
+ public Name name() {
+ return name;
+ }
+
+ public SchemeBlueprintBuilder name(Name name) {
+ this.name = name;
+ return this;
+ }
+
+ public SchemeBlueprintBuilder tables(TableBlueprintBuilder... tables) {
+ if (tables != null) {
+ Collections.addAll(this.tables, tables);
+ }
+ return this;
+ }
+
+ public TableBlueprintBuilder table(Name name) {
+ for (TableBlueprintBuilder tbb : tables) {
+ if (tbb.name().equals(name)) {
+ return tbb;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/TableBlueprintBuilder.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/TableBlueprintBuilder.java
new file mode 100644
index 0000000..2a08b57
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/TableBlueprintBuilder.java
@@ -0,0 +1,46 @@
+package link.pagan.traqtor.generator.blueprint.database.builder;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class TableBlueprintBuilder {
+
+ private Name name;
+ private final List columns;
+
+ public TableBlueprintBuilder() {
+ this.columns = new ArrayList();
+ }
+
+ public Name name() {
+ return name;
+ }
+
+ public TableBlueprintBuilder name(Name name) {
+ this.name = name;
+ return this;
+ }
+
+ public TableBlueprintBuilder columns(ColumnBlueprintBuilder... columns) {
+ if (columns != null) {
+ Collections.addAll(this.columns, columns);
+ }
+ return this;
+ }
+
+ public ColumnBlueprintBuilder column(Name name) {
+ for (ColumnBlueprintBuilder cbb : columns) {
+ if (cbb.name().equals(name)) {
+ return cbb;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/frontend/FrontendBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/frontend/FrontendBlueprint.java
new file mode 100644
index 0000000..9a85cf9
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/frontend/FrontendBlueprint.java
@@ -0,0 +1,14 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.generator.blueprint.frontend;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class FrontendBlueprint {
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/logic/EndpointBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/logic/EndpointBlueprint.java
new file mode 100644
index 0000000..7895d9c
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/logic/EndpointBlueprint.java
@@ -0,0 +1,20 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.generator.blueprint.mdl.logic;
+
+import java.util.ArrayList;
+import link.pagan.traqtor.generator.blueprint.mdl.security.permission.PermissionBlueprint;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class EndpointBlueprint {
+
+ ArrayList permissions;
+ String name;
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/logic/RegistryBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/logic/RegistryBlueprint.java
new file mode 100644
index 0000000..db20ab6
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/logic/RegistryBlueprint.java
@@ -0,0 +1,18 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.generator.blueprint.mdl.logic;
+
+import java.util.ArrayList;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class RegistryBlueprint {
+
+ ArrayList endpoints;
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/logic/ResourceBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/logic/ResourceBlueprint.java
new file mode 100644
index 0000000..e65a968
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/logic/ResourceBlueprint.java
@@ -0,0 +1,19 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.generator.blueprint.mdl.logic;
+
+import java.util.ArrayList;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class ResourceBlueprint {
+
+ String name;
+ ArrayList endpoints;
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/logic/ServiceBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/logic/ServiceBlueprint.java
new file mode 100644
index 0000000..acc2844
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/logic/ServiceBlueprint.java
@@ -0,0 +1,14 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.generator.blueprint.mdl.logic;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class ServiceBlueprint {
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/security/permission/PermissionBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/security/permission/PermissionBlueprint.java
new file mode 100644
index 0000000..ee421ad
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/security/permission/PermissionBlueprint.java
@@ -0,0 +1,16 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.generator.blueprint.mdl.security.permission;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class PermissionBlueprint {
+
+ String name;
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/security/permission/PermissionDomainBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/security/permission/PermissionDomainBlueprint.java
new file mode 100644
index 0000000..d542853
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/security/permission/PermissionDomainBlueprint.java
@@ -0,0 +1,20 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.generator.blueprint.mdl.security.permission;
+
+import java.util.ArrayList;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class PermissionDomainBlueprint {
+
+ String name;
+ ArrayList permissions;
+ ArrayList subdomains;
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/security/role/RoleBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/security/role/RoleBlueprint.java
new file mode 100644
index 0000000..b349872
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/mdl/security/role/RoleBlueprint.java
@@ -0,0 +1,14 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.generator.blueprint.mdl.security.role;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class RoleBlueprint {
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/AtomBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/AtomBlueprint.java
new file mode 100644
index 0000000..56d2add
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/AtomBlueprint.java
@@ -0,0 +1,57 @@
+package link.pagan.traqtor.generator.blueprint.universe;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import java.io.IOException;
+import java.util.List;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class AtomBlueprint {
+
+ Name name;
+ String description;
+ List particles;
+
+ public AtomBlueprint(Name name, String description, List particles) {
+ this.name = name;
+ this.description = description;
+ this.particles = particles;
+ }
+
+ public Name name() {
+ return name;
+ }
+
+ public static final class AtomBlueprintSerializer extends StdSerializer {
+
+ private static final long serialVersionUID = 1L;
+
+ public AtomBlueprintSerializer() {
+ this(null);
+ }
+
+ public AtomBlueprintSerializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public void serialize(AtomBlueprint value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+ gen.writeStartObject();
+ gen.writeObjectField("name", value.name);
+ gen.writeStringField("description", value.description);
+ gen.writeArrayFieldStart("particles");
+ for (ParticleBlueprint ab : value.particles) {
+ gen.writeObject(ab);
+ }
+ gen.writeEndArray();
+ gen.writeEndObject();
+ }
+
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/LinkBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/LinkBlueprint.java
new file mode 100644
index 0000000..25608ab
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/LinkBlueprint.java
@@ -0,0 +1,54 @@
+package link.pagan.traqtor.generator.blueprint.universe;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import java.io.IOException;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class LinkBlueprint {
+
+ AtomBlueprint from;
+ AtomBlueprint to;
+ LinkType type;
+
+ public LinkBlueprint(AtomBlueprint from, AtomBlueprint to, LinkType type) {
+ this.from = from;
+ this.to = to;
+ this.type = type;
+ }
+
+ public AtomBlueprint from() {
+ return from;
+ }
+
+ public AtomBlueprint to() {
+ return to;
+ }
+
+ public static final class LinkBlueprintSerializer extends StdSerializer {
+
+ private static final long serialVersionUID = 1L;
+
+ public LinkBlueprintSerializer() {
+ this(null);
+ }
+
+ public LinkBlueprintSerializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public void serialize(LinkBlueprint value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+ gen.writeStartObject();
+ gen.writeObjectField("name", value.from.name);
+ gen.writeObjectField("to", value.to.name);
+ gen.writeObjectField("type", value.type);
+ gen.writeEndObject();
+ }
+
+ }
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/LinkType.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/LinkType.java
new file mode 100644
index 0000000..bf93c3f
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/LinkType.java
@@ -0,0 +1,41 @@
+package link.pagan.traqtor.generator.blueprint.universe;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import java.io.IOException;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public enum LinkType {
+ MANY_TO_MANY,
+ ONE_TO_MANY,
+ ONE_TO_ONE;
+
+ public static final class LinkTypeSerializer extends StdSerializer {
+
+ private static final long serialVersionUID = 1L;
+
+ public LinkTypeSerializer() {
+ this(null);
+ }
+
+ public LinkTypeSerializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public void serialize(LinkType value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+ if (value.equals(MANY_TO_MANY)) {
+ gen.writeString("MANY_TO_MANY");
+ } else if (value.equals(ONE_TO_MANY)) {
+ gen.writeString("ONE_TO_MANY");
+ } else {
+ gen.writeString("ONE_TO_ONE");
+ }
+ }
+
+ }
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/ParticleBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/ParticleBlueprint.java
new file mode 100644
index 0000000..6f25253
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/ParticleBlueprint.java
@@ -0,0 +1,53 @@
+package link.pagan.traqtor.generator.blueprint.universe;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import java.io.IOException;
+import link.pagan.traqtor.util.Name;
+import link.pagan.traqtor.schema.data.DataType;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class ParticleBlueprint {
+
+ Name name;
+ String description;
+ DataType type;
+
+ public ParticleBlueprint(Name name, String description, DataType type) {
+ this.name = name;
+ this.description = description;
+ this.type = type;
+ }
+
+ public Name name() {
+ return name;
+ }
+
+ public static final class ParticleBlueprintSerializer extends StdSerializer {
+
+ private static final long serialVersionUID = 1L;
+
+ public ParticleBlueprintSerializer() {
+ this(null);
+ }
+
+ public ParticleBlueprintSerializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public void serialize(ParticleBlueprint value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+ gen.writeStartObject();
+ gen.writeObjectField("name", value.name);
+ gen.writeStringField("description", value.description);
+ gen.writeStringField("type", value.type.getName());
+ gen.writeEndObject();
+ }
+
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/UniverseBlueprint.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/UniverseBlueprint.java
new file mode 100644
index 0000000..db95a8e
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/UniverseBlueprint.java
@@ -0,0 +1,57 @@
+package link.pagan.traqtor.generator.blueprint.universe;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import java.io.IOException;
+import java.util.List;
+import link.pagan.traqtor.generator.blueprint.ProjectBlueprint;
+import link.pagan.traqtor.schema.data.DataTypeSchema;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class UniverseBlueprint extends ProjectBlueprint {
+
+ List atoms;
+ List links;
+ DataTypeSchema dataTypeSchema;
+
+ public UniverseBlueprint(List atoms, List links, DataTypeSchema dataTypeSchema) {
+ this.atoms = atoms;
+ this.links = links;
+ this.dataTypeSchema = dataTypeSchema;
+ }
+
+ public static final class UniverseBlueprintSerializer extends StdSerializer {
+
+ private static final long serialVersionUID = 1L;
+
+ public UniverseBlueprintSerializer() {
+ this(null);
+ }
+
+ public UniverseBlueprintSerializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public void serialize(UniverseBlueprint value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+ gen.writeStartObject();
+ gen.writeObjectField("schema", value.dataTypeSchema.getName());
+ gen.writeArrayFieldStart("atoms");
+ for (AtomBlueprint ab : value.atoms) {
+ gen.writeObject(ab);
+ }
+ gen.writeEndArray();
+ gen.writeArrayFieldStart("links");
+ for (LinkBlueprint lb : value.links) {
+ gen.writeObject(lb);
+ }
+ gen.writeEndArray();
+ gen.writeEndObject();
+ }
+
+ }
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/AtomBlueprintBuilder.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/AtomBlueprintBuilder.java
new file mode 100644
index 0000000..d26be33
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/AtomBlueprintBuilder.java
@@ -0,0 +1,57 @@
+package link.pagan.traqtor.generator.blueprint.universe.build;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import link.pagan.traqtor.generator.blueprint.universe.AtomBlueprint;
+import link.pagan.traqtor.generator.blueprint.universe.ParticleBlueprint;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class AtomBlueprintBuilder {
+
+ Name name;
+ String description;
+ List particleBuilders;
+
+ public AtomBlueprintBuilder() {
+ this.particleBuilders = new ArrayList<>();
+ }
+
+ public AtomBlueprint build(UniverseBlueprintBuilder builder) {
+ List particles = new ArrayList<>();
+ for (ParticleBlueprintBuilder pb : particleBuilders) {
+ particles.add(pb.build(builder));
+ }
+ particles.sort(new Comparator() {
+ @Override
+ public int compare(ParticleBlueprint a, ParticleBlueprint b) {
+ return a.name().asDotted().compareTo(b.name().asDotted());
+ }
+ });
+ return new AtomBlueprint(name, description, particles);
+ }
+
+ public Name name() {
+ return name;
+ }
+
+ public AtomBlueprintBuilder name(Name name) {
+ this.name = name;
+ return this;
+ }
+
+ public AtomBlueprintBuilder description(String description) {
+ this.description = description;
+ return this;
+ }
+
+ public AtomBlueprintBuilder addParticle(ParticleBlueprintBuilder particle) {
+ this.particleBuilders.add(particle);
+ return this;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/LinkBlueprintBuilder.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/LinkBlueprintBuilder.java
new file mode 100644
index 0000000..cc9d65b
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/LinkBlueprintBuilder.java
@@ -0,0 +1,55 @@
+package link.pagan.traqtor.generator.blueprint.universe.build;
+
+import java.util.ArrayList;
+import link.pagan.traqtor.generator.blueprint.universe.AtomBlueprint;
+import link.pagan.traqtor.generator.blueprint.universe.LinkBlueprint;
+import link.pagan.traqtor.generator.blueprint.universe.LinkType;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class LinkBlueprintBuilder {
+
+ Name from;
+ Name to;
+ LinkType type;
+
+ public LinkBlueprint build(UniverseBlueprintBuilder builder, ArrayList atoms) {
+ AtomBlueprint fromAtom = getAtom(from, atoms);
+ if (fromAtom == null) {
+ throw new RuntimeException("Link from atom can not be null");
+ }
+ AtomBlueprint toAtom = getAtom(to, atoms);
+ if (toAtom == null) {
+ throw new RuntimeException("Link to atom can not be null");
+ }
+ return new LinkBlueprint(fromAtom, toAtom, type);
+ }
+
+ public LinkBlueprintBuilder from(Name from) {
+ this.from = from;
+ return this;
+ }
+
+ public LinkBlueprintBuilder to(Name to) {
+ this.to = to;
+ return this;
+ }
+
+ public LinkBlueprintBuilder type(LinkType type) {
+ this.type = type;
+ return this;
+ }
+
+ private static AtomBlueprint getAtom(Name name, ArrayList atoms) {
+ for (AtomBlueprint ab : atoms) {
+ if (ab.name().equals(name)) {
+ return ab;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/ParticleBlueprintBuilder.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/ParticleBlueprintBuilder.java
new file mode 100644
index 0000000..2546c3f
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/ParticleBlueprintBuilder.java
@@ -0,0 +1,40 @@
+package link.pagan.traqtor.generator.blueprint.universe.build;
+
+import link.pagan.traqtor.generator.blueprint.universe.ParticleBlueprint;
+import link.pagan.traqtor.util.Name;
+import link.pagan.traqtor.schema.data.DataType;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class ParticleBlueprintBuilder {
+
+ Name name;
+ String description;
+ String type;
+
+ public ParticleBlueprint build(UniverseBlueprintBuilder builder) {
+ DataType dataType = builder.getType(type);
+ if (dataType == null) {
+ throw new RuntimeException("Particle type was not found on build");
+ }
+ return new ParticleBlueprint(name, description, dataType);
+ }
+
+ public ParticleBlueprintBuilder name(Name name) {
+ this.name = name;
+ return this;
+ }
+
+ public ParticleBlueprintBuilder description(String description) {
+ this.description = description;
+ return this;
+ }
+
+ public ParticleBlueprintBuilder type(String type) {
+ this.type = type;
+ return this;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/UniverseBlueprintBuilder.java b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/UniverseBlueprintBuilder.java
new file mode 100644
index 0000000..4c97a78
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/UniverseBlueprintBuilder.java
@@ -0,0 +1,73 @@
+package link.pagan.traqtor.generator.blueprint.universe.build;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import link.pagan.traqtor.generator.blueprint.universe.UniverseBlueprint;
+import link.pagan.traqtor.generator.blueprint.universe.AtomBlueprint;
+import link.pagan.traqtor.generator.blueprint.universe.LinkBlueprint;
+import link.pagan.traqtor.schema.data.DataType;
+import link.pagan.traqtor.schema.data.DataTypeSchema;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class UniverseBlueprintBuilder {
+
+ List atomBuilders;
+ List linkBuilder;
+ DataTypeSchema dataTypeSchema;
+
+ public UniverseBlueprintBuilder(DataTypeSchema dataTypeSchema) {
+ this.atomBuilders = new ArrayList<>();
+ this.linkBuilder = new ArrayList<>();
+ this.dataTypeSchema = dataTypeSchema;
+ }
+
+ public UniverseBlueprintBuilder addAtom(AtomBlueprintBuilder atom) {
+ this.atomBuilders.add(atom);
+ return this;
+ }
+
+ public UniverseBlueprintBuilder addLink(LinkBlueprintBuilder link) {
+ this.linkBuilder.add(link);
+ return this;
+ }
+
+ public UniverseBlueprint build() {
+ ArrayList atoms = new ArrayList<>();
+ for (AtomBlueprintBuilder ab : atomBuilders) {
+ atoms.add(ab.build(this));
+ }
+ atoms.sort(new Comparator() {
+ @Override
+ public int compare(AtomBlueprint a, AtomBlueprint b) {
+ return a.name().asDotted().compareTo(b.name().asDotted());
+ }
+ });
+
+ ArrayList links = new ArrayList<>();
+ for (LinkBlueprintBuilder lb : linkBuilder) {
+ links.add(lb.build(this, atoms));
+ }
+ links.sort(new Comparator() {
+ @Override
+ public int compare(LinkBlueprint a, LinkBlueprint b) {
+ return (a.from().name().asDotted() + "->" + a.to().name().asDotted()).compareTo(
+ (b.from().name().asDotted() + "->" + b.to().name().asDotted()));
+ }
+ });
+ return new UniverseBlueprint(atoms, links, dataTypeSchema);
+ }
+
+ DataType getType(String type) {
+ for (DataType dt : this.dataTypeSchema.getDataTypes()) {
+ if (dt.getName().equals(type)) {
+ return dt;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/EndpointSchemaImpl.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/EndpointSchemaImpl.java
new file mode 100644
index 0000000..015e5f3
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/EndpointSchemaImpl.java
@@ -0,0 +1,25 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.schema.basic;
+
+import java.util.List;
+import link.pagan.traqtor.schema.logic.EndpointSchema;
+import link.pagan.traqtor.schema.logic.EndpointTemplate;
+
+
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class EndpointSchemaImpl implements EndpointSchema {
+
+ @Override
+ public List getPatterns() {
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/DataTypeSchemaReferenceImplementation.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/DataTypeSchemaReferenceImplementation.java
new file mode 100644
index 0000000..f4a934d
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/DataTypeSchemaReferenceImplementation.java
@@ -0,0 +1,79 @@
+package link.pagan.traqtor.schema.basic.data;
+
+import java.util.List;
+import link.pagan.traqtor.schema.basic.data.mapping.MappingSchemaImpl;
+import link.pagan.traqtor.schema.data.DataType;
+import link.pagan.traqtor.schema.data.DataTypeSchema;
+import link.pagan.traqtor.schema.data.mapping.MappingSchema;
+import link.pagan.traqtor.util.Name;
+
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class DataTypeSchemaReferenceImplementation implements DataTypeSchema {
+
+ private static final Name name = Name.of("traqtor", "basic");
+
+ // ARRAY(""),
+ // LIST(""),
+ // SET(""),
+ // MAP(""),
+ public static final DataType BOOLEAN = new DataType("boolean");
+ public static final DataType BYTE = new DataType("byte");
+ public static final DataType SHORT = new DataType("short");
+ public static final DataType INTEGER = new DataType("int");
+ public static final DataType LONG = new DataType("long");
+ public static final DataType FLOAT = new DataType("float");
+ public static final DataType DOUBLE = new DataType("double");
+ public static final DataType STRING = new DataType("string");
+ public static final DataType DATE = new DataType("date");
+ public static final DataType TIME = new DataType("time");
+ public static final DataType TIMESTAMP = new DataType("timestamp");
+ public static final DataType ID = new DataType("id");
+ public static final DataType UUID = new DataType("uuid");
+
+ private static final List dataTypes = List.of(BOOLEAN, BYTE, SHORT, INTEGER, LONG, FLOAT, DOUBLE, STRING,
+ DATE, TIME, TIMESTAMP, ID, UUID);
+
+ private static final List mappingSchemas = List.of(new MappingSchemaImpl());
+
+ @Override
+ public List getDataTypes() {
+ return dataTypes;
+ }
+
+ @Override
+ public Name getName() {
+ return name;
+ }
+
+ @Override
+ public List getMappingSchema() {
+ return mappingSchemas;
+ }
+
+// @Override
+// public Map register() {
+// return new HashMap(){
+// private static final long serialVersionUID = 1L;
+// {
+// put(BOOLEAN.getName(), BOOLEAN);
+// put(BYTE.getName(), BYTE);
+// put(SHORT.getName(), SHORT);
+// put(INTEGER.getName(), INTEGER);
+// put(LONG.getName(), LONG);
+// put(FLOAT.getName(), FLOAT);
+// put(DOUBLE.getName(), DOUBLE);
+// put(STRING.getName(), STRING);
+// put(BOOLEAN.getName(), BOOLEAN);
+// put(DATE.getName(), DATE);
+// put(TIME.getName(), TIME);
+// put(TIMESTAMP.getName(), TIMESTAMP);
+// put(ID.getName(), ID);
+// put(UUID.getName(), UUID);
+// }};
+// }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/MappingSchemaImpl.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/MappingSchemaImpl.java
new file mode 100644
index 0000000..8a91620
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/MappingSchemaImpl.java
@@ -0,0 +1,59 @@
+package link.pagan.traqtor.schema.basic.data.mapping;
+
+import java.util.List;
+import link.pagan.traqtor.schema.basic.data.DataTypeSchemaReferenceImplementation;
+import link.pagan.traqtor.schema.data.mapping.MappingEntry;
+import link.pagan.traqtor.schema.data.mapping.MappingSchema;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class MappingSchemaImpl implements MappingSchema {
+
+ private static final Name name = Name.of("traqtor", "basic", "default");
+
+ public static final MappingEntry NULLABLE_BOOLEAN = new MappingEntry(DataTypeSchemaReferenceImplementation.BOOLEAN , true , false );
+ public static final MappingEntry BOOLEAN = new MappingEntry(DataTypeSchemaReferenceImplementation.BOOLEAN , false , true );
+ public static final MappingEntry NULLABLE_BYTE = new MappingEntry(DataTypeSchemaReferenceImplementation.BYTE , true , false );
+ public static final MappingEntry BYTE = new MappingEntry(DataTypeSchemaReferenceImplementation.BYTE , false , true );
+ public static final MappingEntry NULLABLE_SHORT = new MappingEntry(DataTypeSchemaReferenceImplementation.SHORT , true , false );
+ public static final MappingEntry SHORT = new MappingEntry(DataTypeSchemaReferenceImplementation.SHORT , false , true );
+ public static final MappingEntry NULLABLE_INTEGER = new MappingEntry(DataTypeSchemaReferenceImplementation.INTEGER , true , false );
+ public static final MappingEntry INTEGER = new MappingEntry(DataTypeSchemaReferenceImplementation.INTEGER , false , true );
+ public static final MappingEntry NULLABLE_LONG = new MappingEntry(DataTypeSchemaReferenceImplementation.LONG , true , false );
+ public static final MappingEntry LONG = new MappingEntry(DataTypeSchemaReferenceImplementation.LONG , false , true );
+ public static final MappingEntry NULLABLE_FLOAT = new MappingEntry(DataTypeSchemaReferenceImplementation.FLOAT , true , false );
+ public static final MappingEntry FLOAT = new MappingEntry(DataTypeSchemaReferenceImplementation.FLOAT , false , false );
+ public static final MappingEntry NULLABLE_DOUBLE = new MappingEntry(DataTypeSchemaReferenceImplementation.DOUBLE , true , false );
+ public static final MappingEntry DOUBLE = new MappingEntry(DataTypeSchemaReferenceImplementation.DOUBLE , false , false );
+ public static final MappingEntry STRING = new MappingEntry(DataTypeSchemaReferenceImplementation.STRING , true , false );
+ public static final MappingEntry DATE = new MappingEntry(DataTypeSchemaReferenceImplementation.DATE , true , false );
+ public static final MappingEntry TIME = new MappingEntry(DataTypeSchemaReferenceImplementation.TIME , true , false );
+ public static final MappingEntry TIMESTAMP = new MappingEntry(DataTypeSchemaReferenceImplementation.TIMESTAMP , true , false );
+ public static final MappingEntry ID = new MappingEntry(DataTypeSchemaReferenceImplementation.ID , true , true );
+ public static final MappingEntry UUID = new MappingEntry(DataTypeSchemaReferenceImplementation.UUID , true , true );
+
+ private static final List mappings = List.of(NULLABLE_BOOLEAN, BOOLEAN,
+ NULLABLE_BYTE, BYTE,
+ NULLABLE_SHORT, SHORT,
+ NULLABLE_INTEGER, INTEGER,
+ NULLABLE_LONG, LONG,
+ NULLABLE_FLOAT, FLOAT,
+ NULLABLE_DOUBLE, DOUBLE,
+ STRING,
+ DATE, TIME, TIMESTAMP,
+ ID, UUID);
+
+ @Override
+ public List getMappings() {
+ return mappings;
+ }
+
+ @Override
+ public Name getName() {
+ return name;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/backend/JavaBackendMapping.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/backend/JavaBackendMapping.java
new file mode 100644
index 0000000..9278d5c
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/backend/JavaBackendMapping.java
@@ -0,0 +1,48 @@
+package link.pagan.traqtor.schema.basic.data.mapping.backend;
+
+import java.util.HashMap;
+import link.pagan.traqtor.schema.basic.data.mapping.MappingSchemaImpl;
+import link.pagan.traqtor.schema.data.mapping.backend.BackendMapping;
+import link.pagan.traqtor.schema.data.mapping.MappingEntry;
+
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class JavaBackendMapping extends BackendMapping {
+
+ public JavaBackendMapping() {
+ super("Java", new HashMap() {
+ private static final long serialVersionUID = 1L;
+ {
+ put(MappingSchemaImpl.NULLABLE_BOOLEAN, "Boolean");
+ put(MappingSchemaImpl.NULLABLE_BYTE, "Byte");
+ put(MappingSchemaImpl.NULLABLE_SHORT, "Short");
+ put(MappingSchemaImpl.NULLABLE_INTEGER, "Integer");
+ put(MappingSchemaImpl.NULLABLE_LONG, "Long");
+
+ put(MappingSchemaImpl.BOOLEAN, "boolean");
+ put(MappingSchemaImpl.BYTE, "byte");
+ put(MappingSchemaImpl.SHORT, "short");
+ put(MappingSchemaImpl.INTEGER, "integer");
+ put(MappingSchemaImpl.LONG, "long");
+
+ put(MappingSchemaImpl.NULLABLE_DOUBLE, "Double");
+ put(MappingSchemaImpl.NULLABLE_FLOAT, "Float");
+
+ put(MappingSchemaImpl.DOUBLE, "double");
+ put(MappingSchemaImpl.FLOAT, "float");
+
+ put(MappingSchemaImpl.ID, "long");
+ put(MappingSchemaImpl.UUID, "String");
+
+ put(MappingSchemaImpl.STRING, "String");
+ put(MappingSchemaImpl.DATE, "Date");
+ put(MappingSchemaImpl.TIME, "Time");
+ put(MappingSchemaImpl.TIMESTAMP, "Timestamp");
+ }
+ });
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/database/PostgresDatabaseAdapter.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/database/PostgresDatabaseAdapter.java
new file mode 100644
index 0000000..5030bb9
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/database/PostgresDatabaseAdapter.java
@@ -0,0 +1,37 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.schema.basic.data.mapping.database;
+
+import link.pagan.traqtor.schema.data.mapping.database.DatabaseAdapter;
+import link.pagan.traqtor.util.Name;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class PostgresDatabaseAdapter extends DatabaseAdapter {
+
+ private static final Name NAME = Name.of("traqtor", "basic", "db", "postgres");
+
+ public PostgresDatabaseAdapter() {
+ super(NAME);
+ }
+
+// @Override
+// public Map register() {
+// return new HashMap(){
+// private static final long serialVersionUID = 1L;
+// {
+// put(NAME, new PostgresDatabaseAdapter());
+// }};
+// }
+
+ @Override
+ public Name getName() {
+ return NAME;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/database/PostgresDatabaseMapping.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/database/PostgresDatabaseMapping.java
new file mode 100644
index 0000000..5958426
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/database/PostgresDatabaseMapping.java
@@ -0,0 +1,47 @@
+package link.pagan.traqtor.schema.basic.data.mapping.database;
+
+import java.util.HashMap;
+import link.pagan.traqtor.schema.basic.data.mapping.MappingSchemaImpl;
+import link.pagan.traqtor.schema.data.mapping.database.DatabaseMapping;
+import link.pagan.traqtor.schema.data.mapping.MappingEntry;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class PostgresDatabaseMapping extends DatabaseMapping {
+
+ public PostgresDatabaseMapping() {
+ super("PostgreSQL", new HashMap() {
+ private static final long serialVersionUID = 1L;
+ {
+ put(MappingSchemaImpl.NULLABLE_BOOLEAN, "boolean");
+ put(MappingSchemaImpl.NULLABLE_BYTE, "smallint");
+ put(MappingSchemaImpl.NULLABLE_SHORT, "smallint");
+ put(MappingSchemaImpl.NULLABLE_INTEGER, "integer");
+ put(MappingSchemaImpl.NULLABLE_LONG, "bigint");
+
+ put(MappingSchemaImpl.BOOLEAN, "boolean");
+ put(MappingSchemaImpl.BYTE, "smallint");
+ put(MappingSchemaImpl.SHORT, "smallint");
+ put(MappingSchemaImpl.INTEGER, "integer");
+ put(MappingSchemaImpl.LONG, "bigint");
+
+ put(MappingSchemaImpl.NULLABLE_DOUBLE, "double precision");
+ put(MappingSchemaImpl.NULLABLE_FLOAT, "real");
+
+ put(MappingSchemaImpl.DOUBLE, "double precision");
+ put(MappingSchemaImpl.FLOAT, "real");
+
+ put(MappingSchemaImpl.ID, "bigserial");
+ put(MappingSchemaImpl.UUID, "uuid");
+
+ put(MappingSchemaImpl.STRING, "String");
+ put(MappingSchemaImpl.DATE, "date");
+ put(MappingSchemaImpl.TIME, "time");
+ put(MappingSchemaImpl.TIMESTAMP, "timestamp");
+ }
+ });
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/frontend/JavaScriptFrontendMapping.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/frontend/JavaScriptFrontendMapping.java
new file mode 100644
index 0000000..b3ca18a
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/frontend/JavaScriptFrontendMapping.java
@@ -0,0 +1,47 @@
+package link.pagan.traqtor.schema.basic.data.mapping.frontend;
+
+import java.util.HashMap;
+import link.pagan.traqtor.schema.basic.data.mapping.MappingSchemaImpl;
+import link.pagan.traqtor.schema.data.mapping.frontend.FrontendMapping;
+import link.pagan.traqtor.schema.data.mapping.MappingEntry;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class JavaScriptFrontendMapping extends FrontendMapping {
+
+ public JavaScriptFrontendMapping() {
+ super("JavaScript", new HashMap() {
+ private static final long serialVersionUID = 1L;
+ {
+ put(MappingSchemaImpl.NULLABLE_BOOLEAN, "Boolean");
+ put(MappingSchemaImpl.NULLABLE_BYTE, "Number");
+ put(MappingSchemaImpl.NULLABLE_SHORT, "Number");
+ put(MappingSchemaImpl.NULLABLE_INTEGER, "Number");
+ put(MappingSchemaImpl.NULLABLE_LONG, "BigInt");
+
+ put(MappingSchemaImpl.BOOLEAN, "Boolean");
+ put(MappingSchemaImpl.BYTE, "Number");
+ put(MappingSchemaImpl.SHORT, "Number");
+ put(MappingSchemaImpl.INTEGER, "Number");
+ put(MappingSchemaImpl.LONG, "BigInt");
+
+ put(MappingSchemaImpl.NULLABLE_DOUBLE, "Number");
+ put(MappingSchemaImpl.NULLABLE_FLOAT, "Number");
+
+ put(MappingSchemaImpl.DOUBLE, "Number");
+ put(MappingSchemaImpl.FLOAT, "Number");
+
+ put(MappingSchemaImpl.ID, "BigInt");
+ put(MappingSchemaImpl.UUID, "String");
+
+ put(MappingSchemaImpl.STRING, "String");
+ put(MappingSchemaImpl.DATE, "Date");
+ put(MappingSchemaImpl.TIME, "Date");
+ put(MappingSchemaImpl.TIMESTAMP, "Date");
+ }
+ });
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/DataType.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/DataType.java
new file mode 100644
index 0000000..7fb971d
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/DataType.java
@@ -0,0 +1,19 @@
+package link.pagan.traqtor.schema.data;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class DataType {
+
+ private final String name;
+
+ public DataType(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/DataTypeSchema.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/DataTypeSchema.java
new file mode 100644
index 0000000..2a536d3
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/DataTypeSchema.java
@@ -0,0 +1,17 @@
+package link.pagan.traqtor.schema.data;
+
+import link.pagan.traqtor.schema.data.mapping.MappingSchema;
+import link.pagan.traqtor.util.Named;
+import java.util.List;
+import link.pagan.traqtor.util.Registrable;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public interface DataTypeSchema extends Named, Registrable {
+
+ public List getDataTypes();
+ public List getMappingSchema();
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/Mapping.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/Mapping.java
new file mode 100644
index 0000000..bbc1a53
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/Mapping.java
@@ -0,0 +1,27 @@
+package link.pagan.traqtor.schema.data.mapping;
+
+import java.util.HashMap;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public abstract class Mapping {
+
+ private final String name;
+ private final HashMap mapping;
+
+ protected Mapping(String name, HashMap mapping) {
+ this.mapping = mapping;
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public HashMap getMapping() {
+ return mapping;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/MappingEntry.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/MappingEntry.java
new file mode 100644
index 0000000..2751841
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/MappingEntry.java
@@ -0,0 +1,35 @@
+package link.pagan.traqtor.schema.data.mapping;
+
+import link.pagan.traqtor.schema.data.DataType;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class MappingEntry {
+
+
+
+ private final DataType dataType;
+ private final boolean nullable;
+ private final boolean keyable;
+
+ public MappingEntry(DataType dataType, boolean nullable, boolean keyable) {
+ this.dataType = dataType;
+ this.nullable = nullable;
+ this.keyable = keyable;
+ }
+
+ public DataType getDataType() {
+ return dataType;
+ }
+
+ public boolean isNullable() {
+ return nullable;
+ }
+
+ public boolean isKeyable() {
+ return keyable;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/MappingSchema.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/MappingSchema.java
new file mode 100644
index 0000000..42fd56b
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/MappingSchema.java
@@ -0,0 +1,14 @@
+package link.pagan.traqtor.schema.data.mapping;
+
+import link.pagan.traqtor.util.Named;
+import java.util.List;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public interface MappingSchema extends Named {
+
+ public List getMappings ();
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/backend/BackendMapping.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/backend/BackendMapping.java
new file mode 100644
index 0000000..87d59e2
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/backend/BackendMapping.java
@@ -0,0 +1,17 @@
+package link.pagan.traqtor.schema.data.mapping.backend;
+
+import java.util.HashMap;
+import link.pagan.traqtor.schema.data.mapping.Mapping;
+import link.pagan.traqtor.schema.data.mapping.MappingEntry;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class BackendMapping extends Mapping {
+
+ public BackendMapping(String name, HashMap mapping) {
+ super(name, mapping);
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/database/DatabaseAdapter.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/database/DatabaseAdapter.java
new file mode 100644
index 0000000..eac9e3b
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/database/DatabaseAdapter.java
@@ -0,0 +1,24 @@
+package link.pagan.traqtor.schema.data.mapping.database;
+
+import link.pagan.traqtor.util.Name;
+import link.pagan.traqtor.util.Named;
+import link.pagan.traqtor.util.Registrable;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public abstract class DatabaseAdapter implements Named, Registrable {
+
+ private final Name name;
+
+ protected DatabaseAdapter(Name name) {
+ this.name = name;
+ }
+
+ @Override
+ public Name getName() {
+ return name;
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/database/DatabaseMapping.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/database/DatabaseMapping.java
new file mode 100644
index 0000000..d82ba5f
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/database/DatabaseMapping.java
@@ -0,0 +1,17 @@
+package link.pagan.traqtor.schema.data.mapping.database;
+
+import java.util.HashMap;
+import link.pagan.traqtor.schema.data.mapping.Mapping;
+import link.pagan.traqtor.schema.data.mapping.MappingEntry;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class DatabaseMapping extends Mapping {
+
+ public DatabaseMapping(String name, HashMap mapping) {
+ super(name, mapping);
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/database/DatabaseNamingScheme.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/database/DatabaseNamingScheme.java
new file mode 100644
index 0000000..f6001c7
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/database/DatabaseNamingScheme.java
@@ -0,0 +1,14 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.schema.data.mapping.database;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public interface DatabaseNamingScheme {
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/frontend/FrontendMapping.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/frontend/FrontendMapping.java
new file mode 100644
index 0000000..a461f1c
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/data/mapping/frontend/FrontendMapping.java
@@ -0,0 +1,17 @@
+package link.pagan.traqtor.schema.data.mapping.frontend;
+
+import java.util.HashMap;
+import link.pagan.traqtor.schema.data.mapping.Mapping;
+import link.pagan.traqtor.schema.data.mapping.MappingEntry;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class FrontendMapping extends Mapping {
+
+ public FrontendMapping(String name, HashMap mapping) {
+ super(name, mapping);
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/logic/EndpointSchema.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/logic/EndpointSchema.java
new file mode 100644
index 0000000..0774e7c
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/logic/EndpointSchema.java
@@ -0,0 +1,18 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.schema.logic;
+
+import java.util.List;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public interface EndpointSchema {
+
+ public List getPatterns();
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/schema/logic/EndpointTemplate.java b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/logic/EndpointTemplate.java
new file mode 100644
index 0000000..82ec908
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/schema/logic/EndpointTemplate.java
@@ -0,0 +1,16 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package link.pagan.traqtor.schema.logic;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class EndpointTemplate {
+
+
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/util/Name.java b/traqtor-aio/src/main/java/link/pagan/traqtor/util/Name.java
new file mode 100644
index 0000000..2c2662d
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/util/Name.java
@@ -0,0 +1,135 @@
+package link.pagan.traqtor.util;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Comparator;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class Name {
+
+ public static final Comparator COMPARATOR = new Comparator() {
+ @Override
+ public int compare(Name a, Name b) {
+ return a.asDotted().compareTo(b.asDotted());
+ }
+ };
+
+ String[] parts;
+
+ public Name(String[] parts) {
+ this.parts = parts;
+ }
+
+ public static Name of(String... parts) {
+ if (parts == null) {
+ throw new NullPointerException("name can not be null");
+ }
+ if (parts.length < 1) {
+ throw new IllegalArgumentException("name can not be empty");
+ }
+ return new Name(parts);
+ }
+
+ public String asDotted() {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < this.parts.length; i++) {
+ sb.append(parts[i]);
+ if (i != this.parts.length - 1) {
+ sb.append('.');
+ }
+ }
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null) {
+ return false;
+ }
+ if (getClass() != o.getClass()) {
+ return false;
+ }
+ Name name = (Name) o;
+ if (name.parts == null) {
+ return false;
+ }
+ if (name.parts.length != this.parts.length) {
+ return false;
+ }
+ for (int i = 0; i < this.parts.length; i++) {
+ if (!this.parts[i].equals(name.parts[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 7;
+ hash = 43 * hash + Arrays.deepHashCode(this.parts);
+ return hash;
+ }
+
+ public static final class NameSerializer extends StdSerializer {
+
+ private static final long serialVersionUID = 1L;
+
+ public NameSerializer() {
+ this(null);
+ }
+
+ public NameSerializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public void serialize(Name value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+ gen.writeArray(value.parts, 0, value.parts.length);
+ }
+
+ }
+
+ public static final class NameDeserializer extends StdDeserializer {
+
+ private static final long serialVersionUID = 1L;
+
+ public NameDeserializer() {
+ this(null);
+ }
+
+ public NameDeserializer(Class t) {
+ super(t);
+ }
+
+ @Override
+ public Name deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
+
+ JsonNode partArray = parser.getCodec().readTree(parser);
+ String[] parts = new String[partArray.size()];
+ int i = 0;
+ for (final JsonNode part : partArray) {
+ parts[i] = part.asText();
+ i++;
+ }
+
+ return new Name(parts);
+ }
+
+ }
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/util/Named.java b/traqtor-aio/src/main/java/link/pagan/traqtor/util/Named.java
new file mode 100644
index 0000000..b95bf5f
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/util/Named.java
@@ -0,0 +1,11 @@
+package link.pagan.traqtor.util;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public interface Named {
+
+ public Name getName();
+
+}
diff --git a/traqtor-aio/src/main/java/link/pagan/traqtor/util/Registrable.java b/traqtor-aio/src/main/java/link/pagan/traqtor/util/Registrable.java
new file mode 100644
index 0000000..c6babf0
--- /dev/null
+++ b/traqtor-aio/src/main/java/link/pagan/traqtor/util/Registrable.java
@@ -0,0 +1,11 @@
+package link.pagan.traqtor.util;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public interface Registrable {
+
+// public Map register();
+
+}
diff --git a/traqtor-aio/src/test/java/link/pagan/traqtor/EndToEndTest.java b/traqtor-aio/src/test/java/link/pagan/traqtor/EndToEndTest.java
new file mode 100644
index 0000000..b5fc1fe
--- /dev/null
+++ b/traqtor-aio/src/test/java/link/pagan/traqtor/EndToEndTest.java
@@ -0,0 +1,26 @@
+package link.pagan.traqtor;
+
+import org.junit.jupiter.api.Test;
+
+public class EndToEndTest {
+
+
+ @Test
+ void endToEndTest() {
+ DatatypeSchema refSchema = new ReferenceDatatypeSchema();
+ DatatypeSchema altSchema = new AlternativeDatatypeSchema();
+
+ WorkspaceBuilder builder = new WorkspaceBuilder();
+ builder.addDatatypeSchema();
+
+ UniverseProjectBuilder upb = new UniverseProjectBuilder()
+ .addSchema(refSchema).addSchema(altSchema);
+
+ .addProject(
+ new
+ )
+
+
+ }
+
+}
diff --git a/traqtor-aio/src/test/java/link/pagan/traqtor/_api/TraqtorApiTestUtils.java b/traqtor-aio/src/test/java/link/pagan/traqtor/_api/TraqtorApiTestUtils.java
new file mode 100644
index 0000000..2e9ca11
--- /dev/null
+++ b/traqtor-aio/src/test/java/link/pagan/traqtor/_api/TraqtorApiTestUtils.java
@@ -0,0 +1,29 @@
+// package link.pagan.traqtor._api;
+
+// import java.io.File;
+// import java.io.IOException;
+// import java.nio.file.Files;
+// import java.nio.file.Path;
+// import java.util.Comparator;
+// import link.pagan.traqtor.util.Name;
+
+// /**
+// *
+// * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+// */
+// public class TraqtorApiTestUtils {
+
+// public static final String TEST_WORKSPACE_ROOT = new File(new File("").getAbsoluteFile().getParentFile(), "traqtor-demo-workspace").getAbsolutePath();
+// public static final Name TEST_WORKSPACE_NAME = Name.of("traqtor", "demo", "workspace");
+
+// public static final void killTestRoot() throws IOException {
+// File root = new File(TEST_WORKSPACE_ROOT);
+// if (root.exists()) {
+// Files.walk(new File(TEST_WORKSPACE_ROOT).toPath())
+// .sorted(Comparator.reverseOrder())
+// .map(Path::toFile)
+// .forEach(File::delete);
+// }
+// }
+
+// }
diff --git a/traqtor-aio/src/test/java/link/pagan/traqtor/api/TraqtorTest.java b/traqtor-aio/src/test/java/link/pagan/traqtor/api/TraqtorTest.java
new file mode 100644
index 0000000..2fb4157
--- /dev/null
+++ b/traqtor-aio/src/test/java/link/pagan/traqtor/api/TraqtorTest.java
@@ -0,0 +1,59 @@
+// package link.pagan.traqtor.api;
+
+// import java.io.IOException;
+// import link.pagan.traqtor._api.TraqtorApiTestUtils;
+// import link.pagan.traqtor._api.result.CommandExecResult;
+// import static link.pagan.traqtor._api.result.CommandExecResultStatus.DONE;
+// import static link.pagan.traqtor._api.result.CommandExecResultStatus.FAIL;
+// import static org.junit.jupiter.api.Assertions.assertEquals;
+// import org.junit.jupiter.api.BeforeEach;
+// import org.junit.jupiter.api.DisplayName;
+// import org.junit.jupiter.api.Test;
+
+// /**
+// *
+// * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+// */
+// public class TraqtorTest {
+
+// CommandExecResult result;
+
+// @BeforeEach
+// public void cleanTestDir() throws IOException {
+// TraqtorApiTestUtils.killTestRoot();
+// // Executor.enableParanoindLoggin();
+// }
+
+// @Test
+// @DisplayName("New workspace creation")
+// void newWorkspaceSave() {
+// Traqtor traqtor = Traqtor.init();
+// result = traqtor.execute(new API.CreateWorkspace());
+// assertEquals(DONE, result.getStatus());
+// assertEquals(traqtor.workspace().dirty(), true);
+// result = traqtor.execute(new API.SaveWorkspace());
+// assertEquals(FAIL, result.getStatus());
+// assertEquals(traqtor.workspace().dirty(), true);
+// result = traqtor.execute(new API.SaveAsWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_ROOT));
+// assertEquals(DONE, result.getStatus());
+// assertEquals(traqtor.workspace().dirty(), false);
+// }
+
+// @Test
+// @DisplayName("Workspace load")
+// void newSaveLoad() {
+// Traqtor traqtor = Traqtor.init();
+// result = traqtor.execute(new API.CreateWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_NAME, TraqtorApiTestUtils.TEST_WORKSPACE_ROOT));
+// assertEquals(DONE, result.getStatus());
+// assertEquals(traqtor.workspace().dirty(), false);
+// traqtor = Traqtor.init();
+// result = traqtor.execute(new API.LoadWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_ROOT));
+// assertEquals(DONE, result.getStatus());
+// assertEquals(traqtor.workspace().dirty(), false);
+// assertEquals(traqtor.workspace().dataTypeSchemas().size(), 1);
+// result = traqtor.execute(new API.SaveWorkspace());
+// assertEquals(DONE, result.getStatus());
+// assertEquals(traqtor.workspace().dirty(), false);
+// }
+
+// }
diff --git a/traqtor-aio/src/test/java/link/pagan/traqtor/api/workspace/WorkspaceTest.java b/traqtor-aio/src/test/java/link/pagan/traqtor/api/workspace/WorkspaceTest.java
new file mode 100644
index 0000000..9223a6d
--- /dev/null
+++ b/traqtor-aio/src/test/java/link/pagan/traqtor/api/workspace/WorkspaceTest.java
@@ -0,0 +1,35 @@
+// package link.pagan.traqtor.api.workspace;
+
+// import java.io.IOException;
+// import link.pagan.traqtor._api.TraqtorApiTestUtils;
+// import link.pagan.traqtor._api.result.CommandExecResult;
+// import static link.pagan.traqtor._api.result.CommandExecResultStatus.DONE;
+// import link.pagan.traqtor.api.API;
+// import link.pagan.traqtor.api.Traqtor;
+// import link.pagan.traqtor.util.Name;
+// import static org.junit.jupiter.api.Assertions.assertEquals;
+// import org.junit.jupiter.api.BeforeEach;
+// import org.junit.jupiter.api.DisplayName;
+// import org.junit.jupiter.api.Test;
+
+// public class WorkspaceTest {
+
+// CommandExecResult result;
+
+// @BeforeEach
+// public void cleanTestDir() throws IOException {
+// TraqtorApiTestUtils.killTestRoot();
+// // Executor.enableParanoindLoggin();
+// }
+
+// @Test
+// @DisplayName("Create project")
+// void newSaveLoad() {
+// Traqtor traqtor = Traqtor.init();
+// result = traqtor.execute(new API.CreateWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_NAME, TraqtorApiTestUtils.TEST_WORKSPACE_ROOT));
+// assertEquals(DONE, result.getStatus());
+// assertEquals(traqtor.workspace().dirty(), false);
+// traqtor.execute(new API.WorkspaceCreateUniverseProject(Name.of("universe"), Name.of("traqtor", "basic")));
+// }
+
+// }
diff --git a/traqtor-aio/src/test/java/link/pagan/traqtor/generator/UniverseBlueprintTest.java b/traqtor-aio/src/test/java/link/pagan/traqtor/generator/UniverseBlueprintTest.java
new file mode 100644
index 0000000..5149787
--- /dev/null
+++ b/traqtor-aio/src/test/java/link/pagan/traqtor/generator/UniverseBlueprintTest.java
@@ -0,0 +1,89 @@
+package link.pagan.traqtor.generator;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import link.pagan.traqtor._api.result.CommandExecResult;
+import static link.pagan.traqtor._api.result.CommandExecResultStatus.DONE;
+import link.pagan.traqtor.api.API;
+import link.pagan.traqtor.api.Traqtor;
+import link.pagan.traqtor.generator.blueprint.universe.LinkType;
+import link.pagan.traqtor.generator.blueprint.universe.build.LinkBlueprintBuilder;
+import link.pagan.traqtor.generator.blueprint.universe.build.AtomBlueprintBuilder;
+import link.pagan.traqtor.generator.blueprint.universe.build.ParticleBlueprintBuilder;
+import link.pagan.traqtor.generator.blueprint.universe.build.UniverseBlueprintBuilder;
+import link.pagan.traqtor.generator.blueprint.universe.UniverseBlueprint;
+import link.pagan.traqtor.util.Name;
+import link.pagan.traqtor.schema.basic.data.DataTypeSchemaReferenceImplementation;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.junit.jupiter.api.Test;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class UniverseBlueprintTest {
+
+ @Test
+ void programmaticBuild() throws JsonProcessingException {
+ UniverseBlueprintBuilder builder = new UniverseBlueprintBuilder(new DataTypeSchemaReferenceImplementation());
+ builder
+ .addAtom(new AtomBlueprintBuilder()
+ .name(Name.of("account"))
+ .description("Base user atom")
+ .addParticle(new ParticleBlueprintBuilder()
+ .name(Name.of("nickname"))
+ .description("User nickname, just in case")
+ .type("string")
+ )
+ .addParticle(new ParticleBlueprintBuilder()
+ .name(Name.of("email"))
+ .description("Main auth facility for user")
+ .type("string")
+ )
+ .addParticle(new ParticleBlueprintBuilder()
+ .name(Name.of("phone"))
+ .description("Alternative user authentification facility")
+ .type("string")
+ )
+ .addParticle(new ParticleBlueprintBuilder()
+ .name(Name.of("password"))
+ .description("User password")
+ .type("string")
+ )
+ )
+ .addAtom(new AtomBlueprintBuilder()
+ .name(Name.of("account", "details"))
+ .description("User info atom")
+ .addParticle(new ParticleBlueprintBuilder()
+ .name(Name.of("first", "name"))
+ .description("First name of a user")
+ .type("string")
+ )
+ .addParticle(new ParticleBlueprintBuilder()
+ .name(Name.of("last", "name"))
+ .description("Last name of a user")
+ .type("string")
+ )
+ .addParticle(new ParticleBlueprintBuilder()
+ .name(Name.of("middle", "names"))
+ .description("Middle names of a user")
+ .type("string")
+ )
+ )
+ .addLink(new LinkBlueprintBuilder()
+ .from(Name.of("account"))
+ .to(Name.of("account", "details"))
+ .type(LinkType.ONE_TO_ONE)
+ );
+
+ UniverseBlueprint build = builder.build();
+
+ Traqtor traqtor = Traqtor.init();
+ CommandExecResult result = traqtor.execute(new API.CreateWorkspace());
+ assertEquals(result.getStatus(), DONE);
+ assertEquals(traqtor.workspace().dirty(), true);
+ String serialized = traqtor.workspace().mapper().writeValueAsString(build);
+ System.out.println(serialized);
+
+ }
+
+}
diff --git a/traqtor-api/src/main/java/link/pagan/traqtor/_api/BinaryCommand.java b/traqtor-api/src/main/java/link/pagan/traqtor/_api/BinaryCommand.java
index b23ff61..1c0e990 100644
--- a/traqtor-api/src/main/java/link/pagan/traqtor/_api/BinaryCommand.java
+++ b/traqtor-api/src/main/java/link/pagan/traqtor/_api/BinaryCommand.java
@@ -1,24 +1,24 @@
-package link.pagan.traqtor._api;
+// package link.pagan.traqtor._api;
-import link.pagan.traqtor._api.result.CommandExecResult;
+// import link.pagan.traqtor._api.result.CommandExecResult;
-/**
- *
- * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
- */
-public abstract class BinaryCommand extends UnaryCommand {
+// /**
+// *
+// * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+// */
+// public abstract class BinaryCommand extends UnaryCommand {
- protected R arg2;
+// protected R arg2;
- public CommandExecResult subexec(BinaryCommand subcommand) {
- subcommand.setResultHolder(result);
- subcommand.setArg(arg);
- subcommand.setArg2(arg2);
- return subcommand.exec();
- }
+// public CommandExecResult subexec(BinaryCommand subcommand) {
+// subcommand.setResultHolder(result);
+// subcommand.setArg(arg);
+// subcommand.setArg2(arg2);
+// return subcommand.exec();
+// }
- public void setArg2(R arg2) {
- this.arg2 = arg2;
- }
+// public void setArg2(R arg2) {
+// this.arg2 = arg2;
+// }
-}
+// }
diff --git a/traqtor.code-workspace b/traqtor.code-workspace
index 15c77e1..caee811 100644
--- a/traqtor.code-workspace
+++ b/traqtor.code-workspace
@@ -5,6 +5,7 @@
}
],
"settings": {
- "java.configuration.updateBuildConfiguration": "automatic"
+ "java.configuration.updateBuildConfiguration": "automatic",
+ "java.dependency.packagePresentation": "hierarchical"
}
}
\ No newline at end of file