001/*
002 * (C) Copyright 2006-2007 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     Nuxeo - initial API and implementation
018 *
019 * $Id$
020 */
021
022package org.nuxeo.ecm.directory.sql;
023
024import java.util.ArrayList;
025import java.util.List;
026
027import org.apache.commons.logging.Log;
028import org.apache.commons.logging.LogFactory;
029import org.nuxeo.ecm.directory.Directory;
030import org.nuxeo.ecm.directory.DirectoryException;
031import org.nuxeo.ecm.directory.DirectoryFactory;
032import org.nuxeo.ecm.directory.DirectoryServiceImpl;
033import org.nuxeo.ecm.directory.api.DirectoryService;
034import org.nuxeo.runtime.api.Framework;
035import org.nuxeo.runtime.model.ComponentContext;
036import org.nuxeo.runtime.model.ComponentName;
037import org.nuxeo.runtime.model.DefaultComponent;
038import org.nuxeo.runtime.model.Extension;
039
040public class SQLDirectoryFactory extends DefaultComponent implements DirectoryFactory {
041
042    public static final ComponentName NAME = new ComponentName("org.nuxeo.ecm.directory.sql.SQLDirectoryFactory");
043
044    private static final Log log = LogFactory.getLog(SQLDirectoryFactory.class);
045
046    protected SQLDirectoryRegistry directories;
047
048    @Override
049    public Directory getDirectory(String name) throws DirectoryException {
050        return directories.getDirectory(name);
051    }
052
053    @Override
054    public String getName() {
055        return NAME.getName();
056    }
057
058    @Override
059    public void activate(ComponentContext context) {
060        directories = new SQLDirectoryRegistry();
061    }
062
063    @Override
064    public void deactivate(ComponentContext context) {
065        try {
066            shutdown();
067        } catch (DirectoryException e) {
068            log.error("Error shutting down sql directories", e);
069        }
070        directories = null;
071    }
072
073    protected static DirectoryServiceImpl getDirectoryService() {
074        return (DirectoryServiceImpl) Framework.getRuntime().getComponent(DirectoryService.NAME);
075    }
076
077    @Override
078    public void registerExtension(Extension extension) {
079        Object[] contribs = extension.getContributions();
080        DirectoryServiceImpl dirService = getDirectoryService();
081        for (Object contrib : contribs) {
082            SQLDirectoryDescriptor descriptor = (SQLDirectoryDescriptor) contrib;
083            directories.addContribution(descriptor);
084            String name = descriptor.getName();
085            if (directories.getDirectory(name) != null) {
086                dirService.registerDirectory(name, this);
087            } else {
088                // handle case where directory is marked with "remove"
089                dirService.unregisterDirectory(name, this);
090            }
091        }
092    }
093
094    @Override
095    public void unregisterExtension(Extension extension) {
096        Object[] contribs = extension.getContributions();
097        DirectoryServiceImpl dirService = getDirectoryService();
098        for (Object contrib : contribs) {
099            SQLDirectoryDescriptor descriptor = (SQLDirectoryDescriptor) contrib;
100            directories.removeContribution(descriptor);
101            dirService.unregisterDirectory(descriptor.getName(), this);
102        }
103    }
104
105    @Override
106    public void shutdown() throws DirectoryException {
107        for (Directory directory : directories.getDirectories()) {
108            directory.shutdown();
109        }
110    }
111
112    @Override
113    public List<Directory> getDirectories() throws DirectoryException {
114        return new ArrayList<Directory>(directories.getDirectories());
115    }
116
117}