Author: cziegeler
Date: Fri Jul 28 13:00:31 2017
New Revision: 1803271
URL: http://svn.apache.org/viewvc?rev=1803271&view=rev
Log:
Start implementing upgrade handling, add initial tests for feature assembling
Added:
sling/whiteboard/cziegeler/feature/src/test/java/org/apache/sling/feature/process/
sling/whiteboard/cziegeler/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java
(with props)
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/base.json
(with props)
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/g-a-1.json
(with props)
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/include-1.json
(with props)
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/result-1.json
(with props)
Modified:
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/Feature.java
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/Requirement.java
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/FeatureJSONReader.java
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/FeatureJSONWriter.java
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/JSONConstants.java
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/FeatureBuilder.java
Modified:
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/Feature.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/Feature.java?rev=1803271&r1=1803270&r2=1803271&view=diff
==============================================================================
---
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/Feature.java
(original)
+++
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/Feature.java
Fri Jul 28 13:00:31 2017
@@ -66,8 +66,15 @@ public class Feature implements Comparab
/** The optional license. */
private volatile String license;
+ /** Is this an upgrade of another feature? */
+ private volatile ArtifactId upgradeOf;
+
+ /** Flag indicating whether this is an assembled feature */
private volatile boolean assembled = false;
+ /** Contained upgrades (this is usually only set for assembled features*/
+ private final List<ArtifactId> upgrades = new ArrayList<>();
+
/**
* Construct a new feature.
* @param id The id of the feature.
@@ -170,6 +177,18 @@ public class Feature implements Comparab
this.license = license;
}
+ public void setUpgradeOf(final ArtifactId id) {
+ this.upgradeOf = id;
+ }
+
+ public ArtifactId getUpgradeOf() {
+ return this.upgradeOf;
+ }
+
+ public List<ArtifactId> getUpgrades() {
+ return this.upgrades;
+ }
+
public boolean isAssembled() {
return assembled;
}
@@ -183,7 +202,11 @@ public class Feature implements Comparab
* @return A copy of the feature
*/
public Feature copy() {
- final Feature result = new Feature(this.getId());
+ return copy(this.getId());
+ }
+
+ public Feature copy(final ArtifactId id) {
+ final Feature result = new Feature(id);
// metadata
result.setLocation(this.getLocation());
Modified:
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/Requirement.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/Requirement.java?rev=1803271&r1=1803270&r2=1803271&view=diff
==============================================================================
---
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/Requirement.java
(original)
+++
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/Requirement.java
Fri Jul 28 13:00:31 2017
@@ -75,9 +75,9 @@ public class Requirement {
public int hashCode() {
final int prime = 31;
int result = 1;
- result = prime * result + ((attributes == null) ? 0 :
attributes.hashCode());
- result = prime * result + ((directives == null) ? 0 :
directives.hashCode());
- result = prime * result + ((namespace == null) ? 0 :
namespace.hashCode());
+ result = prime * result + attributes.hashCode();
+ result = prime * result + directives.hashCode();
+ result = prime * result + namespace.hashCode();
return result;
}
@@ -89,21 +89,12 @@ public class Requirement {
return false;
if (getClass() != obj.getClass())
return false;
- Requirement other = (Requirement) obj;
- if (attributes == null) {
- if (other.attributes != null)
- return false;
- } else if (!attributes.equals(other.attributes))
+ final Requirement other = (Requirement) obj;
+ if (!attributes.equals(other.attributes))
return false;
- if (directives == null) {
- if (other.directives != null)
- return false;
- } else if (!directives.equals(other.directives))
+ if (!directives.equals(other.directives))
return false;
- if (namespace == null) {
- if (other.namespace != null)
- return false;
- } else if (!namespace.equals(other.namespace))
+ if (!namespace.equals(other.namespace))
return false;
return true;
}
Modified:
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/FeatureJSONReader.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/FeatureJSONReader.java?rev=1803271&r1=1803270&r2=1803271&view=diff
==============================================================================
---
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/FeatureJSONReader.java
(original)
+++
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/FeatureJSONReader.java
Fri Jul 28 13:00:31 2017
@@ -131,6 +131,22 @@ public class FeatureJSONReader extends J
this.readRequirements(map);
this.readIncludes(map);
+ if ( map.containsKey(JSONConstants.FEATURE_UPGRADEOF) ) {
+ final Object idObj = map.get(JSONConstants.FEATURE_UPGRADEOF);
+ checkType(JSONConstants.FEATURE_UPGRADEOF, idObj, String.class);
+ this.feature.setUpgradeOf(ArtifactId.fromMvnId(idObj.toString()));
+ }
+ if ( map.containsKey(JSONConstants.FEATURE_UPGRADES) ) {
+ final Object listObj = map.get(JSONConstants.FEATURE_UPGRADES);
+ checkType(JSONConstants.FEATURE_UPGRADES, listObj, List.class);
+ @SuppressWarnings("unchecked")
+ final List<Object> list = (List<Object>) listObj;
+ for(final Object element : list) {
+ checkType(JSONConstants.FEATURE_UPGRADES, element,
String.class);
+
feature.getUpgrades().add(ArtifactId.fromMvnId(element.toString()));
+ }
+
+ }
this.readExtensions(map,
JSONConstants.FEATURE_KNOWN_PROPERTIES,
this.feature.getExtensions(),
this.feature.getConfigurations());
Modified:
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/FeatureJSONWriter.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/FeatureJSONWriter.java?rev=1803271&r1=1803270&r2=1803271&view=diff
==============================================================================
---
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/FeatureJSONWriter.java
(original)
+++
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/FeatureJSONWriter.java
Fri Jul 28 13:00:31 2017
@@ -70,6 +70,20 @@ public class FeatureJSONWriter extends J
writeProperty(w, JSONConstants.FEATURE_VENDOR, feature.getVendor());
writeProperty(w, JSONConstants.FEATURE_LICENSE, feature.getLicense());
+ // upgradeOf
+ if ( feature.getUpgradeOf() != null ) {
+ writeProperty(w, JSONConstants.FEATURE_UPGRADEOF,
feature.getUpgradeOf().toMvnId());
+ }
+
+ // upgrades
+ if ( !feature.getUpgrades().isEmpty() ) {
+ w.writeStartArray(JSONConstants.FEATURE_UPGRADES);
+ for(final ArtifactId id : feature.getUpgrades()) {
+ w.write(id.toMvnId());
+ }
+ w.writeEnd();
+ }
+
// includes
if ( !feature.getIncludes().isEmpty() ) {
w.writeStartArray(JSONConstants.FEATURE_INCLUDES);
Modified:
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/JSONConstants.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/JSONConstants.java?rev=1803271&r1=1803270&r2=1803271&view=diff
==============================================================================
---
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/JSONConstants.java
(original)
+++
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/json/JSONConstants.java
Fri Jul 28 13:00:31 2017
@@ -45,6 +45,10 @@ public abstract class JSONConstants {
public static final String FEATURE_LICENSE = "license";
+ public static final String FEATURE_UPGRADES = "upgrades";
+
+ public static final String FEATURE_UPGRADEOF = "upgradeOf";
+
public static final List<String> FEATURE_KNOWN_PROPERTIES =
Arrays.asList(FEATURE_ID,
FEATURE_BUNDLES,
FEATURE_FRAMEWORK_PROPERTIES,
@@ -55,7 +59,9 @@ public abstract class JSONConstants {
FEATURE_TITLE,
FEATURE_DESCRIPTION,
FEATURE_VENDOR,
- FEATURE_LICENSE);
+ FEATURE_LICENSE,
+ FEATURE_UPGRADES,
+ FEATURE_UPGRADEOF);
public static final String ARTIFACT_ID = "id";
Modified:
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/FeatureBuilder.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/FeatureBuilder.java?rev=1803271&r1=1803270&r2=1803271&view=diff
==============================================================================
---
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/FeatureBuilder.java
(original)
+++
sling/whiteboard/cziegeler/feature/src/main/java/org/apache/sling/feature/process/FeatureBuilder.java
Fri Jul 28 13:00:31 2017
@@ -65,105 +65,53 @@ public class FeatureBuilder {
processedFeatures.add(feature.getId().toMvnId());
// we copy the feature as we set the assembled flag on the result
- final Feature result = feature.copy();
- if ( !feature.getIncludes().isEmpty() ) {
+ final Feature result;
+
+ if ( feature.getUpgradeOf() != null ) {
+ Include found = null;
+ for(final Include inc : feature.getIncludes()) {
+ if ( inc.getId().equals(feature.getUpgradeOf()) ) {
+ found = inc;
+ break;
+ }
+ }
+
+ result = feature.copy(feature.getUpgradeOf());
+
+ // add base as the first include
+ if ( found == null ) {
+ result.getIncludes().add(0, new
Include(feature.getUpgradeOf()));
+ } else {
+ result.getIncludes().remove(found);
+ result.getIncludes().add(0, found);
+ }
+ result.getUpgrades().add(feature.getId());
+ } else {
+ result = feature.copy();
+ }
+
+ if ( !result.getIncludes().isEmpty() ) {
+
+ final List<Include> includes = new
ArrayList<>(result.getIncludes());
// clear everything in the result, will be added in the process
- feature.getBundles().clear();
- feature.getFrameworkProperties().clear();
- feature.getConfigurations().clear();
- feature.getRequirements().clear();
- feature.getCapabilities().clear();
- feature.getIncludes().clear();
- feature.getExtensions().clear();
+ result.getBundles().clear();
+ result.getFrameworkProperties().clear();
+ result.getConfigurations().clear();
+ result.getRequirements().clear();
+ result.getCapabilities().clear();
+ result.getIncludes().clear();
+ result.getExtensions().clear();
- for(final Include i : feature.getIncludes()) {
+ for(final Include i : includes) {
final Feature f = provider.provide(i.getId());
if ( f == null ) {
throw new IllegalStateException("Unable to find included
feature " + i.getId());
}
- final Feature af = internalAssemble(processedFeatures,
feature, provider);
-
- // process removals
- // bundles
- for(final ArtifactId a : i.getBundleRemovals()) {
- af.getBundles().removeExact(a);
- final Iterator<Configuration> iter =
af.getConfigurations().iterator();
- while ( iter.hasNext() ) {
- final Configuration cfg = iter.next();
- final String bundleId =
(String)cfg.getProperties().get(Configuration.PROP_ARTIFACT);
- if ( a.toMvnId().equals(bundleId) ) {
- iter.remove();
- }
- }
- }
- // configurations
- for(final String c : i.getConfigurationRemovals()) {
- final int attrPos = c.indexOf('@');
- final String val = (attrPos == -1 ? c : c.substring(0,
attrPos));
- final String attr = (attrPos == -1 ? null :
c.substring(attrPos + 1));
-
- final int sepPos = val.indexOf('~');
- Configuration found = null;
- if ( sepPos == -1 ) {
- for(final Configuration cfg : af.getConfigurations()) {
- if ( !cfg.isFactoryConfiguration() &&
val.equals(cfg.getPid()) ) {
- found = cfg;
- break;
- }
- }
+ final Feature af = internalAssemble(processedFeatures, f,
provider);
- } else {
- final String factoryPid = val.substring(0, sepPos);
- final String name = val.substring(sepPos + 1);
-
- for(final Configuration cfg : af.getConfigurations()) {
- if ( cfg.isFactoryConfiguration()
- && factoryPid.equals(cfg.getFactoryPid())
- && name.equals(cfg.getName()) ) {
- found = cfg;
- break;
- }
- }
- }
- if ( found != null ) {
- if ( attr == null ) {
- af.getConfigurations().remove(found);
- } else {
- found.getProperties().remove(attr);
- }
- }
- }
-
- // framework properties
- for(final String p : i.getFrameworkPropertiesRemovals()) {
- af.getFrameworkProperties().remove(p);
- }
-
- // extensions
- for(final String name : i.getExtensionRemovals()) {
- for(final Extension ext : af.getExtensions()) {
- if ( ext.getName().equals(name) ) {
- af.getExtensions().remove(ext);
- break;
- }
- }
- }
- for(final Map.Entry<String, List<ArtifactId>> entry :
i.getArtifactExtensionRemovals().entrySet()) {
- for(final Extension ext : af.getExtensions()) {
- if ( ext.getName().equals(entry.getKey()) ) {
- for(final ArtifactId id : entry.getValue() ) {
- for(final Artifact a : ext.getArtifacts()) {
- if ( a.getId().equals(id) ) {
- ext.getArtifacts().remove(a);
- break;
- }
- }
- }
- break;
- }
- }
- }
+ // process include instructions
+ include(af, i);
// and now merge
merge(result, af);
@@ -303,5 +251,88 @@ public class FeatureBuilder {
}
}
}
+ }
+
+ private static void include(final Feature base, final Include i) {
+ // process removals
+ // bundles
+ for(final ArtifactId a : i.getBundleRemovals()) {
+ base.getBundles().removeExact(a);
+ final Iterator<Configuration> iter =
base.getConfigurations().iterator();
+ while ( iter.hasNext() ) {
+ final Configuration cfg = iter.next();
+ final String bundleId =
(String)cfg.getProperties().get(Configuration.PROP_ARTIFACT);
+ if ( a.toMvnId().equals(bundleId) ) {
+ iter.remove();
+ }
+ }
+ }
+ // configurations
+ for(final String c : i.getConfigurationRemovals()) {
+ final int attrPos = c.indexOf('@');
+ final String val = (attrPos == -1 ? c : c.substring(0, attrPos));
+ final String attr = (attrPos == -1 ? null : c.substring(attrPos +
1));
+
+ final int sepPos = val.indexOf('~');
+ Configuration found = null;
+ if ( sepPos == -1 ) {
+ for(final Configuration cfg : base.getConfigurations()) {
+ if ( !cfg.isFactoryConfiguration() &&
val.equals(cfg.getPid()) ) {
+ found = cfg;
+ break;
+ }
+ }
+
+ } else {
+ final String factoryPid = val.substring(0, sepPos);
+ final String name = val.substring(sepPos + 1);
+
+ for(final Configuration cfg : base.getConfigurations()) {
+ if ( cfg.isFactoryConfiguration()
+ && factoryPid.equals(cfg.getFactoryPid())
+ && name.equals(cfg.getName()) ) {
+ found = cfg;
+ break;
+ }
+ }
+ }
+ if ( found != null ) {
+ if ( attr == null ) {
+ base.getConfigurations().remove(found);
+ } else {
+ found.getProperties().remove(attr);
+ }
+ }
+ }
+
+ // framework properties
+ for(final String p : i.getFrameworkPropertiesRemovals()) {
+ base.getFrameworkProperties().remove(p);
+ }
+
+ // extensions
+ for(final String name : i.getExtensionRemovals()) {
+ for(final Extension ext : base.getExtensions()) {
+ if ( ext.getName().equals(name) ) {
+ base.getExtensions().remove(ext);
+ break;
+ }
+ }
+ }
+ for(final Map.Entry<String, List<ArtifactId>> entry :
i.getArtifactExtensionRemovals().entrySet()) {
+ for(final Extension ext : base.getExtensions()) {
+ if ( ext.getName().equals(entry.getKey()) ) {
+ for(final ArtifactId id : entry.getValue() ) {
+ for(final Artifact a : ext.getArtifacts()) {
+ if ( a.getId().equals(id) ) {
+ ext.getArtifacts().remove(a);
+ break;
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
}
}
Added:
sling/whiteboard/cziegeler/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java?rev=1803271&view=auto
==============================================================================
---
sling/whiteboard/cziegeler/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java
(added)
+++
sling/whiteboard/cziegeler/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java
Fri Jul 28 13:00:31 2017
@@ -0,0 +1,174 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.feature.process;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.sling.feature.Artifact;
+import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Capability;
+import org.apache.sling.feature.Configuration;
+import org.apache.sling.feature.Extension;
+import org.apache.sling.feature.Feature;
+import org.apache.sling.feature.Requirement;
+import org.apache.sling.feature.json.U;
+import org.junit.Test;
+
+public class FeatureBuilderTest {
+
+ private final FeatureProvider provider = new FeatureProvider() {
+
+ @Override
+ public Feature provide(final ArtifactId id) {
+ try {
+ return U.readFeature("process/" + id.getGroupId() + "-" +
id.getArtifactId() + "-" + id.getVersion());
+ } catch (Exception e) {
+ return null;
+ }
+ }
+ };
+
+ private List<Map.Entry<Integer, Artifact>> getBundles(final Feature f) {
+ final List<Map.Entry<Integer, Artifact>> result = new ArrayList<>();
+ for(final Map.Entry<Integer, Artifact> entry : f.getBundles()) {
+ result.add(entry);
+ }
+ return result;
+ }
+
+ private void equals(final Feature expected, final Feature actuals) {
+ assertFalse(expected.isAssembled());
+ assertTrue(actuals.isAssembled());
+
+ assertEquals(expected.getId(), actuals.getId());
+ assertEquals(expected.getTitle(), actuals.getTitle());
+ assertEquals(expected.getDescription(), actuals.getDescription());
+ assertEquals(expected.getVendor(), actuals.getVendor());
+ assertEquals(expected.getLicense(), actuals.getLicense());
+ assertEquals(expected.getUpgradeOf(), actuals.getUpgradeOf());
+ assertEquals(expected.getUpgrades(), actuals.getUpgrades());
+
+ // bundles
+ final List<Map.Entry<Integer, Artifact>> expectedBundles =
getBundles(expected);
+ final List<Map.Entry<Integer, Artifact>> actualsBundles =
getBundles(actuals);
+ assertEquals(expectedBundles.size(), actualsBundles.size());
+ for(final Map.Entry<Integer, Artifact> entry : expectedBundles) {
+ boolean found = false;
+ for(final Map.Entry<Integer, Artifact> inner : actualsBundles) {
+ if ( inner.getValue().getId().equals(entry.getValue().getId())
) {
+ found = true;
+ assertEquals("Startlevel of bundle " + entry.getValue(),
entry.getKey(), inner.getKey());
+ assertEquals("Metadata of bundle " + entry.getValue(),
entry.getValue().getMetadata(), inner.getValue().getMetadata());
+ break;
+ }
+ }
+ assertTrue("Bundle " + entry.getValue() + " in level " +
entry.getKey(), found);
+ }
+
+ // configurations
+ assertEquals(expected.getConfigurations().size(),
actuals.getConfigurations().size());
+ for(final Configuration cfg : expected.getConfigurations()) {
+ final Configuration found = (cfg.isFactoryConfiguration() ?
actuals.getConfigurations().getFactoryConfiguration(cfg.getFactoryPid(),
cfg.getName())
+ :
actuals.getConfigurations().getConfiguration(cfg.getPid()));
+ assertNotNull("Configuration " + cfg, found);
+ assertEquals("Configuration " + cfg, cfg.getProperties(),
found.getProperties());
+ }
+
+ // frameworkProperties
+ assertEquals(expected.getFrameworkProperties(),
actuals.getFrameworkProperties());
+
+ // requirements
+ assertEquals(expected.getRequirements().size(),
actuals.getRequirements().size());
+ for(final Requirement r : expected.getRequirements()) {
+ boolean found = false;
+ for(final Requirement i : actuals.getRequirements()) {
+ if ( r.equals(i) ) {
+ found = true;
+ break;
+ }
+ }
+ assertTrue(found);
+ }
+
+ // capabilities
+ assertEquals(expected.getCapabilities().size(),
actuals.getCapabilities().size());
+ for(final Capability r : expected.getCapabilities()) {
+ boolean found = false;
+ for(final Capability i : actuals.getCapabilities()) {
+ if ( r.equals(i) ) {
+ found = true;
+ break;
+ }
+ }
+ assertTrue(found);
+ }
+
+ // extensions
+ assertEquals(expected.getExtensions().size(),
actuals.getExtensions().size());
+ for(final Extension ext : expected.getExtensions()) {
+ final Extension inner =
actuals.getExtensions().getByName(ext.getName());
+ assertNotNull(inner);
+ assertEquals(ext.getType(), inner.getType());
+ switch ( ext.getType()) {
+ case JSON : assertEquals(ext.getJSON(), inner.getJSON());
+ break;
+ case TEXT : assertEquals(ext.getText(), inner.getText());
+ break;
+ case ARTIFACTS : assertEquals(ext.getArtifacts().size(),
inner.getArtifacts().size());
+ for(final Artifact art : ext.getArtifacts()) {
+ boolean found = false;
+ for(final Artifact i :
inner.getArtifacts()) {
+ if ( art.getId().equals(i.getId()) ) {
+ found = true;
+ assertEquals(art.getMetadata(),
i.getMetadata());
+ break;
+ }
+ }
+ assertTrue(found);
+ }
+ }
+ }
+
+ // includes should always be empty
+ assertTrue(actuals.getIncludes().isEmpty());
+ }
+
+ @Test public void testNoIncludesNoUpgrade() throws Exception {
+ final Feature base = U.readFeature("process/base");
+ assertFalse(base.isAssembled());
+
+ final Feature assembled = FeatureBuilder.assemble(base, provider);
+
+ equals(base, assembled);
+ }
+
+ @Test public void testSingleInclude() throws Exception {
+ final Feature base = U.readFeature("process/include-1");
+ assertFalse(base.isAssembled());
+
+ final Feature assembled = FeatureBuilder.assemble(base, provider);
+
+ equals(U.readFeature("process/result-1"), assembled);
+ }
+}
Propchange:
sling/whiteboard/cziegeler/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/whiteboard/cziegeler/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Added:
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/base.json
URL:
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/test/resources/features/process/base.json?rev=1803271&view=auto
==============================================================================
---
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/base.json
(added)
+++
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/base.json
Fri Jul 28 13:00:31 2017
@@ -0,0 +1,61 @@
+{
+ "id" : "org.apache.sling/test-feature/1.1",
+
+ "requirements" : [
+ {
+ "namespace" : "osgi.contract",
+ "directives" : {
+ "filter" : "(&(osgi.contract=JavaServlet)(version=3.1))"
+ }
+ }
+ ],
+ "capabilities" : [
+ {
+ "namespace" : "osgi.implementation",
+ "attributes" : {
+ "osgi.implementation" : "osgi.http",
+ "version:Version" : "1.1"
+ },
+ "directives" : {
+ "uses" :
"javax.servlet,javax.servlet.http,org.osgi.service.http.context,org.osgi.service.http.whiteboard"
+ }
+ },
+ {
+ "namespace" : "osgi.service",
+ "attributes" : {
+ "objectClass:List<String>" :
"org.osgi.service.http.runtime.HttpServiceRuntime"
+ },
+ "directives" : {
+ "uses" :
"org.osgi.service.http.runtime,org.osgi.service.http.runtime.dto"
+ }
+ }
+ ],
+ "framework-properties" : {
+ "foo" : 1,
+ "brave" : "something",
+ "org.apache.felix.scr.directory" : "launchpad/scr"
+ },
+ "bundles" : {
+ "1" : [
+ {
+ "id" : "org.apache.sling/oak-server/1.0.0",
+ "hash" : "4632463464363646436"
+ },
+ "org.apache.sling/application-bundle/2.0.0",
+ "org.apache.sling/another-bundle/2.1.0"
+ ],
+ "2" : [
+ "org.apache.sling/foo-xyz/1.2.3"
+ ]
+ },
+ "configurations" : {
+ "my.pid" : {
+ "foo" : 5,
+ "bar" : "test",
+ "number:Integer" : 7
+ },
+ "my.factory.pid~name" : {
+ "a.value" : "yeah"
+ }
+ }
+}
\ No newline at end of file
Propchange:
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/base.json
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/base.json
------------------------------------------------------------------------------
svn:keywords = Id
Added:
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/g-a-1.json
URL:
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/test/resources/features/process/g-a-1.json?rev=1803271&view=auto
==============================================================================
---
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/g-a-1.json
(added)
+++
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/g-a-1.json
Fri Jul 28 13:00:31 2017
@@ -0,0 +1,18 @@
+{
+ "id" : "g/a/1",
+
+ "framework-properties" : {
+ "foo" : 2,
+ "bar" : "X"
+ },
+ "bundles" : {
+ "3" : [
+ "org.apache.sling/foo-bar/4.5.6"
+ ]
+ },
+ "configurations" : {
+ "org.apache.sling.foo" : {
+ "prop" : "value"
+ }
+ }
+}
\ No newline at end of file
Propchange:
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/g-a-1.json
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/g-a-1.json
------------------------------------------------------------------------------
svn:keywords = Id
Added:
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/include-1.json
URL:
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/test/resources/features/process/include-1.json?rev=1803271&view=auto
==============================================================================
---
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/include-1.json
(added)
+++
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/include-1.json
Fri Jul 28 13:00:31 2017
@@ -0,0 +1,74 @@
+{
+ "id" : "org.apache.sling/test-feature/1.1",
+
+ "includes" : [
+ {
+ "id" : "g/a/1",
+ "removals" : {
+ "configurations" : [
+ ],
+ "bundles" : [
+ ],
+ "framework-properties" : [
+ ]
+ }
+ }
+ ],
+ "requirements" : [
+ {
+ "namespace" : "osgi.contract",
+ "directives" : {
+ "filter" : "(&(osgi.contract=JavaServlet)(version=3.1))"
+ }
+ }
+ ],
+ "capabilities" : [
+ {
+ "namespace" : "osgi.implementation",
+ "attributes" : {
+ "osgi.implementation" : "osgi.http",
+ "version:Version" : "1.1"
+ },
+ "directives" : {
+ "uses" :
"javax.servlet,javax.servlet.http,org.osgi.service.http.context,org.osgi.service.http.whiteboard"
+ }
+ },
+ {
+ "namespace" : "osgi.service",
+ "attributes" : {
+ "objectClass:List<String>" :
"org.osgi.service.http.runtime.HttpServiceRuntime"
+ },
+ "directives" : {
+ "uses" :
"org.osgi.service.http.runtime,org.osgi.service.http.runtime.dto"
+ }
+ }
+ ],
+ "framework-properties" : {
+ "foo" : 1,
+ "brave" : "something",
+ "org.apache.felix.scr.directory" : "launchpad/scr"
+ },
+ "bundles" : {
+ "1" : [
+ {
+ "id" : "org.apache.sling/oak-server/1.0.0",
+ "hash" : "4632463464363646436"
+ },
+ "org.apache.sling/application-bundle/2.0.0",
+ "org.apache.sling/another-bundle/2.1.0"
+ ],
+ "2" : [
+ "org.apache.sling/foo-xyz/1.2.3"
+ ]
+ },
+ "configurations" : {
+ "my.pid" : {
+ "foo" : 5,
+ "bar" : "test",
+ "number:Integer" : 7
+ },
+ "my.factory.pid~name" : {
+ "a.value" : "yeah"
+ }
+ }
+}
\ No newline at end of file
Propchange:
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/include-1.json
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/include-1.json
------------------------------------------------------------------------------
svn:keywords = Id
Added:
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/result-1.json
URL:
http://svn.apache.org/viewvc/sling/whiteboard/cziegeler/feature/src/test/resources/features/process/result-1.json?rev=1803271&view=auto
==============================================================================
---
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/result-1.json
(added)
+++
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/result-1.json
Fri Jul 28 13:00:31 2017
@@ -0,0 +1,68 @@
+{
+ "id" : "org.apache.sling/test-feature/1.1",
+
+ "requirements" : [
+ {
+ "namespace" : "osgi.contract",
+ "directives" : {
+ "filter" : "(&(osgi.contract=JavaServlet)(version=3.1))"
+ }
+ }
+ ],
+ "capabilities" : [
+ {
+ "namespace" : "osgi.implementation",
+ "attributes" : {
+ "osgi.implementation" : "osgi.http",
+ "version:Version" : "1.1"
+ },
+ "directives" : {
+ "uses" :
"javax.servlet,javax.servlet.http,org.osgi.service.http.context,org.osgi.service.http.whiteboard"
+ }
+ },
+ {
+ "namespace" : "osgi.service",
+ "attributes" : {
+ "objectClass:List<String>" :
"org.osgi.service.http.runtime.HttpServiceRuntime"
+ },
+ "directives" : {
+ "uses" :
"org.osgi.service.http.runtime,org.osgi.service.http.runtime.dto"
+ }
+ }
+ ],
+ "framework-properties" : {
+ "foo" : 1,
+ "brave" : "something",
+ "org.apache.felix.scr.directory" : "launchpad/scr",
+ "bar" : "X"
+ },
+ "bundles" : {
+ "1" : [
+ {
+ "id" : "org.apache.sling/oak-server/1.0.0",
+ "hash" : "4632463464363646436"
+ },
+ "org.apache.sling/application-bundle/2.0.0",
+ "org.apache.sling/another-bundle/2.1.0"
+ ],
+ "2" : [
+ "org.apache.sling/foo-xyz/1.2.3"
+ ],
+ "3" : [
+ "org.apache.sling/foo-bar/4.5.6"
+ ]
+ },
+ "configurations" : {
+ "my.pid" : {
+ "foo" : 5,
+ "bar" : "test",
+ "number:Integer" : 7
+ },
+ "my.factory.pid~name" : {
+ "a.value" : "yeah"
+ },
+ "org.apache.sling.foo" : {
+ "prop" : "value"
+ }
+ }
+}
\ No newline at end of file
Propchange:
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/result-1.json
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sling/whiteboard/cziegeler/feature/src/test/resources/features/process/result-1.json
------------------------------------------------------------------------------
svn:keywords = Id