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 2014/04/22 14:32:19 UTC

[1/6] git commit: [KARAF-2888] Respect start attribute on feature bundle informations

Repository: karaf
Updated Branches:
  refs/heads/master 0cb8c9133 -> 93ed3f5f1


[KARAF-2888] Respect start attribute on feature bundle informations


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

Branch: refs/heads/master
Commit: 93ed3f5f1bf1cdd5adc0907adb177144102865cd
Parents: 1b1b676
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Apr 22 14:30:57 2014 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Apr 22 14:31:49 2014 +0200

----------------------------------------------------------------------
 .../internal/service/FeaturesServiceImpl.java   | 21 ++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/93ed3f5f/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 d228632..a8ccd0a 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
@@ -895,8 +895,6 @@ public class FeaturesServiceImpl implements FeaturesService {
             }
         }
 
-        // TODO: handle bundleInfo.isStart()
-
         // Get all resources that will be used to satisfy the old features set
         Set<Resource> resourceLinkedToOldFeatures = new HashSet<Resource>();
         if (noStart) {
@@ -1188,9 +1186,6 @@ public class FeaturesServiceImpl implements FeaturesService {
                         bundle = region.installBundle(uri, is);
                     }
                     addToMapSet(managed, name, bundle.getBundleId());
-                    if (!noStart || resourceLinkedToOldFeatures.contains(resource)) {
-                        toStart.add(bundle);
-                    }
                     deployment.resToBnd.put(resource, bundle);
                     // save a checksum of installed snapshot bundle
                     if (UPDATE_SNAPSHOTS_CRC.equals(updateSnaphots)
@@ -1201,6 +1196,13 @@ public class FeaturesServiceImpl implements FeaturesService {
                     if (bi != null && bi.getStartLevel() > 0) {
                         bundle.adapt(BundleStartLevel.class).setStartLevel(bi.getStartLevel());
                     }
+                    if (resourceLinkedToOldFeatures.contains(resource)) {
+                        toStart.add(bundle);
+                    } else if (!noStart) {
+                        if (bi == null || bi.isStart()) {
+                            toStart.add(bundle);
+                        }
+                    }
                 }
             }
         }
@@ -1306,9 +1308,12 @@ public class FeaturesServiceImpl implements FeaturesService {
         }
     }
 
