You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by tb...@apache.org on 2013/11/14 11:39:18 UTC

[1/3] git commit: AMBARI-3763 - Incorrect href for a POST response using associated resources

Updated Branches:
  refs/heads/trunk 22f5fdfb7 -> ae1517672


AMBARI-3763 - Incorrect href for a POST response using associated resources


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

Branch: refs/heads/trunk
Commit: ae1517672bd7b69005e0e6728dafbd77a0503854
Parents: fc427d9
Author: tbeerbower <tb...@hortonworks.com>
Authored: Wed Nov 13 17:04:52 2013 -0500
Committer: tbeerbower <tb...@hortonworks.com>
Committed: Thu Nov 14 05:21:19 2013 -0500

----------------------------------------------------------------------
 .../api/handlers/BaseManagementHandler.java     |  6 +-
 .../api/resources/BaseResourceDefinition.java   |  8 ++-
 .../resources/BaseResourceDefinitionTest.java   | 72 ++++++++++++++++++++
 3 files changed, 81 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/ae151767/ambari-server/src/main/java/org/apache/ambari/server/api/handlers/BaseManagementHandler.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/handlers/BaseManagementHandler.java b/ambari-server/src/main/java/org/apache/ambari/server/api/handlers/BaseManagementHandler.java
index 5af64bb..a31a46e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/handlers/BaseManagementHandler.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/handlers/BaseManagementHandler.java
@@ -45,6 +45,8 @@ public abstract class BaseManagementHandler implements RequestHandler {
   protected final static Logger LOG =
       LoggerFactory.getLogger(BaseManagementHandler.class);
 
+  public static final String RESOURCES_NODE_NAME = "resources";
+
   /**
    * PersistenceManager implementation.
    */
@@ -84,10 +86,10 @@ public abstract class BaseManagementHandler implements RequestHandler {
       tree.addChild(requestStatus.getRequestResource(), "request");
     }
 
-    //todo: currently always empty
     Set<Resource> setResources = requestStatus.getAssociatedResources();
     if (! setResources.isEmpty()) {
-      TreeNode<Resource> resourcesNode = tree.addChild(null, "resources");
+      TreeNode<Resource> resourcesNode = tree.addChild(null, RESOURCES_NODE_NAME);
+      resourcesNode.setProperty("isCollection", "true");
 
       int count = 1;
       for (Resource resource : setResources) {

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/ae151767/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java
index 8076879..85ca8e5 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseResourceDefinition.java
@@ -97,8 +97,6 @@ public abstract class BaseResourceDefinition implements ResourceDefinition {
       TreeNode<Resource> parent = resultNode.getParent();
 
       if (parent.getName() != null) {
-        Schema schema = getClusterController().getSchema(r.getType());
-        Object id = r.getPropertyValue(schema.getKeyPropertyId(r.getType()));
 
         int i = href.indexOf("?");
         if (i != -1) {
@@ -108,7 +106,11 @@ public abstract class BaseResourceDefinition implements ResourceDefinition {
         if (!href.endsWith("/")) {
           href = href + '/';
         }
-        href = "true".equals(parent.getProperty("isCollection")) ?
+
+        Schema schema = getClusterController().getSchema(r.getType());
+        Object id     = r.getPropertyValue(schema.getKeyPropertyId(r.getType()));
+
+        href = parent.getProperty("isCollection").equals("true") ?
             href + id : href + parent.getName() + '/' + id;
       }
       resultNode.setProperty("href", href);

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/ae151767/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
new file mode 100644
index 0000000..86b0603
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/BaseResourceDefinitionTest.java
@@ -0,0 +1,72 @@
+package org.apache.ambari.server.api.resources;
+
+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.internal.ResourceImpl;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.List;
+
+/**
+ * BaseResourceDefinition tests.
+ */
+public class BaseResourceDefinitionTest {
+
+
+  @Test
+  public void testGetPostProcessors() {
+    BaseResourceDefinition resourceDefinition = getResourceDefinition();
+
+    List<ResourceDefinition.PostProcessor> postProcessors = resourceDefinition.getPostProcessors();
+
+    Assert.assertEquals(1, postProcessors.size());
+
+    ResourceDefinition.PostProcessor processor = postProcessors.iterator().next();
+
+    Resource service = new ResourceImpl(Resource.Type.Service);
+    service.setProperty("ServiceInfo/service_name", "Service1");
+
+    TreeNode<Resource> parentNode  = new TreeNodeImpl<Resource>(null, null, "services");
+    TreeNode<Resource> serviceNode = new TreeNodeImpl<Resource>(parentNode, service, "service1");
+
+    parentNode.setProperty("isCollection", "true");
+
+    processor.process(null, serviceNode, "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/services");
+
+    String href = serviceNode.getProperty("href");
+
+    Assert.assertEquals("http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/services/Service1", href);
+
+
+    Resource configGroup = new ResourceImpl(Resource.Type.ConfigGroup);
+    configGroup.setProperty("ConfigGroup/id", "2");
+
+    TreeNode<Resource> resourcesNode   = new TreeNodeImpl<Resource>(null, null, BaseManagementHandler.RESOURCES_NODE_NAME);
+    TreeNode<Resource> configGroupNode = new TreeNodeImpl<Resource>(resourcesNode, configGroup, "configGroup1");
+
+    resourcesNode.setProperty("isCollection", "true");
+
+    processor.process(null, configGroupNode, "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/config_groups");
+
+    href = configGroupNode.getProperty("href");
+
+    Assert.assertEquals("http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/config_groups/2", href);
+  }
+
+  private BaseResourceDefinition getResourceDefinition() {
+    return new BaseResourceDefinition(Resource.Type.Service) {
+      @Override
+      public String getPluralName() {
+        return "pluralName";
+      }
+
+      @Override
+      public String getSingularName() {
+        return "singularName";
+      }
+    };
+  }
+}


[2/3] AMBARI-2254 - Reduce number of requests when querying for subtasks

Posted by tb...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/fc427d9f/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
index ee9b51b..8e02394 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
@@ -1,5 +1,3 @@
-package org.apache.ambari.server.api.query;
-
 /**
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,627 +16,364 @@ package org.apache.ambari.server.api.query;
  * limitations under the License.
  */
 
+
+package org.apache.ambari.server.api.query;
+
+
 import org.apache.ambari.server.api.resources.ResourceDefinition;
-import org.apache.ambari.server.api.util.TreeNode;
-import org.apache.ambari.server.api.util.TreeNodeImpl;
-import org.apache.ambari.server.controller.predicate.AndPredicate;
-import org.apache.ambari.server.controller.spi.*;
-import org.apache.ambari.server.controller.utilities.PredicateBuilder;
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.resources.SubResourceDefinition;
 import org.apache.ambari.server.api.services.Result;
-import org.apache.ambari.server.controller.utilities.PropertyHelper;
-import org.junit.After;
+import org.apache.ambari.server.api.util.TreeNode;
+import org.apache.ambari.server.controller.internal.ClusterControllerImpl;
+import org.apache.ambari.server.controller.internal.ClusterControllerImplTest;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PredicateBuilder;
+import org.junit.Assert;
 import org.junit.Test;
 
-import java.util.*;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 
 import static org.easymock.EasyMock.*;
-
-import static org.easymock.EasyMock.eq;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 
-//todo: add assertions for temporal info
+/**
+ * QueryImpl unit tests.
+ */
 public class QueryImplTest {
 
-  ClusterController m_controller = createNiceMock(ClusterController.class);
-
   @Test
-  public void testExecute__Component_instance_noSpecifiedProps() throws Exception {
-    Result result = createNiceMock(Result.class);
-    ResourceInstance componentResourceInstance = createNiceMock(ResourceInstance.class);
-    ResourceDefinition componentResourceDefinition = createNiceMock(ResourceDefinition.class);
-    ResourceInstance hostResourceInstance = createNiceMock(ResourceInstance.class);
-    ResourceDefinition hostResourceDefinition = createNiceMock(ResourceDefinition.class);
-    Schema componentSchema = createNiceMock(Schema.class);
-    Resource componentResource = createNiceMock(Resource.class);
-    String componentPropertyId = "componentId";
-    QueryImpl hostComponentQuery = createStrictMock(QueryImpl.class);
-
-    TreeNode<Resource> tree = new TreeNodeImpl<Resource>(null, null, null);
-    Set<Resource> listResources = Collections.singleton(componentResource);
-
-    Map<Resource.Type, String> mapResourceIds = new HashMap<Resource.Type, String>();
-    mapResourceIds.put(Resource.Type.Cluster, "clusterName");
-    mapResourceIds.put(Resource.Type.Service, "serviceName");
-    mapResourceIds.put(Resource.Type.Component, "componentName");
-
-    Map<String, ResourceInstance> mapChildren = new HashMap<String, ResourceInstance>();
-    mapChildren.put("host_components", hostResourceInstance);
+  public void testIsCollection__True() {
+    ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
 
-    PredicateBuilder pb = new PredicateBuilder();
-    Predicate predicate = pb.property("clusterId").equals("clusterName").and().
-        property("serviceId").equals("serviceName").and().
-        property("componentId").equals("componentName").toPredicate();
+    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+    mapIds.put(Resource.Type.Cluster, "cluster");
+    mapIds.put(Resource.Type.Service, null);
 
     // expectations
-    expect(componentResourceInstance.getResourceDefinition()).andReturn(componentResourceDefinition).anyTimes();
-    expect(componentResourceInstance.getSubResources()).andReturn(mapChildren).anyTimes();
-    expect(componentResourceInstance.getIds()).andReturn(mapResourceIds).anyTimes();
-
-    expect(hostResourceInstance.createCopy()).andReturn(hostResourceInstance).anyTimes();
-
-    expect(componentResourceDefinition.getType()).andReturn(Resource.Type.Component).anyTimes();
-
-    expect(componentResource.getType()).andReturn(Resource.Type.Component).anyTimes();
-    expect(componentResource.getPropertyValue(componentPropertyId)).andReturn("keyVal");
-
-    expect(m_controller.getSchema(Resource.Type.Component)).andReturn(componentSchema).anyTimes();
-
-    expect(componentSchema.getKeyPropertyId(Resource.Type.Cluster)).andReturn("clusterId");
-    expect(componentSchema.getKeyPropertyId(Resource.Type.Service)).andReturn("serviceId");
-    expect(componentSchema.getKeyPropertyId(Resource.Type.Component)).andReturn(componentPropertyId).atLeastOnce();
-
-    expect(m_controller.getRawResources(eq(Resource.Type.Component), eq(PropertyHelper.getReadRequest(Collections.<String>emptySet())),
-        eq(predicate))).andReturn(listResources);
-
-    expect(m_controller.getResources(eq(Resource.Type.Component), eq(listResources), eq(predicate))).andReturn(
-        listResources);
-
-    expect(result.getResultTree()).andReturn(tree).anyTimes();
-
-    Map<Resource.Type, String> mapResourceIdsSet = new HashMap<Resource.Type, String>(mapResourceIds);
-    mapResourceIdsSet.put(Resource.Type.Component, "keyVal");
-    hostResourceInstance.setIds(mapResourceIdsSet);
-    expect(hostResourceInstance.getResourceDefinition()).andReturn(hostResourceDefinition).anyTimes();
-    expect(hostResourceInstance.getQuery()).andReturn(hostComponentQuery).anyTimes();
-
-    expect(hostResourceDefinition.getType()).andReturn(Resource.Type.Host);
-
-//    expect(hostComponentQuery.getResourceInstance()).andReturn(hostResourceInstance);
-    expect(hostComponentQuery.getResourceType()).andReturn(Resource.Type.Host);
-    expect(hostComponentQuery.getPredicate()).andReturn(predicate);
-    expect(hostComponentQuery.createRequest()).andReturn(PropertyHelper.getReadRequest(Collections.<String>emptySet()));
-    expect(hostComponentQuery.getProviderResources()).andReturn(Collections.<Resource>emptySet());
-    expect(hostComponentQuery.getSubQueries()).andReturn(Collections.<QueryImpl, Resource>emptyMap());
-    expect(hostComponentQuery.getResourceIterable()).andReturn(Collections.<Resource>emptySet());
-    expect(hostComponentQuery.getResultName()).andReturn("host_components");
-
-
-    replay(m_controller, result, componentResourceInstance, componentResourceDefinition, hostResourceInstance, componentSchema, componentResource,
-        hostComponentQuery);
+    expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
+    expect(resourceDefinition.getSubResourceDefinitions()).andReturn(Collections.<SubResourceDefinition>emptySet()).anyTimes();
 
-    QueryImpl query = new TestQuery(componentResourceInstance, result);
-    query.execute();
+    replay(resourceDefinition);
 
-    verify(m_controller, result, componentResourceInstance, componentResourceDefinition, hostResourceInstance, componentSchema, componentResource,
-        hostComponentQuery);
+    //test
+    ResourceInstance instance = new TestQuery(mapIds, resourceDefinition);
+    assertTrue(instance.isCollectionResource());
 
-    assertEquals(1, tree.getChildren().size());
-    TreeNode<Resource> componentNode = tree.getChild("Component:1");
-    assertEquals("Component:1", componentNode.getName());
-    assertEquals(componentResource, componentNode.getObject());
-    assertEquals(1, componentNode.getChildren().size());
-    assertEquals("false", componentNode.getChild("host_components").getProperty("isCollection"));
+    verify(resourceDefinition);
   }
 
   @Test
-  public void testExecute__Component_collection_noSpecifiedProps() throws Exception {
-    Result result = createNiceMock(Result.class);
-    ResourceInstance componentResourceInstance = createNiceMock(ResourceInstance.class);
-    ResourceDefinition componentResourceDefinition = createNiceMock(ResourceDefinition.class);
-    Schema componentSchema = createNiceMock(Schema.class);
-    Resource componentResource = createNiceMock(Resource.class);
-    String componentPropertyId = "componentId";
-    String servicePropertyId = "serviceId";
-    String clusterPropertyId = "clusterId";
-
-    Set<String> setPropertyIds = new HashSet<String>();
-    setPropertyIds.add(clusterPropertyId);
-    setPropertyIds.add(servicePropertyId);
-    setPropertyIds.add(componentPropertyId);
-
-    TreeNode<Resource> tree = new TreeNodeImpl<Resource>(null, null, null);
-    Set<Resource> resourceSet = Collections.singleton(componentResource);
-
-    Map<Resource.Type, String> mapResourceIds = new HashMap<Resource.Type, String>();
-    mapResourceIds.put(Resource.Type.Cluster, "clusterName");
-    mapResourceIds.put(Resource.Type.Service, "serviceName");
-    mapResourceIds.put(Resource.Type.Component, null);
+  public void testIsCollection__False() {
+    ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
 
-    PredicateBuilder pb = new PredicateBuilder();
-    Predicate predicate = pb.property("clusterId").equals("clusterName").and().
-        property("serviceId").equals("serviceName").toPredicate();
+    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+    mapIds.put(Resource.Type.Cluster, "cluster");
+    mapIds.put(Resource.Type.Service, "service");
 
     // expectations
-    expect(componentResource.getType()).andReturn(Resource.Type.Component).anyTimes();
-
-    expect(componentResourceInstance.getIds()).andReturn(mapResourceIds).anyTimes();
-    expect(componentResourceInstance.getResourceDefinition()).andReturn(componentResourceDefinition).anyTimes();
-
-    expect(componentResourceDefinition.getType()).andReturn(Resource.Type.Component).anyTimes();
-
-    expect(m_controller.getSchema(Resource.Type.Component)).andReturn(componentSchema).anyTimes();
-
-    expect(componentSchema.getKeyPropertyId(Resource.Type.Component)).andReturn(componentPropertyId).anyTimes();
-    expect(componentSchema.getKeyPropertyId(Resource.Type.Cluster)).andReturn("clusterId").anyTimes();
-    expect(componentSchema.getKeyPropertyId(Resource.Type.Service)).andReturn("serviceId").anyTimes();
-
-    expect(result.getResultTree()).andReturn(tree).anyTimes();
-
-
-    expect(m_controller.getRawResources(eq(Resource.Type.Component), eq(PropertyHelper.getReadRequest(setPropertyIds)),
-        eq(predicate))).andReturn(resourceSet);
-
-    expect(m_controller.getResources(eq(Resource.Type.Component), eq(resourceSet), eq(predicate))).andReturn(
-        resourceSet);
-
-    expect(componentResourceInstance.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
-
-    replay(m_controller, result,componentResourceInstance, componentResourceDefinition, componentSchema, componentResource);
+    expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
+    expect(resourceDefinition.getSubResourceDefinitions()).andReturn(Collections.<SubResourceDefinition>emptySet()).anyTimes();
 
-    QueryImpl query = new TestQuery(componentResourceInstance, result);
-    query.execute();
+    replay(resourceDefinition);
 
-    verify(m_controller, result, componentResourceInstance, componentResourceDefinition, componentSchema, componentResource);
+    //test
+    ResourceInstance instance = new TestQuery(mapIds, resourceDefinition);
+    assertFalse(instance.isCollectionResource());
 
-    assertEquals("true", tree.getProperty("isCollection"));
-    assertEquals(1, tree.getChildren().size());
-    TreeNode<Resource> componentNode = tree.getChild("Component:1");
-    assertSame(componentResource, componentNode.getObject());
-    assertEquals(0, componentNode.getChildren().size());
+    verify(resourceDefinition);
   }
 
   @Test
-  public void testExecute__collection_nullInternalPredicate_nullUserPredicate() throws Exception {
-    Result result = createNiceMock(Result.class);
-    ResourceInstance clusterResourceInstance = createNiceMock(ResourceInstance.class);
-    ResourceDefinition clusterResourceDefinition = createNiceMock(ResourceDefinition.class);
-    Schema clusterSchema = createNiceMock(Schema.class);
-    Resource clusterResource = createNiceMock(Resource.class);
-    String clusterPropertyId = "clusterId";
-
-    TreeNode<Resource> tree = new TreeNodeImpl<Resource>(null, null, null);
-    Set<Resource> resourceSet = Collections.singleton(clusterResource);
+  public void testExecute__Cluster_instance_noSpecifiedProps() throws Exception {
+    ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
 
-    Map<Resource.Type, String> mapResourceIds = new HashMap<Resource.Type, String>();
+    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+    mapIds.put(Resource.Type.Cluster, "cluster");
 
     // expectations
-    expect(clusterResource.getType()).andReturn(Resource.Type.Cluster).anyTimes();
-
-    expect(clusterResourceInstance.getIds()).andReturn(mapResourceIds).anyTimes();
-    expect(clusterResourceInstance.getResourceDefinition()).andReturn(clusterResourceDefinition).anyTimes();
-
-    expect(clusterResourceDefinition.getType()).andReturn(Resource.Type.Component).anyTimes();
-
-    expect(m_controller.getSchema(Resource.Type.Component)).andReturn(clusterSchema).atLeastOnce();
-
-    expect(clusterSchema.getKeyPropertyId(Resource.Type.Component)).andReturn(clusterPropertyId).atLeastOnce();
+    expect(resourceDefinition.getType()).andReturn(Resource.Type.Cluster).anyTimes();
+    Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
+    setChildren.add(new SubResourceDefinition(Resource.Type.Host));
 
-    expect(result.getResultTree()).andReturn(tree).atLeastOnce();
+    expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes();
 
-    expect(m_controller.getRawResources(eq(Resource.Type.Component), eq(PropertyHelper.getReadRequest(Collections.singleton(clusterPropertyId))),
-        isNull(Predicate.class))).andReturn(resourceSet);
+    replay(resourceDefinition);
 
-    expect(m_controller.getResources(eq(Resource.Type.Component), eq(resourceSet), isNull(Predicate.class))).andReturn(
-        resourceSet);
+    //test
+    QueryImpl instance = new TestQuery(mapIds, resourceDefinition);
 
+    Result result = instance.execute();
 
-    expect(clusterResourceInstance.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
+    verify(resourceDefinition);
 
-    replay(m_controller, result, clusterResourceInstance, clusterResourceDefinition, clusterSchema, clusterResource);
+    TreeNode<Resource> tree = result.getResultTree();
 
-    QueryImpl query = new TestQuery(clusterResourceInstance, result);
-    query.execute();
-
-    verify(m_controller, result, clusterResourceInstance, clusterResourceDefinition, clusterSchema, clusterResource);
-
-    assertEquals("true", tree.getProperty("isCollection"));
-    assertEquals(1, tree.getChildren().size());
+    Assert.assertEquals(1, tree.getChildren().size());
     TreeNode<Resource> clusterNode = tree.getChild("Cluster:1");
-    assertSame(clusterResource, clusterNode.getObject());
-    assertEquals(0, clusterNode.getChildren().size());
-
+    Assert.assertEquals("Cluster:1", clusterNode.getName());
+    Assert.assertEquals(Resource.Type.Cluster, clusterNode.getObject().getType());
+    Assert.assertEquals(1, clusterNode.getChildren().size());
+    TreeNode<Resource> hostNode = clusterNode.getChild("hosts");
+    Assert.assertEquals(4, hostNode.getChildren().size());
   }
 
   @Test
-  public void testExecute__collection_nullInternalPredicate_nonNullUserPredicate() throws Exception {
-    Result result = createNiceMock(Result.class);
-    ResourceInstance clusterResourceInstance = createNiceMock(ResourceInstance.class);
-    ResourceDefinition clusterResourceDefinition = createNiceMock(ResourceDefinition.class);
-    Schema clusterSchema = createNiceMock(Schema.class);
-    Resource clusterResource = createNiceMock(Resource.class);
-    String clusterPropertyId = "clusterId";
-    Predicate userPredicate = createNiceMock(Predicate.class);
-
-    TreeNode<Resource> tree = new TreeNodeImpl<Resource>(null, null, null);
-    Set<Resource> resourceSet = Collections.singleton(clusterResource);
+  public void testExecute__Host_collection_noSpecifiedProps() throws Exception {
+    ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
 
-    Map<Resource.Type, String> mapResourceIds = new HashMap<Resource.Type, String>();
+    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
 
     // expectations
-    expect(clusterResource.getType()).andReturn(Resource.Type.Cluster).anyTimes();
-
-    expect(clusterResourceInstance.getIds()).andReturn(mapResourceIds).anyTimes();
-    expect(clusterResourceInstance.getResourceDefinition()).andReturn(clusterResourceDefinition).anyTimes();
-
-    expect(clusterResourceDefinition.getType()).andReturn(Resource.Type.Component).atLeastOnce();
+    expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes();
+    Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
 
-    expect(m_controller.getSchema(Resource.Type.Component)).andReturn(clusterSchema).anyTimes();
-    expect(clusterSchema.getKeyPropertyId(Resource.Type.Component)).andReturn(clusterPropertyId).anyTimes();
+    expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes();
 
-    expect(result.getResultTree()).andReturn(tree).anyTimes();
+    replay(resourceDefinition);
 
-//    expect(m_controller.getResources(eq(Resource.Type.Component), eq(PropertyHelper.getReadRequest(Collections.singleton(clusterPropertyId))),
-//        eq(userPredicate))).andReturn(resourceSet);
+    //test
+    QueryImpl instance = new TestQuery(mapIds, resourceDefinition);
 
-    expect(m_controller.getRawResources(eq(Resource.Type.Component), eq(PropertyHelper.getReadRequest(Collections.singleton(clusterPropertyId))),
-        eq(userPredicate))).andReturn(resourceSet);
+    Result result = instance.execute();
 
-    expect(m_controller.getResources(eq(Resource.Type.Component), eq(resourceSet), eq(userPredicate))).andReturn(
-        resourceSet);
+    verify(resourceDefinition);
 
-    expect(clusterResourceInstance.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
+    TreeNode<Resource> tree = result.getResultTree();
 
-    replay(m_controller, result,clusterResourceInstance, clusterResourceDefinition, clusterSchema, clusterResource, userPredicate);
+    Assert.assertEquals(4, tree.getChildren().size());
+    TreeNode<Resource> hostNode = tree.getChild("Host:1");
+    Assert.assertEquals("Host:1", hostNode.getName());
+    Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
 
-    QueryImpl query = new TestQuery(clusterResourceInstance, result);
-    query.setUserPredicate(userPredicate);
-    query.execute();
+    hostNode = tree.getChild("Host:2");
+    Assert.assertEquals("Host:2", hostNode.getName());
+    Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
 
-    verify(m_controller, result, clusterResourceInstance, clusterResourceDefinition, clusterSchema, clusterResource, userPredicate);
+    hostNode = tree.getChild("Host:3");
+    Assert.assertEquals("Host:3", hostNode.getName());
+    Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
 
-    assertEquals("true", tree.getProperty("isCollection"));
-    assertEquals(1, tree.getChildren().size());
-    TreeNode<Resource> clusterNode = tree.getChild("Cluster:1");
-    assertSame(clusterResource, clusterNode.getObject());
-    assertEquals(0, clusterNode.getChildren().size());
+    hostNode = tree.getChild("Host:4");
+    Assert.assertEquals("Host:4", hostNode.getName());
+    Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
   }
 
   @Test
-  public void testExecute__collection_nonNullInternalPredicate_nonNullUserPredicate() throws Exception {
-    Result result = createNiceMock(Result.class);
-    ResourceInstance componentResourceInstance = createNiceMock(ResourceInstance.class);
-    ResourceDefinition componentResourceDefinition = createNiceMock(ResourceDefinition.class);
-    Schema componentSchema = createNiceMock(Schema.class);
-    Resource componentResource = createNiceMock(Resource.class);
-    String componentPropertyId = "componentId";
-    String servicePropertyId = "serviceId";
-    String clusterPropertyId = "clusterId";
-
-    Set<String> setPropertyIds = new HashSet<String>();
-    setPropertyIds.add(clusterPropertyId);
-    setPropertyIds.add(servicePropertyId);
-    setPropertyIds.add(componentPropertyId);
-
-    TreeNode<Resource> tree = new TreeNodeImpl<Resource>(null, null, null);
-    Set<Resource> resourceSet = Collections.singleton(componentResource);
-
-    Map<Resource.Type, String> mapResourceIds = new HashMap<Resource.Type, String>();
-    mapResourceIds.put(Resource.Type.Cluster, "clusterName");
-    mapResourceIds.put(Resource.Type.Service, "serviceName");
-    mapResourceIds.put(Resource.Type.Component, null);
-
-    PredicateBuilder pb = new PredicateBuilder();
-    Predicate internalPredicate = pb.property("clusterId").equals("clusterName").and().
-        property("serviceId").equals("serviceName").toPredicate();
+  public void testExecute__collection_nullInternalPredicate_nullUserPredicate() throws Exception {
+    ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
 
-    pb = new PredicateBuilder();
-    Predicate userPredicate = pb.property("foo").equals("bar").toPredicate();
-    // combine internal predicate and user predicate
-    //todo: for now, need to cast to BasePredicate
-    Predicate predicate = new AndPredicate(internalPredicate, userPredicate);
+    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
 
     // expectations
-    expect(componentResource.getType()).andReturn(Resource.Type.Component).anyTimes();
-
-    expect(componentResourceInstance.getIds()).andReturn(mapResourceIds).anyTimes();
-    expect(componentResourceInstance.getResourceDefinition()).andReturn(componentResourceDefinition).anyTimes();
-
-    expect(componentResourceDefinition.getType()).andReturn(Resource.Type.Component).anyTimes();
+    expect(resourceDefinition.getType()).andReturn(Resource.Type.Cluster).anyTimes();
+    Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
+    setChildren.add(new SubResourceDefinition(Resource.Type.Host));
 
-    expect(m_controller.getSchema(Resource.Type.Component)).andReturn(componentSchema).anyTimes();
-    expect(componentSchema.getKeyPropertyId(Resource.Type.Component)).andReturn(componentPropertyId).atLeastOnce();
-    expect(componentSchema.getKeyPropertyId(Resource.Type.Cluster)).andReturn("clusterId").anyTimes();
-    expect(componentSchema.getKeyPropertyId(Resource.Type.Service)).andReturn("serviceId").anyTimes();
+    expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes();
 
-    expect(result.getResultTree()).andReturn(tree).anyTimes();
+    replay(resourceDefinition);
 
-//    expect(m_controller.getResources(eq(Resource.Type.Component), eq(PropertyHelper.getReadRequest(setPropertyIds)),
-//        eq(predicate))).andReturn(resourceSet);
+    //test
+    QueryImpl instance = new TestQuery(mapIds, resourceDefinition);
 
-    expect(m_controller.getRawResources(eq(Resource.Type.Component), eq(PropertyHelper.getReadRequest(setPropertyIds)),
-        eq(predicate))).andReturn(resourceSet);
+    Result result = instance.execute();
 
-    expect(m_controller.getResources(eq(Resource.Type.Component), eq(resourceSet), eq(predicate))).andReturn(
-        resourceSet);
+    verify(resourceDefinition);
 
-    expect(componentResourceInstance.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
+    TreeNode<Resource> tree = result.getResultTree();
 
-    replay(m_controller, result, componentResourceInstance, componentResourceDefinition, componentSchema, componentResource);
-
-    QueryImpl query = new TestQuery(componentResourceInstance, result);
-    query.setUserPredicate(userPredicate);
-    query.execute();
-
-    verify(m_controller, result, componentResourceInstance, componentResourceDefinition, componentSchema, componentResource);
-
-    assertEquals("true", tree.getProperty("isCollection"));
-    assertEquals(1, tree.getChildren().size());
-    TreeNode<Resource> componentNode = tree.getChild("Component:1");
-    assertSame(componentResource, componentNode.getObject());
-    assertEquals(0, componentNode.getChildren().size());
+    Assert.assertEquals(1, tree.getChildren().size());
+    TreeNode<Resource> clusterNode = tree.getChild("Cluster:1");
+    Assert.assertEquals("Cluster:1", clusterNode.getName());
+    Assert.assertEquals(Resource.Type.Cluster, clusterNode.getObject().getType());
+    Assert.assertEquals(0, clusterNode.getChildren().size());
   }
 
   @Test
-  public void testAddProperty__localProperty() throws Exception {
-    ResourceInstance resource = createNiceMock(ResourceInstance.class);
+  public void testExecute__collection_nullInternalPredicate_nonNullUserPredicate() throws Exception {
     ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
-    Schema schema = createNiceMock(Schema.class);
-
-    //expectations
-    expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
-    expect(resource.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
-
-    expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
 
-    expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
+    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+    mapIds.put(Resource.Type.Cluster, "cluster");
 
-    replay(m_controller, resource, resourceDefinition, schema);
-
-    Query query = new TestQuery(resource, null);
-    query.addProperty("category", "property", null);
-
-    assertEquals(1, query.getProperties().size());
-    assertTrue(query.getProperties().contains("category/property"));
-
-    query.addProperty(null, "property2", null);
-
-    assertEquals(2, query.getProperties().size());
-    assertTrue(query.getProperties().contains("property2"));
+    // expectations
+    expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes();
+    Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
 
-    verify(m_controller, resource, resourceDefinition, schema);
-  }
+    expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes();
 
-  @Test
-  public void testAddProperty__allProperties() throws Exception {
-    ResourceInstance resource = createNiceMock(ResourceInstance.class);
-    ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
-    Schema schema = createNiceMock(Schema.class);
+    replay(resourceDefinition);
 
-    //expectations
-    expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
-    expect(resource.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
+    //test
+    QueryImpl instance = new TestQuery(mapIds, resourceDefinition);
 
-    expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
+    PredicateBuilder pb = new PredicateBuilder();
+    Predicate predicate = pb.property("Hosts/host_name").equals("host:2").toPredicate();
 
-    expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
+    instance.setUserPredicate(predicate);
 
-    replay(m_controller, resource, resourceDefinition, schema);
+    Result result = instance.execute();
 
-    Query query = new TestQuery(resource, null);
-    query.addProperty(null, "*", null);
+    verify(resourceDefinition);
 
-    assertEquals(0, query.getProperties().size());
+    TreeNode<Resource> tree = result.getResultTree();
 
-    verify(m_controller, resource, resourceDefinition, schema);
+    Assert.assertEquals(1, tree.getChildren().size());
+    TreeNode<Resource> hostNode = tree.getChild("Host:1");
+    Assert.assertEquals("Host:1", hostNode.getName());
+    Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
+    Assert.assertEquals("host:2", hostNode.getObject().getPropertyValue("Hosts/host_name"));
   }
 
   @Test
-  public void testAddProperty__allCategoryProperties() throws Exception {
-    ResourceInstance resource = createNiceMock(ResourceInstance.class);
+  public void testExecute__collection_nonNullInternalPredicate_nonNullUserPredicate() throws Exception {
     ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
-    Schema schema = createNiceMock(Schema.class);
-
-    //expectations
-    expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
-    expect(resource.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
-
-    expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
-
-    expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
 
-    replay(m_controller, resource, resourceDefinition, schema);
+    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
 
-    Query query = new TestQuery(resource, null);
-    query.addProperty("category", "*", null);
-
-    assertEquals(1, query.getProperties().size());
-    assertTrue(query.getProperties().contains("category"));
+    // expectations
+    expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes();
+    Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
 
-    verify(m_controller, resource, resourceDefinition, schema);
-  }
+    expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes();
 
-  // this is the case where service can't differentiate category and property name
-  // the category name is give as the property name
-  @Test
-  public void testAddProperty__localCategory_asPropertyName() throws Exception  {
-    ResourceInstance resource = createNiceMock(ResourceInstance.class);
-    ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
-    Schema schema = createNiceMock(Schema.class);
+    replay(resourceDefinition);
 
-    //expectations
-    expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
+    //test
+    QueryImpl instance = new TestQuery(mapIds, resourceDefinition);
 
-    expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
+    PredicateBuilder pb = new PredicateBuilder();
+    Predicate predicate = pb.property("Hosts/host_name").equals("host:2").toPredicate();
 
-    expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
-    expect(resource.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
+    instance.setUserPredicate(predicate);
 
-    replay(m_controller, resource, resourceDefinition, schema);
+    Result result = instance.execute();
 
-    Query query = new TestQuery(resource, null);
-    query.addProperty(null, "category", null);
+    verify(resourceDefinition);
 
-    Set<String> setProperties = query.getProperties();
-    assertEquals(1, setProperties.size());
-    assertTrue(setProperties.contains("category"));
+    TreeNode<Resource> tree = result.getResultTree();
 
-    verify(m_controller, resource, resourceDefinition, schema);
+    Assert.assertEquals(1, tree.getChildren().size());
+    TreeNode<Resource> hostNode = tree.getChild("Host:1");
+    Assert.assertEquals("Host:1", hostNode.getName());
+    Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
+    Assert.assertEquals("host:2", hostNode.getObject().getPropertyValue("Hosts/host_name"));
   }
 
-  // This is the case where the service can determine that only a category was provided because it contained
-  // a trailing '/'
   @Test
-  public void testAddProperty__localCategory_categoryNameOnly() throws Exception {
-    ResourceInstance resource = createNiceMock(ResourceInstance.class);
+  public void testAddProperty__localProperty() throws Exception {
     ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
-    Schema schema = createNiceMock(Schema.class);
 
-    //expectations
-    expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
+    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
 
-    expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
+    // expectations
+    expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes();
+    Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
 
-    expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
-    expect(resource.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
+    expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes();
 
-    replay(m_controller, resource, resourceDefinition, schema);
+    replay(resourceDefinition);
 
-    Query query = new TestQuery(resource, null);
-    query.addProperty("category/", "", null);
+    //test
+    QueryImpl instance = new TestQuery(mapIds, resourceDefinition);
 
-    Set<String> setProperties = query.getProperties();
-    assertEquals(1, setProperties.size());
-    assertTrue(setProperties.contains("category"));
+    instance.addLocalProperty("c1/p1");
 
-    verify(m_controller, resource, resourceDefinition, schema);
-  }
-
-  @Test
-  public void testAddProperty__localSubCategory() throws Exception {
-    ResourceInstance resource = createNiceMock(ResourceInstance.class);
-    ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
-    Schema schema = createNiceMock(Schema.class);
-
-    //expectations
-    expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
-
-    expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
+    Result result = instance.execute();
 
-    expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
+    verify(resourceDefinition);
 
-    expect(resource.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
+    TreeNode<Resource> tree = result.getResultTree();
 
-    replay(m_controller, resource, resourceDefinition, schema);
+    Assert.assertEquals(4, tree.getChildren().size());
+    TreeNode<Resource> hostNode = tree.getChild("Host:1");
+    Assert.assertEquals("Host:1", hostNode.getName());
+    Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1"));
 
-    Query query = new TestQuery(resource, null);
-    query.addProperty("category", "nestedCategory", null);
+    hostNode = tree.getChild("Host:2");
+    Assert.assertEquals("Host:2", hostNode.getName());
+    Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1"));
 
-    Set<String> setProperties = query.getProperties();
-    assertEquals(1, setProperties.size());
-    assertTrue(setProperties.contains("category/nestedCategory"));
+    hostNode = tree.getChild("Host:3");
+    Assert.assertEquals("Host:3", hostNode.getName());
+    Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1"));
 
-    verify(m_controller, resource, resourceDefinition, schema);
+    hostNode = tree.getChild("Host:4");
+    Assert.assertEquals("Host:4", hostNode.getName());
+    Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1"));
   }
 
   @Test
-  public void testAddProperty__localCategorySubPropsOnly() throws Exception {
-    ResourceInstance resource = createNiceMock(ResourceInstance.class);
+  public void testAddProperty__allCategoryProperties() throws Exception {
     ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
-    Schema schema = createNiceMock(Schema.class);
-
-    //expectations
-    expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
-
-    expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
 
-    expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
-    expect(resource.getSubResources()).andReturn(Collections.<String, ResourceInstance>emptyMap()).anyTimes();
+    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
 
-    replay(m_controller, resource, resourceDefinition, schema);
-
-    Query query = new TestQuery(resource, null);
-    query.addProperty(null, "category", null);
-
-    Set<String> setProperties = query.getProperties();
-    assertEquals(1, setProperties.size());
-    assertTrue(setProperties.contains("category"));
-
-    verify(m_controller, resource, resourceDefinition, schema);
-  }
-
-  @Test
-  public void testAddProperty__subProperty() throws Exception {
-    ResourceInstance resource = createNiceMock(ResourceInstance.class);
-    ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
-    ResourceInstance subResource = createNiceMock(ResourceInstance.class);
-    Schema schema = createNiceMock(Schema.class);
+    // expectations
+    expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes();
+    Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
 
-    Map<Resource.Type, String> mapResourceIds = new HashMap<Resource.Type, String>();
-    mapResourceIds.put(Resource.Type.Service, "serviceName");
-    mapResourceIds.put(Resource.Type.Component, "componentName");
+    expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes();
 
-    //expectations
-    expect(resource.getResourceDefinition()).andReturn(resourceDefinition).anyTimes();
+    replay(resourceDefinition);
 
-    expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
+    //test
+    QueryImpl instance = new TestQuery(mapIds, resourceDefinition);
 
-    expect(m_controller.getSchema(Resource.Type.Service)).andReturn(schema).anyTimes();
+    instance.addLocalProperty("c1");
 
-    expect(schema.getKeyPropertyId(Resource.Type.Service)).andReturn("serviceName").anyTimes();
-    expect(schema.getKeyPropertyId(Resource.Type.Component)).andReturn("componentName").anyTimes();
+    Result result = instance.execute();
 
-    expect(resource.getSubResources()).andReturn(Collections.singletonMap("components", subResource)).anyTimes();
-    expect(resource.getIds()).andReturn(mapResourceIds).anyTimes();
+    verify(resourceDefinition);
 
-    //todo: ensure that sub-resource was added.
+    TreeNode<Resource> tree = result.getResultTree();
 
-    replay(m_controller, resource, resourceDefinition, subResource, schema);
+    Assert.assertEquals(4, tree.getChildren().size());
+    TreeNode<Resource> hostNode = tree.getChild("Host:1");
+    Assert.assertEquals("Host:1", hostNode.getName());
+    Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1"));
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p2"));
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p3"));
 
-    Query query = new TestQuery(resource, null);
-    query.addProperty(null, "components", null);
+    hostNode = tree.getChild("Host:2");
+    Assert.assertEquals("Host:2", hostNode.getName());
+    Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1"));
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p2"));
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p3"));
 
-    // verify that only the key properties of the parent resource have been added to the query
-    Set<String> properties = query.getProperties();
-    assertEquals(2, properties.size());
-    assertTrue(properties.contains("serviceName"));
-    assertTrue(properties.contains("componentName"));
+    hostNode = tree.getChild("Host:3");
+    Assert.assertEquals("Host:3", hostNode.getName());
+    Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1"));
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p2"));
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p3"));
 
-    verify(m_controller, resource, resourceDefinition, subResource, schema);
+    hostNode = tree.getChild("Host:4");
+    Assert.assertEquals("Host:4", hostNode.getName());
+    Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p1"));
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p2"));
+    Assert.assertNotNull(hostNode.getObject().getPropertyValue("c1/p3"));
   }
 
-  //todo: sub-resource with property and with sub-path
-
-//  @Test
-//  public void testAddProperty__invalidProperty() {
-//
-//  }
-
   private class TestQuery extends QueryImpl {
-
-    private Result m_result;
-
-    public TestQuery(ResourceInstance ResourceInstance, Result result) {
-      super(ResourceInstance);
-      m_result = result;
-    }
-
-    @Override
-    ClusterController getClusterController() {
-      return m_controller;
-    }
-
-    @Override
-    Result createResult() {
-      return m_result;
+    public TestQuery(Map<Resource.Type, String> mapIds, ResourceDefinition resourceDefinition) {
+      super(mapIds, resourceDefinition, new ClusterControllerImpl(new ClusterControllerImplTest.TestProviderModule()));
     }
   }
-
-  @After
-  public void resetGlobalMocks() {
-    reset(m_controller);
-  }
 }
+

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/fc427d9f/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ResourceInstanceImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ResourceInstanceImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ResourceInstanceImplTest.java
deleted file mode 100644
index 4f729b2..0000000
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ResourceInstanceImplTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * 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.api.resources;
-
-
-import org.apache.ambari.server.controller.spi.Resource;
-import org.junit.Test;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-
-/**
- * ResourceInstanceImpl unit tests.
- */
-public class ResourceInstanceImplTest {
-  @Test
-  public void testIsCollection__True() {
-    ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
-
-    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
-    mapIds.put(Resource.Type.Cluster, "cluster");
-    mapIds.put(Resource.Type.Service, null);
-
-    // expectations
-    expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
-    expect(resourceDefinition.getSubResourceDefinitions()).andReturn(Collections.<SubResourceDefinition>emptySet()).anyTimes();
-
-    replay(resourceDefinition);
-
-    //test
-    ResourceInstance instance = new ResourceInstanceImpl(mapIds, resourceDefinition, null);
-    assertTrue(instance.isCollectionResource());
-
-    verify(resourceDefinition);
-  }
-
-  @Test
-  public void testIsCollection__False() {
-    ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
-
-    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
-    mapIds.put(Resource.Type.Cluster, "cluster");
-    mapIds.put(Resource.Type.Service, "service");
-
-    // expectations
-    expect(resourceDefinition.getType()).andReturn(Resource.Type.Service).anyTimes();
-    expect(resourceDefinition.getSubResourceDefinitions()).andReturn(Collections.<SubResourceDefinition>emptySet()).anyTimes();
-
-    replay(resourceDefinition);
-
-    //test
-    ResourceInstance instance = new ResourceInstanceImpl(mapIds, resourceDefinition, null);
-    assertFalse(instance.isCollectionResource());
-
-    verify(resourceDefinition);
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/fc427d9f/ambari-server/src/test/java/org/apache/ambari/server/controller/ganglia/GangliaPropertyProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/ganglia/GangliaPropertyProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/ganglia/GangliaPropertyProviderTest.java
index 467cb8b..5fd608f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/ganglia/GangliaPropertyProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/ganglia/GangliaPropertyProviderTest.java
@@ -544,8 +544,8 @@ public class GangliaPropertyProviderTest {
     Assert.assertEquals(1, propertyProvider.populateResources(Collections.singleton(resource), request, null).size());
 
     String expected = (configuration.isGangliaSSL() ? "https" : "http") +
-        "://domU-12-31-39-0E-34-E1.compute-1.internal/cgi-bin/rrd.py?c=HDPSlaves&h=ip-10-39-113-33.ec2.internal&e=now&pt=true";
-    Assert.assertEquals(expected, streamProvider.getLastSpec());
+        "://domU-12-31-39-0E-34-E1.compute-1.internal/cgi-bin/rrd.py?c=HDPSlaves&h=ip-10-39-113-33.ec2.internal&m=";
+    Assert.assertTrue(streamProvider.getLastSpec().startsWith(expected));
 
     Assert.assertEquals(33, PropertyHelper.getProperties(resource).size());
     Assert.assertNotNull(resource.getPropertyValue(FLUME_CHANNEL_CAPACITY_PROPERTY));

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/fc427d9f/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
index a90c940..c765dd7 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
@@ -99,6 +99,10 @@ public class ClusterControllerImplTest {
     resourceProviderProperties.add(PropertyHelper.getPropertyId("c1", "p2"));
     resourceProviderProperties.add(PropertyHelper.getPropertyId("c1", "p3"));
     resourceProviderProperties.add(PropertyHelper.getPropertyId("c2", "p4"));
+    // add the categories
+    resourceProviderProperties.add("Hosts");
+    resourceProviderProperties.add("c1");
+    resourceProviderProperties.add("c2");
   }
 
   @Test
@@ -112,7 +116,7 @@ public class ClusterControllerImplTest {
 
     Request request = PropertyHelper.getReadRequest(propertyIds);
 
-    Iterable<Resource> iterable = controller.getResources(Resource.Type.Host, request, null);
+    Iterable<Resource> iterable = controller.getResourceIterable(Resource.Type.Host, request, null);
 
     int cnt = 0;
     for (Resource resource : iterable) {
@@ -141,9 +145,9 @@ public class ClusterControllerImplTest {
       list.add(resource);
     }
     Assert.assertEquals(2, list.size());
-    Assert.assertEquals("host:1", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:0", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(0).getType());
-    Assert.assertEquals("host:2", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:1", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(1).getType());
 
     // get the first three
@@ -157,11 +161,11 @@ public class ClusterControllerImplTest {
       list.add(resource);
     }
     Assert.assertEquals(3, list.size());
-    Assert.assertEquals("host:1", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:0", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(0).getType());
-    Assert.assertEquals("host:2", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:1", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(1).getType());
-    Assert.assertEquals("host:3", (String) list.get(2).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:2", (String) list.get(2).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(2).getType());
   }
 
@@ -178,8 +182,8 @@ public class ClusterControllerImplTest {
     PageResponse pageResponse = controller.getResources(Resource.Type.Host, request, null, pageRequest);
 
     Assert.assertEquals(1, pageResponse.getOffset());
-    Assert.assertEquals("host:1", pageResponse.getPreviousResource().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
-    Assert.assertEquals("host:4", pageResponse.getNextResource().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:0", pageResponse.getPreviousResource().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:3", pageResponse.getNextResource().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
 
     Iterable<Resource> iterable = pageResponse.getIterable();
     List<Resource> list = new LinkedList<Resource>();
@@ -188,9 +192,9 @@ public class ClusterControllerImplTest {
       list.add(resource);
     }
     Assert.assertEquals(2, list.size());
-    Assert.assertEquals("host:2", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:1", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(0).getType());
-    Assert.assertEquals("host:3", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:2", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(1).getType());
 
     // get the last three (0 - 2)
@@ -199,7 +203,7 @@ public class ClusterControllerImplTest {
 
     Assert.assertEquals(0, pageResponse.getOffset());
     Assert.assertNull(pageResponse.getPreviousResource());
-    Assert.assertEquals("host:4", pageResponse.getNextResource().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:3", pageResponse.getNextResource().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
 
     iterable = pageResponse.getIterable();
     list = new LinkedList<Resource>();
@@ -208,11 +212,11 @@ public class ClusterControllerImplTest {
       list.add(resource);
     }
     Assert.assertEquals(3, list.size());
-    Assert.assertEquals("host:1", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:0", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(0).getType());
-    Assert.assertEquals("host:2", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:1", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(1).getType());
-    Assert.assertEquals("host:3", (String) list.get(2).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:2", (String) list.get(2).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(2).getType());
   }
 
@@ -235,9 +239,9 @@ public class ClusterControllerImplTest {
       list.add(resource);
     }
     Assert.assertEquals(2, list.size());
-    Assert.assertEquals("host:3", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:2", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(0).getType());
-    Assert.assertEquals("host:4", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:3", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(1).getType());
 
     // get the last three
@@ -251,11 +255,11 @@ public class ClusterControllerImplTest {
       list.add(resource);
     }
     Assert.assertEquals(3, list.size());
-    Assert.assertEquals("host:2", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:1", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(0).getType());
-    Assert.assertEquals("host:3", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:2", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(1).getType());
-    Assert.assertEquals("host:4", (String) list.get(2).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:3", (String) list.get(2).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(2).getType());
   }
 
@@ -272,8 +276,8 @@ public class ClusterControllerImplTest {
     PageResponse pageResponse = controller.getResources(Resource.Type.Host, request, null, pageRequest);
 
     Assert.assertEquals(1, pageResponse.getOffset());
-    Assert.assertEquals("host:1", pageResponse.getPreviousResource().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
-    Assert.assertEquals("host:4", pageResponse.getNextResource().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:0", pageResponse.getPreviousResource().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:3", pageResponse.getNextResource().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
 
     Iterable<Resource> iterable = pageResponse.getIterable();
     List<Resource> list = new LinkedList<Resource>();
@@ -282,9 +286,9 @@ public class ClusterControllerImplTest {
       list.add(resource);
     }
     Assert.assertEquals(2, list.size());
-    Assert.assertEquals("host:2", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:1", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(0).getType());
-    Assert.assertEquals("host:3", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:2", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(1).getType());
 
     // get the last three (0 - 2)
@@ -293,7 +297,7 @@ public class ClusterControllerImplTest {
 
     Assert.assertEquals(0, pageResponse.getOffset());
     Assert.assertNull(pageResponse.getPreviousResource());
-    Assert.assertEquals("host:4", pageResponse.getNextResource().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:3", pageResponse.getNextResource().getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
 
     iterable = pageResponse.getIterable();
     list = new LinkedList<Resource>();
@@ -302,11 +306,11 @@ public class ClusterControllerImplTest {
       list.add(resource);
     }
     Assert.assertEquals(3, list.size());
-    Assert.assertEquals("host:1", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:0", (String) list.get(0).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(0).getType());
-    Assert.assertEquals("host:2", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:1", (String) list.get(1).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(1).getType());
-    Assert.assertEquals("host:3", (String) list.get(2).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
+    Assert.assertEquals("host:2", (String) list.get(2).getPropertyValue(PropertyHelper.getPropertyId("Hosts", "host_name")));
     Assert.assertEquals(Resource.Type.Host, list.get(2).getType());
   }
 
@@ -318,7 +322,7 @@ public class ClusterControllerImplTest {
 
     Request request = PropertyHelper.getReadRequest(propertyIds);
 
-    Iterable<Resource> iterable = controller.getResources(Resource.Type.Host, request, null);
+    Iterable<Resource> iterable = controller.getResourceIterable(Resource.Type.Host, request, null);
 
     int cnt = 0;
     for (Resource resource : iterable) {
@@ -336,7 +340,7 @@ public class ClusterControllerImplTest {
 
     Request request = PropertyHelper.getReadRequest(propertyIds);
 
-    Iterable<Resource> iterable = controller.getResources(Resource.Type.Host, request, null);
+    Iterable<Resource> iterable = controller.getResourceIterable(Resource.Type.Host, request, null);
 
     String lastHostName = null;
     int cnt = 0;
@@ -369,7 +373,7 @@ public class ClusterControllerImplTest {
 
     Predicate predicate = new PredicateBuilder().property("c1/p2").equals(1).toPredicate();
 
-    Iterable<Resource> iterable = controller.getResources(Resource.Type.Host, request, predicate);
+    Iterable<Resource> iterable = controller.getResourceIterable(Resource.Type.Host, request, predicate);
 
     int cnt = 0;
     for (Resource resource : iterable) {
@@ -395,7 +399,7 @@ public class ClusterControllerImplTest {
     Predicate predicate = new PredicateBuilder().property(UNSUPPORTED_PROPERTY).equals(1).toPredicate();
 
     try {
-      controller.getResources(Resource.Type.Host, request, predicate);
+      controller.getResourceIterable(Resource.Type.Host, request, predicate);
       Assert.fail("Expected an UnsupportedPropertyException for the unsupported properties.");
     } catch (UnsupportedPropertyException e) {
       // Expected
@@ -418,7 +422,7 @@ public class ClusterControllerImplTest {
     Predicate predicate = new PredicateBuilder().property("c1/p2").equals(1).toPredicate();
 
     try {
-      controller.getResources(Resource.Type.Host, request, predicate);
+      controller.getResourceIterable(Resource.Type.Host, request, predicate);
       Assert.fail("Expected an UnsupportedPropertyException for the unsupported properties.");
     } catch (UnsupportedPropertyException e) {
       // Expected
@@ -428,7 +432,7 @@ public class ClusterControllerImplTest {
   @Test
   public void testCreateResources() throws Exception{
     TestProviderModule providerModule = new TestProviderModule();
-    TestResourceProvider resourceProvider = (TestResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
+    TestHostResourceProvider resourceProvider = (TestHostResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
     ClusterController controller = new ClusterControllerImpl(providerModule);
 
     Set<Map<String, Object>> properties = new HashSet<Map<String, Object>>();
@@ -443,7 +447,7 @@ public class ClusterControllerImplTest {
 
     controller.createResources(Resource.Type.Host, request);
 
-    Assert.assertEquals(TestResourceProvider.Action.Create, resourceProvider.getLastAction());
+    Assert.assertEquals(TestHostResourceProvider.Action.Create, resourceProvider.getLastAction());
     Assert.assertSame(request, resourceProvider.getLastRequest());
     Assert.assertNull(resourceProvider.getLastPredicate());
   }
@@ -474,7 +478,7 @@ public class ClusterControllerImplTest {
   @Test
   public void testUpdateResources() throws Exception{
     TestProviderModule providerModule = new TestProviderModule();
-    TestResourceProvider resourceProvider = (TestResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
+    TestHostResourceProvider resourceProvider = (TestHostResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
     ClusterController controller = new ClusterControllerImpl(providerModule);
 
     Map<String, Object> propertyMap = new HashMap<String, Object>();
@@ -488,7 +492,7 @@ public class ClusterControllerImplTest {
 
     controller.updateResources(Resource.Type.Host, request, predicate);
 
-    Assert.assertEquals(TestResourceProvider.Action.Update, resourceProvider.getLastAction());
+    Assert.assertEquals(TestHostResourceProvider.Action.Update, resourceProvider.getLastAction());
     Assert.assertSame(request, resourceProvider.getLastRequest());
     Assert.assertSame(predicate, resourceProvider.getLastPredicate());
   }
@@ -540,7 +544,7 @@ public class ClusterControllerImplTest {
   @Test
   public void testUpdateResourcesResolvePredicate() throws Exception{
     TestProviderModule providerModule = new TestProviderModule();
-    TestResourceProvider resourceProvider = (TestResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
+    TestHostResourceProvider resourceProvider = (TestHostResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
     ClusterController controller = new ClusterControllerImpl(providerModule);
 
     Map<String, Object> propertyMap = new HashMap<String, Object>();
@@ -554,7 +558,7 @@ public class ClusterControllerImplTest {
 
     controller.updateResources(Resource.Type.Host, request, predicate);
 
-    Assert.assertEquals(TestResourceProvider.Action.Update, resourceProvider.getLastAction());
+    Assert.assertEquals(TestHostResourceProvider.Action.Update, resourceProvider.getLastAction());
     Assert.assertSame(request, resourceProvider.getLastRequest());
     Predicate lastPredicate = resourceProvider.getLastPredicate();
     Assert.assertFalse(predicate.equals(lastPredicate));
@@ -567,14 +571,14 @@ public class ClusterControllerImplTest {
   @Test
   public void testDeleteResources() throws Exception{
     TestProviderModule providerModule = new TestProviderModule();
-    TestResourceProvider resourceProvider = (TestResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
+    TestHostResourceProvider resourceProvider = (TestHostResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
     ClusterController controller = new ClusterControllerImpl(providerModule);
 
     Predicate predicate = new PredicateBuilder().property("c1/p2").equals(1).toPredicate();
 
     controller.deleteResources(Resource.Type.Host, predicate);
 
-    Assert.assertEquals(TestResourceProvider.Action.Delete, resourceProvider.getLastAction());
+    Assert.assertEquals(TestHostResourceProvider.Action.Delete, resourceProvider.getLastAction());
     Assert.assertNull(resourceProvider.getLastRequest());
     Assert.assertSame(predicate, resourceProvider.getLastPredicate());
   }
@@ -597,14 +601,14 @@ public class ClusterControllerImplTest {
   @Test
   public void testDeleteResourcesResolvePredicate() throws Exception{
     TestProviderModule providerModule = new TestProviderModule();
-    TestResourceProvider resourceProvider = (TestResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
+    TestHostResourceProvider resourceProvider = (TestHostResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
     ClusterController controller = new ClusterControllerImpl(providerModule);
 
     Predicate predicate = new PredicateBuilder().property("c3/p6").equals(1).toPredicate();
 
     controller.deleteResources(Resource.Type.Host, predicate);
 
-    Assert.assertEquals(TestResourceProvider.Action.Delete, resourceProvider.getLastAction());
+    Assert.assertEquals(TestHostResourceProvider.Action.Delete, resourceProvider.getLastAction());
     Assert.assertNull(resourceProvider.getLastRequest());
     Predicate lastPredicate = resourceProvider.getLastPredicate();
     Assert.assertFalse(predicate.equals(lastPredicate));
@@ -659,12 +663,16 @@ public class ClusterControllerImplTest {
     Assert.assertFalse(comparator.compare(resource2, resource1) == 0);
   }
 
-  private static class TestProviderModule implements ProviderModule {
+  public static class TestProviderModule implements ProviderModule {
     private Map<Resource.Type, ResourceProvider> providers = new HashMap<Resource.Type, ResourceProvider>();
 
-    private TestProviderModule() {
-      providers.put(Resource.Type.Cluster, new TestResourceProvider());
-      providers.put(Resource.Type.Host, new TestResourceProvider());
+    public TestProviderModule() {
+
+      for (Resource.Type type : Resource.Type.values()) {
+        providers.put(type, new TestResourceProvider(type));
+      }
+      providers.put(Resource.Type.Cluster, new TestClusterResourceProvider());
+      providers.put(Resource.Type.Host, new TestHostResourceProvider());
     }
 
     @Override
@@ -679,10 +687,69 @@ public class ClusterControllerImplTest {
   }
 
   private static class TestResourceProvider implements ResourceProvider {
+
+    private Resource.Type type;
+
+    private TestResourceProvider(Resource.Type type) {
+      this.type = type;
+    }
+
+    @Override
+    public RequestStatus createResources(Request request) throws SystemException, UnsupportedPropertyException, ResourceAlreadyExistsException, NoSuchParentResourceException {
+      throw new UnsupportedOperationException(); // not needed for testing
+    }
+
+    @Override
+    public Set<Resource> getResources(Request request, Predicate predicate) throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+      return Collections.emptySet();
+    }
+
+    @Override
+    public RequestStatus updateResources(Request request, Predicate predicate) throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+      throw new UnsupportedOperationException(); // not needed for testing
+    }
+
+    @Override
+    public RequestStatus deleteResources(Predicate predicate) throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+      throw new UnsupportedOperationException(); // not needed for testing
+    }
+
+    @Override
+    public Map<Resource.Type, String> getKeyPropertyIds() {
+      return PropertyHelper.getKeyPropertyIds(type);
+    }
+
+    @Override
+    public Set<String> checkPropertyIds(Set<String> propertyIds) {
+      return Collections.emptySet();
+    }
+  }
+
+
+  private static class TestClusterResourceProvider extends TestResourceProvider {
+    private TestClusterResourceProvider() {
+      super(Resource.Type.Cluster);
+    }
+
+    @Override
+    public Set<Resource> getResources(Request request, Predicate predicate) throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+      ResourceImpl resource = new ResourceImpl(Resource.Type.Cluster);
+
+      resource.setProperty(PropertyHelper.getPropertyId("Clusters", "cluster_name"), "cluster");
+
+      return Collections.<Resource>singleton(resource);
+    }
+  }
+
+  private static class TestHostResourceProvider extends TestResourceProvider {
     private Action lastAction = null;
     private Request lastRequest = null;
     private Predicate lastPredicate = null;
 
+    private TestHostResourceProvider() {
+      super(Resource.Type.Host);
+    }
+
     @Override
     public Set<Resource> getResources(Request request, Predicate predicate) throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
 
@@ -694,6 +761,9 @@ public class ClusterControllerImplTest {
         resource.setProperty(PropertyHelper.getPropertyId("Hosts", "cluster_name"), "cluster");
         resource.setProperty(PropertyHelper.getPropertyId("Hosts", "host_name"), "host:" + (4 - cnt));
 
+        resource.setProperty(PropertyHelper.getPropertyId("Hosts", "cluster_name"), "cluster");
+        resource.setProperty(PropertyHelper.getPropertyId("Hosts", "host_name"), "host:" + cnt);
+
         resource.setProperty(PropertyHelper.getPropertyId("c1", "p1"), cnt);
         resource.setProperty(PropertyHelper.getPropertyId("c1", "p2"), cnt % 2);
         resource.setProperty(PropertyHelper.getPropertyId("c1", "p3"), "foo");


[3/3] git commit: AMBARI-2254 - Reduce number of requests when querying for subtasks

Posted by tb...@apache.org.
AMBARI-2254 - Reduce number of requests when querying for subtasks


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

Branch: refs/heads/trunk
Commit: fc427d9f3e2d448a4e8746dd04199ad17390755c
Parents: 22f5fdf
Author: tbeerbower <tb...@hortonworks.com>
Authored: Wed Nov 13 11:01:57 2013 -0500
Committer: tbeerbower <tb...@hortonworks.com>
Committed: Thu Nov 14 05:21:19 2013 -0500

----------------------------------------------------------------------
 .../ambari/server/api/query/QueryImpl.java      | 527 ++++++++------
 .../server/api/resources/ResourceInstance.java  |   6 -
 .../resources/ResourceInstanceFactoryImpl.java  |  39 +-
 .../api/resources/ResourceInstanceImpl.java     | 142 ----
 .../ganglia/GangliaPropertyProvider.java        |   6 +-
 .../internal/ClusterControllerImpl.java         | 178 +++--
 .../controller/spi/ClusterController.java       | 172 ++---
 .../org/apache/ambari/server/api/TestSuite.java |  34 +-
 .../ambari/server/api/query/QueryImplTest.java  | 705 ++++++-------------
 .../api/resources/ResourceInstanceImplTest.java |  81 ---
 .../ganglia/GangliaPropertyProviderTest.java    |   4 +-
 .../internal/ClusterControllerImplTest.java     | 162 +++--
 12 files changed, 880 insertions(+), 1176 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/fc427d9f/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
index 7eb36e9..09923dd 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
@@ -18,10 +18,12 @@
 
 package org.apache.ambari.server.api.query;
 
+import org.apache.ambari.server.api.resources.ResourceDefinition;
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.resources.ResourceInstanceFactoryImpl;
+import org.apache.ambari.server.api.resources.SubResourceDefinition;
 import org.apache.ambari.server.api.services.ResultImpl;
-import org.apache.ambari.server.api.util.TreeNodeImpl;
-import org.apache.ambari.server.controller.utilities.ClusterControllerHelper;
+import org.apache.ambari.server.controller.predicate.OrPredicate;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.controller.predicate.AndPredicate;
 import org.apache.ambari.server.controller.predicate.EqualsPredicate;
@@ -36,62 +38,64 @@ import java.util.*;
 /**
  * Default read query.
  */
-public class QueryImpl implements Query {
+public class QueryImpl implements Query, ResourceInstance {
 
   /**
-   * Resource instance.
+   * Definition for the resource type.  The definition contains all information specific to the
+   * resource type.
    */
-  private ResourceInstance m_resource;
+  private final ResourceDefinition resourceDefinition;
 
   /**
-   * Properties of the query which make up the select portion of the query.
+   * The cluster controller.
    */
-  private Set<String> m_setQueryProperties = new HashSet<String>();
+  private final ClusterController clusterController;
 
   /**
-   * Indicates that the query should include all available properties.
+   * Properties of the query which make up the select portion of the query.
    */
-  private boolean allProperties = false;
+  private final Set<String> queryPropertySet = new HashSet<String>();
 
   /**
-   * Map that associates each property set on the query to temporal data.
+   * Map that associates categories with temporal data.
    */
-  private Map<String, TemporalInfo> m_mapPropertyTemporalInfo = new HashMap<String, TemporalInfo>();
+  private final Map<String, TemporalInfo> temporalInfoMap = new HashMap<String, TemporalInfo>();
 
   /**
-   * Map that associates categories with temporal data.
+   * Map of primary and foreign keys and values necessary to identify the resource.
    */
-  private Map<String, TemporalInfo> m_mapCategoryTemporalInfo = new HashMap<String, TemporalInfo>();
+  private final Map<Resource.Type, String> resourceIds = new HashMap<Resource.Type, String>();
 
   /**
    * Sub-resources of the resource which is being operated on.
    */
-  private Map<String, ResourceInstance> m_mapSubResources = new HashMap<String, ResourceInstance>();
+  private final Map<String, QueryImpl> querySubResourceSet = new HashMap<String, QueryImpl>();
 
   /**
-   * The user supplied predicate.
+   * Sub-resource instances of this resource.
+   * Map of resource name to resource instance.
    */
-  private Predicate m_userPredicate;
+  private Map<String, QueryImpl> subResourceSet;
 
   /**
-   * The user supplied page request information.
+   * Indicates that the query should include all available properties.
    */
-  private PageRequest m_pageRequest;
+  private boolean allProperties = false;
 
   /**
-   * Predicate calculated for query
+   * The user supplied predicate.
    */
-  private Predicate m_predicate;
+  private Predicate userPredicate;
 
   /**
-   * Query resources, don't clone
+   * The user supplied page request information.
    */
-  private Set<Resource> m_providerResources;
+  private PageRequest pageRequest;
 
   /**
-   * Populated query resources with applied predicate and pagination, don't clone
+   * Query resources.
    */
-  private Iterable<Resource> m_resourceIterable;
+  private Set<Resource> providerResourceSet;
 
   /**
    * The logger.
@@ -99,15 +103,27 @@ public class QueryImpl implements Query {
   private final static Logger LOG =
       LoggerFactory.getLogger(QueryImpl.class);
 
+
+  // ----- Constructor -------------------------------------------------------
+
   /**
-   * Constructor.
+   * Constructor
    *
-   * @param resource the resource being operated on
+   * @param mapIds              the map of ids
+   * @param resourceDefinition  the resource definition
+   * @param clusterController   the cluster controller
    */
-  public QueryImpl(ResourceInstance resource) {
-    m_resource = resource;
+  public QueryImpl(Map<Resource.Type, String> mapIds,
+                   ResourceDefinition resourceDefinition,
+                   ClusterController clusterController) {
+    this.resourceDefinition = resourceDefinition;
+    this.clusterController  = clusterController;
+    setIds(mapIds);
   }
 
+
+  // ----- Query -------------------------------------------------------------
+
   @Override
   public void addProperty(String category, String name, TemporalInfo temporalInfo) {
     if (category == null && name.equals("*")) {
@@ -116,17 +132,17 @@ public class QueryImpl implements Query {
     } else{
       if (addPropertyToSubResource(category, name, temporalInfo)){
         // add pk/fk properties of the resource to this query
-        Resource.Type resourceType = m_resource.getResourceDefinition().getType();
-        Schema        schema       = getClusterController().getSchema(resourceType);
+        Resource.Type resourceType = getResourceDefinition().getType();
+        Schema        schema       = clusterController.getSchema(resourceType);
 
-        for (Resource.Type type : m_resource.getIds().keySet()) {
+        for (Resource.Type type : getIds().keySet()) {
           addLocalProperty(schema.getKeyPropertyId(type));
         }
       } else {
         String propertyId = PropertyHelper.getPropertyId(category, name.equals("*") ? null : name);
         addLocalProperty(propertyId);
         if (temporalInfo != null) {
-          m_mapCategoryTemporalInfo.put(propertyId, temporalInfo);
+          temporalInfoMap.put(propertyId, temporalInfo);
         }
       }
     }
@@ -134,217 +150,304 @@ public class QueryImpl implements Query {
 
   @Override
   public void addLocalProperty(String property) {
-    m_setQueryProperties.add(property);
+    queryPropertySet.add(property);
   }
 
-  protected Set<Resource> getProviderResources() throws NoSuchParentResourceException, UnsupportedPropertyException, NoSuchResourceException, SystemException {
-    if (m_providerResources == null) {
-      Resource.Type resourceType = m_resource.getResourceDefinition().getType();
+  @Override
+  public Result execute()
+      throws UnsupportedPropertyException,
+             SystemException,
+             NoSuchResourceException,
+             NoSuchParentResourceException {
+
+    queryForResources();
+    return getResult();
+  }
 
-      if (m_resource.getIds().get(getResourceType()) == null) {
-        addCollectionProperties(getResourceType());
-      }
+  @Override
+  public Predicate getPredicate() {
+    return createPredicate();
+  }
 
-      if (m_setQueryProperties.isEmpty() && m_mapSubResources.isEmpty()) {
-        //Add sub resource properties for default case where no fields are specified.
-        m_mapSubResources.putAll(m_resource.getSubResources());
-      }
+  @Override
+  public Set<String> getProperties() {
+    return Collections.unmodifiableSet(queryPropertySet);
+  }
 
-      if (LOG.isDebugEnabled()) {
-        //todo: include predicate info.  Need to implement toString for all predicates.
-        LOG.debug("Executing resource query: " + m_resource.getIds());
-      }
+  @Override
+  public void setUserPredicate(Predicate predicate) {
+    userPredicate = predicate;
+  }
 
-      Predicate predicate = getPredicate();
+  @Override
+  public void setPageRequest(PageRequest pageRequest) {
+    this.pageRequest = pageRequest;
+  }
 
-      Request request = createRequest();
-      m_providerResources = getClusterController().getRawResources(resourceType, request, predicate);
-    }
 
-    return m_providerResources;
-  }
+  // ----- ResourceInstance --------------------------------------------------
 
-  protected Iterable<Resource> getResourceIterable() throws NoSuchParentResourceException, UnsupportedPropertyException,
-      NoSuchResourceException, SystemException {
-    if (m_resourceIterable == null) {
-      if (m_pageRequest == null) {
-        m_resourceIterable = getClusterController()
-            .getResources(getResourceType(), m_providerResources, getPredicate());
-      } else {
-        m_resourceIterable = getClusterController()
-            .getResources(getResourceType(), m_providerResources, getPredicate(), m_pageRequest).getIterable();
-      }
-    }
-    return m_resourceIterable;
+  @Override
+  public void setIds(Map<Resource.Type, String> mapIds) {
+    resourceIds.putAll(mapIds);
   }
 
   @Override
-  public Result execute() throws NoSuchParentResourceException, UnsupportedPropertyException, NoSuchResourceException, SystemException {
-
-    Map<Resource,Collection<Resource>> resourceTree =
-        new HashMap<Resource, Collection<Resource>>();
-    Map<Resource,String> resourceNames = new HashMap<Resource, String>();
+  public Map<Resource.Type, String> getIds() {
+    return new HashMap<Resource.Type, String>((resourceIds));
+  }
 
-    Map<QueryImpl, Resource> nextLevel = new HashMap<QueryImpl, Resource>();
-    nextLevel.put(this, null);
+  @Override
+  public Query getQuery() {
+    return this;
+  }
 
-    while (!nextLevel.isEmpty()) {
-      Map<QueryImpl, Resource> current = nextLevel;
-      Map<Resource.Type, Set<Resource>> resourceMap = new HashMap<Resource.Type, Set<Resource>>();
-      Map<Resource.Type, Predicate> predicateMap = new HashMap<Resource.Type, Predicate>();
+  @Override
+  public ResourceDefinition getResourceDefinition() {
+    return resourceDefinition;
+  }
 
-      Map<Resource.Type, Request> requestMap = new HashMap<Resource.Type, Request>();
+  @Override
+  public boolean isCollectionResource() {
+    return getIds().get(getResourceDefinition().getType()) == null;
+  }
 
-      //All resource instances in tree have same set of property ids, only resource type is valuable
-      //Request and predicate are formed using data described above
-      for (QueryImpl query : current.keySet()) {
+  @Override
+  public Map<String, ResourceInstance> getSubResources() {
+    return new HashMap<String, ResourceInstance>(ensureSubResources());
+  }
 
-        Resource.Type type = query.getResourceType();
-        if (!resourceMap.containsKey(type)) {
-          resourceMap.put(type, new HashSet<Resource>());
-          predicateMap.put(type, query.getPredicate());
-          requestMap.put(type, query.createRequest());
-        }
 
-        resourceMap.get(type).addAll(query.getProviderResources());
+  // ----- Object overrides --------------------------------------------------
 
-      }
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
 
-      getClusterController().populateResources(resourceMap, requestMap, predicateMap);
+    QueryImpl query = (QueryImpl) o;
 
-      //fill next level
-      nextLevel = new HashMap<QueryImpl, Resource>();
+    return clusterController.equals(query.clusterController) && !(pageRequest != null ?
+        !pageRequest.equals(query.pageRequest) :
+        query.pageRequest != null) && queryPropertySet.equals(query.queryPropertySet) &&
+        resourceDefinition.equals(query.resourceDefinition) &&
+        resourceIds.equals(query.resourceIds) && !(userPredicate != null ?
+        !userPredicate.equals(query.userPredicate) :
+        query.userPredicate != null);
+  }
 
-      for (Map.Entry<QueryImpl, Resource> entry : current.entrySet()) {
-        QueryImpl query = entry.getKey();
-        Resource parent = entry.getValue();
+  @Override
+  public int hashCode() {
+    int result = resourceDefinition.hashCode();
+    result = 31 * result + clusterController.hashCode();
+    result = 31 * result + queryPropertySet.hashCode();
+    result = 31 * result + resourceIds.hashCode();
+    result = 31 * result + (userPredicate != null ? userPredicate.hashCode() : 0);
+    result = 31 * result + (pageRequest != null ? pageRequest.hashCode() : 0);
+    return result;
+  }
 
-        Map<QueryImpl, Resource> subQueries = query.getSubQueries();
 
-        Collection<Resource> validResources = new ArrayList<Resource>();
+  // ----- helper methods ----------------------------------------------------
 
-        for (Resource resource : query.getResourceIterable()) {
-          validResources.add(resource);
+  /**
+   * Get the map of sub-resources.  Lazily create the map if required.  
+   */
+  private Map<String, QueryImpl> ensureSubResources() {
+    if (subResourceSet == null) {
+      subResourceSet = new HashMap<String, QueryImpl>();
+      Set<SubResourceDefinition> setSubResourceDefs =
+          getResourceDefinition().getSubResourceDefinitions();
+
+      ClusterController controller = clusterController;
+      for (SubResourceDefinition subResDef : setSubResourceDefs) {
+        Resource.Type type = subResDef.getType();
+        Map<Resource.Type, String> ids = getIds();
+        QueryImpl resource =  new QueryImpl(ids,
+            ResourceInstanceFactoryImpl.getResourceDefinition(type, ids),
+            controller);
+
+        // ensure pk is returned
+        resource.addLocalProperty(controller.getSchema(
+            type).getKeyPropertyId(type));
+        // add additionally required fk properties
+        for (Resource.Type fkType : subResDef.getAdditionalForeignKeys()) {
+          resource.addLocalProperty(controller.getSchema(type).getKeyPropertyId(fkType));
         }
 
-        resourceTree.put(parent, validResources);
+        String subResourceName = subResDef.isCollection() ?
+            resource.getResourceDefinition().getPluralName() :
+            resource.getResourceDefinition().getSingularName();
 
-        resourceNames.put(parent, query.getResultName());
-
-        nextLevel.putAll(subQueries);
+        subResourceSet.put(subResourceName, resource);
       }
-
     }
-
-    //create Result
-    Result result = createResult();
-    populateResult(result, resourceTree, resourceNames, null, null);
-    return result;
+    return subResourceSet;
   }
 
-  public String getResultName() {
-    return m_resource.isCollectionResource() ? m_resource.getResourceDefinition().getPluralName() :
-        m_resource.getResourceDefinition().getSingularName();
-  }
+  /**
+   * Query the cluster controller for the top level resources.
+   */
+  private void queryForResources()
+      throws UnsupportedPropertyException,
+      SystemException,
+      NoSuchResourceException,
+      NoSuchParentResourceException {
+
+    providerResourceSet = new LinkedHashSet<Resource>();
 
-  public Resource.Type getResourceType() {
-    return m_resource.getResourceDefinition().getType();
+    // save the top level resources
+    for (Resource resource : doQuery(getPredicate())) {
+      providerResourceSet.add(resource);
+    }
+    queryForSubResources();
   }
 
-  protected void populateResult(Result result, Map<Resource, Collection<Resource>> resourceTree,
-                                  Map<Resource, String> resourceNames,
-                                  TreeNode<Resource> node, Resource parent) {
+  /**
+   * Query the cluster controller for the sub-resources associated with 
+   * the given resources.  All the sub-resources of the same type should
+   * be acquired with a single query.
+   */
+  private void queryForSubResources()
+      throws UnsupportedPropertyException,
+      SystemException,
+      NoSuchResourceException,
+      NoSuchParentResourceException {
+
+    // get predicates for all of the sub resource types
+    Map<String, Predicate> predicateMap = getSubResourcePredicates(providerResourceSet);
 
-    TreeNode<Resource> tree;
-    if (node == null) {
-      tree = result.getResultTree();
-      if (m_resource.getIds().get(getResourceType()) == null) {
-        tree.setProperty("isCollection", "true");
+    for (Map.Entry<String, QueryImpl> entry : querySubResourceSet.entrySet()) {
+      QueryImpl subResource  = entry.getValue();
+
+      subResource.providerResourceSet = new LinkedHashSet<Resource>();
+
+      for (Resource resource : subResource.doQuery(predicateMap.get(entry.getKey()))) {
+        subResource.providerResourceSet.add(resource);
       }
-    } else {
-      tree = new TreeNodeImpl<Resource>(null, null, null);
+      subResource.queryForSubResources();
     }
+  }
 
-    if (node != null) {
-      tree.setProperty("isCollection", "false");
-      tree.setName(resourceNames.get(parent));
-      node.addChild(tree);
-    }
+  /**
+   * Query the cluster controller for the resources.
+   */
+  private Set<Resource> doQuery(Predicate predicate)
+      throws UnsupportedPropertyException,
+      SystemException,
+      NoSuchResourceException,
+      NoSuchParentResourceException {
 
-    int count = 1;
-    for (Resource resource : resourceTree.get(parent)) {
-      TreeNode<Resource> subNode = tree.addChild(resource, resource.getType() + ":" + count++);
-      if (resourceTree.containsKey(resource)) {
-        populateResult(result, resourceTree, resourceNames, subNode, resource);
-      }
+    Resource.Type resourceType1 = getResourceDefinition().getType();
+
+    if (getIds().get(resourceType1) == null) {
+      addCollectionProperties(resourceType1);
+    }
+    if (queryPropertySet.isEmpty() && querySubResourceSet.isEmpty()) {
+      //Add sub resource properties for default case where no fields are specified.
+      querySubResourceSet.putAll(ensureSubResources());
     }
 
-  }
+    Resource.Type resourceType = getResourceDefinition().getType();
+    Request       request      = createRequest();
 
-  public Map<QueryImpl, Resource> getSubQueries()
-      throws NoSuchParentResourceException, UnsupportedPropertyException, NoSuchResourceException, SystemException {
-    return getSubQueries(getResourceIterable());
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("Executing resource query: " + request + " where " + predicate);
+    }
+    return clusterController.getResources(resourceType, request, predicate);
   }
 
-  protected Map<QueryImpl, Resource> getSubQueries(Iterable<Resource> resourceIterable) {
-    Map<QueryImpl, Resource> parentMap = new HashMap<QueryImpl, Resource>();
+  /**
+   * Get a map of predicates for the given resource's sub-resources keyed 
+   * by resource type.  Each predicate is a combined predicate of all 
+   * the sub resource predicates for a given type OR'd together.  This 
+   * allows for all of the sub-resources of a given type to be 
+   * acquired in a single query.
+   */
+  private Map<String, Predicate> getSubResourcePredicates(Set<Resource> resources) {
+    Map<String, Predicate> predicateMap = new HashMap<String, Predicate>();
 
-    for (Resource parentResource : resourceIterable) {
-      //Need to copy Resource Instance because of delayed query execution
-      for (ResourceInstance resourceInstanceTemplate : m_mapSubResources.values()) {
-        ResourceInstance resourceInstance;
-        resourceInstance = resourceInstanceTemplate.createCopy();
-        setParentIdsOnSubResource(parentResource, resourceInstance);
-        parentMap.put((QueryImpl) resourceInstance.getQuery(), parentResource);
+    for (Resource resource : resources) {
+      for (Map.Entry<String, QueryImpl> entry : querySubResourceSet.entrySet()) {
+        QueryImpl subResourceInstance = entry.getValue();
+        String    subResCategory      = entry.getKey();
+        Predicate predicate           = predicateMap.get(subResCategory);
 
+        setParentIdsOnSubResource(resource, subResourceInstance);
+
+        predicateMap.put(subResCategory, predicate == null ?
+            subResourceInstance.getPredicate() :
+            new OrPredicate(predicate, subResourceInstance.getPredicate()));
       }
     }
-
-    return parentMap;
+    return predicateMap;
   }
 
+  /**
+   * Get a result from this query.
+   */
+  private Result getResult()
+      throws UnsupportedPropertyException, SystemException, NoSuchResourceException, NoSuchParentResourceException {
 
-  @Override
-  public Predicate getPredicate() {
-    if (m_predicate == null) {
-      m_predicate = createPredicate(m_resource);
+    Result result = new ResultImpl(true);
+    Resource.Type resourceType = getResourceDefinition().getType();
+    if (getIds().get(resourceType) == null) {
+      result.getResultTree().setProperty("isCollection", "true");
     }
-    return m_predicate;
-  }
 
-  @Override
-  public Set<String> getProperties() {
-    return Collections.unmodifiableSet(m_setQueryProperties);
-  }
+    Predicate predicate = createPredicate();
+    Request   request   = createRequest();
 
-  @Override
-  public void setUserPredicate(Predicate predicate) {
-    m_userPredicate = predicate;
-  }
+    Iterable<Resource> iterResource;
 
-  @Override
-  public void setPageRequest(PageRequest pageRequest) {
-    m_pageRequest = pageRequest;
-  }
+    if (pageRequest == null) {
+      iterResource = clusterController.getIterable(
+          resourceType, providerResourceSet, request, predicate);
+    } else {
+      PageResponse pageResponse = clusterController.getPage(
+          resourceType, providerResourceSet, request, predicate, pageRequest);
+      iterResource = pageResponse.getIterable();
+    }
 
-  ClusterController getClusterController() {
-    return ClusterControllerHelper.getClusterController();
+    TreeNode<Resource> tree = result.getResultTree();
+
+    int count = 1;
+    for (Resource resource : iterResource) {
+      // add a child node for the resource and provide a unique name.  The name is never used.
+      TreeNode<Resource> node = tree.addChild(resource, resource.getType() + ":" + count++);
+      for (Map.Entry<String, QueryImpl> entry : querySubResourceSet.entrySet()) {
+        String    subResCategory = entry.getKey();
+        QueryImpl subResource    = entry.getValue();
+
+        setParentIdsOnSubResource(resource, subResource);
+
+        TreeNode<Resource> childResult = subResource.getResult().getResultTree();
+        childResult.setName(subResCategory);
+        childResult.setProperty("isCollection", "false");
+        node.addChild(childResult);
+      }
+    }
+    return result;
   }
 
   private void addCollectionProperties(Resource.Type resourceType) {
-    Schema schema = getClusterController().getSchema(resourceType);
+    Schema schema = clusterController.getSchema(resourceType);
+
     // add pk
     String property = schema.getKeyPropertyId(resourceType);
-    addProperty(PropertyHelper.getPropertyCategory(property), PropertyHelper.getPropertyName(property), null);
+    addProperty(PropertyHelper.getPropertyCategory(property),
+        PropertyHelper.getPropertyName(property), null);
 
-    for (Resource.Type type : m_resource.getIds().keySet()) {
+    for (Resource.Type type : getIds().keySet()) {
       // add fk's
       String keyPropertyId = schema.getKeyPropertyId(type);
-      //todo: property id can be null in some cases such as host_component queries which obtain
-      //todo: component sub-resources.  Component will not have host fk.
-      //todo: refactor so that null check is not required.
       if (keyPropertyId != null) {
-        addProperty(PropertyHelper.getPropertyCategory(keyPropertyId), PropertyHelper.getPropertyName(keyPropertyId), null);
+        addProperty(PropertyHelper.getPropertyCategory(keyPropertyId),
+            PropertyHelper.getPropertyName(keyPropertyId), null);
       }
     }
   }
@@ -352,13 +455,13 @@ public class QueryImpl implements Query {
   private void addAllProperties(TemporalInfo temporalInfo) {
     allProperties = true;
     if (temporalInfo != null) {
-      m_mapCategoryTemporalInfo.put(null, temporalInfo);
+      temporalInfoMap.put(null, temporalInfo);
     }
 
-    for (Map.Entry<String, ResourceInstance> entry : m_resource.getSubResources().entrySet()) {
+    for (Map.Entry<String, QueryImpl> entry : ensureSubResources().entrySet()) {
       String name = entry.getKey();
-      if (! m_mapSubResources.containsKey(name)) {
-        m_mapSubResources.put(name, entry.getValue());
+      if (! querySubResourceSet.containsKey(name)) {
+        querySubResourceSet.put(name, entry.getValue());
       }
     }
   }
@@ -379,10 +482,9 @@ public class QueryImpl implements Query {
     int i = path.indexOf("/");
     String p = i == -1 ? path : path.substring(0, i);
 
-    ResourceInstance subResource = m_resource.getSubResources().get(p);
+    QueryImpl subResource = ensureSubResources().get(p);
     if (subResource != null) {
-      m_mapSubResources.put(p, subResource);
-      //todo: handle case of trailing '/' (for example fields=subResource/)
+      querySubResourceSet.put(p, subResource);
 
       if (property != null || !path.equals(p)) {
         //only add if a sub property is set or if a sub category is specified
@@ -393,10 +495,10 @@ public class QueryImpl implements Query {
     return resourceAdded;
   }
 
-  private Predicate createInternalPredicate(ResourceInstance resource) {
-    Resource.Type resourceType = resource.getResourceDefinition().getType();
-    Map<Resource.Type, String> mapResourceIds = resource.getIds();
-    Schema schema = getClusterController().getSchema(resourceType);
+  private Predicate createInternalPredicate() {
+    Resource.Type resourceType = getResourceDefinition().getType();
+    Map<Resource.Type, String> mapResourceIds = getIds();
+    Schema schema = clusterController.getSchema(resourceType);
 
     Set<Predicate> setPredicates = new HashSet<Predicate>();
     for (Map.Entry<Resource.Type, String> entry : mapResourceIds.entrySet()) {
@@ -417,29 +519,28 @@ public class QueryImpl implements Query {
     }
   }
 
-  private Predicate createPredicate(ResourceInstance resource) {
+  private Predicate createPredicate() {
     Predicate predicate = null;
-    //todo: change reference type to Predicate when predicate hierarchy is fixed
-    Predicate internalPredicate = createInternalPredicate(resource);
+    Predicate internalPredicate = createInternalPredicate();
     if (internalPredicate == null) {
-      if (m_userPredicate != null) {
-        predicate = m_userPredicate;
+      if (userPredicate != null) {
+        predicate = userPredicate;
       }
     } else {
-      predicate = (m_userPredicate == null ? internalPredicate :
-          new AndPredicate(m_userPredicate, internalPredicate));
+      predicate = (userPredicate == null ? internalPredicate :
+          new AndPredicate(userPredicate, internalPredicate));
     }
     return predicate;
   }
 
-  public Request createRequest() {
+  private Request createRequest() {
     Set<String> setProperties = new HashSet<String>();
 
     Map<String, TemporalInfo> mapTemporalInfo    = new HashMap<String, TemporalInfo>();
-    TemporalInfo              globalTemporalInfo = m_mapCategoryTemporalInfo.get(null);
+    TemporalInfo              globalTemporalInfo = temporalInfoMap.get(null);
 
-    for (String group : m_setQueryProperties) {
-      TemporalInfo temporalInfo = m_mapCategoryTemporalInfo.get(group);
+    for (String group : queryPropertySet) {
+      TemporalInfo temporalInfo = temporalInfoMap.get(group);
       if (temporalInfo != null) {
         mapTemporalInfo.put(group, temporalInfo);
       } else if (globalTemporalInfo != null) {
@@ -452,44 +553,24 @@ public class QueryImpl implements Query {
   }
 
   private void setParentIdsOnSubResource(Resource resource, ResourceInstance r) {
-    Map<Resource.Type, String> mapParentIds = m_resource.getIds();
+    Map<Resource.Type, String> mapParentIds = getIds();
     Map<Resource.Type, String> mapResourceIds = new HashMap<Resource.Type, String>(mapParentIds.size());
     for (Map.Entry<Resource.Type, String> resourceIdEntry : mapParentIds.entrySet()) {
       Resource.Type type = resourceIdEntry.getKey();
       String value = resourceIdEntry.getValue();
 
       if (value == null) {
-        Object o = resource.getPropertyValue(getClusterController().getSchema(type).getKeyPropertyId(type));
+        Object o = resource.getPropertyValue(clusterController.getSchema(type).getKeyPropertyId(type));
         value = o == null ? null : o.toString();
       }
       if (value != null) {
         mapResourceIds.put(type, value);
       }
     }
-    String resourceKeyProp = getClusterController().getSchema(resource.getType()).
+    String resourceKeyProp = clusterController.getSchema(resource.getType()).
         getKeyPropertyId(resource.getType());
-    //todo: shouldn't use toString here
+
     mapResourceIds.put(resource.getType(), resource.getPropertyValue(resourceKeyProp).toString());
     r.setIds(mapResourceIds);
   }
-
-  Result createResult() {
-    return new ResultImpl(true);
-  }
-
-  /**
-   * Copy template fields to given query
-   * @param query query to which fields will be copied
-   */
-  public void cloneFields(QueryImpl query) {
-    query.m_predicate = m_predicate;
-    query.m_mapCategoryTemporalInfo = m_mapCategoryTemporalInfo;
-    query.m_mapPropertyTemporalInfo = m_mapPropertyTemporalInfo;
-    query.m_mapSubResources = m_mapSubResources;
-    query.m_setQueryProperties = m_setQueryProperties;
-    query.m_pageRequest = m_pageRequest;
-    query.m_userPredicate = m_userPredicate;
-    query.allProperties = allProperties;
-  }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/fc427d9f/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstance.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstance.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstance.java
index 454da6f..a3a8e3a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstance.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstance.java
@@ -74,10 +74,4 @@ public interface ResourceInstance {
    * @return true if the resource is a collection resource; false otherwise
    */
   public boolean isCollectionResource();
-
-  /**
-   * Create clear copy of current resource instance
-   * @return new ResourceInstance
-   */
-  ResourceInstance createCopy();
 }

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/fc427d9f/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
index e71f1fc..02d081e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
@@ -19,7 +19,9 @@
 
 package org.apache.ambari.server.api.resources;
 
+import org.apache.ambari.server.api.query.QueryImpl;
 import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.ClusterControllerHelper;
 
 import java.util.Map;
 
@@ -34,6 +36,20 @@ public class ResourceInstanceFactoryImpl implements ResourceInstanceFactory {
     /**
      * The resource definition for the specified type.
      */
+    ResourceDefinition resourceDefinition = getResourceDefinition(type, mapIds);
+
+    return new QueryImpl(mapIds, resourceDefinition, ClusterControllerHelper.getClusterController());
+  }
+
+  /**
+   * Get a resource definition for the given type.
+   *
+   * @param type    the resource type
+   * @param mapIds  the map of ids
+   *
+   * @return the resource definition
+   */
+  public static ResourceDefinition getResourceDefinition(Resource.Type type, Map<Resource.Type, String> mapIds) {
     ResourceDefinition resourceDefinition;
 
     //todo: consider ResourceDependencyManager : Map<Resource.Type, ResourceDefinition>
@@ -52,7 +68,7 @@ public class ResourceInstanceFactoryImpl implements ResourceInstanceFactory {
         break;
 
       case Component:
-        resourceDefinition = new  ComponentResourceDefinition();
+        resourceDefinition = new ComponentResourceDefinition();
         break;
 
       case HostComponent:
@@ -82,27 +98,27 @@ public class ResourceInstanceFactoryImpl implements ResourceInstanceFactory {
       case Stack:
         resourceDefinition = new StackResourceDefinition();
         break;
-        
+
       case StackVersion:
         resourceDefinition = new StackVersionResourceDefinition();
         break;
-        
+
       case StackService:
         resourceDefinition = new StackServiceResourceDefinition();
         break;
-        
+
       case StackServiceComponent:
         resourceDefinition = new StackServiceComponentResourceDefinition();
         break;
-        
+
       case StackConfiguration:
         resourceDefinition = new StackConfigurationResourceDefinition();
         break;
-        
+
       case OperatingSystem:
         resourceDefinition = new OperatingSystemResourceDefinition();
         break;
-        
+
       case Repository:
         resourceDefinition = new RepositoryResourceDefinition();
         break;
@@ -130,15 +146,15 @@ public class ResourceInstanceFactoryImpl implements ResourceInstanceFactory {
       case TaskAttempt:
         resourceDefinition = new TaskAttemptResourceDefinition();
         break;
-        
+
       case RootService:
         resourceDefinition = new RootServiceResourceDefinition();
         break;
-        
+
       case RootServiceComponent:
         resourceDefinition = new RootServiceComponentResourceDefinition();
         break;
-        
+
       case RootServiceHostComponent:
         resourceDefinition = new RootServiceHostComponentResourceDefinition();
         break;
@@ -150,7 +166,6 @@ public class ResourceInstanceFactoryImpl implements ResourceInstanceFactory {
       default:
         throw new IllegalArgumentException("Unsupported resource type: " + type);
     }
-
-    return new ResourceInstanceImpl(mapIds, resourceDefinition, this);
+    return resourceDefinition;
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/fc427d9f/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceImpl.java
deleted file mode 100644
index a62978c..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceImpl.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/**
- * 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.api.resources;
-
-import org.apache.ambari.server.api.query.Query;
-import org.apache.ambari.server.api.query.QueryImpl;
-import org.apache.ambari.server.controller.spi.ClusterController;
-import org.apache.ambari.server.controller.spi.Resource;
-import org.apache.ambari.server.controller.utilities.ClusterControllerHelper;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Resource instance which contains request specific state.
- */
-public class ResourceInstanceImpl implements ResourceInstance {
-
-  /**
-   * Query associated with the resource definition.
-   */
-  private Query m_query;
-
-  /**
-   * Map of primary and foreign keys and values necessary to identify the resource.
-   */
-  private Map<Resource.Type, String> m_mapResourceIds = new HashMap<Resource.Type, String>();
-
-  /**
-   * Definition for the resource type.  The definition contains all information specific to the
-   * resource type.
-   */
-  private ResourceDefinition m_resourceDefinition;
-
-  /**
-   * Sub-resource instances of this resource.
-   * Map of resource resource name to resource instance.
-   */
-  private Map<String, ResourceInstance> m_mapSubResources;
-
-  /**
-   * Factory for creating resource instances.
-   * Used to create sub-resource instances.
-   */
-  private ResourceInstanceFactory m_resourceFactory;
-
-  /**
-   * Cluster controller reference.
-   */
-  //todo: should be injected.
-  private ClusterController m_controller = ClusterControllerHelper.getClusterController();
-
-
-  public ResourceInstanceImpl(Map<Resource.Type, String> mapIds, ResourceDefinition resourceDefinition,
-                              ResourceInstanceFactory resourceFactory) {
-
-    m_resourceDefinition = resourceDefinition;
-    m_query              = new QueryImpl(this);
-    m_resourceFactory    = resourceFactory;
-
-    setIds(mapIds);
-  }
-
-  @Override
-  public void setIds(Map<Resource.Type, String> mapIds) {
-    m_mapResourceIds.putAll(mapIds);
-  }
-
-  @Override
-  public Map<Resource.Type, String> getIds() {
-    return new HashMap<Resource.Type, String>((m_mapResourceIds));
-  }
-
-  @Override
-  public Query getQuery() {
-    return m_query;
-  }
-
-  @Override
-  public ResourceDefinition getResourceDefinition() {
-    return m_resourceDefinition;
-  }
-
-
-  @Override
-  public Map<String, ResourceInstance> getSubResources() {
-    if (m_mapSubResources == null) {
-      m_mapSubResources = new HashMap<String, ResourceInstance>();
-      Set<SubResourceDefinition> setSubResourceDefs = getResourceDefinition().getSubResourceDefinitions();
-
-      for (SubResourceDefinition subResDef : setSubResourceDefs) {
-        ResourceInstance resource = m_resourceFactory.createResource(subResDef.getType(), getIds());
-
-        // ensure pk is returned
-        resource.getQuery().addLocalProperty(m_controller.getSchema(
-            subResDef.getType()).getKeyPropertyId(subResDef.getType()));
-        // add additionally required fk properties
-        for (Resource.Type fkType : subResDef.getAdditionalForeignKeys()) {
-          resource.getQuery().addLocalProperty(m_controller.getSchema(subResDef.getType()).getKeyPropertyId(fkType));
-        }
-
-        String subResourceName = subResDef.isCollection() ? resource.getResourceDefinition().getPluralName() :
-            resource.getResourceDefinition().getSingularName();
-
-        m_mapSubResources.put(subResourceName, resource);
-      }
-    }
-    return m_mapSubResources;
-  }
-
-  @Override
-  public boolean isCollectionResource() {
-    return getIds().get(getResourceDefinition().getType()) == null;
-  }
-
-  @Override
-  public ResourceInstance createCopy() {
-    ResourceInstanceImpl resourceInstance = new ResourceInstanceImpl(m_mapResourceIds, m_resourceDefinition, m_resourceFactory);
-    resourceInstance.m_mapSubResources = m_mapSubResources;
-    ((QueryImpl) m_query).cloneFields((QueryImpl) resourceInstance.m_query);
-
-    return resourceInstance;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/fc427d9f/ambari-server/src/main/java/org/apache/ambari/server/controller/ganglia/GangliaPropertyProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ganglia/GangliaPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ganglia/GangliaPropertyProvider.java
index 5f7f3e0..680a07e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ganglia/GangliaPropertyProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ganglia/GangliaPropertyProvider.java
@@ -275,7 +275,7 @@ public abstract class GangliaPropertyProvider extends AbstractPropertyProvider {
 
     String clusters = getSetString(clusterSet, -1);
     String hosts    = getSetString(hostSet, 100);
-    String metrics  = getSetString(metricSet, 50);
+    String metrics  = getSetString(metricSet, 60);
 
     URIBuilder uriBuilder = new URIBuilder();
 
@@ -285,7 +285,6 @@ public abstract class GangliaPropertyProvider extends AbstractPropertyProvider {
       uriBuilder.setScheme("http");
     }
 
-    
     uriBuilder.setHost(hostProvider.getGangliaCollectorHostName(clusterName));
     
     uriBuilder.setPath("/cgi-bin/rrd.py");
@@ -299,6 +298,9 @@ public abstract class GangliaPropertyProvider extends AbstractPropertyProvider {
 
     if (metrics.length() > 0) {
       uriBuilder.setParameter("m", metrics);
+    } else {
+      // get all metrics
+      uriBuilder.setParameter("m", ".*");
     }
 
     if (temporalInfo != null) {

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/fc427d9f/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java
index 3b2f9c9..1a9079f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java
@@ -91,18 +91,9 @@ public class ClusterControllerImpl implements ClusterController {
 
   // ----- ClusterController -------------------------------------------------
 
-  public Iterable<Resource> getResources(Resource.Type type, Request request, Predicate predicate)
-      throws UnsupportedPropertyException,
-             SystemException,
-             NoSuchParentResourceException,
-             NoSuchResourceException {
-    return getResources(type, request, predicate, null).getIterable();
-  }
-
   @Override
-  public Set<Resource> getRawResources(Resource.Type type, Request request, Predicate predicate)
+  public Set<Resource> getResources(Resource.Type type, Request request, Predicate predicate)
       throws UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException, SystemException {
-
     Set<Resource> resources;
 
     ResourceProvider provider = ensureResourceProvider(type);
@@ -117,21 +108,35 @@ public class ClusterControllerImpl implements ClusterController {
             + provider.getClass().getName()
             + " for request type " + type.toString());
       }
+      // make sure that the providers can satisfy the request
       checkProperties(type, request, predicate);
 
+      // get the resources
       resources = provider.getResources(request, predicate);
+
+      // populate the resources with metrics and properties.
+      populateResources(type, resources, request, predicate);
+
+      // filter the fully populated resources with the given predicate
+      Iterable<Resource> iterable = getIterable(type, resources, request, predicate);
+      resources = new LinkedHashSet<Resource>();
+      for (Resource resource : iterable){
+        resources.add(resource);
+      }
     }
     return resources;
   }
 
   @Override
-  public Iterable<Resource> getResources(Resource.Type type, Set<Resource> providerResources, Predicate predicate)
+  public Iterable<Resource> getIterable(Resource.Type type, Set<Resource> providerResources,
+                                        Request request, Predicate predicate)
       throws NoSuchParentResourceException, UnsupportedPropertyException, NoSuchResourceException, SystemException {
-    return getResources(type, providerResources, predicate, null).getIterable();
+    return getPage(type, providerResources, request, predicate, null).getIterable();
   }
 
   @Override
-  public PageResponse getResources(Resource.Type type, Set<Resource> providerResources, Predicate predicate, PageRequest pageRequest)
+  public PageResponse getPage(Resource.Type type, Set<Resource> providerResources,
+                              Request request, Predicate predicate, PageRequest pageRequest)
       throws UnsupportedPropertyException,
       SystemException,
       NoSuchResourceException,
@@ -144,8 +149,6 @@ public class ClusterControllerImpl implements ClusterController {
         (ResourcePredicateEvaluator) provider : DEFAULT_RESOURCE_PREDICATE_EVALUATOR;
 
     if (!providerResources.isEmpty()) {
-
-
       Comparator<Resource> resourceComparator = pageRequest == null || pageRequest.getComparator() == null ?
           comparator : pageRequest.getComparator();
 
@@ -156,16 +159,16 @@ public class ClusterControllerImpl implements ClusterController {
         switch (pageRequest.getStartingPoint()) {
           case Beginning:
             return getPageFromOffset(pageRequest.getPageSize(), 0,
-              sortedResources, predicate, evaluator);
+              sortedResources, request, predicate, evaluator);
           case End:
             return getPageToOffset(pageRequest.getPageSize(), -1,
-              sortedResources, predicate, evaluator);
+                sortedResources, request, predicate, evaluator);
           case OffsetStart:
             return getPageFromOffset(pageRequest.getPageSize(),
-              pageRequest.getOffset(), sortedResources, predicate, evaluator);
+              pageRequest.getOffset(), sortedResources, request, predicate, evaluator);
           case OffsetEnd:
             return getPageToOffset(pageRequest.getPageSize(),
-              pageRequest.getOffset(), sortedResources, predicate, evaluator);
+              pageRequest.getOffset(), sortedResources, request, predicate, evaluator);
           // TODO : need to support the following cases for pagination
 //          case PredicateStart:
 //          case PredicateEnd:
@@ -176,21 +179,10 @@ public class ClusterControllerImpl implements ClusterController {
       resources = providerResources;
     }
 
-    return new PageResponseImpl(new ResourceIterable(resources, predicate, evaluator),
+    return new PageResponseImpl(new ResourceIterable(resources, request, predicate, evaluator),
       0, null, null);
   }
 
-  public PageResponse getResources(Resource.Type type, Request request, Predicate predicate, PageRequest pageRequest)
-      throws UnsupportedPropertyException,
-             SystemException,
-             NoSuchResourceException,
-             NoSuchParentResourceException {
-
-    Set<Resource> providerResources = getRawResources(type, request, predicate);
-    populateResources(type, providerResources, request, predicate);
-    return getResources(type, providerResources, predicate, pageRequest);
-  }
-
   @Override
   public Schema getSchema(Resource.Type type) {
     Schema schema;
@@ -267,6 +259,58 @@ public class ClusterControllerImpl implements ClusterController {
   // ----- helper methods ----------------------------------------------------
 
   /**
+   * Get an iterable set of resources filtered by the given request and
+   * predicate objects.
+   *
+   * @param type       type of resources
+   * @param request    the request
+   * @param predicate  the predicate object which filters which resources are returned
+   *
+   * @return a page response representing the requested page of resources
+   *
+   * @throws UnsupportedPropertyException thrown if the request or predicate contain
+   *                                      unsupported property ids
+   * @throws SystemException an internal exception occurred
+   * @throws NoSuchResourceException no matching resource(s) found
+   * @throws NoSuchParentResourceException a specified parent resource doesn't exist
+   */
+  protected Iterable<Resource> getResourceIterable(Resource.Type type, Request request, Predicate predicate)
+      throws UnsupportedPropertyException,
+      SystemException,
+      NoSuchParentResourceException,
+      NoSuchResourceException {
+    return getResources(type, request, predicate, null).getIterable();
+  }
+
+  /**
+   * Get a page of resources filtered by the given request, predicate objects and
+   * page request.
+   *
+   * @param type               type of resources
+   * @param request            the request
+   * @param predicate          the predicate object which filters which resources are returned
+   * @param pageRequest        the page request for a paginated response
+   *
+   * @return a page response representing the requested page of resources
+   *
+   * @throws UnsupportedPropertyException thrown if the request or predicate contain
+   *                                      unsupported property ids
+   * @throws SystemException an internal exception occurred
+   * @throws NoSuchResourceException no matching resource(s) found
+   * @throws NoSuchParentResourceException a specified parent resource doesn't exist
+   */
+  protected  PageResponse getResources(Resource.Type type, Request request, Predicate predicate, PageRequest pageRequest)
+      throws UnsupportedPropertyException,
+      SystemException,
+      NoSuchResourceException,
+      NoSuchParentResourceException {
+
+    Set<Resource> providerResources = getResources(type, request, predicate);
+    populateResources(type, providerResources, request, predicate);
+    return getPage(type, providerResources, request, predicate, pageRequest);
+  }
+
+  /**
    * Check to make sure that all the property ids specified in the given request and
    * predicate are supported by the resource provider or property providers for the
    * given type.
@@ -343,7 +387,7 @@ public class ClusterControllerImpl implements ClusterController {
     Set<String>  keyPropertyIds = new HashSet<String>(provider.getKeyPropertyIds().values());
     Request      readRequest    = PropertyHelper.getReadRequest(keyPropertyIds);
 
-    Iterable<Resource> resources = getResources(type, readRequest, predicate);
+    Iterable<Resource> resources = getResourceIterable(type, readRequest, predicate);
 
     PredicateBuilder pb = new PredicateBuilder();
     PredicateBuilder.PredicateBuilderWithPredicate pbWithPredicate = null;
@@ -384,8 +428,7 @@ public class ClusterControllerImpl implements ClusterController {
    *
    * @throws SystemException if unable to populate the resources
    */
-  @Override
-  public Set<Resource> populateResources(Resource.Type type,
+  protected Set<Resource> populateResources(Resource.Type type,
                                          Set<Resource> resources,
                                          Request request,
                                          Predicate predicate) throws SystemException {
@@ -400,30 +443,6 @@ public class ClusterControllerImpl implements ClusterController {
   }
 
   /**
-   * Performs bulk population of the given resources from the associated property providers.  This
-   * method may filter the resources based on the predicate and return a subset
-   * of the given resources.
-   * @param resourceMap resources grouped by type
-   * @param requestMap type-request map
-   * @param predicateMap type-predicate map
-   * @return the set of resources that were successfully populated grouped by resource type
-   * @throws SystemException
-   */
-  @Override
-  public Map<Resource.Type, Set<Resource>> populateResources(Map<Resource.Type, Set<Resource>> resourceMap,
-                                Map<Resource.Type, Request> requestMap,
-                                Map<Resource.Type, Predicate> predicateMap) throws SystemException {
-
-    Map<Resource.Type, Set<Resource>> keepers = new HashMap<Resource.Type, Set<Resource>>();
-
-    for (Resource.Type type : resourceMap.keySet()) {
-      keepers.put(type, populateResources(type, resourceMap.get(type), requestMap.get(type), predicateMap.get(type)));
-    }
-
-    return keepers;
-  }
-
-  /**
    * Indicates whether or not the given property provider can service the given request.
    *
    * @param provider   the property provider
@@ -483,13 +502,14 @@ public class ClusterControllerImpl implements ClusterController {
    * @param pageSize   the page size
    * @param offset     the offset
    * @param resources  the set of resources
+   * @param request    the request
    * @param predicate  the predicate
    *
    * @return a page response containing a page of resources
    */
   private PageResponse getPageFromOffset(int pageSize, int offset,
                                          NavigableSet<Resource> resources,
-                                         Predicate predicate,
+                                         Request request, Predicate predicate,
                                          ResourcePredicateEvaluator evaluator) {
 
     int                currentOffset = 0;
@@ -509,7 +529,7 @@ public class ClusterControllerImpl implements ClusterController {
     }
 
     return new PageResponseImpl(new ResourceIterable(pageResources,
-        predicate, evaluator),
+        request, predicate, evaluator),
         currentOffset,
         previous,
         iterator.hasNext() ? iterator.next() : null);
@@ -521,13 +541,14 @@ public class ClusterControllerImpl implements ClusterController {
    * @param pageSize   the page size
    * @param offset     the offset; -1 indicates the end of the resource set
    * @param resources  the set of resources
+   * @param request    the request
    * @param predicate  the predicate
    *
    * @return a page response containing a page of resources
    */
   private PageResponse getPageToOffset(int pageSize, int offset,
                                        NavigableSet<Resource> resources,
-                                       Predicate predicate,
+                                       Request request, Predicate predicate,
                                        ResourcePredicateEvaluator evaluator) {
 
     int                currentOffset = resources.size() - 1;
@@ -550,7 +571,7 @@ public class ClusterControllerImpl implements ClusterController {
     }
 
     return new PageResponseImpl(new ResourceIterable(new
-        LinkedHashSet<Resource>(pageResources), predicate, evaluator),
+        LinkedHashSet<Resource>(pageResources), request, predicate, evaluator),
         currentOffset + 1,
         iterator.hasNext() ? iterator.next() : null,
         next);
@@ -565,7 +586,8 @@ public class ClusterControllerImpl implements ClusterController {
     return comparator;
   }
 
-// ----- ResourceIterable inner class --------------------------------------
+
+  // ----- ResourceIterable inner class --------------------------------------
 
   private static class ResourceIterable implements Iterable<Resource> {
 
@@ -575,6 +597,11 @@ public class ClusterControllerImpl implements ClusterController {
     private final Set<Resource> resources;
 
     /**
+     * The associated request.
+     */
+    private final Request request;
+
+    /**
      * The predicate used to filter the set.
      */
     private final Predicate predicate;
@@ -584,17 +611,21 @@ public class ClusterControllerImpl implements ClusterController {
      */
     private final ResourcePredicateEvaluator evaluator;
 
+
     // ----- Constructors ----------------------------------------------------
 
     /**
      * Create a ResourceIterable.
      *
      * @param resources  the set of resources to iterate over
+     * @param request    the request
      * @param predicate  the predicate used to filter the set of resources
+     * @param evaluator  the evaluator used to evaluate with the given predicate
      */
-    private ResourceIterable(Set<Resource> resources, Predicate predicate,
+    private ResourceIterable(Set<Resource> resources, Request request, Predicate predicate,
                              ResourcePredicateEvaluator evaluator) {
       this.resources = resources;
+      this.request   = request;
       this.predicate = predicate;
       this.evaluator = evaluator;
     }
@@ -603,7 +634,7 @@ public class ClusterControllerImpl implements ClusterController {
 
     @Override
     public Iterator<Resource> iterator() {
-      return new ResourceIterator(resources, predicate, evaluator);
+      return new ResourceIterator(resources, request, predicate, evaluator);
     }
   }
 
@@ -618,6 +649,11 @@ public class ClusterControllerImpl implements ClusterController {
     private final Iterator<Resource> iterator;
 
     /**
+     * The associated request.
+     */
+    private final Request request;
+
+    /**
      * The predicate used to filter the resource being iterated over.
      */
     private final Predicate predicate;
@@ -638,13 +674,16 @@ public class ClusterControllerImpl implements ClusterController {
      * Create a new ResourceIterator.
      *
      * @param resources  the set of resources to iterate over
+     * @param request    the request
      * @param predicate  the predicate used to filter the set of resources
+     * @param evaluator  the evaluator used to evaluate with the given predicate
      */
-    private ResourceIterator(Set<Resource> resources, Predicate predicate,
+    private ResourceIterator(Set<Resource> resources, Request request, Predicate predicate,
                              ResourcePredicateEvaluator evaluator) {
-      this.iterator = resources.iterator();
-      this.predicate = predicate;
-      this.evaluator = evaluator;
+      this.iterator     = resources.iterator();
+      this.request      = request;
+      this.predicate    = predicate;
+      this.evaluator    = evaluator;
       this.nextResource = getNextResource();
     }
 
@@ -684,6 +723,7 @@ public class ClusterControllerImpl implements ClusterController {
         Resource next = iterator.next();
 
         if (predicate == null || evaluator.evaluate(predicate, next)) {
+          // TODO : copy the resource and only include the requested properties.
           return next;
         }
       }

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/fc427d9f/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/ClusterController.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/ClusterController.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/ClusterController.java
index debe534..0ab15db 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/ClusterController.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/ClusterController.java
@@ -17,8 +17,6 @@
  */
 package org.apache.ambari.server.controller.spi;
 
-
-import java.util.Map;
 import java.util.Set;
 
 /**
@@ -28,8 +26,79 @@ import java.util.Set;
  */
 public interface ClusterController {
 
+
   // ----- Monitoring ------------------------------------------------------
 
+  /**
+   * Get the resources of the given type filtered by the given request and
+   * predicate objects.
+   *
+   * @param type      the type of the requested resources
+   * @param request   the request object which defines the desired set of properties
+   * @param predicate the predicate object which filters which resources are returned
+   *
+   * @return an iterable object of the requested resources
+   *
+   * @throws UnsupportedPropertyException thrown if the request or predicate contain
+   *                                      unsupported property ids
+   * @throws SystemException an internal exception occurred
+   * @throws NoSuchResourceException no matching resource(s) found
+   * @throws NoSuchParentResourceException a specified parent resource doesn't exist
+   */
+  Set<Resource> getResources(Resource.Type type, Request request, Predicate predicate)
+      throws UnsupportedPropertyException,
+      NoSuchResourceException,
+      NoSuchParentResourceException,
+      SystemException;
+
+  /**
+   * Get an iterable set of resources from the given set of resources filtered by the
+   * given request and predicate objects.
+   *
+   * @param type               type of resources
+   * @param providerResources  set of populated Resources
+   * @param request            the request
+   * @param predicate          the predicate object which filters which resources are returned
+   *
+   * @return a page response representing the requested page of resources
+   *
+   * @throws UnsupportedPropertyException thrown if the request or predicate contain
+   *                                      unsupported property ids
+   * @throws SystemException an internal exception occurred
+   * @throws NoSuchResourceException no matching resource(s) found
+   * @throws NoSuchParentResourceException a specified parent resource doesn't exist
+   */
+  Iterable<Resource> getIterable(Resource.Type type, Set<Resource> providerResources,
+                                 Request request, Predicate predicate)
+      throws NoSuchParentResourceException,
+      UnsupportedPropertyException,
+      NoSuchResourceException,
+      SystemException;
+
+  /**
+   * Get a page of resources from the given set filtered by the given request,
+   * predicate objects and page request.
+   *
+   * @param type               type of resources
+   * @param providerResources  set of populated Resources
+   * @param request            the request
+   * @param predicate          the predicate object which filters which resources are returned
+   * @param pageRequest        the page request for a paginated response
+   *
+   * @return a page response representing the requested page of resources
+   *
+   * @throws UnsupportedPropertyException thrown if the request or predicate contain
+   *                                      unsupported property ids
+   * @throws SystemException an internal exception occurred
+   * @throws NoSuchResourceException no matching resource(s) found
+   * @throws NoSuchParentResourceException a specified parent resource doesn't exist
+   */
+  PageResponse getPage(Resource.Type type, Set<Resource> providerResources,
+                       Request request, Predicate predicate, PageRequest pageRequest)
+      throws UnsupportedPropertyException,
+      SystemException,
+      NoSuchResourceException,
+      NoSuchParentResourceException;
 
   /**
    * Get the {@link Schema schema} for the given resource type.  The schema
@@ -106,103 +175,4 @@ public interface ClusterController {
              SystemException,
              NoSuchResourceException,
              NoSuchParentResourceException ;
-
-  /**
-   * Get the not populated resources of the given type filtered by the given request and
-   * predicate objects.
-   *
-   * @param type      the type of the requested resources
-   * @param request   the request object which defines the desired set of properties
-   * @param predicate the predicate object which filters which resources are returned
-   *
-   * @return an iterable object of the requested resources
-   *
-   * @throws UnsupportedPropertyException thrown if the request or predicate contain
-   *                                      unsupported property ids
-   * @throws SystemException an internal exception occurred
-   * @throws NoSuchResourceException no matching resource(s) found
-   * @throws NoSuchParentResourceException a specified parent resource doesn't exist
-   */
-  Set<Resource> getRawResources(Resource.Type type, Request request, Predicate predicate)
-      throws UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException, SystemException;
-
-  /**
-   * Get a page of resources of the given type filtered by the given request,
-   * predicate objects and page request.
-   *
-   *
-   * @param type type of resources
-   * @param providerResources set of populated Resources
-   * @param predicate   the predicate object which filters which resources are returned
-   * @param pageRequest the page request for a paginated response
-   *
-   * @return a page response representing the requested page of resources
-   *
-   * @throws UnsupportedPropertyException thrown if the request or predicate contain
-   *                                      unsupported property ids
-   * @throws SystemException an internal exception occurred
-   * @throws NoSuchResourceException no matching resource(s) found
-   * @throws NoSuchParentResourceException a specified parent resource doesn't exist
-   */
-  PageResponse getResources(Resource.Type type, Set<Resource> providerResources, Predicate predicate, PageRequest pageRequest)
-      throws UnsupportedPropertyException,
-      SystemException,
-      NoSuchResourceException,
-      NoSuchParentResourceException;
-
-  /**
-   * Get a page of resources of the given type filtered by the given request,
-   * predicate objects and page request.
-   *
-   *
-   * @param type type of resources
-   * @param providerResources set of populated Resources
-   * @param predicate   the predicate object which filters which resources are returned
-   *
-   * @return a page response representing the requested page of resources
-   *
-   * @throws UnsupportedPropertyException thrown if the request or predicate contain
-   *                                      unsupported property ids
-   * @throws SystemException an internal exception occurred
-   * @throws NoSuchResourceException no matching resource(s) found
-   * @throws NoSuchParentResourceException a specified parent resource doesn't exist
-   */
-  Iterable<Resource> getResources(Resource.Type type, Set<Resource> providerResources, Predicate predicate)
-  throws NoSuchParentResourceException, UnsupportedPropertyException, NoSuchResourceException, SystemException;
-
-  /**
-   * Populate the given resources from the associated property providers.  This
-   * method may filter the resources based on the predicate and return a subset
-   * of the given resources.
-   *
-   * @param type       the resource type
-   * @param resources  the resources to be populated
-   * @param request    the request
-   * @param predicate  the predicate
-   *
-   * @return the set of resources that were successfully populated
-   *
-   * @throws SystemException if unable to populate the resources
-   */
-  Set<Resource> populateResources(Resource.Type type,
-                                  Set<Resource> resources,
-                                  Request request,
-                                  Predicate predicate) throws SystemException;
-
-  /**
-   * Performs bulk population of the given resources from the associated property providers.  This
-   * method may filter the resources based on the predicate and return a subset
-   * of the given resources.
-   *
-   * @param resourceMap resources grouped by type
-   * @param requestMap type-request map
-   * @param predicateMap type-predicate map
-   *
-   * @return the set of resources that were successfully populated grouped by resource type
-   *
-   * @throws SystemException
-   */
-  Map<Resource.Type, Set<Resource>> populateResources(Map<Resource.Type, Set<Resource>> resourceMap,
-                         Map<Resource.Type, Request> requestMap,
-                         Map<Resource.Type, Predicate> predicateMap) throws SystemException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/fc427d9f/ambari-server/src/test/java/org/apache/ambari/server/api/TestSuite.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/TestSuite.java b/ambari-server/src/test/java/org/apache/ambari/server/api/TestSuite.java
index 31fe7f8..716347f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/TestSuite.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/TestSuite.java
@@ -22,13 +22,34 @@ package org.apache.ambari.server.api;
  * All api unit tests.
  */
 
-import org.apache.ambari.server.api.handlers.*;
-import org.apache.ambari.server.api.predicate.QueryLexerTest;
-import org.apache.ambari.server.api.predicate.QueryParserTest;
-import org.apache.ambari.server.api.predicate.operators.*;
+import org.apache.ambari.server.api.handlers.CreateHandlerTest;
+import org.apache.ambari.server.api.handlers.DeleteHandlerTest;
+import org.apache.ambari.server.api.handlers.QueryCreateHandlerTest;
+import org.apache.ambari.server.api.handlers.ReadHandlerTest;
+import org.apache.ambari.server.api.handlers.UpdateHandlerTest;
+import org.apache.ambari.server.api.predicate.operators.AndOperatorTest;
+import org.apache.ambari.server.api.predicate.operators.EqualsOperatorTest;
+import org.apache.ambari.server.api.predicate.operators.GreaterEqualsOperatorTest;
+import org.apache.ambari.server.api.predicate.operators.GreaterOperatorTest;
+import org.apache.ambari.server.api.predicate.operators.InOperatorTest;
+import org.apache.ambari.server.api.predicate.operators.LessEqualsOperatorTest;
+import org.apache.ambari.server.api.predicate.operators.NotEqualsOperatorTest;
+import org.apache.ambari.server.api.predicate.operators.NotOperatorTest;
+import org.apache.ambari.server.api.predicate.operators.OrOperatorTest;
 import org.apache.ambari.server.api.query.QueryImplTest;
-import org.apache.ambari.server.api.resources.ResourceInstanceImplTest;
-import org.apache.ambari.server.api.services.*;
+import org.apache.ambari.server.api.services.ClusterServiceTest;
+import org.apache.ambari.server.api.services.ComponentServiceTest;
+import org.apache.ambari.server.api.services.DeleteRequestTest;
+import org.apache.ambari.server.api.services.GetRequestTest;
+import org.apache.ambari.server.api.services.HostComponentServiceTest;
+import org.apache.ambari.server.api.services.HostServiceTest;
+import org.apache.ambari.server.api.services.NamedPropertySetTest;
+import org.apache.ambari.server.api.services.PersistenceManagerImplTest;
+import org.apache.ambari.server.api.services.PostRequestTest;
+import org.apache.ambari.server.api.services.PutRequestTest;
+import org.apache.ambari.server.api.services.QueryPostRequestTest;
+import org.apache.ambari.server.api.services.RequestBodyTest;
+import org.apache.ambari.server.api.services.ServiceServiceTest;
 import org.apache.ambari.server.api.services.parsers.BodyParseExceptionTest;
 import org.apache.ambari.server.api.services.parsers.JsonRequestBodyParserTest;
 import org.apache.ambari.server.api.services.serializers.JsonSerializerTest;
@@ -41,7 +62,6 @@ import org.junit.runners.Suite;
     JsonRequestBodyParserTest.class, CreateHandlerTest.class, UpdateHandlerTest.class, DeleteHandlerTest.class,
     PersistenceManagerImplTest.class, GetRequestTest.class, PutRequestTest.class, PostRequestTest.class,
     DeleteRequestTest.class, QueryPostRequestTest.class, JsonSerializerTest.class, QueryCreateHandlerTest.class,
-    ResourceInstanceImplTest.class, QueryLexerTest.class, QueryParserTest.class, IsEmptyOperatorTest.class,
     InOperatorTest.class,AndOperatorTest.class, OrOperatorTest.class, EqualsOperatorTest.class,
     GreaterEqualsOperatorTest.class, GreaterOperatorTest.class, LessEqualsOperatorTest.class,
     LessEqualsOperatorTest.class, NotEqualsOperatorTest.class, NotOperatorTest.class, RequestBodyTest.class,