You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2018/01/18 15:14:55 UTC
[sling-whiteboard] branch master updated: Start changing start
level handling to start order handling
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-whiteboard.git
The following commit(s) were added to refs/heads/master by this push:
new b31328c Start changing start level handling to start order handling
b31328c is described below
commit b31328ce69015b16c9bdbb52e48be3b6e031d6de
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Thu Jan 18 16:14:50 2018 +0100
Start changing start level handling to start order handling
---
.../sling/feature/analyser/service/Scanner.java | 2 +-
.../feature/applicationbuilder/impl/Main.java | 22 +-
.../sling/feature/karaf/KarafFeatureWriter.java | 24 +--
.../feature/launcher/impl/FeatureProcessor.java | 2 +-
.../sling/feature/modelconverter/impl/Main.java | 11 +-
.../sling/feature/support/json/JSONReaderBase.java | 5 +-
.../sling/feature/support/json/JSONWriterBase.java | 23 ++-
.../java/org/apache/sling/feature/Artifact.java | 3 +
.../java/org/apache/sling/feature/Bundles.java | 221 ++++++++++-----------
.../java/org/apache/sling/feature/Feature.java | 9 +-
.../apache/sling/feature/process/BuilderUtil.java | 4 +-
.../java/org/apache/sling/feature/BundlesTest.java | 30 ++-
.../sling/feature/process/BuilderUtilTest.java | 64 ++++--
.../sling/feature/process/FeatureBuilderTest.java | 62 ++++--
.../apache/sling/feature/maven/Preprocessor.java | 25 +--
15 files changed, 271 insertions(+), 236 deletions(-)
diff --git a/featuremodel/feature-analyser/src/main/java/org/apache/sling/feature/analyser/service/Scanner.java b/featuremodel/feature-analyser/src/main/java/org/apache/sling/feature/analyser/service/Scanner.java
index 4b2e5a6..e60ad58 100644
--- a/featuremodel/feature-analyser/src/main/java/org/apache/sling/feature/analyser/service/Scanner.java
+++ b/featuremodel/feature-analyser/src/main/java/org/apache/sling/feature/analyser/service/Scanner.java
@@ -130,7 +130,7 @@ public class Scanner {
*/
private void getBundleInfos(final Bundles bundles, final ContainerDescriptor desc)
throws IOException {
- for(final Map.Entry<Integer, List<Artifact>> entry : bundles.getBundlesByStartLevel().entrySet()) {
+ for(final Map.Entry<Integer, List<Artifact>> entry : bundles.getBundlesByStartOrder().entrySet()) {
for(final Artifact bundle : entry.getValue() ) {
final BundleDescriptor bundleDesc = scan(bundle, entry.getKey());
desc.getBundleDescriptors().add(bundleDesc);
diff --git a/featuremodel/feature-applicationbuilder/src/main/java/org/apache/sling/feature/applicationbuilder/impl/Main.java b/featuremodel/feature-applicationbuilder/src/main/java/org/apache/sling/feature/applicationbuilder/impl/Main.java
index 232c99b..9964a3e 100644
--- a/featuremodel/feature-applicationbuilder/src/main/java/org/apache/sling/feature/applicationbuilder/impl/Main.java
+++ b/featuremodel/feature-applicationbuilder/src/main/java/org/apache/sling/feature/applicationbuilder/impl/Main.java
@@ -17,17 +17,8 @@
package org.apache.sling.feature.applicationbuilder.impl;
import java.io.File;
-import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.cli.CommandLine;
@@ -38,19 +29,10 @@ import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.sling.feature.Application;
import org.apache.sling.feature.ArtifactId;
-import org.apache.sling.feature.Bundles;
-import org.apache.sling.feature.Configurations;
-import org.apache.sling.feature.Extension;
-import org.apache.sling.feature.ExtensionType;
-import org.apache.sling.feature.Extensions;
-import org.apache.sling.feature.KeyValueMap;
-import org.apache.sling.feature.support.ArtifactHandler;
import org.apache.sling.feature.support.ArtifactManager;
import org.apache.sling.feature.support.ArtifactManagerConfig;
import org.apache.sling.feature.support.FeatureUtil;
-import org.apache.sling.feature.support.json.ApplicationJSONReader;
import org.apache.sling.feature.support.json.ApplicationJSONWriter;
-import org.apache.sling.feature.support.json.FeatureJSONWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -188,7 +170,9 @@ public class Main {
}
private static Application buildApplication(final Application app) {
- app.getBundles().add(1, new org.apache.sling.feature.Artifact(ArtifactId.parse("org.apache.sling/org.apache.sling.launchpad.api/1.2.0")));
+ final org.apache.sling.feature.Artifact a = new org.apache.sling.feature.Artifact(ArtifactId.parse("org.apache.sling/org.apache.sling.launchpad.api/1.2.0"));
+ a.getMetadata().put(org.apache.sling.feature.Artifact.KEY_START_ORDER, "1");
+ app.getBundles().add(a);
// sling.properties (TODO)
if ( propsFile == null ) {
app.getFrameworkProperties().put("org.osgi.framework.bootdelegation", "sun.*,com.sun.*");
diff --git a/featuremodel/feature-karaf/src/main/java/org/apache/sling/feature/karaf/KarafFeatureWriter.java b/featuremodel/feature-karaf/src/main/java/org/apache/sling/feature/karaf/KarafFeatureWriter.java
index 7402f04..d2e805a 100644
--- a/featuremodel/feature-karaf/src/main/java/org/apache/sling/feature/karaf/KarafFeatureWriter.java
+++ b/featuremodel/feature-karaf/src/main/java/org/apache/sling/feature/karaf/KarafFeatureWriter.java
@@ -16,16 +16,6 @@
*/
package org.apache.sling.feature.karaf;
-import org.apache.sling.feature.Artifact;
-import org.apache.sling.feature.ArtifactId;
-import org.apache.sling.feature.Configuration;
-import org.apache.sling.feature.Configurations;
-import org.apache.sling.feature.Extension;
-import org.apache.sling.feature.Feature;
-import org.apache.sling.feature.support.ArtifactHandler;
-import org.apache.sling.feature.support.ArtifactManager;
-import org.apache.sling.feature.support.ConfigurationUtil;
-
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -41,6 +31,16 @@ import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
+import org.apache.sling.feature.Artifact;
+import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Configuration;
+import org.apache.sling.feature.Configurations;
+import org.apache.sling.feature.Extension;
+import org.apache.sling.feature.Feature;
+import org.apache.sling.feature.support.ArtifactHandler;
+import org.apache.sling.feature.support.ArtifactManager;
+import org.apache.sling.feature.support.ConfigurationUtil;
+
/**
* This writer writes out a Karaf feature XML.
@@ -99,7 +99,7 @@ public class KarafFeatureWriter {
jos.closeEntry();
- for(final Map.Entry<Integer, List<Artifact>> entry : feature.getBundles().getBundlesByStartLevel().entrySet()) {
+ for(final Map.Entry<Integer, List<Artifact>> entry : feature.getBundles().getBundlesByStartOrder().entrySet()) {
for(final Artifact artifact : entry.getValue()) {
final ArtifactHandler handler = artifactManager.getArtifactHandler(artifact.getId().toMvnUrl());
@@ -180,7 +180,7 @@ public class KarafFeatureWriter {
}
// bundles
- for(final Map.Entry<Integer, List<Artifact>> entry : feature.getBundles().getBundlesByStartLevel().entrySet()) {
+ for(final Map.Entry<Integer, List<Artifact>> entry : feature.getBundles().getBundlesByStartOrder().entrySet()) {
for(final Artifact artifact : entry.getValue()) {
w.print(" <bundle start-level=\"");
w.print(entry.getKey().toString());
diff --git a/featuremodel/feature-launcher/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java b/featuremodel/feature-launcher/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java
index 14eaf9c..16c244b 100644
--- a/featuremodel/feature-launcher/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java
+++ b/featuremodel/feature-launcher/src/main/java/org/apache/sling/feature/launcher/impl/FeatureProcessor.java
@@ -85,7 +85,7 @@ public class FeatureProcessor {
public static void prepareLauncher(final LauncherConfig config,
final ArtifactManager artifactManager,
final Application app) throws Exception {
- for(final Map.Entry<Integer, List<Artifact>> entry : app.getBundles().getBundlesByStartLevel().entrySet()) {
+ for(final Map.Entry<Integer, List<Artifact>> entry : app.getBundles().getBundlesByStartOrder().entrySet()) {
for(final Artifact a : entry.getValue()) {
final ArtifactHandler handler = artifactManager.getArtifactHandler(":" + a.getId().toMvnPath());
final File artifactFile = handler.getFile();
diff --git a/featuremodel/feature-modelconverter/src/main/java/org/apache/sling/feature/modelconverter/impl/Main.java b/featuremodel/feature-modelconverter/src/main/java/org/apache/sling/feature/modelconverter/impl/Main.java
index ff88255..fedd964 100644
--- a/featuremodel/feature-modelconverter/src/main/java/org/apache/sling/feature/modelconverter/impl/Main.java
+++ b/featuremodel/feature-modelconverter/src/main/java/org/apache/sling/feature/modelconverter/impl/Main.java
@@ -28,7 +28,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.stream.Collectors;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
@@ -271,7 +270,7 @@ public class Main {
for(final Feature feature : model.getFeatures() ) {
final String idString;
- // use a default name if not present or not usable as a Maven artifactId ( starts with ':')
+ // use a default name if not present or not usable as a Maven artifactId ( starts with ':')
if ( feature.getName() != null && !feature.isSpecial() ) {
if ( feature.getVersion() != null ) {
idString = "generated/" + feature.getName() + "/" + feature.getVersion();
@@ -298,7 +297,8 @@ public class Main {
}
// hard coded dependency to launchpad api
- app.getBundles().add(1, new org.apache.sling.feature.Artifact(ArtifactId.parse("org.apache.sling/org.apache.sling.launchpad.api/1.2.0")));
+ final org.apache.sling.feature.Artifact a = new org.apache.sling.feature.Artifact(ArtifactId.parse("org.apache.sling/org.apache.sling.launchpad.api/1.2.0"));
+ a.getMetadata().put(org.apache.sling.feature.Artifact.KEY_START_ORDER, "1");
// sling.properties (TODO)
if ( propsFile == null ) {
app.getFrameworkProperties().put("org.osgi.framework.bootdelegation", "sun.*,com.sun.*");
@@ -340,7 +340,8 @@ public class Main {
} else if ( startLevel == 0 ) {
startLevel = 20;
}
- bundles.add(startLevel, newArtifact);
+ newArtifact.getMetadata().put(org.apache.sling.feature.Artifact.KEY_START_ORDER, String.valueOf(startLevel));
+ bundles.add(newArtifact);
}
}
}
@@ -655,7 +656,7 @@ public class Main {
final Feature f = new Feature("application");
// bundles
- for(final Map.Entry<Integer, org.apache.sling.feature.Artifact> bundle : app.getBundles()) {
+ for(final Map.Entry<Integer, org.apache.sling.feature.Artifact> bundle : app.getBundles().getAllBundles()) {
final ArtifactId id = bundle.getValue().getId();
final Artifact newBundle = new Artifact(id.getGroupId(), id.getArtifactId(), id.getVersion(), id.getClassifier(), id.getType());
for(final Map.Entry<String, String> prop : bundle.getValue().getMetadata()) {
diff --git a/featuremodel/feature-support/src/main/java/org/apache/sling/feature/support/json/JSONReaderBase.java b/featuremodel/feature-support/src/main/java/org/apache/sling/feature/support/json/JSONReaderBase.java
index 39015ee..36df699 100644
--- a/featuremodel/feature-support/src/main/java/org/apache/sling/feature/support/json/JSONReaderBase.java
+++ b/featuremodel/feature-support/src/main/java/org/apache/sling/feature/support/json/JSONReaderBase.java
@@ -122,7 +122,10 @@ abstract class JSONReaderBase {
if ( container.containsSame(a.getId()) ) {
throw new IOException(exceptionPrefix + "Duplicate bundle " + a.getId().toMvnId());
}
- container.add(startLevel, a);
+ if ( startLevel != 0 ) {
+ a.getMetadata().put(Artifact.KEY_START_ORDER, startLevelVal);
+ }
+ container.add(a);
}
}
}
diff --git a/featuremodel/feature-support/src/main/java/org/apache/sling/feature/support/json/JSONWriterBase.java b/featuremodel/feature-support/src/main/java/org/apache/sling/feature/support/json/JSONWriterBase.java
index 40c8c7c..7fae7d3 100644
--- a/featuremodel/feature-support/src/main/java/org/apache/sling/feature/support/json/JSONWriterBase.java
+++ b/featuremodel/feature-support/src/main/java/org/apache/sling/feature/support/json/JSONWriterBase.java
@@ -16,6 +16,16 @@
*/
package org.apache.sling.feature.support.json;
+import java.io.StringReader;
+import java.lang.reflect.Array;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+
+import javax.json.Json;
+import javax.json.JsonStructure;
+import javax.json.stream.JsonGenerator;
+
import org.apache.sling.feature.Artifact;
import org.apache.sling.feature.Bundles;
import org.apache.sling.feature.Configuration;
@@ -24,15 +34,6 @@ import org.apache.sling.feature.Extension;
import org.apache.sling.feature.ExtensionType;
import org.apache.sling.feature.KeyValueMap;
-import javax.json.Json;
-import javax.json.JsonStructure;
-import javax.json.stream.JsonGenerator;
-import java.io.StringReader;
-import java.lang.reflect.Array;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
-
/**
* Common functionality for writing JSON
@@ -44,9 +45,9 @@ abstract class JSONWriterBase {
final Bundles bundles,
final Configurations allConfigs) {
// bundles
- if ( !bundles.getBundlesByStartLevel().isEmpty() ) {
+ if ( !bundles.getBundlesByStartOrder().isEmpty() ) {
w.writeStartObject(JSONConstants.FEATURE_BUNDLES);
- for(final Map.Entry<Integer, List<Artifact>> entry : bundles.getBundlesByStartLevel().entrySet()) {
+ for(final Map.Entry<Integer, List<Artifact>> entry : bundles.getBundlesByStartOrder().entrySet()) {
w.writeStartArray(String.valueOf(entry.getKey()));
for(final Artifact artifact : entry.getValue()) {
diff --git a/featuremodel/feature/src/main/java/org/apache/sling/feature/Artifact.java b/featuremodel/feature/src/main/java/org/apache/sling/feature/Artifact.java
index 4fada27..6821e26 100644
--- a/featuremodel/feature/src/main/java/org/apache/sling/feature/Artifact.java
+++ b/featuremodel/feature/src/main/java/org/apache/sling/feature/Artifact.java
@@ -25,6 +25,9 @@ package org.apache.sling.feature;
*/
public class Artifact implements Comparable<Artifact> {
+ /** This key might be used by bundles to define the start order. */
+ public static final String KEY_START_ORDER = "start-order";
+
/** The artifact id. */
private final ArtifactId id;
diff --git a/featuremodel/feature/src/main/java/org/apache/sling/feature/Bundles.java b/featuremodel/feature/src/main/java/org/apache/sling/feature/Bundles.java
index a359575..269d39f 100644
--- a/featuremodel/feature/src/main/java/org/apache/sling/feature/Bundles.java
+++ b/featuremodel/feature/src/main/java/org/apache/sling/feature/Bundles.java
@@ -18,60 +18,117 @@ package org.apache.sling.feature;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.Map.Entry;
-import java.util.NoSuchElementException;
import java.util.TreeMap;
/**
- * Bundles groups bundle {@code Artifact}s by start level.
+ * Bundles groups a list of bundles {@code Artifact} and provides a means
+ * to sort them based on start order.
*/
-public class Bundles implements Iterable<Map.Entry<Integer, Artifact>> {
+public class Bundles implements Iterable<Artifact> {
- /** Map of bundles grouped by start level */
- private final Map<Integer, List<Artifact>> startLevelMap = new TreeMap<>();
+ /** The list of bundles. */
+ private final List<Artifact> bundles = new ArrayList<>();
/**
- * Get the map of all bundles sorted by start level. The map is sorted
+ * Get the start order of a bundle.
+ * @param bundle The bundle
+ * @return The start order, if no start order is defined, {@code 0} is returned.
+ */
+ public static int getStartOrder(final Artifact bundle) {
+ final String order = bundle.getMetadata().get(Artifact.KEY_START_ORDER);
+ final int startOrder;
+ if ( order != null ) {
+ startOrder = Integer.parseInt(order);
+ } else {
+ startOrder = 0;
+ }
+
+ return startOrder;
+ }
+
+ /**
+ * Get the map of all bundles sorted by start order. The map is sorted
* and iterating over the keys is done in start level order.
* @return The map of bundles. The map is unmodifiable.
*/
- public Map<Integer, List<Artifact>> getBundlesByStartLevel() {
- return Collections.unmodifiableMap(this.startLevelMap);
+ public Map<Integer, List<Artifact>> getBundlesByStartOrder() {
+ final Map<Integer, List<Artifact>> startOrderMap = new TreeMap<>(new Comparator<Integer>() {
+
+ @Override
+ public int compare(final Integer o1, final Integer o2) {
+ if ( o1 == o2 ) {
+ return 0;
+ }
+ if ( o1 == 0 ) {
+ return 1;
+ }
+ if ( o2 == 0 ) {
+ return -1;
+ }
+ return o1-o2;
+ }
+ });
+
+ for(final Artifact bundle : this.bundles) {
+ final int startOrder = getStartOrder(bundle);
+ List<Artifact> list = startOrderMap.get(startOrder);
+ if ( list == null ) {
+ list = new ArrayList<>();
+ startOrderMap.put(startOrder, list);
+ }
+ list.add(bundle);
+ }
+ return Collections.unmodifiableMap(startOrderMap);
+ }
+
+ public List<Map.Entry<Integer, Artifact>> getAllBundles() {
+ final List<Map.Entry<Integer, Artifact>> list = new ArrayList<>();
+ for(final Artifact a : this) {
+ list.add(new Map.Entry<Integer, Artifact>() {
+
+ @Override
+ public Artifact setValue(Artifact value) {
+ return null;
+ }
+
+ @Override
+ public Artifact getValue() {
+ // TODO Auto-generated method stub
+ return a;
+ }
+
+ @Override
+ public Integer getKey() {
+ return getStartOrder(a);
+ }
+ });
+ }
+ return list;
}
/**
- * Add an artifact in the given start level.
- * @param startLevel The start level
+ * Add an artifact as a bundle.
* @param bundle The bundle
*/
- public void add(final int startLevel, final Artifact bundle) {
- List<Artifact> list = this.startLevelMap.get(startLevel);
- if ( list == null ) {
- list = new ArrayList<>();
- this.startLevelMap.put(startLevel, list);
- }
- list.add(bundle);
+ public void add(final Artifact bundle) {
+ this.bundles.add(bundle);
}
/**
* Remove the exact artifact.
- * All start levels are searched for such an artifact. The first one found is removed.
+ * All start orders are searched for such an artifact. The first one found is removed.
* @param id The artifact id
* @return {@code true} if the artifact has been removed
*/
public boolean removeExact(final ArtifactId id) {
- for(final Map.Entry<Integer, List<Artifact>> entry : this.startLevelMap.entrySet()) {
- for(final Artifact artifact : entry.getValue()) {
- if ( artifact.getId().equals(id)) {
- entry.getValue().remove(artifact);
- if ( entry.getValue().isEmpty() ) {
- this.startLevelMap.remove(entry.getKey());
- }
- return true;
- }
+ for(final Artifact artifact : this.bundles) {
+ if ( artifact.getId().equals(id)) {
+ this.bundles.remove(artifact);
+ return true;
}
}
return false;
@@ -79,50 +136,46 @@ public class Bundles implements Iterable<Map.Entry<Integer, Artifact>> {
/**
* Remove the same artifact, neglecting the version.
- * All start levels are searched for such an artifact. The first one found is removed.
+ * All start orders are searched for such an artifact. The first one found is removed.
* @param id The artifact id
* @return {@code true} if the artifact has been removed
*/
public boolean removeSame(final ArtifactId id) {
- for(final Map.Entry<Integer, List<Artifact>> entry : this.startLevelMap.entrySet()) {
- for(final Artifact artifact : entry.getValue()) {
- if ( artifact.getId().isSame(id)) {
- entry.getValue().remove(artifact);
- if ( entry.getValue().isEmpty() ) {
- this.startLevelMap.remove(entry.getKey());
- }
- return true;
- }
+ for(final Artifact artifact : this.bundles) {
+ if ( artifact.getId().isSame(id)) {
+ this.bundles.remove(artifact);
+ return true;
}
}
return false;
}
/**
- * Clear the bundles map.
+ * Clear the bundles list.
*/
public void clear() {
- this.startLevelMap.clear();
+ this.bundles.clear();
}
/**
- * Get start level and artifact for the given id, neglecting the version
+ * Get start order and artifact for the given id, neglecting the version
* @param id The artifact id
- * @return A map entry with start level and artifact, {@code null} otherwise
+ * @return A map entry with start order and artifact, {@code null} otherwise
*/
public Map.Entry<Integer, Artifact> getSame(final ArtifactId id) {
- for(final Map.Entry<Integer, Artifact> entry : this) {
- if ( entry.getValue().getId().isSame(id)) {
+ for(final Artifact bundle : this) {
+ if ( bundle.getId().isSame(id)) {
+ final int startOrder = getStartOrder(bundle);
return new Map.Entry<Integer, Artifact>() {
@Override
public Integer getKey() {
- return entry.getKey();
+ return startOrder;
}
@Override
public Artifact getValue() {
- return entry.getValue();
+ return bundle;
}
@Override
@@ -141,8 +194,8 @@ public class Bundles implements Iterable<Map.Entry<Integer, Artifact>> {
* @return {@code true} if the artifact exists
*/
public boolean containsExact(final ArtifactId id) {
- for(final Map.Entry<Integer, Artifact> entry : this) {
- if ( entry.getValue().getId().equals(id)) {
+ for(final Artifact entry : this) {
+ if ( entry.getId().equals(id)) {
return true;
}
}
@@ -155,8 +208,8 @@ public class Bundles implements Iterable<Map.Entry<Integer, Artifact>> {
* @return {@code true} if the artifact exists
*/
public boolean containsSame(final ArtifactId id) {
- for(final Map.Entry<Integer, Artifact> entry : this) {
- if ( entry.getValue().getId().isSame(id)) {
+ for(final Artifact entry : this) {
+ if ( entry.getId().isSame(id)) {
return true;
}
}
@@ -167,74 +220,12 @@ public class Bundles implements Iterable<Map.Entry<Integer, Artifact>> {
* Iterate over all bundles
*/
@Override
- public Iterator<Map.Entry<Integer, Artifact>> iterator() {
- final Iterator<Map.Entry<Integer, List<Artifact>>> mainIter = this.startLevelMap.entrySet().iterator();
- return new Iterator<Map.Entry<Integer,Artifact>>() {
-
- private Map.Entry<Integer, Artifact> next = seek();
-
- private Integer level;
-
- private Iterator<Artifact> innerIter;
-
- private Map.Entry<Integer, Artifact> seek() {
- Map.Entry<Integer, Artifact> entry = null;
- while ( this.innerIter != null || mainIter.hasNext() ) {
- if ( innerIter != null ) {
- if ( innerIter.hasNext() ) {
- final Artifact a = innerIter.next();
- final Integer l = this.level;
- entry = new Map.Entry<Integer, Artifact>() {
-
- @Override
- public Integer getKey() {
- return l;
- }
-
- @Override
- public Artifact getValue() {
- return a;
- }
-
- @Override
- public Artifact setValue(Artifact value) {
- throw new UnsupportedOperationException();
- }
- };
- break;
- } else {
- innerIter = null;
- }
- } else {
- final Map.Entry<Integer, List<Artifact>> e = mainIter.next();
- this.level = e.getKey();
- this.innerIter = e.getValue().iterator();
- }
- }
- return entry;
- }
-
- @Override
- public boolean hasNext() {
- return this.next != null;
- }
-
- @Override
- public Entry<Integer, Artifact> next() {
- final Entry<Integer, Artifact> result = next;
- if ( result == null ) {
- throw new NoSuchElementException();
- }
- this.next = seek();
- return result;
- }
-
- };
+ public Iterator<Artifact> iterator() {
+ return Collections.unmodifiableList(this.bundles).iterator();
}
@Override
public String toString() {
- return "Bundles [" + this.startLevelMap
- + "]";
+ return "Bundles " + this.bundles;
}
}
diff --git a/featuremodel/feature/src/main/java/org/apache/sling/feature/Feature.java b/featuremodel/feature/src/main/java/org/apache/sling/feature/Feature.java
index 3665689..f0f2cc5 100644
--- a/featuremodel/feature/src/main/java/org/apache/sling/feature/Feature.java
+++ b/featuremodel/feature/src/main/java/org/apache/sling/feature/Feature.java
@@ -19,7 +19,6 @@ package org.apache.sling.feature;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
-import java.util.Map;
/**
* A feature consists of
@@ -305,11 +304,11 @@ public class Feature implements Comparable<Feature> {
result.setAssembled(this.isAssembled());
// bundles
- for(final Map.Entry<Integer, Artifact> entry : this.getBundles()) {
- final Artifact c = new Artifact(entry.getValue().getId());
- c.getMetadata().putAll(entry.getValue().getMetadata());
+ for(final Artifact b : this.getBundles()) {
+ final Artifact c = new Artifact(b.getId());
+ c.getMetadata().putAll(b.getMetadata());
- result.getBundles().add(entry.getKey(), c);
+ result.getBundles().add(c);
}
// configurations
diff --git a/featuremodel/feature/src/main/java/org/apache/sling/feature/process/BuilderUtil.java b/featuremodel/feature/src/main/java/org/apache/sling/feature/process/BuilderUtil.java
index 19c606c..1db7bf8 100644
--- a/featuremodel/feature/src/main/java/org/apache/sling/feature/process/BuilderUtil.java
+++ b/featuremodel/feature/src/main/java/org/apache/sling/feature/process/BuilderUtil.java
@@ -53,7 +53,7 @@ class BuilderUtil {
static void mergeBundles(final Bundles target,
final Bundles source,
final ArtifactMerge artifactMergeAlg) {
- for(final Map.Entry<Integer, List<Artifact>> entry : source.getBundlesByStartLevel().entrySet()) {
+ for(final Map.Entry<Integer, List<Artifact>> entry : source.getBundlesByStartOrder().entrySet()) {
for(final Artifact a : entry.getValue()) {
// version handling - use provided algorithm
boolean replace = true;
@@ -65,7 +65,7 @@ class BuilderUtil {
}
if ( replace ) {
target.removeSame(a.getId());
- target.add(entry.getKey(), a);
+ target.add(a);
}
}
}
diff --git a/featuremodel/feature/src/test/java/org/apache/sling/feature/BundlesTest.java b/featuremodel/feature/src/test/java/org/apache/sling/feature/BundlesTest.java
index 3346f19..59d87eb 100644
--- a/featuremodel/feature/src/test/java/org/apache/sling/feature/BundlesTest.java
+++ b/featuremodel/feature/src/test/java/org/apache/sling/feature/BundlesTest.java
@@ -18,6 +18,7 @@ package org.apache.sling.feature;
import static org.junit.Assert.assertEquals;
+import java.util.List;
import java.util.Map;
import org.junit.Test;
@@ -27,19 +28,28 @@ public class BundlesTest {
@Test
public void testIterator() {
final Bundles bundles = new Bundles();
- bundles.add(1, new Artifact(ArtifactId.parse("1/a/1")));
- bundles.add(5, new Artifact(ArtifactId.parse("5/a/5")));
- bundles.add(5, new Artifact(ArtifactId.parse("5/b/6")));
- bundles.add(2, new Artifact(ArtifactId.parse("2/b/2")));
- bundles.add(2, new Artifact(ArtifactId.parse("2/a/3")));
- bundles.add(4, new Artifact(ArtifactId.parse("4/x/4")));
+ bundles.add(createBundle("1/a/1", 1));
+ bundles.add(createBundle("5/a/5", 5));
+ bundles.add(createBundle("5/b/6", 5));
+ bundles.add(createBundle("2/b/2", 2));
+ bundles.add(createBundle("2/a/3", 2));
+ bundles.add(createBundle("4/x/4", 4));
int index = 1;
- for(final Map.Entry<Integer, Artifact> entry : bundles) {
- assertEquals(entry.getKey().toString(), entry.getValue().getId().getGroupId());
- assertEquals(index, entry.getValue().getId().getOSGiVersion().getMajor());
- index++;
+ for(final Map.Entry<Integer, List<Artifact>> entry : bundles.getBundlesByStartOrder().entrySet()) {
+ for(final Artifact a : entry.getValue()) {
+ assertEquals(entry.getKey().toString(), a.getId().getGroupId());
+ assertEquals(index, a.getId().getOSGiVersion().getMajor());
+ index++;
+ }
}
assertEquals(7, index);
}
+
+ public static Artifact createBundle(final String id, final int startOrder) {
+ final Artifact a = new Artifact(ArtifactId.parse(id));
+ a.getMetadata().put(Artifact.KEY_START_ORDER, String.valueOf(startOrder));
+
+ return a;
+ }
}
diff --git a/featuremodel/feature/src/test/java/org/apache/sling/feature/process/BuilderUtilTest.java b/featuremodel/feature/src/test/java/org/apache/sling/feature/process/BuilderUtilTest.java
index a33ef95..42ce069 100644
--- a/featuremodel/feature/src/test/java/org/apache/sling/feature/process/BuilderUtilTest.java
+++ b/featuremodel/feature/src/test/java/org/apache/sling/feature/process/BuilderUtilTest.java
@@ -26,6 +26,7 @@ import java.util.Map;
import org.apache.sling.feature.Artifact;
import org.apache.sling.feature.ArtifactId;
import org.apache.sling.feature.Bundles;
+import org.apache.sling.feature.BundlesTest;
import org.apache.sling.feature.process.BuilderUtil.ArtifactMerge;
import org.junit.Test;
@@ -33,9 +34,28 @@ public class BuilderUtilTest {
private List<Map.Entry<Integer, Artifact>> getBundles(final Bundles f) {
final List<Map.Entry<Integer, Artifact>> result = new ArrayList<>();
- for(final Map.Entry<Integer, Artifact> entry : f) {
- result.add(entry);
+ for(final Map.Entry<Integer, List<Artifact>> entry : f.getBundlesByStartOrder().entrySet()) {
+ for(final Artifact artifact : entry.getValue()) {
+ result.add(new Map.Entry<Integer, Artifact>() {
+
+ @Override
+ public Integer getKey() {
+ return entry.getKey();
+ }
+
+ @Override
+ public Artifact getValue() {
+ return artifact;
+ }
+
+ @Override
+ public Artifact setValue(Artifact value) {
+ return null;
+ }
+ });
+ }
}
+
return result;
}
@@ -53,14 +73,14 @@ public class BuilderUtilTest {
@Test public void testMergeBundlesWithAlgHighest() {
final Bundles target = new Bundles();
- target.add(1, new Artifact(ArtifactId.parse("g/a/1.0")));
- target.add(2, new Artifact(ArtifactId.parse("g/b/2.0")));
- target.add(3, new Artifact(ArtifactId.parse("g/c/2.5")));
+ target.add(BundlesTest.createBundle("g/a/1.0", 1));
+ target.add(BundlesTest.createBundle("g/b/2.0", 2));
+ target.add(BundlesTest.createBundle("g/c/2.5", 3));
final Bundles source = new Bundles();
- source.add(1, new Artifact(ArtifactId.parse("g/a/1.1")));
- source.add(2, new Artifact(ArtifactId.parse("g/b/1.9")));
- source.add(3, new Artifact(ArtifactId.parse("g/c/2.5")));
+ source.add(BundlesTest.createBundle("g/a/1.1", 1));
+ source.add(BundlesTest.createBundle("g/b/1.9", 2));
+ source.add(BundlesTest.createBundle("g/c/2.5", 3));
BuilderUtil.mergeBundles(target, source, ArtifactMerge.HIGHEST);
@@ -74,14 +94,14 @@ public class BuilderUtilTest {
@Test public void testMergeBundlesWithAlgLatest() {
final Bundles target = new Bundles();
- target.add(1, new Artifact(ArtifactId.parse("g/a/1.0")));
- target.add(2, new Artifact(ArtifactId.parse("g/b/2.0")));
- target.add(3, new Artifact(ArtifactId.parse("g/c/2.5")));
+ target.add(BundlesTest.createBundle("g/a/1.0", 1));
+ target.add(BundlesTest.createBundle("g/b/2.0", 2));
+ target.add(BundlesTest.createBundle("g/c/2.5", 3));
final Bundles source = new Bundles();
- source.add(1, new Artifact(ArtifactId.parse("g/a/1.1")));
- source.add(2, new Artifact(ArtifactId.parse("g/b/1.9")));
- source.add(3, new Artifact(ArtifactId.parse("g/c/2.5")));
+ source.add(BundlesTest.createBundle("g/a/1.1", 1));
+ source.add(BundlesTest.createBundle("g/b/1.9", 2));
+ source.add(BundlesTest.createBundle("g/c/2.5", 3));
BuilderUtil.mergeBundles(target, source, ArtifactMerge.LATEST);
@@ -95,10 +115,10 @@ public class BuilderUtilTest {
@Test public void testMergeBundlesDifferentStartlevel() {
final Bundles target = new Bundles();
- target.add(1, new Artifact(ArtifactId.parse("g/a/1.0")));
+ target.add(BundlesTest.createBundle("g/a/1.0", 1));
final Bundles source = new Bundles();
- source.add(2, new Artifact(ArtifactId.parse("g/a/1.1")));
+ source.add(BundlesTest.createBundle("g/a/1.1", 2));
BuilderUtil.mergeBundles(target, source, ArtifactMerge.LATEST);
@@ -110,14 +130,14 @@ public class BuilderUtilTest {
@Test public void testMergeBundles() {
final Bundles target = new Bundles();
- target.add(1, new Artifact(ArtifactId.parse("g/a/1.0")));
- target.add(2, new Artifact(ArtifactId.parse("g/b/2.0")));
- target.add(3, new Artifact(ArtifactId.parse("g/c/2.5")));
+ target.add(BundlesTest.createBundle("g/a/1.0", 1));
+ target.add(BundlesTest.createBundle("g/b/2.0", 2));
+ target.add(BundlesTest.createBundle("g/c/2.5", 3));
final Bundles source = new Bundles();
- source.add(1, new Artifact(ArtifactId.parse("g/d/1.1")));
- source.add(2, new Artifact(ArtifactId.parse("g/e/1.9")));
- source.add(3, new Artifact(ArtifactId.parse("g/f/2.5")));
+ source.add(BundlesTest.createBundle("g/d/1.1", 1));
+ source.add(BundlesTest.createBundle("g/e/1.9", 2));
+ source.add(BundlesTest.createBundle("g/f/2.5", 3));
BuilderUtil.mergeBundles(target, source, ArtifactMerge.LATEST);
diff --git a/featuremodel/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java b/featuremodel/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java
index 5ef1a62..4fc31b3 100644
--- a/featuremodel/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java
+++ b/featuremodel/feature/src/test/java/org/apache/sling/feature/process/FeatureBuilderTest.java
@@ -28,6 +28,7 @@ import java.util.Map;
import org.apache.sling.feature.Artifact;
import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.BundlesTest;
import org.apache.sling.feature.Capability;
import org.apache.sling.feature.Configuration;
import org.apache.sling.feature.Extension;
@@ -46,11 +47,11 @@ public class FeatureBuilderTest {
f1.getFrameworkProperties().put("foo", "2");
f1.getFrameworkProperties().put("bar", "X");
- f1.getBundles().add(3, new Artifact(ArtifactId.parse("org.apache.sling/foo-bar/4.5.6")));
- f1.getBundles().add(5, new Artifact(ArtifactId.parse("group/testnewversion_low/2")));
- f1.getBundles().add(5, new Artifact(ArtifactId.parse("group/testnewversion_high/2")));
- f1.getBundles().add(5, new Artifact(ArtifactId.parse("group/testnewstartlevel/1")));
- f1.getBundles().add(5, new Artifact(ArtifactId.parse("group/testnewstartlevelandversion/1")));
+ f1.getBundles().add(BundlesTest.createBundle("org.apache.sling/foo-bar/4.5.6", 3));
+ f1.getBundles().add(BundlesTest.createBundle("group/testnewversion_low/2", 5));
+ f1.getBundles().add(BundlesTest.createBundle("group/testnewversion_high/2", 5));
+ f1.getBundles().add(BundlesTest.createBundle("group/testnewstartlevel/1", 5));
+ f1.getBundles().add(BundlesTest.createBundle("group/testnewstartlevelandversion/1", 5));
final Configuration c1 = new Configuration("org.apache.sling.foo");
c1.getProperties().put("prop", "value");
@@ -69,9 +70,28 @@ public class FeatureBuilderTest {
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);
+ for(final Map.Entry<Integer, List<Artifact>> entry : f.getBundles().getBundlesByStartOrder().entrySet()) {
+ for(final Artifact artifact : entry.getValue()) {
+ result.add(new Map.Entry<Integer, Artifact>() {
+
+ @Override
+ public Integer getKey() {
+ return entry.getKey();
+ }
+
+ @Override
+ public Artifact getValue() {
+ return artifact;
+ }
+
+ @Override
+ public Artifact setValue(Artifact value) {
+ return null;
+ }
+ });
+ }
}
+
return result;
}
@@ -194,11 +214,12 @@ public class FeatureBuilderTest {
base.getFrameworkProperties().put("org.apache.felix.scr.directory", "launchpad/scr");
final Artifact a1 = new Artifact(ArtifactId.parse("org.apache.sling/oak-server/1.0.0"));
+ a1.getMetadata().put(Artifact.KEY_START_ORDER, "1");
a1.getMetadata().put("hash", "4632463464363646436");
- base.getBundles().add(1, a1);
- base.getBundles().add(1, new Artifact(ArtifactId.parse("org.apache.sling/application-bundle/2.0.0")));
- base.getBundles().add(1, new Artifact(ArtifactId.parse("org.apache.sling/another-bundle/2.1.0")));
- base.getBundles().add(2, new Artifact(ArtifactId.parse("org.apache.sling/foo-xyz/1.2.3")));
+ base.getBundles().add(a1);
+ base.getBundles().add(BundlesTest.createBundle("org.apache.sling/application-bundle/2.0.0", 1));
+ base.getBundles().add(BundlesTest.createBundle("org.apache.sling/another-bundle/2.1.0", 1));
+ base.getBundles().add(BundlesTest.createBundle("org.apache.sling/foo-xyz/1.2.3", 2));
final Configuration co1 = new Configuration("my.pid");
co1.getProperties().put("foo", 5L);
@@ -237,15 +258,16 @@ public class FeatureBuilderTest {
base.getFrameworkProperties().put("org.apache.felix.scr.directory", "launchpad/scr");
final Artifact a1 = new Artifact(ArtifactId.parse("org.apache.sling/oak-server/1.0.0"));
+ a1.getMetadata().put(Artifact.KEY_START_ORDER, "1");
a1.getMetadata().put("hash", "4632463464363646436");
- base.getBundles().add(1, a1);
- base.getBundles().add(1, new Artifact(ArtifactId.parse("org.apache.sling/application-bundle/2.0.0")));
- base.getBundles().add(1, new Artifact(ArtifactId.parse("org.apache.sling/another-bundle/2.1.0")));
- base.getBundles().add(2, new Artifact(ArtifactId.parse("org.apache.sling/foo-xyz/1.2.3")));
- base.getBundles().add(5, new Artifact(ArtifactId.parse("group/testnewversion_low/1")));
- base.getBundles().add(5, new Artifact(ArtifactId.parse("group/testnewversion_high/5")));
- base.getBundles().add(10, new Artifact(ArtifactId.parse("group/testnewstartlevel/1")));
- base.getBundles().add(10, new Artifact(ArtifactId.parse("group/testnewstartlevelandversion/2")));
+ base.getBundles().add(a1);
+ base.getBundles().add(BundlesTest.createBundle("org.apache.sling/application-bundle/2.0.0", 1));
+ base.getBundles().add(BundlesTest.createBundle("org.apache.sling/another-bundle/2.1.0", 1));
+ base.getBundles().add(BundlesTest.createBundle("org.apache.sling/foo-xyz/1.2.3", 2));
+ base.getBundles().add(BundlesTest.createBundle("group/testnewversion_low/1", 5));
+ base.getBundles().add(BundlesTest.createBundle("group/testnewversion_high/5", 5));
+ base.getBundles().add(BundlesTest.createBundle("group/testnewstartlevel/1", 10));
+ base.getBundles().add(BundlesTest.createBundle("group/testnewstartlevelandversion/2", 10));
final Configuration co1 = new Configuration("my.pid");
co1.getProperties().put("foo", 5L);
@@ -263,7 +285,7 @@ public class FeatureBuilderTest {
final Feature result = base.copy();
result.getIncludes().remove(0);
result.getFrameworkProperties().put("bar", "X");
- result.getBundles().add(3, new Artifact(ArtifactId.parse("org.apache.sling/foo-bar/4.5.6")));
+ result.getBundles().add(BundlesTest.createBundle("org.apache.sling/foo-bar/4.5.6", 3));
final Configuration co3 = new Configuration("org.apache.sling.foo");
co3.getProperties().put("prop", "value");
result.getConfigurations().add(co3);
diff --git a/featuremodel/osgifeature-maven-plugin/src/main/java/org/apache/sling/feature/maven/Preprocessor.java b/featuremodel/osgifeature-maven-plugin/src/main/java/org/apache/sling/feature/maven/Preprocessor.java
index 47a09c5..f7c011d 100644
--- a/featuremodel/osgifeature-maven-plugin/src/main/java/org/apache/sling/feature/maven/Preprocessor.java
+++ b/featuremodel/osgifeature-maven-plugin/src/main/java/org/apache/sling/feature/maven/Preprocessor.java
@@ -16,6 +16,16 @@
*/
package org.apache.sling.feature.maven;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
import org.apache.maven.model.Dependency;
import org.apache.maven.project.MavenProject;
import org.apache.sling.feature.Artifact;
@@ -30,16 +40,6 @@ import org.apache.sling.feature.support.FeatureUtil;
import org.apache.sling.feature.support.json.FeatureJSONReader;
import org.codehaus.plexus.logging.Logger;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
/**
* The processor processes all feature projects.
*/
@@ -116,7 +116,8 @@ public class Preprocessor {
info.project.getVersion(),
null,
"jar"));
- feature.getBundles().add(Integer.valueOf(config.getJarStartLevel()), jar);
+ jar.getMetadata().put(Artifact.KEY_START_ORDER, String.valueOf(config.getJarStartLevel()));
+ feature.getBundles().add(jar);
}
}
@@ -295,7 +296,7 @@ public class Preprocessor {
final ProjectInfo info,
final Feature assembledFeature,
final String scope) {
- for(final Map.Entry<Integer, org.apache.sling.feature.Artifact> entry : assembledFeature.getBundles()) {
+ for(final Map.Entry<Integer, org.apache.sling.feature.Artifact> entry : assembledFeature.getBundles().getAllBundles()) {
final ArtifactId a = entry.getValue().getId();
if ( a.getGroupId().equals(info.project.getGroupId())
&& a.getArtifactId().equals(info.project.getArtifactId())
--
To stop receiving notification emails like this one, please contact
['"commits@sling.apache.org" <co...@sling.apache.org>'].