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}