/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* Licensed 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*******************************************************************************/
package org.ebayopensource.turmeric.runtime.spf.impl.internal.config;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.ebayopensource.turmeric.runtime.common.exceptions.ServiceCreationException;
import org.ebayopensource.turmeric.runtime.common.impl.utils.LogManager;
import org.ebayopensource.turmeric.runtime.common.impl.utils.ParseUtils;
import org.ebayopensource.turmeric.runtime.spf.impl.internal.config.Initializer.InitializerException;
/**
* Utility class to load the initializers.
*
* @author mpoplacenel
*/
public class InitializerConfigManager {
private static final String INITIALIZERS_FILE_NAME = "serviceInitializers.txt";
private static final InitializerConfigManager INSTANCE = new InitializerConfigManager();
private static final Logger LOGGER = LogManager.getInstance(InitializerConfigManager.class);
public static InitializerConfigManager getInstance() {
return INSTANCE;
}
private static String[] loadInitializerClassNames() throws InitializerException {
String initializersFilename = null;
InputStream inStream;
try {
initializersFilename =
ServiceConfigManager.getInstance().getGlobalConfigPath() + INITIALIZERS_FILE_NAME;
inStream = ParseUtils.getFileStream(initializersFilename);
} catch (ServiceCreationException e) {
throw new InitializerException("Unable to locate initializer file"
+ (initializersFilename == null ? "" : " " + initializersFilename),
e);
}
if (inStream == null) {
return null;
}
BufferedReader br = new BufferedReader(new InputStreamReader(inStream, Charset.defaultCharset()));
List<String> initializerClassNames = new ArrayList<String>();
String line;
try {
while ((line = br.readLine()) != null) {
String initializerClassName = line.trim();
if (initializerClassName.length() > 0 && initializerClassName.charAt(0) != '#') {
initializerClassNames.add(initializerClassName);
}
}
return initializerClassNames.toArray(new String[initializerClassNames.size()]);
} catch (IOException e) {
throw new InitializerException("Error loading " + initializersFilename, e);
} finally {
try {
br.close();
} catch (IOException e) {
// ignore
}
}
}
private static List<Initializer> loadInitializers(String[] initializerClassNames) throws InitializerException {
if (initializerClassNames == null) {
return null;
}
List<Initializer> initializers = new ArrayList<Initializer>(initializerClassNames.length);
for (String initializerClassName : initializerClassNames) {
Initializer initializer = createInstance(initializerClassName);
initializers.add(initializer);
}
return initializers;
}
private static Initializer createInstance(String initializerClassName)
throws InitializerException {
try {
Class<?> clazz = Class.forName(initializerClassName);
return (Initializer) clazz.newInstance();
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new InitializerException("Unable to instantiate class " + initializerClassName, e);
}
}
private List<Initializer> m_initializers;
private String[] m_initializerClassNames;
private InitializerConfigManager() {
// singleton
}
public void callInitializers(String serviceName) throws InitializerException {
List<Initializer> initializers = getInitializers();
if (initializers != null) {
for (Initializer initializer : initializers) {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine("======== START INITIALIZER: " + initializer + ".initialize(" + serviceName + ")");
}
initializer.initialize(serviceName);
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine("======== END INITIALIZER: " + initializer + ".initialize(" + serviceName + ")");
}
}
}
}
public synchronized List<Initializer> getInitializers() throws InitializerException {
if (m_initializers == null) {
m_initializers = loadInitializers(getInitializerClassNames());
}
return m_initializers;
}
public synchronized String[] getInitializerClassNames() throws InitializerException {
return getInitializerClassNames(true);
}
public synchronized String[] getInitializerClassNames(boolean load) throws InitializerException {
if (m_initializerClassNames == null && load) {
m_initializerClassNames = loadInitializerClassNames();
}
return m_initializerClassNames;
}
public synchronized void setInitializerClassNames(String[] initializerClassNames) {
m_initializerClassNames = initializerClassNames;
m_initializers = null;
}
}