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 new file mode 100644 index 0000000..b23ff61 --- /dev/null +++ b/traqtor-api/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-api/src/main/java/link/pagan/traqtor/_api/Commanded.java b/traqtor-api/src/main/java/link/pagan/traqtor/_api/Commanded.java index 9eb60ab..3852bb7 100644 --- a/traqtor-api/src/main/java/link/pagan/traqtor/_api/Commanded.java +++ b/traqtor-api/src/main/java/link/pagan/traqtor/_api/Commanded.java @@ -4,6 +4,6 @@ package link.pagan.traqtor._api; * * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >} */ -abstract class Commanded> { +public interface Commanded { } \ No newline at end of file diff --git a/traqtor-api/src/main/java/link/pagan/traqtor/_api/Executor.java b/traqtor-api/src/main/java/link/pagan/traqtor/_api/Executor.java index d9fac91..663b137 100644 --- a/traqtor-api/src/main/java/link/pagan/traqtor/_api/Executor.java +++ b/traqtor-api/src/main/java/link/pagan/traqtor/_api/Executor.java @@ -1,40 +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 { - - private static boolean paranoindLoggin = false; - private static boolean mute = true; - - @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; - } - - public static void enableParanoindLoggin() { - enableLog(); - paranoindLoggin = true; - } - - public static void enableLog() { - mute = false; - } -} +//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-api/src/main/java/link/pagan/traqtor/_api/Command.java b/traqtor-api/src/main/java/link/pagan/traqtor/_api/UnaryCommand.java similarity index 63% rename from traqtor-api/src/main/java/link/pagan/traqtor/_api/Command.java rename to traqtor-api/src/main/java/link/pagan/traqtor/_api/UnaryCommand.java index 43e7cfd..6a9f99a 100644 --- a/traqtor-api/src/main/java/link/pagan/traqtor/_api/Command.java +++ b/traqtor-api/src/main/java/link/pagan/traqtor/_api/UnaryCommand.java @@ -8,11 +8,30 @@ import link.pagan.traqtor._api.result.message.CommandExecMessageStatus; * * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >} */ -public abstract class Command { +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(T object); + 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)); @@ -42,4 +61,17 @@ public abstract class Command { 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-api/src/main/java/link/pagan/traqtor/_api/result/CommandExecResult.java b/traqtor-api/src/main/java/link/pagan/traqtor/_api/result/CommandExecResult.java index 58e8cb0..68e9db2 100644 --- a/traqtor-api/src/main/java/link/pagan/traqtor/_api/result/CommandExecResult.java +++ b/traqtor-api/src/main/java/link/pagan/traqtor/_api/result/CommandExecResult.java @@ -20,7 +20,7 @@ public class CommandExecResult { } public boolean OK () { - return this.getStatus() == CommandExecResultStatus.DONE; + return this.getStatus() != CommandExecResultStatus.FAIL; } public CommandExecResultStatus getStatus() { diff --git a/traqtor-api/src/main/java/link/pagan/traqtor/api/API.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/API.java new file mode 100644 index 0000000..09c082e --- /dev/null +++ b/traqtor-api/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-api/src/main/java/link/pagan/traqtor/api/Traqtor.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/Traqtor.java index f20d457..2a1ceae 100644 --- a/traqtor-api/src/main/java/link/pagan/traqtor/api/Traqtor.java +++ b/traqtor-api/src/main/java/link/pagan/traqtor/api/Traqtor.java @@ -1,14 +1,11 @@ package link.pagan.traqtor.api; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; -import java.io.File; -import java.io.IOException; import java.util.HashMap; import java.util.Map; -import link.pagan.traqtor._api.Command; -import link.pagan.traqtor._api.Executor; +import link.pagan.traqtor._api.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; @@ -18,7 +15,7 @@ import link.pagan.traqtor.util.Name; * * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >} */ -public class Traqtor extends Executor { +public class Traqtor implements Commanded { private Workspace workspace; @@ -29,11 +26,11 @@ public class Traqtor extends Executor { traqtor.registerDataTypeSchema(new DataTypeSchemaReferenceImplementation()); return traqtor; } - - private void registerDataTypeSchema (DataTypeSchema schema){ - this.dataTypeSchemas.put(schema.getName(), schema); + + private void registerDataTypeSchema(DataTypeSchema schema) { + this.dataTypeSchemas.put(schema.getName(), schema); } - + private Traqtor() { this.dataTypeSchemas = new HashMap<>(); } @@ -42,171 +39,25 @@ public class Traqtor extends Executor { return workspace; } - public static class CreateWorkspace extends Command { - - 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(Traqtor traqtor) { - if (traqtor.workspace != null) { - return fail("There is an open workspace - please close this first, before creating new one"); - } - traqtor.workspace = new Workspace(); - traqtor.workspace.name(name); - DataTypeSchemaReferenceImplementation dataTypeSchemaReferenceImplementation = new DataTypeSchemaReferenceImplementation(); - traqtor.workspace.schemas().put(dataTypeSchemaReferenceImplementation.getName(), dataTypeSchemaReferenceImplementation); - if (path != null) { - SaveAsWorkspace saveAsWorkspace = new SaveAsWorkspace(path); - saveAsWorkspace.setResultHolder(result); - saveAsWorkspace.exec(traqtor); - if (!result.OK()) { - traqtor.workspace = null; - return result; - } - } - return done(); - } - + public void workspace(Workspace workspace) { + this.workspace = workspace; } - public static class SaveAsWorkspace extends Command { - - private final String workspacePath; - - public SaveAsWorkspace(String workspacePath) { - this.workspacePath = workspacePath; - } - - @Override - public CommandExecResult exec(Traqtor traqtor) { - 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); - } + 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 (workspaceDir.listFiles().length > 0) { - return fail("Root directory is not empty, failed to assing " + workspacePath + " as root for workspace"); + if (result.getStatus() != CommandExecResultStatus.DONE) { + result.print(); } } - 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 = traqtor.workspace.root(); - traqtor.workspace.root(workspacePath); - - SaveWorkspace saveWorkspace = new SaveWorkspace(); - saveWorkspace.setResultHolder(result); - saveWorkspace.exec(traqtor); - if (!result.OK()) { - traqtor.workspace.root(hold); - return result; - } - - return done(); } - + return result; } - public static class SaveWorkspace extends Command { - - @Override - public CommandExecResult exec(Traqtor traqtor) { - String workspacePath = traqtor.workspace.root(); - if (traqtor.workspace.root() == null) { - return fail("Workspace was not saved before - use \"save as\" command for the first save"); - } - File workspaceFile = new File(workspacePath, Workspace.JSON_FILENAME + ".json"); - - 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 { - traqtor.workspace.mapper().writeValue(workspaceFile, traqtor.workspace); - } catch (IOException ex) { - System.err.println(ex); - return fail("Failed to write " + Workspace.JSON_FILENAME + ".json"); - } - - traqtor.workspace.dirty(false); - - return done(); - } - - } - - public static class LoadWorkspace extends Command { - - private final String workspacePath; - - public LoadWorkspace(String workspacePath) { - this.workspacePath = workspacePath; - } - - @Override - public CommandExecResult exec(Traqtor traqtor) { - File workspaceFile = new File(workspacePath, Workspace.JSON_FILENAME + ".json"); - if (!workspaceFile.exists()) { - return fail("No " + Workspace.JSON_FILENAME + ".json file found in selected directory, missed?"); - } - - ObjectMapper mapper = new ObjectMapper(); - SimpleModule module = new SimpleModule(); - module.addDeserializer(Workspace.class, new Workspace.WorkspaceDeserializer()); - mapper.registerModule(module); - - Workspace workspace = null; - try { - workspace = mapper.readValue(workspaceFile, Workspace.class); - } catch (IOException ex) { - System.err.println(ex); - return fail("Failed to read " + workspaceFile.getAbsolutePath()); - } - workspace.root(workspacePath); - HashMap schemas = workspace.schemas(); - for (Name name : schemas.keySet()) { - if (schemas.get(name) == null) { - DataTypeSchema loaded = traqtor.dataTypeSchemas.get(name); - if (loaded == null){ - warn("Shema with name " + name.asDotted() + " was not found in system. Preload or give up"); - } else { - schemas.put(name, loaded); - info("Shema " + name.asDotted() + " was found and loaded into workspace on load"); - } - } - } - - traqtor.workspace = workspace; - return done(); - } - } } diff --git a/traqtor-api/src/main/java/link/pagan/traqtor/api/project/Project.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/project/Project.java index 5dc5527..9f0c02c 100644 --- a/traqtor-api/src/main/java/link/pagan/traqtor/api/project/Project.java +++ b/traqtor-api/src/main/java/link/pagan/traqtor/api/project/Project.java @@ -1,9 +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 { +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-api/src/main/java/link/pagan/traqtor/api/project/ProjectType.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/project/ProjectType.java new file mode 100644 index 0000000..89f3c0e --- /dev/null +++ b/traqtor-api/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-api/src/main/java/link/pagan/traqtor/api/project/UniverseProject.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/project/UniverseProject.java deleted file mode 100644 index 877eacd..0000000 --- a/traqtor-api/src/main/java/link/pagan/traqtor/api/project/UniverseProject.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package link.pagan.traqtor.api.project; - -/** - * - * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >} - */ -public class UniverseProject extends Project { - -} diff --git a/traqtor-api/src/main/java/link/pagan/traqtor/api/project/backend/BackendProject.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/project/backend/BackendProject.java new file mode 100644 index 0000000..a867a3b --- /dev/null +++ b/traqtor-api/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-api/src/main/java/link/pagan/traqtor/api/project/database/DatabaseProject.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/project/database/DatabaseProject.java new file mode 100644 index 0000000..1a233e7 --- /dev/null +++ b/traqtor-api/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-api/src/main/java/link/pagan/traqtor/api/project/frontend/FrontendProject.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/project/frontend/FrontendProject.java new file mode 100644 index 0000000..7289b61 --- /dev/null +++ b/traqtor-api/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-api/src/main/java/link/pagan/traqtor/api/project/universe/UniverseProject.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/project/universe/UniverseProject.java new file mode 100644 index 0000000..5351221 --- /dev/null +++ b/traqtor-api/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-api/src/main/java/link/pagan/traqtor/api/workspace/Workspace.java b/traqtor-api/src/main/java/link/pagan/traqtor/api/workspace/Workspace.java index bb05f14..fe028b5 100644 --- a/traqtor-api/src/main/java/link/pagan/traqtor/api/workspace/Workspace.java +++ b/traqtor-api/src/main/java/link/pagan/traqtor/api/workspace/Workspace.java @@ -14,7 +14,7 @@ import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; -import link.pagan.traqtor._api.Executor; +import link.pagan.traqtor._api.Commanded; import link.pagan.traqtor.api.project.Project; import link.pagan.traqtor.generator.blueprint.universe.AtomBlueprint; import link.pagan.traqtor.generator.blueprint.universe.LinkBlueprint; @@ -28,7 +28,7 @@ import link.pagan.traqtor.util.Name; * * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >} */ -public class Workspace extends Executor { +public class Workspace implements Commanded { public static final String JSON_FILENAME = "workspace"; public static final Name DEFAULT_WORKSPACE_NAME = Name.of("workspace"); @@ -40,7 +40,6 @@ public class Workspace extends Executor { private String root; private Name name; - private HashMap schemas; private HashMap projects; @@ -91,7 +90,7 @@ public class Workspace extends Executor { this.dirty = dirty; } - public HashMap schemas() { + public HashMap dataTypeSchemas() { return schemas; } @@ -185,5 +184,5 @@ public class Workspace extends Executor { } } - + } diff --git a/traqtor-api/src/test/java/link/pagan/traqtor/api/TraqtorTest.java b/traqtor-api/src/test/java/link/pagan/traqtor/api/TraqtorTest.java index 33c1adb..6a639a5 100644 --- a/traqtor-api/src/test/java/link/pagan/traqtor/api/TraqtorTest.java +++ b/traqtor-api/src/test/java/link/pagan/traqtor/api/TraqtorTest.java @@ -28,13 +28,13 @@ public class TraqtorTest { @DisplayName("New workspace creation") void newWorkspaceSave() { Traqtor traqtor = Traqtor.init(); - result = traqtor.execute(new Traqtor.CreateWorkspace()); + result = traqtor.execute(new API.CreateWorkspace()); assertEquals(DONE, result.getStatus()); assertEquals(traqtor.workspace().dirty(), true); - result = traqtor.execute(new Traqtor.SaveWorkspace()); + result = traqtor.execute(new API.SaveWorkspace()); assertEquals(FAIL, result.getStatus()); assertEquals(traqtor.workspace().dirty(), true); - result = traqtor.execute(new Traqtor.SaveAsWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_ROOT)); + result = traqtor.execute(new API.SaveAsWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_ROOT)); assertEquals(DONE, result.getStatus()); assertEquals(traqtor.workspace().dirty(), false); } @@ -43,18 +43,17 @@ public class TraqtorTest { @DisplayName("Workspace load") void newSaveLoad() { Traqtor traqtor = Traqtor.init(); - result = traqtor.execute(new Traqtor.CreateWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_NAME, TraqtorApiTestUtils.TEST_WORKSPACE_ROOT)); + 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 Traqtor.LoadWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_ROOT)); + result = traqtor.execute(new API.LoadWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_ROOT)); assertEquals(DONE, result.getStatus()); assertEquals(traqtor.workspace().dirty(), false); - assertEquals(traqtor.workspace().schemas().size(), 1); - result = traqtor.execute(new Traqtor.SaveWorkspace()); + assertEquals(traqtor.workspace().dataTypeSchemas().size(), 1); + result = traqtor.execute(new API.SaveWorkspace()); assertEquals(DONE, result.getStatus()); assertEquals(traqtor.workspace().dirty(), false); - } } diff --git a/traqtor-api/src/test/java/link/pagan/traqtor/api/workspace/WorkspaceTest.java b/traqtor-api/src/test/java/link/pagan/traqtor/api/workspace/WorkspaceTest.java index 6320889..d50234a 100644 --- a/traqtor-api/src/test/java/link/pagan/traqtor/api/workspace/WorkspaceTest.java +++ b/traqtor-api/src/test/java/link/pagan/traqtor/api/workspace/WorkspaceTest.java @@ -1,55 +1,35 @@ package link.pagan.traqtor.api.workspace; -//package link.pagan.traqtor.api.workbench; -// -//import link.pagan.traqtor.api.workbench.command.WorkbenchCommandSaveAs; -//import link.pagan.traqtor.api.workbench.command.WorkbenchCommandSave; -//import java.io.IOException; -//import link.pagan.traqtor._api.PrimedTest; -//import link.pagan.traqtor._api.Executor; -//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.BeforeAll; -//import org.junit.jupiter.api.BeforeEach; -//import org.junit.jupiter.api.Test; -// -///** -// * -// * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >} -// */ -//public class WorkbenchTest { -// -// @BeforeAll -// public static void setup() throws IOException { -// Executor.enableParanoindLoggin(); -// } -// -// @BeforeEach -// public void clean() throws IOException { -// killTestRoot(); -// } -// -//// @Test -//// void initSave() { -//// CommandExecResult result = Workbench.init().exec(new WorkbenchCommandSave()); -//// assertEquals(FAIL, result.getStatus()); -//// } -//// -//// @Test -//// void initSaveAs() { -//// CommandExecResult result = Workbench.init().exec(new WorkbenchCommandSaveAs(TEST_ROOT)); -//// assertEquals(DONE, result.getStatus()); -//// } -//// -//// @Test -//// void initSaveAsSave() { -//// Workbench workbench = Workbench.init(); -//// CommandExecResult result = workbench.exec(new WorkbenchCommandSaveAs(TEST_ROOT)); -//// assertEquals(DONE, result.getStatus()); -//// result = workbench.exec(new WorkbenchCommandSave()); -//// assertEquals(DONE, result.getStatus()); -//// } -// -//} +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-api/src/test/java/link/pagan/traqtor/generator/UniverseBlueprintTest.java b/traqtor-api/src/test/java/link/pagan/traqtor/generator/UniverseBlueprintTest.java index d56f550..c1e3a67 100644 --- a/traqtor-api/src/test/java/link/pagan/traqtor/generator/UniverseBlueprintTest.java +++ b/traqtor-api/src/test/java/link/pagan/traqtor/generator/UniverseBlueprintTest.java @@ -3,6 +3,7 @@ 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; @@ -78,7 +79,7 @@ public class UniverseBlueprintTest { Traqtor traqtor = Traqtor.init(); - CommandExecResult result = traqtor.execute(new Traqtor.CreateWorkspace()); + CommandExecResult result = traqtor.execute(new API.CreateWorkspace()); assertEquals(result.getStatus(), DONE); assertEquals(traqtor.workspace().dirty(), true); String serialized = traqtor.workspace().mapper().writeValueAsString(build);