package org.ovirt.engine.ui.genericapi; import java.lang.reflect.Constructor; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.ui.genericapi.parameters.UIQueryParametersBase; import org.ovirt.engine.ui.genericapi.uiqueries.UIQueryBase; import org.ovirt.engine.ui.genericapi.uiqueries.UIQueryType; public class UICommandsFactory { private static final String QUERY_SUFFIX = "UIQuery"; private static final String UI_QUERY_PACKAGE = "org.ovirt.engine.ui.genericapi.uiqueries"; private static Map<String, Class<? extends UIQueryBase>> queryCache = new ConcurrentHashMap<String, Class<? extends UIQueryBase>>( VdcActionType.values().length); public static UIQueryBase CreateQueryCommand(UIQueryType query, UIQueryParametersBase parameters) { Class<? extends UIQueryBase> type = null; try { type = getQueryClass(query.name(), QUERY_SUFFIX); @SuppressWarnings("rawtypes") Class[] types = new Class[1]; types[0] = parameters.getClass(); Constructor<? extends UIQueryBase> info = findQueryConstructor(type); Object[] UIQueryParametersBase = new Object[1]; UIQueryParametersBase[0] = parameters; Object tempVar = info.newInstance(parameters); return (UIQueryBase) ((tempVar instanceof UIQueryBase) ? tempVar : null); } catch (Exception e) { //TODO add log msg //log.errorFormat("ADD ERROR MSG", type, e); throw new RuntimeException(e); } } private static Class<? extends UIQueryBase> getQueryClass(String name, String suffix) { // try the cache first if (queryCache.get(name + suffix) != null) return queryCache.get(name + suffix); String className = String.format("%1$s.%2$s%3$s", UI_QUERY_PACKAGE, name, suffix); @SuppressWarnings("unchecked") Class<? extends UIQueryBase> type = loadClass(className); if (type != null) { queryCache.put(name + suffix, type); // update cache return type; } //TODO add logger for generic api // nothing found //log.warn("Unable to find class for action: " + name + suffix); return null; } @SuppressWarnings("unchecked") //assuming only one constructor. //If need to support more this code should change private static Constructor<? extends UIQueryBase> findQueryConstructor(Class<? extends UIQueryBase> type) { Constructor<?>[] constructors = type.getDeclaredConstructors(); return (Constructor<? extends UIQueryBase>)constructors[0]; } @SuppressWarnings("rawtypes") private static Class loadClass(String className) { try { return Class.forName(className); } catch (ClassNotFoundException e) { return null; } } }