001/*
002 * Copyright (c) 2006-2011 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 * Nuxeo - initial API and implementation
011 */
012
013package org.nuxeo.ecm.core.api.localconfiguration;
014
015import org.apache.commons.logging.Log;
016import org.apache.commons.logging.LogFactory;
017import org.nuxeo.ecm.core.api.CoreSession;
018import org.nuxeo.ecm.core.api.DocumentModel;
019import org.nuxeo.ecm.core.api.DocumentRef;
020import org.nuxeo.runtime.model.DefaultComponent;
021
022/**
023 * Default implementation of {@code LocalConfigurationService}.
024 *
025 * @author <a href="mailto:troger@nuxeo.com">Thomas Roger</a>
026 * @since 5.4.2
027 */
028public class LocalConfigurationServiceImpl extends DefaultComponent implements LocalConfigurationService {
029
030    private static final Log log = LogFactory.getLog(LocalConfigurationServiceImpl.class);
031
032    @Override
033    public <T extends LocalConfiguration> T getConfiguration(Class<T> configurationClass, String configurationFacet,
034            DocumentModel currentDoc) {
035        if (currentDoc == null || currentDoc.getRef() == null) {
036            return null;
037        }
038
039        CoreSession session = currentDoc.getCoreSession();
040        if (session == null) {
041            return null;
042        }
043
044        T localConfiguration = session.adaptFirstMatchingDocumentWithFacet(currentDoc.getRef(), configurationFacet,
045                configurationClass);
046        if (localConfiguration == null) {
047            // no local configuration found
048            return null;
049        }
050        while (localConfiguration.canMerge()) {
051            DocumentRef parentRef = session.getParentDocumentRef(localConfiguration.getDocumentRef());
052            if (parentRef == null) {
053                DocumentModel parentDoc = session.getParentDocument(localConfiguration.getDocumentRef());
054                if (parentDoc == null) {
055                    break;
056                }
057                parentRef = parentDoc.getRef();
058                if (parentRef == null) {
059                    break;
060                }
061            }
062            T parentConfiguration = session.adaptFirstMatchingDocumentWithFacet(parentRef, configurationFacet,
063                    configurationClass);
064            if (parentConfiguration == null) {
065                // stop merging
066                break;
067            }
068            localConfiguration.merge(parentConfiguration);
069        }
070        return localConfiguration;
071    }
072
073}