-    protected BundleInfo mergeBundleInfo(BundleInfo bi, BundleInfo oldBi) {
-        // TODO: we need a proper merge strategy when a bundle
-        // TODO: comes from different features
+    protected BundleInfo mergeBundleInfo(BundleInfo bi1, BundleInfo bi2) {
+        org.apache.karaf.features.internal.model.Bundle bi = new org.apache.karaf.features.internal.model.Bundle();
+        bi.setLocation(bi1.getLocation());
+        bi.setDependency(bi1.isDependency() && bi2.isDependency());
+        bi.setStart(bi1.isStart() || bi2.isStart());
+        bi.setStartLevel(Math.min(bi1.getStartLevel(), bi2.getStartLevel()));
         return bi;
     }
 


[4/6] git commit: [KARAF-2789] Upgrade to SSHD 0.11.0

Posted by gn...@apache.org.
[KARAF-2789] Upgrade to SSHD 0.11.0


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

Branch: refs/heads/master
Commit: 6057a370184abe9fddb4ca2001883de1d1cfdc60
Parents: 9944918
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Apr 22 09:35:49 2014 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Apr 22 14:31:49 2014 +0200

----------------------------------------------------------------------
 pom.xml                                         |  2 +-
 .../karaf/shell/ssh/KarafFileSystemFactory.java | 10 ++-
 .../karaf/shell/ssh/KarafFileSystemView.java    | 66 --------------------
 3 files changed, 10 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/6057a370/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 0cc1447..69ef8aa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -247,7 +247,7 @@
         <spring40.version>4.0.2.RELEASE_1</spring40.version>
         <spring.security31.version>3.1.4.RELEASE</spring.security31.version>
 
-        <sshd.version>0.10.1</sshd.version>
+        <sshd.version>0.11.0</sshd.version>
         <struts.bundle.version>1.3.10_1</struts.bundle.version>
         <xbean.version>3.16</xbean.version>
         <xerces.version>2.11.0</xerces.version>

http://git-wip-us.apache.org/repos/asf/karaf/blob/6057a370/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemFactory.java
----------------------------------------------------------------------
diff --git a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemFactory.java b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemFactory.java
index ba3b741..8d69af3 100644
--- a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemFactory.java
+++ b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemFactory.java
@@ -18,9 +18,14 @@
  */
 package org.apache.karaf.shell.ssh;
 
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.sshd.common.Session;
 import org.apache.sshd.common.file.FileSystemFactory;
 import org.apache.sshd.common.file.FileSystemView;
+import org.apache.sshd.common.file.nativefs.NativeFileSystemView;
 
 /**
  * SSHd file system factory to reduce the visibility to the KARAF_BASE.
@@ -28,7 +33,10 @@ import org.apache.sshd.common.file.FileSystemView;
 public class KarafFileSystemFactory implements FileSystemFactory {
 
     public FileSystemView createFileSystemView(Session session) {
-        return new KarafFileSystemView(session.getUsername());
+        Map<String, String> roots = new HashMap<String, String>();
+        String dir = new File(System.getProperty("karaf.base")).getAbsolutePath();
+        roots.put("/", dir);
+        return new NativeFileSystemView(session.getUsername(), roots, "/");
     }
 
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/6057a370/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemView.java
----------------------------------------------------------------------
diff --git a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemView.java b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemView.java
deleted file mode 100644
index 6724e4f..0000000
--- a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemView.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.ssh;
-
-import java.io.File;
-
-import org.apache.sshd.common.file.SshFile;
-import org.apache.sshd.common.file.nativefs.NativeFileSystemView;
-import org.apache.sshd.common.file.nativefs.NativeSshFile;
-
-/**
- * Karaf file system view reduced to the KARAF_BASE location
- */
-public class KarafFileSystemView extends NativeFileSystemView {
-
-    private String username;
-    private String location;
-
-    public KarafFileSystemView(String username) {
-        super(username);
-        this.username = username;
-    }
-
-    @Override
-    public String getVirtualUserDir() {
-        return "/";
-    }
-
-    @Override
-    public String getPhysicalUserDir() {
-        if (location == null) {
-            location = new File(System.getProperty("karaf.base")).getAbsolutePath();
-        }
-        return location;
-    }
-
-    protected SshFile getFile(String dir, String file) {
-        // get actual file object
-        String location = getPhysicalUserDir();
-        String physicalName = NativeSshFile.getPhysicalName(location, dir, file, false);
-        if (!physicalName.startsWith(location)) {
-            throw new IllegalArgumentException("The path is not relative to KARAF_BASE. For security reason, it's not allowed");
-        }
-        File fileObj = new File(physicalName);
-        // strip the root directory and return
-        String karafFileName = physicalName.substring(location.length());
-        return createNativeSshFile(karafFileName, fileObj, username);
-    }
-
-}


[5/6] git commit: [KARAF-2923] Support for user installed bundles in any region

Posted by gn...@apache.org.
[KARAF-2923] Support for user installed bundles in any region


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

Branch: refs/heads/master
Commit: 1b1b6760bd73f42bd77cb58fb56f05fc6aa1cc77
Parents: fabd10e
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Apr 22 14:30:20 2014 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Apr 22 14:31:49 2014 +0200

----------------------------------------------------------------------
 .../internal/region/SubsystemResolver.java      |  56 ++++++-
 .../internal/service/FeaturesServiceImpl.java   | 155 ++++++++++++-------
 2 files changed, 152 insertions(+), 59 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/1b1b6760/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
index 6387023..190a67d 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
@@ -41,6 +41,7 @@ import org.eclipse.equinox.region.RegionDigraph;
 import org.eclipse.equinox.region.RegionFilterBuilder;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.wiring.BundleRevision;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Requirement;
 import org.osgi.resource.Resource;
@@ -77,7 +78,7 @@ public class SubsystemResolver {
     public Map<Resource, List<Wire>> resolve(
             List<Repository> repositories,
             Map<String, Set<String>> features,
-            Collection<? extends Resource> system,
+            Map<String, Set<BundleRevision>> system,
             Set<String> overrides,
             String featureResolutionRange
     ) throws Exception {
@@ -117,8 +118,22 @@ public class SubsystemResolver {
         root.preResolve(allFeatures, manager, overrides, featureResolutionRange);
 
         // Add system resources
-        for (Resource res : system) {
-            root.addSystemResource(res);
+        for (Map.Entry<String, Set<BundleRevision>> entry : system.entrySet()) {
+            Subsystem ss = null;
+            String[] parts = entry.getKey().split("/");
+            String path = parts[0];
+            if (path.equals(root.getName())) {
+                ss = root;
+            }
+            for (int i = 1; ss != null && i < parts.length; i++) {
+                path += "/" + parts[i];
+                ss = ss.getChild(path);
+            }
+            if (ss != null) {
+                for (Resource res : entry.getValue()) {
+                    ss.addSystemResource(res);
+                }
+            }
         }
 
         // Populate digraph and resolve
@@ -147,6 +162,41 @@ public class SubsystemResolver {
         return wiring;
     }
 
+    public RegionDigraph getFlatDigraph() throws BundleException, InvalidSyntaxException {
+        RegionDigraph clone = this.digraph.copy();
+        RegionDigraph computedDigraph = digraph;
+        for (Region r : clone.getRegions()) {
+            clone.removeRegion(r);
+        }
+        Map<String, String> flats = getFlatSubsystemsMap();
+        for (Region r : computedDigraph.getRegions()) {
+            if (r.getName().equals(flats.get(r.getName()))) {
+                clone.createRegion(r.getName());
+            }
+        }
+        for (Region r : computedDigraph.getRegions()) {
+            for (RegionDigraph.FilteredRegion fr : computedDigraph.getEdges(r)) {
+                String rt = flats.get(r.getName());
+                String rh = flats.get(fr.getRegion().getName());
+                if (!rh.equals(rt)) {
+                    Region tail = clone.getRegion(rt);
+                    Region head = clone.getRegion(rh);
+                    RegionFilterBuilder rfb = clone.createRegionFilterBuilder();
+                    for (Map.Entry<String, Collection<String>> entry : fr.getFilter().getSharingPolicy().entrySet()) {
+                        // Discard osgi.identity namespace
+                        if (!IDENTITY_NAMESPACE.equals(entry.getKey())) {
+                            for (String f : entry.getValue()) {
+                                rfb.allow(entry.getKey(), f);
+                            }
+                        }
+                    }
+                    clone.connect(tail, rfb.build(), head);
+                }
+            }
+        }
+        return clone;
+    }
+
     public Map<String, String> getFlatSubsystemsMap() {
         Map<String, String> toFlatten = new HashMap<String, String>();
         findSubsystemsToFlatten(root, toFlatten);

http://git-wip-us.apache.org/repos/asf/karaf/blob/1b1b6760/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 b7b3d13..d228632 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
@@ -811,27 +811,49 @@ public class FeaturesServiceImpl implements FeaturesService {
         boolean simulate = options.contains(Option.Simulate);
 
         Map<String, Set<String>> installed = state.installedFeatures;
-        Map<String, Set<Long>> managed = state.managedBundles;
+        Map<String, Set<Long>> managed = copyMapSet(state.managedBundles);
 
-        // Get a list of resolved and unmanaged bundles to use as capabilities during resolution
-        List<BundleRevision> systemBundles = new ArrayList<BundleRevision>();
         Bundle[] bundles = systemBundleContext.getBundles();
-        for (Bundle bundle : bundles) {
-            if (bundle.getState() >= Bundle.RESOLVED) {
-                boolean bm = false;
-                for (Set<Long> m : managed.values()) {
-                    bm |= m.contains(bundle.getBundleId());
+
+        // Get a map of unmanaged bundles to use as capabilities during resolution
+        Map<String, Set<BundleRevision>> unmanagedBundles = new HashMap<String, Set<BundleRevision>>();
+        Map<String, Map<String, Map<String, Set<String>>>> policies = new HashMap<String, Map<String, Map<String, Set<String>>>>();
+        {
+            RegionDigraph clone = digraph.copy();
+            for (Region region : clone.getRegions()) {
+                // Get bundles
+                Set<Long> ids = new HashSet<Long>(region.getBundleIds());
+                if (managed.containsKey(region.getName())) {
+                    ids.removeAll(managed.get(region.getName()));
                 }
-                if (!bm) {
-                    BundleRevision res = bundle.adapt(BundleRevision.class);
-                    systemBundles.add(res);
+                if (!ids.isEmpty()) {
+                    Set<BundleRevision> revs = new HashSet<BundleRevision>();
+                    for (Bundle bundle : bundles) {
+                        if (ids.contains(bundle.getBundleId())) {
+                            revs.add(bundle.adapt(BundleRevision.class));
+                        }
+                    }
+                    unmanagedBundles.put(region.getName(), revs);
+                }
+                // Get policies
+                Map<String, Map<String, Set<String>>> edges = new HashMap<String, Map<String, Set<String>>>();
+                for (RegionDigraph.FilteredRegion fr : clone.getEdges(region)) {
+                    Map<String, Set<String>> policy = new HashMap<String, Set<String>>();
+                    Map<String, Collection<String>> current = fr.getFilter().getSharingPolicy();
+                    for (String ns : current.keySet()) {
+                        for (String f : current.get(ns)) {
+                            addToMapSet(policy, ns, f);
+                        }
+                    }
+                    edges.put(fr.getRegion().getName(), policy);
                 }
+                policies.put(region.getName(), edges);
             }
         }
+
         // Resolve
         // TODO: requirements
         // TODO: bundles
-        Set<String>  overrides    = Overrides.loadOverrides(this.overrides);
         Repository[] repositories = listRepositories();
 
         if (!installed.containsKey(ROOT_REGION)) {
@@ -842,8 +864,8 @@ public class FeaturesServiceImpl implements FeaturesService {
         Map<Resource, List<Wire>> resolution = resolver.resolve(
                 Arrays.asList(repositories),
                 features,
-                systemBundles,
-                overrides,
+                unmanagedBundles,
+                Overrides.loadOverrides(this.overrides),
                 featureResolutionRange);
         Collection<Resource> allResources = resolution.keySet();
         Map<String, StreamProvider> providers = resolver.getProviders();
@@ -1043,54 +1065,75 @@ public class FeaturesServiceImpl implements FeaturesService {
         //
         // Update regions
         //
-        // TODO: this replace the whole digraph with the computed one
-        // TODO: we need to be smarter and allow user modifications or
-        // TODO: externally managed regions such as the one managed
-        // TODO: by aries subsystems
-        RegionDigraph clone = this.digraph.copy();
-        RegionDigraph computedDigraph = resolver.getDigraph();
-        for (Region r : clone.getRegions()) {
-            clone.removeRegion(r);
-        }
-        Map<String, String> flats = resolver.getFlatSubsystemsMap();
-        for (Region r : computedDigraph.getRegions()) {
-            if (r.getName().equals(flats.get(r.getName()))) {
-                clone.createRegion(r.getName());
-            }
-        }
-        for (Region r : computedDigraph.getRegions()) {
-            for (RegionDigraph.FilteredRegion fr : computedDigraph.getEdges(r)) {
-                String rt = flats.get(r.getName());
-                String rh = flats.get(fr.getRegion().getName());
-                if (!rh.equals(rt)) {
-                    Region tail = clone.getRegion(rt);
-                    Region head = clone.getRegion(rh);
-                    RegionFilterBuilder rfb = clone.createRegionFilterBuilder();
-                    for (Map.Entry<String, Collection<String>> entry : fr.getFilter().getSharingPolicy().entrySet()) {
-                        // Discard osgi.identity namespace
-                        if (!IdentityNamespace.IDENTITY_NAMESPACE.equals(entry.getKey())) {
-                            for (String f : entry.getValue()) {
-                                rfb.allow(entry.getKey(), f);
-                            }
+        {
+            RegionDigraph clone = digraph.copy();
+            RegionDigraph computedDigraph = resolver.getFlatDigraph();
+            // Iterate through previously managed regions and
+            // delete those that do not contain any bundles anymore
+            for (String name : state.managedBundles.keySet()) {
+                if (!managed.containsKey(name) && !unmanagedBundles.containsKey(name)) {
+                    policies.remove(name);
+                }
+            }
+            // Fix broken filters
+            for (String name : policies.keySet()) {
+                policies.get(name).keySet().retainAll(policies.keySet());
+            }
+            // Update managed regions
+            for (Region computedRegion : computedDigraph.getRegions()) {
+                String name = computedRegion.getName();
+                Map<String, Map<String, Set<String>>> policy = policies.get(name);
+                if (policy == null) {
+                    policy = new HashMap<String, Map<String, Set<String>>>();
+                    policies.put(name, policy);
+                }
+                for (RegionDigraph.FilteredRegion fr : computedDigraph.getEdges(computedRegion)) {
+                    String r2 = fr.getRegion().getName();
+                    Map<String, Set<String>> filters = new HashMap<String, Set<String>>();
+                    Map<String, Collection<String>> current = fr.getFilter().getSharingPolicy();
+                    for (String ns : current.keySet()) {
+                        for (String f : current.get(ns)) {
+                            addToMapSet(filters, ns, f);
                         }
                     }
-                    clone.connect(tail, rfb.build(), head);
+                    policy.put(r2, filters);
                 }
             }
-        }
-        // Spread bundles across regions
-        Region root = clone.getRegion(ROOT_REGION);
-        for (BundleRevision revision : systemBundles) {
-            root.addBundle(revision.getBundle());
-        }
-        for (Resource resource : resources.keySet()) {
-            Bundle bundle = deployment.resToBnd.get(resource);
-            if (bundle != null) {
-                String region = resources.get(resource);
-                clone.getRegion(region).addBundle(bundle);
+            // Apply all changes
+            for (Region region : clone.getRegions()) {
+                clone.removeRegion(region);
             }
+            for (String name : policies.keySet()) {
+                clone.createRegion(name);
+            }
+            for (String r1Name : policies.keySet()) {
+                Region r1 = clone.getRegion(r1Name);
+                Map<String, Map<String, Set<String>>> policy = policies.get(r1Name);
+                for (String r2Name : policy.keySet()) {
+                    Region r2 = clone.getRegion(r2Name);
+                    RegionFilterBuilder rfb = clone.createRegionFilterBuilder();
+                    for (String ns : policy.get(r2Name).keySet()) {
+                        for (String f : policy.get(r2Name).get(ns)) {
+                            rfb.allow(ns, f);
+                        }
+                    }
+                    clone.connect(r1, rfb.build(), r2);
+                }
+                // Dispatch bundles
+                if (unmanagedBundles.containsKey(r1Name)) {
+                    for (BundleRevision rev : unmanagedBundles.get(r1Name)) {
+                        r1.addBundle(rev.getBundle());
+                    }
+                }
+                if (managed.containsKey(r1Name)) {
+                    for (long id : managed.get(r1Name)) {
+                        r1.addBundle(id);
+                    }
+                }
+            }
+            this.digraph.replace(clone);
         }
-        this.digraph.replace(clone);
+
 
         //
         // Update bundles


[3/6] git commit: [KARAF-2923] Use standard service namespace, remote IdentityCapability

Posted by gn...@apache.org.
[KARAF-2923] Use standard service namespace, remote IdentityCapability


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

Branch: refs/heads/master
Commit: 99449184b6f8462bc6e2d334a95ed6ccc6ab70c5
Parents: 0cb8c91
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Apr 22 09:29:25 2014 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Apr 22 14:31:49 2014 +0200

----------------------------------------------------------------------
 .../resources/etc/config.properties             |  8 +--
 .../standard/src/main/feature/feature.xml       |  2 +-
 features/core/pom.xml                           |  2 +-
 .../internal/resolver/IdentityCapability.java   | 63 --------------------
 .../internal/resolver/ResourceBuilder.java      |  1 +
 .../internal/resolver/ResourceImpl.java         | 10 +++-
 .../internal/resolver/ServiceNamespace.java     | 30 ----------
 .../karaf/features/internal/service/f07.xml     |  2 +-
 instance/pom.xml                                |  2 +-
 management/server/pom.xml                       |  2 +-
 shell/core/pom.xml                              |  2 +-
 11 files changed, 18 insertions(+), 106 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/99449184/assemblies/features/framework/src/main/filtered-resources/resources/etc/config.properties
----------------------------------------------------------------------
diff --git a/assemblies/features/framework/src/main/filtered-resources/resources/etc/config.properties b/assemblies/features/framework/src/main/filtered-resources/resources/etc/config.properties
index 3aeac29..d9f3114 100644
--- a/assemblies/features/framework/src/main/filtered-resources/resources/etc/config.properties
+++ b/assemblies/features/framework/src/main/filtered-resources/resources/etc/config.properties
@@ -122,14 +122,10 @@ org.osgi.framework.system.packages.extra= \
 
 org.osgi.framework.system.capabilities= \
  ${eecap-${java.specification.version}}, \
- service-reference;effective:=active;objectClass=org.osgi.service.packageadmin.PackageAdmin, \
- service-reference;effective:=active;objectClass=org.osgi.service.startlevel.StartLevel, \
- service-reference;effective:=active;objectClass=org.osgi.service.url.URLHandlers, \
+ osgi.service;effective:=active;objectClass=org.osgi.service.packageadmin.PackageAdmin, \
+ osgi.service;effective:=active;objectClass=org.osgi.service.startlevel.StartLevel, \
  ${services-${karaf.framework}}
 
-services-felix= \
- service-reference;effective:=active;objectClass=org.apache.felix.framework.monitor.MonitoringService
-
 eecap-1.7= osgi.ee; osgi.ee="OSGi/Minimum"; version:List<Version>="1.0,1.1,1.2", \
  osgi.ee; osgi.ee="JavaSE"; version:List<Version>="1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7"
 eecap-1.6= osgi.ee; osgi.ee="OSGi/Minimum"; version:List<Version>="1.0,1.1,1.2", \

http://git-wip-us.apache.org/repos/asf/karaf/blob/99449184/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 e7d77c5..eb11953 100644
--- a/assemblies/features/standard/src/main/feature/feature.xml
+++ b/assemblies/features/standard/src/main/feature/feature.xml
@@ -36,7 +36,7 @@
         <bundle start-level="20">mvn:org.apache.aries.proxy/org.apache.aries.proxy.api/${aries.proxy.api.version}</bundle>
         <bundle start-level="20">mvn:org.apache.aries.proxy/org.apache.aries.proxy.impl/${aries.proxy.version}</bundle>
         <capability>
-            service-reference;effective:=active;objectClass=org.apache.aries.proxy.ProxyManager
+            osgi.service;effective:=active;objectClass=org.apache.aries.proxy.ProxyManager
         </capability>
     </feature>
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/99449184/features/core/pom.xml
----------------------------------------------------------------------
diff --git a/features/core/pom.xml b/features/core/pom.xml
index 8998ba9..52500d8 100644
--- a/features/core/pom.xml
+++ b/features/core/pom.xml
@@ -126,7 +126,7 @@
                             *
                         </Import-Package>
                         <Provide-Capability>
-                            service-reference;effective:=active;objectClass=org.apache.karaf.features.FeaturesService
+                            osgi.service;effective:=active;objectClass=org.apache.karaf.features.FeaturesService
                         </Provide-Capability>
                         <Private-Package>
                             org.apache.karaf.features.internal.*,

http://git-wip-us.apache.org/repos/asf/karaf/blob/99449184/features/core/src/main/java/org/apache/karaf/features/internal/resolver/IdentityCapability.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/IdentityCapability.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/IdentityCapability.java
deleted file mode 100644
index 20e94fa..0000000
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/IdentityCapability.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.features.internal.resolver;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.osgi.framework.Version;
-import org.osgi.framework.namespace.IdentityNamespace;
-import org.osgi.resource.Capability;
-import org.osgi.resource.Resource;
-
-public class IdentityCapability extends BaseClause implements Capability
-{
-    private final Resource m_resource;
-    private final Map<String, String> m_dirs;
-    private final Map<String, Object> m_attrs;
-
-    public IdentityCapability(Resource resource, String name, String type, Version version)
-    {
-        m_resource = resource;
-        m_dirs = new HashMap<String, String>();
-        m_attrs = new HashMap<String, Object>();
-        m_attrs.put(IdentityNamespace.IDENTITY_NAMESPACE, name);
-        m_attrs.put(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE, type);
-        m_attrs.put(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE, version);
-    }
-
-    public String getNamespace()
-    {
-        return IdentityNamespace.IDENTITY_NAMESPACE;
-    }
-
-    public Map<String, String> getDirectives()
-    {
-        return m_dirs;
-    }
-
-    public Map<String, Object> getAttributes()
-    {
-        return m_attrs;
-    }
-
-    public Resource getResource()
-    {
-        return m_resource;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/karaf/blob/99449184/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 941ed8c..68f8af6 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
@@ -32,6 +32,7 @@ import org.osgi.framework.Version;
 import org.osgi.framework.namespace.IdentityNamespace;
 import org.osgi.framework.wiring.BundleCapability;
 import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.namespace.service.ServiceNamespace;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Requirement;
 import org.osgi.resource.Resource;

http://git-wip-us.apache.org/repos/asf/karaf/blob/99449184/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java
index 18e0dc3..873720e 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java
@@ -17,7 +17,9 @@
 package org.apache.karaf.features.internal.resolver;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.osgi.framework.Version;
 import org.osgi.framework.namespace.IdentityNamespace;
@@ -39,7 +41,13 @@ public class ResourceImpl implements Resource {
     public ResourceImpl(String name, String type, Version version)
     {
         m_caps = new ArrayList<Capability>();
-        m_caps.add(0, new IdentityCapability(this, name, type, version));
+        Map<String, String> dirs = new HashMap<String, String>();
+        Map<String, Object> attrs = new HashMap<String, Object>();
+        attrs.put(IdentityNamespace.IDENTITY_NAMESPACE, name);
+        attrs.put(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE, type);
+        attrs.put(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE, version);
+        CapabilityImpl identity = new CapabilityImpl(this, IdentityNamespace.IDENTITY_NAMESPACE, dirs, attrs);
+        m_caps.add(identity);
         m_reqs = new ArrayList<Requirement>();
     }
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/99449184/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ServiceNamespace.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ServiceNamespace.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ServiceNamespace.java
deleted file mode 100644
index 4fe3bf8..0000000
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ServiceNamespace.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.features.internal.resolver;
-
-import org.osgi.resource.Namespace;
-
-/**
- */
-public final class ServiceNamespace extends Namespace {
-
-    public static final String SERVICE_NAMESPACE = "service-reference";
-
-    private ServiceNamespace() {
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/karaf/blob/99449184/features/core/src/test/resources/org/apache/karaf/features/internal/service/f07.xml
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/service/f07.xml b/features/core/src/test/resources/org/apache/karaf/features/internal/service/f07.xml
index 8165d14..354ba86 100644
--- a/features/core/src/test/resources/org/apache/karaf/features/internal/service/f07.xml
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/service/f07.xml
@@ -28,7 +28,7 @@
             <bundle>mvn:org.springframework/spring-web/2.5.6.SEC02</bundle>
         </conditional>
         <capability>
-            service-reference;effective:=active;objectClass=org.apache.aries.proxy.ProxyManager
+            osgi.service;effective:=active;objectClass=org.apache.aries.proxy.ProxyManager
         </capability>
         <scoping>
             <export namespace="osgi.service">

http://git-wip-us.apache.org/repos/asf/karaf/blob/99449184/instance/pom.xml
----------------------------------------------------------------------
diff --git a/instance/pom.xml b/instance/pom.xml
index 8d6ba13..4d1962b 100644
--- a/instance/pom.xml
+++ b/instance/pom.xml
@@ -164,7 +164,7 @@
                             *
                         </Import-Package>
                         <Provide-Capability>
-                            service-reference;effective:=active;objectClass=org.apache.karaf.instance.core.InstanceService
+                            osgi.service;effective:=active;objectClass=org.apache.karaf.instance.core.InstanceService
                         </Provide-Capability>
                         <Private-Package>
                             org.apache.karaf.jpm,

http://git-wip-us.apache.org/repos/asf/karaf/blob/99449184/management/server/pom.xml
----------------------------------------------------------------------
diff --git a/management/server/pom.xml b/management/server/pom.xml
index c522874..f5ad253 100644
--- a/management/server/pom.xml
+++ b/management/server/pom.xml
@@ -118,7 +118,7 @@
                             org.apache.karaf.util.tracker
                         </Private-Package>
                         <Provide-Capability>
-                            service-reference;effective:=active;objectClass=javax.management.MBeanServer
+                            osgi.service;effective:=active;objectClass=javax.management.MBeanServer
                         </Provide-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.management.internal.Activator

http://git-wip-us.apache.org/repos/asf/karaf/blob/99449184/shell/core/pom.xml
----------------------------------------------------------------------
diff --git a/shell/core/pom.xml b/shell/core/pom.xml
index 572430c..d6af05d 100644
--- a/shell/core/pom.xml
+++ b/shell/core/pom.xml
@@ -156,7 +156,7 @@
                             org.apache.felix.service.threadio,
                         </Private-Package>
                         <Provide-Capability>
-                            service-reference;effective:=active;objectClass=org.apache.karaf.shell.api.console.SessionFactory
+                            osgi.service;effective:=active;objectClass=org.apache.karaf.shell.api.console.SessionFactory
                         </Provide-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.shell.impl.console.osgi.Activator


[2/6] git commit: [KARAF-2923] Add back overrides support

Posted by gn...@apache.org.
[KARAF-2923] Add back overrides support


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

Branch: refs/heads/master
Commit: fabd10e2b33aa656ae30b35566e1642bb120875c
Parents: e8023c6
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Apr 22 10:36:45 2014 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Apr 22 14:31:49 2014 +0200

----------------------------------------------------------------------
 .../features/internal/region/Subsystem.java     | 36 +++++++++++++++-----
 .../internal/region/SubsystemResolver.java      |  4 +--
 .../internal/resolver/FeatureResource.java      |  4 +--
 .../internal/service/FeaturesServiceImpl.java   |  2 +-
 .../features/internal/service/Overrides.java    |  4 +--
 .../features/internal/region/SubsystemTest.java | 22 ++++++++++++
 .../karaf/features/internal/region/data3/a.mf   |  5 +++
 .../karaf/features/internal/region/data3/b.mf   |  5 +++
 .../features/internal/region/data3/features.xml | 25 ++++++++++++++
 9 files changed, 91 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
index 8d55317..98d5f60 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
@@ -42,6 +42,7 @@ import org.apache.karaf.features.internal.resolver.RequirementImpl;
 import org.apache.karaf.features.internal.resolver.ResourceBuilder;
 import org.apache.karaf.features.internal.resolver.ResourceImpl;
 import org.apache.karaf.features.internal.resolver.ResourceUtils;
+import org.apache.karaf.features.internal.service.Overrides;
 import org.eclipse.equinox.region.RegionFilter;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.Version;
@@ -205,9 +206,10 @@ public class Subsystem extends ResourceImpl {
     @SuppressWarnings("InfiniteLoopStatement")
     public void preResolve(Collection<Feature> features,
                            DownloadManager manager,
+                           Set<String> overrides,
                            String featureResolutionRange) throws Exception {
         for (Subsystem child : children) {
-            child.preResolve(features, manager, featureResolutionRange);
+            child.preResolve(features, manager, overrides, featureResolutionRange);
         }
         List<Requirement> processed = new ArrayList<Requirement>();
         while (true) {
@@ -229,7 +231,7 @@ public class Subsystem extends ResourceImpl {
                                 Subsystem fs = getChild(ssName);
                                 if (fs == null) {
                                     fs = new Subsystem(ssName, feature, this);
-                                    fs.preResolve(features, manager, featureResolutionRange);
+                                    fs.preResolve(features, manager, overrides, featureResolutionRange);
                                     installable.add(fs);
                                     children.add(fs);
                                 }
@@ -241,7 +243,7 @@ public class Subsystem extends ResourceImpl {
             }
         }
         if (feature != null) {
-            final Map<String, Resource> bundles = new ConcurrentHashMap<String, Resource>();
+            final Map<String, ResourceImpl> bundles = new ConcurrentHashMap<String, ResourceImpl>();
             final Downloader downloader = manager.createDownloader();
             final Map<BundleInfo, Boolean> infos = new HashMap<BundleInfo, Boolean>();
             for (Conditional cond : feature.getConditional()) {
@@ -255,21 +257,37 @@ public class Subsystem extends ResourceImpl {
             for (Map.Entry<BundleInfo, Boolean> entry : infos.entrySet()) {
                 final BundleInfo bi = entry.getKey();
                 final String loc = bi.getLocation();
-                final boolean mandatory = entry.getValue();
                 downloader.download(loc, new DownloadCallback() {
                     @Override
                     public void downloaded(StreamProvider provider) throws Exception {
                         ResourceImpl res = createResource(loc, provider.getMetadata());
                         bundles.put(loc, res);
-                        if (bi.isDependency()) {
-                            addDependency(res, false);
-                        } else {
-                            doAddDependency(res, mandatory);
-                        }
+                    }
+                });
+            }
+            for (String override : overrides) {
+                final String loc = Overrides.extractUrl(override);
+                downloader.download(loc, new DownloadCallback() {
+                    @Override
+                    public void downloaded(StreamProvider provider) throws Exception {
+                        ResourceImpl res = createResource(loc, provider.getMetadata());
+                        bundles.put(loc, res);
                     }
                 });
             }
             downloader.await();
+            Overrides.override(bundles, overrides);
+            for (Map.Entry<BundleInfo, Boolean> entry : infos.entrySet()) {
+                final BundleInfo bi = entry.getKey();
+                final String loc = bi.getLocation();
+                final boolean mandatory = entry.getValue();
+                ResourceImpl res = bundles.get(loc);
+                if (bi.isDependency()) {
+                    addDependency(res, false);
+                } else {
+                    doAddDependency(res, mandatory);
+                }
+            }
             for (Dependency dep : feature.getDependencies()) {
                 Subsystem ss = this;
                 while (!ss.isAcceptDependencies()) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
index 8a98328..6387023 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
@@ -24,7 +24,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeMap;
 
 import org.apache.felix.resolver.ResolverImpl;
 import org.apache.felix.resolver.Util;
@@ -79,6 +78,7 @@ public class SubsystemResolver {
             List<Repository> repositories,
             Map<String, Set<String>> features,
             Collection<? extends Resource> system,
+            Set<String> overrides,
             String featureResolutionRange
     ) throws Exception {
         // Build subsystems on the fly
@@ -114,7 +114,7 @@ public class SubsystemResolver {
         for (Repository repo : repositories) {
             allFeatures.addAll(Arrays.asList(repo.getFeatures()));
         }
-        root.preResolve(allFeatures, manager, featureResolutionRange);
+        root.preResolve(allFeatures, manager, overrides, featureResolutionRange);
 
         // Add system resources
         for (Resource res : system) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/features/core/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java
index 99e1253..707a213 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/FeatureResource.java
@@ -38,7 +38,7 @@ public class FeatureResource extends ResourceImpl {
 
     private final Feature feature;
 
-    public static FeatureResource build(Feature feature, Conditional conditional, String featureRange, Map<String, Resource> locToRes) throws BundleException {
+    public static FeatureResource build(Feature feature, Conditional conditional, String featureRange, Map<String, ? extends Resource> locToRes) throws BundleException {
         Feature fcond = conditional.asFeature(feature.getName(), feature.getVersion());
         FeatureResource resource = build(fcond, featureRange, locToRes);
         for (String cond : conditional.getCondition()) {
@@ -63,7 +63,7 @@ public class FeatureResource extends ResourceImpl {
         return resource;
     }
 
-    public static FeatureResource build(Feature feature, String featureRange, Map<String, Resource> locToRes) throws BundleException {
+    public static FeatureResource build(Feature feature, String featureRange, Map<String, ? extends Resource> locToRes) throws BundleException {
         FeatureResource resource = new FeatureResource(feature);
         for (BundleInfo info : feature.getBundles()) {
             if (!info.isDependency()) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/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 ec5b55d..b7b3d13 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
@@ -831,7 +831,6 @@ public class FeaturesServiceImpl implements FeaturesService {
         // Resolve
         // TODO: requirements
         // TODO: bundles
-        // TODO: overrides
         Set<String>  overrides    = Overrides.loadOverrides(this.overrides);
         Repository[] repositories = listRepositories();
 
@@ -844,6 +843,7 @@ public class FeaturesServiceImpl implements FeaturesService {
                 Arrays.asList(repositories),
                 features,
                 systemBundles,
+                overrides,
                 featureResolutionRange);
         Collection<Resource> allResources = resolution.keySet();
         Map<String, StreamProvider> providers = resolver.getProviders();

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java
index 233a8a2..238b007 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/Overrides.java
@@ -65,12 +65,12 @@ public class Overrides {
      * @param resources the list of resources to resolve
      * @param overrides list of bundle overrides
      */
-    public static void override(Map<String, Resource> resources, Collection<String> overrides) {
+    public static <T extends Resource> void override(Map<String, T> resources, Collection<String> overrides) {
         // Do override replacement
         for (Clause override : Parser.parseClauses(overrides.toArray(new String[overrides.size()]))) {
             String url = override.getName();
             String vr  = override.getAttribute(OVERRIDE_RANGE);
-            Resource over = resources.get(url);
+            T over = resources.get(url);
             if (over == null) {
                 // Ignore invalid overrides
                 continue;

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java
----------------------------------------------------------------------
diff --git a/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java b/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java
index 0ef26cb..c16de51 100644
--- a/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java
+++ b/features/core/src/test/java/org/apache/karaf/features/internal/region/SubsystemTest.java
@@ -64,6 +64,7 @@ public class SubsystemTest {
         resolver.resolve(Collections.<Repository>singletonList(repo),
                          features,
                          Collections.<Resource>emptyList(),
+                         Collections.<String>emptySet(),
                          FeaturesServiceImpl.DEFAULT_FEATURE_RESOLUTION_RANGE);
 
         verify(resolver, expected);
@@ -93,11 +94,32 @@ public class SubsystemTest {
         resolver.resolve(Collections.<Repository>singletonList(repo),
                          features,
                          Collections.<Resource>emptyList(),
+                         Collections.<String>emptySet(),
                          FeaturesServiceImpl.DEFAULT_FEATURE_RESOLUTION_RANGE);
 
         verify(resolver, expected);
     }
 
+    @Test
+    public void testOverrides() throws Exception {
+        RepositoryImpl repo = new RepositoryImpl(getClass().getResource("data3/features.xml").toURI());
+
+        Map<String, Set<String>> features = new HashMap<String, Set<String>>();
+        addToMapSet(features, "root/apps1", "f1");
+
+        Map<String, Set<String>> expected = new HashMap<String, Set<String>>();
+        addToMapSet(expected, "root/apps1", "a/1.0.1");
+
+        SubsystemResolver resolver = new SubsystemResolver(new TestDownloadManager("data3"));
+        resolver.resolve(Collections.<Repository>singletonList(repo),
+                features,
+                Collections.<Resource>emptyList(),
+                Collections.singleton("b"),
+                FeaturesServiceImpl.DEFAULT_FEATURE_RESOLUTION_RANGE);
+
+        verify(resolver, expected);
+    }
+
     private void verify(SubsystemResolver resolver, Map<String, Set<String>> expected) {
         Map<String, Set<String>> mapping = getBundleNamesPerRegions(resolver);
         if (!expected.equals(mapping)) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/a.mf
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/a.mf b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/a.mf
new file mode 100644
index 0000000..20a7811
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/a.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: a
+Bundle-Version: 1.0.0
+

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/b.mf
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/b.mf b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/b.mf
new file mode 100644
index 0000000..a5439b0
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/b.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: a
+Bundle-Version: 1.0.1
+

http://git-wip-us.apache.org/repos/asf/karaf/blob/fabd10e2/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/features.xml
----------------------------------------------------------------------
diff --git a/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/features.xml b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/features.xml
new file mode 100644
index 0000000..575f957
--- /dev/null
+++ b/features/core/src/test/resources/org/apache/karaf/features/internal/region/data3/features.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements. See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License. You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<features name="test" xmlns="http://karaf.apache.org/xmlns/features/v1.3.0">
+
+    <feature name="f1">
+        <bundle>a</bundle>
+    </feature>
+
+</features>
\ No newline at end of file


[6/6] git commit: [KARAF-2888] Respect start level when starting and stopping bundles

Posted by gn...@apache.org.
[KARAF-2888] Respect start level when starting and stopping bundles


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

Branch: refs/heads/master
Commit: e8023c6ff4434b349483f2790a62370d3d1f2940
Parents: 6057a37
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Apr 22 10:13:30 2014 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Apr 22 14:31:49 2014 +0200

----------------------------------------------------------------------
 .../karaf/features/internal/osgi/Activator.java |  3 --
 .../internal/service/FeaturesServiceImpl.java   | 29 ++++++++++++--------
 2 files changed, 18 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/e8023c6f/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
index 0551d21..b2cdd6e 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
@@ -121,9 +121,6 @@ public class Activator extends BaseActivator {
         register(ManagedService.class, featureFinder, props);
 
        FeatureConfigInstaller configInstaller = new FeatureConfigInstaller(configurationAdmin);
-        // TODO: honor respectStartLvlDuringFeatureStartup and respectStartLvlDuringFeatureUninstall
-//        boolean respectStartLvlDuringFeatureStartup = getBoolean("respectStartLvlDuringFeatureStartup", true);
-//        boolean respectStartLvlDuringFeatureUninstall = getBoolean("respectStartLvlDuringFeatureUninstall", true);
         String overrides = getString("overrides", new File(System.getProperty("karaf.etc"), "overrides.properties").toURI().toString());
         String featureResolutionRange = getString("featureResolutionRange", FeaturesServiceImpl.DEFAULT_FEATURE_RESOLUTION_RANGE);
         String bundleUpdateRange = getString("bundleUpdateRange", FeaturesServiceImpl.DEFAULT_BUNDLE_UPDATE_RANGE);

http://git-wip-us.apache.org/repos/asf/karaf/blob/e8023c6f/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 84b9529..ec5b55d 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
@@ -31,6 +31,7 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.concurrent.Callable;
@@ -888,7 +889,6 @@ public class FeaturesServiceImpl implements FeaturesService {
         //
         // Compute deployment
         //
-        // TODO: compute bundles/region mapping to support multiple bundles and bunde moving into a different region
         Deployment deployment = computeDeployment(resolver, state);
 
         if (deployment.regions.isEmpty()) {
@@ -1469,19 +1469,22 @@ public class FeaturesServiceImpl implements FeaturesService {
     }
 
     protected List<Bundle> getBundlesToStart(Collection<Bundle> bundles) {
-        // TODO: make this pluggable ?
-        // TODO: honor respectStartLvlDuringFeatureStartup
+        // Restart the features service last, regardless of any other consideration
+        // so that we don't end up with the service trying to do stuff before we're done
+        boolean restart = bundles.remove(bundle);
+
+        SortedMap<Integer, Set<Bundle>> bundlesPerStartLevel = new TreeMap<Integer, Set<Bundle>>();
+        for (Bundle bundle : bundles) {
+            int sl = bundle.adapt(BundleStartLevel.class).getStartLevel();
+            addToMapSet(bundlesPerStartLevel, sl, bundle);
+        }
+        bundles = bundlesPerStartLevel.remove(bundlesPerStartLevel.firstKey());
 
         // We hit FELIX-2949 if we don't use the correct order as Felix resolver isn't greedy.
         // In order to minimize that, we make sure we resolve the bundles in the order they
         // are given back by the resolution, meaning that all root bundles (i.e. those that were
         // not flagged as dependencies in features) are started before the others.   This should
         // make sure those important bundles are started first and minimize the problem.
-
-        // Restart the features service last, regardless of any other consideration
-        // so that we don't end up with the service trying to do stuff before we're done
-        boolean restart = bundles.remove(bundle);
-
         List<BundleRevision> revs = new ArrayList<BundleRevision>();
         for (Bundle bundle : bundles) {
             revs.add(bundle.adapt(BundleRevision.class));
@@ -1490,15 +1493,19 @@ public class FeaturesServiceImpl implements FeaturesService {
         for (BundleRevision rev : RequirementSort.sort(revs)) {
             sorted.add(rev.getBundle());
         }
-        if (restart) {
+        if (sorted.isEmpty() && restart) {
             sorted.add(bundle);
         }
         return sorted;
     }
 
     protected List<Bundle> getBundlesToStop(Collection<Bundle> bundles) {
-        // TODO: make this pluggable ?
-        // TODO: honor respectStartLvlDuringFeatureUninstall
+        SortedMap<Integer, Set<Bundle>> bundlesPerStartLevel = new TreeMap<Integer, Set<Bundle>>();
+        for (Bundle bundle : bundles) {
+            int sl = bundle.adapt(BundleStartLevel.class).getStartLevel();
+            addToMapSet(bundlesPerStartLevel, sl, bundle);
+        }
+        bundles = bundlesPerStartLevel.get(bundlesPerStartLevel.lastKey());
 
         List<Bundle> bundlesToDestroy = new ArrayList<Bundle>();
         for (Bundle bundle : bundles) {