/**
* 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.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.apache.ambari.server.controller.spi.Resource;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
/**
* Simple resource implementation.
*/
public class ResourceImpl implements Resource {
/**
* The resource type.
*/
private final Type type;
/**
* The map of property maps keyed by property category.
*/
private final Map<String, Map<String, Object>> propertiesMap =
Collections.synchronizedMap(new TreeMap<String, Map<String, Object>>());
// ----- Constructors ------------------------------------------------------
/**
* Create a resource of the given type.
*
* @param type the resource type
*/
public ResourceImpl(Type type) {
this.type = type;
}
/**
* Copy constructor
*
* @param resource the resource to copy
*/
public ResourceImpl(Resource resource) {
this(resource, null);
}
/**
* Construct a resource from the given resource, setting only the properties
* that are found in the given set of property and category ids.
*
* @param resource the resource to copy
* @param propertyIds the set of requested property and category ids
*/
public ResourceImpl(Resource resource, Set<String> propertyIds) {
this.type = resource.getType();
for (Map.Entry<String, Map<String, Object>> categoryEntry :
resource.getPropertiesMap().entrySet()) {
String category = categoryEntry.getKey();
Map<String, Object> propertyMap = categoryEntry.getValue();
if (propertyMap != null) {
for (Map.Entry<String, Object> propertyEntry : propertyMap.entrySet()) {
String propertyId = PropertyHelper.getPropertyId(category, propertyEntry.getKey());
if (propertyIds == null || propertyIds.isEmpty() || PropertyHelper.containsProperty(propertyIds, propertyId)) {
Object propertyValue = propertyEntry.getValue();
setProperty(propertyId, propertyValue);
}
}
}
}
}
// ----- Resource ----------------------------------------------------------
@Override
public Type getType() {
return type;
}
@Override
public Map<String, Map<String, Object>> getPropertiesMap() {
return propertiesMap;
}
@Override
public void setProperty(String id, Object value) {
String categoryKey = getCategoryKey(PropertyHelper.getPropertyCategory(id));
Map<String, Object> properties = propertiesMap.get(categoryKey);
if (properties == null) {
properties = Collections.synchronizedMap(new TreeMap<String, Object>());
propertiesMap.put(categoryKey, properties);
}
properties.put(PropertyHelper.getPropertyName(id), value);
}
@Override
public void addCategory(String id) {
String categoryKey = getCategoryKey(id);
if (!propertiesMap.containsKey(categoryKey)) {
propertiesMap.put(categoryKey, new HashMap<String, Object>());
}
}
@Override
public Object getPropertyValue(String id) {
String categoryKey = getCategoryKey(PropertyHelper.getPropertyCategory(id));
Map<String, Object> properties = propertiesMap.get(categoryKey);
return properties == null ?
null : properties.get(PropertyHelper.getPropertyName(id));
}
// ----- Object overrides --------------------------------------------------
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Resource : ").append(type).append("\n");
sb.append("Properties:\n");
sb.append(propertiesMap);
return sb.toString();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ResourceImpl resource = (ResourceImpl) o;
return type == resource.type &&
!(propertiesMap != null ? !propertiesMap.equals(resource.propertiesMap) : resource.propertiesMap != null);
}
@Override
public int hashCode() {
return 31 * type.hashCode() + (propertiesMap != null ? propertiesMap.hashCode() : 0);
}
// ----- utility methods ---------------------------------------------------
private String getCategoryKey(String category) {
return category == null ? "" : category;
}
}