001/*
002 * Copyright (c) 2006-2014 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *     Bogdan Stefanescu
011 *     Florent Guillaume
012 */
013package org.nuxeo.ecm.core.api.repository;
014
015import java.util.ArrayList;
016import java.util.Collection;
017import java.util.Collections;
018import java.util.LinkedHashMap;
019import java.util.List;
020import java.util.Map;
021import java.util.concurrent.ConcurrentHashMap;
022
023import org.apache.commons.logging.Log;
024import org.apache.commons.logging.LogFactory;
025import org.nuxeo.runtime.model.ComponentInstance;
026import org.nuxeo.runtime.model.DefaultComponent;
027
028/**
029 * High-level service to get to a {@link org.nuxeo.ecm.core.api.repository.Repository Repository} and from there to
030 * {@link org.nuxeo.ecm.core.api.CoreSession CoreSession} objects.
031 */
032public class RepositoryManagerImpl extends DefaultComponent implements RepositoryManager {
033
034    private static final Log log = LogFactory.getLog(RepositoryManagerImpl.class);
035
036    private Map<String, Repository> repositories = Collections.synchronizedMap(new LinkedHashMap<String, Repository>());
037
038    // compat from old extension point
039    private Map<String, Repository> compatRepositories = new ConcurrentHashMap<String, Repository>();
040
041    // compat
042    private static final String XP_REPOSITORIES = "repositories";
043
044    @Override
045    public void registerContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
046        if (XP_REPOSITORIES.equals(extensionPoint)) {
047            Repository repo = (Repository) contribution;
048            log.warn("Using old-style extension point" + " org.nuxeo.ecm.core.api.repository.RepositoryManager"
049                    + " for repository \"" + repo.getName()
050                    + "\", use org.nuxeo.ecm.core.storage.sql.RepositoryService instead");
051            compatRepositories.put(repo.getName(), repo);
052        } else {
053            throw new RuntimeException("Unknown extension point: " + extensionPoint);
054        }
055    }
056
057    @Override
058    public void unregisterContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
059        if (XP_REPOSITORIES.equals(extensionPoint)) {
060            Repository repo = (Repository) contribution;
061            compatRepositories.remove(repo.getName());
062        } else {
063            throw new RuntimeException("Unknown extension point: " + extensionPoint);
064        }
065    }
066
067    // called by low-level repository service
068    @Override
069    public void addRepository(Repository repository) {
070        String name = repository.getName();
071        if (repositories.containsKey(name)) {
072            log.info("Overriding repository: " + name);
073        } else {
074            log.info("Registering repository: " + name);
075        }
076        Repository compat = compatRepositories.get(name);
077        if (compat != null) {
078            if (repository.getLabel() == null) {
079                repository.setLabel(compat.getLabel());
080            }
081            if (repository.getDefault() != null) {
082                repository.setDefault(compat.getDefault());
083            }
084        }
085        repositories.put(name, repository);
086    }
087
088    // call by low-level repository service
089    @Override
090    public void removeRepository(String name) {
091        log.info("Removing repository: " + name);
092        Repository repo = repositories.remove(name);
093    }
094
095    @Override
096    public Collection<Repository> getRepositories() {
097        return new ArrayList<Repository>(repositories.values());
098    }
099
100    @Override
101    public List<String> getRepositoryNames() {
102        return new ArrayList<String>(repositories.keySet());
103    }
104
105    @Override
106    public Repository getRepository(String name) {
107        return repositories.get(name);
108    }
109
110    @Override
111    public Repository getDefaultRepository() {
112        for (Repository repository : repositories.values()) {
113            if (repository.isDefault()) {
114                return repository;
115            }
116            if ("default".equals(repository.getName())) {
117                return repository;
118            }
119        }
120        // fallback to first in list
121        if (!repositories.isEmpty()) {
122            return repositories.values().iterator().next();
123        }
124        // no repository at all
125        throw new RuntimeException("No repository defined");
126    }
127
128    @Override
129    public String getDefaultRepositoryName() {
130        return getDefaultRepository().getName();
131    }
132
133    @Override
134    @SuppressWarnings("unchecked")
135    public <T> T getAdapter(Class<T> adapter) {
136        if (RepositoryManager.class.isAssignableFrom(adapter)) {
137            return (T) this;
138        }
139        return null;
140    }
141
142}