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}