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