/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* licenses this file to you 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 the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>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.
*/
package org.apereo.portal.services;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apereo.portal.groups.GroupsException;
import org.apereo.portal.groups.IEntityNameFinder;
import org.apereo.portal.groups.IEntityNameFinderFactory;
import org.apereo.portal.properties.PropertiesManager;
import org.apereo.portal.spring.locator.EntityTypesLocator;
public class EntityNameFinderService {
private static final Log log = LogFactory.getLog(EntityNameFinderService.class);
private static EntityNameFinderService m_instance;
private Map nameFinders = null;
private static boolean initialized = false;
private EntityNameFinderService() {
super();
initialize();
}
/** @return org.apereo.portal.groups.IEntityNameFinder */
public IEntityNameFinder getNameFinder(Class type) throws GroupsException {
IEntityNameFinder finder = (IEntityNameFinder) (getNameFinders().get(type));
if (finder == null) {
throw new GroupsException(
"Name finder for " + type.getName() + " could not be located.");
}
return finder;
}
/** @return java.util.Map */
private Map getNameFinders() {
if (nameFinders == null) {
nameFinders = new HashMap(10);
}
return nameFinders;
}
/**
* Gets all the entity types and tries to instantiate and cache a finder for each one. There
* needn't be a finder for every entity type, so if there's no entry in the portal.properties,
* we just log the fact and continue.
*/
private synchronized void initialize() {
Iterator types = EntityTypesLocator.getEntityTypes().getAllEntityTypes();
String factoryName = null;
while (types.hasNext()) {
Class type = (Class) types.next();
if (type != Object.class) {
String factoryKey =
"org.apereo.portal.services.EntityNameFinderService.NameFinderFactory.implementation_"
+ type.getName();
try {
factoryName = PropertiesManager.getProperty(factoryKey);
} catch (Exception runtime) {
String dMsg =
"EntityNameFinderService.initialize(): "
+ "could not find property for "
+ type.getName()
+ " factory.";
log.debug(dMsg);
}
if (factoryName != null) {
try {
IEntityNameFinderFactory factory =
(IEntityNameFinderFactory) Class.forName(factoryName).newInstance();
getNameFinders().put(type, factory.newFinder());
} catch (Exception e) {
String eMsg =
"EntityNameFinderService.initialize(): "
+ "Could not instantiate finder for "
+ type.getName()
+ ": ";
log.error(eMsg, e);
}
}
}
}
setInitialized(true);
}
/** @return EntityNameFinderService */
public static final synchronized EntityNameFinderService instance() {
if (m_instance == null) {
m_instance = new EntityNameFinderService();
}
return m_instance;
}
/** @return boolean */
private static boolean isInitialized() {
return initialized;
}
/** @param newInitialized boolean */
static void setInitialized(boolean newInitialized) {
initialized = newInitialized;
}
public static void start() {
if (!isInitialized()) {
instance();
}
}
}