/*
* (C) Copyright 2006-2014 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Contributors:
* Bogdan Stefanescu
* Florent Guillaume
*/
package org.nuxeo.ecm.core.api.repository;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuxeo.runtime.model.ComponentInstance;
import org.nuxeo.runtime.model.DefaultComponent;
/**
* High-level service to get to a {@link org.nuxeo.ecm.core.api.repository.Repository Repository} and from there to
* {@link org.nuxeo.ecm.core.api.CoreSession CoreSession} objects.
*/
public class RepositoryManagerImpl extends DefaultComponent implements RepositoryManager {
private static final Log log = LogFactory.getLog(RepositoryManagerImpl.class);
private Map<String, Repository> repositories = Collections.synchronizedMap(new LinkedHashMap<String, Repository>());
// compat from old extension point
private Map<String, Repository> compatRepositories = new ConcurrentHashMap<String, Repository>();
// compat
private static final String XP_REPOSITORIES = "repositories";
@Override
public void registerContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
if (XP_REPOSITORIES.equals(extensionPoint)) {
Repository repo = (Repository) contribution;
log.warn("Using old-style extension point" + " org.nuxeo.ecm.core.api.repository.RepositoryManager"
+ " for repository \"" + repo.getName()
+ "\", use org.nuxeo.ecm.core.storage.sql.RepositoryService instead");
compatRepositories.put(repo.getName(), repo);
} else {
throw new RuntimeException("Unknown extension point: " + extensionPoint);
}
}
@Override
public void unregisterContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
if (XP_REPOSITORIES.equals(extensionPoint)) {
Repository repo = (Repository) contribution;
compatRepositories.remove(repo.getName());
} else {
throw new RuntimeException("Unknown extension point: " + extensionPoint);
}
}
// called by low-level repository service
@Override
public void addRepository(Repository repository) {
String name = repository.getName();
if (repositories.containsKey(name)) {
log.info("Overriding repository: " + name);
} else {
log.info("Registering repository: " + name);
}
Repository compat = compatRepositories.get(name);
if (compat != null) {
if (repository.getLabel() == null) {
repository.setLabel(compat.getLabel());
}
if (repository.getDefault() != null) {
repository.setDefault(compat.getDefault());
}
}
repositories.put(name, repository);
}
// call by low-level repository service
@Override
public void removeRepository(String name) {
log.info("Removing repository: " + name);
Repository repo = repositories.remove(name);
}
@Override
public Collection<Repository> getRepositories() {
return new ArrayList<Repository>(repositories.values());
}
@Override
public List<String> getRepositoryNames() {
return new ArrayList<String>(repositories.keySet());
}
@Override
public Repository getRepository(String name) {
return repositories.get(name);
}
@Override
public Repository getDefaultRepository() {
for (Repository repository : repositories.values()) {
if (repository.isDefault()) {
return repository;
}
if ("default".equals(repository.getName())) {
return repository;
}
}
// fallback to first in list
if (!repositories.isEmpty()) {
return repositories.values().iterator().next();
}
// no repository at all
throw new RuntimeException("No repository defined");
}
@Override
public String getDefaultRepositoryName() {
return getDefaultRepository().getName();
}
@Override
@SuppressWarnings("unchecked")
public <T> T getAdapter(Class<T> adapter) {
if (RepositoryManager.class.isAssignableFrom(adapter)) {
return (T) this;
}
return null;
}
}