You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2016/02/05 17:45:36 UTC
karaf git commit: KARAF-4175 - Reduce time and memory allocation in
feature service
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é <jb...@apache.org>
Authored: Fri Feb 5 17:45:05 2016 +0100
Committer: Jean-Baptiste Onofré <jb...@apache.org>
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 {