/*******************************************************************************
* 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.services.repositoryservice.impl;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.xml.bind.JAXB;
import org.apache.log4j.Logger;
import org.ebayopensource.turmeric.services.repository.config.RepositoryServiceProviderConfig;
import org.ebayopensource.turmeric.services.repository.config.RepositoryServiceProviders;
public class RepositoryServiceProviderFactory {
private static volatile Map<String, RepositoryServiceProvider> s_serviceProviderMap = new HashMap<String, RepositoryServiceProvider>();
private static String serviceProviderKey;
private static Logger s_logger = Logger.getLogger(RepositoryServiceProviderFactory.class);
private RepositoryServiceProviderFactory()
{
}
public static RepositoryServiceProvider getInstance(String key) throws ServiceProviderException
{
if(s_serviceProviderMap.size()==0)
{
synchronized (RepositoryServiceProviderFactory.class) {
if(s_serviceProviderMap.size()==0)
{
populateProviderMap();
}
}
}
return s_serviceProviderMap.get(key);
}
public static RepositoryServiceProvider getInstance() throws ServiceProviderException
{
if(s_serviceProviderMap.size()==0)
{
synchronized (RepositoryServiceProviderFactory.class) {
if(s_serviceProviderMap.size()==0)
{
populateProviderMap();
}
}
}
return s_serviceProviderMap.get(serviceProviderKey);
}
private static void populateProviderMap() throws ServiceProviderException
{
// InputStream configXmlStream = ClassLoader.getSystemResourceAsStream(RepositoryServiceConstants.s_providerConfigXml);
InputStream configXmlStream = RepositoryServiceProviderFactory.class.getClassLoader().
getResourceAsStream(RepositoryServiceConstants.s_providerConfigXml);
// System.err.println("getting the config file..."+configXmlStream);
if(configXmlStream == null)
{
String message = RepositoryServiceConstants.s_providerConfigXml + " is not provided. ";
s_logger.error(message);
throw new ServiceProviderException(message);
}
// System.err.println("configXmlStream="+configXmlStream);
RepositoryServiceProviderConfig repositoryServiceConfig = JAXB.unmarshal(configXmlStream,
RepositoryServiceProviderConfig.class);
// System.err.println("repositoryServiceConfig="+repositoryServiceConfig);
InputStream serviceProvider = RepositoryServiceProviderFactory.class.getClassLoader().
getResourceAsStream(RepositoryServiceConstants.s_serviceProviderProperty);
if(serviceProvider != null)
{
Properties properties = new Properties();
try {
properties.load(serviceProvider);
serviceProviderKey = (String)properties.get(RepositoryServiceConstants.s_providerPropKey);
} catch (IOException e) {
String message = "Problem occured while loading "+RepositoryServiceConstants.s_serviceProviderProperty;
s_logger.warn(message, e);
}
}
if(serviceProviderKey == null)
{
s_logger.warn("Unable to fetch service provider key from service_provider.properties, hence loading default key");
serviceProviderKey = repositoryServiceConfig.getDefault();
}
// System.err.println("defaultKey="+defaultKey);
List<RepositoryServiceProviders> providerConfig = repositoryServiceConfig.getProviderConfigList().getProviderConfig();
for (RepositoryServiceProviders repositoryServiceProvider : providerConfig) {
String className = repositoryServiceProvider.getProviderImplClassName();
RepositoryServiceProvider repServiceProvider = null;
try {
repServiceProvider = (RepositoryServiceProvider) Class.forName(className).newInstance();
} catch (IllegalAccessException e) {
s_logger.error(e.getMessage(),e);
String message = " IllegalAccessException occured while initialising class "+className;
throw new ServiceProviderException(message,e);
} catch (InstantiationException e) {
s_logger.error(e.getMessage(),e);
String message = " InstantiationException occured while initialising class "+className;
throw new ServiceProviderException(message,e);
} catch (ClassNotFoundException e) {
s_logger.error(e.getMessage(),e);
String message = " ClassNotFoundException occured while loading class "+className;
throw new ServiceProviderException(message,e);
} catch (ClassCastException e) {
s_logger.error(e.getMessage(),e);
String message = " ClassCastException occured while initialising class "+className;
throw new ServiceProviderException(message,e);
}
s_serviceProviderMap.put(repositoryServiceProvider.getName(), repServiceProvider);
}
}
}