Skip to content

Commit b89e8b4

Browse files
authored
Merge pull request #5 from Universal-Variability-Language/refactoring_metamodel
Major refactoring of metamodel
2 parents 3a70b75 + 69e225f commit b89e8b4

67 files changed

Lines changed: 5429 additions & 1187 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/java.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Build and Deploy Java Parser
1+
name: Test Java Parser
22

33
on:
44
push

pom.xml

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<project xmlns="http://maven.apache.org/POM/4.0.0"
3-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
53
<modelVersion>4.0.0</modelVersion>
64

75
<groupId>io.github.universal-variability-language</groupId>
86
<artifactId>fm-metamodel</artifactId>
9-
<version>1.0</version>
7+
<version>1.1</version>
108

119
<name>UVL Java Metamodel</name>
1210
<description>This project host a java feature model metamodel for UVL </description>
@@ -47,10 +45,11 @@
4745
</developers>
4846

4947
<scm><!-- TODO-->
50-
<connection>scm:git:git@github.com:Universal-Variability-Language/java-uvl-metamodel.git</connection>
51-
<developerConnection>scm:git:git@github.com:Universal-Variability-Language/java-uvl-metamodel.git</developerConnection>
52-
<url>https://github.com/Universal-Variability-Language/java-uvl-metamodel</url>
53-
</scm>
48+
<connection>scm:git:git@github.com:Universal-Variability-Language/java-fm-metamodel.git</connection>
49+
<developerConnection>scm:git:git@github.com:Universal-Variability-Language/java-fm-metamodel.git</developerConnection>
50+
<url>https://github.com/Universal-Variability-Language/java-fm-metamodel</url>
51+
<tag>HEAD</tag>
52+
</scm>
5453

5554
<distributionManagement>
5655
<snapshotRepository>
@@ -65,8 +64,8 @@
6564

6665
<properties>
6766
<antlr4.version>4.13.1</antlr4.version>
68-
<maven.compiler.source>8</maven.compiler.source>
69-
<maven.compiler.target>8</maven.compiler.target>
67+
<maven.compiler.source>11</maven.compiler.source>
68+
<maven.compiler.target>11</maven.compiler.target>
7069
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
7170
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
7271
</properties>

src/main/java/de/vill/conversion/ConvertAggregateFunction.java

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@ private void replaceAggregateFunctionInExpression(Expression parentExpression, A
6262
} else {
6363
rootFeature = aggregateFunctionExpression.getRootFeature();
6464
}
65-
List<Feature> attributes = collectAttributes(rootFeature, aggregateFunctionExpression.getAttributeName());
65+
List<Feature> attributes = collectAttributes(rootFeature, aggregateFunctionExpression.getAttribute().getIdentifier());
6666
Expression newExpression = null;
6767
if (aggregateFunctionExpression instanceof SumAggregateFunctionExpression) {
68-
newExpression = getSum(attributes, aggregateFunctionExpression.getAttributeName());
68+
newExpression = getSum(attributes, aggregateFunctionExpression.getAttribute().getIdentifier());
6969
} else if (aggregateFunctionExpression instanceof AvgAggregateFunctionExpression) {
70-
newExpression = getAvg(attributes, aggregateFunctionExpression.getAttributeName());
70+
newExpression = getAvg(attributes, aggregateFunctionExpression.getAttribute().getIdentifier());
7171
}
7272
parentExpression.replaceExpressionSubPart(aggregateFunctionExpression, newExpression);
7373
}
@@ -80,44 +80,42 @@ private void replaceAggregateFunctionInExpressionConstraint(ExpressionConstraint
8080
} else {
8181
rootFeature = aggregateFunctionExpression.getRootFeature();
8282
}
83-
List<Feature> attributes = collectAttributes(rootFeature, aggregateFunctionExpression.getAttributeName());
83+
List<Feature> attributes = collectAttributes(rootFeature, aggregateFunctionExpression.getAttribute().getIdentifier());
8484
Expression newExpression = null;
8585
if (aggregateFunctionExpression instanceof SumAggregateFunctionExpression) {
86-
newExpression = getSum(attributes, aggregateFunctionExpression.getAttributeName());
86+
newExpression = getSum(attributes, aggregateFunctionExpression.getAttribute().getIdentifier());
8787
} else if (aggregateFunctionExpression instanceof AvgAggregateFunctionExpression) {
88-
newExpression = getAvg(attributes, aggregateFunctionExpression.getAttributeName());
88+
newExpression = getAvg(attributes, aggregateFunctionExpression.getAttribute().getIdentifier());
8989
}
9090
parentExpression.replaceExpressionSubPart(aggregateFunctionExpression, newExpression);
9191
}
9292

