Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
prdoyle committed Jan 21, 2023
1 parent 9d77036 commit f6a16da
Show file tree
Hide file tree
Showing 8 changed files with 121 additions and 12 deletions.
33 changes: 28 additions & 5 deletions bosk-refs/src/main/java/io/vena/bosk/refs/RefProcessor.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.vena.bosk.refs;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
Expand All @@ -11,6 +13,7 @@
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.JavaFileObject;

import static javax.lang.model.SourceVersion.RELEASE_8;

Expand All @@ -28,13 +31,33 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
.add(element);
}
});
if (!fieldsByClass.isEmpty()) {
generateRefsClass(fieldsByClass);
}
generateRefsClasses(fieldsByClass);
return false;
}

private static void generateRefsClass(Map<TypeElement, List<Element>> fieldsByClass) {
System.out.println("RefProcessor: " + fieldsByClass);
private void generateRefsClasses(Map<TypeElement, List<Element>> fieldsByClass) {
fieldsByClass.forEach((enclosingType, elements) -> {
String qualifiedName = enclosingType.getQualifiedName() + "_Refs";
int lastDot = qualifiedName.lastIndexOf('.');
String packagePath = qualifiedName.substring(0, lastDot);
String className = qualifiedName.substring(lastDot+1);
try {
JavaFileObject refsFile = processingEnv.getFiler()
.createSourceFile(qualifiedName);
try (PrintWriter out = new PrintWriter(refsFile.openWriter())) {
out.println("package " + packagePath + ";");
out.println();

out.println("class " + className + " {");
for (Element element: elements) {

}
out.println("}");
out.println();
}
} catch (IOException e) {
throw new IllegalStateException(e);
}
});
}
}
13 changes: 9 additions & 4 deletions bosk-refs/src/test/java/io/vena/bosk/refs/NodeWithRefs.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package io.vena.bosk.refs;

import io.vena.bosk.AbstractBoskTest.TestRoot;
import io.vena.bosk.StateTreeNode;
import io.vena.bosk.Entity;
import io.vena.bosk.Identifier;
import io.vena.bosk.refs.annotations.Ref;
import lombok.Getter;
import lombok.Value;
import lombok.experimental.Accessors;

@Value
public class NodeWithRefs implements StateTreeNode {
@Ref
TestRoot root;
@Getter
@Accessors(fluent = true)
public class NodeWithRefs implements Entity {
@Ref Identifier id;
@Ref TestRoot root;
}
20 changes: 19 additions & 1 deletion bosk-refs/src/test/java/io/vena/bosk/refs/RefTest.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,30 @@
package io.vena.bosk.refs;

import io.vena.bosk.AbstractBoskTest;
import io.vena.bosk.Bosk;
import io.vena.bosk.Identifier;
import io.vena.bosk.exceptions.InvalidTypeException;
import io.vena.bosk.refs.example.NodeWithRefs_Ref$;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class RefTest extends AbstractBoskTest {
Bosk<NodeWithRefs> bosk;
NodeWithRefs_Ref$ refs;

@BeforeEach
void setup() throws InvalidTypeException {
bosk = new Bosk<>(
"Test bosk",
NodeWithRefs.class,
new NodeWithRefs(Identifier.from("root"), initialRoot(bosk)),
Bosk::simpleDriver
);
refs = new NodeWithRefs_Ref$(bosk);
}

@Test
void test() {

refs.root.get();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package io.vena.bosk.refs.example;

import io.vena.bosk.Bosk;
import io.vena.bosk.Path;
import io.vena.bosk.Reference;
import io.vena.bosk.exceptions.InvalidTypeException;
import io.vena.bosk.refs.NodeWithRefs;

public class NodeWithRefs_Ref$ {
public final NodeWithRefs_Ref$id id;
public final NodeWithRefs_Ref$root root;
private final Reference<NodeWithRefs> ref;

public NodeWithRefs_Ref$(Bosk<NodeWithRefs> bosk) throws InvalidTypeException {
this.id = new NodeWithRefs_Ref$id(bosk);
this.root = new NodeWithRefs_Ref$root(bosk);
this.ref = bosk.reference(NodeWithRefs.class, Path.parse(
"/"
));
}

public Reference<NodeWithRefs> get() { return ref; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package io.vena.bosk.refs.example;

import io.vena.bosk.Bosk;
import io.vena.bosk.Identifier;
import io.vena.bosk.Path;
import io.vena.bosk.Reference;
import io.vena.bosk.exceptions.InvalidTypeException;
import io.vena.bosk.refs.NodeWithRefs;

public class NodeWithRefs_Ref$id {
private final Reference<Identifier> ref;

public NodeWithRefs_Ref$id(Bosk<NodeWithRefs> bosk) throws InvalidTypeException {
this.ref = bosk.reference(Identifier.class, Path.parse(
"/id"
));
}

public Reference<Identifier> get() { return ref; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package io.vena.bosk.refs.example;

import io.vena.bosk.AbstractBoskTest;
import io.vena.bosk.Bosk;
import io.vena.bosk.Path;
import io.vena.bosk.Reference;
import io.vena.bosk.exceptions.InvalidTypeException;
import io.vena.bosk.refs.NodeWithRefs;

public class NodeWithRefs_Ref$root {
private final Reference<AbstractBoskTest.TestRoot> ref;

public NodeWithRefs_Ref$root(Bosk<NodeWithRefs> bosk) throws InvalidTypeException {
this.ref = bosk.reference(AbstractBoskTest.TestRoot.class, Path.parse(
"/root"
));
}

public Reference<AbstractBoskTest.TestRoot> get() { return ref; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ protected static Bosk<TestRoot> setUpBosk(DriverFactory<TestRoot> driverFactory)
return new Bosk<TestRoot>("Test", TestRoot.class, AbstractRoundTripTest::initialRoot, driverFactory);
}

protected static TestRoot initialRoot(Bosk<TestRoot> bosk) {
protected static TestRoot initialRoot(Bosk<?> bosk) {
TestEntityBuilder teb;
try {
teb = new TestEntityBuilder(bosk);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class TestEntityBuilder {
private final CatalogReference<TestChild> anyChildren;
private final Reference<ImplicitRefs> anyImplicitRefs;

public TestEntityBuilder(Bosk<TestRoot> bosk) throws InvalidTypeException {
public TestEntityBuilder(Bosk<?> bosk) throws InvalidTypeException {
this.anyEntity = bosk.rootReference().then(TestEntity.class, TestRoot.Fields.entities, "-entity-");
this.anyChildren = anyEntity.thenCatalog(TestChild.class, TestEntity.Fields.children);
this.anyImplicitRefs = anyEntity.then(ImplicitRefs.class, TestEntity.Fields.implicitRefs);
Expand Down

0 comments on commit f6a16da

Please sign in to comment.