http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentConfigurationResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentConfigurationResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentConfigurationResourceProvider.java
new file mode 100644
index 0000000..ea9cf4f
--- /dev/null
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentConfigurationResourceProvider.java
@@ -0,0 +1,476 @@
+/*
+ * 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.controller.internal;
+
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.RootComponent;
+import org.apache.ambari.server.controller.RootService;
+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.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
+import org.apache.ambari.server.controller.spi.SystemException;
+import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
+import org.apache.ambari.server.controller.utilities.PredicateHelper;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.apache.ambari.server.events.AmbariConfigurationChangedEvent;
+import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
+import org.apache.ambari.server.orm.dao.AmbariConfigurationDAO;
+import org.apache.ambari.server.orm.entities.AmbariConfigurationEntity;
+import org.apache.ambari.server.security.authorization.RoleAuthorization;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.inject.Inject;
+
+public class RootServiceComponentConfigurationResourceProvider extends 
AbstractAuthorizedResourceProvider {
+
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(RootServiceComponentConfigurationResourceProvider.class);
+
+  static final String RESOURCE_KEY = "Configuration";
+
+  static final String CONFIGURATION_CATEGORY_PROPERTY_ID = 
PropertyHelper.getPropertyId(RESOURCE_KEY, "category");
+  static final String CONFIGURATION_PROPERTIES_PROPERTY_ID = 
PropertyHelper.getPropertyId(RESOURCE_KEY, "properties");
+  static final String CONFIGURATION_COMPONENT_NAME_PROPERTY_ID = 
PropertyHelper.getPropertyId(RESOURCE_KEY, "component_name");
+  static final String CONFIGURATION_SERVICE_NAME_PROPERTY_ID = 
PropertyHelper.getPropertyId(RESOURCE_KEY, "service_name");
+
+  private static final Set<String> PROPERTIES;
+
+  private static final Map<Resource.Type, String> PK_PROPERTY_MAP;
+
+  private static final Set<String> PK_PROPERTY_IDS;
+
+  static {
+    Set<String> set = new HashSet<>();
+    set.add(CONFIGURATION_SERVICE_NAME_PROPERTY_ID);
+    set.add(CONFIGURATION_COMPONENT_NAME_PROPERTY_ID);
+    set.add(CONFIGURATION_CATEGORY_PROPERTY_ID);
+    set.add(CONFIGURATION_PROPERTIES_PROPERTY_ID);
+
+    PROPERTIES = Collections.unmodifiableSet(set);
+
+    Map<Resource.Type, String> map = new HashMap<>();
+    map.put(Resource.Type.RootService, CONFIGURATION_SERVICE_NAME_PROPERTY_ID);
+    map.put(Resource.Type.RootServiceComponent, 
CONFIGURATION_COMPONENT_NAME_PROPERTY_ID);
+    map.put(Resource.Type.RootServiceComponentConfiguration, 
CONFIGURATION_CATEGORY_PROPERTY_ID);
+
+    PK_PROPERTY_MAP = Collections.unmodifiableMap(map);
+    PK_PROPERTY_IDS = Collections.unmodifiableSet(new 
HashSet<>(PK_PROPERTY_MAP.values()));
+  }
+
+  @Inject
+  private AmbariConfigurationDAO ambariConfigurationDAO;
+
+  @Inject
+  private AmbariEventPublisher publisher;
+
+  public RootServiceComponentConfigurationResourceProvider() {
+    super(PROPERTIES, PK_PROPERTY_MAP);
+
+    Set<RoleAuthorization> authorizations = 
EnumSet.of(RoleAuthorization.AMBARI_MANAGE_CONFIGURATION);
+    setRequiredCreateAuthorizations(authorizations);
+    setRequiredDeleteAuthorizations(authorizations);
+    setRequiredUpdateAuthorizations(authorizations);
+    setRequiredGetAuthorizations(authorizations);
+  }
+
+  @Override
+  protected Set<String> getPKPropertyIds() {
+    return PK_PROPERTY_IDS;
+  }
+
+  @Override
+  public RequestStatus createResourcesAuthorized(Request request)
+      throws SystemException, UnsupportedPropertyException, 
ResourceAlreadyExistsException, NoSuchParentResourceException {
+
+    createOrAddProperties(null, null, null, request.getProperties(), true);
+
+    return getRequestStatus(null);
+  }
+
+  @Override
+  protected Set<Resource> getResourcesAuthorized(Request request, Predicate 
predicate) throws SystemException,
+      UnsupportedPropertyException, NoSuchResourceException, 
NoSuchParentResourceException {
+
+    return getResources(new Command<Set<Resource>>() {
+      @Override
+      public Set<Resource> invoke() throws AmbariException {
+        Set<Resource> resources = new HashSet<>();
+        Set<String> requestedIds = getRequestPropertyIds(request, predicate);
+
+        if (CollectionUtils.isEmpty(requestedIds)) {
+          requestedIds = PROPERTIES;
+        }
+
+        if (predicate == null) {
+          Set<Resource> _resources;
+          try {
+            _resources = getConfigurationResources(requestedIds, null);
+          } catch (NoSuchResourceException e) {
+            throw new AmbariException(e.getMessage(), e);
+          }
+
+          if (!CollectionUtils.isEmpty(_resources)) {
+            resources.addAll(_resources);
+          }
+        } else {
+          for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
+            Set<Resource> _resources;
+            try {
+              _resources = getConfigurationResources(requestedIds, 
propertyMap);
+            } catch (NoSuchResourceException e) {
+              throw new AmbariException(e.getMessage(), e);
+            }
+
+            if (!CollectionUtils.isEmpty(_resources)) {
+              resources.addAll(_resources);
+            }
+          }
+        }
+
+        return resources;
+      }
+    });
+  }
+
+
+  @Override
+  protected RequestStatus deleteResourcesAuthorized(Request request, Predicate 
predicate) throws SystemException,
+      UnsupportedPropertyException, NoSuchResourceException, 
NoSuchParentResourceException {
+
+    String serviceName = (String) 
PredicateHelper.getProperties(predicate).get(CONFIGURATION_SERVICE_NAME_PROPERTY_ID);
+    String componentName = (String) 
PredicateHelper.getProperties(predicate).get(CONFIGURATION_COMPONENT_NAME_PROPERTY_ID);
+    String categoryName = (String) 
PredicateHelper.getProperties(predicate).get(CONFIGURATION_CATEGORY_PROPERTY_ID);
+
+    ConfigurationHandler handler = getConfigurationHandler(serviceName, 
componentName);
+    if (handler != null) {
+      handler.removeConfiguration(categoryName);
+    } else {
+      throw new SystemException(String.format("Configurations may not be 
updated for the %s component of the root service %s", componentName, 
serviceName));
+    }
+
+    return getRequestStatus(null);
+  }
+
+  @Override
+  protected RequestStatus updateResourcesAuthorized(Request request, Predicate 
predicate)
+      throws SystemException, UnsupportedPropertyException, 
NoSuchResourceException, NoSuchParentResourceException {
+
+    String serviceName = (String) 
PredicateHelper.getProperties(predicate).get(CONFIGURATION_SERVICE_NAME_PROPERTY_ID);
+    String componentName = (String) 
PredicateHelper.getProperties(predicate).get(CONFIGURATION_COMPONENT_NAME_PROPERTY_ID);
+    String categoryName = (String) 
PredicateHelper.getProperties(predicate).get(CONFIGURATION_CATEGORY_PROPERTY_ID);
+
+    createOrAddProperties(serviceName, componentName, categoryName, 
request.getProperties(), false);
+
+    return getRequestStatus(null);
+  }
+
+  private Resource toResource(String serviceName, String componentName, String 
categoryName, Map<String, String> properties, Set<String> requestedIds) {
+    Resource resource = new 
ResourceImpl(Resource.Type.RootServiceComponentConfiguration);
+    setResourceProperty(resource, CONFIGURATION_SERVICE_NAME_PROPERTY_ID, 
serviceName, requestedIds);
+    setResourceProperty(resource, CONFIGURATION_COMPONENT_NAME_PROPERTY_ID, 
componentName, requestedIds);
+    setResourceProperty(resource, CONFIGURATION_CATEGORY_PROPERTY_ID, 
categoryName, requestedIds);
+    setResourceProperty(resource, CONFIGURATION_PROPERTIES_PROPERTY_ID, 
properties, requestedIds);
+    return resource;
+  }
+
+  /**
+   * Retrieves groups of properties from the request data and create or 
updates them as needed.
+   * <p>
+   * Each group of properties is expected to have a category 
(<code>AmbariConfiguration/category</code>)
+   * value and one or more property 
(<code>AmbariConfiguration/properties/property.name</code>) values.
+   * If a category cannot be determined from the propery set, the default 
category value (passed in)
+   * is used.  If a default category is set, it is assumed that it was parsed 
from the request predicate
+   * (if availabe).
+   *
+   * @param defaultServiceName             the default service name to use if 
needed
+   * @param defaultComponentName           the default component name to use 
if needed
+   * @param defaultCategoryName            the default category to use if 
needed
+   * @param requestProperties              a collection of property maps 
parsed from the request
+   * @param removePropertiesIfNotSpecified <code>true</code> to remove 
existing properties that have not been specifed in the request;
+   *                                       <code>false</code> append or update 
the existing set of properties with values from the request
+   * @throws SystemException if an error occurs saving the configuration data
+   */
+  private void createOrAddProperties(String defaultServiceName, String 
defaultComponentName, String defaultCategoryName,
+                                     Set<Map<String, Object>> 
requestProperties, boolean removePropertiesIfNotSpecified)
+      throws SystemException {
+    // set of resource properties (each entry in the set belongs to a 
different resource)
+    if (requestProperties != null) {
+      for (Map<String, Object> resourceProperties : requestProperties) {
+        RequestDetails requestDetails = parseProperties(defaultServiceName, 
defaultComponentName, defaultCategoryName, resourceProperties);
+
+        ConfigurationHandler handler = 
getConfigurationHandler(requestDetails.serviceName, 
requestDetails.componentName);
+
+        if (handler != null) {
+          handler.updateCategory(requestDetails.categoryName, 
requestDetails.properties, removePropertiesIfNotSpecified);
+        } else {
+          throw new SystemException(String.format("Configurations may not be 
updated for the %s component of the root service, %s", 
requestDetails.serviceName, requestDetails.componentName));
+        }
+      }
+    }
+  }
+
+  /**
+   * Parse the property map from a request into a map of services to 
components to category names to maps of property names and values.
+   *
+   * @param defaultServiceName   the default service name to use if one is not 
found in the map of properties
+   * @param defaultComponentName the default component name to use if one is 
not found in the map of properties
+   * @param defaultCategoryName  the default category name to use if one is 
not found in the map of properties
+   * @param resourceProperties   a map of properties from a request item   
@return a map of category names to maps of name/value pairs
+   * @throws SystemException if an issue with the data is determined
+   */
+  private RequestDetails parseProperties(String defaultServiceName, String 
defaultComponentName, String defaultCategoryName, Map<String, Object> 
resourceProperties) throws SystemException {
+    String serviceName = defaultServiceName;
+    String componentName = defaultComponentName;
+    String categoryName = defaultCategoryName;
+    Map<String, String> properties = new HashMap<>();
+
+    for (Map.Entry<String, Object> entry : resourceProperties.entrySet()) {
+      String propertyName = entry.getKey();
+
+      if (CONFIGURATION_CATEGORY_PROPERTY_ID.equals(propertyName)) {
+        if (entry.getValue() instanceof String) {
+          categoryName = (String) entry.getValue();
+        }
+      } else if 
(CONFIGURATION_COMPONENT_NAME_PROPERTY_ID.equals(propertyName)) {
+        if (entry.getValue() instanceof String) {
+          componentName = (String) entry.getValue();
+        }
+      } else if (CONFIGURATION_SERVICE_NAME_PROPERTY_ID.equals(propertyName)) {
+        if (entry.getValue() instanceof String) {
+          serviceName = (String) entry.getValue();
+        }
+      } else {
+        String propertyCategory = 
PropertyHelper.getPropertyCategory(entry.getKey());
+        if ((propertyCategory != null) && 
propertyCategory.equals(CONFIGURATION_PROPERTIES_PROPERTY_ID)) {
+          String name = PropertyHelper.getPropertyName(entry.getKey());
+          Object value = entry.getValue();
+          properties.put(name, (value == null) ? null : value.toString());
+        }
+      }
+    }
+
+    if (StringUtils.isEmpty(serviceName)) {
+      throw new SystemException("The service name must be set");
+    }
+
+    if (StringUtils.isEmpty(componentName)) {
+      throw new SystemException("The component name must be set");
+    }
+
+    if (StringUtils.isEmpty(categoryName)) {
+      throw new SystemException("The configuration category must be set");
+    }
+
+    if (properties.isEmpty()) {
+      throw new SystemException("The configuration properties must be set");
+    }
+
+    return new RequestDetails(serviceName, componentName, categoryName, 
properties);
+  }
+
+  /**
+   * Retrieves the requested configration resources
+   *
+   * @param requestedIds the requested properties ids
+   * @param propertyMap  the request properties
+   * @return a set of resources built from the found data
+   * @throws NoSuchResourceException if the requested resource was not found
+   */
+  private Set<Resource> getConfigurationResources(Set<String> requestedIds, 
Map<String, Object> propertyMap) throws NoSuchResourceException {
+    Set<Resource> resources = new HashSet<>();
+
+    String serviceName = getStringProperty(propertyMap, 
CONFIGURATION_SERVICE_NAME_PROPERTY_ID);
+    String componentName = getStringProperty(propertyMap, 
CONFIGURATION_COMPONENT_NAME_PROPERTY_ID);
+
+    ConfigurationHandler handler = getConfigurationHandler(serviceName, 
componentName);
+
+    if (handler != null) {
+      String categoryName = getStringProperty(propertyMap, 
CONFIGURATION_CATEGORY_PROPERTY_ID);
+      Map<String, Map<String, String>> configurations = 
handler.getConfigurations(categoryName);
+
+      if (configurations != null) {
+        for (Map.Entry<String, Map<String, String>> entry : 
configurations.entrySet()) {
+          resources.add(toResource(serviceName, componentName, entry.getKey(), 
entry.getValue(), requestedIds));
+        }
+      }
+    }
+
+    return resources;
+  }
+
+  /**
+   * Returns the internal configuration handler used to support various 
configuration storage facilites.
+   *
+   * @param serviceName   the service name
+   * @param componentName the component name
+   * @return
+   */
+  private ConfigurationHandler getConfigurationHandler(String serviceName, 
String componentName) {
+    if (RootService.AMBARI.name().equals(serviceName)) {
+      if (RootComponent.AMBARI_SERVER.name().equals(componentName)) {
+        return new AmbariServerConfigurationHandler();
+      }
+    }
+
+    return null;
+  }
+
+
+  private String getStringProperty(Map<String, Object> propertyMap, String 
propertyId) {
+    String value = null;
+
+    if (propertyMap != null) {
+      Object o = propertyMap.get(propertyId);
+      if (o instanceof String) {
+        value = (String) o;
+      }
+    }
+
+    return value;
+  }
+
+  /**
+   * ConfigurationHandler is an interface to be implemented to support the 
relevant types of storage
+   * used to persist root-level component configurations.
+   */
+  private abstract class ConfigurationHandler {
+    /**
+     * Retrieve the request configurations.
+     *
+     * @param categoryName the category name (or <code>null</code> for all)
+     * @return a map of category names to properties (name/value pairs).
+     * @throws NoSuchResourceException if the requested data is not found
+     */
+    public abstract Map<String, Map<String, String>> getConfigurations(String 
categoryName) throws NoSuchResourceException;
+
+    /**
+     * Delete the requested configuration.
+     *
+     * @param categoryName the category name
+     * @throws NoSuchResourceException if the requested category does not exist
+     */
+    public abstract void removeConfiguration(String categoryName) throws 
NoSuchResourceException;
+
+    /**
+     * Set or update a configuration category with the specified properties.
+     * <p>
+     * If <code>removePropertiesIfNotSpecified</code> is <code>true</code>, 
the persisted category is to include only the specified properties.
+     * <p>
+     * If <code>removePropertiesIfNotSpecified</code> is <code>false</code>, 
the persisted category is to include the union of the existing and specified 
properties.
+     * <p>
+     * In any case, existing property values will be overwritten by the one 
specified in the property map.
+     *
+     * @param categoryName                   the category name
+     * @param properties                     a map of properties to set
+     * @param removePropertiesIfNotSpecified <code>true</code> to ensure the 
set of properties are only those that have be explicitly specified;
+     *                                       <code>false</code> to update the 
set of exising properties with the specified set of properties, adding missing 
properties but not removing any properties
+     */
+    public abstract void updateCategory(String categoryName, Map<String, 
String> properties, boolean removePropertiesIfNotSpecified);
+  }
+
+  /**
+   * AmbariServerConfigurationHandler handle Ambari server specific 
configuration properties.
+   */
+  private class AmbariServerConfigurationHandler extends ConfigurationHandler {
+    @Override
+    public Map<String, Map<String, String>> getConfigurations(String 
categoryName)
+        throws NoSuchResourceException {
+      Map<String, Map<String, String>> configurations = null;
+
+      List<AmbariConfigurationEntity> entities = (categoryName == null)
+          ? ambariConfigurationDAO.findAll()
+          : ambariConfigurationDAO.findByCategory(categoryName);
+
+      if (entities != null) {
+        configurations = new HashMap<>();
+
+        for (AmbariConfigurationEntity entity : entities) {
+          String category = entity.getCategoryName();
+          Map<String, String> properties = configurations.get(category);
+
+          if (properties == null) {
+            properties = new TreeMap<>();
+            configurations.put(category, properties);
+          }
+
+          properties.put(entity.getPropertyName(), entity.getPropertyValue());
+        }
+      }
+
+      return configurations;
+    }
+
+    @Override
+    public void removeConfiguration(String categoryName) throws 
NoSuchResourceException {
+      if (null == categoryName) {
+        LOGGER.debug("No resource id provided in the request");
+      } else {
+        LOGGER.debug("Deleting Ambari configuration with id: {}", 
categoryName);
+        try {
+          if (ambariConfigurationDAO.removeByCategory(categoryName) > 0) {
+            publisher.publish(new 
AmbariConfigurationChangedEvent(categoryName));
+          }
+        } catch (IllegalStateException e) {
+          throw new NoSuchResourceException(e.getMessage());
+        }
+      }
+    }
+
+    @Override
+    public void updateCategory(String categoryName, Map<String, String> 
properties, boolean removePropertiesIfNotSpecified) {
+      if (ambariConfigurationDAO.reconcileCategory(categoryName, properties, 
removePropertiesIfNotSpecified)) {
+        // notify subscribers about the configuration changes
+        publisher.publish(new AmbariConfigurationChangedEvent(categoryName));
+      }
+    }
+  }
+
+  /**
+   * RequestDetails is a container for details parsed from the request.
+   */
+  private class RequestDetails {
+    final String serviceName;
+    final String componentName;
+    final String categoryName;
+    final Map<String, String> properties;
+
+    private RequestDetails(String serviceName, String componentName, String 
categoryName, Map<String, String> properties) {
+      this.serviceName = serviceName;
+      this.componentName = componentName;
+      this.categoryName = categoryName;
+      this.properties = properties;
+    }
+  }
+}
+

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentPropertyProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentPropertyProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentPropertyProvider.java
index 433c1fa..b5bbc94 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentPropertyProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentPropertyProvider.java
@@ -29,7 +29,7 @@ import java.util.Set;
 
 import javax.crypto.Cipher;
 
