package org.ovirt.engine.core.bll.storage.connection;
import java.lang.reflect.Constructor;
import java.util.EnumMap;
import java.util.Map;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class StorageHelperDirector {
private static final String ACTION_TYPE_PACKAGE = "org.ovirt.engine.core.bll.storage.connection";
private static final String ACTION_TYPE_CLASS = "StorageHelper";
private static final Logger log = LoggerFactory.getLogger(StorageHelperDirector.class);
private static StorageHelperDirector instance = new StorageHelperDirector();
private Map<StorageType, IStorageHelper> helpers = new EnumMap<>(StorageType.class);
public static StorageHelperDirector getInstance() {
return instance;
}
private StorageHelperDirector() {
initializeHelpers();
}
private void initializeHelpers() {
try {
for (StorageType storageType : StorageType.values()) {
if (storageType.isConcreteStorageType()) {
Class<?> actionType = null;
String formattedClassName = String.format("%1$s.%2$s%3$s",
ACTION_TYPE_PACKAGE,
storageType.name(),
ACTION_TYPE_CLASS);
try {
actionType = Class.forName(formattedClassName);
} catch (ClassNotFoundException cnfe) {
log.debug("StorageHelperDirector Error:: the lookup for following class has failed: {}",
formattedClassName);
}
// if action type not exist - operation invalid
if (actionType != null) {
Constructor<?> info = actionType.getConstructors()[0];
IStorageHelper currentHelper = (IStorageHelper) info.newInstance(null);
helpers.put(storageType, currentHelper);
}
}
}
} catch (Exception ex) {
log.error("StorageHelperDirector Error:: exception was encountered during initializeHelpers() execution: {}",
ex.getMessage());
log.debug("Exception");
throw new RuntimeException(ex);
}
}
public IStorageHelper getItem(StorageType index) {
return helpers.get(index);
}
}