001/* 002 * (C) Copyright 2006-2007 Nuxeo SAS (http://nuxeo.com/) and contributors. 003 * 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the GNU Lesser General Public License 006 * (LGPL) version 2.1 which accompanies this distribution, and is available at 007 * http://www.gnu.org/licenses/lgpl.html 008 * 009 * This library is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 012 * Lesser General Public License for more details. 013 * 014 * Contributors: 015 * Nuxeo - initial API and implementation 016 * 017 * $Id$ 018 */ 019 020package org.nuxeo.ecm.directory.sql; 021 022import java.util.ArrayList; 023import java.util.List; 024 025import org.apache.commons.logging.Log; 026import org.apache.commons.logging.LogFactory; 027import org.nuxeo.ecm.directory.Directory; 028import org.nuxeo.ecm.directory.DirectoryException; 029import org.nuxeo.ecm.directory.DirectoryFactory; 030import org.nuxeo.ecm.directory.DirectoryServiceImpl; 031import org.nuxeo.ecm.directory.api.DirectoryService; 032import org.nuxeo.runtime.api.Framework; 033import org.nuxeo.runtime.model.ComponentContext; 034import org.nuxeo.runtime.model.ComponentName; 035import org.nuxeo.runtime.model.DefaultComponent; 036import org.nuxeo.runtime.model.Extension; 037 038public class SQLDirectoryFactory extends DefaultComponent implements DirectoryFactory { 039 040 public static final ComponentName NAME = new ComponentName("org.nuxeo.ecm.directory.sql.SQLDirectoryFactory"); 041 042 private static final Log log = LogFactory.getLog(SQLDirectoryFactory.class); 043 044 protected SQLDirectoryRegistry directories; 045 046 @Override 047 public Directory getDirectory(String name) throws DirectoryException { 048 return directories.getDirectory(name); 049 } 050 051 @Override 052 public String getName() { 053 return NAME.getName(); 054 } 055 056 @Override 057 public void activate(ComponentContext context) { 058 directories = new SQLDirectoryRegistry(); 059 } 060 061 @Override 062 public void deactivate(ComponentContext context) { 063 try { 064 shutdown(); 065 } catch (DirectoryException e) { 066 log.error("Error shutting down sql directories", e); 067 } 068 directories = null; 069 } 070 071 protected static DirectoryServiceImpl getDirectoryService() { 072 return (DirectoryServiceImpl) Framework.getRuntime().getComponent(DirectoryService.NAME); 073 } 074 075 @Override 076 public void registerExtension(Extension extension) { 077 Object[] contribs = extension.getContributions(); 078 DirectoryServiceImpl dirService = getDirectoryService(); 079 for (Object contrib : contribs) { 080 SQLDirectoryDescriptor descriptor = (SQLDirectoryDescriptor) contrib; 081 directories.addContribution(descriptor); 082 String name = descriptor.getName(); 083 if (directories.getDirectory(name) != null) { 084 dirService.registerDirectory(name, this); 085 } else { 086 // handle case where directory is marked with "remove" 087 dirService.unregisterDirectory(name, this); 088 } 089 } 090 } 091 092 @Override 093 public void unregisterExtension(Extension extension) { 094 Object[] contribs = extension.getContributions(); 095 DirectoryServiceImpl dirService = getDirectoryService(); 096 for (Object contrib : contribs) { 097 SQLDirectoryDescriptor descriptor = (SQLDirectoryDescriptor) contrib; 098 directories.removeContribution(descriptor); 099 dirService.unregisterDirectory(descriptor.getName(), this); 100 } 101 } 102 103 @Override 104 public void shutdown() throws DirectoryException { 105 for (Directory directory : directories.getDirectories()) { 106 directory.shutdown(); 107 } 108 } 109 110 @Override 111 public List<Directory> getDirectories() throws DirectoryException { 112 return new ArrayList<Directory>(directories.getDirectories()); 113 } 114 115}