You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by od...@apache.org on 2013/12/31 17:06:59 UTC

git commit: AMBARI-4201. Enable caching in HostConfigMappingDAO (odiachenko)

Updated Branches:
  refs/heads/trunk 5eeb4241d -> 2ef018b47


AMBARI-4201. Enable caching in HostConfigMappingDAO (odiachenko)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/2ef018b4
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/2ef018b4
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/2ef018b4

Branch: refs/heads/trunk
Commit: 2ef018b47885554873e03ab02953fa39cf43273d
Parents: 5eeb424
Author: Oleksandr Diachenko <od...@hortonworks.com>
Authored: Tue Dec 31 18:06:16 2013 +0200
Committer: Oleksandr Diachenko <od...@hortonworks.com>
Committed: Tue Dec 31 18:06:16 2013 +0200

----------------------------------------------------------------------
 .../AmbariManagementControllerImpl.java         |   6 +-
 .../server/controller/ControllerModule.java     |   4 +
 .../controller/ResourceProviderFactory.java     |  10 +
 .../AbstractControllerResourceProvider.java     |   4 +-
 .../internal/ComponentResourceProvider.java     |  14 +-
 .../internal/HostResourceProvider.java          |   1 -
 .../internal/ServiceResourceProvider.java       |  15 +-
 .../orm/dao/ConfigGroupHostMappingDAO.java      |   1 -
 .../server/orm/dao/HostConfigMappingDAO.java    | 323 +++++++++++++++----
 .../ambari/server/state/HostConfigMapping.java  |  47 +++
 .../server/state/HostConfigMappingImpl.java     | 186 +++++++++++
 .../server/state/cluster/ClusterImpl.java       |  11 +-
 .../ambari/server/state/host/HostImpl.java      |  33 +-
 .../resources/BaseResourceDefinitionTest.java   |  31 +-
 .../AbstractControllerResourceProviderTest.java |  15 +-
 .../internal/AbstractResourceProviderTest.java  |  12 +-
 .../internal/ComponentResourceProviderTest.java |  16 +-
 .../internal/ServiceResourceProviderTest.java   |  21 +-
 .../orm/dao/HostConfigMappingDAOTest.java       |  89 +++--
 19 files changed, 656 insertions(+), 183 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 46c6a9f..c3fdae3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -531,7 +531,7 @@ public class AmbariManagementControllerImpl implements
   }
 
 
-  private synchronized Set<ClusterResponse> getClusters(ClusterRequest request)
+  private Set<ClusterResponse> getClusters(ClusterRequest request)
       throws AmbariException {
 
     Set<ClusterResponse> response = new HashSet<ClusterResponse>();
@@ -576,7 +576,7 @@ public class AmbariManagementControllerImpl implements
     return response;
   }
 
