package de.jollyday.caching;
import de.jollyday.HolidayManager;
import de.jollyday.ManagerParameter;
import de.jollyday.datasource.ConfigurationDataSource;
import de.jollyday.datasource.ConfigurationDataSourceManager;
import de.jollyday.util.Cache;
import de.jollyday.util.ClassLoadingUtil;
/**
* Creates the {@link Cache.ValueHandler} which constructs a {@link HolidayManager}.
*/
public class HolidayManagerValueHandler implements Cache.ValueHandler<HolidayManager> {
private final ManagerParameter parameter;
private final String managerImplClassName;
/**
* Manager for providing configuration data sources which return the holiday
* data.
*/
private final ConfigurationDataSourceManager configurationDataSourceManager = new ConfigurationDataSourceManager();
/**
* Utility to load classes.
*/
private final ClassLoadingUtil classLoadingUtil = new ClassLoadingUtil();
public HolidayManagerValueHandler(final ManagerParameter parameter, final String managerImplClassName) {
this.parameter = parameter;
this.managerImplClassName = managerImplClassName;
}
@Override
public String getKey() {
return parameter.createCacheKey();
}
@Override
public HolidayManager createValue() {
HolidayManager manager = instantiateManagerImpl(managerImplClassName);
ConfigurationDataSource configurationDataSource = configurationDataSourceManager.getConfigurationDataSource(parameter);
manager.setConfigurationDataSource(configurationDataSource);
manager.init(parameter);
return manager;
}
/**
* Instantiates the manager implementing class.
*
* @param managerImplClassName
* the managers class name
* @return the implementation class instantiated
*/
private HolidayManager instantiateManagerImpl(
String managerImplClassName) {
try {
Class<?> managerImplClass = classLoadingUtil
.loadClass(managerImplClassName);
Object managerImplObject = managerImplClass.newInstance();
return HolidayManager.class.cast(managerImplObject);
} catch (Exception e) {
throw new IllegalStateException("Cannot create manager class "
+ managerImplClassName, e);
}
}
}