You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2016/11/23 09:23:59 UTC
karaf git commit: [KARAF-4830] Karaf does not start with staged
features in etc/org.apache.karaf.features.cfg
Repository: karaf
Updated Branches:
refs/heads/master 29dd03c96 -> 467936840
[KARAF-4830] Karaf does not start with staged features in etc/org.apache.karaf.features.cfg
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/46793684
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/46793684
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/46793684
Branch: refs/heads/master
Commit: 46793684018bf02ab87957546285a6935d800573
Parents: 29dd03c
Author: Guillaume Nodet <gn...@apache.org>
Authored: Wed Nov 23 10:23:52 2016 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Wed Nov 23 10:23:52 2016 +0100
----------------------------------------------------------------------
.../internal/service/BootFeaturesInstaller.java | 53 ++++++++++++--------
.../internal/service/FeaturesServiceImpl.java | 4 +-
.../service/BootFeaturesInstallerTest.java | 23 +++++++++
3 files changed, 59 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/46793684/features/core/src/main/java/org/apache/karaf/features/internal/service/BootFeaturesInstaller.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/BootFeaturesInstaller.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/BootFeaturesInstaller.java
index d0a703f..e8478f6 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/service/BootFeaturesInstaller.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/BootFeaturesInstaller.java
@@ -19,15 +19,12 @@ package org.apache.karaf.features.internal.service;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.Hashtable;
-import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import java.util.StringTokenizer;
import org.apache.karaf.features.BootFinished;
import org.apache.karaf.features.FeaturesService;
@@ -128,24 +125,40 @@ public class BootFeaturesInstaller {
}
protected List<Set<String>> parseBootFeatures(String bootFeatures) {
- Pattern pattern = Pattern.compile("(\\s*\\(([^)]+))\\s*\\)\\s*,\\s*|.+");
- Matcher matcher = pattern.matcher(bootFeatures);
- List<Set<String>> result = new ArrayList<>();
- while (matcher.find()) {
- String group = matcher.group(2) != null ? matcher.group(2) : matcher.group();
- result.add(parseFeatureList(group));
- }
- return result;
- }
-
- protected Set<String> parseFeatureList(String group) {
- HashSet<String> features = new LinkedHashSet<>();
- for (String feature : Arrays.asList(group.trim().split("\\s*,\\s*"))) {
- if (feature.length() > 0) {
- features.add(feature);
+ List<Set<String>> stages = new ArrayList<>();
+ StringTokenizer tokenizer = new StringTokenizer(bootFeatures, " \t\r\n,()", true);
+ int paren = 0;
+ Set<String> stage = new HashSet<>();
+ while (tokenizer.hasMoreTokens()) {
+ String token = tokenizer.nextToken();
+ if (token.equals("(")) {
+ if (paren == 0) {
+ if (!stage.isEmpty()) {
+ stages.add(stage);
+ stage = new HashSet<>();
+ }
+ paren++;
+ } else {
+ throw new IllegalArgumentException("Bad syntax in boot features: '" + bootFeatures + "'");
+ }
+ } else if (token.equals(")")) {
+ if (paren == 1) {
+ if (!stage.isEmpty()) {
+ stages.add(stage);
+ stage = new HashSet<>();
+ }
+ paren--;
+ } else {
+ throw new IllegalArgumentException("Bad syntax in boot features: '" + bootFeatures + "'");
+ }
+ } else if (!token.matches("[ \t\r\n]+|,")) { // ignore spaces and commas
+ stage.add(token);
}
}
- return features;
+ if (!stage.isEmpty()) {
+ stages.add(stage);
+ }
+ return stages;
}
private void publishBootFinished() {
http://git-wip-us.apache.org/repos/asf/karaf/blob/46793684/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
index 37b25ed..08f26c5 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
@@ -1280,7 +1280,9 @@ public class FeaturesServiceImpl implements FeaturesService, Deployer.DeployCall
@Override
public void startBundle(Bundle bundle) throws BundleException {
- bundle.start();
+ if (bundle != this.bundle || bundle.getState() != Bundle.STARTING) {
+ bundle.start();
+ }
}
@Override
http://git-wip-us.apache.org/repos/asf/karaf/blob/46793684/features/core/src/test/java/org/apache/karaf/features/internal/service/BootFeaturesInstallerTest.java
----------------------------------------------------------------------
diff --git a/features/core/src/test/java/org/apache/karaf/features/internal/service/BootFeaturesInstallerTest.java b/features/core/src/test/java/org/apache/karaf/features/internal/service/BootFeaturesInstallerTest.java
index 1c6b0d5..01553d3 100644
--- a/features/core/src/test/java/org/apache/karaf/features/internal/service/BootFeaturesInstallerTest.java
+++ b/features/core/src/test/java/org/apache/karaf/features/internal/service/BootFeaturesInstallerTest.java
@@ -18,6 +18,7 @@ package org.apache.karaf.features.internal.service;
import java.net.URI;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
@@ -104,4 +105,26 @@ public class BootFeaturesInstallerTest extends TestBase {
verify(impl);
}
+ @Test
+ public void testParseBootFeatures() throws Exception {
+ String features = "foo, jim, (ssh, shell, jaas, feature, framework), (system, bundle, management, service), (instance, package, log, deployer, diagnostic, config, kar), bar, zad";
+ BootFeaturesInstaller bootFeatures = new BootFeaturesInstaller(null, null, null, null, false);
+ List<Set<String>> stages = bootFeatures.parseBootFeatures(features);
+ Assert.assertEquals(5, stages.size());
+ for (String f : Arrays.asList("foo", "jim")) {
+ Assert.assertTrue("Should contain '" + f + "'", stages.get(0).contains(f));
+ }
+ for (String f : Arrays.asList("ssh", "shell", "jaas", "feature", "framework")) {
+ Assert.assertTrue("Should contain '" + f + "'", stages.get(1).contains(f));
+ }
+ for (String f : Arrays.asList("system", "bundle", "management", "service")) {
+ Assert.assertTrue("Should contain '" + f + "'", stages.get(2).contains(f));
+ }
+ for (String f : Arrays.asList("instance", "package", "log", "deployer", "diagnostic", "config", "kar")) {
+ Assert.assertTrue("Should contain '" + f + "'", stages.get(3).contains(f));
+ }
+ for (String f : Arrays.asList("bar", "zad")) {
+ Assert.assertTrue("Should contain '" + f + "'", stages.get(4).contains(f));
+ }
+ }
}