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 2015/03/05 23:47:18 UTC

karaf git commit: Increase number of retries for failed downloads Parse deprecated osgi.ee header Fix resolver heuristic to stabilise the resolver and avoid subsequent resolution to change the result. Remove mina-core which is not needed anymore since we

Repository: karaf
Updated Branches:
  refs/heads/master fb3187675 -> 7e2c59274


Increase number of retries for failed downloads
Parse deprecated osgi.ee header
Fix resolver heuristic to stabilise the resolver and avoid subsequent resolution to change the result.
Remove mina-core which is not needed anymore since we require jdk 7.


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

Branch: refs/heads/master
Commit: 7e2c59274682fa024360a2de3fd0b40645945758
Parents: fb31876
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Thu Mar 5 21:48:51 2015 +0100
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Thu Mar 5 23:47:09 2015 +0100

----------------------------------------------------------------------
 .../standard/src/main/feature/feature.xml       |   4 -
 .../impl/AbstractRetryableDownloadTask.java     |   4 +-
 .../internal/region/CandidateComparator.java    |   7 ++
 .../internal/resolver/ResourceBuilder.java      | 104 +++++++++++++++++++
 .../features/internal/service/Deployer.java     |   7 +-
 .../internal/service/FeaturesServiceImpl.java   |   6 ++
 6 files changed, 120 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/7e2c5927/assemblies/features/standard/src/main/feature/feature.xml
----------------------------------------------------------------------
diff --git a/assemblies/features/standard/src/main/feature/feature.xml b/assemblies/features/standard/src/main/feature/feature.xml
index 01fdb3f..c9b6e6d 100644
--- a/assemblies/features/standard/src/main/feature/feature.xml
+++ b/assemblies/features/standard/src/main/feature/feature.xml
@@ -418,10 +418,6 @@
         </config>
         <feature>shell</feature>
         <feature>jaas</feature>
-        <conditional>
-            <condition>req:osgi.ee;filter:="(&amp;(osgi.ee=JavaSE)(!(version>=1.7)))"</condition>
-            <bundle start="true" start-level="30">mvn:org.apache.mina/mina-core/${mina.version}</bundle>
-        </conditional>
         <bundle start="true" start-level="30">mvn:org.apache.sshd/sshd-core/${sshd.version}</bundle>
         <bundle start="true" start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.ssh/${project.version}</bundle>
     </feature>

