Moving towar workspace mechanics impl

Edward M. Kagan 5 years ago
parent f02b304cd7
commit 7ae7d38b11

@ -28,6 +28,11 @@
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<dependencies> <dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>traqtor-schema</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>${project.groupId}</groupId> <groupId>${project.groupId}</groupId>
<artifactId>traqtor-schema-ref</artifactId> <artifactId>traqtor-schema-ref</artifactId>

@ -12,11 +12,12 @@ public abstract class Executor<T extends Executor<T>> extends Commanded<T> {
private static boolean paranoindLoggin = false; private static boolean paranoindLoggin = false;
private static boolean mute = true; private static boolean mute = true;
public CommandExecResult execute(Command<T> command, T arg) { @SuppressWarnings("unchecked")
public CommandExecResult execute(Command<T> command) {
CommandExecResult result = new CommandExecResult(); CommandExecResult result = new CommandExecResult();
command.setResultHolder(result); command.setResultHolder(result);
command.exec(arg); command.exec((T) this);
if (!mute){ if (!mute) {
if (paranoindLoggin) { if (paranoindLoggin) {
result.print(); result.print();
} else { } else {

@ -1,11 +1,18 @@
package link.pagan.traqtor.api; 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.File;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import link.pagan.traqtor._api.Command; import link.pagan.traqtor._api.Command;
import link.pagan.traqtor._api.Executor; import link.pagan.traqtor._api.Executor;
import link.pagan.traqtor._api.result.CommandExecResult; import link.pagan.traqtor._api.result.CommandExecResult;
import link.pagan.traqtor.api.workspace.Workspace; 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;
/** /**
* *
@ -13,36 +20,42 @@ import link.pagan.traqtor.api.workspace.Workspace;
*/ */
public class Traqtor extends Executor<Traqtor> { public class Traqtor extends Executor<Traqtor> {
private static Traqtor env = new Traqtor(); private Workspace workspace;
public static CommandExecResult exec(Command<Traqtor> command) { Map<Name, DataTypeSchema> dataTypeSchemas;
return env.execute(command, env);
public static Traqtor init() {
Traqtor traqtor = new Traqtor();
traqtor.registerDataTypeSchema(new DataTypeSchemaReferenceImplementation());
return traqtor;
} }
static void reset() { private void registerDataTypeSchema (DataTypeSchema schema){
env = new Traqtor(); this.dataTypeSchemas.put(schema.getName(), schema);
} }
Workspace workspace; private Traqtor() {
this.dataTypeSchemas = new HashMap<>();
}
public static Workspace getWorkspace() { public Workspace workspace() {
return env.workspace; return workspace;
} }
public static class CreateWorkspace extends Command<Traqtor> { public static class CreateWorkspace extends Command<Traqtor> {
private final String name; private final Name name;
private final String path; private final String path;
public CreateWorkspace() { public CreateWorkspace() {
this(Workspace.DEFAULT_WORKSPACE_NAME); this(Workspace.DEFAULT_WORKSPACE_NAME);
} }
public CreateWorkspace(String name) { public CreateWorkspace(Name name) {
this(name, null); this(name, null);
} }
public CreateWorkspace(String name, String path) { public CreateWorkspace(Name name, String path) {
this.name = name; this.name = name;
this.path = path; this.path = path;
} }
@ -53,7 +66,9 @@ public class Traqtor extends Executor<Traqtor> {
return fail("There is an open workspace - please close this first, before creating new one"); return fail("There is an open workspace - please close this first, before creating new one");
} }
traqtor.workspace = new Workspace(); traqtor.workspace = new Workspace();
traqtor.workspace.setName(name); traqtor.workspace.name(name);
DataTypeSchemaReferenceImplementation dataTypeSchemaReferenceImplementation = new DataTypeSchemaReferenceImplementation();
traqtor.workspace.schemas().put(dataTypeSchemaReferenceImplementation.getName(), dataTypeSchemaReferenceImplementation);
if (path != null) { if (path != null) {
SaveAsWorkspace saveAsWorkspace = new SaveAsWorkspace(path); SaveAsWorkspace saveAsWorkspace = new SaveAsWorkspace(path);
saveAsWorkspace.setResultHolder(result); saveAsWorkspace.setResultHolder(result);
@ -70,7 +85,7 @@ public class Traqtor extends Executor<Traqtor> {
public static class SaveAsWorkspace extends Command<Traqtor> { public static class SaveAsWorkspace extends Command<Traqtor> {
private String workspacePath; private final String workspacePath;
public SaveAsWorkspace(String workspacePath) { public SaveAsWorkspace(String workspacePath) {
this.workspacePath = workspacePath; this.workspacePath = workspacePath;
@ -93,7 +108,7 @@ public class Traqtor extends Executor<Traqtor> {
File workspaceFile = new File(workspacePath, Workspace.JSON_FILENAME + ".json"); File workspaceFile = new File(workspacePath, Workspace.JSON_FILENAME + ".json");
if (!workspaceFile.exists()) { if (!workspaceFile.exists()) {
try { try {
if (!workspaceFile.createNewFile()){ if (!workspaceFile.createNewFile()) {
return fail("Failed to create " + Workspace.JSON_FILENAME + ".json in workspace root directory"); return fail("Failed to create " + Workspace.JSON_FILENAME + ".json in workspace root directory");
} }
} catch (IOException ex) { } catch (IOException ex) {
@ -101,14 +116,14 @@ public class Traqtor extends Executor<Traqtor> {
} }
} }
String hold = traqtor.workspace.getRoot(); String hold = traqtor.workspace.root();
traqtor.workspace.setRoot(workspacePath); traqtor.workspace.root(workspacePath);
SaveWorkspace saveWorkspace = new SaveWorkspace(); SaveWorkspace saveWorkspace = new SaveWorkspace();
saveWorkspace.setResultHolder(result); saveWorkspace.setResultHolder(result);
saveWorkspace.exec(traqtor); saveWorkspace.exec(traqtor);
if (!result.OK()) { if (!result.OK()) {
traqtor.workspace.setRoot(hold); traqtor.workspace.root(hold);
return result; return result;
} }
@ -121,8 +136,8 @@ public class Traqtor extends Executor<Traqtor> {
@Override @Override
public CommandExecResult exec(Traqtor traqtor) { public CommandExecResult exec(Traqtor traqtor) {
String workspacePath = traqtor.workspace.getRoot(); String workspacePath = traqtor.workspace.root();
if (traqtor.workspace.getRoot() == null) { if (traqtor.workspace.root() == null) {
return fail("Workspace was not saved before - use \"save as\" command for the first save"); return fail("Workspace was not saved before - use \"save as\" command for the first save");
} }
File workspaceFile = new File(workspacePath, Workspace.JSON_FILENAME + ".json"); File workspaceFile = new File(workspacePath, Workspace.JSON_FILENAME + ".json");
@ -136,15 +151,62 @@ public class Traqtor extends Executor<Traqtor> {
} }
try { try {
traqtor.workspace.getMapper().writeValue(workspaceFile, traqtor.workspace); traqtor.workspace.mapper().writeValue(workspaceFile, traqtor.workspace);
} catch (IOException ex) { } catch (IOException ex) {
System.err.println(ex);
return fail("Failed to write " + Workspace.JSON_FILENAME + ".json"); return fail("Failed to write " + Workspace.JSON_FILENAME + ".json");
} }
traqtor.workspace.setDirty(false); traqtor.workspace.dirty(false);
return done(); return done();
} }
} }
public static class LoadWorkspace extends Command<Traqtor> {
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<Name, DataTypeSchema> 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();
}
}
} }

@ -1,36 +1,9 @@
package link.pagan.traqtor.api.project; package link.pagan.traqtor.api.project;
import java.util.ArrayList;
import java.util.List;
import link.pagan.traqtor.generator.blueprint.database.DatabaseBlueprint;
import link.pagan.traqtor.schema.basic.EndpointSchemaImpl;
import link.pagan.traqtor.schema.basic.data.DataTypeSchemaImpl;
import link.pagan.traqtor.schema.data.DataTypeSchema;
import link.pagan.traqtor.schema.logic.EndpointSchema;
/** /**
* *
* @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >} * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
*/ */
public class Project { public abstract class Project {
private EndpointSchema endpointSchema;
private DataTypeSchema dataTypeSchema;
private List<DatabaseBlueprint> dataBases;
static Project init() {
return new Project(new EndpointSchemaImpl(), new DataTypeSchemaImpl());
}
public Project(EndpointSchema endpointSchema, DataTypeSchema dataTypeSchema) {
this.endpointSchema = endpointSchema;
this.dataTypeSchema = dataTypeSchema;
this.dataBases = new ArrayList<DatabaseBlueprint>();
}
void addDataBaseBlueprint(DatabaseBlueprint dataBaseBlueprint) {
this.dataBases.add(dataBaseBlueprint);
}
} }

@ -0,0 +1,14 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package link.pagan.traqtor.api.project;
/**
*
* @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
*/
public class UniverseProject extends Project {
}

@ -1,9 +1,28 @@
package link.pagan.traqtor.api.workspace; package link.pagan.traqtor.api.workspace;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import link.pagan.traqtor._api.Executor; import link.pagan.traqtor._api.Executor;
import link.pagan.traqtor.api.project.Project;
import link.pagan.traqtor.generator.blueprint.universe.AtomBlueprint;
import link.pagan.traqtor.generator.blueprint.universe.LinkBlueprint;
import link.pagan.traqtor.generator.blueprint.universe.LinkType;
import link.pagan.traqtor.generator.blueprint.universe.ParticleBlueprint;
import link.pagan.traqtor.generator.blueprint.universe.UniverseBlueprint;
import link.pagan.traqtor.schema.data.DataTypeSchema;
import link.pagan.traqtor.util.Name;
/** /**
* *
@ -12,55 +31,159 @@ import link.pagan.traqtor._api.Executor;
public class Workspace extends Executor<Workspace> { public class Workspace extends Executor<Workspace> {
public static final String JSON_FILENAME = "workspace"; public static final String JSON_FILENAME = "workspace";
public static final String DEFAULT_WORKSPACE_NAME = "I'm too lazy to think of a name for this workspace"; public static final Name DEFAULT_WORKSPACE_NAME = Name.of("workspace");
private String name; private final ObjectMapper mapper;
@JsonIgnore
private boolean dirty; private boolean dirty;
@JsonIgnore
private final ObjectMapper mapper;
@JsonIgnore
private String root; private String root;
private Name name;
private HashMap<Name, DataTypeSchema> schemas;
private HashMap<Name, Project> projects;
public Workspace() { public Workspace() {
this.mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT); 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.dirty = true;
this.projects = new HashMap<>();
this.schemas = new HashMap<>();
} }
public String getName() { public Name name() {
return name; return name;
} }
public String getRoot() { public String root() {
return root; return root;
} }
public void setRoot(String root) { public void root(String root) {
this.root = root; this.root = root;
} }
public void setName(String name) { public void name(Name name) {
this.name = name; this.name = name;
} }
public ObjectMapper getMapper() { public ObjectMapper mapper() {
return mapper; return mapper;
} }
public boolean isDirty() { public boolean dirty() {
return dirty; return dirty;
} }
public void setDirty(boolean dirty) { public void dirty(boolean dirty) {
this.dirty = dirty; this.dirty = dirty;
} }
// @Override public HashMap<Name, DataTypeSchema> schemas() {
// Workspace self() { return schemas;
// throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. }
// }
public HashMap<Name, Project> projects() {
return projects;
}
public static final class WorkspaceSerializer extends StdSerializer<Workspace> {
private static final long serialVersionUID = 1L;
public WorkspaceSerializer() {
this(null);
}
public WorkspaceSerializer(Class<Workspace> 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<Name> 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<Name> 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<Workspace> {
private static final long serialVersionUID = 1L;
public WorkspaceDeserializer() {
this(null);
}
public WorkspaceDeserializer(Class<Workspace> 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;
}
}
} }

@ -1,35 +0,0 @@
package link.pagan.traqtor.api.workspace.command;
//package link.pagan.traqtor.api.workbench.command;
//
//import java.io.File;
//import java.io.IOException;
//import link.pagan.traqtor._api.Command;
//import link.pagan.traqtor._api.result.CommandExecResult;
//import link.pagan.traqtor.api.workbench.Workbench;
//
///**
// *
// * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
// */
//public class WorkbenchCommandSave extends Command<Workbench> {
//
// @Override
// public CommandExecResult exec(Workbench workbench) {
// if (workbench.getRoot() == null) {
// return fail("Workspace was not saved before - use \"save as\" command for the first save");
// }
// File demoDir = new File(workbench.getRoot());
// File workbenchFile = new File(demoDir, Workbench.JSON_FILENAME + ".json");
// if (!workbenchFile.exists()) {
// return fail("Workspace lock file (" + (workbenchFile.getAbsolutePath()) + ") does not exit ");
// }
// try {
// workbench.getMapper().writeValue(workbenchFile, workbench);
// } catch (IOException ex) {
// return fail("Failed to write" + Workbench.JSON_FILENAME + ".json");
// }
// return done();
// }
//
//}

@ -1,47 +0,0 @@
package link.pagan.traqtor.api.workspace.command;
//package link.pagan.traqtor.api.workbench.command;
//
//import java.io.File;
//import java.io.IOException;
//import link.pagan.traqtor._api.Command;
//import link.pagan.traqtor._api.result.CommandExecResult;
//import link.pagan.traqtor.api.workbench.Workbench;
//
///**
// *
// * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
// */
//public class WorkbenchCommandSaveAs extends Command<Workbench> {
//
// String path;
//
// public WorkbenchCommandSaveAs(String path) {
// this.path = path;
// }
//
// @Override
// public CommandExecResult exec(Workbench workbench) {
// File demoDir = new File(path);
// if (!demoDir.exists()) {
// if (!demoDir.mkdir()) {
// return fail("Failed to create workbench root directory at " + path);
// } else {
// info("Create workbench root directory at " + path);
// }
// } else {
// if (demoDir.listFiles().length > 0) {
// return fail("Root directory is not empty, failed to assing " + path + " as root for workspace");
// }
// }
// File workbenchFile = new File(demoDir, Workbench.JSON_FILENAME + ".json");
// try {
// workbench.getMapper().writeValue(workbenchFile, workbench);
// } catch (IOException ex) {
// return fail("Failed to write " + Workbench.JSON_FILENAME + ".json");
// }
// workbench.setRoot(path);
// return done();
// }
//
//}

@ -5,6 +5,7 @@ import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Comparator; import java.util.Comparator;
import link.pagan.traqtor.util.Name;
/** /**
* *
@ -13,7 +14,7 @@ import java.util.Comparator;
public class TraqtorApiTestUtils { public class TraqtorApiTestUtils {
public static final String TEST_WORKSPACE_ROOT = new File(new File("").getAbsoluteFile().getParentFile(), "traqtor-demo-workspace").getAbsolutePath(); public static final String TEST_WORKSPACE_ROOT = new File(new File("").getAbsoluteFile().getParentFile(), "traqtor-demo-workspace").getAbsolutePath();
public static final String TEST_WORKSPACE_NAME = "TRAQTOR_DEMO_WORKSPACE"; public static final Name TEST_WORKSPACE_NAME = Name.of("traqtor", "demo", "workspace");
public static final void killTestRoot() throws IOException { public static final void killTestRoot() throws IOException {
File root = new File(TEST_WORKSPACE_ROOT); File root = new File(TEST_WORKSPACE_ROOT);

@ -5,9 +5,9 @@ import link.pagan.traqtor._api.TraqtorApiTestUtils;
import link.pagan.traqtor._api.result.CommandExecResult; import link.pagan.traqtor._api.result.CommandExecResult;
import static link.pagan.traqtor._api.result.CommandExecResultStatus.DONE; import static link.pagan.traqtor._api.result.CommandExecResultStatus.DONE;
import static link.pagan.traqtor._api.result.CommandExecResultStatus.FAIL; import static link.pagan.traqtor._api.result.CommandExecResultStatus.FAIL;
import org.junit.jupiter.api.AfterEach;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
/** /**
@ -21,46 +21,40 @@ public class TraqtorTest {
@BeforeEach @BeforeEach
public void cleanTestDir() throws IOException { public void cleanTestDir() throws IOException {
TraqtorApiTestUtils.killTestRoot(); TraqtorApiTestUtils.killTestRoot();
} // Executor.enableParanoindLoggin();
@AfterEach
public void killCore() {
Traqtor.reset();
}
@Test
void newWorkspace() {
result = Traqtor.exec(new Traqtor.CreateWorkspace());
assertEquals(result.getStatus(), DONE);
assertEquals(Traqtor.getWorkspace().isDirty(), true);
} }
@Test @Test
@DisplayName("New workspace creation")
void newWorkspaceSave() { void newWorkspaceSave() {
result = Traqtor.exec(new Traqtor.CreateWorkspace()); Traqtor traqtor = Traqtor.init();
result = traqtor.execute(new Traqtor.CreateWorkspace());
assertEquals(DONE, result.getStatus()); assertEquals(DONE, result.getStatus());
assertEquals(Traqtor.getWorkspace().isDirty(), true); assertEquals(traqtor.workspace().dirty(), true);
result = Traqtor.exec(new Traqtor.SaveWorkspace()); result = traqtor.execute(new Traqtor.SaveWorkspace());
assertEquals(FAIL, result.getStatus()); assertEquals(FAIL, result.getStatus());
assertEquals(Traqtor.getWorkspace().isDirty(), true); assertEquals(traqtor.workspace().dirty(), true);
result = Traqtor.exec(new Traqtor.SaveAsWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_ROOT)); result = traqtor.execute(new Traqtor.SaveAsWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_ROOT));
assertEquals(DONE, result.getStatus()); assertEquals(DONE, result.getStatus());
assertEquals(Traqtor.getWorkspace().isDirty(), false); assertEquals(traqtor.workspace().dirty(), false);
} }
@Test @Test
void newWorkspaceWithName() { @DisplayName("Workspace load")
result = Traqtor.exec(new Traqtor.CreateWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_NAME)); void newSaveLoad() {
Traqtor traqtor = Traqtor.init();
result = traqtor.execute(new Traqtor.CreateWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_NAME, TraqtorApiTestUtils.TEST_WORKSPACE_ROOT));
assertEquals(DONE, result.getStatus()); assertEquals(DONE, result.getStatus());
assertEquals(Traqtor.getWorkspace().isDirty(), true); assertEquals(traqtor.workspace().dirty(), false);
} traqtor = Traqtor.init();
result = traqtor.execute(new Traqtor.LoadWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_ROOT));
@Test
void newWorkspaceWithNameAndPath() {
result = Traqtor.exec(new Traqtor.CreateWorkspace(TraqtorApiTestUtils.TEST_WORKSPACE_NAME, TraqtorApiTestUtils.TEST_WORKSPACE_ROOT));
assertEquals(DONE, result.getStatus()); assertEquals(DONE, result.getStatus());
assertEquals(Traqtor.getWorkspace().isDirty(), false); assertEquals(traqtor.workspace().dirty(), false);
assertEquals(traqtor.workspace().schemas().size(), 1);
result = traqtor.execute(new Traqtor.SaveWorkspace());
assertEquals(DONE, result.getStatus());
assertEquals(traqtor.workspace().dirty(), false);
} }
} }

@ -0,0 +1,89 @@
package link.pagan.traqtor.generator;
import com.fasterxml.jackson.core.JsonProcessingException;
import link.pagan.traqtor._api.result.CommandExecResult;
import static link.pagan.traqtor._api.result.CommandExecResultStatus.DONE;
import link.pagan.traqtor.api.Traqtor;
import link.pagan.traqtor.generator.blueprint.universe.LinkType;
import link.pagan.traqtor.generator.blueprint.universe.build.LinkBlueprintBuilder;
import link.pagan.traqtor.generator.blueprint.universe.build.AtomBlueprintBuilder;
import link.pagan.traqtor.generator.blueprint.universe.build.ParticleBlueprintBuilder;
import link.pagan.traqtor.generator.blueprint.universe.build.UniverseBlueprintBuilder;
import link.pagan.traqtor.generator.blueprint.universe.UniverseBlueprint;
import link.pagan.traqtor.util.Name;
import link.pagan.traqtor.schema.basic.data.DataTypeSchemaReferenceImplementation;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
/**
*
* @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
*/
public class UniverseBlueprintTest {
@Test
void programmaticBuild() throws JsonProcessingException {
UniverseBlueprintBuilder builder = new UniverseBlueprintBuilder(new DataTypeSchemaReferenceImplementation());
builder
.addAtom(new AtomBlueprintBuilder()
.name(Name.of("account"))
.description("Base user atom")
.addParticle(new ParticleBlueprintBuilder()
.name(Name.of("nickname"))
.description("User nickname, just in case")
.type("string")
)
.addParticle(new ParticleBlueprintBuilder()
.name(Name.of("email"))
.description("Main auth facility for user")
.type("string")
)
.addParticle(new ParticleBlueprintBuilder()
.name(Name.of("phone"))
.description("Alternative user authentification facility")
.type("string")
)
.addParticle(new ParticleBlueprintBuilder()
.name(Name.of("password"))
.description("User password")
.type("string")
)
)
.addAtom(new AtomBlueprintBuilder()
.name(Name.of("account", "details"))
.description("User info atom")
.addParticle(new ParticleBlueprintBuilder()
.name(Name.of("first", "name"))
.description("First name of a user")
.type("string")
)
.addParticle(new ParticleBlueprintBuilder()
.name(Name.of("last", "name"))
.description("Last name of a user")
.type("string")
)
.addParticle(new ParticleBlueprintBuilder()
.name(Name.of("middle", "names"))
.description("Middle names of a user")
.type("string")
)
)
.addLink(new LinkBlueprintBuilder()
.from(Name.of("account"))
.to(Name.of("account", "details"))
.type(LinkType.ONE_TO_ONE)
);
UniverseBlueprint build = builder.build();
Traqtor traqtor = Traqtor.init();
CommandExecResult result = traqtor.execute(new Traqtor.CreateWorkspace());
assertEquals(result.getStatus(), DONE);
assertEquals(traqtor.workspace().dirty(), true);
String serialized = traqtor.workspace().mapper().writeValueAsString(build);
System.out.println(serialized);
}
}

@ -17,6 +17,11 @@
<artifactId>traqtor-schema</artifactId> <artifactId>traqtor-schema</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
</dependencies> </dependencies>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

@ -1,4 +1,4 @@
package link.pagan.traqtor.generator.blueprint; package link.pagan.traqtor.generator;
import link.pagan.traqtor.generator.blueprint.database.builder.ColumnBlueprintBuilder; import link.pagan.traqtor.generator.blueprint.database.builder.ColumnBlueprintBuilder;
import link.pagan.traqtor.generator.blueprint.database.builder.DatabaseBlueprintBuilder; import link.pagan.traqtor.generator.blueprint.database.builder.DatabaseBlueprintBuilder;

@ -1,25 +1,20 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package link.pagan.traqtor.generator.blueprint; package link.pagan.traqtor.generator.blueprint;
import link.pagan.traqtor.generator.blueprint.util.Name;
/** /**
* *
* @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >} * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
*/ */
public class ProjectBlueprint { public abstract class ProjectBlueprint {
String name;
Name rootPackage;
String description;
public void assemble() {
} // String name;
// Name rootPackage;
// String description;
//
// public void assemble() {
//
// }
//
} }

@ -5,7 +5,7 @@
*/ */
package link.pagan.traqtor.generator.blueprint.database; package link.pagan.traqtor.generator.blueprint.database;
import link.pagan.traqtor.generator.blueprint.util.Name; import link.pagan.traqtor.util.Name;
import link.pagan.traqtor.schema.data.DataType; import link.pagan.traqtor.schema.data.DataType;

@ -1,8 +1,5 @@
package link.pagan.traqtor.generator.blueprint.database; package link.pagan.traqtor.generator.blueprint.database;
import java.util.List;
import link.pagan.traqtor.schema.data.mapping.database.DatabaseAdapter;
/** /**
* *
* @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >} * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
@ -10,8 +7,8 @@ import link.pagan.traqtor.schema.data.mapping.database.DatabaseAdapter;
public class DatabaseBlueprint { public class DatabaseBlueprint {
String name; String name;
private List<SchemeBlueprint> schemas; // private List<SchemeBlueprint> schemas;
private DatabaseAdapter databaseAdapter; // private DatabaseAdapter databaseAdapter;
public DatabaseBlueprint(String name) { public DatabaseBlueprint(String name) {
this.name = name; this.name = name;

@ -1,7 +1,7 @@
package link.pagan.traqtor.generator.blueprint.database.builder; package link.pagan.traqtor.generator.blueprint.database.builder;
import link.pagan.traqtor.generator.blueprint.database.ColumnBlueprint; import link.pagan.traqtor.generator.blueprint.database.ColumnBlueprint;
import link.pagan.traqtor.generator.blueprint.util.Name; import link.pagan.traqtor.util.Name;
import link.pagan.traqtor.schema.data.DataType; import link.pagan.traqtor.schema.data.DataType;
/** /**

@ -3,7 +3,7 @@ package link.pagan.traqtor.generator.blueprint.database.builder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import link.pagan.traqtor.generator.blueprint.util.Name; import link.pagan.traqtor.util.Name;
import link.pagan.traqtor.schema.data.mapping.database.DatabaseAdapter; import link.pagan.traqtor.schema.data.mapping.database.DatabaseAdapter;
/** /**

@ -3,7 +3,7 @@ package link.pagan.traqtor.generator.blueprint.database.builder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import link.pagan.traqtor.generator.blueprint.util.Name; import link.pagan.traqtor.util.Name;
/** /**
* *

@ -3,7 +3,7 @@ package link.pagan.traqtor.generator.blueprint.database.builder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import link.pagan.traqtor.generator.blueprint.util.Name; import link.pagan.traqtor.util.Name;
/** /**
* *

@ -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<ParticleBlueprint> particles;
public AtomBlueprint(Name name, String description, List<ParticleBlueprint> particles) {
this.name = name;
this.description = description;
this.particles = particles;
}
public Name name() {
return name;
}
public static final class AtomBlueprintSerializer extends StdSerializer<AtomBlueprint> {
private static final long serialVersionUID = 1L;
public AtomBlueprintSerializer() {
this(null);
}
public AtomBlueprintSerializer(Class<AtomBlueprint> 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();
}
}
}

@ -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<LinkBlueprint> {
private static final long serialVersionUID = 1L;
public LinkBlueprintSerializer() {
this(null);
}
public LinkBlueprintSerializer(Class<LinkBlueprint> 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();
}
}
}

@ -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<LinkType> {
private static final long serialVersionUID = 1L;
public LinkTypeSerializer() {
this(null);
}
public LinkTypeSerializer(Class<LinkType> 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");
}
}
}
}

@ -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<ParticleBlueprint> {
private static final long serialVersionUID = 1L;
public ParticleBlueprintSerializer() {
this(null);
}
public ParticleBlueprintSerializer(Class<ParticleBlueprint> 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();
}
}
}

@ -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<AtomBlueprint> atoms;
List<LinkBlueprint> links;
DataTypeSchema dataTypeSchema;
public UniverseBlueprint(List<AtomBlueprint> atoms, List<LinkBlueprint> links, DataTypeSchema dataTypeSchema) {
this.atoms = atoms;
this.links = links;
this.dataTypeSchema = dataTypeSchema;
}
public static final class UniverseBlueprintSerializer extends StdSerializer<UniverseBlueprint> {
private static final long serialVersionUID = 1L;
public UniverseBlueprintSerializer() {
this(null);
}
public UniverseBlueprintSerializer(Class<UniverseBlueprint> 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();
}
}
}

@ -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<ParticleBlueprintBuilder> particleBuilders;
public AtomBlueprintBuilder() {
this.particleBuilders = new ArrayList<>();
}
public AtomBlueprint build(UniverseBlueprintBuilder builder) {
List<ParticleBlueprint> particles = new ArrayList<>();
for (ParticleBlueprintBuilder pb : particleBuilders) {
particles.add(pb.build(builder));
}
particles.sort(new Comparator<ParticleBlueprint>() {
@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;
}
}

@ -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<AtomBlueprint> 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<AtomBlueprint> atoms) {
for (AtomBlueprint ab : atoms) {
if (ab.name().equals(name)) {
return ab;
}
}
return null;
}
}

@ -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;
}
}

@ -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<AtomBlueprintBuilder> atomBuilders;
List<LinkBlueprintBuilder> 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<AtomBlueprint> atoms = new ArrayList<>();
for (AtomBlueprintBuilder ab : atomBuilders) {
atoms.add(ab.build(this));
}
atoms.sort(new Comparator<AtomBlueprint>() {
@Override
public int compare(AtomBlueprint a, AtomBlueprint b) {
return a.name().asDotted().compareTo(b.name().asDotted());
}
});
ArrayList<LinkBlueprint> links = new ArrayList<>();
for (LinkBlueprintBuilder lb : linkBuilder) {
links.add(lb.build(this, atoms));
}
links.sort(new Comparator<LinkBlueprint>() {
@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;
}
}

@ -1,34 +0,0 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package link.pagan.traqtor.generator.blueprint.util;
/**
*
* @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
*/
public class Name {
String [] parts;
public Name(String[] parts) {
this.parts = parts;
}
public static Name of (String... parts) {
if (parts == null) {
throw new NullPointerException("name can not be null");
}
if (parts.length < 1) {
throw new IllegalArgumentException("name can not be empty");
}
return new Name(parts);
}
}

@ -1,19 +1,20 @@
package link.pagan.traqtor.schema.basic.data; package link.pagan.traqtor.schema.basic.data;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import link.pagan.traqtor.schema.basic.data.mapping.MappingSchemaImpl; import link.pagan.traqtor.schema.basic.data.mapping.MappingSchemaImpl;
import link.pagan.traqtor.schema.data.DataType; import link.pagan.traqtor.schema.data.DataType;
import link.pagan.traqtor.schema.data.DataTypeSchema; import link.pagan.traqtor.schema.data.DataTypeSchema;
import link.pagan.traqtor.schema.data.mapping.MappingSchema; import link.pagan.traqtor.schema.data.mapping.MappingSchema;
import link.pagan.traqtor.util.Name;
/** /**
* *
* @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >} * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
*/ */
public class DataTypeSchemaImpl implements DataTypeSchema { public class DataTypeSchemaReferenceImplementation implements DataTypeSchema {
private static final Name name = Name.of("traqtor", "basic");
// ARRAY(""), // ARRAY(""),
// LIST(""), // LIST(""),
@ -44,8 +45,8 @@ public class DataTypeSchemaImpl implements DataTypeSchema {
} }
@Override @Override
public String getName() { public Name getName() {
return "basic"; return name;
} }
@Override @Override
@ -53,26 +54,26 @@ public class DataTypeSchemaImpl implements DataTypeSchema {
return mappingSchemas; return mappingSchemas;
} }
@Override // @Override
public Map<String, DataType> register() { // public Map<String, DataType> register() {
return new HashMap<String, DataType>(){ // return new HashMap<String, DataType>(){
private static final long serialVersionUID = 1L; // private static final long serialVersionUID = 1L;
{ // {
put(BOOLEAN.getName(), BOOLEAN); // put(BOOLEAN.getName(), BOOLEAN);
put(BYTE.getName(), BYTE); // put(BYTE.getName(), BYTE);
put(SHORT.getName(), SHORT); // put(SHORT.getName(), SHORT);
put(INTEGER.getName(), INTEGER); // put(INTEGER.getName(), INTEGER);
put(LONG.getName(), LONG); // put(LONG.getName(), LONG);
put(FLOAT.getName(), FLOAT); // put(FLOAT.getName(), FLOAT);
put(DOUBLE.getName(), DOUBLE); // put(DOUBLE.getName(), DOUBLE);
put(STRING.getName(), STRING); // put(STRING.getName(), STRING);
put(BOOLEAN.getName(), BOOLEAN); // put(BOOLEAN.getName(), BOOLEAN);
put(DATE.getName(), DATE); // put(DATE.getName(), DATE);
put(TIME.getName(), TIME); // put(TIME.getName(), TIME);
put(TIMESTAMP.getName(), TIMESTAMP); // put(TIMESTAMP.getName(), TIMESTAMP);
put(ID.getName(), ID); // put(ID.getName(), ID);
put(UUID.getName(), UUID); // put(UUID.getName(), UUID);
}}; // }};
} // }
} }

@ -1,9 +1,10 @@
package link.pagan.traqtor.schema.basic.data.mapping; package link.pagan.traqtor.schema.basic.data.mapping;
import java.util.List; import java.util.List;
import link.pagan.traqtor.schema.basic.data.DataTypeSchemaImpl; import link.pagan.traqtor.schema.basic.data.DataTypeSchemaReferenceImplementation;
import link.pagan.traqtor.schema.data.mapping.MappingEntry; import link.pagan.traqtor.schema.data.mapping.MappingEntry;
import link.pagan.traqtor.schema.data.mapping.MappingSchema; import link.pagan.traqtor.schema.data.mapping.MappingSchema;
import link.pagan.traqtor.util.Name;
/** /**
* *
@ -11,26 +12,28 @@ import link.pagan.traqtor.schema.data.mapping.MappingSchema;
*/ */
public class MappingSchemaImpl implements MappingSchema { public class MappingSchemaImpl implements MappingSchema {
public static final MappingEntry NULLABLE_BOOLEAN = new MappingEntry(DataTypeSchemaImpl.BOOLEAN , true , false ); private static final Name name = Name.of("traqtor", "basic", "default");
public static final MappingEntry BOOLEAN = new MappingEntry(DataTypeSchemaImpl.BOOLEAN , false , true );
public static final MappingEntry NULLABLE_BYTE = new MappingEntry(DataTypeSchemaImpl.BYTE , true , false ); public static final MappingEntry NULLABLE_BOOLEAN = new MappingEntry(DataTypeSchemaReferenceImplementation.BOOLEAN , true , false );
public static final MappingEntry BYTE = new MappingEntry(DataTypeSchemaImpl.BYTE , false , true ); public static final MappingEntry BOOLEAN = new MappingEntry(DataTypeSchemaReferenceImplementation.BOOLEAN , false , true );
public static final MappingEntry NULLABLE_SHORT = new MappingEntry(DataTypeSchemaImpl.SHORT , true , false ); public static final MappingEntry NULLABLE_BYTE = new MappingEntry(DataTypeSchemaReferenceImplementation.BYTE , true , false );
public static final MappingEntry SHORT = new MappingEntry(DataTypeSchemaImpl.SHORT , false , true ); public static final MappingEntry BYTE = new MappingEntry(DataTypeSchemaReferenceImplementation.BYTE , false , true );
public static final MappingEntry NULLABLE_INTEGER = new MappingEntry(DataTypeSchemaImpl.INTEGER , true , false ); public static final MappingEntry NULLABLE_SHORT = new MappingEntry(DataTypeSchemaReferenceImplementation.SHORT , true , false );
public static final MappingEntry INTEGER = new MappingEntry(DataTypeSchemaImpl.INTEGER , false , true ); public static final MappingEntry SHORT = new MappingEntry(DataTypeSchemaReferenceImplementation.SHORT , false , true );
public static final MappingEntry NULLABLE_LONG = new MappingEntry(DataTypeSchemaImpl.LONG , true , false ); public static final MappingEntry NULLABLE_INTEGER = new MappingEntry(DataTypeSchemaReferenceImplementation.INTEGER , true , false );
public static final MappingEntry LONG = new MappingEntry(DataTypeSchemaImpl.LONG , false , true ); public static final MappingEntry INTEGER = new MappingEntry(DataTypeSchemaReferenceImplementation.INTEGER , false , true );
public static final MappingEntry NULLABLE_FLOAT = new MappingEntry(DataTypeSchemaImpl.FLOAT , true , false ); public static final MappingEntry NULLABLE_LONG = new MappingEntry(DataTypeSchemaReferenceImplementation.LONG , true , false );
public static final MappingEntry FLOAT = new MappingEntry(DataTypeSchemaImpl.FLOAT , false , false ); public static final MappingEntry LONG = new MappingEntry(DataTypeSchemaReferenceImplementation.LONG , false , true );
public static final MappingEntry NULLABLE_DOUBLE = new MappingEntry(DataTypeSchemaImpl.DOUBLE , true , false ); public static final MappingEntry NULLABLE_FLOAT = new MappingEntry(DataTypeSchemaReferenceImplementation.FLOAT , true , false );
public static final MappingEntry DOUBLE = new MappingEntry(DataTypeSchemaImpl.DOUBLE , false , false ); public static final MappingEntry FLOAT = new MappingEntry(DataTypeSchemaReferenceImplementation.FLOAT , false , false );
public static final MappingEntry STRING = new MappingEntry(DataTypeSchemaImpl.STRING , true , false ); public static final MappingEntry NULLABLE_DOUBLE = new MappingEntry(DataTypeSchemaReferenceImplementation.DOUBLE , true , false );
public static final MappingEntry DATE = new MappingEntry(DataTypeSchemaImpl.DATE , true , false ); public static final MappingEntry DOUBLE = new MappingEntry(DataTypeSchemaReferenceImplementation.DOUBLE , false , false );
public static final MappingEntry TIME = new MappingEntry(DataTypeSchemaImpl.TIME , true , false ); public static final MappingEntry STRING = new MappingEntry(DataTypeSchemaReferenceImplementation.STRING , true , false );
public static final MappingEntry TIMESTAMP = new MappingEntry(DataTypeSchemaImpl.TIMESTAMP , true , false ); public static final MappingEntry DATE = new MappingEntry(DataTypeSchemaReferenceImplementation.DATE , true , false );
public static final MappingEntry ID = new MappingEntry(DataTypeSchemaImpl.ID , true , true ); public static final MappingEntry TIME = new MappingEntry(DataTypeSchemaReferenceImplementation.TIME , true , false );
public static final MappingEntry UUID = new MappingEntry(DataTypeSchemaImpl.UUID , true , true ); 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<MappingEntry> mappings = List.of(NULLABLE_BOOLEAN, BOOLEAN, private static final List<MappingEntry> mappings = List.of(NULLABLE_BOOLEAN, BOOLEAN,
NULLABLE_BYTE, BYTE, NULLABLE_BYTE, BYTE,
@ -49,8 +52,8 @@ public class MappingSchemaImpl implements MappingSchema {
} }
@Override @Override
public String getName() { public Name getName() {
return "basic"; return name;
} }
} }

@ -5,9 +5,8 @@
*/ */
package link.pagan.traqtor.schema.basic.data.mapping.database; package link.pagan.traqtor.schema.basic.data.mapping.database;
import java.util.HashMap;
import java.util.Map;
import link.pagan.traqtor.schema.data.mapping.database.DatabaseAdapter; import link.pagan.traqtor.schema.data.mapping.database.DatabaseAdapter;
import link.pagan.traqtor.util.Name;
/** /**
* *
@ -15,19 +14,24 @@ import link.pagan.traqtor.schema.data.mapping.database.DatabaseAdapter;
*/ */
public class PostgresDatabaseAdapter extends DatabaseAdapter { public class PostgresDatabaseAdapter extends DatabaseAdapter {
private static final String NAME = "PostgreSQL"; private static final Name NAME = Name.of("traqtor", "basic", "db", "postgres");
public PostgresDatabaseAdapter() { public PostgresDatabaseAdapter() {
super(NAME); super(NAME);
} }
// @Override
// public Map<String, DatabaseAdapter> register() {
// return new HashMap<String, DatabaseAdapter>(){
// private static final long serialVersionUID = 1L;
// {
// put(NAME, new PostgresDatabaseAdapter());
// }};
// }
@Override @Override
public Map<String, DatabaseAdapter> register() { public Name getName() {
return new HashMap<String, DatabaseAdapter>(){ return NAME;
private static final long serialVersionUID = 1L;
{
put(NAME, new PostgresDatabaseAdapter());
}};
} }
} }

@ -16,6 +16,13 @@
<maven.compiler.source>11</maven.compiler.source> <maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target> <maven.compiler.target>11</maven.compiler.target>
</properties> </properties>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
</dependencies>
</project> </project>

@ -1,5 +1,6 @@
package link.pagan.traqtor.schema.data.mapping.database; 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.Named;
import link.pagan.traqtor.util.Registrable; import link.pagan.traqtor.util.Registrable;
@ -9,14 +10,14 @@ import link.pagan.traqtor.util.Registrable;
*/ */
public abstract class DatabaseAdapter implements Named, Registrable<DatabaseAdapter> { public abstract class DatabaseAdapter implements Named, Registrable<DatabaseAdapter> {
private final String name; private final Name name;
protected DatabaseAdapter(String name) { protected DatabaseAdapter(Name name) {
this.name = name; this.name = name;
} }
@Override @Override
public String getName() { public Name getName() {
return name; return name;
} }

@ -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<Name> COMPARATOR = new Comparator<Name>() {
@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<Name> {
private static final long serialVersionUID = 1L;
public NameSerializer() {
this(null);
}
public NameSerializer(Class<Name> 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<Name> {
private static final long serialVersionUID = 1L;
public NameDeserializer() {
this(null);
}
public NameDeserializer(Class<Name> 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);
}
}
}

@ -6,6 +6,6 @@ package link.pagan.traqtor.util;
*/ */
public interface Named { public interface Named {
public String getName(); public Name getName();
} }

@ -1,13 +1,11 @@
package link.pagan.traqtor.util; package link.pagan.traqtor.util;
import java.util.Map;
/** /**
* *
* @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >} * @author Edward M. Kagan {@literal <}kaganem{@literal @}2pm.tech{@literal >}
*/ */
public interface Registrable<T> { public interface Registrable<T> {
public Map<String, T> register(); // public Map<String, T> register();
} }

Loading…
Cancel
Save