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(); }