[KARAF-3712] Register Repository services

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

Branch: refs/heads/master
Commit: 450f5512d4913aa8b01a41c6f5d50091af21226f
Parents: c610b47
Author: Guillaume Nodet <[email protected]>
Authored: Thu Apr 30 21:47:06 2015 +0200
Committer: Guillaume Nodet <[email protected]>
Committed: Thu Apr 30 21:47:06 2015 +0200

----------------------------------------------------------------------
 .../cave/server/storage/CaveRepositoryImpl.java |  4 ++
 .../storage/CaveRepositoryServiceImpl.java      | 59 ++++++++++++++++----
 .../OSGI-INF/blueprint/cave-storage.xml         |  1 +
 3 files changed, 52 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf-cave/blob/450f5512/server/storage/src/main/java/org/apache/karaf/cave/server/storage/CaveRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/server/storage/src/main/java/org/apache/karaf/cave/server/storage/CaveRepositoryImpl.java
 
b/server/storage/src/main/java/org/apache/karaf/cave/server/storage/CaveRepositoryImpl.java
index f0c4e06..9230dea 100644
--- 
a/server/storage/src/main/java/org/apache/karaf/cave/server/storage/CaveRepositoryImpl.java
+++ 
b/server/storage/src/main/java/org/apache/karaf/cave/server/storage/CaveRepositoryImpl.java
@@ -76,6 +76,10 @@ public class CaveRepositoryImpl extends CaveRepository {
         }
     }
 
+    public OsgiRepository getRepository() {
+        return repository;
+    }
+
     /**
      * Check if the repository folder exists and create it if not.
      */

http://git-wip-us.apache.org/repos/asf/karaf-cave/blob/450f5512/server/storage/src/main/java/org/apache/karaf/cave/server/storage/CaveRepositoryServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/server/storage/src/main/java/org/apache/karaf/cave/server/storage/CaveRepositoryServiceImpl.java
 
b/server/storage/src/main/java/org/apache/karaf/cave/server/storage/CaveRepositoryServiceImpl.java
index 557b51f..b720c77 100644
--- 
a/server/storage/src/main/java/org/apache/karaf/cave/server/storage/CaveRepositoryServiceImpl.java
+++ 
b/server/storage/src/main/java/org/apache/karaf/cave/server/storage/CaveRepositoryServiceImpl.java
@@ -18,11 +18,16 @@ package org.apache.karaf.cave.server.storage;
 
 import org.apache.karaf.cave.server.api.CaveRepository;
 import org.apache.karaf.cave.server.api.CaveRepositoryService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.repository.Repository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.*;
 import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.Map;
 import java.util.Properties;
 
