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));
+        }
+    }
 }