[New] Extended builder pattern

This commit is contained in:
Robert von Burg 2024-02-27 14:46:41 +01:00
parent a9067bf161
commit 7b9f2f867f
Signed by: eitch
GPG Key ID: 75DB9C85C74331F7
11 changed files with 222 additions and 48 deletions

View File

@ -84,6 +84,7 @@ public class StrolchModelConstants {
public static final String TYPE_OBJECTIVES = "Objectives";
public static final String TYPE_METRIC = "Metric";
public static final String TYPE_NOTIFICATION = "Notification";
public static final String TYPE_VISIBILITY = "Visibility";
public static final String TYPE_TEXT = "Text";
public static final String RES_CONFIGURATION = "configuration";
@ -106,6 +107,7 @@ public class StrolchModelConstants {
public static final String PARAM_VISIBLE_TO = "visibleTo";
public static final String PARAM_FOR_ALL = "forAll";
public static final String PARAM_ROLES = "roles";
public static final String PARAM_LOCATIONS = "locations";
public static final String PARAM_GROUPS = "groups";
public static class PolicyConstants {

View File

@ -4,6 +4,8 @@ import li.strolch.model.PolicyContainer;
import li.strolch.model.activity.Action;
import li.strolch.utils.dbc.DBC;
import static li.strolch.model.builder.BuilderHelper.buildParamName;
public class ActionBuilder extends PolicyContainerBuilder<ActionBuilder> implements ActivityElementBuilder {
private final ActivityBuilder builder;
@ -11,11 +13,19 @@ public class ActionBuilder extends PolicyContainerBuilder<ActionBuilder> impleme
private String resourceId;
private String resourceType;
public ActionBuilder(String id, String type) {
this(id, buildParamName(id), type);
}
public ActionBuilder(String id, String name, String type) {
super(id, name, type);
this.builder = null;
}
public ActionBuilder(ActivityBuilder builder, String id, String type) {
this(builder, id, buildParamName(id), type);
}
public ActionBuilder(ActivityBuilder builder, String id, String name, String type) {
super(id, name, type);
this.builder = builder;

View File

@ -7,6 +7,8 @@ import li.strolch.model.activity.Activity;
import li.strolch.model.activity.TimeOrdering;
import li.strolch.utils.dbc.DBC;
import static li.strolch.model.builder.BuilderHelper.*;
public class ActivityBuilder extends RootElementBuilder<ActivityBuilder> implements ActivityElementBuilder {
private final StrolchElementBuilder builder;
@ -15,6 +17,10 @@ public class ActivityBuilder extends RootElementBuilder<ActivityBuilder> impleme
private final List<ActivityElementBuilder> builders;
public ActivityBuilder(String id, String type, TimeOrdering timeOrdering) {
this(id, buildParamName(id), type, timeOrdering);
}
public ActivityBuilder(String id, String name, String type, TimeOrdering timeOrdering) {
super(id, name, type);
this.builder = null;
@ -23,6 +29,10 @@ public class ActivityBuilder extends RootElementBuilder<ActivityBuilder> impleme
this.builders = new ArrayList<>();
}
public ActivityBuilder(StrolchElementBuilder builder, String id, String type, TimeOrdering timeOrdering) {
this(builder, id, buildParamName(id), type, timeOrdering);
}
public ActivityBuilder(StrolchElementBuilder builder, String id, String name, String type,
TimeOrdering timeOrdering) {
super(id, name, type);
@ -32,6 +42,11 @@ public class ActivityBuilder extends RootElementBuilder<ActivityBuilder> impleme
this.builders = new ArrayList<>();
}
public ActivityBuilder(StrolchElementBuilder builder, ActivityBuilder parentBuilder, String id, String type,
TimeOrdering timeOrdering) {
this(builder, parentBuilder, id, buildParamName(id), type, timeOrdering);
}
public ActivityBuilder(StrolchElementBuilder builder, ActivityBuilder parentBuilder, String id, String name,
String type, TimeOrdering timeOrdering) {
super(id, name, type);
@ -41,12 +56,20 @@ public class ActivityBuilder extends RootElementBuilder<ActivityBuilder> impleme
this.builders = new ArrayList<>();
}
public ActivityBuilder subActivity(String id, String type, TimeOrdering timeOrdering) {
return subActivity(id, buildParamName(id), type, timeOrdering);
}
public ActivityBuilder subActivity(String id, String name, String type, TimeOrdering timeOrdering) {
ActivityBuilder builder = new ActivityBuilder(this.builder, this, id, name, type, timeOrdering);
this.builders.add(builder);
return builder;
}
public ActionBuilder action(String id, String type) {
return action(id, buildParamName(id), type);
}
public ActionBuilder action(String id, String name, String type) {
ActionBuilder builder = new ActionBuilder(this, id, name, type);
this.builders.add(builder);

View File

@ -7,6 +7,8 @@ import li.strolch.model.ParameterBag;
import li.strolch.model.ParameterBagContainer;
import li.strolch.model.builder.params.*;
import static li.strolch.model.builder.BuilderHelper.buildParamName;
public class BagBuilder<T extends ParameterBagContainerBuilder<T>> {
private final T builder;
@ -15,6 +17,10 @@ public class BagBuilder<T extends ParameterBagContainerBuilder<T>> {
private final String type;
private final List<ParameterBuilder<?, ?, ?>> parameters;
public BagBuilder(T builder, String id, String type) {
this(builder, id, buildParamName(id), type);
}
public BagBuilder(T builder, String id, String name, String type) {
this.builder = builder;
this.id = id;
@ -23,72 +29,120 @@ public class BagBuilder<T extends ParameterBagContainerBuilder<T>> {
this.parameters = new ArrayList<>();
}
public StringParamBuilder<T> string(String id) {
return string(id, buildParamName(id));
}
public StringParamBuilder<T> string(String id, String name) {
StringParamBuilder<T> builder = new StringParamBuilder<>(this, id, name);
this.parameters.add(builder);
return builder;
}
public TextParamBuilder<T> text(String id) {
return text(id, buildParamName(id));
}
public TextParamBuilder<T> text(String id, String name) {
TextParamBuilder<T> builder = new TextParamBuilder<>(this, id, name);
this.parameters.add(builder);
return builder;
}
public BooleanParamBuilder<T> booleanB(String id) {
return booleanB(id, buildParamName(id));
}
public BooleanParamBuilder<T> booleanB(String id, String name) {
BooleanParamBuilder<T> builder = new BooleanParamBuilder<>(this, id, name);
this.parameters.add(builder);
return builder;
}
public IntegerParamBuilder<T> integer(String id) {
return integer(id, buildParamName(id));
}
public IntegerParamBuilder<T> integer(String id, String name) {
IntegerParamBuilder<T> builder = new IntegerParamBuilder<>(this, id, name);
this.parameters.add(builder);
return builder;
}
public LongParamBuilder<T> longB(String id) {
return longB(id, buildParamName(id));
}
public LongParamBuilder<T> longB(String id, String name) {
LongParamBuilder<T> builder = new LongParamBuilder<>(this, id, name);
this.parameters.add(builder);
return builder;
}
public FloatParamBuilder<T> floatB(String id) {
return floatB(id, buildParamName(id));
}
public FloatParamBuilder<T> floatB(String id, String name) {
FloatParamBuilder<T> builder = new FloatParamBuilder<>(this, id, name);
this.parameters.add(builder);
return builder;
}
public DateParamBuilder<T> date(String id) {
return date(id, buildParamName(id));
}
public DateParamBuilder<T> date(String id, String name) {
DateParamBuilder<T> builder = new DateParamBuilder<>(this, id, name);
this.parameters.add(builder);
return builder;
}
public DurationParamBuilder<T> duration(String id) {
return duration(id, buildParamName(id));
}
public DurationParamBuilder<T> duration(String id, String name) {
DurationParamBuilder<T> builder = new DurationParamBuilder<>(this, id, name);
this.parameters.add(builder);
return builder;
}
public StringListParamBuilder<T> stringList(String id) {
return stringList(id, buildParamName(id));
}
public StringListParamBuilder<T> stringList(String id, String name) {
StringListParamBuilder<T> builder = new StringListParamBuilder<>(this, id, name);
this.parameters.add(builder);
return builder;
}
public IntegerListParamBuilder<T> integerList(String id) {
return integerList(id, buildParamName(id));
}
public IntegerListParamBuilder<T> integerList(String id, String name) {
IntegerListParamBuilder<T> builder = new IntegerListParamBuilder<>(this, id, name);
this.parameters.add(builder);
return builder;
}
public LongListParamBuilder<T> longList(String id) {
return longList(id, buildParamName(id));
}
public LongListParamBuilder<T> longList(String id, String name) {
LongListParamBuilder<T> builder = new LongListParamBuilder<>(this, id, name);
this.parameters.add(builder);
return builder;
}
public FloatListParamBuilder<T> floatList(String id) {
return floatList(id, buildParamName(id));
}
public FloatListParamBuilder<T> floatList(String id, String name) {
FloatListParamBuilder<T> builder = new FloatListParamBuilder<>(this, id, name);
this.parameters.add(builder);

View File

@ -5,15 +5,25 @@ import li.strolch.model.State;
import li.strolch.utils.dbc.DBC;
import li.strolch.utils.iso8601.ISO8601;
import static li.strolch.model.builder.BuilderHelper.*;
public class OrderBuilder extends RootElementBuilder<OrderBuilder> {
private final StrolchElementBuilder builder;
public OrderBuilder(String id, String type) {
this(id, buildParamName(id), type);
}
public OrderBuilder(String id, String name, String type) {
super(id, name, type);
this.builder = null;
}
public OrderBuilder(StrolchElementBuilder builder, String id, String type) {
this(builder, id, buildParamName(id), type);
}
public OrderBuilder(StrolchElementBuilder builder, String id, String name, String type) {
super(id, name, type);
this.builder = builder;

View File

@ -1,19 +1,20 @@
package li.strolch.model.builder;
import static java.util.Collections.emptyList;
import static li.strolch.model.StrolchModelConstants.*;
import static li.strolch.model.StrolchModelConstants.PolicyConstants.BAG_OBJECTIVES;
import static li.strolch.model.builder.BuilderHelper.buildParamId;
import java.util.HashMap;
import java.util.Map;
import li.strolch.model.ParameterBag;
import li.strolch.model.ParameterBagContainer;
import li.strolch.model.Tags;
import li.strolch.model.parameter.StringListParameter;
import li.strolch.model.parameter.StringParameter;
import java.util.HashMap;
import java.util.Map;
import static java.util.Collections.emptyList;
import static li.strolch.model.StrolchModelConstants.*;
import static li.strolch.model.StrolchModelConstants.PolicyConstants.BAG_OBJECTIVES;
import static li.strolch.model.builder.BuilderHelper.buildParamId;
import static li.strolch.model.builder.BuilderHelper.buildParamName;
public abstract class ParameterBagContainerBuilder<T extends ParameterBagContainerBuilder<T>> {
private final String id;
@ -24,6 +25,10 @@ public abstract class ParameterBagContainerBuilder<T extends ParameterBagContain
private final Map<String, String[]> singleRelations;
private final Map<String, String[]> multiRelations;
public ParameterBagContainerBuilder(String id, String type) {
this(id, buildParamName(id), type);
}
public ParameterBagContainerBuilder(String id, String name, String type) {
this.id = id;
this.name = name;
@ -58,9 +63,12 @@ public abstract class ParameterBagContainerBuilder<T extends ParameterBagContain
return bag(BAG_RELATIONS, TYPE_RELATIONS, TYPE_RELATIONS);
}
public BagBuilder<T> bag(String id, String type) {
return bag(id, buildParamName(id), type);
}
public BagBuilder<T> bag(String id, String name, String type) {
@SuppressWarnings("unchecked")
BagBuilder<T> bagBuilder = new BagBuilder<>((T) this, id, name, type);
@SuppressWarnings("unchecked") BagBuilder<T> bagBuilder = new BagBuilder<>((T) this, id, name, type);
if (this.parametersBags.put(id, bagBuilder) != null)
throw new IllegalArgumentException("Bag builder for " + id + " already exists!");
return bagBuilder;
@ -70,11 +78,14 @@ public abstract class ParameterBagContainerBuilder<T extends ParameterBagContain
return resourceRelation(buildParamId(type), type, type);
}
public T resourceRelation(String paramId, String type) {
return resourceRelation(paramId, buildParamName(paramId), type);
}
public T resourceRelation(String paramId, String paramName, String type) {
assertNotMapped(paramId);
this.singleRelations.put(paramId, new String[] { paramName, type, Tags.RESOURCE });
@SuppressWarnings("unchecked")
T t = (T) this;
this.singleRelations.put(paramId, new String[]{paramName, type, Tags.RESOURCE});
@SuppressWarnings("unchecked") T t = (T) this;
return t;
}
@ -82,11 +93,14 @@ public abstract class ParameterBagContainerBuilder<T extends ParameterBagContain
return resourceRelations(buildParamId(type), type + "s", type);
}
public T resourceRelations(String paramId, String type) {
return resourceRelations(paramId, buildParamName(paramId), type);
}
public T resourceRelations(String paramId, String paramName, String type) {
assertNotMapped(paramId);
this.multiRelations.put(paramId, new String[] { paramName, type, Tags.RESOURCE });
@SuppressWarnings("unchecked")
T t = (T) this;
this.multiRelations.put(paramId, new String[]{paramName, type, Tags.RESOURCE});
@SuppressWarnings("unchecked") T t = (T) this;
return t;
}
@ -94,11 +108,14 @@ public abstract class ParameterBagContainerBuilder<T extends ParameterBagContain
return orderRelation(buildParamId(type), type, type);
}
public T orderRelation(String paramId, String type) {
return orderRelation(paramId, buildParamName(paramId), type);
}
public T orderRelation(String paramId, String paramName, String type) {
assertNotMapped(paramId);
this.singleRelations.put(paramId, new String[] { paramName, type, Tags.ORDER });
@SuppressWarnings("unchecked")
T t = (T) this;
this.singleRelations.put(paramId, new String[]{paramName, type, Tags.ORDER});
@SuppressWarnings("unchecked") T t = (T) this;
return t;
}
@ -106,11 +123,14 @@ public abstract class ParameterBagContainerBuilder<T extends ParameterBagContain
return orderRelations(buildParamId(type), type + "s", type);
}
public T orderRelations(String paramId, String type) {
return orderRelations(paramId, buildParamName(paramId), type);
}
public T orderRelations(String paramId, String paramName, String type) {
assertNotMapped(paramId);
this.multiRelations.put(paramId, new String[] { paramName, type, Tags.ORDER });
@SuppressWarnings("unchecked")
T t = (T) this;
this.multiRelations.put(paramId, new String[]{paramName, type, Tags.ORDER});
@SuppressWarnings("unchecked") T t = (T) this;
return t;
}
@ -118,11 +138,14 @@ public abstract class ParameterBagContainerBuilder<T extends ParameterBagContain
return activityRelation(buildParamId(type), type, type);
}
public T activityRelation(String paramId, String type) {
return activityRelation(paramId, buildParamName(paramId), type);
}
public T activityRelation(String paramId, String paramName, String type) {
assertNotMapped(paramId);
this.singleRelations.put(paramId, new String[] { paramName, type, Tags.ACTIVITY });
@SuppressWarnings("unchecked")
T t = (T) this;
this.singleRelations.put(paramId, new String[]{paramName, type, Tags.ACTIVITY});
@SuppressWarnings("unchecked") T t = (T) this;
return t;
}
@ -130,11 +153,14 @@ public abstract class ParameterBagContainerBuilder<T extends ParameterBagContain
return activityRelations(buildParamId(type), type + "s", type);
}
public T activityRelations(String paramId, String type) {
return activityRelations(paramId, buildParamName(paramId), type);
}
public T activityRelations(String paramId, String paramName, String type) {
assertNotMapped(paramId);
this.multiRelations.put(paramId, new String[] { paramName, type, Tags.ACTIVITY });
@SuppressWarnings("unchecked")
T t = (T) this;
this.multiRelations.put(paramId, new String[]{paramName, type, Tags.ACTIVITY});
@SuppressWarnings("unchecked") T t = (T) this;
return t;
}

View File

@ -3,18 +3,23 @@ package li.strolch.model.builder;
import li.strolch.model.ParameterBagContainer;
import li.strolch.model.PolicyContainer;
import static li.strolch.model.builder.BuilderHelper.buildParamName;
public class PolicyContainerBuilder<T extends ParameterBagContainerBuilder<T>> extends ParameterBagContainerBuilder<T> {
private PoliciesBuilder<T> policies;
public PolicyContainerBuilder(String id, String type) {
super(id, buildParamName(id), type);
}
public PolicyContainerBuilder(String id, String name, String type) {
super(id, name, type);
}
public PoliciesBuilder<T> policies() {
if (this.policies == null) {
@SuppressWarnings("unchecked")
T t = (T) this;
@SuppressWarnings("unchecked") T t = (T) this;
this.policies = new PoliciesBuilder<>(t);
}
return policies;

View File

@ -1,65 +1,104 @@
package li.strolch.model.builder;
import java.util.ArrayList;
import java.util.List;
import li.strolch.model.Resource;
import li.strolch.model.builder.states.*;
import li.strolch.utils.dbc.DBC;
import java.util.ArrayList;
import java.util.List;
import static li.strolch.model.builder.BuilderHelper.buildParamName;
import static li.strolch.utils.helper.StringHelper.getUniqueId;
public class ResourceBuilder extends RootElementBuilder<ResourceBuilder> {
private final StrolchElementBuilder builder;
private final List<TimedStateBuilder<?>> timedStates;
public ResourceBuilder(String name, String type) {
this(getUniqueId(), name, type);
}
public ResourceBuilder(String id, String name, String type) {
super(id, name, type);
this.builder = null;
this.timedStates = new ArrayList<>();
}
public ResourceBuilder(StrolchElementBuilder builder, String name, String type) {
this(builder, getUniqueId(), name, type);
}
public ResourceBuilder(StrolchElementBuilder builder, String id, String name, String type) {
super(id, name, type);
this.builder = builder;
this.timedStates = new ArrayList<>();
}
public BooleanStateBuilder booleanState(String id) {
return booleanState(id, buildParamName(id));
}
public BooleanStateBuilder booleanState(String id, String name) {
BooleanStateBuilder builder = new BooleanStateBuilder(this, id, name);
this.timedStates.add(builder);
return builder;
}
public FloatStateBuilder floatState(String id) {
return floatState(id, buildParamName(id));
}
public FloatStateBuilder floatState(String id, String name) {
FloatStateBuilder builder = new FloatStateBuilder(this, id, name);
this.timedStates.add(builder);
return builder;
}
public IntegerStateBuilder integerState(String id) {
return integerState(id, buildParamName(id));
}
public IntegerStateBuilder integerState(String id, String name) {
IntegerStateBuilder builder = new IntegerStateBuilder(this, id, name);
this.timedStates.add(builder);
return builder;
}
public LongStateBuilder longState(String id) {
return longState(id, buildParamName(id));
}
public LongStateBuilder longState(String id, String name) {
LongStateBuilder builder = new LongStateBuilder(this, id, name);
this.timedStates.add(builder);
return builder;
}
public FloatListStateBuilder floatListState(String id) {
return floatListState(id, buildParamName(id));
}
public FloatListStateBuilder floatListState(String id, String name) {
FloatListStateBuilder builder = new FloatListStateBuilder(this, id, name);
this.timedStates.add(builder);
return builder;
}
public IntegerListStateBuilder integerListState(String id) {
return integerListState(id, buildParamName(id));
}
public IntegerListStateBuilder integerListState(String id, String name) {
IntegerListStateBuilder builder = new IntegerListStateBuilder(this, id, name);
this.timedStates.add(builder);
return builder;
}
public StringSetStateBuilder stringSetState(String id) {
return stringSetState(id, buildParamName(id));
}
public StringSetStateBuilder stringSetState(String id, String name) {
StringSetStateBuilder builder = new StringSetStateBuilder(this, id, name);
this.timedStates.add(builder);

View File

@ -1,10 +1,15 @@
package li.strolch.model.builder;
import li.strolch.model.PolicyContainer;
import li.strolch.model.StrolchRootElement;
import static li.strolch.model.builder.BuilderHelper.buildParamName;
public abstract class RootElementBuilder<T extends ParameterBagContainerBuilder<T>> extends PolicyContainerBuilder<T> {
public RootElementBuilder(String id, String type) {
super(id, buildParamName(id), type);
}
public RootElementBuilder(String id, String name, String type) {
super(id, name, type);
}

View File

@ -27,19 +27,19 @@ public class StrolchElementBuilder {
this.activityBuilders = new HashMap<>();
}
public ResourceBuilder resource(String name, String type) {
public ResourceBuilder resourceTemplate(String name, String type) {
ResourceBuilder builder = new ResourceBuilder(this, type, name, TEMPLATE);
this.resourceBuilders.put(type, builder);
return builder;
}
public OrderBuilder order(String name, String type) {
public OrderBuilder orderTemplate(String name, String type) {
OrderBuilder builder = new OrderBuilder(this, type, name, TEMPLATE);
this.orderBuilders.put(type, builder);
return builder;
}
public ActivityBuilder activity(String name, String type, TimeOrdering timeOrdering) {
public ActivityBuilder activityTemplate(String name, String type, TimeOrdering timeOrdering) {
ActivityBuilder builder = new ActivityBuilder(this, type, name, TEMPLATE, timeOrdering);
this.activityBuilders.put(type, builder);
return builder;
@ -62,7 +62,7 @@ public class StrolchElementBuilder {
public List<StrolchRootElement> buildTemplates() {
return concat(concat(this.resourceBuilders.values().stream(), //
this.orderBuilders.values().stream()), //
this.orderBuilders.values().stream()), //
this.activityBuilders.values().stream()) //
.map(RootElementBuilder::build).collect(toList());
}
@ -71,24 +71,24 @@ public class StrolchElementBuilder {
ResourceBuilder builder = this.resourceBuilders.get(type);
if (builder == null)
throw new IllegalArgumentException("No resource template defined for type " + type);
return updateFields(type, newName, builder.build());
return setInitialFields(type, newName, builder.build());
}
public Order newOrder(String type, String newName) {
OrderBuilder builder = this.orderBuilders.get(type);
if (builder == null)
throw new IllegalArgumentException("No resource template defined for type " + type);
return updateFields(type, newName, builder.build());
return setInitialFields(type, newName, builder.build());
}
public Activity newActivity(String type, String newName) {
ActivityBuilder builder = this.activityBuilders.get(type);
if (builder == null)
throw new IllegalArgumentException("No resource template defined for type " + type);
return updateFields(type, newName, builder.build());
return setInitialFields(type, newName, builder.build());
}
private <T extends StrolchRootElement> T updateFields(String type, String newName, T element) {
private <T extends StrolchRootElement> T setInitialFields(String type, String newName, T element) {
element.setId(StringHelper.getUniqueId());
element.setName(newName);
element.setType(type);

View File

@ -33,7 +33,7 @@ public class StrolchElementBuilderTest {
*/
// person
.resource("Person Template", "Person") //
.resourceTemplate("Person Template", "Person") //
.defaultBag() //
.date("birthdate", "Birthdate").value(ZonedDateTime.now()).end() //
.string("case", "Case").interpretation("Case").uom("Simple").end() //
@ -47,7 +47,7 @@ public class StrolchElementBuilderTest {
.endResource() //
// cars
.resource("Car Template", "Car") //
.resourceTemplate("Car Template", "Car") //
.defaultBag() //
.string("color", "Color").value("white").end() //
.endBag() //
@ -56,7 +56,7 @@ public class StrolchElementBuilderTest {
.endResource() //
// machines
.resource("Machine Template", "Machine") //
.resourceTemplate("Machine Template", "Machine") //
.defaultBag() //
.string("color", "Color").end() //
.endBag() //
@ -68,7 +68,7 @@ public class StrolchElementBuilderTest {
*/
// orders
.order("Order Template", "Order") //
.orderTemplate("Order Template", "Order") //
.defaultBag() //
.string("description", "Description").end() //
.endBag() //
@ -83,7 +83,7 @@ public class StrolchElementBuilderTest {
*/
// ToStock
.activity("ToStock Template", "ToStock", TimeOrdering.SERIES) //
.activityTemplate("ToStock Template", "ToStock", TimeOrdering.SERIES) //
.defaultBag() //
.string("description", "Description").end() //
.endBag() //
@ -211,7 +211,7 @@ public class StrolchElementBuilderTest {
Resource car1 = new StrolchElementBuilder() //
.resource("Car Template", "Car") //
.resourceTemplate("Car Template", "Car") //
.defaultBag() //
.string("color", "Color").value("white").end() //
.endBag() //