package org.argeo.jcr; import java.util.Collections; import java.util.Map; import java.util.Observable; import java.util.TreeMap; import javax.jcr.Repository; import javax.jcr.RepositoryException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class DefaultRepositoryRegister extends Observable implements RepositoryRegister { private final static Log log = LogFactory .getLog(DefaultRepositoryRegister.class); /** Read only map which will be directly exposed. */ private Map repositories = Collections .unmodifiableMap(new TreeMap()); @SuppressWarnings("rawtypes") public synchronized Repository getRepository(Map parameters) throws RepositoryException { if (!parameters.containsKey(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS)) throw new RepositoryException("Parameter " + ArgeoJcrConstants.JCR_REPOSITORY_ALIAS + " has to be defined."); String alias = parameters.get(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS).toString(); if (!repositories.containsKey(alias)) throw new RepositoryException( "No repository registered with alias " + alias); return repositories.get(alias); } /** Access to the read-only map */ public synchronized Map getRepositories() { return repositories; } /** Registers a service, typically called when OSGi services are bound. */ @SuppressWarnings("rawtypes") public synchronized void register(Repository repository, Map properties) { // TODO: also check bean name? if (properties == null || !properties.containsKey(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS)) { log.warn("Cannot register a repository without property " + ArgeoJcrConstants.JCR_REPOSITORY_ALIAS); return; } String alias = properties.get(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS).toString(); Map map = new TreeMap( repositories); map.put(alias, repository); repositories = Collections.unmodifiableMap(map); setChanged(); notifyObservers(alias); } /** Unregisters a service, typically called when OSGi services are unbound. */ @SuppressWarnings("rawtypes") public synchronized void unregister(Repository repository, Map properties) { // TODO: also check bean name? if (properties == null || !properties.containsKey(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS)) { log.warn("Cannot unregister a repository without property " + ArgeoJcrConstants.JCR_REPOSITORY_ALIAS); return; } String alias = properties.get(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS).toString(); Map map = new TreeMap( repositories); map.put(alias, repository); repositories = Collections.unmodifiableMap(map); setChanged(); notifyObservers(alias); } }