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 {
