This is an automated email from the ASF dual-hosted git repository.
cziegeler pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature.git
The following commit(s) were added to refs/heads/master by this push:
new 91080fa SLING-9260 : Aggregation of features might modify source
extension
91080fa is described below
commit 91080fa7544dbea0a8f5b28c6cbc63cfeccf847e
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Thu Mar 26 11:33:10 2020 +0100
SLING-9260 : Aggregation of features might modify source extension
---
.../apache/sling/feature/builder/BuilderUtil.java | 4 +--
.../sling/feature/builder/FeatureBuilderTest.java | 37 ++++++++++++++++++++++
2 files changed, 39 insertions(+), 2 deletions(-)
diff --git a/src/main/java/org/apache/sling/feature/builder/BuilderUtil.java
b/src/main/java/org/apache/sling/feature/builder/BuilderUtil.java
index 2154cd0..c79cfd8 100644
--- a/src/main/java/org/apache/sling/feature/builder/BuilderUtil.java
+++ b/src/main/java/org/apache/sling/feature/builder/BuilderUtil.java
@@ -663,8 +663,8 @@ class BuilderUtil {
}
}
if ( !handled ) {
- // no merge handler, just add
- target.getExtensions().add(ext);
+ // no merge handler, just add a copy
+ target.getExtensions().add(ext.copy());
}
}
}
diff --git
a/src/test/java/org/apache/sling/feature/builder/FeatureBuilderTest.java
b/src/test/java/org/apache/sling/feature/builder/FeatureBuilderTest.java
index 4411dc7..e9da31a 100644
--- a/src/test/java/org/apache/sling/feature/builder/FeatureBuilderTest.java
+++ b/src/test/java/org/apache/sling/feature/builder/FeatureBuilderTest.java
@@ -1073,6 +1073,43 @@ public class FeatureBuilderTest {
assertEquals(test, c);
}
+ /**
+ * Merge three features. First feature has no extension, second and third
have.
+ * Make sure that the extension of the second feature is not modified.
+ * Then use the aggregated result and merge another feature into it and
+ * merge sure thet the extension of the first aggregation is not modified
+ * (see SLING-9260)
+ */
+ @Test public void testCopyOfExtensionWhenMerging() {
+ final Feature f1 = new Feature(ArtifactId.parse("g/a/1"));
+
+ final Feature f2 = new Feature(ArtifactId.parse("g/b/1"));
+ Extension e2 = new Extension(ExtensionType.TEXT,
Extension.EXTENSION_NAME_REPOINIT, ExtensionState.REQUIRED);
+ e2.setText("line2");
+ f2.getExtensions().add(e2);
+
+ final Feature f3 = new Feature(ArtifactId.parse("g/c/1"));
+ Extension e3 = new Extension(ExtensionType.TEXT,
Extension.EXTENSION_NAME_REPOINIT, ExtensionState.REQUIRED);
+ e3.setText("line3");
+ f3.getExtensions().add(e3);
+
+ final BuilderContext bc = new BuilderContext(provider);
+ final Feature f = FeatureBuilder.assemble(ArtifactId.parse("f/f/1"),
bc, f1, f2, f3);
+ assertEquals("line2\nline3",
f.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT).getText());
+
+ // e2 is not modified
+ assertEquals("line2", e2.getText());
+
+ final Feature f4 = new Feature(ArtifactId.parse("g/c/1"));
+ Extension e4 = new Extension(ExtensionType.TEXT,
Extension.EXTENSION_NAME_REPOINIT, ExtensionState.REQUIRED);
+ e4.setText("line4");
+ f4.getExtensions().add(e4);
+
+ final Feature ff = FeatureBuilder.assemble(ArtifactId.parse("f/g/1"),
bc, f, f4);
+ assertEquals("line2\nline3\nline4",
ff.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT).getText());
+ assertEquals("line2\nline3",
f.getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT).getText());
+ }
+
private static class MatchingRequirementImpl extends RequirementImpl
implements MatchingRequirement {
public MatchingRequirementImpl(Resource res, String ns, Map<String,
String> dirs, Map<String, Object> attrs) {