[KARAF-870] Cave now stores the repositories in a properties file in order to be able to reload it
git-svn-id: https://svn.apache.org/repos/asf/karaf/cave/trunk@1510859 13f79535-47bb-0310-9956-ffa450edef68 Project: http://git-wip-us.apache.org/repos/asf/karaf-cave/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf-cave/commit/f743e484 Tree: http://git-wip-us.apache.org/repos/asf/karaf-cave/tree/f743e484 Diff: http://git-wip-us.apache.org/repos/asf/karaf-cave/diff/f743e484 Branch: refs/heads/master Commit: f743e4843821d72ee5fa9ec76b2d6ee3dc12b56f Parents: b74e271 Author: jbonofre <jbonofre@13f79535-47bb-0310-9956-ffa450edef68> Authored: Tue Aug 6 05:42:45 2013 +0000 Committer: jbonofre <jbonofre@13f79535-47bb-0310-9956-ffa450edef68> Committed: Tue Aug 6 05:42:45 2013 +0000 ---------------------------------------------------------------------- .../storage/CaveRepositoryServiceImpl.java | 96 +++++++++++++++++++- .../OSGI-INF/blueprint/cave-storage.xml | 2 +- 2 files changed, 93 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf-cave/blob/f743e484/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 194e3b8..6097f70 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 @@ -19,16 +19,23 @@ package org.apache.karaf.cave.server.storage; import org.apache.felix.bundlerepository.RepositoryAdmin; import org.apache.karaf.cave.server.api.CaveRepository; import org.apache.karaf.cave.server.api.CaveRepositoryService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import java.io.File; +import java.io.*; import java.util.HashMap; import java.util.Map; +import java.util.Properties; /** * Default implementation of the Cave Repository Service. */ public class CaveRepositoryServiceImpl implements CaveRepositoryService { + private static final Logger LOGGER = LoggerFactory.getLogger(CaveRepositoryServiceImpl.class); + + public static final String STORAGE_FILE = "repositories.properties"; + private File storageLocation; private RepositoryAdmin repositoryAdmin; @@ -74,10 +81,11 @@ public class CaveRepositoryServiceImpl implements CaveRepositoryService { */ public synchronized CaveRepository createRepository(String name, String location, boolean scan) throws Exception { if (repositories.get(name) != null) { - throw new IllegalArgumentException("Cave repository " + name + " already exists."); + throw new IllegalArgumentException("Cave repository " + name + " already exists"); } CaveRepository repository = new CaveRepositoryImpl(name, location, scan); repositories.put(name, repository); + save(); return repository; } @@ -92,8 +100,9 @@ public class CaveRepositoryServiceImpl implements CaveRepositoryService { if (repository != null) { repositoryAdmin.removeRepository(repository.getRepositoryXml().toString()); repositories.remove(name); + save(); } else { - throw new IllegalArgumentException("Cave repository " + name + " not found."); + throw new IllegalArgumentException("Cave repository " + name + " not found"); } } @@ -109,7 +118,7 @@ public class CaveRepositoryServiceImpl implements CaveRepositoryService { if (caveRepository != null) { repositoryAdmin.addRepository(caveRepository.getRepositoryXml()); } else { - throw new IllegalArgumentException("Cave repository " + name + " not found."); + throw new IllegalArgumentException("Cave repository " + name + " not found"); } } @@ -132,4 +141,83 @@ public class CaveRepositoryServiceImpl implements CaveRepositoryService { return repositories.get(name); } + /** + * Store the repositories into the properties file + */ + synchronized void save() throws Exception { + Properties storage = new Properties(); + CaveRepository[] repositories = this.getRepositories(); + storage.setProperty("count", Integer.toString(repositories.length)); + for (int i = 0; i < repositories.length; i++) { + storage.setProperty("item." + i + ".name", repositories[i].getName()); + storage.setProperty("item." + i + ".location", repositories[i].getLocation()); + } + saveStorage(storage, new File(storageLocation, STORAGE_FILE), "Karaf Cave Service storage"); + } + + /** + * Write the Cave repositories storage properties into a file. + * + * @param properties the Cave repositories storage properties. + * @param location the output file location. + * @param comment a comment to write in the properties file. + * @throws IOException in case of saving failure. + */ + private void saveStorage(Properties properties, File location, String comment) throws IOException { + OutputStream os = null; + try { + os = new FileOutputStream(location); + properties.store(os, comment); + } finally { + if (os != null) { + os.close(); + } + } + } + + /** + * Load a storage property from a given file. + * + * @param location the properties file to load. + * @return the loaded Properties. + * @throws IOException in case of loading failure. + */ + private Properties loadStorage(File location) throws IOException { + InputStream is = null; + try { + is = new FileInputStream(location); + Properties props = new Properties(); + props.load(is); + return props; + } finally { + if (is != null) { + is.close(); + } + } + } + + /** + * Load the Cave repositories set from the storage properties file. + */ + public synchronized void init() throws Exception { + try { + File storageFile = new File(storageLocation, STORAGE_FILE); + Properties storage = loadStorage(storageFile); + int count = 0; + if (storage.getProperty("count") != null) { + count = Integer.parseInt(storage.getProperty("count")); + } + for (int i = 0; i < count; i++) { + String name = storage.getProperty("item." + i + ".name"); + String location = storage.getProperty("item." + i + ".location"); + if (name != null) { + CaveRepository repository = new CaveRepositoryImpl(name, location, false); + repositories.put(name, repository); + } + } + } catch (Exception e) { + LOGGER.warn("Unable to load Cave repositories", e); + } + } + } http://git-wip-us.apache.org/repos/asf/karaf-cave/blob/f743e484/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 f5dab07..d626174 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 @@ -29,7 +29,7 @@ " default-activation="lazy"> - <bean id="caveRepositoryService" class="org.apache.karaf.cave.server.storage.CaveRepositoryServiceImpl"> + <bean id="caveRepositoryService" class="org.apache.karaf.cave.server.storage.CaveRepositoryServiceImpl" init-method="init"> <property name="storageLocation" value="${storage.location}"/> <property name="repositoryAdmin" ref="repositoryAdmin"/> </bean>
