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/06/17 21:46:34 UTC
svn commit: r1493904 - in /incubator/ambari/trunk/ambari-server/src:
main/java/org/apache/ambari/server/api/query/
main/java/org/apache/ambari/server/api/resources/
main/java/org/apache/ambari/server/controller/predicate/
test/java/org/apache/ambari/se...
Author: tbeerbower
Date: Mon Jun 17 19:46:34 2013
New Revision: 1493904
URL: http://svn.apache.org/r1493904
Log:
AMBARI-2254 - Reduce number of requests when querying for subtasks
Removed:
incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
Modified:
incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceImpl.java
incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/AlwaysPredicate.java
incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/ArrayPredicate.java
incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/CategoryIsEmptyPredicate.java
incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/ComparisonPredicate.java
incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/UnaryPredicate.java
incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/TestSuite.java
incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ResourceInstanceImplTest.java
incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java?rev=1493904&r1=1493903&r2=1493904&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java Mon Jun 17 19:46:34 2013
@@ -20,6 +20,7 @@
package org.apache.ambari.server.api.resources;
import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.ClusterControllerHelper;
import java.util.Map;
@@ -31,12 +32,20 @@ public class ResourceInstanceFactoryImpl
@Override
public ResourceInstance createResource(Resource.Type type, Map<Resource.Type, String> mapIds) {
- /**
- * The resource definition for the specified type.
- */
- ResourceDefinition resourceDefinition;
+ return new ResourceInstanceImpl(mapIds, createResourceDefinition(type, mapIds),
+ ClusterControllerHelper.getClusterController());
+ }
- //todo: consider ResourceDependencyManager : Map<Resource.Type, ResourceDefinition>
+ /**
+ * Create a resource definition for the specified type.
+ *
+ * @param type the resource type
+ * @param mapIds the ids
+ *
+ * @return the resource definition
+ */
+ protected static ResourceDefinition createResourceDefinition(Resource.Type type, Map<Resource.Type, String> mapIds) {
+ ResourceDefinition resourceDefinition;//todo: consider ResourceDependencyManager : Map<Resource.Type, ResourceDefinition>
switch (type) {
case Cluster:
resourceDefinition = new ClusterResourceDefinition();
@@ -52,7 +61,7 @@ public class ResourceInstanceFactoryImpl
break;
case Component:
- resourceDefinition = new ComponentResourceDefinition();
+ resourceDefinition = new ComponentResourceDefinition();
break;
case HostComponent:
@@ -82,27 +91,27 @@ public class ResourceInstanceFactoryImpl
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;
@@ -134,7 +143,6 @@ public class ResourceInstanceFactoryImpl
default:
throw new IllegalArgumentException("Unsupported resource type: " + type);
}
-
- return new ResourceInstanceImpl(mapIds, resourceDefinition, this);
+ return resourceDefinition;
}
}
Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceImpl.java?rev=1493904&r1=1493903&r2=1493904&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceImpl.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceImpl.java Mon Jun 17 19:46:34 2013
@@ -20,24 +20,37 @@
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.api.services.Result;
+import org.apache.ambari.server.api.services.ResultImpl;
+import org.apache.ambari.server.api.util.TreeNode;
+import org.apache.ambari.server.controller.predicate.AndPredicate;
+import org.apache.ambari.server.controller.predicate.EqualsPredicate;
+import org.apache.ambari.server.controller.predicate.OrPredicate;
import org.apache.ambari.server.controller.spi.ClusterController;
+import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
+import org.apache.ambari.server.controller.spi.NoSuchResourceException;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.Request;
import org.apache.ambari.server.controller.spi.Resource;
-import org.apache.ambari.server.controller.utilities.ClusterControllerHelper;
+import org.apache.ambari.server.controller.spi.Schema;
+import org.apache.ambari.server.controller.spi.SystemException;
+import org.apache.ambari.server.controller.spi.TemporalInfo;
+import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
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;
+public class ResourceInstanceImpl implements ResourceInstance, Query{
/**
* Map of primary and foreign keys and values necessary to identify the resource.
@@ -54,31 +67,65 @@ public class ResourceInstanceImpl implem
* Sub-resource instances of this resource.
* Map of resource resource name to resource instance.
*/
- private Map<String, ResourceInstance> m_mapSubResources;
+ private Map<String, ResourceInstanceImpl> m_mapSubResources;
+
+ /**
+ * Sub-resources of the resource which is being operated on.
+ */
+ private Map<String, ResourceInstanceImpl> m_mapQuerySubResources = new HashMap<String, ResourceInstanceImpl>();
+
+ /**
+ * Properties of the query which make up the select portion of the query.
+ */
+ private Set<String> m_setQueryProperties = new HashSet<String>();
/**
- * Factory for creating resource instances.
- * Used to create sub-resource instances.
+ * Indicates that the query should include all available properties.
*/
- private ResourceInstanceFactory m_resourceFactory;
+ private boolean allProperties = false;
/**
- * Cluster controller reference.
+ * Map that associates each property set on the query to temporal data.
*/
- //todo: should be injected.
- private ClusterController m_controller = ClusterControllerHelper.getClusterController();
+ private Map<String, TemporalInfo> m_mapPropertyTemporalInfo = new HashMap<String, TemporalInfo>();
+ /**
+ * Map that associates categories with temporal data.
+ */
+ private Map<String, TemporalInfo> m_mapCategoryTemporalInfo = new HashMap<String, TemporalInfo>();
- public ResourceInstanceImpl(Map<Resource.Type, String> mapIds, ResourceDefinition resourceDefinition,
- ResourceInstanceFactory resourceFactory) {
+ /**
+ * The user supplied predicate.
+ */
+ private Predicate m_userPredicate;
+
+ /**
+ * The associated cluster controller.
+ */
+ private final ClusterController m_controller;
+
+ /**
+ * The logger.
+ */
+ private final static Logger LOG =
+ LoggerFactory.getLogger(ResourceInstanceImpl.class);
+
+
+ // ----- Constructors ------------------------------------------------------
+
+ public ResourceInstanceImpl(Map<Resource.Type, String> mapIds,
+ ResourceDefinition resourceDefinition,
+ ClusterController controller) {
m_resourceDefinition = resourceDefinition;
- m_query = new QueryImpl(this);
- m_resourceFactory = resourceFactory;
+ m_controller = controller;
setIds(mapIds);
}
+
+ // ----- ResourceInstance --------------------------------------------------
+
@Override
public void setIds(Map<Resource.Type, String> mapIds) {
m_mapResourceIds.putAll(mapIds);
@@ -91,7 +138,7 @@ public class ResourceInstanceImpl implem
@Override
public Query getQuery() {
- return m_query;
+ return this;
}
@Override
@@ -99,39 +146,85 @@ public class ResourceInstanceImpl implem
return m_resourceDefinition;
}
-
@Override
public Map<String, ResourceInstance> getSubResources() {
- if (m_mapSubResources == null) {
- m_mapSubResources = new HashMap<String, ResourceInstance>();
- Set<SubResourceDefinition> setSubResourceDefs = getResourceDefinition().getSubResourceDefinitions();
+ return new HashMap<String, ResourceInstance>(ensureSubResources());
+ }
- for (SubResourceDefinition subResDef : setSubResourceDefs) {
- ResourceInstance resource = m_resourceFactory.createResource(subResDef.getType(), getIds());
+ @Override
+ public boolean isCollectionResource() {
+ return getIds().get(getResourceDefinition().getType()) == null;
+ }
- // 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();
+ // ----- Query -------------------------------------------------------------
- m_mapSubResources.put(subResourceName, resource);
+ @Override
+ public void addProperty(String category, String name, TemporalInfo temporalInfo) {
+ if (category == null && name.equals("*")) {
+ // wildcard
+ addAllProperties(temporalInfo);
+ } else{
+ if (addPropertyToSubResource(category, name, temporalInfo)){
+ // add pk/fk properties of the resource to this query
+ Resource.Type resourceType = getResourceDefinition().getType();
+ Schema schema = getClusterController().getSchema(resourceType);
+
+ 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);
+ }
}
}
- return m_mapSubResources;
}
@Override
- public boolean isCollectionResource() {
- return getIds().get(getResourceDefinition().getType()) == null;
+ public void addLocalProperty(String property) {
+ m_setQueryProperties.add(property);
}
@Override
+ public Result execute()
+ throws UnsupportedPropertyException, SystemException, NoSuchResourceException, NoSuchParentResourceException {
+
+ QueryResult queryResult = queryForResources();
+
+ return applyResult(queryResult, null);
+ }
+
+ @Override
+ public Predicate getPredicate() {
+ Predicate internalPredicate = createInternalPredicate(this);
+ if (internalPredicate == null) {
+ return m_userPredicate == null ? null :m_userPredicate;
+
+ } else {
+
+ return m_userPredicate == null ?
+ internalPredicate :
+ new AndPredicate(m_userPredicate, internalPredicate);
+ }
+ }
+
+ @Override
+ public Set<String> getProperties() {
+ return Collections.unmodifiableSet(m_setQueryProperties);
+ }
+
+ @Override
+ public void setUserPredicate(Predicate predicate) {
+ m_userPredicate = predicate;
+ }
+
+
+ // ----- Object overrides --------------------------------------------------
+
+ @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
@@ -139,10 +232,15 @@ public class ResourceInstanceImpl implem
ResourceInstanceImpl that = (ResourceInstanceImpl) o;
return m_mapResourceIds.equals(that.m_mapResourceIds) &&
- m_query == that.m_query &&
- m_resourceDefinition.equals(that.m_resourceDefinition) &&
- m_mapSubResources == null ? that.m_mapSubResources == null :
- m_mapSubResources.equals(that.m_mapSubResources);
+ m_resourceDefinition.equals(that.m_resourceDefinition) &&
+ m_mapSubResources == null ? that.m_mapSubResources == null :
+ m_mapSubResources.equals(that.m_mapSubResources) &&
+ m_mapQuerySubResources == null ? that.m_mapQuerySubResources == null :
+ m_mapQuerySubResources.equals(that.m_mapQuerySubResources) &&
+ m_mapCategoryTemporalInfo.equals(that.m_mapCategoryTemporalInfo) &&
+ m_mapPropertyTemporalInfo.equals(that.m_mapPropertyTemporalInfo) &&
+ m_setQueryProperties.equals(that.m_setQueryProperties) &&
+ m_userPredicate == null ? that.m_userPredicate == null : m_userPredicate.equals(that.m_userPredicate);
}
@Override
@@ -151,6 +249,401 @@ public class ResourceInstanceImpl implem
result = 31 * result + m_mapResourceIds.hashCode();
result = 31 * result + m_resourceDefinition.hashCode();
result = 31 * result + (m_mapSubResources != null ? m_mapSubResources.hashCode() : 0);
+ result = 31 * result + (m_mapQuerySubResources != null ? m_mapQuerySubResources.hashCode() : 0);
+ result = 31 * result + m_setQueryProperties.hashCode();
+ result = 31 * result + m_mapPropertyTemporalInfo.hashCode();
+ result = 31 * result + m_mapCategoryTemporalInfo.hashCode();
+ result = 31 * result + (m_userPredicate != null ? m_userPredicate.hashCode() : 0);
+
+ return result;
+ }
+
+
+ // ----- helper methods ----------------------------------------------------
+
+ /**
+ * Get the associated cluster controller.
+ */
+ protected ClusterController getClusterController() {
+ return m_controller;
+ }
+
+ /**
+ * Query the cluster controller for the associated resources.
+ */
+ private QueryResult queryForResources()
+ throws UnsupportedPropertyException,
+ SystemException,
+ NoSuchResourceException,
+ NoSuchParentResourceException {
+ Set<Resource> resources = new LinkedHashSet<Resource>();
+
+ prepForQuery();
+
+ for (Resource resource : doQuery(getPredicate())) {
+ resources.add(resource);
+ }
+
+ return new QueryResult(resources, queryForSubResources(resources), this);
+ }
+
+ /**
+ * Query the cluster controller for the sub-resources associated with the given resources.
+ */
+ private Map<Resource.Type, QueryResult> queryForSubResources(Set<Resource> resources)
+ throws UnsupportedPropertyException,
+ SystemException,
+ NoSuchResourceException,
+ NoSuchParentResourceException {
+
+ Map<Resource.Type, QueryResult> subResourceMap = new HashMap<Resource.Type, QueryResult>();
+ Map<String, Predicate> predicateMap = getSubResourcePredicates(resources);
+
+ for (Map.Entry<String, ResourceInstanceImpl> entry : m_mapQuerySubResources.entrySet()) {
+ ResourceInstanceImpl subResource = entry.getValue();
+ Set<Resource> subResources = new LinkedHashSet<Resource>();
+
+ prepForQuery();
+
+ for (Resource resource : subResource.doQuery(predicateMap.get(entry.getKey()))) {
+ subResources.add(resource);
+ }
+
+ subResourceMap.put(subResource.getResourceDefinition().getType(),
+ new QueryResult(subResources, subResource.queryForSubResources(subResources), subResource));
+ }
+ return subResourceMap;
+ }
+
+ /**
+ * Populate the properties and sub-resource sets of this resource prior
+ * to running a query.
+ */
+ private void prepForQuery() {
+
+ Resource.Type resourceType = getResourceDefinition().getType();
+
+ if (isCollectionResource()) {
+ addCollectionProperties(resourceType);
+ }
+ Map<String, ResourceInstanceImpl> mapSubResources = m_mapQuerySubResources;
+
+ if (m_setQueryProperties.isEmpty() && mapSubResources.isEmpty()) {
+ //Add sub resource properties for default case where no fields are specified.
+ mapSubResources.putAll(ensureSubResources());
+ }
+ }
+
+ /**
+ * Query the cluster controller for the resources.
+ */
+ private Iterable<Resource> doQuery(Predicate predicate)
+ throws UnsupportedPropertyException,
+ SystemException,
+ NoSuchResourceException,
+ NoSuchParentResourceException {
+
+ Resource.Type resourceType = getResourceDefinition().getType();
+ Request request = createRequest();
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Executing resource query: " + request + " where " + predicate);
+ }
+ return getClusterController().getResources(resourceType, request, predicate);
+ }
+
+ /**
+ * Apply the query result to this resource.
+ */
+ private Result applyResult(QueryResult queryResult, Predicate parentPredicate) {
+ Result result = new ResultImpl(true);
+
+ Map<String, ResourceInstanceImpl> mapSubResources = queryResult.getResourceInstance().m_mapQuerySubResources;
+ ResourceInstanceImpl resourceInstance = queryResult.getResourceInstance();
+
+ if (isCollectionResource()) {
+ result.getResultTree().setProperty("isCollection", "true");
+ }
+
+ TreeNode<Resource> tree = result.getResultTree();
+
+ int count = 1;
+ for (Resource resource : queryResult.getResources()) {
+ if (parentPredicate == null || parentPredicate.evaluate(resource)) {
+ // Add a child node for the resource and provide a unique name
+ TreeNode<Resource> node = tree.addChild(resource, resource.getType() + ":" + count++);
+ for (Map.Entry<String, ResourceInstanceImpl> entry : mapSubResources.entrySet()) {
+ String subResCategory = entry.getKey();
+ ResourceInstanceImpl subResourceInstance = entry.getValue();
+
+ Resource.Type subResourceType = subResourceInstance.getResourceDefinition().getType();
+
+ QueryResult subQueryResult = queryResult.getSubResources().get(subResourceType);
+
+ if (subQueryResult != null) {
+
+ resourceInstance.setParentIdsOnSubResource(resource, subResourceInstance);
+
+ Predicate subPredicate = subResourceInstance.getQuery().getPredicate();
+
+ TreeNode<Resource> childResult = subResourceInstance.applyResult(subQueryResult, subPredicate).getResultTree();
+ childResult.setName(subResCategory);
+ childResult.setProperty("isCollection", "false");
+ node.addChild(childResult);
+ }
+
+ }
+ }
+ }
return result;
}
+
+ /**
+ * Get the map of sub-resources. Lazily construct it if necessary.
+ */
+ private Map<String, ResourceInstanceImpl> ensureSubResources() {
+ if (m_mapSubResources == null) {
+ m_mapSubResources = new HashMap<String, ResourceInstanceImpl>();
+ Set<SubResourceDefinition> setSubResourceDefs = getResourceDefinition().getSubResourceDefinitions();
+
+ for (SubResourceDefinition subResDef : setSubResourceDefs) {
+
+ Map<Resource.Type, String> mapIds = getIds();
+
+ ResourceInstanceImpl resource = new ResourceInstanceImpl(mapIds,
+ ResourceInstanceFactoryImpl.createResourceDefinition(subResDef.getType(), mapIds), m_controller);
+
+ // ensure pk is returned
+ resource.getQuery().addLocalProperty(getClusterController().getSchema(
+ subResDef.getType()).getKeyPropertyId(subResDef.getType()));
+ // add additionally required fk properties
+ for (Resource.Type fkType : subResDef.getAdditionalForeignKeys()) {
+ resource.getQuery().addLocalProperty(getClusterController().getSchema(subResDef.getType()).getKeyPropertyId(fkType));
+ }
+
+ String subResourceName = subResDef.isCollection() ? resource.getResourceDefinition().getPluralName() :
+ resource.getResourceDefinition().getSingularName();
+
+ m_mapSubResources.put(subResourceName, resource);
+ }
+ }
+ return m_mapSubResources;
+ }
+
+ private void addCollectionProperties(Resource.Type resourceType) {
+ Schema schema = getClusterController().getSchema(resourceType);
+ // add pk
+ String property = schema.getKeyPropertyId(resourceType);
+ addProperty(PropertyHelper.getPropertyCategory(property), PropertyHelper.getPropertyName(property), null);
+
+ for (Resource.Type type : getIds().keySet()) {
+ // add fk's
+ String keyPropertyId = schema.getKeyPropertyId(type);
+ if (keyPropertyId != null) {
+ addProperty(PropertyHelper.getPropertyCategory(keyPropertyId),
+ PropertyHelper.getPropertyName(keyPropertyId), null);
+ }
+ }
+ }
+
+ private void addAllProperties(TemporalInfo temporalInfo) {
+ allProperties = true;
+ if (temporalInfo != null) {
+ m_mapCategoryTemporalInfo.put(null, temporalInfo);
+ }
+
+ for (Map.Entry<String, ResourceInstanceImpl> entry : ensureSubResources().entrySet()) {
+ String name = entry.getKey();
+ if (! m_mapQuerySubResources.containsKey(name)) {
+ m_mapQuerySubResources.put(name, entry.getValue());
+ }
+ }
+ }
+
+ private boolean addPropertyToSubResource(String path, String property, TemporalInfo temporalInfo) {
+ // cases:
+ // - path is null, property is path (all sub-resource props will have a path)
+ // - path is single token and prop in non null
+ // (path only will presented as above case with property only)
+ // - path is multi level and prop is non null
+
+ boolean resourceAdded = false;
+ if (path == null) {
+ path = property;
+ property = null;
+ }
+
+ int i = path.indexOf("/");
+ String p = i == -1 ? path : path.substring(0, i);
+
+ ResourceInstanceImpl subResource = ensureSubResources().get(p);
+ if (subResource != null) {
+ m_mapQuerySubResources.put(p, subResource);
+ //todo: handle case of trailing '/' (for example fields=subResource/)
+
+ if (property != null || !path.equals(p)) {
+ //only add if a sub property is set or if a sub category is specified
+ subResource.getQuery().addProperty(i == -1 ? null : path.substring(i + 1), property, temporalInfo);
+ }
+ resourceAdded = true;
+ }
+ 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);
+
+ Set<Predicate> setPredicates = new HashSet<Predicate>();
+ for (Map.Entry<Resource.Type, String> entry : mapResourceIds.entrySet()) {
+ if (entry.getValue() != null) {
+ String keyPropertyId = schema.getKeyPropertyId(entry.getKey());
+ if (keyPropertyId != null) {
+ setPredicates.add(new EqualsPredicate<String>(keyPropertyId, entry.getValue()));
+ }
+ }
+ }
+
+ if (setPredicates.size() == 1) {
+ return setPredicates.iterator().next();
+ } else if (setPredicates.size() > 1) {
+ return new AndPredicate(setPredicates.toArray(new Predicate[setPredicates.size()]));
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Get a map of predicates for the given resource's sub-resources keyed by resource type.
+ */
+ private Map<String, Predicate> getSubResourcePredicates(Set<Resource> resources) {
+ Map<String, Predicate> predicateMap = new HashMap<String, Predicate>();
+
+ for (Resource resource : resources) {
+ for (Map.Entry<String, ResourceInstanceImpl> entry : m_mapQuerySubResources.entrySet()) {
+ ResourceInstanceImpl subResourceInstance = entry.getValue();
+
+ String subResCategory = entry.getKey();
+ Predicate predicate = predicateMap.get(subResCategory);
+
+ setParentIdsOnSubResource(resource, subResourceInstance);
+
+ predicateMap.put(subResCategory, predicate == null ?
+ subResourceInstance.getQuery().getPredicate() :
+ new OrPredicate(predicate, subResourceInstance.getQuery().getPredicate()));
+ }
+ }
+ return predicateMap;
+ }
+
+ /**
+ * Set the parent id values from the given resource on the given sub resource instance.
+ */
+ private void setParentIdsOnSubResource(Resource resource,
+ ResourceInstanceImpl subResourceInstance) {
+
+ Map<Resource.Type, String> mapParentIds = getIds();
+ Map<Resource.Type, String> mapResourceIds = new HashMap<Resource.Type, String>(mapParentIds.size());
+ ClusterController controller = getClusterController();
+
+ 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(controller.getSchema(type).getKeyPropertyId(type));
+ value = o == null ? null : o.toString();
+ }
+ if (value != null) {
+ mapResourceIds.put(type, value);
+ }
+ }
+ String resourceKeyProp = controller.getSchema(resource.getType()).
+ getKeyPropertyId(resource.getType());
+ //todo: shouldn't use toString here
+ mapResourceIds.put(resource.getType(), resource.getPropertyValue(resourceKeyProp).toString());
+ subResourceInstance.setIds(mapResourceIds);
+ }
+
+ /**
+ * Create a request object for this resource.
+ */
+ private Request createRequest() {
+ Set<String> setProperties = new HashSet<String>();
+
+ Map<String, TemporalInfo> mapTemporalInfo = new HashMap<String, TemporalInfo>();
+ TemporalInfo globalTemporalInfo = m_mapCategoryTemporalInfo.get(null);
+
+ for (String group : m_setQueryProperties) {
+ TemporalInfo temporalInfo = m_mapCategoryTemporalInfo.get(group);
+ if (temporalInfo != null) {
+ mapTemporalInfo.put(group, temporalInfo);
+ } else if (globalTemporalInfo != null) {
+ mapTemporalInfo.put(group, globalTemporalInfo);
+ }
+ setProperties.add(group);
+ }
+
+ return PropertyHelper.getReadRequest(allProperties ? Collections.<String>emptySet() : setProperties, mapTemporalInfo);
+ }
+
+
+ // ----- inner classes -----------------------------------------------------
+
+ /**
+ * Holder for the results of a query for resources.
+ */
+ private static class QueryResult {
+
+ /**
+ * The associated ResourceInstanceImpl.
+ */
+ private final ResourceInstanceImpl resourceInstance;
+
+ /**
+ * The set of resources returned from the query for the associated ResourceInstanceImpl.
+ */
+ private final Set<Resource> resources;
+
+ /**
+ * The set of QueryResults for the sub resources.
+ */
+ private final Map<Resource.Type, QueryResult> subResourceMap;
+
+ private QueryResult(Set<Resource> resources,
+ Map<Resource.Type, QueryResult> subResourceMap,
+ ResourceInstanceImpl resourceInstance) {
+ this.resources = resources;
+ this.subResourceMap = subResourceMap;
+ this.resourceInstance = resourceInstance;
+ }
+
+ /**
+ * Get the associated ResourceInstanceImpl.
+ *
+ * @return the assocaited ResourceInstanceImpl
+ */
+ public ResourceInstanceImpl getResourceInstance() {
+ return resourceInstance;
+ }
+
+ /**
+ * Get the resources returned from the query.
+ *
+ * @return the resources returned from the query
+ */
+ public Set<Resource> getResources() {
+ return resources;
+ }
+
+ /**
+ * Get the set of QueryResults for the sub resources.
+ *
+ * @return theset of QueryResults for the sub resources
+ */
+ public Map<Resource.Type, QueryResult> getSubResources() {
+ return subResourceMap;
+ }
+ }
}
Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/AlwaysPredicate.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/AlwaysPredicate.java?rev=1493904&r1=1493903&r2=1493904&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/AlwaysPredicate.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/AlwaysPredicate.java Mon Jun 17 19:46:34 2013
@@ -43,4 +43,12 @@ public class AlwaysPredicate implements
public void accept(PredicateVisitor visitor) {
visitor.acceptAlwaysPredicate(this);
}
+
+
+ // ----- Object overrides --------------------------------------------------
+
+ @Override
+ public String toString() {
+ return "TRUE";
+ }
}
Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/ArrayPredicate.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/ArrayPredicate.java?rev=1493904&r1=1493903&r2=1493904&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/ArrayPredicate.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/ArrayPredicate.java Mon Jun 17 19:46:34 2013
@@ -87,4 +87,28 @@ public abstract class ArrayPredicate imp
}
public abstract String getOperator();
+
+
+ // ----- Object overrides --------------------------------------------------
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+
+ for (Predicate predicate : predicates) {
+
+ boolean arrayPredicate = predicate instanceof ArrayPredicate;
+
+ if (sb.length() > 0) {
+ sb.append(" ").append(getOperator()).append(" ");
+ }
+
+ if (arrayPredicate) {
+ sb.append("(").append(predicate).append(")");
+ } else {
+ sb.append(predicate);
+ }
+ }
+ return sb.toString();
+ }
}
Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/CategoryIsEmptyPredicate.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/CategoryIsEmptyPredicate.java?rev=1493904&r1=1493903&r2=1493904&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/CategoryIsEmptyPredicate.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/CategoryIsEmptyPredicate.java Mon Jun 17 19:46:34 2013
@@ -46,4 +46,11 @@ public class CategoryIsEmptyPredicate ex
Map<String, Object> properties = resource.getPropertiesMap().get(propertyId);
return properties == null ? true : properties.isEmpty();
}
+
+ // ----- Object overrides --------------------------------------------------
+
+ @Override
+ public String toString() {
+ return "isEmpty(" + getPropertyId() + ")";
+ }
}
Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/ComparisonPredicate.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/ComparisonPredicate.java?rev=1493904&r1=1493903&r2=1493904&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/ComparisonPredicate.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/ComparisonPredicate.java Mon Jun 17 19:46:34 2013
@@ -105,4 +105,11 @@ public abstract class ComparisonPredicat
}
public abstract String getOperator();
+
+ // ----- Object overrides --------------------------------------------------
+
+ @Override
+ public String toString() {
+ return getPropertyId() + getOperator() + getValue();
+ }
}
Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/UnaryPredicate.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/UnaryPredicate.java?rev=1493904&r1=1493903&r2=1493904&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/UnaryPredicate.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/controller/predicate/UnaryPredicate.java Mon Jun 17 19:46:34 2013
@@ -63,4 +63,12 @@ public abstract class UnaryPredicate imp
}
public abstract String getOperator();
+
+
+ // ----- Object overrides --------------------------------------------------
+
+ @Override
+ public String toString() {
+ return getOperator() + "(" + getPredicate() + ")";
+ }
}
Modified: incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/TestSuite.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/TestSuite.java?rev=1493904&r1=1493903&r2=1493904&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/TestSuite.java (original)
+++ incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/TestSuite.java Mon Jun 17 19:46:34 2013
@@ -26,7 +26,6 @@ import org.apache.ambari.server.api.hand
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.query.QueryImplTest;
import org.apache.ambari.server.api.resources.ResourceInstanceImplTest;
import org.apache.ambari.server.api.services.*;
import org.apache.ambari.server.api.services.parsers.BodyParseExceptionTest;
@@ -37,7 +36,7 @@ import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({ClusterServiceTest.class, HostServiceTest.class, ServiceServiceTest.class,
- ComponentServiceTest.class, HostComponentServiceTest.class, ReadHandlerTest.class, QueryImplTest.class,
+ ComponentServiceTest.class, HostComponentServiceTest.class, ReadHandlerTest.class,
JsonRequestBodyParserTest.class, CreateHandlerTest.class, UpdateHandlerTest.class, DeleteHandlerTest.class,
PersistenceManagerImplTest.class, GetRequestTest.class, PutRequestTest.class, PostRequestTest.class,
DeleteRequestTest.class, QueryPostRequestTest.class, JsonSerializerTest.class, QueryCreateHandlerTest.class,
Modified: incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ResourceInstanceImplTest.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ResourceInstanceImplTest.java?rev=1493904&r1=1493903&r2=1493904&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ResourceInstanceImplTest.java (original)
+++ incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ResourceInstanceImplTest.java Mon Jun 17 19:46:34 2013
@@ -20,11 +20,19 @@
package org.apache.ambari.server.api.resources;
+import org.apache.ambari.server.api.services.Result;
+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.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -37,6 +45,7 @@ import static org.junit.Assert.assertTru
* ResourceInstanceImpl unit tests.
*/
public class ResourceInstanceImplTest {
+
@Test
public void testIsCollection__True() {
ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
@@ -52,7 +61,7 @@ public class ResourceInstanceImplTest {
replay(resourceDefinition);
//test
- ResourceInstance instance = new ResourceInstanceImpl(mapIds, resourceDefinition, null);
+ ResourceInstance instance = new TestQuery(mapIds, resourceDefinition);
assertTrue(instance.isCollectionResource());
verify(resourceDefinition);
@@ -73,9 +82,295 @@ public class ResourceInstanceImplTest {
replay(resourceDefinition);
//test
- ResourceInstance instance = new ResourceInstanceImpl(mapIds, resourceDefinition, null);
+ ResourceInstance instance = new TestQuery(mapIds, resourceDefinition);
assertFalse(instance.isCollectionResource());
verify(resourceDefinition);
}
+
+ @Test
+ public void testExecute__Cluster_instance_noSpecifiedProps() throws Exception {
+ ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
+
+ Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+ mapIds.put(Resource.Type.Cluster, "cluster");
+
+ // expectations
+ expect(resourceDefinition.getType()).andReturn(Resource.Type.Cluster).anyTimes();
+ Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
+ setChildren.add(new SubResourceDefinition(Resource.Type.Host));
+
+ expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes();
+
+ replay(resourceDefinition);
+
+ //test
+ ResourceInstanceImpl instance = new TestQuery(mapIds, resourceDefinition);
+
+ Result result = instance.execute();
+
+ verify(resourceDefinition);
+
+ TreeNode<Resource> tree = result.getResultTree();
+
+ 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(1, clusterNode.getChildren().size());
+ TreeNode<Resource> hostNode = clusterNode.getChild("hosts");
+ Assert.assertEquals(4, hostNode.getChildren().size());
+ }
+
+ @Test
+ public void testExecute__Host_collection_noSpecifiedProps() throws Exception {
+ ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
+
+ Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+
+ // expectations
+ expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes();
+ Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
+
+ expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes();
+
+ replay(resourceDefinition);
+
+ //test
+ ResourceInstanceImpl instance = new TestQuery(mapIds, resourceDefinition);
+
+ Result result = instance.execute();
+
+ verify(resourceDefinition);
+
+ TreeNode<Resource> tree = result.getResultTree();
+
+ 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());
+
+ hostNode = tree.getChild("Host:2");
+ Assert.assertEquals("Host:2", hostNode.getName());
+ Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
+
+ hostNode = tree.getChild("Host:3");
+ Assert.assertEquals("Host:3", hostNode.getName());
+ Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
+
+ hostNode = tree.getChild("Host:4");
+ Assert.assertEquals("Host:4", hostNode.getName());
+ Assert.assertEquals(Resource.Type.Host, hostNode.getObject().getType());
+ }
+
+ @Test
+ public void testExecute__collection_nullInternalPredicate_nullUserPredicate() throws Exception {
+ ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
+
+ Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+
+ // expectations
+ expect(resourceDefinition.getType()).andReturn(Resource.Type.Cluster).anyTimes();
+ Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
+ setChildren.add(new SubResourceDefinition(Resource.Type.Host));
+
+ expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes();
+
+ replay(resourceDefinition);
+
+ //test
+ ResourceInstanceImpl instance = new TestQuery(mapIds, resourceDefinition);
+
+ Result result = instance.execute();
+
+ verify(resourceDefinition);
+
+ TreeNode<Resource> tree = result.getResultTree();
+
+ 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 testExecute__collection_nullInternalPredicate_nonNullUserPredicate() throws Exception {
+ ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
+
+ Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+ mapIds.put(Resource.Type.Cluster, "cluster");
+
+ // expectations
+ expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes();
+ Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
+
+ expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes();
+
+ replay(resourceDefinition);
+
+ //test
+ ResourceInstanceImpl instance = new TestQuery(mapIds, resourceDefinition);
+
+ PredicateBuilder pb = new PredicateBuilder();
+ Predicate predicate = pb.property("Hosts/host_name").equals("host:2").toPredicate();
+
+ instance.setUserPredicate(predicate);
+
+ Result result = instance.execute();
+
+ verify(resourceDefinition);
+
+ TreeNode<Resource> tree = result.getResultTree();
+
+ 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 testExecute__collection_nonNullInternalPredicate_nonNullUserPredicate() throws Exception {
+ ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
+
+ Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+
+ // expectations
+ expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes();
+ Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
+
+ expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes();
+
+ replay(resourceDefinition);
+
+ //test
+ ResourceInstanceImpl instance = new TestQuery(mapIds, resourceDefinition);
+
+ PredicateBuilder pb = new PredicateBuilder();
+ Predicate predicate = pb.property("Hosts/host_name").equals("host:2").toPredicate();
+
+ instance.setUserPredicate(predicate);
+
+ Result result = instance.execute();
+
+ verify(resourceDefinition);
+
+ TreeNode<Resource> tree = result.getResultTree();
+
+ 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__localProperty() throws Exception {
+ ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
+
+ Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+
+ // expectations
+ expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes();
+ Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
+
+ expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes();
+
+ replay(resourceDefinition);
+
+ //test
+ ResourceInstanceImpl instance = new TestQuery(mapIds, resourceDefinition);
+
+ instance.addLocalProperty("c1/p1");
+
+ Result result = instance.execute();
+
+ verify(resourceDefinition);
+
+ TreeNode<Resource> tree = result.getResultTree();
+
+ 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"));
+
+ 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"));
+
+ 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"));
+
+ 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__allCategoryProperties() throws Exception {
+ ResourceDefinition resourceDefinition = createNiceMock(ResourceDefinition.class);
+
+ Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+
+ // expectations
+ expect(resourceDefinition.getType()).andReturn(Resource.Type.Host).anyTimes();
+ Set<SubResourceDefinition> setChildren = new HashSet<SubResourceDefinition>();
+
+ expect(resourceDefinition.getSubResourceDefinitions()).andReturn(setChildren).anyTimes();
+
+ replay(resourceDefinition);
+
+ //test
+ ResourceInstanceImpl instance = new TestQuery(mapIds, resourceDefinition);
+
+ instance.addLocalProperty("c1");
+
+ Result result = instance.execute();
+
+ verify(resourceDefinition);
+
+ TreeNode<Resource> tree = result.getResultTree();
+
+ 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"));
+
+ 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"));
+
+ 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"));
+
+ 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"));
+ }
+
+ private class TestQuery extends ResourceInstanceImpl {
+ public TestQuery(Map<Resource.Type, String> mapIds, ResourceDefinition resourceDefinition) {
+ super(mapIds, resourceDefinition,
+ new ClusterControllerImpl(new ClusterControllerImplTest.TestProviderModule()));
+ }
+ }
}
+
Modified: incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java?rev=1493904&r1=1493903&r2=1493904&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java (original)
+++ incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java Mon Jun 17 19:46:34 2013
@@ -83,13 +83,6 @@ public class ClusterControllerImplTest {
propertyProviders.add(propertyProvider);
}
- private static final Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
-
- static {
- keyPropertyIds.put(Resource.Type.Cluster, PropertyHelper.getPropertyId("Hosts", "cluster_name"));
- keyPropertyIds.put(Resource.Type.Host, PropertyHelper.getPropertyId("Hosts", "host_name"));
- }
-
private static final Set<String> resourceProviderProperties = new HashSet<String>();
static {
@@ -99,6 +92,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
@@ -240,7 +237,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>>();
@@ -255,7 +252,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());
}
@@ -286,7 +283,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>();
@@ -300,7 +297,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());
}
@@ -352,7 +349,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>();
@@ -366,7 +363,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));
@@ -379,14 +376,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());
}
@@ -409,14 +406,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));
@@ -471,12 +468,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
@@ -491,10 +492,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 {
@@ -506,6 +566,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");
@@ -550,11 +613,6 @@ public class ClusterControllerImplTest {
return Collections.emptySet();
}
- @Override
- public Map<Resource.Type, String> getKeyPropertyIds() {
- return keyPropertyIds;
- }
-
public Action getLastAction() {
return lastAction;
}