@@ -35,9 +40,13 @@ public class CaveRepositoryServiceImpl implements 
CaveRepositoryService {
 
     public static final String STORAGE_FILE = "repositories.properties";
 
+    private BundleContext bundleContext;
+
     private File storageLocation;
 
-    private Map<String, CaveRepository> repositories = new HashMap<String, 
CaveRepository>();
+    private final Map<String, CaveRepositoryImpl> repositories = new 
HashMap<>();
+
+    private final Map<String, ServiceRegistration<Repository>> services = new 
HashMap<>();
 
     public File getStorageLocation() {
         return this.storageLocation;
@@ -47,6 +56,14 @@ public class CaveRepositoryServiceImpl implements 
CaveRepositoryService {
         this.storageLocation = storageLocation;
     }
 
+    public BundleContext getBundleContext() {
+        return bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
     /**
      * Create a Cave repository.
      *
@@ -57,7 +74,7 @@ public class CaveRepositoryServiceImpl implements 
CaveRepositoryService {
      */
     public synchronized CaveRepository create(String name, boolean scan) 
throws Exception {
         File location = new File(storageLocation, name);
-        return this.create(name, location.getAbsolutePath(), scan);
+        return create(name, location.getAbsolutePath(), scan);
     }
 
     /**
@@ -73,7 +90,7 @@ public class CaveRepositoryServiceImpl implements 
CaveRepositoryService {
         if (repositories.get(name) != null) {
             throw new IllegalArgumentException("Cave repository " + name + " 
already exists");
         }
-        CaveRepository repository = new CaveRepositoryImpl(name, location, 
scan);
+        CaveRepositoryImpl repository = new CaveRepositoryImpl(name, location, 
scan);
         repositories.put(name, repository);
         save();
         return repository;
@@ -86,11 +103,14 @@ public class CaveRepositoryServiceImpl implements 
CaveRepositoryService {
      * @throws Exception in case of remove failure.
      */
     public synchronized void uninstall(String name) throws Exception {
-        CaveRepository repository = this.getRepository(name);
+        CaveRepository repository = getRepository(name);
         if (repository == null) {
             throw new IllegalArgumentException("Cave repository " + name + " 
doesn't exist");
         }
-        // TODO: unregister Repository service
+        ServiceRegistration<Repository> registration = services.remove(name);
+        if (registration != null) {
+            registration.unregister();
+        }
         save();
     }
 
@@ -100,11 +120,12 @@ public class CaveRepositoryServiceImpl implements 
CaveRepositoryService {
      * @throws Exception
      */
     public synchronized void remove(String name) throws Exception {
-        CaveRepository repository = this.getRepository(name);
+        CaveRepository repository = getRepository(name);
         if (repository == null) {
             throw new IllegalArgumentException("Cave repository " + name + " 
doesn't exist");
         }
         repositories.remove(name);
+        save();
     }
 
     /**
@@ -115,12 +136,13 @@ public class CaveRepositoryServiceImpl implements 
CaveRepositoryService {
      * @throws Exception
      */
     public synchronized void destroy(String name) throws Exception {
-        CaveRepository repository = this.getRepository(name);
+        CaveRepository repository = getRepository(name);
         if (repository == null) {
             throw new IllegalArgumentException("Cave repository " + name + " 
doesn't exist");
         }
         repositories.remove(name);
         repository.cleanup();
+        save();
     }
 
     /**
@@ -131,11 +153,19 @@ public class CaveRepositoryServiceImpl implements 
CaveRepositoryService {
      * @throws Exception in case of registration failure.
      */
     public synchronized void install(String name) throws Exception {
-        CaveRepository caveRepository = this.getRepository(name);
+        CaveRepositoryImpl caveRepository = getRepository(name);
         if (caveRepository == null) {
             throw new IllegalArgumentException("Cave repository " + name + " 
doesn't exist");
         }
-        // TODO: register the Repository service
+        ServiceRegistration<Repository> registration = services.get(name);
+        if (registration == null) {
+            Hashtable<String, String> props = new Hashtable<>();
+            props.put(Constants.SERVICE_DESCRIPTION, name);
+            props.put(Repository.URL, caveRepository.getLocation());
+            registration = bundleContext.registerService(Repository.class, 
caveRepository.getRepository(), props);
+            services.put(name, registration);
+        }
+        save();
     }
 
     /**
@@ -144,7 +174,7 @@ public class CaveRepositoryServiceImpl implements 
CaveRepositoryService {
      * @return the list of all Cave repositories.
      */
     public synchronized CaveRepository[] getRepositories() {
-        return repositories.values().toArray(new CaveRepository[0]);
+        return repositories.values().toArray(new 
CaveRepository[repositories.size()]);
     }
 
     /**
@@ -153,7 +183,7 @@ public class CaveRepositoryServiceImpl implements 
CaveRepositoryService {
      * @param name the name of the Cave repository to look for.
      * @return the corresponding Cave repository.
      */
-    public synchronized CaveRepository getRepository(String name) {
+    public synchronized CaveRepositoryImpl getRepository(String name) {
         return repositories.get(name);
     }
 
@@ -167,6 +197,7 @@ public class CaveRepositoryServiceImpl implements 
CaveRepositoryService {
         for (int i = 0; i < repositories.length; i++) {
             storage.setProperty("item." + i + ".name", 
repositories[i].getName());
             storage.setProperty("item." + i + ".location", 
repositories[i].getLocation());
+            storage.setProperty("item." + i + ".installed", 
Boolean.toString(services.containsKey(repositories[i].getName())));
         }
         saveStorage(storage, new File(storageLocation, STORAGE_FILE), "Cave 
Service storage");
     }
@@ -226,9 +257,13 @@ public class CaveRepositoryServiceImpl implements 
CaveRepositoryService {
             for (int i = 0; i < count; i++) {
                 String name = storage.getProperty("item." + i + ".name");
                 String location = storage.getProperty("item." + i + 
".location");
+                boolean installed = 
Boolean.parseBoolean(storage.getProperty("item." + i + ".installed"));
                 if (name != null) {
-                    CaveRepository repository = new CaveRepositoryImpl(name, 
location, false);
+                    CaveRepositoryImpl repository = new 
CaveRepositoryImpl(name, location, false);
                     repositories.put(name, repository);
+                    if (installed) {
+                        install(name);
+                    }
                 }
             }
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/karaf-cave/blob/450f5512/server/storage/src/main/resources/OSGI-INF/blueprint/cave-storage.xml
----------------------------------------------------------------------
diff --git 
a/server/storage/src/main/resources/OSGI-INF/blueprint/cave-storage.xml 
b/server/storage/src/main/resources/OSGI-INF/blueprint/cave-storage.xml
index 1abcf71..554861d 100644
--- a/server/storage/src/main/resources/OSGI-INF/blueprint/cave-storage.xml
+++ b/server/storage/src/main/resources/OSGI-INF/blueprint/cave-storage.xml
@@ -31,6 +31,7 @@
 
     <bean id="caveRepositoryService" 
class="org.apache.karaf.cave.server.storage.CaveRepositoryServiceImpl" 
init-method="init">
         <property name="storageLocation" value="${storage.location}"/>
+        <property name="bundleContext" ref="blueprintBundleContext"/>
     </bean>
 
     <service ref="caveRepositoryService" 
interface="org.apache.karaf.cave.server.api.CaveRepositoryService"/>

Reply via email to