-import org.apache.ambari.server.controller.RootServiceResponseFactory;
+import org.apache.ambari.server.controller.RootComponent;
 import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.spi.PropertyProvider;
 import org.apache.ambari.server.controller.spi.Request;
@@ -126,7 +126,7 @@ public class RootServiceComponentPropertyProvider extends 
BaseProvider implement
 
     for (Resource resource : resources) {
       // If this resource represents the AMBARI_SERVER component, handle it's 
specific properties...
-      if 
(RootServiceResponseFactory.Components.AMBARI_SERVER.name().equals(resource.getPropertyValue(RootServiceComponentResourceProvider.COMPONENT_NAME_PROPERTY_ID)))
 {
+      if 
(RootComponent.AMBARI_SERVER.name().equals(resource.getPropertyValue(RootServiceComponentResourceProvider.COMPONENT_NAME_PROPERTY_ID)))
 {
         // Attempt to fill in the cipher details only if explicitly asked for.
         if (requestedIds.contains(JCE_POLICY_PROPERTY_ID) || 
requestedIds.contains(CIPHER_PROPERTIES_PROPERTY_ID)) {
           setCipherDetails(resource, requestedIds);

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
index 3925aeb..dfca00e 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
@@ -25,9 +25,9 @@ import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.RootComponent;
 import org.apache.ambari.server.controller.RootServiceComponentRequest;
 import org.apache.ambari.server.controller.RootServiceComponentResponse;
-import 
org.apache.ambari.server.controller.RootServiceResponseFactory.Components;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
 import org.apache.ambari.server.controller.spi.NoSuchResourceException;
 import org.apache.ambari.server.controller.spi.Predicate;
@@ -99,7 +99,7 @@ public class RootServiceComponentResourceProvider extends 
ReadOnlyResourceProvid
       setResourceProperty(resource, PROPERTIES_PROPERTY_ID, 
response.getProperties(), requestedIds);
       setResourceProperty(resource, COMPONENT_VERSION_PROPERTY_ID, 
response.getComponentVersion(), requestedIds);
       
-      if (Components.AMBARI_SERVER.name().equals(response.getComponentName())) 
{
+      if 
(RootComponent.AMBARI_SERVER.name().equals(response.getComponentName())) {
         setResourceProperty(resource, SERVER_CLOCK_PROPERTY_ID, 
response.getServerClock(), requestedIds);
       }      
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
index 7835373..90e0315 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
@@ -110,6 +110,7 @@ public interface Resource {
     TaskAttempt,
     RootService,
     RootServiceComponent,
+    RootServiceComponentConfiguration,
     RootServiceHostComponent,
     View,
     ViewURL,
@@ -160,8 +161,7 @@ public interface Resource {
     VersionDefinition,
     ClusterKerberosDescriptor,
     LoggingQuery,
-    RemoteCluster,
-    AmbariConfiguration;
+    RemoteCluster;
 
     /**
      * Get the {@link Type} that corresponds to this InternalType.
@@ -232,6 +232,7 @@ public interface Resource {
     public static final Type TaskAttempt = InternalType.TaskAttempt.getType();
     public static final Type RootService = InternalType.RootService.getType();
     public static final Type RootServiceComponent = 
InternalType.RootServiceComponent.getType();
+    public static final Type RootServiceComponentConfiguration = 
InternalType.RootServiceComponentConfiguration.getType();
     public static final Type RootServiceHostComponent = 
InternalType.RootServiceHostComponent.getType();
     public static final Type View = InternalType.View.getType();
     public static final Type ViewURL = InternalType.ViewURL.getType();
@@ -283,7 +284,6 @@ public interface Resource {
     public static final Type ClusterKerberosDescriptor = 
InternalType.ClusterKerberosDescriptor.getType();
     public static final Type LoggingQuery = 
InternalType.LoggingQuery.getType();
     public static final Type RemoteCluster = 
InternalType.RemoteCluster.getType();
-    public static final Type AmbariConfiguration = 
InternalType.AmbariConfiguration.getType();
 
 
     /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertReceivedListener.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertReceivedListener.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertReceivedListener.java
index 266c7e8..7198814 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertReceivedListener.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertReceivedListener.java
@@ -26,8 +26,8 @@ import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.EagerSingleton;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.MaintenanceStateHelper;
-import 
org.apache.ambari.server.controller.RootServiceResponseFactory.Components;
-import org.apache.ambari.server.controller.RootServiceResponseFactory.Services;
+import org.apache.ambari.server.controller.RootComponent;
+import org.apache.ambari.server.controller.RootService;
 import org.apache.ambari.server.events.AlertEvent;
 import org.apache.ambari.server.events.AlertReceivedEvent;
 import org.apache.ambari.server.events.AlertStateChangeEvent;
@@ -434,9 +434,9 @@ public class AlertReceivedListener {
     String hostName = alert.getHostName();
 
     // AMBARI/AMBARI_SERVER is always a valid service/component combination
-    String ambariServiceName = Services.AMBARI.name();
-    String ambariServerComponentName = Components.AMBARI_SERVER.name();
-    String ambariAgentComponentName = Components.AMBARI_AGENT.name();
+    String ambariServiceName = RootService.AMBARI.name();
+    String ambariServerComponentName = RootComponent.AMBARI_SERVER.name();
+    String ambariAgentComponentName = RootComponent.AMBARI_AGENT.name();
     if (ambariServiceName.equals(serviceName) && 
ambariServerComponentName.equals(componentName)) {
       return true;
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertStateChangedListener.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertStateChangedListener.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertStateChangedListener.java
index d5dc530..8701b6d 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertStateChangedListener.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertStateChangedListener.java
@@ -24,7 +24,7 @@ import java.util.UUID;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.EagerSingleton;
-import org.apache.ambari.server.controller.RootServiceResponseFactory.Services;
+import org.apache.ambari.server.controller.RootService;
 import org.apache.ambari.server.events.AlertStateChangeEvent;
 import org.apache.ambari.server.events.publishers.AlertEventPublisher;
 import org.apache.ambari.server.orm.dao.AlertDispatchDAO;
@@ -67,7 +67,7 @@ import com.google.inject.Singleton;
  * <ul>
  * <li>If {@link AlertTargetEntity#isEnabled()} is {@code false}
  * <li>If the cluster is upgrading or the upgrade is suspended, only
- * {@link Services#AMBARI} alerts will be dispatched.
+ * {@link RootService#AMBARI} alerts will be dispatched.
  * </ul>
  */
 @Singleton
@@ -230,7 +230,7 @@ public class AlertStateChangedListener {
       if (null != cluster.getUpgradeInProgress()) {
         // only send AMBARI alerts if in an upgrade
         String serviceName = definition.getServiceName();
-        if (!StringUtils.equals(serviceName, Services.AMBARI.name())) {
+        if (!StringUtils.equals(serviceName, RootService.AMBARI.name())) {
           LOG.debug(
               "Skipping alert notifications for {} because the cluster is 
upgrading",
               definition.getDefinitionName(), target);

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/ldap/domain/AmbariLdapConfiguration.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/ldap/domain/AmbariLdapConfiguration.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/ldap/domain/AmbariLdapConfiguration.java
index 0c1ec0a..6c466ba 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/ldap/domain/AmbariLdapConfiguration.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/ldap/domain/AmbariLdapConfiguration.java
@@ -33,7 +33,7 @@ public class AmbariLdapConfiguration {
 
   private static final Logger LOGGER = 
LoggerFactory.getLogger(AmbariLdapConfiguration.class);
 
-  private final Map<String, Object> configurationMap;
+  private final Map<String, String> configurationMap;
 
   private Object configValue(AmbariLdapConfigKeys ambariLdapConfigKeys) {
     Object value = null;
@@ -45,13 +45,13 @@ public class AmbariLdapConfiguration {
     return value;
   }
 
-  public void setValueFor(AmbariLdapConfigKeys ambariLdapConfigKeys, Object 
value) {
+  public void setValueFor(AmbariLdapConfigKeys ambariLdapConfigKeys, String 
value) {
     configurationMap.put(ambariLdapConfigKeys.key(), value);
   }
 
   // intentionally package private, instances to be created through the factory
   @Inject
-  AmbariLdapConfiguration(@Assisted Map<String, Object> configuration) {
+  AmbariLdapConfiguration(@Assisted Map<String, String> configuration) {
     this.configurationMap = configuration;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/ldap/domain/AmbariLdapConfigurationFactory.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/ldap/domain/AmbariLdapConfigurationFactory.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/ldap/domain/AmbariLdapConfigurationFactory.java
index 2b9f24b..aafd204 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/ldap/domain/AmbariLdapConfigurationFactory.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/ldap/domain/AmbariLdapConfigurationFactory.java
@@ -30,5 +30,5 @@ public interface AmbariLdapConfigurationFactory {
    * @param configuration a map where keys are the configuration properties 
and values are the configuration values
    * @return an AmbariLdapConfiguration instance
    */
-  AmbariLdapConfiguration createLdapConfiguration(Map<String, Object> 
configuration);
+  AmbariLdapConfiguration createLdapConfiguration(Map<String, String> 
configuration);
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapConfigurationProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapConfigurationProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapConfigurationProvider.java
index b32d1ed..ac9c1bc 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapConfigurationProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapConfigurationProvider.java
@@ -84,7 +84,7 @@ public class AmbariLdapConfigurationProvider implements 
Provider<AmbariLdapConfi
     configEntities = 
ambariConfigurationDAOProvider.get().findByCategory("ldap-configuration");
 
     if (configEntities != null) {
-      Map<String, Object> properties = toProperties(configEntities);
+      Map<String, String> properties = toProperties(configEntities);
       instance = ldapConfigurationFactory.createLdapConfiguration(properties);
     }
 
@@ -93,8 +93,8 @@ public class AmbariLdapConfigurationProvider implements 
Provider<AmbariLdapConfi
     return instance;
   }
 
-  private Map<String, Object> toProperties(List<AmbariConfigurationEntity> 
configEntities) {
-    Map<String, Object> map = new HashMap<>();
+  private Map<String, String> toProperties(List<AmbariConfigurationEntity> 
configEntities) {
+    Map<String, String> map = new HashMap<>();
 
     for (AmbariConfigurationEntity entity : configEntities) {
       map.put(entity.getPropertyName(), entity.getPropertyValue());

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/metadata/AmbariServiceAlertDefinitions.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/metadata/AmbariServiceAlertDefinitions.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/metadata/AmbariServiceAlertDefinitions.java
index 1e20571..d6b0c99 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/metadata/AmbariServiceAlertDefinitions.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/metadata/AmbariServiceAlertDefinitions.java
@@ -23,8 +23,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
-import 
org.apache.ambari.server.controller.RootServiceResponseFactory.Components;
-import org.apache.ambari.server.controller.RootServiceResponseFactory.Services;
+import org.apache.ambari.server.controller.RootComponent;
+import org.apache.ambari.server.controller.RootService;
 import org.apache.ambari.server.state.alert.AlertDefinition;
 import org.apache.ambari.server.state.alert.AlertDefinitionFactory;
 import org.slf4j.Logger;
@@ -36,7 +36,7 @@ import com.google.inject.Singleton;
 /**
  * The {@link AmbariServiceAlertDefinitions} class is used to represent the
  * alerts defined in {@code alerts.json} which are for
- * {@link Components#AMBARI_AGENT} and {@link Components#AMBARI_SERVER}. These
+ * {@link RootComponent#AMBARI_AGENT} and {@link RootComponent#AMBARI_SERVER}. 
These
  * alerts are bound to the host and are not part of a cluster or hadoop 
service.
  */
 @Singleton
@@ -67,7 +67,7 @@ public class AmbariServiceAlertDefinitions {
    * Gets all of the {@link AlertDefinition}s that exist on the path for all
    * agent hosts.
    *
-   * @return the alerts with {@link Components#AMBARI_AGENT} as the component
+   * @return the alerts with {@link RootComponent#AMBARI_AGENT} as the 
component
    *         and {@code AMBARI} as the service.
    */
   public List<AlertDefinition> getAgentDefinitions() {
@@ -75,15 +75,15 @@ public class AmbariServiceAlertDefinitions {
       return m_agentDefinitions;
     }
 
-    m_agentDefinitions = getDefinitions(Components.AMBARI_AGENT);
+    m_agentDefinitions = getDefinitions(RootComponent.AMBARI_AGENT);
     return m_agentDefinitions;
   }
 
   /**
    * Gets all of the {@link AlertDefinition}s that exist on the path for
-   * {@link Components#AMBARI_SERVER}.
+   * {@link RootComponent#AMBARI_SERVER}.
    *
-   * @return the alerts with {@link Components#AMBARI_SERVER} as the component
+   * @return the alerts with {@link RootComponent#AMBARI_SERVER} as the 
component
    *         and {@code AMBARI} as the service.
    */
   public List<AlertDefinition> getServerDefinitions() {
@@ -91,7 +91,7 @@ public class AmbariServiceAlertDefinitions {
       return m_serverDefinitions;
     }
 
-    m_serverDefinitions = getDefinitions(Components.AMBARI_SERVER);
+    m_serverDefinitions = getDefinitions(RootComponent.AMBARI_SERVER);
     return m_serverDefinitions;
   }
 
@@ -104,7 +104,7 @@ public class AmbariServiceAlertDefinitions {
    * @return the alert definitions for {@code AMBARI} service for the given
    *         component.
    */
-  private List<AlertDefinition> getDefinitions(Components component) {
+  private List<AlertDefinition> getDefinitions(RootComponent component) {
     List<AlertDefinition> definitions = new ArrayList<>();
 
     InputStream inputStream = 
ClassLoader.getSystemResourceAsStream("alerts.json");
@@ -112,7 +112,7 @@ public class AmbariServiceAlertDefinitions {
 
     try {
       Set<AlertDefinition> allDefinitions = m_factory.getAlertDefinitions(
-          reader, Services.AMBARI.name());
+          reader, RootService.AMBARI.name());
 
       String componentName = component.name();
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertDefinitionDAO.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertDefinitionDAO.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertDefinitionDAO.java
index cda03f3..424910b 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertDefinitionDAO.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertDefinitionDAO.java
@@ -25,7 +25,8 @@ import javax.persistence.EntityManager;
 import javax.persistence.TypedQuery;
 
 import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.controller.RootServiceResponseFactory;
+import org.apache.ambari.server.controller.RootComponent;
+import org.apache.ambari.server.controller.RootService;
 import 
org.apache.ambari.server.controller.internal.AlertDefinitionResourceProvider;
 import org.apache.ambari.server.events.AlertDefinitionChangedEvent;
 import org.apache.ambari.server.events.AlertDefinitionDeleteEvent;
@@ -300,10 +301,10 @@ public class AlertDefinitionDAO {
     query.setParameter("clusterId", clusterId);
 
     query.setParameter("serviceName",
-        RootServiceResponseFactory.Services.AMBARI.name());
+        RootService.AMBARI.name());
 
     query.setParameter("componentName",
-        RootServiceResponseFactory.Components.AMBARI_AGENT.name());
+        RootComponent.AMBARI_AGENT.name());
 
     return daoUtils.selectList(query);
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertDispatchDAO.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertDispatchDAO.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertDispatchDAO.java
index 5c6a82f..1746048 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertDispatchDAO.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertDispatchDAO.java
@@ -33,7 +33,7 @@ import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.api.query.JpaPredicateVisitor;
 import org.apache.ambari.server.api.query.JpaSortBuilder;
 import org.apache.ambari.server.controller.AlertNoticeRequest;
-import org.apache.ambari.server.controller.RootServiceResponseFactory.Services;
+import org.apache.ambari.server.controller.RootService;
 import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.orm.RequiresSession;
@@ -452,7 +452,7 @@ public class AlertDispatchDAO {
 
     // AMBARI is a special service that we let through, otherwise we need to
     // verify that the service exists before we create the default group
-    String ambariServiceName = Services.AMBARI.name();
+    String ambariServiceName = RootService.AMBARI.name();
     if (!ambariServiceName.equals(serviceName)) {
       Cluster cluster = m_clusters.get().getClusterById(clusterId);
       Map<String, Service> services = cluster.getServices();

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionHash.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionHash.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionHash.java
index 15f7048..a1c7249 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionHash.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionHash.java
@@ -37,8 +37,8 @@ import org.apache.ambari.server.ClusterNotFoundException;
 import org.apache.ambari.server.agent.ActionQueue;
 import org.apache.ambari.server.agent.AgentCommand.AgentCommandType;
 import org.apache.ambari.server.agent.AlertDefinitionCommand;
-import 
org.apache.ambari.server.controller.RootServiceResponseFactory.Components;
-import org.apache.ambari.server.controller.RootServiceResponseFactory.Services;
+import org.apache.ambari.server.controller.RootComponent;
+import org.apache.ambari.server.controller.RootService;
 import org.apache.ambari.server.orm.dao.AlertDefinitionDAO;
 import org.apache.ambari.server.orm.entities.AlertDefinitionEntity;
 import org.apache.ambari.server.state.Cluster;
@@ -375,8 +375,8 @@ public class AlertDefinitionHash {
       return affectedHosts;
     }
 
-    String ambariServiceName = Services.AMBARI.name();
-    String agentComponentName = Components.AMBARI_AGENT.name();
+    String ambariServiceName = RootService.AMBARI.name();
+    String agentComponentName = RootComponent.AMBARI_AGENT.name();
 
     // intercept host agent alerts; they affect all hosts
     if (ambariServiceName.equals(definitionServiceName)

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index 9c0b0ca..8f5e4f4 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
@@ -57,7 +57,7 @@ import 
org.apache.ambari.server.controller.AmbariSessionManager;
 import org.apache.ambari.server.controller.ClusterResponse;
 import org.apache.ambari.server.controller.ConfigurationResponse;
 import org.apache.ambari.server.controller.MaintenanceStateHelper;
-import org.apache.ambari.server.controller.RootServiceResponseFactory.Services;
+import org.apache.ambari.server.controller.RootService;
 import org.apache.ambari.server.controller.ServiceConfigVersionResponse;
 import org.apache.ambari.server.events.AmbariEvent.AmbariEventType;
 import org.apache.ambari.server.events.ClusterConfigChangedEvent;
@@ -2050,7 +2050,7 @@ public class ClusterImpl implements Cluster {
       // server-side events either don't have a service name or are AMBARI;
       // either way they are not handled by this method since it expects a
       // real service and component
-      if (StringUtils.isBlank(serviceName) || 
Services.AMBARI.name().equals(serviceName)) {
+      if (StringUtils.isBlank(serviceName) || 
RootService.AMBARI.name().equals(serviceName)) {
         continue;
       }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/main/java/org/apache/ambari/server/state/services/AmbariServerAlertService.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/services/AmbariServerAlertService.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/services/AmbariServerAlertService.java
index d3237a9..305f693 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/services/AmbariServerAlertService.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/services/AmbariServerAlertService.java
@@ -29,7 +29,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.ambari.server.AmbariService;
 import org.apache.ambari.server.alerts.AlertRunnable;
-import 
org.apache.ambari.server.controller.RootServiceResponseFactory.Components;
+import org.apache.ambari.server.controller.RootComponent;
 import org.apache.ambari.server.orm.dao.AlertDefinitionDAO;
 import org.apache.ambari.server.orm.entities.AlertDefinitionEntity;
 import org.apache.ambari.server.state.Cluster;
@@ -133,7 +133,7 @@ public class AmbariServerAlertService extends 
AbstractScheduledService {
   /**
    * {@inheritDoc}
    * <p/>
-   * Compares all known {@link Components#AMBARI_SERVER} alerts with those that
+   * Compares all known {@link RootComponent#AMBARI_SERVER} alerts with those 
that
    * are scheduled. If any are not scheduled or have their intervals changed,
    * then reschedule those.
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/test/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommandTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommandTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommandTest.java
index 959db15..2afbf8a 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommandTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommandTest.java
@@ -301,9 +301,9 @@ public class StackAdvisorCommandTest {
       "items",
       list(
         map(
-          "AmbariConfiguration",
+          "Configuration",
           map(
-            "data", list(ldapConfigData)
+            "properties", ldapConfigData
           )
         )
       )
@@ -380,7 +380,7 @@ public class StackAdvisorCommandTest {
       "items",
       list(
         map(
-          "AmbariConfiguration",
+          "Configuration",
           map(
             "data",
             list(ldapConfigData, ldapConfigData)
@@ -417,7 +417,7 @@ public class StackAdvisorCommandTest {
       .build();
 
     Map<String, Object> ldapConfig = map(
-      "AmbariConfiguration",
+      "Configuration",
       map(
         "data",
         list(

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
index 7094caa..d95dcef 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
@@ -8248,13 +8248,13 @@ public class AmbariManagementControllerTest {
 
     RootServiceRequest request = new RootServiceRequest(null);
     Set<RootServiceResponse> responses = 
controller.getRootServices(Collections.singleton(request));
-    Assert.assertEquals(RootServiceResponseFactory.Services.values().length, 
responses.size());
+    Assert.assertEquals(RootService.values().length, responses.size());
 
-    RootServiceRequest requestWithParams = new 
RootServiceRequest(RootServiceResponseFactory.Services.AMBARI.toString());
+    RootServiceRequest requestWithParams = new 
RootServiceRequest(RootService.AMBARI.toString());
     Set<RootServiceResponse> responsesWithParams = 
controller.getRootServices(Collections.singleton(requestWithParams));
     Assert.assertEquals(1, responsesWithParams.size());
     for (RootServiceResponse responseWithParams: responsesWithParams) {
-      Assert.assertEquals(responseWithParams.getServiceName(), 
RootServiceResponseFactory.Services.AMBARI.toString());
+      Assert.assertEquals(responseWithParams.getServiceName(), 
RootService.AMBARI.toString());
     }
 
     RootServiceRequest invalidRequest = new RootServiceRequest(NON_EXT_VALUE);
@@ -8268,18 +8268,18 @@ public class AmbariManagementControllerTest {
   @Test
   public void testGetRootServiceComponents() throws Exception {
 
-    RootServiceComponentRequest request = new 
RootServiceComponentRequest(RootServiceResponseFactory.Services.AMBARI.toString(),
 null);
+    RootServiceComponentRequest request = new 
RootServiceComponentRequest(RootService.AMBARI.toString(), null);
     Set<RootServiceComponentResponse> responses = 
controller.getRootServiceComponents(Collections.singleton(request));
-    
Assert.assertEquals(RootServiceResponseFactory.Services.AMBARI.getComponents().length,
 responses.size());
+    Assert.assertEquals(RootService.AMBARI.getComponents().length, 
responses.size());
 
     RootServiceComponentRequest requestWithParams = new 
RootServiceComponentRequest(
-        RootServiceResponseFactory.Services.AMBARI.toString(),
-        
RootServiceResponseFactory.Services.AMBARI.getComponents()[0].toString());
+        RootService.AMBARI.toString(),
+        RootService.AMBARI.getComponents()[0].toString());
 
     Set<RootServiceComponentResponse> responsesWithParams = 
controller.getRootServiceComponents(Collections.singleton(requestWithParams));
     Assert.assertEquals(1, responsesWithParams.size());
     for (RootServiceComponentResponse responseWithParams: responsesWithParams) 
{
-      Assert.assertEquals(responseWithParams.getComponentName(), 
RootServiceResponseFactory.Services.AMBARI.getComponents()[0].toString());
+      Assert.assertEquals(responseWithParams.getComponentName(), 
RootService.AMBARI.getComponents()[0].toString());
     }
 
     RootServiceComponentRequest invalidRequest = new 
RootServiceComponentRequest(NON_EXT_VALUE, NON_EXT_VALUE);

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/test/java/org/apache/ambari/server/controller/RootServiceResponseFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/RootServiceResponseFactoryTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/RootServiceResponseFactoryTest.java
index c27ef7e..e194115 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/RootServiceResponseFactoryTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/RootServiceResponseFactoryTest.java
@@ -29,7 +29,6 @@ import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.H2DatabaseCleaner;
 import org.apache.ambari.server.ObjectNotFoundException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
-import 
org.apache.ambari.server.controller.RootServiceResponseFactory.Components;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
 import org.junit.After;
@@ -66,13 +65,13 @@ public class RootServiceResponseFactoryTest {
     // Request a null service name
     RootServiceRequest request = new RootServiceRequest(null);
     Set<RootServiceResponse> rootServices = 
responseFactory.getRootServices(request);
-    assertEquals(RootServiceResponseFactory.Services.values().length,
+    assertEquals(RootService.values().length,
         rootServices.size());
 
     // null request
     request = null;
     rootServices = responseFactory.getRootServices(request);
-    assertEquals(RootServiceResponseFactory.Services.values().length,
+    assertEquals(RootService.values().length,
         rootServices.size());
 
     // Request nonexistent service
@@ -85,12 +84,12 @@ public class RootServiceResponseFactoryTest {
 
     // Request existent service
     request = new RootServiceRequest(
-        RootServiceResponseFactory.Services.AMBARI.name());
+        RootService.AMBARI.name());
 
     rootServices = responseFactory.getRootServices(request);
     assertEquals(1, rootServices.size());
     assertTrue(rootServices.contains(new RootServiceResponse(
-        RootServiceResponseFactory.Services.AMBARI.name())));
+        RootService.AMBARI.name())));
   }
 
   @Test
@@ -106,7 +105,7 @@ public class RootServiceResponseFactoryTest {
       assertTrue(e instanceof ObjectNotFoundException);
     }
 
-    RootServiceResponseFactory.Components ambariServerComponent = 
RootServiceResponseFactory.Components.AMBARI_SERVER;
+    RootComponent ambariServerComponent = RootComponent.AMBARI_SERVER;
 
     // Request null service name, not-null component name
     request = new RootServiceComponentRequest(null, 
ambariServerComponent.name());
@@ -118,18 +117,18 @@ public class RootServiceResponseFactoryTest {
     }
 
     // Request existent service name, null component name
-    String serviceName = RootServiceResponseFactory.Services.AMBARI.name();
+    String serviceName = RootService.AMBARI.name();
     request = new RootServiceComponentRequest(serviceName, null);
 
     rootServiceComponents = responseFactory.getRootServiceComponents(request);
     assertEquals(
-        RootServiceResponseFactory.Services.AMBARI.getComponents().length,
+        RootService.AMBARI.getComponents().length,
         rootServiceComponents.size());
 
     String ambariVersion = ambariMetaInfo.getServerVersion();
 
-    for (int i = 0; i < 
RootServiceResponseFactory.Services.AMBARI.getComponents().length; i++) {
-      Components component = 
RootServiceResponseFactory.Services.AMBARI.getComponents()[i];
+    for (int i = 0; i < RootService.AMBARI.getComponents().length; i++) {
+      RootComponent component = RootService.AMBARI.getComponents()[i];
 
       if (component.name().equals(ambariServerComponent.name())) {
         for (RootServiceComponentResponse response : rootServiceComponents) {
@@ -148,14 +147,14 @@ public class RootServiceResponseFactoryTest {
 
     // Request existent service name, existent component name
     request = new RootServiceComponentRequest(
-        RootServiceResponseFactory.Services.AMBARI.name(),
-        RootServiceResponseFactory.Services.AMBARI.getComponents()[0].name());
+        RootService.AMBARI.name(),
+        RootService.AMBARI.getComponents()[0].name());
 
     rootServiceComponents = responseFactory.getRootServiceComponents(request);
     assertEquals(1, rootServiceComponents.size());
     for (RootServiceComponentResponse response : rootServiceComponents) {
       if (response.getComponentName().equals(
-          
RootServiceResponseFactory.Services.AMBARI.getComponents()[0].name())) {
+          RootService.AMBARI.getComponents()[0].name())) {
         assertEquals(ambariVersion, response.getComponentVersion());
         assertEquals(2, response.getProperties().size());
         assertTrue(response.getProperties().containsKey("jdk_location"));
@@ -166,7 +165,7 @@ public class RootServiceResponseFactoryTest {
     // Request existent service name, and component, not belongs to requested
     // service
     request = new RootServiceComponentRequest(
-        RootServiceResponseFactory.Services.AMBARI.name(), "XXX");
+        RootService.AMBARI.name(), "XXX");
     
     try {
       rootServiceComponents = 
responseFactory.getRootServiceComponents(request);

http://git-wip-us.apache.org/repos/asf/ambari/blob/3f2743b5/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AmbariConfigurationResourceProviderTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AmbariConfigurationResourceProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AmbariConfigurationResourceProviderTest.java
deleted file mode 100644
index a2ecb27..0000000
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AmbariConfigurationResourceProviderTest.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Licensed 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.controller.internal;
-
-import static 
org.apache.ambari.server.controller.internal.AmbariConfigurationResourceProvider.AMBARI_CONFIGURATION_CATEGORY_PROPERTY_ID;
-import static 
org.apache.ambari.server.controller.internal.AmbariConfigurationResourceProvider.AMBARI_CONFIGURATION_PROPERTIES_PROPERTY_ID;
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.capture;
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
-import static org.easymock.EasyMock.newCapture;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-import javax.persistence.EntityManager;
-
-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.spi.ResourceProvider;
-import org.apache.ambari.server.controller.utilities.PredicateBuilder;
-import org.apache.ambari.server.events.AmbariConfigurationChangedEvent;
-import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
-import org.apache.ambari.server.orm.dao.AmbariConfigurationDAO;
-import org.apache.ambari.server.orm.entities.AmbariConfigurationEntity;
-import org.apache.ambari.server.security.TestAuthenticationFactory;
-import org.apache.ambari.server.security.authorization.AuthorizationException;
-import org.easymock.Capture;
-import org.easymock.EasyMockSupport;
-import org.junit.After;
-import org.junit.Test;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-
-public class AmbariConfigurationResourceProviderTest extends EasyMockSupport {
-
-  private static final String CATEGORY_NAME_1 = "test-category-1";
-  private static final String CATEGORY_NAME_2 = "test-category-2";
-
-  @After
-  public void clearAuthentication() {
-    SecurityContextHolder.getContext().setAuthentication(null);
-  }
-
-  @Test
-  public void testCreateResources_Administrator() throws Exception {
-    testCreateResources(TestAuthenticationFactory.createAdministrator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testCreateResources_ClusterAdministrator() throws Exception {
-    
testCreateResources(TestAuthenticationFactory.createClusterAdministrator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testCreateResources_ClusterOperator() throws Exception {
-    testCreateResources(TestAuthenticationFactory.createClusterOperator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testCreateResources_ServiceAdministrator() throws Exception {
-    
testCreateResources(TestAuthenticationFactory.createServiceAdministrator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testCreateResources_ServiceOperator() throws Exception {
-    testCreateResources(TestAuthenticationFactory.createServiceOperator());
-  }
-
-  private void testCreateResources(Authentication authentication) throws 
Exception {
-    Injector injector = createInjector();
-
-    ResourceProvider resourceProvider = 
injector.getInstance(AmbariConfigurationResourceProvider.class);
-
-    Set<Map<String, Object>> propertySets = new HashSet<>();
-
-    Map<String, String> properties1 = new HashMap<>();
-    properties1.put("property1a", "value1");
-    properties1.put("property2a", "value2");
-    propertySets.add(toRequestProperties(CATEGORY_NAME_1, properties1));
-
-    Map<String, String> properties2 = new HashMap<>();
-    properties2.put("property1b", "value1");
-    properties2.put("property2b", "value2");
-    propertySets.add(toRequestProperties(CATEGORY_NAME_2, properties2));
-
-    Request request = createMock(Request.class);
-    expect(request.getProperties()).andReturn(propertySets).once();
-
-    Capture<Map<String, String>> capturedProperties1 = newCapture();
-    Capture<Map<String, String>> capturedProperties2 = newCapture();
-
-    AmbariConfigurationDAO dao = 
injector.getInstance(AmbariConfigurationDAO.class);
-    expect(dao.reconcileCategory(eq(CATEGORY_NAME_1), 
capture(capturedProperties1), eq(true)))
-        .andReturn(true)
-        .once();
-    expect(dao.reconcileCategory(eq(CATEGORY_NAME_2), 
capture(capturedProperties2), eq(true)))
-        .andReturn(true)
-        .once();
-
-    AmbariEventPublisher publisher = 
injector.getInstance(AmbariEventPublisher.class);
-    publisher.publish(anyObject(AmbariConfigurationChangedEvent.class));
-    expectLastCall().times(2);
-
-    replayAll();
-
-    SecurityContextHolder.getContext().setAuthentication(authentication);
-
-    resourceProvider.createResources(request);
-
-    verifyAll();
-
-    validateCapturedProperties(properties1, capturedProperties1);
-    validateCapturedProperties(properties2, capturedProperties2);
-  }
-
-  @Test
-  public void testDeleteResources_Administrator() throws Exception {
-    testDeleteResources(TestAuthenticationFactory.createAdministrator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testDeleteResources_ClusterAdministrator() throws Exception {
-    
testDeleteResources(TestAuthenticationFactory.createClusterAdministrator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testDeleteResources_ClusterOperator() throws Exception {
-    testDeleteResources(TestAuthenticationFactory.createClusterOperator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testDeleteResources_ServiceAdministrator() throws Exception {
-    
testDeleteResources(TestAuthenticationFactory.createServiceAdministrator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testDeleteResources_ServiceOperator() throws Exception {
-    testDeleteResources(TestAuthenticationFactory.createServiceOperator());
-  }
-
-  private void testDeleteResources(Authentication authentication) throws 
Exception {
-    Injector injector = createInjector();
-
-    ResourceProvider resourceProvider = 
injector.getInstance(AmbariConfigurationResourceProvider.class);
-
-    Predicate predicate = new PredicateBuilder()
-        .property(AMBARI_CONFIGURATION_CATEGORY_PROPERTY_ID)
-        .equals(CATEGORY_NAME_1)
-        .toPredicate();
-
-    Request request = createMock(Request.class);
-
-    AmbariConfigurationDAO dao = 
injector.getInstance(AmbariConfigurationDAO.class);
-    expect(dao.removeByCategory(CATEGORY_NAME_1)).andReturn(1).once();
-
-    AmbariEventPublisher publisher = 
injector.getInstance(AmbariEventPublisher.class);
-    publisher.publish(anyObject(AmbariConfigurationChangedEvent.class));
-    expectLastCall().once();
-
-    replayAll();
-
-    SecurityContextHolder.getContext().setAuthentication(authentication);
-
-    resourceProvider.deleteResources(request, predicate);
-
-    verifyAll();
-  }
-
-  @Test
-  public void testGetResources_Administrator() throws Exception {
-    testGetResources(TestAuthenticationFactory.createAdministrator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testGetResources_ClusterAdministrator() throws Exception {
-    testGetResources(TestAuthenticationFactory.createClusterAdministrator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testGetResources_ClusterOperator() throws Exception {
-    testGetResources(TestAuthenticationFactory.createClusterOperator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testGetResources_ServiceAdministrator() throws Exception {
-    testGetResources(TestAuthenticationFactory.createServiceAdministrator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testGetResources_ServiceOperator() throws Exception {
-    testGetResources(TestAuthenticationFactory.createServiceOperator());
-  }
-
-  private void testGetResources(Authentication authentication) throws 
Exception {
-    Injector injector = createInjector();
-
-    ResourceProvider resourceProvider = 
injector.getInstance(AmbariConfigurationResourceProvider.class);
-
-    Predicate predicate = new PredicateBuilder()
-        .property(AMBARI_CONFIGURATION_CATEGORY_PROPERTY_ID)
-        .equals(CATEGORY_NAME_1)
-        .toPredicate();
-
-    Request request = createMock(Request.class);
-    expect(request.getPropertyIds()).andReturn(null).anyTimes();
-
-    Map<String, String> properties = new HashMap<>();
-    properties.put("property1a", "value1");
-    properties.put("property2a", "value2");
-
-    AmbariConfigurationDAO dao = 
injector.getInstance(AmbariConfigurationDAO.class);
-    
expect(dao.findByCategory(CATEGORY_NAME_1)).andReturn(createEntities(CATEGORY_NAME_1,
 properties)).once();
-
-    replayAll();
-
-    SecurityContextHolder.getContext().setAuthentication(authentication);
-
-    Set<Resource> response = resourceProvider.getResources(request, predicate);
-
-    verifyAll();
-
-    junit.framework.Assert.assertNotNull(response);
-    junit.framework.Assert.assertEquals(1, response.size());
-
-    Resource resource = response.iterator().next();
-    junit.framework.Assert.assertEquals(Resource.Type.AmbariConfiguration, 
resource.getType());
-
-    Map<String, Map<String, Object>> propertiesMap = 
resource.getPropertiesMap();
-    junit.framework.Assert.assertEquals(2, propertiesMap.size());
-
-    junit.framework.Assert.assertEquals(CATEGORY_NAME_1, 
propertiesMap.get(Resource.Type.AmbariConfiguration.name()).get("category"));
-
-    Map<String, Object> retrievedProperties = 
propertiesMap.get(Resource.Type.AmbariConfiguration.name() + "/properties");
-    junit.framework.Assert.assertEquals(2, retrievedProperties.size());
-
-    for (Map.Entry<String, String> entry : properties.entrySet()) {
-      junit.framework.Assert.assertEquals(entry.getValue(), 
retrievedProperties.get(entry.getKey()));
-    }
-  }
-
-  @Test
-  public void testUpdateResources_Administrator() throws Exception {
-    testUpdateResources(TestAuthenticationFactory.createAdministrator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testUpdateResources_ClusterAdministrator() throws Exception {
-    
testUpdateResources(TestAuthenticationFactory.createClusterAdministrator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testUpdateResources_ClusterOperator() throws Exception {
-    testUpdateResources(TestAuthenticationFactory.createClusterOperator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testUpdateResources_ServiceAdministrator() throws Exception {
-    
testUpdateResources(TestAuthenticationFactory.createServiceAdministrator());
-  }
-
-  @Test(expected = AuthorizationException.class)
-  public void testUpdateResources_ServiceOperator() throws Exception {
-    testUpdateResources(TestAuthenticationFactory.createServiceOperator());
-  }
-
-  private void testUpdateResources(Authentication authentication) throws 
Exception {
-    Injector injector = createInjector();
-
-    ResourceProvider resourceProvider = 
injector.getInstance(AmbariConfigurationResourceProvider.class);
-
-    Predicate predicate = new PredicateBuilder()
-        .property(AMBARI_CONFIGURATION_CATEGORY_PROPERTY_ID)
-        .equals(CATEGORY_NAME_1)
-        .toPredicate();
-
-    Set<Map<String, Object>> propertySets = new HashSet<>();
-
-    Map<String, String> properties1 = new HashMap<>();
-    properties1.put("property1a", "value1");
-    properties1.put("property2a", "value2");
-    propertySets.add(toRequestProperties(CATEGORY_NAME_1, properties1));
-
-    Request request = createMock(Request.class);
-    expect(request.getProperties()).andReturn(propertySets).once();
-
-    Capture<Map<String, String>> capturedProperties1 = newCapture();
-
-    AmbariConfigurationDAO dao = 
injector.getInstance(AmbariConfigurationDAO.class);
-    expect(dao.reconcileCategory(eq(CATEGORY_NAME_1), 
capture(capturedProperties1), eq(false)))
-        .andReturn(true)
-        .once();
-
-    AmbariEventPublisher publisher = 
injector.getInstance(AmbariEventPublisher.class);
-    publisher.publish(anyObject(AmbariConfigurationChangedEvent.class));
-    expectLastCall().times(1);
-
-    replayAll();
-
-    SecurityContextHolder.getContext().setAuthentication(authentication);
-
-    resourceProvider.updateResources(request, predicate);
-
-    verifyAll();
-
-    validateCapturedProperties(properties1, capturedProperties1);
-  }
-
-  private List<AmbariConfigurationEntity> createEntities(String categoryName, 
Map<String, String> properties) {
-    List<AmbariConfigurationEntity> entities = new ArrayList<>();
-
-    for (Map.Entry<String, String> property : properties.entrySet()) {
-      AmbariConfigurationEntity entity = new AmbariConfigurationEntity();
-      entity.setCategoryName(categoryName);
-      entity.setPropertyName(property.getKey());
-      entity.setPropertyValue(property.getValue());
-      entities.add(entity);
-    }
-
-    return entities;
-  }
-
-  private Map<String, Object> toRequestProperties(String categoryName1, 
Map<String, String> properties) {
-    Map<String, Object> requestProperties = new HashMap<>();
-    requestProperties.put(AMBARI_CONFIGURATION_CATEGORY_PROPERTY_ID, 
categoryName1);
-    for (Map.Entry<String, String> entry : properties.entrySet()) {
-      requestProperties.put(AMBARI_CONFIGURATION_PROPERTIES_PROPERTY_ID + "/" 
+ entry.getKey(), entry.getValue());
-    }
-    return requestProperties;
-  }
-
-  private void validateCapturedProperties(Map<String, String> 
expectedProperties, Capture<Map<String, String>> capturedProperties) {
-    junit.framework.Assert.assertTrue(capturedProperties.hasCaptured());
-
-    Map<String, String> properties = capturedProperties.getValue();
-    junit.framework.Assert.assertNotNull(properties);
-
-    // Convert the Map to a TreeMap to help with comparisons
-    expectedProperties = new TreeMap<>(expectedProperties);
-    properties = new TreeMap<>(properties);
-    junit.framework.Assert.assertEquals(expectedProperties, properties);
-  }
-
-  private Injector createInjector() throws Exception {
-    return Guice.createInjector(new AbstractModule() {
-      @Override
-      protected void configure() {
-        
bind(EntityManager.class).toInstance(createNiceMock(EntityManager.class));
-        
bind(AmbariConfigurationDAO.class).toInstance(createMock(AmbariConfigurationDAO.class));
-        
bind(AmbariEventPublisher.class).toInstance(createMock(AmbariEventPublisher.class));
-      }
-    });
-  }
-}
\ No newline at end of file

Reply via email to