package org.ovirt.engine.core.utils.ejb; import java.util.HashMap; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import org.ovirt.engine.core.compat.LogCompat; import org.ovirt.engine.core.compat.LogFactoryCompat; /** * EJBUtils strategy to fine tune the lookup process of beans * * */ public abstract class EJBUtilsStrategy { private static LogCompat log = LogFactoryCompat.getLog(EJBUtilsStrategy.class); // Map from resource types (for example ResourceTypeEnum.DATA_SOURCE ) to // their JNDI names protected HashMap<ContainerManagedResourceType, String> resourceTypeToJNDINameMap = new HashMap<ContainerManagedResourceType, String>(); // Map from bean types (for example BeanTypeEnum.BACKEND) to their JNDI // names protected HashMap<BeanType, String> beanTypeToJNDINameMap = new HashMap<BeanType, String>(); protected EJBUtilsStrategy() { // Adds JNDI resources, addJNDIResources(); // Adds JNDI beans - the implementation is in base classes addJNDIBeans(); } protected abstract void addJNDIBeans(); protected void addJNDIResources() { addResourceJNDIName(ContainerManagedResourceType.TRANSACTION_MANAGER, "java:/TransactionManager"); addResourceJNDIName(ContainerManagedResourceType.DATA_SOURCE, "java:/ENGINEDataSource"); } /** * Finds a bean according to its JNDI name * * @param <T> * interface that the bean implements * @param name * JNDI name * @return proxy to bean */ public <T> T findResource(ContainerManagedResourceType resourceValue) { String jndiNameFromMap = getResourceJNDIName(resourceValue); if (jndiNameFromMap == null) { log.error("No JNDI name for : " + resourceValue); return null; } try { InitialContext context = new InitialContext(); return (T) context.lookup(jndiNameFromMap); } catch (NamingException ex) { log.error("Error looking up resource " + resourceValue); return null; } } /** * Finds a bean according to the bean type and proxy type * * @param <T> * @param aBeanType * @param aType * @return */ public <T> T findBean(BeanType beanType, BeanProxyType proxyType) { String jndiNameFromMap = null; StringBuilder jndiNameSB = null; Context context = null; try { jndiNameFromMap = getBeanJNDIName(beanType); if (jndiNameFromMap == null) { log.error("No JNDI name for : " + beanType); return null; } jndiNameSB = new StringBuilder(); jndiNameSB.append(jndiNameFromMap); jndiNameSB.append(proxyType.toString()); if (proxyType == BeanProxyType.LOCAL) { context = new InitialContext(); } else if (proxyType == BeanProxyType.REMOTE) { // Context for remote lookup might be created differently (for // example, // provider URL should be specified context = createRemoteContext(); } // appends "local" or "remote" to the jndi name, depends on the // proxy type if (context != null) { return (T) context.lookup(jndiNameSB.toString()); } else { log.errorFormat("Failed to create InitialContext which is currently null," + " possibly because given BeanProxyType is null. Given BeanProxyType: {0}", ((proxyType == null) ? "is null" : proxyType.toString())); throw new NullPointerException(); } } catch (Exception e) { StringBuilder errorMsgSb = new StringBuilder(); errorMsgSb.append("Failed to lookup resource type: ").append(beanType).append(". JNDI name: ") .append(jndiNameSB.toString()); log.error(errorMsgSb.toString(), e); return null; } } protected Context createRemoteContext() throws NamingException { return new InitialContext(); } protected void addResourceJNDIName(ContainerManagedResourceType aResourceEnumValue, String aJNDIName) { resourceTypeToJNDINameMap.put(aResourceEnumValue, aJNDIName); } protected void addBeanJNDIName(BeanType aEnumValue, String aJNDIName) { beanTypeToJNDINameMap.put(aEnumValue, aJNDIName); } protected String getResourceJNDIName(ContainerManagedResourceType aResourceEnumValue) { return resourceTypeToJNDINameMap.get(aResourceEnumValue); } protected String getBeanJNDIName(BeanType aEnumValue) { return beanTypeToJNDINameMap.get(aEnumValue); } }