Skip to content
Snippets Groups Projects
Commit 99fb204c authored by René Schöne's avatar René Schöne
Browse files

3.0.0

- prepare new release
- coherent styling of nodes and relation labels
parent 137d0ce5
No related branches found
No related tags found
1 merge request!133.0.1
......@@ -5,13 +5,13 @@ DumpNode ::= DumpChildNode* DumpToken* DumpRelation*
<Name> <Label> <BackgroundColor> <TextColor> <Object:Object> <Invisible:boolean> <Computed:boolean> <ManualStereotypes>
/InvisiblePath/ ;
InnerDumpNode ::= <OriginalIndex:int>;
InnerDumpNode ::= <OriginalIndex:int> <Label> <TextColor> ;
rel InnerDumpNode.DumpNode <-> DumpNode.ContainerOfInner? ;
InnerRelationDumpNode ::= <OriginalIndex:int>;
InnerRelationDumpNode ::= <OriginalIndex:int> <Label> <TextColor> ;
rel InnerRelationDumpNode.DumpNode <-> DumpNode.ContainerOfRelationInner* ;
abstract DumpChildNode ::= <Name> <Computed:boolean> ;
DumpNormalChildNode : DumpChildNode ;
DumpNormalChildNode : DumpChildNode ::= <TextColor> ;
rel DumpNormalChildNode.DumpNode <-> DumpNode.ContainerOfNormalChild? ;
DumpListChildNode : DumpChildNode ::= InnerDumpNode* ;
......@@ -22,7 +22,7 @@ DumpReferenceListToken : DumpToken ::= InnerRelationDumpNode* ;
DumpValueToken : DumpToken ::= <Value:Object> ;
abstract DumpRelation ::= <Name> <Bidirectional:boolean> ;
DumpNormalRelation : DumpRelation ;
DumpNormalRelation : DumpRelation ::= <TextColor> ;
rel DumpNormalRelation.DumpNode -> DumpNode ;
DumpListRelation : DumpRelation ::= InnerRelationDumpNode* ;
......@@ -67,11 +67,16 @@ BuildConfig ::= StyleInformation
<Debug:boolean>;
TypePatternCollectionMapping ::= <TypeRegex> PatternCollection ;
PatternCollection ::= <TokenPattern> <ChildPattern> <RelationPattern> <AttributePattern> <NonterminalAttributePattern> ;
StyleInformation ::= <NameMethod:StyleMethod> <BackgroundColorMethod:StyleMethod> <TextColorMethod:StyleMethod> <StereotypeMethod:StyleMethod> <ComputedColor>;
StyleInformation ::= <ComputedColor>;
PrintConfig ::= Header*
<Scale:double>
<Version>
<RelationWithRank:boolean>
<OrderChildren:boolean> ;
<OrderChildren:boolean>
<NodeStyleDefinition:NodeStyleDefinition>
<RelationStyleDefinition:RelationStyleDefinition>;
Header ::= <Value> ;
NodeStyle ::= <Label> <BackgroundColor> <TextColor> <StereoTypes> ;
RelationStyle ::= <Label> <TextColor> ;
......@@ -20,17 +20,27 @@ aspect Frontend {
static StyleInformation StyleInformation.createDefault() {
StyleInformation result = new StyleInformation();
result.setNameMethod(n -> n == null ? "null" : n.getClass().getSimpleName() + "@" + Integer.toHexString(n.hashCode()));
result.setBackgroundColorMethod(n -> "");
result.setTextColorMethod(n -> "");
result.setStereotypeMethod(n -> "");
result.setComputedColor("blue");
return result;
}
@FunctionalInterface
public interface StyleMethod<ASTNODE> {
String get(ASTNODE node);
public interface NodeStyleDefinition<ASTNODE> {
void style(ASTNODE node, NodeStyle style);
}
@FunctionalInterface
public interface RelationStyleDefinition<ASTNODE> {
void style(ASTNODE source, ASTNODE target, String context, RelationStyle style);
}
public void NodeStyle.useSimpleLabel() {
setLabel(node.getObject() == null ? "null" : node.getObject().getClass().getSimpleName());
}
public void NodeStyle.useSimpleLabelWithHashCode() {
setLabel(node.getObject() == null ? "null" :
node.getObject().getClass().getSimpleName() + "@" + Integer.toHexString(node.getObject().hashCode()));
}
@FunctionalInterface
......
......@@ -176,6 +176,7 @@ aspect Transform {
normalChild.setDumpNode(targetNode);
normalChild.setComputed(false);
node.addDumpChildNode(normalChild);
applyStyle(normalChild);
}
return true;
}
......@@ -189,6 +190,8 @@ aspect Transform {
listChild.setComputed(false);
String childName = containmentMethod.getName();
listChild.setName(childName);
node.addDumpChildNode(listChild);
int index = -1;
for (Object target : targetList) {
index++;
......@@ -197,14 +200,17 @@ aspect Transform {
}
DumpNode targetNode = transform(tti, target, options.asNormal(false));
if (target != null && targetNode != null) {
listChild.addInnerDumpNode(new InnerDumpNode().setDumpNode(targetNode).setOriginalIndex(index));
InnerDumpNode inner = new InnerDumpNode().setDumpNode(targetNode).setOriginalIndex(index);
listChild.addInnerDumpNode(inner);
applyStyle(inner);
}
}
if (listChild.getNumInnerDumpNode() == 0) {
listChild.addInnerDumpNode(new InnerDumpNode().setDumpNode(transform(tti, EMPTY,
options.asNormal(false).allowNullObjectsOnce())));
InnerDumpNode inner = new InnerDumpNode().setDumpNode(transform(tti, EMPTY,
options.asNormal(false).allowNullObjectsOnce()));
listChild.addInnerDumpNode(inner);
applyStyle(inner);
}
node.addDumpChildNode(listChild);
return true;
}
......@@ -227,6 +233,7 @@ aspect Transform {
normalChild.setDumpNode(targetNode);
normalChild.setComputed(computed);
node.addDumpChildNode(normalChild);
applyStyle(normalChild);
}
return true;
}
......@@ -245,14 +252,19 @@ aspect Transform {
boolean computed = otherMethod.asListChildMethod().isNTAListChildMethod();
listChild.setComputed(computed);
listChild.setName(childName);
boolean notAddedYet = true;
for (Object target : targetList) {
DumpNode targetNode = transform(tti, target, options.asNormal(false).computed(computed));
if (target != null && targetNode != null) {
listChild.addInnerDumpNode(new InnerDumpNode().setDumpNode(targetNode));
InnerDumpNode inner = new InnerDumpNode().setDumpNode(targetNode);
listChild.addInnerDumpNode(inner);
if (notAddedYet) {
// list child has to be added before application of style, thus inline adding with condition
node.addDumpChildNode(listChild);
notAddedYet = false;
}
applyStyle(inner);
}
if (listChild.getNumInnerDumpNode() > 0) {
node.addDumpChildNode(listChild);
}
return true;
}
......@@ -272,6 +284,7 @@ aspect Transform {
(otherMethod.asSingleRelationMethod().isOptRelationMethod() ? "?" : ""));
normalRelation.setDumpNode(targetNode);
node.addDumpRelation(normalRelation);
applyStyle(normalRelation);
}
return true;
}
......@@ -283,6 +296,8 @@ aspect Transform {
Iterable<?> targetList = (Iterable<?>) otherMethod.getMethod().invoke(obj);
DumpListRelation listRelation = new DumpListRelation();
listRelation.setName(otherMethod.getName());
node.addDumpRelation(listRelation);
int index = -1;
for (Object target : targetList) {
index++;
......@@ -291,15 +306,17 @@ aspect Transform {
}
DumpNode targetNode = transform(tti, target, options.asRelation());
if (target != null && targetNode != null) {
listRelation.addInnerRelationDumpNode(new InnerRelationDumpNode().setDumpNode(targetNode)
.setOriginalIndex(index));
InnerRelationDumpNode inner = new InnerRelationDumpNode().setDumpNode(targetNode).setOriginalIndex(index);
listRelation.addInnerRelationDumpNode(inner);
applyStyle(inner);
}
}
if (listRelation.getNumInnerRelationDumpNode() == 0) {
listRelation.addInnerRelationDumpNode(new InnerRelationDumpNode().setDumpNode(transform(tti, EMPTY,
options.asNormal(false).allowNullObjectsOnce())));
InnerRelationDumpNode inner = new InnerRelationDumpNode().setDumpNode(transform(tti, EMPTY,
options.asNormal(false).allowNullObjectsOnce()));
listRelation.addInnerRelationDumpNode(inner);
applyStyle(inner);
}
node.addDumpRelation(listRelation);
return true;
}
......@@ -368,12 +385,72 @@ aspect Transform {
}
}
// === NodeStyle ===
DumpNode NodeStyle.node;
NodeStyle DumpNode.createDefaultStyle() {
NodeStyle result = new NodeStyle();
result.node = this;
result.useSimpleLabelWithHashCode();
return result;
}
private void DumpAst.applyStyle(DumpNode node) {
Object obj = node.getObject();
node.setLabel(getBuildConfig().getStyleInformation().getNameMethod().get(obj));
node.setBackgroundColor(getBuildConfig().getStyleInformation().getBackgroundColorMethod().get(obj));
node.setTextColor(getBuildConfig().getStyleInformation().getTextColorMethod().get(obj));
node.setManualStereotypes(getBuildConfig().getStyleInformation().getStereotypeMethod().get(obj));
NodeStyle style = node.createDefaultStyle();
getPrintConfig().getNodeStyleDefinition().style(node.getObject(), style);
node.setLabel(style.getLabel());
node.setBackgroundColor(style.getBackgroundColor());
node.setTextColor(style.getTextColor());
node.setManualStereotypes(style.getStereoTypes());
}
// === RelationStyle ===
RelationStyle DumpNormalChildNode.createDefaultStyle() {
return new RelationStyle().setLabel(getName());
}
RelationStyle InnerDumpNode.createDefaultStyle() {
return new RelationStyle().setLabel(containingDumpListChildNode().getName());
}
RelationStyle DumpNormalRelation.createDefaultStyle() {
return new RelationStyle().setLabel(getName());
}
RelationStyle InnerRelationDumpNode.createDefaultStyle() {
return new RelationStyle().setLabel(containingDumpListRelation().getName());
}
private void DumpAst.applyStyle(DumpNormalChildNode node) {
RelationStyle style = node.createDefaultStyle();
getPrintConfig().getRelationStyleDefinition().style(node.containingDumpNode().getObject(),
node.getDumpNode().getObject(), node.getName(), style);
node.setName(style.getLabel());
node.setTextColor(style.getTextColor());
}
private void DumpAst.applyStyle(InnerDumpNode node) {
RelationStyle style = node.createDefaultStyle();
getPrintConfig().getRelationStyleDefinition().style(node.containingDumpNode().getObject(),
node.getDumpNode().getObject(), node.containingDumpListChildNode().getName(), style);
node.setLabel(style.getLabel());
node.setTextColor(style.getTextColor());
}
private void DumpAst.applyStyle(DumpNormalRelation node) {
RelationStyle style = node.createDefaultStyle();
getPrintConfig().getRelationStyleDefinition().style(node.containingDumpNode().getObject(),
node.getDumpNode().getObject(), node.getName(), style);
node.setName(style.getLabel());
node.setTextColor(style.getTextColor());
}
private void DumpAst.applyStyle(InnerRelationDumpNode node) {
RelationStyle style = node.createDefaultStyle();
getPrintConfig().getRelationStyleDefinition().style(node.containingDumpNode().getObject(),
node.getDumpNode().getObject(), node.containingDumpListRelation().getName(), style);
node.setLabel(style.getLabel());
node.setTextColor(style.getTextColor());
}
// TODO: add new attributes for: {token,child,relation,attribute,nta}Enabled(String parentType, String name). 1) just move implementation into this attribute. 2) add include/exclude on type-level to it.
......
......@@ -22,79 +22,86 @@ import static de.tudresden.inf.st.jastadd.dumpAst.ast.ASTNode.matches;
public class DumpBuilder {
private final Object target;
private String packageName;
private DumpAst result;
private final BuildConfig buildConfig;
private final PrintConfig printConfig;
private DumpAst dumpAst;
private boolean built;
protected DumpBuilder(Object target) {
this.target = target;
buildConfig = new BuildConfig();
buildConfig.setIncludeChildMethod((parentNode, childNode, contextName) -> {
this.built = false;
this.dumpAst = new DumpAst();
dumpAst.setBuildConfig(new BuildConfig());
dumpAst.getBuildConfig().setIncludeChildMethod((parentNode, childNode, contextName) -> {
// level 4: excluded for type? -> return no
PatternCollection excludeOnType = buildConfig.matchExcludePatternCollection(parentNode.getClass().getSimpleName());
PatternCollection excludeOnType = dumpAst.getBuildConfig().matchExcludePatternCollection(parentNode.getClass().getSimpleName());
if (excludeOnType != null && matches(excludeOnType.childPattern(), contextName)) {
return false;
}
// level 3: included for type? -> return yes
PatternCollection includeOnType = buildConfig.matchIncludePatternCollection(parentNode.getClass().getSimpleName());
PatternCollection includeOnType = dumpAst.getBuildConfig().matchIncludePatternCollection(parentNode.getClass().getSimpleName());
if (includeOnType != null && matches(includeOnType.childPattern(), contextName)) {
return true;
}
// level 2: globally excluded? -> return no
// level 1: otherwise return yes
return !matches(buildConfig.getGlobalPatternCollection().childPattern(), contextName);
return !matches(dumpAst.getBuildConfig().getGlobalPatternCollection().childPattern(), contextName);
});
buildConfig.setIncludeRelationMethod((sourceNode, targetNode, roleName) -> {
dumpAst.getBuildConfig().setIncludeRelationMethod((sourceNode, targetNode, roleName) -> {
// level 4: excluded for type? -> return no
PatternCollection excludeOnType = buildConfig.matchExcludePatternCollection(sourceNode.getClass().getSimpleName());
PatternCollection excludeOnType = dumpAst.getBuildConfig().matchExcludePatternCollection(sourceNode.getClass().getSimpleName());
if (excludeOnType != null && matches(excludeOnType.relationPattern(), roleName)) {
return false;
}
// level 3: included for type? -> return yes
PatternCollection includeOnType = buildConfig.matchIncludePatternCollection(sourceNode.getClass().getSimpleName());
PatternCollection includeOnType = dumpAst.getBuildConfig().matchIncludePatternCollection(sourceNode.getClass().getSimpleName());
if (includeOnType != null && matches(includeOnType.relationPattern(), roleName)) {
return true;
}
// level 2: globally excluded? -> return no
// level 1: otherwise return yes
return !matches(buildConfig.getGlobalPatternCollection().relationPattern(), roleName);
return !matches(dumpAst.getBuildConfig().getGlobalPatternCollection().relationPattern(), roleName);
});
buildConfig.setIncludeTokenMethod((node, tokenName, value) -> {
dumpAst.getBuildConfig().setIncludeTokenMethod((node, tokenName, value) -> {
// level 4: excluded for type? -> return no
PatternCollection excludeOnType = buildConfig.matchExcludePatternCollection(node.getClass().getSimpleName());
PatternCollection excludeOnType = dumpAst.getBuildConfig().matchExcludePatternCollection(node.getClass().getSimpleName());
if (excludeOnType != null && matches(excludeOnType.tokenPattern(), tokenName)) {
return false;
}
// level 3: included for type? -> return yes
PatternCollection includeOnType = buildConfig.matchIncludePatternCollection(node.getClass().getSimpleName());
PatternCollection includeOnType = dumpAst.getBuildConfig().matchIncludePatternCollection(node.getClass().getSimpleName());
if (includeOnType != null && matches(includeOnType.tokenPattern(), tokenName)) {
return true;
}
// level 2: globally excluded? -> return no
// level 1: otherwise return yes
return !matches(buildConfig.getGlobalPatternCollection().tokenPattern(), tokenName);
return !matches(dumpAst.getBuildConfig().getGlobalPatternCollection().tokenPattern(), tokenName);
});
buildConfig.setIncludeAttributeMethod((node, attributeName, isNTA, supplier) -> {
dumpAst.getBuildConfig().setIncludeAttributeMethod((node, attributeName, isNTA, supplier) -> {
// level 4: included for type? -> return yes
PatternCollection includeOnType = buildConfig.matchIncludePatternCollection(node.getClass().getSimpleName());
PatternCollection includeOnType = dumpAst.getBuildConfig().matchIncludePatternCollection(node.getClass().getSimpleName());
if (includeOnType != null && matches(isNTA ? includeOnType.ntaPattern() : includeOnType.attributePattern(), attributeName)) {
return true;
}
// level 3: excluded for type? -> return no
PatternCollection excludeOnType = buildConfig.matchExcludePatternCollection(node.getClass().getSimpleName());
PatternCollection excludeOnType = dumpAst.getBuildConfig().matchExcludePatternCollection(node.getClass().getSimpleName());
if (excludeOnType != null && matches(isNTA ? excludeOnType.ntaPattern() : excludeOnType.attributePattern(), attributeName)) {
return false;
}
// level 2: globally included? -> return yes
// level 1: otherwise return no
PatternCollection global = buildConfig.getGlobalPatternCollection();
PatternCollection global = dumpAst.getBuildConfig().getGlobalPatternCollection();
return matches(isNTA ? global.ntaPattern() : global.attributePattern(), attributeName);
});
buildConfig.setGlobalPatternCollection(new PatternCollection());
buildConfig.setStyleInformation(StyleInformation.createDefault());
printConfig = new PrintConfig();
printConfig.setScale(1);
printConfig.setVersion(readVersion());
dumpAst.getBuildConfig().setGlobalPatternCollection(new PatternCollection());
dumpAst.getBuildConfig().setStyleInformation(StyleInformation.createDefault());
dumpAst.setPrintConfig(new PrintConfig());
dumpAst.getPrintConfig().setScale(1);
dumpAst.getPrintConfig().setVersion(readVersion());
}
private DumpBuilder thisWithResetBuilt() {
this.built = false;
return this;
}
/**
......@@ -104,8 +111,8 @@ public class DumpBuilder {
* @return this
*/
public DumpBuilder enableDebug() {
buildConfig.setDebug(true);
return this;
dumpAst.getBuildConfig().setDebug(true);
return thisWithResetBuilt();
}
/**
......@@ -115,7 +122,7 @@ public class DumpBuilder {
*/
public DumpBuilder setPackageName(String packageName) {
this.packageName = packageName;
return this;
return thisWithResetBuilt();
}
/**
......@@ -124,8 +131,8 @@ public class DumpBuilder {
* @return this
*/
public DumpBuilder includeEmptyStringsOnTokens() {
buildConfig.setIncludeEmptyString(true);
return this;
dumpAst.getBuildConfig().setIncludeEmptyString(true);
return thisWithResetBuilt();
}
/**
......@@ -133,8 +140,8 @@ public class DumpBuilder {
* @return this
*/
public DumpBuilder enableRelationWithRank() {
printConfig.setRelationWithRank(true);
return this;
dumpAst.getPrintConfig().setRelationWithRank(true);
return thisWithResetBuilt();
}
// --- Types ---
......@@ -151,20 +158,20 @@ public class DumpBuilder {
* @see java.util.regex.Pattern#compile(String)
*/
public DumpBuilder disableTypes(String regex, String... moreRegexes) {
updateRegexes(buildConfig::getTypeIgnorePattern,
buildConfig::setTypeIgnorePattern,
updateRegexes(dumpAst.getBuildConfig()::getTypeIgnorePattern,
dumpAst.getBuildConfig()::setTypeIgnorePattern,
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
// --- Tokens ---
public <ASTNODE> DumpBuilder includeTokensWhen(IncludeTokenMethod<ASTNODE> spec) {
buildConfig.setIncludeTokenMethod(spec);
if (!buildConfig.getGlobalPatternCollection().getTokenPattern().isEmpty()) {
dumpAst.getBuildConfig().setIncludeTokenMethod(spec);
if (!dumpAst.getBuildConfig().getGlobalPatternCollection().getTokenPattern().isEmpty()) {
System.err.println("Overriding previous filters for tokens");
}
return this;
return thisWithResetBuilt();
}
/**
......@@ -179,10 +186,10 @@ public class DumpBuilder {
*/
@Deprecated(since = "2.0.1")
public DumpBuilder excludeTokens(String regex, String... moreRegexes) {
updateRegexes(() -> buildConfig.getGlobalPatternCollection().getTokenPattern(),
s -> buildConfig.getGlobalPatternCollection().setTokenPattern(s),
updateRegexes(() -> dumpAst.getBuildConfig().getGlobalPatternCollection().getTokenPattern(),
s -> dumpAst.getBuildConfig().getGlobalPatternCollection().setTokenPattern(s),
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
/**
......@@ -202,7 +209,7 @@ public class DumpBuilder {
updateRegexes(collection::getTokenPattern,
collection::setTokenPattern,
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
/**
......@@ -222,17 +229,17 @@ public class DumpBuilder {
updateRegexes(collection::getTokenPattern,
collection::setTokenPattern,
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
// --- Children ---
public <ASTNODE> DumpBuilder includeChildWhen(IncludeChildMethod<ASTNODE> spec) {
buildConfig.setIncludeChildMethod(spec);
if (!buildConfig.getGlobalPatternCollection().getChildPattern().isEmpty()) {
dumpAst.getBuildConfig().setIncludeChildMethod(spec);
if (!dumpAst.getBuildConfig().getGlobalPatternCollection().getChildPattern().isEmpty()) {
System.err.println("Overriding previous filters for children");
}
return this;
return thisWithResetBuilt();
}
/**
......@@ -248,10 +255,10 @@ public class DumpBuilder {
*/
@Deprecated(since = "2.0.1")
public DumpBuilder excludeChildren(String regex, String... moreRegexes) {
updateRegexes(() -> buildConfig.getGlobalPatternCollection().getChildPattern(),
s -> buildConfig.getGlobalPatternCollection().setChildPattern(s),
updateRegexes(() -> dumpAst.getBuildConfig().getGlobalPatternCollection().getChildPattern(),
s -> dumpAst.getBuildConfig().getGlobalPatternCollection().setChildPattern(s),
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
/**
......@@ -272,7 +279,7 @@ public class DumpBuilder {
updateRegexes(collection::getChildPattern,
collection::setChildPattern,
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
/**
......@@ -293,17 +300,17 @@ public class DumpBuilder {
updateRegexes(collection::getChildPattern,
collection::setChildPattern,
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
// --- Attributes ---
public <ASTNODE> DumpBuilder includeAttributeWhen(IncludeAttributeMethod<ASTNODE> spec) {
buildConfig.setIncludeAttributeMethod(spec);
if (!buildConfig.getGlobalPatternCollection().getAttributePattern().isEmpty()) {
dumpAst.getBuildConfig().setIncludeAttributeMethod(spec);
if (!dumpAst.getBuildConfig().getGlobalPatternCollection().getAttributePattern().isEmpty()) {
System.err.println("Overriding previous filters for attributes");
}
return this;
return thisWithResetBuilt();
}
/**
......@@ -318,10 +325,10 @@ public class DumpBuilder {
*/
@Deprecated(since = "2.0.1")
public DumpBuilder includeAttributes(String regex, String... moreRegexes) {
updateRegexes(() -> buildConfig.getGlobalPatternCollection().getAttributePattern(),
s -> buildConfig.getGlobalPatternCollection().setAttributePattern(s),
updateRegexes(() -> dumpAst.getBuildConfig().getGlobalPatternCollection().getAttributePattern(),
s -> dumpAst.getBuildConfig().getGlobalPatternCollection().setAttributePattern(s),
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
/**
......@@ -341,7 +348,7 @@ public class DumpBuilder {
updateRegexes(collection::getAttributePattern,
collection::setAttributePattern,
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
/**
......@@ -361,7 +368,7 @@ public class DumpBuilder {
updateRegexes(collection::getAttributePattern,
collection::setAttributePattern,
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
// --- Nonterminal-Attributes ---
......@@ -382,10 +389,10 @@ public class DumpBuilder {
*/
@Deprecated(since = "2.0.1")
public DumpBuilder includeNonterminalAttributes(String regex, String... moreRegexes) {
updateRegexes(() -> buildConfig.getGlobalPatternCollection().getNonterminalAttributePattern(),
s -> buildConfig.getGlobalPatternCollection().setNonterminalAttributePattern(s),
updateRegexes(() -> dumpAst.getBuildConfig().getGlobalPatternCollection().getNonterminalAttributePattern(),
s -> dumpAst.getBuildConfig().getGlobalPatternCollection().setNonterminalAttributePattern(s),
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
/**
......@@ -409,7 +416,7 @@ public class DumpBuilder {
updateRegexes(collection::getNonterminalAttributePattern,
collection::setNonterminalAttributePattern,
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
/**
......@@ -433,17 +440,17 @@ public class DumpBuilder {
updateRegexes(collection::getNonterminalAttributePattern,
collection::setNonterminalAttributePattern,
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
// --- Relations ---
public <ASTNODE> DumpBuilder includeRelationsWhen(IncludeRelationMethod<ASTNODE> spec) {
buildConfig.setIncludeRelationMethod(spec);
if (!buildConfig.getGlobalPatternCollection().getRelationPattern().isEmpty()) {
dumpAst.getBuildConfig().setIncludeRelationMethod(spec);
if (!dumpAst.getBuildConfig().getGlobalPatternCollection().getRelationPattern().isEmpty()) {
System.err.println("Overriding previous filters for relations");
}
return this;
return thisWithResetBuilt();
}
/**
......@@ -460,10 +467,10 @@ public class DumpBuilder {
*/
@Deprecated(since = "2.0.1")
public DumpBuilder excludeRelations(String regex, String... moreRegexes) {
updateRegexes(() -> buildConfig.getGlobalPatternCollection().getRelationPattern(),
s -> buildConfig.getGlobalPatternCollection().setRelationPattern(s),
updateRegexes(() -> dumpAst.getBuildConfig().getGlobalPatternCollection().getRelationPattern(),
s -> dumpAst.getBuildConfig().getGlobalPatternCollection().setRelationPattern(s),
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
/**
......@@ -485,7 +492,7 @@ public class DumpBuilder {
updateRegexes(collection::getRelationPattern,
collection::setRelationPattern,
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
/**
......@@ -507,7 +514,7 @@ public class DumpBuilder {
updateRegexes(collection::getRelationPattern,
collection::setRelationPattern,
regex, moreRegexes);
return this;
return thisWithResetBuilt();
}
// --- Settings ---
......@@ -519,8 +526,8 @@ public class DumpBuilder {
* @return this
*/
public DumpBuilder excludeNullNodes() {
buildConfig.setExcludeNullNodes(true);
return this;
dumpAst.getBuildConfig().setExcludeNullNodes(true);
return thisWithResetBuilt();
}
/**
......@@ -530,8 +537,8 @@ public class DumpBuilder {
* @return this
*/
public DumpBuilder includeNullNodes() {
buildConfig.setExcludeNullNodes(false);
return this;
dumpAst.getBuildConfig().setExcludeNullNodes(false);
return thisWithResetBuilt();
}
/**
......@@ -540,8 +547,8 @@ public class DumpBuilder {
* @return this
*/
public DumpBuilder customPreamble(String option) {
printConfig.addHeader(new Header(option));
return this;
dumpAst.getPrintConfig().addHeader(new Header(option));
return thisWithResetBuilt();
}
/**
......@@ -552,7 +559,7 @@ public class DumpBuilder {
*/
public DumpBuilder skinParam(SkinParamStringSetting setting, String value) {
customPreamble("skinparam " + setting.toString() + " " + value);
return this;
return thisWithResetBuilt();
}
/**
......@@ -563,63 +570,29 @@ public class DumpBuilder {
*/
public DumpBuilder skinParam(SkinParamBooleanSetting setting, boolean value) {
customPreamble("skinparam " + setting.toString() + " " + value);
return this;
}
/**
* Set the method defining, what name a node has (default: {@code n -> n == null ? "null" : n.getClass().getSimpleName() + "@" + Integer.toHexString(n.hashCode())}).
*
* <p>Example:<br>
* {@code builder.<ASTNode<?>>setNameMethod(n -> n.isA() ? "A" : "Not A")}
* @param nameMethod a style method
* @param <ASTNODE> the type of ASTNode
* @return this
*/
public <ASTNODE> DumpBuilder setNameMethod(StyleMethod<ASTNODE> nameMethod) {
buildConfig.getStyleInformation().setNameMethod(nameMethod);
return this;
}
/**
* Set the method defining, what background color a node has (default: {@code n -> ""}).
*
* <p>Example:<br>
* {@code builder.<ASTNode<?>>setBackgroundColorMethod(n -> n.isA() ? "red" : "blue")}
* @param colorMethod a style method
* @param <ASTNODE> the type of ASTNode
* @return this
*/
public <ASTNODE> DumpBuilder setBackgroundColorMethod(StyleMethod<ASTNODE> colorMethod) {
buildConfig.getStyleInformation().setBackgroundColorMethod(colorMethod);
return this;
return thisWithResetBuilt();
}
/**
* Set the method defining, what text color a node has (default: {@code n -> ""}).
*
* <p>Example:<br>
* {@code builder.<ASTNode<?>>setTextColorMethod(n -> n.isA() ? "black" : "white")}
* @param colorMethod a style method
* @param <ASTNODE> the type of ASTNode
* Set the styling definition for all nodes to change appearance, e.g., of background color.
* @param styleDefinition the new style definition
* @return this
* @param <ASTNODE> type of AstNode
*/
public <ASTNODE> DumpBuilder setTextColorMethod(StyleMethod<ASTNODE> colorMethod) {
buildConfig.getStyleInformation().setTextColorMethod(colorMethod);
return this;
public <ASTNODE> DumpBuilder nodeStyle(NodeStyleDefinition<ASTNODE> styleDefinition) {
dumpAst.getPrintConfig().setNodeStyleDefinition(styleDefinition);
return thisWithResetBuilt();
}
/**
* Set the method defining, what stereotype a node has (default: {@code n -> ""}).
*
* <p>Example:<br>
* {@code builder.<ASTNode<?>>setStereotypeMethod(n -> n.isA() ? "MyStereoType" : "")}
* @param stereotypeMethod a style method
* @param <ASTNODE> the type of ASTNode
* Set the styling definition for all relations to change appearance, e.g., of its label.
* @param styleDefinition the new style definition
* @return this
* @param <ASTNODE> type of AstNode
*/
public <ASTNODE> DumpBuilder setStereotypeMethod(StyleMethod<ASTNODE> stereotypeMethod) {
buildConfig.getStyleInformation().setStereotypeMethod(stereotypeMethod);
return this;
public <ASTNODE> DumpBuilder relationStyle(RelationStyleDefinition<ASTNODE> styleDefinition) {
dumpAst.getPrintConfig().setRelationStyleDefinition(styleDefinition);
return thisWithResetBuilt();
}
/**
......@@ -629,8 +602,8 @@ public class DumpBuilder {
* @see <a href="https://plantuml.com/en/color">https://plantuml.com/en/color</a>
*/
public DumpBuilder setComputedColor(String color) {
buildConfig.getStyleInformation().setComputedColor(color);
return this;
dumpAst.getBuildConfig().getStyleInformation().setComputedColor(color);
return thisWithResetBuilt();
}
/**
......@@ -639,8 +612,8 @@ public class DumpBuilder {
* @return this
*/
public DumpBuilder setScale(double value) {
printConfig.setScale(value);
return this;
dumpAst.getPrintConfig().setScale(value);
return thisWithResetBuilt();
}
/**
......@@ -648,8 +621,8 @@ public class DumpBuilder {
* @return this
*/
public DumpBuilder orderChildren() {
printConfig.setOrderChildren(true);
return this;
dumpAst.getPrintConfig().setOrderChildren(true);
return thisWithResetBuilt();
}
// --- Dump methods ---
......@@ -738,8 +711,7 @@ public class DumpBuilder {
// --- Helper methods ---
protected DumpAst build() throws TransformationException {
if (result == null) {
result = new DumpAst();
if (!built) {
final String packageNameToUse;
if (this.packageName != null) {
packageNameToUse = this.packageName;
......@@ -750,39 +722,37 @@ public class DumpBuilder {
packageNameToUse = this.target.getClass().getPackage().getName();
}
}
result.setPackageName(packageNameToUse);
result.setBuildConfig(this.buildConfig);
result.setPrintConfig(this.printConfig);
dumpAst.setPackageName(packageNameToUse);
try {
result.transform(new TransformationTransferInformation(), this.target);
dumpAst.transform(new TransformationTransferInformation(), this.target);
} catch (InvocationTargetException | IllegalAccessException | NoSuchMethodException e) {
result = null;
dumpAst = null;
throw new TransformationException(e);
}
}
return result;
return dumpAst;
}
private PatternCollection findOrCreateIncludePatternCollection(String typeRegex) {
PatternCollection result = buildConfig.findIncludePatternCollection(typeRegex);
PatternCollection result = dumpAst.getBuildConfig().findIncludePatternCollection(typeRegex);
if (result == null) {
TypePatternCollectionMapping mapping = new TypePatternCollectionMapping();
mapping.setTypeRegex(typeRegex);
result = new PatternCollection();
mapping.setPatternCollection(result);
buildConfig.addIncludeTypePattern(mapping);
dumpAst.getBuildConfig().addIncludeTypePattern(mapping);
}
return result;
}
private PatternCollection findOrCreateExcludePatternCollection(String typeRegex) {
PatternCollection result = buildConfig.findExcludePatternCollection(typeRegex);
PatternCollection result = dumpAst.getBuildConfig().findExcludePatternCollection(typeRegex);
if (result == null) {
TypePatternCollectionMapping mapping = new TypePatternCollectionMapping();
mapping.setTypeRegex(typeRegex);
result = new PatternCollection();
mapping.setPatternCollection(result);
buildConfig.addExcludeTypePattern(mapping);
dumpAst.getBuildConfig().addExcludeTypePattern(mapping);
}
return result;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment