/* * (C) Copyright 2006-2016 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: * George Lefter * Olivier Grisel * Benjamin Jalon * Florent Guillaume */ package org.nuxeo.ecm.directory; import static org.nuxeo.ecm.directory.localconfiguration.DirectoryConfigurationConstants.DIRECTORY_CONFIGURATION_FACET; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.api.localconfiguration.LocalConfigurationService; import org.nuxeo.ecm.directory.api.DirectoryService; import org.nuxeo.ecm.directory.localconfiguration.DirectoryConfiguration; import org.nuxeo.runtime.api.Framework; import org.nuxeo.runtime.model.ComponentContext; import org.nuxeo.runtime.model.ComponentInstance; import org.nuxeo.runtime.model.DefaultComponent; import org.nuxeo.runtime.transaction.TransactionHelper; public class DirectoryServiceImpl extends DefaultComponent implements DirectoryService { protected static final String DELIMITER_BETWEEN_DIRECTORY_NAME_AND_SUFFIX = "_"; private static final Log log = LogFactory.getLog(DirectoryServiceImpl.class); protected DirectoryRegistry registry = new DirectoryRegistry(); @Override public void activate(ComponentContext context) { } @Override public void deactivate(ComponentContext context) { registry.shutdown(); } @Override public void registerContribution(Object contribution, String extensionPoint, ComponentInstance contributor) { DirectoryFactoryDescriptor factoryDescriptor = (DirectoryFactoryDescriptor) contribution; String factoryName = factoryDescriptor.getFactoryName(); log.warn("No need to register factoryDescriptor anymore: " + factoryName); } @Override public void registerDirectoryDescriptor(BaseDirectoryDescriptor descriptor) { registry.addContribution(descriptor); } @Override public void unregisterDirectoryDescriptor(BaseDirectoryDescriptor descriptor) { registry.removeContribution(descriptor); } @Override public void applicationStarted(ComponentContext context) { if (Framework.isTestModeSet()) { // when testing, DatabaseHelper init hasn't occurred yet, // so keep to lazy initialization return; } // open all directories at application startup, so that // their tables are created (outside a transaction) if needed for (Directory dir : getDirectories()) { // open directory to init its resources (tables for SQLDirectory) dir.getSession().close(); } // commit the transaction so that tables are committed if (TransactionHelper.isTransactionActiveOrMarkedRollback()) { TransactionHelper.commitOrRollbackTransaction(); TransactionHelper.startTransaction(); } } protected DirectoryConfiguration getDirectoryConfiguration(DocumentModel documentContext) { LocalConfigurationService localConfigurationService = Framework.getService(LocalConfigurationService.class); if (localConfigurationService == null) { log.info("Local configuration not deployed, will use default configuration"); return null; } return localConfigurationService.getConfiguration(DirectoryConfiguration.class, DIRECTORY_CONFIGURATION_FACET, documentContext); } /** * This will return the local directory name according the local configuration. If the local configuration is null * or the suffix value is null or the suffix value trimmed is an empty string the returned value is the * directoryName given in parameter. If not this is directoryName + DELIMITER_BETWEEN_DIRECTORY_NAME_AND_SUFFIX + * suffix. if directoryName is null, return null. */ protected String getWaitingLocalDirectoryName(String directoryName, DirectoryConfiguration configuration) { if (directoryName == null) { return null; } if (configuration != null && configuration.getDirectorySuffix() != null) { String suffix = configuration.getDirectorySuffix().trim(); if (!"".equals(suffix)) { return directoryName + DELIMITER_BETWEEN_DIRECTORY_NAME_AND_SUFFIX + suffix; } log.warn("The local configuration detected is an empty value, we consider it as no configuration set."); log.debug("Directory Local Configuration is on : " + configuration.getDocumentRef()); } return directoryName; } @Override public BaseDirectoryDescriptor getDirectoryDescriptor(String id) { return registry.getDirectoryDescriptor(id); } @Override public Directory getDirectory(String id) { if (id == null) { // TODO throw an exception return null; } return registry.getDirectory(id); } @Override public Directory getDirectory(String id, DocumentModel documentContext) { if (id == null) { // TODO throw an exception return null; } String localDirectoryName = getWaitingLocalDirectoryName(id, getDirectoryConfiguration(documentContext)); Directory dir = getDirectory(localDirectoryName); if (dir == null && !id.equals(localDirectoryName)) { log.debug(String.format( "The local directory named '%s' was" + " not found. Look for the default one named: %s", localDirectoryName, id)); dir = getDirectory(id); } return dir; } protected Directory getDirectoryOrFail(String name) throws DirectoryException { return getDirectoryOrFail(name, null); } protected Directory getDirectoryOrFail(String id, DocumentModel documentContext) throws DirectoryException { Directory dir = getDirectory(id, documentContext); if (dir == null) { throw new DirectoryException("No directory registered with name: " + id); } return dir; } @Override public List<Directory> getDirectories() { return registry.getDirectories(); } @Override public List<String> getDirectoryNames() { return registry.getDirectoryIds(); } @Override public String getDirectorySchema(String directoryName) throws DirectoryException { return getDirectoryOrFail(directoryName).getSchema(); } @Override public String getDirectoryIdField(String directoryName) throws DirectoryException { return getDirectoryOrFail(directoryName).getIdField(); } @Override public String getDirectoryPasswordField(String directoryName) throws DirectoryException { return getDirectoryOrFail(directoryName).getPasswordField(); } @Override public String getParentDirectoryName(String directoryName) throws DirectoryException { return getDirectoryOrFail(directoryName).getParentDirectory(); } @Override public Session open(String directoryName) throws DirectoryException { return getDirectoryOrFail(directoryName).getSession(); } @Override public Session open(String directoryName, DocumentModel documentContext) throws DirectoryException { return getDirectoryOrFail(directoryName, documentContext).getSession(); } }