http://git-wip-us.apache.org/repos/asf/karaf/blob/7e2c5927/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/AbstractRetryableDownloadTask.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/AbstractRetryableDownloadTask.java b/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/AbstractRetryableDownloadTask.java
index f315e4b..ccde347 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/AbstractRetryableDownloadTask.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/download/impl/AbstractRetryableDownloadTask.java
@@ -41,10 +41,10 @@ public abstract class AbstractRetryableDownloadTask extends AbstractDownloadTask
                 File file = download();
                 setFile(file);
             } catch (IOException e) {
-                if (++scheduleNbRun < 5) {
+                if (++scheduleNbRun < 9) {
                     long delay = (long)(scheduleDelay * 3 / 2 + Math.random() * scheduleDelay / 2);
                     LOGGER.debug("Error downloading " + url + ": " + e.getMessage() + ". Retrying in approx " + delay + " ms.");
-                    executorService.schedule(this, scheduleDelay, TimeUnit.MILLISECONDS);
+                    executorService.schedule(this, delay, TimeUnit.MILLISECONDS);
                     scheduleDelay *= 2;
                 } else {
                     setException(new IOException("Error downloading " + url, e));

http://git-wip-us.apache.org/repos/asf/karaf/blob/7e2c5927/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java
index dfbfd05..0bf271c 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java
@@ -19,6 +19,7 @@ package org.apache.karaf.features.internal.region;
 import java.util.Comparator;
 import java.util.Set;
 
+import org.apache.felix.resolver.Util;
 import org.osgi.framework.Version;
 import org.osgi.framework.namespace.BundleNamespace;
 import org.osgi.framework.namespace.IdentityNamespace;
@@ -109,6 +110,12 @@ public class CandidateComparator implements Comparator<Capability> {
                 c = compareVersions(v2, v1);
             }
         }
+        if (c == 0) {
+            // We just want to have a deterministic heuristic
+            String n1 = Util.getSymbolicName(cap1.getResource());
+            String n2 = Util.getSymbolicName(cap2.getResource());
+            c = n1.compareTo(n2);
+        }
         return c;
     }
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/7e2c5927/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java
index 7ae1736..47a0661 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java
@@ -30,6 +30,7 @@ import org.apache.felix.utils.version.VersionTable;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.Constants;
 import org.osgi.framework.Version;
+import org.osgi.framework.namespace.ExecutionEnvironmentNamespace;
 import org.osgi.framework.namespace.IdentityNamespace;
 import org.osgi.framework.wiring.BundleRevision;
 import org.osgi.namespace.service.ServiceNamespace;
@@ -170,6 +171,12 @@ public final class ResourceBuilder {
         List<Requirement> requireReqs = convertRequireCapabilities(requireClauses, resource);
 
         //
+        // Parse Bundle-RequiredExecutionEnvironment.
+        //
+        List<Requirement> breeReqs =
+                parseBreeHeader((String) headerMap.get(Constants.BUNDLE_REQUIREDEXECUTIONENVIRONMENT), resource);
+
+        //
         // Parse Export-Package.
         //
 
@@ -733,6 +740,103 @@ public final class ResourceBuilder {
         return reqs;
     }
 
+    private static List<Requirement> parseBreeHeader(String header, Resource resource) {
+        List<String> filters = new ArrayList<String>();
+        for (String entry : parseDelimitedString(header, ",")) {
+            List<String> names = parseDelimitedString(entry, "/");
+            List<String> left = parseDelimitedString(names.get(0), "-");
+
+            String lName = left.get(0);
+            Version lVer;
+            try {
+                lVer = Version.parseVersion(left.get(1));
+            } catch (Exception ex) {
+                // Version doesn't parse. Make it part of the name.
+                lName = names.get(0);
+                lVer = null;
+            }
+
+            String rName = null;
+            Version rVer = null;
+            if (names.size() > 1) {
+                List<String> right = parseDelimitedString(names.get(1), "-");
+                rName = right.get(0);
+                try {
+                    rVer = Version.parseVersion(right.get(1));
+                } catch (Exception ex) {
+                    rName = names.get(1);
+                    rVer = null;
+                }
+            }
+
+            String versionClause;
+            if (lVer != null) {
+                if ((rVer != null) && (!rVer.equals(lVer))) {
+                    // Both versions are defined, but different. Make each of them part of the name
+                    lName = names.get(0);
+                    rName = names.get(1);
+                    versionClause = null;
+                } else {
+                    versionClause = getBreeVersionClause(lVer);
+                }
+            } else {
+                versionClause = getBreeVersionClause(rVer);
+            }
+
+            if ("J2SE".equals(lName)) {
+                // J2SE is not used in the Capability variant of BREE, use JavaSE here
+                // This can only happen with the lName part...
+                lName = "JavaSE";
+            }
+
+            String nameClause;
+            if (rName != null)
+                nameClause = "(" + ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE + "=" + lName + "/" + rName + ")";
+            else
+                nameClause = "(" + ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE + "=" + lName + ")";
+
+            String filter;
+            if (versionClause != null)
+                filter = "(&" + nameClause + versionClause + ")";
+            else
+                filter = nameClause;
+
+            filters.add(filter);
+        }
+
+        if (filters.size() == 0) {
+            return Collections.emptyList();
+        } else {
+            String reqFilter;
+            if (filters.size() == 1) {
+                reqFilter = filters.get(0);
+            } else {
+                // If there are more BREE filters, we need to or them together
+                StringBuilder sb = new StringBuilder("(|");
+                for (String f : filters) {
+                    sb.append(f);
+                }
+                sb.append(")");
+                reqFilter = sb.toString();
+            }
+
+            SimpleFilter sf = SimpleFilter.parse(reqFilter);
+            return Collections.<Requirement>singletonList(new RequirementImpl(
+                    resource,
+                    ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE,
+                    Collections.singletonMap(ExecutionEnvironmentNamespace.REQUIREMENT_FILTER_DIRECTIVE, reqFilter),
+                    Collections.<String, Object>emptyMap(),
+                    sf));
+        }
+    }
+
+    private static String getBreeVersionClause(Version ver) {
+        if (ver == null)
+            return null;
+
+        return "(" + ExecutionEnvironmentNamespace.CAPABILITY_VERSION_ATTRIBUTE + "=" + ver + ")";
+    }
+
     private static List<ParsedHeaderClause> normalizeRequireClauses(List<ParsedHeaderClause> clauses) {
         // Convert bundle version attribute to VersionRange type.
         for (ParsedHeaderClause clause : clauses) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/7e2c5927/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
index ab91533..ffa34ca 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
@@ -274,7 +274,7 @@ public class Deployer {
         for (Map.Entry<String, Set<String>> entry : delFeatures.entrySet()) {
             Map<String, String> map = stateFeatures.get(entry.getKey());
             if (map != null) {
-                map.entrySet().removeAll(entry.getValue());
+                map.keySet().removeAll(entry.getValue());
                 if (map.isEmpty()) {
                     stateFeatures.remove(entry.getKey());
                 }
@@ -944,11 +944,6 @@ public class Deployer {
                     if (!isBundle(wire.getProvider())) {
                         continue;
                     }
-                    // Ignore bundles that won't get deployed for some reason
-                    if (!resources.containsKey(wire.getProvider())
-                            && !(wire.getProvider() instanceof BundleRevision)) {
-                        continue;
-                    }
                     if (!wiredResources.containsKey(wire.getProvider())) {
                         wiredResources.put(wire.getProvider(), wire.getRequirement());
                     }

http://git-wip-us.apache.org/repos/asf/karaf/blob/7e2c5927/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 3fd8a39..b5ce5d5 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
@@ -77,6 +77,7 @@ import org.osgi.framework.ServiceRegistration;
 import org.osgi.framework.Version;
 import org.osgi.framework.hooks.resolver.ResolverHook;
 import org.osgi.framework.hooks.resolver.ResolverHookFactory;
+import org.osgi.framework.namespace.ExecutionEnvironmentNamespace;
 import org.osgi.framework.namespace.HostNamespace;
 import org.osgi.framework.startlevel.BundleStartLevel;
 import org.osgi.framework.startlevel.FrameworkStartLevel;
@@ -1180,6 +1181,11 @@ public class FeaturesServiceImpl implements FeaturesService, Deployer.DeployCall
             @Override
             public void filterMatches(BundleRequirement requirement, Collection<BundleCapability> candidates) {
                 if (Thread.currentThread() == thread) {
+                    // osgi.ee capabilities are provided by the system bundle, so just ignore those
+                    if (ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE
+                            .equals(requirement.getNamespace())) {
+                        return;
+                    }
                     Bundle sourceBundle = requirement.getRevision().getBundle();
                     Resource sourceResource = bndToRes.get(sourceBundle);
                     Set<Resource> wired = new HashSet<>();