9393
private Expression getSum(List<Feature> relevantFeatures, String attributeName) {
94-
if (relevantFeatures.size() == 0) {
94+
if (relevantFeatures.isEmpty()) {
9595
return new NumberExpression(0);
9696
} else if (relevantFeatures.size() == 1) {
97-
LiteralExpression literalExpression = new LiteralExpression(relevantFeatures.get(0), attributeName);
97+
LiteralExpression literalExpression = new LiteralExpression(relevantFeatures.get(0).getAttributes().get(attributeName));
9898
relevantFeatures.remove(0);
9999

100100
return literalExpression;
101101
} else {
102-
LiteralExpression literalExpression = new LiteralExpression(relevantFeatures.get(0), attributeName);
102+
LiteralExpression literalExpression = new LiteralExpression(relevantFeatures.get(0).getAttributes().get(attributeName));
103103
relevantFeatures.remove(0);
104104

105105
return new AddExpression(literalExpression, getSum(relevantFeatures, attributeName));
106106
}
107107
}
108108

109109
private Expression getAvg(List<Feature> relevantFeatures, String attributeName) {
110-
if (relevantFeatures.size() == 0) {
110+
if (relevantFeatures.isEmpty()) {
111111
return new NumberExpression(0);
112112
} else {
113113
for (Feature feature : relevantFeatures) {
114-
feature.getAttributes().put("avg_counter__", new Attribute<Long>("avg_counter__", 1L));
114+
feature.getAttributes().put("avg_counter__", new Attribute<Long>("avg_counter__", 1L, feature));
115115
}
116116
Expression n = getSum(new LinkedList<>(relevantFeatures), "avg_counter__");
117117
Expression sum = getSum(relevantFeatures, attributeName);
118-
Expression avg = new ParenthesisExpression(new DivExpression(new ParenthesisExpression(sum), new ParenthesisExpression(n)));
119-
120-
return avg;
118+
return new ParenthesisExpression(new DivExpression(new ParenthesisExpression(sum), new ParenthesisExpression(n)));
121119
}
122120
}
123121

src/main/java/de/vill/conversion/ConvertFeatureCardinality.java

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public void convertFeatureModel(FeatureModel rootFeatureModel, FeatureModel feat
2626

2727
private void traverseFeatures(Feature feature, FeatureModel featureModel) {
2828
if (!feature.isSubmodelRoot()) {
29-
if (feature.getLowerBound() != null) {
29+
if (feature.getCardinality() != null) {
3030
List<Feature> subTreeFeatures = new LinkedList<>();
3131
for (Group group : feature.getChildren()) {
3232
subTreeFeatures.addAll(getFeatureFromSubTree(group));
@@ -44,16 +44,15 @@ private void traverseFeatures(Feature feature, FeatureModel featureModel) {
4444
}
4545

4646
private void removeFeatureCardinality(Feature feature, FeatureModel featureModel, List<Constraint> constraintsToClone) {
47-
int min = Integer.parseInt(feature.getLowerBound());
48-
int max = Integer.parseInt(feature.getUpperBound());
47+
int min = feature.getCardinality().lower;
48+
int max = feature.getCardinality().upper;
4949
Group newChildren = new Group(Group.GroupType.ALTERNATIVE);
5050

51-
feature.setLowerBound(null);
52-
feature.setUpperBound(null);
51+
feature.setCardinality(null);
5352

5453
for (int i = min; i <= max; i++) {
5554
Feature newChild = new Feature(feature.getFeatureName() + "-" + i);
56-
newChild.getAttributes().put("abstract", new Attribute<Boolean>("abstract", true));
55+
newChild.getAttributes().put("abstract", new Attribute<Boolean>("abstract", true, feature));
5756
newChildren.getFeatures().add(newChild);
5857
newChild.setParentGroup(newChildren);
5958
Group mandatoryGroup = new Group(Group.GroupType.MANDATORY);
@@ -120,8 +119,8 @@ private List<Feature> getFeatureFromSubTree(Group group) {
120119
private boolean constraintContains(Constraint constraint, List<Feature> subTreeFeatures) {
121120
List<Constraint> subParts = constraint.getConstraintSubParts();
122121
for (Constraint subPart : subParts) {
123-
if (subPart instanceof LiteralConstraint) {
124-
Feature feature = ((LiteralConstraint) subPart).getFeature();
122+
if (subPart instanceof LiteralConstraint && ((LiteralConstraint) subPart).getReference() instanceof Feature) {
123+
Feature feature = (Feature) ((LiteralConstraint) subPart).getReference();
125124
if (subTreeFeatures.contains(feature)) {
126125
return true;
127126
}
@@ -148,12 +147,10 @@ private void adaptConstraint(Feature subTreeRoot, Constraint constraint, Map<Str
148147
List<Constraint> subParts = constraint.getConstraintSubParts();
149148
for (Constraint subPart : subParts) {
150149
if (subPart instanceof LiteralConstraint) {
151-
String toReplace = ((LiteralConstraint) subPart).getLiteral();
150+
String toReplace = ((LiteralConstraint) subPart).getReference().getIdentifier();
152151
if (featureReplacementMap.containsKey(toReplace)) {
153-
LiteralConstraint subTreeRootConstraint = new LiteralConstraint(subTreeRoot.getFeatureName());
154-
subTreeRootConstraint.setFeature(subTreeRoot);
155-
LiteralConstraint newLiteral = new LiteralConstraint(featureReplacementMap.get(toReplace).getFeatureName());
156-
newLiteral.setFeature(featureReplacementMap.get(toReplace));
152+
LiteralConstraint subTreeRootConstraint = new LiteralConstraint(subTreeRoot);
153+
LiteralConstraint newLiteral = new LiteralConstraint(featureReplacementMap.get(toReplace));
157154
constraint.replaceConstraintSubPart(subPart, new ParenthesisConstraint(new ImplicationConstraint(subTreeRootConstraint, newLiteral)));
158155
}
159156
} else {

src/main/java/de/vill/conversion/ConvertGroupCardinality.java

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,8 @@ private void removeGroupCardinality(Group group, FeatureModel featureModel) {
4646

4747
Set<Feature> groupMembers = new HashSet<>(group.getFeatures());
4848

49-
int lowerBound = Integer.parseInt(group.getLowerBound());
50-
int upperBound = 0;
51-
if (group.getUpperBound().equals("*")) {
52-
upperBound = groupMembers.size();
53-
} else {
54-
upperBound = Integer.parseInt(group.getUpperBound());
55-
}
56-
49+
int lowerBound = group.getCardinality().lower;
50+
int upperBound = Math.max(group.getCardinality().upper, groupMembers.size());
5751
Set<Set<Feature>> featureCombinations = new HashSet<>();
5852
for (int i = lowerBound; i <= upperBound; i++) {
5953
featureCombinations.addAll(Sets.combinations(groupMembers, i));
@@ -63,18 +57,17 @@ private void removeGroupCardinality(Group group, FeatureModel featureModel) {
6357
disjunction.add(createConjunction(configuration, new HashSet<>(groupMembers)));
6458
}
6559

66-
featureModel.getOwnConstraints().add(new ImplicationConstraint(new LiteralConstraint(group.getParentFeature().getFeatureName()), new ParenthesisConstraint(createDisjunction(disjunction))));
60+
featureModel.getOwnConstraints().add(new ImplicationConstraint(new LiteralConstraint(group.getParentFeature()), new ParenthesisConstraint(createDisjunction(disjunction))));
6761
}
6862

6963
private Constraint createConjunction(Set<Feature> selectedFeatures, Set<Feature> allFeatures) {
7064
Constraint constraint;
7165
Feature feature = null;
72-
if (allFeatures.size() >= 1) {
66+
if (!allFeatures.isEmpty()) {
7367
feature = allFeatures.iterator().next();
7468
allFeatures.remove(feature);
7569
}
76-
Constraint literalConstraint = new LiteralConstraint(feature.getFeatureName());
77-
((LiteralConstraint) literalConstraint).setFeature(feature);
70+
Constraint literalConstraint = new LiteralConstraint(feature);
7871
if (!selectedFeatures.contains(feature)) {
7972
literalConstraint = new NotConstraint(literalConstraint);
8073
}

0 commit comments

Comments
 (0)