-  private synchronized Set<ServiceComponentHostResponse> getHostComponents(
+  private Set<ServiceComponentHostResponse> getHostComponents(
       ServiceComponentHostRequest request) throws AmbariException {
     if (request.getClusterName() == null
         || request.getClusterName().isEmpty()) {
@@ -704,7 +704,7 @@ public class AmbariManagementControllerImpl implements
   }
 
 
-  private synchronized Set<ConfigurationResponse> getConfigurations(
+  private Set<ConfigurationResponse> getConfigurations(
       ConfigurationRequest request) throws AmbariException {
     if (request.getClusterName() == null) {
       throw new IllegalArgumentException("Invalid arguments, cluster name"

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
index 087944d..135650f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
@@ -31,8 +31,10 @@ import org.apache.ambari.server.actionmanager.HostRoleCommandFactory;
 import org.apache.ambari.server.actionmanager.HostRoleCommandFactoryImpl;
 import org.apache.ambari.server.actionmanager.StageFactory;
 import org.apache.ambari.server.configuration.Configuration;
+import org.apache.ambari.server.controller.internal.ComponentResourceProvider;
 import org.apache.ambari.server.controller.internal.HostComponentResourceProvider;
 import org.apache.ambari.server.controller.internal.HostResourceProvider;
+import org.apache.ambari.server.controller.internal.ServiceResourceProvider;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.orm.PersistenceType;
 import org.apache.ambari.server.scheduler.ExecutionScheduler;
@@ -193,6 +195,8 @@ public class ControllerModule extends AbstractModule {
     install(new FactoryModuleBuilder()
         .implement(ResourceProvider.class, Names.named("host"), HostResourceProvider.class)
         .implement(ResourceProvider.class, Names.named("hostComponent"), HostComponentResourceProvider.class)
+        .implement(ResourceProvider.class, Names.named("service"), ServiceResourceProvider.class)
+        .implement(ResourceProvider.class, Names.named("component"), ComponentResourceProvider.class)
         .build(ResourceProviderFactory.class)); 
 
     

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
index cc7c03e..0113d75 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
@@ -37,5 +37,15 @@ public interface ResourceProviderFactory {
   ResourceProvider getHostComponentResourceProvider(Set<String> propertyIds,
       Map<Type, String> keyPropertyIds,
       AmbariManagementController managementController);
+  
+  @Named("service")
+  ResourceProvider getServiceResourceProvider(Set<String> propertyIds,
+      Map<Type, String> keyPropertyIds,
+      AmbariManagementController managementController);
+  
+  @Named("component")
+  ResourceProvider getComponentResourceProvider(Set<String> propertyIds,
+      Map<Type, String> keyPropertyIds,
+      AmbariManagementController managementController);
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
index d15c2ef..c8699cc 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
@@ -94,9 +94,9 @@ public abstract class AbstractControllerResourceProvider extends AbstractResourc
       case Cluster:
         return new ClusterResourceProvider(propertyIds, keyPropertyIds, managementController);
       case Service:
-        return new ServiceResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return resourceProviderFactory.getServiceResourceProvider(propertyIds, keyPropertyIds, managementController);
       case Component:
-        return new ComponentResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return resourceProviderFactory.getComponentResourceProvider(propertyIds, keyPropertyIds, managementController);
       case Host:
         return resourceProviderFactory.getHostResourceProvider(propertyIds, keyPropertyIds, managementController);
       case HostComponent:

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
index a56df0f..5e9b3b4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
@@ -56,10 +56,14 @@ import org.apache.ambari.server.state.ServiceComponentHost;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.State;
 
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import com.google.inject.persist.Transactional;
+
 /**
  * Resource provider for component resources.
  */
-class ComponentResourceProvider extends AbstractControllerResourceProvider {
+public class ComponentResourceProvider extends AbstractControllerResourceProvider {
 
 
   // ----- Property ID constants ---------------------------------------------
@@ -91,9 +95,10 @@ class ComponentResourceProvider extends AbstractControllerResourceProvider {
    * @param keyPropertyIds        the key property ids
    * @param managementController  the management controller
    */
-  ComponentResourceProvider(Set<String> propertyIds,
-                            Map<Resource.Type, String> keyPropertyIds,
-                            AmbariManagementController managementController) {
+  @AssistedInject
+  ComponentResourceProvider(@Assisted Set<String> propertyIds,
+                            @Assisted Map<Resource.Type, String> keyPropertyIds,
+                            @Assisted AmbariManagementController managementController) {
     super(propertyIds, keyPropertyIds, managementController);
   }
 
@@ -126,6 +131,7 @@ class ComponentResourceProvider extends AbstractControllerResourceProvider {
   }
 
   @Override
+  @Transactional
   public Set<Resource> getResources(Request request, Predicate predicate)
       throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
index 0b1bb8d..0c9c1f6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
@@ -63,7 +63,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
-import com.google.inject.Injector;
 import com.google.inject.assistedinject.Assisted;
 import com.google.inject.assistedinject.AssistedInject;
 import com.google.inject.persist.Transactional;

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
index f527f43..6387255 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
@@ -54,7 +54,6 @@ import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.ComponentInfo;
-import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceComponentHost;
@@ -63,10 +62,14 @@ import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.State;
 import org.apache.commons.lang.StringUtils;
 
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import com.google.inject.persist.Transactional;
+
 /**
  * Resource provider for service resources.
  */
-class ServiceResourceProvider extends AbstractControllerResourceProvider {
+public class ServiceResourceProvider extends AbstractControllerResourceProvider {
 
 
   // ----- Property ID constants ---------------------------------------------
@@ -107,9 +110,10 @@ class ServiceResourceProvider extends AbstractControllerResourceProvider {
    * @param keyPropertyIds        the key property ids
    * @param managementController  the management controller
    */
-  ServiceResourceProvider(Set<String> propertyIds,
-                          Map<Resource.Type, String> keyPropertyIds,
-                          AmbariManagementController managementController) {
+  @AssistedInject
+  public ServiceResourceProvider(@Assisted Set<String> propertyIds,
+                          @Assisted Map<Resource.Type, String> keyPropertyIds,
+                          @Assisted AmbariManagementController managementController) {
     super(propertyIds, keyPropertyIds, managementController);
   }
 
@@ -139,6 +143,7 @@ class ServiceResourceProvider extends AbstractControllerResourceProvider {
   }
 
   @Override
+  @Transactional
   public Set<Resource> getResources(Request request, Predicate predicate) throws
       SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java
index 90aa5a5..5ca155f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java
@@ -25,7 +25,6 @@ import org.apache.ambari.server.orm.entities.ConfigGroupHostMappingEntity;
 import org.apache.ambari.server.orm.entities.ConfigGroupHostMappingEntityPK;
 import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
-import javax.persistence.Query;
 import javax.persistence.TypedQuery;
 import java.util.List;
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostConfigMappingDAO.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostConfigMappingDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostConfigMappingDAO.java
index e4ad970..980cfda 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostConfigMappingDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostConfigMappingDAO.java
@@ -18,12 +18,20 @@
 package org.apache.ambari.server.orm.dao;
 
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import javax.persistence.EntityManager;
 import javax.persistence.TypedQuery;
 
 import com.google.inject.Singleton;
+
 import org.apache.ambari.server.orm.entities.HostConfigMappingEntity;
+import org.apache.ambari.server.state.HostConfigMapping;
+import org.apache.ambari.server.state.HostConfigMappingImpl;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.Predicate;
 
 import com.google.inject.Inject;
 import com.google.inject.Provider;
@@ -39,99 +47,237 @@ public class HostConfigMappingDAO {
   @Inject
   DaoUtils daoUtils;
   
-  @Transactional
-  public void create(HostConfigMappingEntity entity) {
-    entityManagerProvider.get().persist(entity);
+
+  private final ReadWriteLock gl = new ReentrantReadWriteLock();
+  private Map<String, Set<HostConfigMapping>> hostConfigMappingByHost;
+  
+  private volatile boolean cacheLoaded;
+  
+  private void populateCache() {
+    
+    if (!cacheLoaded) {
+      gl.writeLock().lock();
+      try {
+        gl.writeLock().lock();
+        try {
+          if (hostConfigMappingByHost == null) {
+            hostConfigMappingByHost = new ConcurrentHashMap<String, Set<HostConfigMapping>>();
+            
+            TypedQuery<HostConfigMappingEntity> query = entityManagerProvider.get().createQuery(
+                "SELECT entity FROM HostConfigMappingEntity entity",
+                HostConfigMappingEntity.class);
+
+            List<HostConfigMappingEntity> hostConfigMappingEntities = daoUtils.selectList(query);
+            
+            for (HostConfigMappingEntity hostConfigMappingEntity : hostConfigMappingEntities) {
+
+              Set<HostConfigMapping> setByHost = hostConfigMappingByHost.get((hostConfigMappingEntity.getType()));
+              
+              if (setByHost == null) {
+                setByHost = new HashSet<HostConfigMapping>();
+                hostConfigMappingByHost.put(hostConfigMappingEntity.getHostName(), setByHost);
+              }
+       
+              HostConfigMapping hostConfigMapping = buildHostConfigMapping(hostConfigMappingEntity);
+              setByHost.add(hostConfigMapping);
+            } 
+          }
+        } finally {
+          gl.writeLock().unlock();
+        }
+      } finally {
+        gl.writeLock().unlock();
+      }
+      
+      cacheLoaded = true;
+
+    }
+    
   }
+  
 
   @Transactional
-  public HostConfigMappingEntity merge(HostConfigMappingEntity entity) {
-    return entityManagerProvider.get().merge(entity);
+  public void create(HostConfigMapping hostConfigMapping) {
+    
+    populateCache();
+    
+    //create in db
+    entityManagerProvider.get().persist(buildHostConfigMappingEntity(hostConfigMapping));
+    
+    //create in cache
+    Set<HostConfigMapping> set = hostConfigMappingByHost.get(hostConfigMapping.getHostName());
+    if (set == null){
+      set = new HashSet<HostConfigMapping>();
+      hostConfigMappingByHost.put(hostConfigMapping.getHostName(), set);
+    }
+    
+    set.add(hostConfigMapping);
   }
 
   @Transactional
-  public List<HostConfigMappingEntity> findByType(long clusterId, String hostName, String type) {
-    TypedQuery<HostConfigMappingEntity> query = entityManagerProvider.get().createQuery(
-      "SELECT entity FROM HostConfigMappingEntity entity " +
-      "WHERE entity.clusterId = ?1 AND entity.hostName = ?2 AND entity.type = ?3",
-      HostConfigMappingEntity.class);
-
-    return daoUtils.selectList(query, Long.valueOf(clusterId), hostName, type);
+  public HostConfigMapping merge(HostConfigMapping hostConfigMapping) {
+    
+    populateCache();
+    
+    Set<HostConfigMapping> set = hostConfigMappingByHost.get(hostConfigMapping.getHostName());
+    if (set == null){
+      set = new HashSet<HostConfigMapping>();
+      hostConfigMappingByHost.put(hostConfigMapping.getHostName(), set);
+    }
+    
+    //Update object in set
+    set.remove(hostConfigMapping);
+    set.add(hostConfigMapping);
+    
+    entityManagerProvider.get().merge(buildHostConfigMappingEntity(hostConfigMapping));
+    
+    return hostConfigMapping;
   }
 
   @Transactional
-  public HostConfigMappingEntity findSelectedByType(long clusterId,
-      String hostName, String type) {
-
-    TypedQuery<HostConfigMappingEntity> query = entityManagerProvider.get().createQuery(
-        "SELECT entity FROM HostConfigMappingEntity entity " +
-        "WHERE entity.clusterId = ?1 AND entity.hostName = ?2 " +
-            "AND entity.type = ?3 " +
-            "AND entity.selected > 0",
-        HostConfigMappingEntity.class);
+  public Set<HostConfigMapping> findByType(final long clusterId, String hostName, final String type) {
+    
+    populateCache();
+    
+    if (!hostConfigMappingByHost.containsKey(hostName))
+      return Collections.emptySet();
+      
+    Set<HostConfigMapping> set = new HashSet<HostConfigMapping>(hostConfigMappingByHost.get(hostName));
+     
+    CollectionUtils.filter(set, new Predicate() {
+        
+      @Override
+      public boolean evaluate(Object arg0) {
+                  
+        return ((HostConfigMapping) arg0).getClusterId().equals(clusterId) 
+            && ((HostConfigMapping) arg0).getType().equals(type);
+      }
+    });
 
-    return daoUtils.selectSingle(query, Long.valueOf(clusterId), hostName, type);
+    return set;
   }
 
   @Transactional
-  public List<HostConfigMappingEntity> findSelected(long clusterId, String hostName) {
-    TypedQuery<HostConfigMappingEntity> query = entityManagerProvider.get().createQuery(
-        "SELECT entity FROM HostConfigMappingEntity entity " +
-        "WHERE entity.clusterId = ?1 AND entity.hostName = ?2 " +
-            "AND entity.selected > 0",
-        HostConfigMappingEntity.class);
+  public HostConfigMapping findSelectedByType(final long clusterId,
+      String hostName, final String type) {
+    
+    populateCache();
+    
+    if (!hostConfigMappingByHost.containsKey(hostName))
+      return null;
+    
+    Set<HostConfigMapping> set = new HashSet<HostConfigMapping>(hostConfigMappingByHost.get(hostName));
+    
+    HostConfigMapping result = (HostConfigMapping) CollectionUtils.find(set, new Predicate() {
+      
+      @Override
+      public boolean evaluate(Object arg0) {
+        
+        return ((HostConfigMapping) arg0).getClusterId().equals(clusterId) 
+            && ((HostConfigMapping) arg0).getType().equals(type)
+            && ((HostConfigMapping) arg0).getSelected() > 0;
+      }
+    });
+    
+    
+    return result;
+    
+  }
 
-    return daoUtils.selectList(query, Long.valueOf(clusterId), hostName);
+  @Transactional
+  public Set<HostConfigMapping> findSelected(final long clusterId, String hostName) {
+    
+    populateCache();
+    
+    if (!hostConfigMappingByHost.containsKey(hostName))
+      return Collections.emptySet();
+      
+    
+    Set<HostConfigMapping> set = new HashSet<HostConfigMapping>(hostConfigMappingByHost.get(hostName));
+    
+    CollectionUtils.filter(set, new Predicate() {
+      
+      @Override
+      public boolean evaluate(Object arg0) {
+        return ((HostConfigMapping) arg0).getClusterId().equals(clusterId) 
+            && ((HostConfigMapping) arg0).getSelected() > 0;
+      }
+    });
+    
+    return set;
   }
 
   @Transactional
-  public List<HostConfigMappingEntity> findSelectedByHosts(long clusterId, Collection<String> hostNames) {
+  public Set<HostConfigMapping> findSelectedByHosts(long clusterId, Collection<String> hostNames) {
+    
+    populateCache();
 
     if (hostNames == null || hostNames.isEmpty()) {
-      return Collections.emptyList();
+      return Collections.emptySet();
     }
+    
+    
+    HashSet<HostConfigMapping> result = new HashSet<HostConfigMapping>();
+    
 
-    TypedQuery<HostConfigMappingEntity> query = entityManagerProvider.get().createQuery(
-        "SELECT entity FROM HostConfigMappingEntity entity " +
-            "WHERE entity.clusterId = ?1 AND entity.hostName IN ?2 " +
-            "AND entity.selected > 0",
-        HostConfigMappingEntity.class);
 
-    return daoUtils.selectList(query, Long.valueOf(clusterId), hostNames);
+    for (final String hostName : hostNames) {
+      
+      if (!hostConfigMappingByHost.containsKey(hostName))
+        continue;
+      
+      Set<HostConfigMapping> set = new HashSet<HostConfigMapping>(hostConfigMappingByHost.get(hostName));
+      
+      CollectionUtils.filter(set, new Predicate() {
+        
+        @Override
+        public boolean evaluate(Object arg0) {
+          return ((HostConfigMapping) arg0).getHostName().equals(hostName) && 
+              ((HostConfigMapping) arg0).getSelected() > 0;
+        }
+      });
+      
+      result.addAll(set);
+    } 
+    
+    return result;
   }
 
-  @Transactional
-  public List<HostConfigMappingEntity> findSelectedHostsByType(long clusterId,
-      String type) {
-    TypedQuery<HostConfigMappingEntity> query = entityManagerProvider.get().createQuery(
-        "SELECT entity FROM HostConfigMappingEntity entity " +
-        "WHERE entity.clusterId = ?1 AND entity.type = ?2 AND entity.selected > 0",
-    HostConfigMappingEntity.class);
-    return daoUtils.selectList(query, Long.valueOf(clusterId), type);
-  }
 
   @Transactional
-  public Map<String, List<HostConfigMappingEntity>> findSelectedHostsByTypes(long clusterId,
+  public Map<String, List<HostConfigMapping>> findSelectedHostsByTypes(final long clusterId,
                                                                              Collection<String> types) {
-    TypedQuery<HostConfigMappingEntity> query = entityManagerProvider.get().createQuery(
-        "SELECT entity FROM HostConfigMappingEntity entity " +
-            "WHERE entity.clusterId = ?1 AND entity.type IN ?2 AND entity.selected > 0",
-        HostConfigMappingEntity.class);
-
-    Map<String, List<HostConfigMappingEntity>> mappingsByType = new HashMap<String, List<HostConfigMappingEntity>>();
+    
+    populateCache();
 
+    
+    Map<String, List<HostConfigMapping>> mappingsByType = new HashMap<String, List<HostConfigMapping>>();
+    
     for (String type : types) {
       if (!mappingsByType.containsKey(type)) {
-        mappingsByType.put(type, new ArrayList<HostConfigMappingEntity>());
+        mappingsByType.put(type, new ArrayList<HostConfigMapping>());
       }
     }
 
     if (!types.isEmpty()) {
-      List<HostConfigMappingEntity> mappings = daoUtils.selectList(query, clusterId, types);
-      for (HostConfigMappingEntity mapping : mappings) {
+      List<HostConfigMapping> mappings = new ArrayList<HostConfigMapping>();
+
+      for (Set<HostConfigMapping> entries : hostConfigMappingByHost.values()) {
+        
+        for (HostConfigMapping entry : entries) {
+          
+          if (types.contains(entry.getType()) && entry.getClusterId().equals(clusterId))
+            mappings.add(new HostConfigMappingImpl(entry));
+          
+        }
+      }
+
+      for (HostConfigMapping mapping : mappings) {
         mappingsByType.get(mapping.getType()).add(mapping);
       }
     }
+    
+    
 
     return mappingsByType;
   }
@@ -141,18 +287,67 @@ public class HostConfigMappingDAO {
    * @param hostName
    */
   @Transactional
-  public void removeHost(long clusterId, String hostName) {
-    TypedQuery<HostConfigMappingEntity> query = entityManagerProvider.get().createQuery(
-        "SELECT entity FROM HostConfigMappingEntity entity " +
-        "WHERE entity.clusterId = ?1 AND entity.hostName = ?2",
-        HostConfigMappingEntity.class);
+  public void removeHost(final long clusterId, String hostName) {
     
+    populateCache();
+    
+    Set<HostConfigMapping> set = hostConfigMappingByHost.get(hostName);
+    
+    //Remove from cache items with clusterId
+    CollectionUtils.filter(set, new Predicate() {
+      
+      @Override
+      public boolean evaluate(Object arg0) {
+        return !((HostConfigMapping) arg0).getClusterId().equals(clusterId);
+      }
+    });
+    
+    //delete from db
+    TypedQuery<HostConfigMappingEntity> query = entityManagerProvider.get().createQuery(
+      "SELECT entity FROM HostConfigMappingEntity entity " +
+      "WHERE entity.clusterId = ?1 AND entity.hostName = ?2",
+      HostConfigMappingEntity.class);
+             
     List<HostConfigMappingEntity> list = daoUtils.selectList(query, Long.valueOf(clusterId), hostName);
+        
+    for (HostConfigMappingEntity entity : list) {
+      entityManagerProvider.get().remove(entity);
+    }
+    
+    
+  }
 
-      for (HostConfigMappingEntity entity : list) {
-        entityManagerProvider.get().remove(entity);
-      }
+  public HostConfigMappingEntity buildHostConfigMappingEntity(HostConfigMapping hostConfigMapping) {
+    
+    HostConfigMappingEntity hostConfigMappingEntity = new HostConfigMappingEntity();
+    
+    hostConfigMappingEntity.setClusterId(hostConfigMapping.getClusterId());
+    hostConfigMappingEntity.setCreateTimestamp(hostConfigMapping.getCreateTimestamp());
+    hostConfigMappingEntity.setHostName(hostConfigMapping.getHostName());
+    hostConfigMappingEntity.setSelected(hostConfigMapping.getSelected());
+    hostConfigMappingEntity.setServiceName(hostConfigMapping.getServiceName());
+    hostConfigMappingEntity.setType(hostConfigMapping.getType());
+    hostConfigMappingEntity.setUser(hostConfigMapping.getUser());
+    hostConfigMappingEntity.setVersion(hostConfigMapping.getVersion());
+    
+    return hostConfigMappingEntity;
+  }
+  
+  public HostConfigMapping buildHostConfigMapping(
+      HostConfigMappingEntity hostConfigMappingEntity) {
+    
+    HostConfigMapping hostConfigMapping = new HostConfigMappingImpl();
+    
+    hostConfigMapping.setClusterId(hostConfigMappingEntity.getClusterId());
+    hostConfigMapping.setCreateTimestamp(hostConfigMappingEntity.getCreateTimestamp());
+    hostConfigMapping.setHostName(hostConfigMappingEntity.getHostName());
+    hostConfigMapping.setServiceName(hostConfigMappingEntity.getServiceName());
+    hostConfigMapping.setType(hostConfigMappingEntity.getType());
+    hostConfigMapping.setUser(hostConfigMappingEntity.getUser());
+    hostConfigMapping.setSelected(hostConfigMappingEntity.isSelected());
+    hostConfigMapping.setVersion(hostConfigMappingEntity.getVersion());
     
+    return hostConfigMapping;
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/main/java/org/apache/ambari/server/state/HostConfigMapping.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/HostConfigMapping.java b/ambari-server/src/main/java/org/apache/ambari/server/state/HostConfigMapping.java
new file mode 100644
index 0000000..4ad25db
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/HostConfigMapping.java
@@ -0,0 +1,47 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.state;
+
+public interface HostConfigMapping {
+  
+  public Long getClusterId();
+  public void setClusterId(Long clusterId);
+  
+  public String getHostName();
+  public void setHostName(String hostName);
+  
+  public String getType();
+  public void setType(String type);
+  
+  public Long getCreateTimestamp();
+  public void setCreateTimestamp(Long createTimestamp);
+  
+  public String getVersion();
+  public void setVersion(String version);
+  
+  public String getServiceName();
+  public void setServiceName(String serviceName);
+  
+  public String getUser();
+  public void setUser(String user);
+  
+  public Integer getSelected();
+  public void setSelected(Integer selected);
+  
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/main/java/org/apache/ambari/server/state/HostConfigMappingImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/HostConfigMappingImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/HostConfigMappingImpl.java
new file mode 100644
index 0000000..6905e27
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/HostConfigMappingImpl.java
@@ -0,0 +1,186 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.state;
+
+public class HostConfigMappingImpl implements HostConfigMapping {
+  
+  private Long clusterId;
+  private String hostName;
+  private String type;
+  private Long createTimestamp;
+  private String version;
+  private String serviceName;
+  private String user;
+  private Integer selected;
+  
+
+  
+  public HostConfigMappingImpl(HostConfigMapping entry) {
+    setClusterId(entry.getClusterId());
+    setHostName(entry.getHostName());
+    setType(entry.getType());
+    setCreateTimestamp(entry.getCreateTimestamp());
+    setVersion(entry.getVersion());
+    setServiceName(entry.getServiceName());
+    setUser(entry.getUser());
+    setSelected(entry.getSelected());
+  }
+
+  public HostConfigMappingImpl() {
+  }
+
+  @Override
+  public Long getClusterId() {
+    return clusterId;
+  }
+  
+  @Override
+  public void setClusterId(Long clusterId) {
+    if (clusterId == null)
+      throw new RuntimeException("ClusterId couldn't be null");
+    this.clusterId = clusterId;
+  }
+  
+  @Override
+  public String getHostName() {
+    return hostName;
+  }
+  
+  @Override
+  public void setHostName(String hostName) {
+    if (hostName == null)
+      throw new RuntimeException("HostName couldn't be null");
+    this.hostName = hostName;
+  }
+  
+  @Override
+  public String getType() {
+    return type;
+  }
+  
+  @Override
+  public void setType(String type) {
+    if (type == null)
+      throw new RuntimeException("Type couldn't be null");
+    this.type = type;
+  }
+  
+  @Override
+  public Long getCreateTimestamp() {
+    return createTimestamp;
+  }
+  
+  @Override
+  public void setCreateTimestamp(Long createTimestamp) {
+    if (createTimestamp == null)
+      throw new RuntimeException("CreateTimestamp couldn't be null");
+    this.createTimestamp = createTimestamp;
+  }
+  
+  @Override
+  public String getVersion() {
+    return version;
+  }
+  
+  @Override
+  public void setVersion(String version) {
+    if (version == null)
+      throw new RuntimeException("Version couldn't be null");
+    this.version = version;
+  }
+  public String getServiceName() {
+    return serviceName;
+  }
+  
+  @Override
+  public void setServiceName(String serviceName) {
+    this.serviceName = serviceName;
+  }
+  
+  @Override
+  public String getUser() {
+    return user;
+  }
+  
+  @Override
+  public void setUser(String user) {
+    if (user == null)
+      throw new RuntimeException("User couldn't be null");
+    this.user = user;
+  }
+
+  @Override
+  public Integer getSelected() {
+    return selected;
+  }
+
+  @Override
+  public void setSelected(Integer selected) {
+    if (selected == null)
+      throw new RuntimeException("Selected couldn't be null");
+    this.selected = selected;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((clusterId == null) ? 0 : clusterId.hashCode());
+    result =
+        prime * result
+            + ((createTimestamp == null) ? 0 : createTimestamp.hashCode());
+    result = prime * result + ((hostName == null) ? 0 : hostName.hashCode());
+    result = prime * result + ((type == null) ? 0 : type.hashCode());
+    return result;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj)
+      return true;
+    if (obj == null)
+      return false;
+    if (getClass() != obj.getClass())
+      return false;
+    HostConfigMappingImpl other = (HostConfigMappingImpl) obj;
+    if (clusterId == null) {
+      if (other.clusterId != null)
+        return false;
+    } else if (!clusterId.equals(other.clusterId))
+      return false;
+    if (createTimestamp == null) {
+      if (other.createTimestamp != null)
+        return false;
+    } else if (!createTimestamp.equals(other.createTimestamp))
+      return false;
+    if (hostName == null) {
+      if (other.hostName != null)
+        return false;
+    } else if (!hostName.equals(other.hostName))
+      return false;
+    if (type == null) {
+      if (other.type != null)
+        return false;
+    } else if (!type.equals(other.type))
+      return false;
+    return true;
+  }
+  
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index 0526a3d..507cbc0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
@@ -38,13 +38,14 @@ import org.apache.ambari.server.orm.entities.ClusterServiceEntity;
 import org.apache.ambari.server.orm.entities.ClusterStateEntity;
 import org.apache.ambari.server.orm.entities.ConfigGroupEntity;
 import org.apache.ambari.server.orm.entities.ConfigGroupHostMappingEntity;
-import org.apache.ambari.server.orm.entities.HostConfigMappingEntity;
+import org.apache.ambari.server.state.HostConfigMapping;
 import org.apache.ambari.server.orm.entities.RequestScheduleEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.ConfigFactory;
 import org.apache.ambari.server.state.DesiredConfig;
+import org.apache.ambari.server.state.HostConfigMapping;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceComponentHost;
@@ -1292,12 +1293,12 @@ public class ClusterImpl implements Cluster {
         }
 
         if (!map.isEmpty()) {
-          Map<String, List<HostConfigMappingEntity>> hostMappingsByType =
+          Map<String, List<HostConfigMapping>> hostMappingsByType =
             hostConfigMappingDAO.findSelectedHostsByTypes(clusterEntity.getClusterId(), types);
 
           for (Entry<String, DesiredConfig> entry : map.entrySet()) {
             List<DesiredConfig.HostOverride> hostOverrides = new ArrayList<DesiredConfig.HostOverride>();
-            for (HostConfigMappingEntity mappingEntity : hostMappingsByType.get(entry.getKey())) {
+            for (HostConfigMapping mappingEntity : hostMappingsByType.get(entry.getKey())) {
               hostOverrides.add(new DesiredConfig.HostOverride(mappingEntity.getHostName(),
                 mappingEntity.getVersion()));
             }
@@ -1345,7 +1346,7 @@ public class ClusterImpl implements Cluster {
       return Collections.emptyMap();
     }
 
-    List<HostConfigMappingEntity> mappingEntities =
+    Set<HostConfigMapping> mappingEntities =
       hostConfigMappingDAO.findSelectedByHosts(clusterEntity.getClusterId(), hostnames);
 
     Map<String, Map<String, DesiredConfig>> desiredConfigsByHost = new HashMap<String, Map<String, DesiredConfig>>();
@@ -1354,7 +1355,7 @@ public class ClusterImpl implements Cluster {
       desiredConfigsByHost.put(hostname, new HashMap<String, DesiredConfig>());
     }
 
-    for (HostConfigMappingEntity mappingEntity : mappingEntities) {
+    for (HostConfigMapping mappingEntity : mappingEntities) {
       DesiredConfig desiredConfig = new DesiredConfig();
       desiredConfig.setVersion(mappingEntity.getVersion());
       desiredConfig.setServiceName(mappingEntity.getServiceName());

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/main/java/org/apache/ambari/server/state/host/HostImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/host/HostImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/host/HostImpl.java
index 2336c68..d2ac9c0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/host/HostImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/host/HostImpl.java
@@ -37,7 +37,6 @@ import org.apache.ambari.server.orm.dao.HostConfigMappingDAO;
 import org.apache.ambari.server.orm.dao.HostDAO;
 import org.apache.ambari.server.orm.dao.HostStateDAO;
 import org.apache.ambari.server.orm.entities.ClusterEntity;
-import org.apache.ambari.server.orm.entities.HostConfigMappingEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.orm.entities.HostStateEntity;
 import org.apache.ambari.server.state.AgentVersion;
@@ -47,6 +46,8 @@ import org.apache.ambari.server.state.Config;
 import org.apache.ambari.server.state.DesiredConfig;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.HostConfig;
+import org.apache.ambari.server.state.HostConfigMapping;
+import org.apache.ambari.server.state.HostConfigMappingImpl;
 import org.apache.ambari.server.state.HostEvent;
 import org.apache.ambari.server.state.HostEventType;
 import org.apache.ambari.server.state.HostHealthStatus;
@@ -1135,7 +1136,7 @@ public class HostImpl implements Host {
     if (null == user)
       throw new NullPointerException("User must be specified.");
     
-    HostConfigMappingEntity exist = getDesiredConfigEntity(clusterId, config.getType());
+    HostConfigMapping exist = getDesiredConfigEntity(clusterId, config.getType());
     if (null != exist && exist.getVersion().equals(config.getVersionTag())) {
       if (!selected) {
         exist.setSelected(0);
@@ -1148,22 +1149,22 @@ public class HostImpl implements Host {
     
     try {
       // set all old mappings for this type to empty
-      for (HostConfigMappingEntity e : hostConfigMappingDAO.findByType(clusterId,
+      for (HostConfigMapping e : hostConfigMappingDAO.findByType(clusterId,
           hostEntity.getHostName(), config.getType())) {
         e.setSelected(0);
         hostConfigMappingDAO.merge(e);
       }
       
-      HostConfigMappingEntity entity = new HostConfigMappingEntity();
-      entity.setClusterId(Long.valueOf(clusterId));
-      entity.setCreateTimestamp(Long.valueOf(System.currentTimeMillis()));
-      entity.setHostName(hostEntity.getHostName());
-      entity.setSelected(1);
-      entity.setUser(user);
-      entity.setType(config.getType());
-      entity.setVersion(config.getVersionTag());
+      HostConfigMapping hostConfigMapping = new HostConfigMappingImpl();
+      hostConfigMapping.setClusterId(Long.valueOf(clusterId));
+      hostConfigMapping.setCreateTimestamp(Long.valueOf(System.currentTimeMillis()));
+      hostConfigMapping.setHostName(hostEntity.getHostName());
+      hostConfigMapping.setSelected(1);
+      hostConfigMapping.setUser(user);
+      hostConfigMapping.setType(config.getType());
+      hostConfigMapping.setVersion(config.getVersionTag());
       
-      hostConfigMappingDAO.create(entity);
+      hostConfigMappingDAO.create(hostConfigMapping);
     }
     finally {
       writeLock.unlock();
@@ -1178,7 +1179,7 @@ public class HostImpl implements Host {
   public Map<String, DesiredConfig> getDesiredConfigs(long clusterId) {
     Map<String, DesiredConfig> map = new HashMap<String, DesiredConfig>();
 
-    for (HostConfigMappingEntity e : hostConfigMappingDAO.findSelected(
+    for (HostConfigMapping e : hostConfigMappingDAO.findSelected(
         clusterId, hostEntity.getHostName())) {
       
       DesiredConfig dc = new DesiredConfig();
@@ -1233,8 +1234,10 @@ public class HostImpl implements Host {
     return hostConfigMap;
   }
 
-  private HostConfigMappingEntity getDesiredConfigEntity(long clusterId, String type) {
-    return hostConfigMappingDAO.findSelectedByType(clusterId,
+  private HostConfigMapping getDesiredConfigEntity(long clusterId, String type) {
+    HostConfigMapping findSelectedByType = hostConfigMappingDAO.findSelectedByType(clusterId,
         hostEntity.getHostName(), type);
+    
+    return findSelectedByType;
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BaseResourceDefinitionTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BaseResourceDefinitionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BaseResourceDefinitionTest.java
index 86b0603..7e0845e 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BaseResourceDefinitionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BaseResourceDefinitionTest.java
@@ -1,14 +1,27 @@
 package org.apache.ambari.server.api.resources;
 
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.anyObject;
+
 import org.apache.ambari.server.api.handlers.BaseManagementHandler;
 import org.apache.ambari.server.api.util.TreeNode;
 import org.apache.ambari.server.api.util.TreeNodeImpl;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.ResourceProviderFactory;
+import org.apache.ambari.server.controller.internal.AbstractControllerResourceProvider;
 import org.apache.ambari.server.controller.internal.ResourceImpl;
+import org.apache.ambari.server.controller.internal.ServiceResourceProvider;
 import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceProvider;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.junit.Assert;
 import org.junit.Test;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * BaseResourceDefinition tests.
@@ -33,7 +46,23 @@ public class BaseResourceDefinitionTest {
     TreeNode<Resource> serviceNode = new TreeNodeImpl<Resource>(parentNode, service, "service1");
 
     parentNode.setProperty("isCollection", "true");
-
+    
+    ResourceProviderFactory factory = createMock(ResourceProviderFactory.class);
+    AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    
+    ResourceProvider serviceResourceProvider = new ServiceResourceProvider(PropertyHelper
+        .getPropertyIds(Resource.Type.Service),
+        PropertyHelper.getKeyPropertyIds(Resource.Type.Service),
+        managementController);
+    
+    expect(factory.getServiceResourceProvider(anyObject(Set.class),
+        anyObject(Map.class),
+        anyObject(AmbariManagementController.class))).andReturn(serviceResourceProvider);
+    
+    AbstractControllerResourceProvider.init(factory);
+    
+    replay(factory, managementController);
+    
     processor.process(null, serviceNode, "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/services");
 
     String href = serviceNode.getProperty("href");

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java
index cc7a308..588932a 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java
@@ -20,10 +20,11 @@ package org.apache.ambari.server.controller.internal;
 
 import junit.framework.Assert;
 import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.ResourceProviderFactory;
 import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.utilities.PredicateBuilder;
-import org.codehaus.jackson.map.ser.PropertyBuilder;
 import org.junit.Test;
 
 import java.util.HashMap;
@@ -31,8 +32,9 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
-import static org.easymock.EasyMock.and;
 import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
 
 /**
  * Abstract controller resource provider test.
@@ -52,6 +54,15 @@ public class AbstractControllerResourceProviderTest {
     Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
 
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    
+    ResourceProviderFactory factory = createMock(ResourceProviderFactory.class);
+    
+    ResourceProvider serviceResourceProvider = new ServiceResourceProvider(propertyIds, keyPropertyIds, managementController);
+    expect(factory.getServiceResourceProvider(propertyIds, keyPropertyIds, managementController)).andReturn(serviceResourceProvider);
+    
+    AbstractControllerResourceProvider.init(factory);
+    
+    replay(managementController, factory);
 
     AbstractResourceProvider provider =
         (AbstractResourceProvider) AbstractControllerResourceProvider.getResourceProvider(

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java
index c86ad45..11adbee 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java
@@ -62,9 +62,7 @@ public class AbstractResourceProviderTest {
 
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
 
-    AbstractResourceProvider provider =
-        (AbstractResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
-            Resource.Type.Service,
+    AbstractResourceProvider provider = new ServiceResourceProvider(
             propertyIds,
             keyPropertyIds,
             managementController);
@@ -102,9 +100,7 @@ public class AbstractResourceProviderTest {
 
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
 
-    AbstractResourceProvider provider =
-        (AbstractResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
-            Resource.Type.Service,
+    AbstractResourceProvider provider = new ServiceResourceProvider(
             propertyIds,
             keyPropertyIds,
             managementController);
@@ -119,9 +115,7 @@ public class AbstractResourceProviderTest {
     Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
 
-    AbstractResourceProvider provider =
-        (AbstractResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
-            Resource.Type.Service,
+    AbstractResourceProvider provider = new ServiceResourceProvider(
             propertyIds,
             keyPropertyIds,
             managementController);

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java
index c0de09d..a8770ac 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java
@@ -112,9 +112,7 @@ public class ComponentResourceProviderTest {
     replay(managementController, response, clusters, cluster, service, stackId, ambariMetaInfo,
         serviceComponentFactory, serviceComponent);
 
-    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-        type,
-        PropertyHelper.getPropertyIds(type),
+    ResourceProvider provider = new ComponentResourceProvider(PropertyHelper.getPropertyIds(type),
         PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
@@ -186,8 +184,7 @@ public class ComponentResourceProviderTest {
     replay(managementController, clusters, cluster, ambariMetaInfo, service,
         serviceComponent1, serviceComponent2, serviceComponent3, stackId, componentInfo);
 
-    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-        type,
+    ResourceProvider provider = new ComponentResourceProvider(
         PropertyHelper.getPropertyIds(type),
         PropertyHelper.getKeyPropertyIds(type),
         managementController);
@@ -292,8 +289,7 @@ public class ComponentResourceProviderTest {
         serviceComponent1, serviceComponent2, serviceComponent3, serviceComponentHost,
         requestStatusResponse, stackId);
 
-    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-        type,
+    ResourceProvider provider = new ComponentResourceProvider(
         PropertyHelper.getPropertyIds(type),
         PropertyHelper.getKeyPropertyIds(type),
         managementController);
@@ -326,8 +322,7 @@ public class ComponentResourceProviderTest {
     // replay
     replay(managementController);
 
-    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-        type,
+    ResourceProvider provider = new ComponentResourceProvider(
         PropertyHelper.getPropertyIds(type),
         PropertyHelper.getKeyPropertyIds(type),
         managementController);
@@ -467,8 +462,7 @@ public class ComponentResourceProviderTest {
   public static ComponentResourceProvider getComponentResourceProvider(AmbariManagementController managementController) {
     Resource.Type type = Resource.Type.Component;
 
-    return (ComponentResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
-        type,
+    return new ComponentResourceProvider(
         PropertyHelper.getPropertyIds(type),
         PropertyHelper.getKeyPropertyIds(type),
         managementController);

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java
index 83f0991..25cf6bf 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java
@@ -451,13 +451,11 @@ public class ServiceResourceProviderTest {
     Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
 
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
-
-    AbstractResourceProvider provider =
-        (AbstractResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
-            Resource.Type.Service,
-            propertyIds,
-            keyPropertyIds,
-            managementController);
+    
+    
+    AbstractResourceProvider provider = new ServiceResourceProvider(propertyIds,
+        keyPropertyIds,
+        managementController);
 
     Set<String> unsupported = provider.checkPropertyIds(Collections.singleton("foo"));
     Assert.assertTrue(unsupported.isEmpty());
@@ -863,12 +861,9 @@ public class ServiceResourceProviderTest {
 
   public static ServiceResourceProvider getServiceProvider(AmbariManagementController managementController) {
     Resource.Type type = Resource.Type.Service;
-
-    return (ServiceResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
-        type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
-        managementController);
+    return new ServiceResourceProvider(PropertyHelper.getPropertyIds(type),
+            PropertyHelper.getKeyPropertyIds(type),
+            managementController);
   }
 
   public static void createServices(AmbariManagementController controller, Set<ServiceRequest> requests) throws AmbariException {

http://git-wip-us.apache.org/repos/asf/ambari/blob/2ef018b4/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/HostConfigMappingDAOTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/HostConfigMappingDAOTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/HostConfigMappingDAOTest.java
index a594499..50b070e 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/HostConfigMappingDAOTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/HostConfigMappingDAOTest.java
@@ -17,15 +17,15 @@
  */
 package org.apache.ambari.server.orm.dao;
 
-import java.util.Date;
-import java.util.List;
+import java.util.Set;
 
 import junit.framework.Assert;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
-import org.apache.ambari.server.orm.entities.HostConfigMappingEntity;
+import org.apache.ambari.server.state.HostConfigMapping;
+import org.apache.ambari.server.state.HostConfigMappingImpl;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -55,8 +55,8 @@ public class HostConfigMappingDAOTest {
     injector.getInstance(PersistService.class).stop();
   }
   
-  private HostConfigMappingEntity createEntity(long clusterId, String host, String type, String version) throws Exception {
-    HostConfigMappingEntity entity = new HostConfigMappingEntity();
+  private HostConfigMapping createEntity(long clusterId, String host, String type, String version) throws Exception {
+    HostConfigMapping entity = new HostConfigMappingImpl();
     entity.setClusterId(Long.valueOf(clusterId));
     entity.setCreateTimestamp(Long.valueOf(System.currentTimeMillis()));
     entity.setHostName(host);
@@ -78,43 +78,60 @@ public class HostConfigMappingDAOTest {
 
   @Test
   public void testFindByType() throws Exception {
-    HostConfigMappingEntity source = createEntity(1L, "h1", "global", "v1");
+    HostConfigMapping source = createEntity(1L, "h1", "global", "v1");
     
-    List<HostConfigMappingEntity> target = hostConfigMappingDAO.findByType(1L, "h1", "global");
+    Set<HostConfigMapping> target = hostConfigMappingDAO.findByType(1L, "h1", "global");
 
     Assert.assertEquals("Expected one result", 1, target.size());
-    Assert.assertEquals("Expected version 'v1'", source.getVersion(), target.get(0).getVersion());
+    
+    for (HostConfigMapping item : target) 
+      Assert.assertEquals("Expected version 'v1'", source.getVersion(), item.getVersion());
   }
   
   @Test
   public void testMerge() throws Exception {
-    HostConfigMappingEntity source = createEntity(1L, "h1", "global", "v1");
+    HostConfigMapping source = createEntity(1L, "h1", "global", "v1");
     
-    List<HostConfigMappingEntity> target = hostConfigMappingDAO.findByType(1L, "h1", "global");
+    Set<HostConfigMapping> target = hostConfigMappingDAO.findByType(1L, "h1", "global");
 
     Assert.assertEquals("Expected one result", 1, target.size());
-    Assert.assertEquals("Expected version 'v1'", source.getVersion(), target.get(0).getVersion());
-    Assert.assertEquals("Expected selected flag 1", 1, target.get(0).isSelected());
     
-    HostConfigMappingEntity toChange = target.get(0);
+    HostConfigMapping toChange = null;
+    
+    for (HostConfigMapping item: target) {
+      
+      Assert.assertEquals("Expected version 'v1'", source.getVersion(), item.getVersion());
+      Assert.assertEquals("Expected selected flag 1", 1, (int)item.getSelected());
+      
+      toChange = item;
+      
+      toChange.setSelected(0);
+      
+    }
     
-    toChange.setSelected(0);
+
     
     hostConfigMappingDAO.merge(toChange);
     
     target = hostConfigMappingDAO.findByType(1L, "h1", "global");
 
     Assert.assertEquals("Expected one result", 1, target.size());
-    Assert.assertEquals("Expected version 'v1'", source.getVersion(), target.get(0).getVersion());
-    Assert.assertEquals("Expected selected flag 0", 0, target.get(0).isSelected());
+    
+    
+    for (HostConfigMapping item: target) {
+      
+      Assert.assertEquals("Expected version 'v1'", source.getVersion(), item.getVersion());
+      Assert.assertEquals("Expected selected flag 0", 0, (int)item.getSelected());
+      
+    }
   }
   
   @Test
   public void testFindSelected() throws Exception {
     createEntity(1L, "h1", "global", "version1");
-    HostConfigMappingEntity entity2 = createEntity(1L, "h1", "core-site", "version1");
+    HostConfigMapping entity2 = createEntity(1L, "h1", "core-site", "version1");
     
-    List<HostConfigMappingEntity> targets = hostConfigMappingDAO.findSelected(1L, "h1");
+    Set<HostConfigMapping> targets = hostConfigMappingDAO.findSelected(1L, "h1");
     Assert.assertEquals("Expected two entities", 2, targets.size());
     
     entity2.setSelected(0);
@@ -128,9 +145,9 @@ public class HostConfigMappingDAOTest {
   
   @Test
   public void testFindSelectedByType() throws Exception {
-    HostConfigMappingEntity entity1 = createEntity(1L, "h1", "global", "version1");
+    HostConfigMapping entity1 = createEntity(1L, "h1", "global", "version1");
     
-    HostConfigMappingEntity target = hostConfigMappingDAO.findSelectedByType(1L, "h1", "core-site");
+    HostConfigMapping target = hostConfigMappingDAO.findSelectedByType(1L, "h1", "core-site");
     Assert.assertNull("Expected null entity for type 'core-site'", target);
     
     target = hostConfigMappingDAO.findSelectedByType(1L, "h1", "global");
@@ -140,7 +157,7 @@ public class HostConfigMappingDAOTest {
     target.setSelected(0);
     hostConfigMappingDAO.merge(target);
     
-    HostConfigMappingEntity entity2 = createEntity(1L, "h1", "global", "version2");
+    HostConfigMapping entity2 = createEntity(1L, "h1", "global", "version2");
     
     target = hostConfigMappingDAO.findSelectedByType(1L, "h1", "global");
     Assert.assertNotNull("Expected non-null entity for type 'global'", target);
@@ -151,33 +168,11 @@ public class HostConfigMappingDAOTest {
   }
   
   @Test
-  public void testFindSelectedHostsByType() throws Exception {
-    HostConfigMappingEntity entity1 = createEntity(1L, "h1", "global", "v1");
-    HostConfigMappingEntity entity2 = createEntity(1L, "h2", "global", "v1");
-    
-    List<HostConfigMappingEntity> list = hostConfigMappingDAO.findSelectedHostsByType(1L, "global");
-    Assert.assertEquals("Expected two hosts", 2, list.size());
-    
-    entity2.setSelected(0);
-    hostConfigMappingDAO.merge(entity2);
+  public void testEmptyTable() throws Exception {
     
-    list = hostConfigMappingDAO.findSelectedHostsByType(1L, "global");
-    Assert.assertEquals("Expected one host", 1, list.size());
+    hostConfigMappingDAO.removeHost(1L, "h1");
+    HostConfigMapping target = hostConfigMappingDAO.findSelectedByType(1L, "h1", "core-site");
     
-    
-    list = hostConfigMappingDAO.findSelectedHostsByType(1L, "core-site");
-    Assert.assertEquals("Expected no matching hosts", 0, list.size());
-    
-    entity1.setSelected(0);
-    hostConfigMappingDAO.merge(entity1);
-    
-    list = hostConfigMappingDAO.findSelectedHostsByType(1L, "global");
-    Assert.assertEquals("Expected no selected hosts", 0, list.size());
+    Assert.assertEquals(null, target);
   }
-  
-
-  
-  
-  
-  
 }