[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"/>
