diff --git a/traqtor-api/pom.xml b/traqtor-api/pom.xml
index 9c4c693..bf089f0 100644
--- a/traqtor-api/pom.xml
+++ b/traqtor-api/pom.xml
@@ -28,6 +28,11 @@
+
+ ${project.groupId}
+ traqtor-schema
+ ${project.version}
+
${project.groupId}
traqtor-schema-ref
diff --git a/traqtor-api/src/main/java/link/pagan/traqtor/_api/Executor.java b/traqtor-api/src/main/java/link/pagan/traqtor/_api/Executor.java
index 06c8326..d9fac91 100644
--- a/traqtor-api/src/main/java/link/pagan/traqtor/_api/Executor.java
+++ b/traqtor-api/src/main/java/link/pagan/traqtor/_api/Executor.java
@@ -12,11 +12,12 @@ public abstract class Executor> extends Commanded {
private static boolean paranoindLoggin = false;
private static boolean mute = true;
- public CommandExecResult execute(Command command, T arg) {
+ @SuppressWarnings("unchecked")
+ public CommandExecResult execute(Command command) {
CommandExecResult result = new CommandExecResult();
command.setResultHolder(result);
- command.exec(arg);
- if (!mute){
+ command.exec((T) this);
+ if (!mute) {
if (paranoindLoggin) {
result.print();
} else {
diff --git a/traqtor-api/src/main/java/link/pagan/traqtor/api/Traqtor.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/Traqtor.java
index 951db83..f20d457 100644
--- a/traqtor-api/src/main/java/link/pagan/traqtor/api/Traqtor.java
+++ b/traqtor-api/src/main/java/link/pagan/traqtor/api/Traqtor.java
@@ -1,48 +1,61 @@
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 java.util.Map;
import link.pagan.traqtor._api.Command;
import link.pagan.traqtor._api.Executor;
import link.pagan.traqtor._api.result.CommandExecResult;
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 extends Executor {
+public class Traqtor extends Executor {
- private static Traqtor env = new Traqtor();
+ private Workspace workspace;
- public static CommandExecResult exec(Command command) {
- return env.execute(command, env);
- }
+ Map dataTypeSchemas;
- static void reset() {
- env = new Traqtor();
+ 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<>();
}
- Workspace workspace;
-
- public static Workspace getWorkspace() {
- return env.workspace;
+ public Workspace workspace() {
+ return workspace;
}
public static class CreateWorkspace extends Command {
- private final String name;
+ private final Name name;
private final String path;
public CreateWorkspace() {
this(Workspace.DEFAULT_WORKSPACE_NAME);
}
- public CreateWorkspace(String name) {
+ public CreateWorkspace(Name name) {
this(name, null);
}
- public CreateWorkspace(String name, String path) {
+ public CreateWorkspace(Name name, String path) {
this.name = name;
this.path = path;
}
@@ -53,7 +66,9 @@ public class Traqtor extends Executor {
return fail("There is an open workspace - please close this first, before creating new one");
}
traqtor.workspace = new Workspace();
- traqtor.workspace.setName(name);
+ traqtor.workspace.name(name);
+ DataTypeSchemaReferenceImplementation dataTypeSchemaReferenceImplementation = new DataTypeSchemaReferenceImplementation();
+ traqtor.workspace.schemas().put(dataTypeSchemaReferenceImplementation.getName(), dataTypeSchemaReferenceImplementation);
if (path != null) {
SaveAsWorkspace saveAsWorkspace = new SaveAsWorkspace(path);
saveAsWorkspace.setResultHolder(result);
@@ -70,7 +85,7 @@ public class Traqtor extends Executor {
public static class SaveAsWorkspace extends Command {
- private String workspacePath;
+ private final String workspacePath;
public SaveAsWorkspace(String workspacePath) {
this.workspacePath = workspacePath;
@@ -93,7 +108,7 @@ public class Traqtor extends Executor {
File workspaceFile = new File(workspacePath, Workspace.JSON_FILENAME + ".json");
if (!workspaceFile.exists()) {
try {
- if (!workspaceFile.createNewFile()){
+ if (!workspaceFile.createNewFile()) {
return fail("Failed to create " + Workspace.JSON_FILENAME + ".json in workspace root directory");
}
} catch (IOException ex) {
@@ -101,14 +116,14 @@ public class Traqtor extends Executor {
}
}
- String hold = traqtor.workspace.getRoot();
- traqtor.workspace.setRoot(workspacePath);
+ String hold = traqtor.workspace.root();
+ traqtor.workspace.root(workspacePath);
SaveWorkspace saveWorkspace = new SaveWorkspace();
saveWorkspace.setResultHolder(result);
saveWorkspace.exec(traqtor);
if (!result.OK()) {
- traqtor.workspace.setRoot(hold);
+ traqtor.workspace.root(hold);
return result;
}
@@ -121,8 +136,8 @@ public class Traqtor extends Executor {
@Override
public CommandExecResult exec(Traqtor traqtor) {
- String workspacePath = traqtor.workspace.getRoot();
- if (traqtor.workspace.getRoot() == null) {
+ String workspacePath = traqtor.workspace.root();
+ if (traqtor.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");
@@ -136,15 +151,62 @@ public class Traqtor extends Executor {
}
try {
- traqtor.workspace.getMapper().writeValue(workspaceFile, traqtor.workspace);
+ traqtor.workspace.mapper().writeValue(workspaceFile, traqtor.workspace);
} catch (IOException ex) {
+ System.err.println(ex);
return fail("Failed to write " + Workspace.JSON_FILENAME + ".json");
}
- traqtor.workspace.setDirty(false);
+ traqtor.workspace.dirty(false);
return done();
}
}
+
+ public static class LoadWorkspace extends Command {
+
+ private final String workspacePath;
+
+ public LoadWorkspace(String workspacePath) {
+ this.workspacePath = workspacePath;
+ }
+
+ @Override
+ public CommandExecResult exec(Traqtor traqtor) {
+ 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.schemas();
+ for (Name name : schemas.keySet()) {
+ if (schemas.get(name) == null) {
+ DataTypeSchema loaded = traqtor.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");
+ }
+ }
+ }
+
+ traqtor.workspace = workspace;
+ return done();
+ }
+ }
}
diff --git a/traqtor-api/src/main/java/link/pagan/traqtor/api/project/Project.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/project/Project.java
index 78288c0..5dc5527 100644
--- a/traqtor-api/src/main/java/link/pagan/traqtor/api/project/Project.java
+++ b/traqtor-api/src/main/java/link/pagan/traqtor/api/project/Project.java
@@ -1,36 +1,9 @@
package link.pagan.traqtor.api.project;
-import java.util.ArrayList;
-import java.util.List;
-import link.pagan.traqtor.generator.blueprint.database.DatabaseBlueprint;
-import link.pagan.traqtor.schema.basic.EndpointSchemaImpl;
-import link.pagan.traqtor.schema.basic.data.DataTypeSchemaImpl;
-import link.pagan.traqtor.schema.data.DataTypeSchema;
-import link.pagan.traqtor.schema.logic.EndpointSchema;
-
/**
*
* @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
*/
-public class Project {
-
- private EndpointSchema endpointSchema;
- private DataTypeSchema dataTypeSchema;
-
- private List dataBases;
-
- static Project init() {
- return new Project(new EndpointSchemaImpl(), new DataTypeSchemaImpl());
- }
-
- public Project(EndpointSchema endpointSchema, DataTypeSchema dataTypeSchema) {
- this.endpointSchema = endpointSchema;
- this.dataTypeSchema = dataTypeSchema;
- this.dataBases = new ArrayList();
- }
-
- void addDataBaseBlueprint(DatabaseBlueprint dataBaseBlueprint) {
- this.dataBases.add(dataBaseBlueprint);
- }
+public abstract class Project {
}
diff --git a/traqtor-api/src/main/java/link/pagan/traqtor/api/project/UniverseProject.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/project/UniverseProject.java
new file mode 100644
index 0000000..877eacd
--- /dev/null
+++ b/traqtor-api/src/main/java/link/pagan/traqtor/api/project/UniverseProject.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.api.project;
+
+/**
+ *
+ * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
+ */
+public class UniverseProject extends Project {
+
+}
diff --git a/traqtor-api/src/main/java/link/pagan/traqtor/api/workspace/Workspace.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/workspace/Workspace.java
index 0654ea3..bb05f14 100644
--- a/traqtor-api/src/main/java/link/pagan/traqtor/api/workspace/Workspace.java
+++ b/traqtor-api/src/main/java/link/pagan/traqtor/api/workspace/Workspace.java
@@ -1,9 +1,28 @@
package link.pagan.traqtor.api.workspace;
-import com.fasterxml.jackson.annotation.JsonIgnore;
+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.Executor;
+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;
/**
*
@@ -12,55 +31,159 @@ import link.pagan.traqtor._api.Executor;
public class Workspace extends Executor {
public static final String JSON_FILENAME = "workspace";
- public static final String DEFAULT_WORKSPACE_NAME = "I'm too lazy to think of a name for this workspace";
+ public static final Name DEFAULT_WORKSPACE_NAME = Name.of("workspace");
- private String name;
+ private final ObjectMapper mapper;
- @JsonIgnore
private boolean dirty;
-
- @JsonIgnore
- private final ObjectMapper mapper;
- @JsonIgnore
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 String getName() {
+ public Name name() {
return name;
}
- public String getRoot() {
+ public String root() {
return root;
}
- public void setRoot(String root) {
+ public void root(String root) {
this.root = root;
}
- public void setName(String name) {
+ public void name(Name name) {
this.name = name;
}
- public ObjectMapper getMapper() {
+ public ObjectMapper mapper() {
return mapper;
}
- public boolean isDirty() {
+ public boolean dirty() {
return dirty;
}
- public void setDirty(boolean dirty) {
+ public void dirty(boolean dirty) {
this.dirty = dirty;
}
-// @Override
-// Workspace self() {
-// throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-// }
+ public HashMap schemas() {
+ 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-api/src/main/java/link/pagan/traqtor/api/workspace/command/WorkbenchCommandSave.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/workspace/command/WorkbenchCommandSave.java
deleted file mode 100644
index b3cc1cc..0000000
--- a/traqtor-api/src/main/java/link/pagan/traqtor/api/workspace/command/WorkbenchCommandSave.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package link.pagan.traqtor.api.workspace.command;
-
-//package link.pagan.traqtor.api.workbench.command;
-//
-//import java.io.File;
-//import java.io.IOException;
-//import link.pagan.traqtor._api.Command;
-//import link.pagan.traqtor._api.result.CommandExecResult;
-//import link.pagan.traqtor.api.workbench.Workbench;
-//
-///**
-// *
-// * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
-// */
-//public class WorkbenchCommandSave extends Command {
-//
-// @Override
-// public CommandExecResult exec(Workbench workbench) {
-// if (workbench.getRoot() == null) {
-// return fail("Workspace was not saved before - use \"save as\" command for the first save");
-// }
-// File demoDir = new File(workbench.getRoot());
-// File workbenchFile = new File(demoDir, Workbench.JSON_FILENAME + ".json");
-// if (!workbenchFile.exists()) {
-// return fail("Workspace lock file (" + (workbenchFile.getAbsolutePath()) + ") does not exit ");
-// }
-// try {
-// workbench.getMapper().writeValue(workbenchFile, workbench);
-// } catch (IOException ex) {
-// return fail("Failed to write" + Workbench.JSON_FILENAME + ".json");
-// }
-// return done();
-// }
-//
-//}
diff --git a/traqtor-api/src/main/java/link/pagan/traqtor/api/workspace/command/WorkbenchCommandSaveAs.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/workspace/command/WorkbenchCommandSaveAs.java
deleted file mode 100644
index 0b0d6e7..0000000
--- a/traqtor-api/src/main/java/link/pagan/traqtor/api/workspace/command/WorkbenchCommandSaveAs.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package link.pagan.traqtor.api.workspace.command;
-
-//package link.pagan.traqtor.api.workbench.command;
-//
-//import java.io.File;
-//import java.io.IOException;
-//import link.pagan.traqtor._api.Command;
-//import link.pagan.traqtor._api.result.CommandExecResult;
-//import link.pagan.traqtor.api.workbench.Workbench;
-//
-///**
-// *
-// * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
-// */
-//public class WorkbenchCommandSaveAs extends Command {
-//
-// String path;
-//
-// public WorkbenchCommandSaveAs(String path) {
-// this.path = path;
-// }
-//
-// @Override
-// public CommandExecResult exec(Workbench workbench) {
-// File demoDir = new File(path);
-// if (!demoDir.exists()) {
-// if (!demoDir.mkdir()) {
-// return fail("Failed to create workbench root directory at " + path);
-// } else {
-// info("Create workbench root directory at " + path);
-// }
-// } else {
-// if (demoDir.listFiles().length > 0) {
-// return fail("Root directory is not empty, failed to assing " + path + " as root for workspace");
-// }
-// }
-// File workbenchFile = new File(demoDir, Workbench.JSON_FILENAME + ".json");
-// try {
-// workbench.getMapper().writeValue(workbenchFile, workbench);
-// } catch (IOException ex) {
-// return fail("Failed to write " + Workbench.JSON_FILENAME + ".json");
-// }
-// workbench.setRoot(path);
-// return done();
-// }
-//
-//}
diff --git a/traqtor-api/src/test/java/link/pagan/traqtor/_api/TraqtorApiTestUtils.java b/traqtor-api/src/test/java/link/pagan/traqtor/_api/TraqtorApiTestUtils.java
index 722c6aa..8243212 100644
--- a/traqtor-api/src/test/java/link/pagan/traqtor/_api/TraqtorApiTestUtils.java
+++ b/traqtor-api/src/test/java/link/pagan/traqtor/_api/TraqtorApiTestUtils.java
@@ -5,6 +5,7 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Comparator;
+import link.pagan.traqtor.util.Name;
/**
*
@@ -13,7 +14,7 @@ import java.util.Comparator;
public class TraqtorApiTestUtils {
public static final String TEST_WORKSPACE_ROOT = new File(new File("").getAbsoluteFile().getParentFile(), "traqtor-demo-workspace").getAbsolutePath();
- public static final String TEST_WORKSPACE_NAME = "TRAQTOR_DEMO_WORKSPACE";
+ 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);
diff --git a/traqtor-api/src/test/java/link/pagan/traqtor/api/TraqtorTest.java b/traqtor-api/src/test/java/link/pagan/traqtor/api/TraqtorTest.java
index a0b28ad..33c1adb 100644
--- a/traqtor-api/src/test/java/link/pagan/traqtor/api/TraqtorTest.java
+++ b/traqtor-api/src/test/java/link/pagan/traqtor/api/TraqtorTest.java
@@ -5,9 +5,9 @@ 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 org.junit.jupiter.api.AfterEach;
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;
/**
@@ -21,46 +21,40 @@ public class TraqtorTest {
@BeforeEach
public void cleanTestDir() throws IOException {
TraqtorApiTestUtils.killTestRoot();
- }
-
-
- @AfterEach
- public void killCore() {
- Traqtor.reset();
- }
-
- @Test
- void newWorkspace() {
- result = Traqtor.exec(new Traqtor.CreateWorkspace());
- assertEquals(result.getStatus(), DONE);
- assertEquals(Traqtor.getWorkspace().isDirty(), true);
+ // Executor.enableParanoindLoggin();
}
@Test
+ @DisplayName("New workspace creation")
void newWorkspaceSave() {
- result = Traqtor.exec(new Traqtor.CreateWorkspace());
+ Traqtor traqtor = Traqtor.init();
+ result = traqtor.execute(new Traqtor.CreateWorkspace());
assertEquals(DONE, result.getStatus());
- assertEquals(Traqtor.getWorkspace().isDirty(), true);
- result = Traqtor.exec(new Traqtor.SaveWorkspace());
+ assertEquals(traqtor.workspace().dirty(), true);
+ result = traqtor.execute(new Traqtor.SaveWorkspace());
assertEquals(FAIL, result.getStatus());
- assertEquals(Traqtor.getWorkspace().isDirty(), true);
- result = Traqtor.exec(new Traqtor.SaveAsWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_ROOT));
+ assertEquals(traqtor.workspace().dirty(), true);
+ result = traqtor.execute(new Traqtor.SaveAsWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_ROOT));
assertEquals(DONE, result.getStatus());
- assertEquals(Traqtor.getWorkspace().isDirty(), false);
+ assertEquals(traqtor.workspace().dirty(), false);
}
@Test
- void newWorkspaceWithName() {
- result = Traqtor.exec(new Traqtor.CreateWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_NAME));
+ @DisplayName("Workspace load")
+ void newSaveLoad() {
+ Traqtor traqtor = Traqtor.init();
+ result = traqtor.execute(new Traqtor.CreateWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_NAME, TraqtorApiTestUtils.TEST_WORKSPACE_ROOT));
assertEquals(DONE, result.getStatus());
- assertEquals(Traqtor.getWorkspace().isDirty(), true);
- }
-
- @Test
- void newWorkspaceWithNameAndPath() {
- result = Traqtor.exec(new Traqtor.CreateWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_NAME, TraqtorApiTestUtils.TEST_WORKSPACE_ROOT));
+ assertEquals(traqtor.workspace().dirty(), false);
+ traqtor = Traqtor.init();
+ result = traqtor.execute(new Traqtor.LoadWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_ROOT));
+ assertEquals(DONE, result.getStatus());
+ assertEquals(traqtor.workspace().dirty(), false);
+ assertEquals(traqtor.workspace().schemas().size(), 1);
+ result = traqtor.execute(new Traqtor.SaveWorkspace());
assertEquals(DONE, result.getStatus());
- assertEquals(Traqtor.getWorkspace().isDirty(), false);
+ assertEquals(traqtor.workspace().dirty(), false);
+
}
}
diff --git a/traqtor-api/src/test/java/link/pagan/traqtor/generator/UniverseBlueprintTest.java b/traqtor-api/src/test/java/link/pagan/traqtor/generator/UniverseBlueprintTest.java
new file mode 100644
index 0000000..d56f550
--- /dev/null
+++ b/traqtor-api/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.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 Traqtor.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-generator/pom.xml b/traqtor-generator/pom.xml
index ae83bfa..4ab9060 100644
--- a/traqtor-generator/pom.xml
+++ b/traqtor-generator/pom.xml
@@ -17,6 +17,11 @@
traqtor-schema
${project.version}
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.12.1
+
UTF-8
diff --git a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/R.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/R.java
similarity index 94%
rename from traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/R.java
rename to traqtor-generator/src/main/java/link/pagan/traqtor/generator/R.java
index c81c9cc..489abac 100644
--- a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/R.java
+++ b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/R.java
@@ -1,4 +1,4 @@
-package link.pagan.traqtor.generator.blueprint;
+package link.pagan.traqtor.generator;
import link.pagan.traqtor.generator.blueprint.database.builder.ColumnBlueprintBuilder;
import link.pagan.traqtor.generator.blueprint.database.builder.DatabaseBlueprintBuilder;
diff --git a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/ProjectBlueprint.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/ProjectBlueprint.java
index 4fbe7f0..f3f4118 100644
--- a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/ProjectBlueprint.java
+++ b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/ProjectBlueprint.java
@@ -1,25 +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;
-import link.pagan.traqtor.generator.blueprint.util.Name;
-
/**
*
* @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
*/
-public class ProjectBlueprint {
+public abstract class ProjectBlueprint {
- String name;
- Name rootPackage;
- String description;
-
-
- public void assemble() {
-
- }
+
+// String name;
+// Name rootPackage;
+// String description;
+
+//
+// public void assemble() {
+//
+// }
+//
}
diff --git a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/ColumnBlueprint.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/ColumnBlueprint.java
index 4cd237d..4efb09f 100644
--- a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/ColumnBlueprint.java
+++ b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/ColumnBlueprint.java
@@ -5,7 +5,7 @@
*/
package link.pagan.traqtor.generator.blueprint.database;
-import link.pagan.traqtor.generator.blueprint.util.Name;
+import link.pagan.traqtor.util.Name;
import link.pagan.traqtor.schema.data.DataType;
diff --git a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/DatabaseBlueprint.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/DatabaseBlueprint.java
index 518cec1..f8cebe4 100644
--- a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/DatabaseBlueprint.java
+++ b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/DatabaseBlueprint.java
@@ -1,8 +1,5 @@
package link.pagan.traqtor.generator.blueprint.database;
-import java.util.List;
-import link.pagan.traqtor.schema.data.mapping.database.DatabaseAdapter;
-
/**
*
* @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
@@ -10,8 +7,8 @@ import link.pagan.traqtor.schema.data.mapping.database.DatabaseAdapter;
public class DatabaseBlueprint {
String name;
- private List schemas;
- private DatabaseAdapter databaseAdapter;
+ // private List schemas;
+ // private DatabaseAdapter databaseAdapter;
public DatabaseBlueprint(String name) {
this.name = name;
diff --git a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/ColumnBlueprintBuilder.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/ColumnBlueprintBuilder.java
index 4d87762..6a59da9 100644
--- a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/ColumnBlueprintBuilder.java
+++ b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/ColumnBlueprintBuilder.java
@@ -1,7 +1,7 @@
package link.pagan.traqtor.generator.blueprint.database.builder;
import link.pagan.traqtor.generator.blueprint.database.ColumnBlueprint;
-import link.pagan.traqtor.generator.blueprint.util.Name;
+import link.pagan.traqtor.util.Name;
import link.pagan.traqtor.schema.data.DataType;
/**
diff --git a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/DatabaseBlueprintBuilder.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/DatabaseBlueprintBuilder.java
index 8471973..bdc82d1 100644
--- a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/DatabaseBlueprintBuilder.java
+++ b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/DatabaseBlueprintBuilder.java
@@ -3,7 +3,7 @@ package link.pagan.traqtor.generator.blueprint.database.builder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import link.pagan.traqtor.generator.blueprint.util.Name;
+import link.pagan.traqtor.util.Name;
import link.pagan.traqtor.schema.data.mapping.database.DatabaseAdapter;
/**
diff --git a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/SchemeBlueprintBuilder.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/SchemeBlueprintBuilder.java
index b60fd86..c0401dd 100644
--- a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/SchemeBlueprintBuilder.java
+++ b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/SchemeBlueprintBuilder.java
@@ -3,7 +3,7 @@ package link.pagan.traqtor.generator.blueprint.database.builder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import link.pagan.traqtor.generator.blueprint.util.Name;
+import link.pagan.traqtor.util.Name;
/**
*
diff --git a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/TableBlueprintBuilder.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/TableBlueprintBuilder.java
index 80cd26b..2a08b57 100644
--- a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/TableBlueprintBuilder.java
+++ b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/database/builder/TableBlueprintBuilder.java
@@ -3,7 +3,7 @@ package link.pagan.traqtor.generator.blueprint.database.builder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import link.pagan.traqtor.generator.blueprint.util.Name;
+import link.pagan.traqtor.util.Name;
/**
*
diff --git a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/AtomBlueprint.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/AtomBlueprint.java
new file mode 100644
index 0000000..56d2add
--- /dev/null
+++ b/traqtor-generator/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-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/LinkBlueprint.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/LinkBlueprint.java
new file mode 100644
index 0000000..25608ab
--- /dev/null
+++ b/traqtor-generator/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-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/LinkType.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/LinkType.java
new file mode 100644
index 0000000..bf93c3f
--- /dev/null
+++ b/traqtor-generator/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-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/ParticleBlueprint.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/ParticleBlueprint.java
new file mode 100644
index 0000000..6f25253
--- /dev/null
+++ b/traqtor-generator/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-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/UniverseBlueprint.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/UniverseBlueprint.java
new file mode 100644
index 0000000..db95a8e
--- /dev/null
+++ b/traqtor-generator/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-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/AtomBlueprintBuilder.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/AtomBlueprintBuilder.java
new file mode 100644
index 0000000..d26be33
--- /dev/null
+++ b/traqtor-generator/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-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/LinkBlueprintBuilder.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/LinkBlueprintBuilder.java
new file mode 100644
index 0000000..cc9d65b
--- /dev/null
+++ b/traqtor-generator/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-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/ParticleBlueprintBuilder.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/ParticleBlueprintBuilder.java
new file mode 100644
index 0000000..2546c3f
--- /dev/null
+++ b/traqtor-generator/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-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/UniverseBlueprintBuilder.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/universe/build/UniverseBlueprintBuilder.java
new file mode 100644
index 0000000..4c97a78
--- /dev/null
+++ b/traqtor-generator/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-generator/src/main/java/link/pagan/traqtor/generator/blueprint/util/Name.java b/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/util/Name.java
deleted file mode 100644
index 4656cd2..0000000
--- a/traqtor-generator/src/main/java/link/pagan/traqtor/generator/blueprint/util/Name.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.util;
-
-/**
- *
- * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
- */
-public class Name {
-
- 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);
- }
-
-
-
-
-
-}
diff --git a/traqtor-schema-ref/src/main/java/link/pagan/traqtor/schema/basic/data/DataTypeSchemaImpl.java b/traqtor-schema-ref/src/main/java/link/pagan/traqtor/schema/basic/data/DataTypeSchemaReferenceImplementation.java
similarity index 65%
rename from traqtor-schema-ref/src/main/java/link/pagan/traqtor/schema/basic/data/DataTypeSchemaImpl.java
rename to traqtor-schema-ref/src/main/java/link/pagan/traqtor/schema/basic/data/DataTypeSchemaReferenceImplementation.java
index bfaa2bf..f4a934d 100644
--- a/traqtor-schema-ref/src/main/java/link/pagan/traqtor/schema/basic/data/DataTypeSchemaImpl.java
+++ b/traqtor-schema-ref/src/main/java/link/pagan/traqtor/schema/basic/data/DataTypeSchemaReferenceImplementation.java
@@ -1,20 +1,21 @@
package link.pagan.traqtor.schema.basic.data;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
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 DataTypeSchemaImpl implements DataTypeSchema {
+public class DataTypeSchemaReferenceImplementation implements DataTypeSchema {
+ private static final Name name = Name.of("traqtor", "basic");
+
// ARRAY(""),
// LIST(""),
// SET(""),
@@ -44,8 +45,8 @@ public class DataTypeSchemaImpl implements DataTypeSchema {
}
@Override
- public String getName() {
- return "basic";
+ public Name getName() {
+ return name;
}
@Override
@@ -53,26 +54,26 @@ public class DataTypeSchemaImpl implements DataTypeSchema {
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);
- }};
- }
+// @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-schema-ref/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/MappingSchemaImpl.java b/traqtor-schema-ref/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/MappingSchemaImpl.java
index d211b53..8a91620 100644
--- a/traqtor-schema-ref/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/MappingSchemaImpl.java
+++ b/traqtor-schema-ref/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/MappingSchemaImpl.java
@@ -1,9 +1,10 @@
package link.pagan.traqtor.schema.basic.data.mapping;
import java.util.List;
-import link.pagan.traqtor.schema.basic.data.DataTypeSchemaImpl;
+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;
/**
*
@@ -11,26 +12,28 @@ import link.pagan.traqtor.schema.data.mapping.MappingSchema;
*/
public class MappingSchemaImpl implements MappingSchema {
- public static final MappingEntry NULLABLE_BOOLEAN = new MappingEntry(DataTypeSchemaImpl.BOOLEAN , true , false );
- public static final MappingEntry BOOLEAN = new MappingEntry(DataTypeSchemaImpl.BOOLEAN , false , true );
- public static final MappingEntry NULLABLE_BYTE = new MappingEntry(DataTypeSchemaImpl.BYTE , true , false );
- public static final MappingEntry BYTE = new MappingEntry(DataTypeSchemaImpl.BYTE , false , true );
- public static final MappingEntry NULLABLE_SHORT = new MappingEntry(DataTypeSchemaImpl.SHORT , true , false );
- public static final MappingEntry SHORT = new MappingEntry(DataTypeSchemaImpl.SHORT , false , true );
- public static final MappingEntry NULLABLE_INTEGER = new MappingEntry(DataTypeSchemaImpl.INTEGER , true , false );
- public static final MappingEntry INTEGER = new MappingEntry(DataTypeSchemaImpl.INTEGER , false , true );
- public static final MappingEntry NULLABLE_LONG = new MappingEntry(DataTypeSchemaImpl.LONG , true , false );
- public static final MappingEntry LONG = new MappingEntry(DataTypeSchemaImpl.LONG , false , true );
- public static final MappingEntry NULLABLE_FLOAT = new MappingEntry(DataTypeSchemaImpl.FLOAT , true , false );
- public static final MappingEntry FLOAT = new MappingEntry(DataTypeSchemaImpl.FLOAT , false , false );
- public static final MappingEntry NULLABLE_DOUBLE = new MappingEntry(DataTypeSchemaImpl.DOUBLE , true , false );
- public static final MappingEntry DOUBLE = new MappingEntry(DataTypeSchemaImpl.DOUBLE , false , false );
- public static final MappingEntry STRING = new MappingEntry(DataTypeSchemaImpl.STRING , true , false );
- public static final MappingEntry DATE = new MappingEntry(DataTypeSchemaImpl.DATE , true , false );
- public static final MappingEntry TIME = new MappingEntry(DataTypeSchemaImpl.TIME , true , false );
- public static final MappingEntry TIMESTAMP = new MappingEntry(DataTypeSchemaImpl.TIMESTAMP , true , false );
- public static final MappingEntry ID = new MappingEntry(DataTypeSchemaImpl.ID , true , true );
- public static final MappingEntry UUID = new MappingEntry(DataTypeSchemaImpl.UUID , true , true );
+ 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,
@@ -49,8 +52,8 @@ public class MappingSchemaImpl implements MappingSchema {
}
@Override
- public String getName() {
- return "basic";
+ public Name getName() {
+ return name;
}
}
diff --git a/traqtor-schema-ref/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/database/PostgresDatabaseAdapter.java b/traqtor-schema-ref/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/database/PostgresDatabaseAdapter.java
index 7fdc016..5030bb9 100644
--- a/traqtor-schema-ref/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/database/PostgresDatabaseAdapter.java
+++ b/traqtor-schema-ref/src/main/java/link/pagan/traqtor/schema/basic/data/mapping/database/PostgresDatabaseAdapter.java
@@ -5,29 +5,33 @@
*/
package link.pagan.traqtor.schema.basic.data.mapping.database;
-import java.util.HashMap;
-import java.util.Map;
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 String NAME = "PostgreSQL";
+
+ 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 Map register() {
- return new HashMap(){
- private static final long serialVersionUID = 1L;
- {
- put(NAME, new PostgresDatabaseAdapter());
- }};
+ public Name getName() {
+ return NAME;
}
}
diff --git a/traqtor-schema/pom.xml b/traqtor-schema/pom.xml
index 5d5645b..18f02ce 100644
--- a/traqtor-schema/pom.xml
+++ b/traqtor-schema/pom.xml
@@ -16,6 +16,13 @@
11
11
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.12.1
+
+
diff --git a/traqtor-schema/src/main/java/link/pagan/traqtor/schema/data/mapping/database/DatabaseAdapter.java b/traqtor-schema/src/main/java/link/pagan/traqtor/schema/data/mapping/database/DatabaseAdapter.java
index 6f0eb67..eac9e3b 100644
--- a/traqtor-schema/src/main/java/link/pagan/traqtor/schema/data/mapping/database/DatabaseAdapter.java
+++ b/traqtor-schema/src/main/java/link/pagan/traqtor/schema/data/mapping/database/DatabaseAdapter.java
@@ -1,5 +1,6 @@
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;
@@ -9,14 +10,14 @@ import link.pagan.traqtor.util.Registrable;
*/
public abstract class DatabaseAdapter implements Named, Registrable {
- private final String name;
+ private final Name name;
- protected DatabaseAdapter(String name) {
+ protected DatabaseAdapter(Name name) {
this.name = name;
}
@Override
- public String getName() {
+ public Name getName() {
return name;
}
diff --git a/traqtor-schema/src/main/java/link/pagan/traqtor/util/Name.java b/traqtor-schema/src/main/java/link/pagan/traqtor/util/Name.java
new file mode 100644
index 0000000..2c2662d
--- /dev/null
+++ b/traqtor-schema/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-schema/src/main/java/link/pagan/traqtor/util/Named.java b/traqtor-schema/src/main/java/link/pagan/traqtor/util/Named.java
index 310a7bb..b95bf5f 100644
--- a/traqtor-schema/src/main/java/link/pagan/traqtor/util/Named.java
+++ b/traqtor-schema/src/main/java/link/pagan/traqtor/util/Named.java
@@ -6,6 +6,6 @@ package link.pagan.traqtor.util;
*/
public interface Named {
- public String getName();
+ public Name getName();
}
diff --git a/traqtor-schema/src/main/java/link/pagan/traqtor/util/Registrable.java b/traqtor-schema/src/main/java/link/pagan/traqtor/util/Registrable.java
index 5ea99d8..c6babf0 100644
--- a/traqtor-schema/src/main/java/link/pagan/traqtor/util/Registrable.java
+++ b/traqtor-schema/src/main/java/link/pagan/traqtor/util/Registrable.java
@@ -1,13 +1,11 @@
package link.pagan.traqtor.util;
-import java.util.Map;
-
/**
*
* @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
*/
public interface Registrable {
- public Map register();
+// public Map register();
}