Repository: karaf
Updated Branches:
  refs/heads/karaf-3.0.x d0856f40f -> fda0845a3


KARAF-4175 - Reduce time and memory allocation in feature service


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/fda0845a
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/fda0845a
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/fda0845a

Branch: refs/heads/karaf-3.0.x
Commit: fda0845a31c9a3d8eb212ee330183b22603a38a4
Parents: d0856f4
Author: Jean-Baptiste Onofré <[email protected]>
Authored: Fri Feb 5 17:45:05 2016 +0100
Committer: Jean-Baptiste Onofré <[email protected]>
Committed: Fri Feb 5 17:45:05 2016 +0100

----------------------------------------------------------------------
 .../karaf/features/internal/BundleManager.java  | 22 +++++-
 .../features/internal/FeaturesServiceImpl.java  | 77 ++++++++++++--------
 2 files changed, 67 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/fda0845a/features/core/src/main/java/org/apache/karaf/features/internal/BundleManager.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/BundleManager.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/BundleManager.java
index 8e4044c..38979ab 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/BundleManager.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/BundleManager.java
@@ -87,6 +87,11 @@ public class BundleManager {
     }
 
     public BundleInstallerResult installBundleIfNeeded(String bundleLocation, 
int startLevel, String regionName) throws IOException, BundleException {
+        Bundle foundByLocationBundle = findInstalledByLocation(bundleLocation);
+        if (foundByLocationBundle != null) {
+            LOGGER.debug("Found installed bundle by location: {}", 
foundByLocationBundle);
+            return new BundleInstallerResult(foundByLocationBundle, false);
+        }
         BundleInstallerResult result = doInstallBundleIfNeeded(bundleLocation, 
startLevel);
         installToRegion(regionName, result.bundle, result.isNew);
         return result;
@@ -136,7 +141,7 @@ public class BundleManager {
                 // is = new BufferedInputStream(new
                 // URL(bundleLocation).openStream());
             }
-            is = new BufferedInputStream(new FilterInputStream(is) {
+            is = new FilterInputStream(is) {
                 @Override
                 public int read(byte b[], int off, int len) throws IOException 
{
                     if (Thread.currentThread().isInterrupted()) {
@@ -144,7 +149,7 @@ public class BundleManager {
                     }
                     return super.read(b, off, len);
                 }
-            });
+            };
 
             LOGGER.debug("Installing bundle " + bundleLocation);
             Bundle b = bundleContext.installBundle(bundleLocation, is);
@@ -160,6 +165,10 @@ public class BundleManager {
     }
     
     public Bundle isBundleInstalled(String bundleLocation) throws IOException, 
BundleException {
+        Bundle foundByLocationBundle = findInstalledByLocation(bundleLocation);
+        if (foundByLocationBundle != null) {
+            return foundByLocationBundle;
+        }
         InputStream is = getInputStreamForBundle(bundleLocation);
         try {
             is.mark(256 * 1024);
@@ -215,6 +224,15 @@ public class BundleManager {
         return null;
     }
 
+    private Bundle findInstalledByLocation(String location) {
+        for (Bundle b : bundleContext.getBundles()) {
+            if (b.getLocation() != null && b.getLocation().equals(location)) {
+                return b;
+            }
+        }
+        return null;
+    }
+
     private InputStream getInputStreamForBundle(String bundleLocation) throws 
MalformedURLException, IOException {
         InputStream is;
         LOGGER.debug("Checking " + bundleLocation);

http://git-wip-us.apache.org/repos/asf/karaf/blob/fda0845a/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
index 9e65061..4e7a863 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
@@ -66,6 +66,8 @@ import static java.lang.String.format;
 public class FeaturesServiceImpl implements FeaturesService {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(FeaturesServiceImpl.class);
 
+    private static Pattern NON_REGEXP_EXPRESSION = 
Pattern.compile("^[a-zA-Z0-9_\\-]*$");
+
     private static final int KARAF_BUNDLE_START_LEVEL =
             Integer.parseInt(System.getProperty("karaf.startlevel.bundle", 
"80"));
 
@@ -833,44 +835,59 @@ public class FeaturesServiceImpl implements 
FeaturesService {
     }
 
     public Feature[] getFeatures(String name, String version) throws Exception 
{
-        ArrayList<Feature> features = new ArrayList<Feature>();
         if (version != null) {
             version = version.trim();
         }
-        Pattern pattern = Pattern.compile(name);
-        for (String featureName : getFeatures().keySet()) {
-            Matcher matcher = pattern.matcher(featureName);
-            if (matcher.matches()) {
-                Map<String, Feature> versions = getFeatures().get(featureName);
-                if (versions != null && !versions.isEmpty()) {
-                    Feature feature = versions.get(version);
-                    if (feature == null) {
-                        if 
(org.apache.karaf.features.internal.model.Feature.DEFAULT_VERSION.equals(version))
 {
-                            Version latest = new 
Version(cleanupVersion(version));
-                            for (String available : versions.keySet()) {
-                                Version availableVersion = new 
Version(cleanupVersion(available));
-                                if (availableVersion.compareTo(latest) > 0) {
-                                    feature = versions.get(available);
-                                    latest = availableVersion;
-                                }
-                            }
-                        } else {
-                            Version latest = new 
Version(cleanupVersion(org.apache.karaf.features.internal.model.Feature.DEFAULT_VERSION));
-                            VersionRange versionRange = new 
VersionRange(version, true, true);
-                            for (String available : versions.keySet()) {
-                                Version availableVersion = new 
Version(cleanupVersion(available));
-                                if (availableVersion.compareTo(latest) > 0 && 
versionRange.contains(availableVersion)) {
-                                    feature = versions.get(available);
-                                    latest = availableVersion;
-                                }
-                            }
+        Matcher simpleFeatureName = NON_REGEXP_EXPRESSION.matcher(name);
+        if (simpleFeatureName.matches()) {
+            Map<String, Feature> versions = getFeatures().get(name);
+            Feature feature = selectFeatureVersion(versions, version);
+            return new Feature[]{feature};
+        } else {
+            List<Feature> features = new ArrayList<Feature>();
+            Pattern pattern = Pattern.compile(name);
+            for (String featureName : getFeatures().keySet()) {
+                Matcher matcher = pattern.matcher(featureName);
+                if (matcher.matches()) {
+                    Map<String, Feature> versions = 
getFeatures().get(featureName);
+                    Feature feature = selectFeatureVersion(versions, version);
+                    if (feature != null) {
+                        features.add(feature);
+                    }
+                }
+            }
+            return features.toArray(new Feature[features.size()]);
+        }
+    }
+
+    private static Feature selectFeatureVersion(Map<String, Feature> versions, 
String version) {
+        if (versions != null && !versions.isEmpty()) {
+            Feature feature = versions.get(version);
+            if (feature == null) {
+                if 
(org.apache.karaf.features.internal.model.Feature.DEFAULT_VERSION.equals(version))
 {
+                    Version latest = new Version(cleanupVersion(version));
+                    for (String available : versions.keySet()) {
+                        Version availableVersion = new 
Version(cleanupVersion(available));
+                        if (availableVersion.compareTo(latest) > 0) {
+                            feature = versions.get(available);
+                            latest = availableVersion;
+                        }
+                    }
+                } else {
+                    Version latest = new 
Version(cleanupVersion(org.apache.karaf.features.internal.model.Feature.DEFAULT_VERSION));
+                    VersionRange versionRange = new VersionRange(version, 
true, true);
+                    for (String available : versions.keySet()) {
+                        Version availableVersion = new 
Version(cleanupVersion(available));
+                        if (availableVersion.compareTo(latest) > 0 && 
versionRange.contains(availableVersion)) {
+                            feature = versions.get(available);
+                            latest = availableVersion;
                         }
                     }
-                    features.add(feature);
                 }
             }
+            return feature;
         }
-        return features.toArray(new Feature[features.size()]);
+        return null;
     }
 
     public Feature[] getFeatures(String name) throws Exception {

Reply via email to