From f380c5d98f7217d18aab0cec4621557d2410b5c7 Mon Sep 17 00:00:00 2001 From: Julia Pham Date: Fri, 21 Nov 2025 17:20:06 +0100 Subject: [PATCH 1/4] feat: added abstract factory and default factory --- .../building/AbstractUVLElementFactory.java | 14 ++++++++++++ .../building/DefaultUVLElementFactory.java | 22 +++++++++++++++++++ .../model/building/FeatureModelBuilder.java | 11 +++++++--- 3 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 src/main/java/de/vill/model/building/AbstractUVLElementFactory.java create mode 100644 src/main/java/de/vill/model/building/DefaultUVLElementFactory.java diff --git a/src/main/java/de/vill/model/building/AbstractUVLElementFactory.java b/src/main/java/de/vill/model/building/AbstractUVLElementFactory.java new file mode 100644 index 0000000..ad40d18 --- /dev/null +++ b/src/main/java/de/vill/model/building/AbstractUVLElementFactory.java @@ -0,0 +1,14 @@ +package de.vill.model.building; + +import de.vill.exception.ParseError; +import de.vill.model.*; + +public abstract class AbstractUVLElementFactory { + + public abstract Feature createFeature(String name); + + public abstract Attribute createAttribute(String name, T value, Feature correspondingFeature); + + public abstract GlobalAttribute createGlobalAttribute(String identifier, FeatureModel featureModel); + +} \ No newline at end of file diff --git a/src/main/java/de/vill/model/building/DefaultUVLElementFactory.java b/src/main/java/de/vill/model/building/DefaultUVLElementFactory.java new file mode 100644 index 0000000..fa485d2 --- /dev/null +++ b/src/main/java/de/vill/model/building/DefaultUVLElementFactory.java @@ -0,0 +1,22 @@ +package de.vill.model.building; + +import de.vill.exception.ParseError; +import de.vill.model.*; + +public class DefaultUVLElementFactory extends AbstractUVLElementFactory{ + + @Override + public Feature createFeature(String name){ + return new Feature(name); + } + + @Override + public Attribute createAttribute(String name, T value, Feature correspondingFeature){ + return new Attribute<>(name, value, correspondingFeature); + } + + @Override + public GlobalAttribute createGlobalAttribute(String identifier, FeatureModel featureModel){ + return new GlobalAttribute(identifier, featureModel); + } +} diff --git a/src/main/java/de/vill/model/building/FeatureModelBuilder.java b/src/main/java/de/vill/model/building/FeatureModelBuilder.java index bb998a6..ce7cf0f 100644 --- a/src/main/java/de/vill/model/building/FeatureModelBuilder.java +++ b/src/main/java/de/vill/model/building/FeatureModelBuilder.java @@ -11,14 +11,20 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Function; /** * */ public class FeatureModelBuilder { + private Function featureFactory = Feature::new; private FeatureModel fmInConstruction; + public void setFeatureFactory(Function featureFactory){ + this.featureFactory = featureFactory; + } + public FeatureModelBuilder() { fmInConstruction = new FeatureModel(); } @@ -27,7 +33,6 @@ public FeatureModelBuilder(FeatureModel old) { fmInConstruction = old; } - public void addImport(Import importToAdd) { fmInConstruction.getImports().add(importToAdd); } @@ -49,7 +54,7 @@ public boolean setRootFeature(Feature feature) { } public Feature addRootFeature(String featureName, FeatureType featureType, Cardinality cardinality) { - Feature rootFeature = new Feature(featureName); + Feature rootFeature = featureFactory.apply(featureName); rootFeature.setFeatureType(featureType); rootFeature.setCardinality(cardinality); @@ -71,7 +76,7 @@ public Feature addFeature(String featureName, Group group, Import featureOrigin, } public Feature addFeature(String featureName, Group group, Import featureOrigin, FeatureType type, Cardinality cardinality) { - Feature feature = new Feature(featureName); + Feature feature = featureFactory.apply(featureName); feature.setRelatedImport(featureOrigin); feature.setFeatureType(type); feature.setCardinality(cardinality); From 0ad5e14c98cd353b801638c9c027a2b10bc7c543 Mon Sep 17 00:00:00 2001 From: Julia Pham Date: Mon, 1 Dec 2025 08:46:18 +0100 Subject: [PATCH 2/4] fix: replace hard-coded constructors with factory in FMBuilder --- .../model/building/AbstractUVLElementFactory.java | 3 +++ .../model/building/DefaultUVLElementFactory.java | 6 ++++++ .../de/vill/model/building/FeatureModelBuilder.java | 12 ++++++++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/vill/model/building/AbstractUVLElementFactory.java b/src/main/java/de/vill/model/building/AbstractUVLElementFactory.java index ad40d18..bf3168b 100644 --- a/src/main/java/de/vill/model/building/AbstractUVLElementFactory.java +++ b/src/main/java/de/vill/model/building/AbstractUVLElementFactory.java @@ -2,6 +2,7 @@ import de.vill.exception.ParseError; import de.vill.model.*; +import de.vill.model.constraint.LiteralConstraint; public abstract class AbstractUVLElementFactory { @@ -11,4 +12,6 @@ public abstract class AbstractUVLElementFactory { public abstract GlobalAttribute createGlobalAttribute(String identifier, FeatureModel featureModel); + // public abstract LiteralConstraint createFeatureLiteral(String name); + } \ No newline at end of file diff --git a/src/main/java/de/vill/model/building/DefaultUVLElementFactory.java b/src/main/java/de/vill/model/building/DefaultUVLElementFactory.java index fa485d2..aca9ab3 100644 --- a/src/main/java/de/vill/model/building/DefaultUVLElementFactory.java +++ b/src/main/java/de/vill/model/building/DefaultUVLElementFactory.java @@ -2,6 +2,7 @@ import de.vill.exception.ParseError; import de.vill.model.*; +import de.vill.model.constraint.LiteralConstraint; public class DefaultUVLElementFactory extends AbstractUVLElementFactory{ @@ -19,4 +20,9 @@ public Attribute createAttribute(String name, T value, Feature correspond public GlobalAttribute createGlobalAttribute(String identifier, FeatureModel featureModel){ return new GlobalAttribute(identifier, featureModel); } + + // @Override + // public LiteralConstraint createFeatureLiteral(String name){ + // return new LiteralConstraint(fmInConstruction.getFeatureMap().get(name)); + // } } diff --git a/src/main/java/de/vill/model/building/FeatureModelBuilder.java b/src/main/java/de/vill/model/building/FeatureModelBuilder.java index ce7cf0f..5637f70 100644 --- a/src/main/java/de/vill/model/building/FeatureModelBuilder.java +++ b/src/main/java/de/vill/model/building/FeatureModelBuilder.java @@ -19,14 +19,22 @@ public class FeatureModelBuilder { private Function featureFactory = Feature::new; + private FeatureModel fmInConstruction; + private AbstractUVLElementFactory elementFactory; + public void setFeatureFactory(Function featureFactory){ this.featureFactory = featureFactory; } public FeatureModelBuilder() { - fmInConstruction = new FeatureModel(); + this(new DefaultUVLElementFactory()); + } + + public FeatureModelBuilder(AbstractUVLElementFactory factory) { + this.elementFactory = factory; + this.fmInConstruction = new FeatureModel(); } public FeatureModelBuilder(FeatureModel old) { @@ -197,7 +205,7 @@ public LiteralConstraint createFeatureLiteral(String name) { } public GlobalAttribute createGlobalAttribute(String name) { - GlobalAttribute toCreate = new GlobalAttribute(name, fmInConstruction); + GlobalAttribute toCreate = elementFactory.createGlobalAttribute(name, fmInConstruction); if (toCreate.getType() == null) { System.err.println("Tried to reference " + name + " but attribute with that name does not exist"); return null; From 193ec560d0a77cd4096c1f45fe5b55c9a710b887 Mon Sep 17 00:00:00 2001 From: Julia Pham Date: Mon, 8 Dec 2025 18:24:24 +0100 Subject: [PATCH 3/4] refactor: use elementFactory in FMBuilder --- .../model/building/AbstractUVLElementFactory.java | 4 +--- .../model/building/DefaultUVLElementFactory.java | 15 +++++---------- .../vill/model/building/FeatureModelBuilder.java | 13 ++----------- 3 files changed, 8 insertions(+), 24 deletions(-) diff --git a/src/main/java/de/vill/model/building/AbstractUVLElementFactory.java b/src/main/java/de/vill/model/building/AbstractUVLElementFactory.java index bf3168b..7eb46ba 100644 --- a/src/main/java/de/vill/model/building/AbstractUVLElementFactory.java +++ b/src/main/java/de/vill/model/building/AbstractUVLElementFactory.java @@ -5,13 +5,11 @@ import de.vill.model.constraint.LiteralConstraint; public abstract class AbstractUVLElementFactory { - + public abstract Feature createFeature(String name); public abstract Attribute createAttribute(String name, T value, Feature correspondingFeature); public abstract GlobalAttribute createGlobalAttribute(String identifier, FeatureModel featureModel); - // public abstract LiteralConstraint createFeatureLiteral(String name); - } \ No newline at end of file diff --git a/src/main/java/de/vill/model/building/DefaultUVLElementFactory.java b/src/main/java/de/vill/model/building/DefaultUVLElementFactory.java index aca9ab3..81251dc 100644 --- a/src/main/java/de/vill/model/building/DefaultUVLElementFactory.java +++ b/src/main/java/de/vill/model/building/DefaultUVLElementFactory.java @@ -4,25 +4,20 @@ import de.vill.model.*; import de.vill.model.constraint.LiteralConstraint; -public class DefaultUVLElementFactory extends AbstractUVLElementFactory{ +public class DefaultUVLElementFactory extends AbstractUVLElementFactory { @Override - public Feature createFeature(String name){ + public Feature createFeature(String name) { return new Feature(name); } @Override - public Attribute createAttribute(String name, T value, Feature correspondingFeature){ + public Attribute createAttribute(String name, T value, Feature correspondingFeature) { return new Attribute<>(name, value, correspondingFeature); - } + } @Override - public GlobalAttribute createGlobalAttribute(String identifier, FeatureModel featureModel){ + public GlobalAttribute createGlobalAttribute(String identifier, FeatureModel featureModel) { return new GlobalAttribute(identifier, featureModel); } - - // @Override - // public LiteralConstraint createFeatureLiteral(String name){ - // return new LiteralConstraint(fmInConstruction.getFeatureMap().get(name)); - // } } diff --git a/src/main/java/de/vill/model/building/FeatureModelBuilder.java b/src/main/java/de/vill/model/building/FeatureModelBuilder.java index 5637f70..87c6a5f 100644 --- a/src/main/java/de/vill/model/building/FeatureModelBuilder.java +++ b/src/main/java/de/vill/model/building/FeatureModelBuilder.java @@ -13,21 +13,12 @@ import java.util.Set; import java.util.function.Function; -/** - * - */ public class FeatureModelBuilder { - - private Function featureFactory = Feature::new; private FeatureModel fmInConstruction; private AbstractUVLElementFactory elementFactory; - public void setFeatureFactory(Function featureFactory){ - this.featureFactory = featureFactory; - } - public FeatureModelBuilder() { this(new DefaultUVLElementFactory()); } @@ -62,7 +53,7 @@ public boolean setRootFeature(Feature feature) { } public Feature addRootFeature(String featureName, FeatureType featureType, Cardinality cardinality) { - Feature rootFeature = featureFactory.apply(featureName); + Feature rootFeature = elementFactory.createFeature(featureName); rootFeature.setFeatureType(featureType); rootFeature.setCardinality(cardinality); @@ -84,7 +75,7 @@ public Feature addFeature(String featureName, Group group, Import featureOrigin, } public Feature addFeature(String featureName, Group group, Import featureOrigin, FeatureType type, Cardinality cardinality) { - Feature feature = featureFactory.apply(featureName); + Feature feature = elementFactory.createFeature(featureName); feature.setRelatedImport(featureOrigin); feature.setFeatureType(type); feature.setCardinality(cardinality); From ac5f5583ca1bf68054898b74d12b2da4b8c82620 Mon Sep 17 00:00:00 2001 From: Julia Pham Date: Mon, 8 Dec 2025 18:27:13 +0100 Subject: [PATCH 4/4] style: fix indentation in FMBuilder --- .../model/building/FeatureModelBuilder.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/vill/model/building/FeatureModelBuilder.java b/src/main/java/de/vill/model/building/FeatureModelBuilder.java index 87c6a5f..5ec8760 100644 --- a/src/main/java/de/vill/model/building/FeatureModelBuilder.java +++ b/src/main/java/de/vill/model/building/FeatureModelBuilder.java @@ -14,7 +14,7 @@ import java.util.function.Function; public class FeatureModelBuilder { - + private FeatureModel fmInConstruction; private AbstractUVLElementFactory elementFactory; @@ -69,12 +69,13 @@ public Feature addFeature(String featureName, Group group) { public Feature addFeature(String featureName, Group group, Import featureOrigin) { return addFeature(featureName, group, featureOrigin, FeatureType.BOOL); } - - public Feature addFeature(String featureName, Group group, Import featureOrigin, FeatureType type) { + + public Feature addFeature(String featureName, Group group, Import featureOrigin, FeatureType type) { return addFeature(featureName, group, featureOrigin, type, Cardinality.getStandardFeatureCardinality()); } - public Feature addFeature(String featureName, Group group, Import featureOrigin, FeatureType type, Cardinality cardinality) { + public Feature addFeature(String featureName, Group group, Import featureOrigin, FeatureType type, + Cardinality cardinality) { Feature feature = elementFactory.createFeature(featureName); feature.setRelatedImport(featureOrigin); feature.setFeatureType(type); @@ -103,9 +104,11 @@ public void addAttribute(Feature feature, Attribute attribute) { /** * Renames a feature and propagates the change through the mdoel + * * @param oldName current name of feature to be renamed in the model * @param newName target name - * @return indicator whether oldName successfully changed in the feature model; fails if oldName is not present + * @return indicator whether oldName successfully changed in the feature model; + * fails if oldName is not present */ public boolean renameFeature(String oldName, String newName) { Map featureMap = fmInConstruction.getFeatureMap(); @@ -141,6 +144,7 @@ public void renameAttributeGlobally(String oldName, String newName) { crawlConstraintsToRenameGlobalAttribute(constraint, oldName, newName); } } + private void crawlConstraintsToRenameGlobalAttribute(Constraint constraint, String attributeName, String replace) { if (constraint instanceof ExpressionConstraint) { for (Expression exp : ((ExpressionConstraint) constraint).getExpressionSubParts()) { @@ -158,7 +162,8 @@ private void crawlExpressionsToRenameGlobalAttribute(Expression expression, Stri AggregateFunctionExpression aggregateFunctionExpression = (AggregateFunctionExpression) expression; if (aggregateFunctionExpression.getAttribute().getIdentifier().equals(attributeName)) { aggregateFunctionExpression.getAttribute().renameGlobalAttribute(replace); - }; + } + ; } else { for (Expression exp : expression.getExpressionSubParts()) { crawlExpressionsToRenameGlobalAttribute(exp, attributeName, replace); @@ -167,15 +172,16 @@ private void crawlExpressionsToRenameGlobalAttribute(Expression expression, Stri } public void addConstraint(Constraint constraint) { - fmInConstruction.getOwnConstraints().add(0,constraint); + fmInConstruction.getOwnConstraints().add(0, constraint); } public void addConstraintAtPosition(Constraint constraint, int position) { - fmInConstruction.getOwnConstraints().add(position,constraint); + fmInConstruction.getOwnConstraints().add(position, constraint); } public boolean doesFeatureModelSatisfyLanguageLevels(Set languageLevelsToSatisfy) { - return fmInConstruction.isExplicitLanguageLevels() && !fmInConstruction.getUsedLanguageLevels().equals(languageLevelsToSatisfy); + return fmInConstruction.isExplicitLanguageLevels() + && !fmInConstruction.getUsedLanguageLevels().equals(languageLevelsToSatisfy); } public FeatureModel getFeatureModel() {