blob: bc5f9361748fd7a4bbe31abc93652c7c6855977b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ambari.server.state.kerberos;
import java.util.TreeMap;
import java.util.Map;
import java.util.Set;
/**
* KerberosConfigurationDescriptor is an implementation of an AbstractKerberosDescriptor that
* encapsulates data related to an Ambari configuration block.
* <p/>
* A KerberosConfigurationDescriptor has the following properties:
* <ul>
* <li>type</li>
* <li>properties</li>
* </ul>
* <p/>
* The following is an example of a JSON structure that will yield a valid KerberosConfigurationDescriptor
* <pre>
* {
* "core-site": {
* "hadoop.security.authentication": "kerberos",
* "hadoop.rpc.protection": "authentication; integrity; privacy",
* "hadoop.security.authorization": "true"
* }
* }
* </pre>
* <p/>
* In this implementation,
* {@link org.apache.ambari.server.state.kerberos.AbstractKerberosDescriptor#name} will hold the
* KerberosConfigurationDescriptor#type value
*/
public class KerberosConfigurationDescriptor extends AbstractKerberosDescriptor {
/**
* A Map of the properties in this KerberosConfigurationDescriptor
*/
private Map<String, String> properties = null;
/**
* Creates a new KerberosConfigurationDescriptor
* <p/>
* See {@link org.apache.ambari.server.state.kerberos.KerberosConfigurationDescriptor} for an
* example JSON structure that may be used to generate this map.
*
* @param data a Map of values use to populate the data for the new instance
* @see org.apache.ambari.server.state.kerberos.KerberosConfigurationDescriptor
*/
public KerberosConfigurationDescriptor(Map<?, ?> data) {
if (data != null) {
Set<?> keySet = data.keySet();
if (!keySet.isEmpty()) {
// Only a single entry is expected...
Object key = keySet.iterator().next();
if (key != null) {
Object object = data.get(key);
setType(key.toString());
if (object instanceof Map) {
for (Map.Entry<?, ?> entry : ((Map<?, ?>) object).entrySet()) {
Object value = entry.getValue();
putProperty(entry.getKey().toString(), (value == null) ? null : value.toString());
}
}
}
}
}
}
/**
* Returns the type of the configuration data represented by this KerberosConfigurationDescriptor
*
* @return a String declaring the configuration type, i.e., core-site
*/
public String getType() {
return getName();
}
/**
* Sets the type of the configuration data represented by this KerberosConfigurationDescriptor
*
* @param type a String declaring the configuration group type, i.e., core-site
*/
public void setType(String type) {
setName(type);
}
/**
* Set the properties of the configuration data represented by this KerberosConfigurationDescriptor
*
* @param properties a Map of properties
*/
public void setProperties(Map<String, String> properties) {
if (properties == null) {
this.properties = null;
} else {
this.properties = new TreeMap<String, String>(properties);
}
}
/**
* Gets the properties of the configuration data represented by this KerberosConfigurationDescriptor
*
* @return a Map of properties
*/
public Map<String, String> getProperties() {
return properties;
}
/**
* Gets the value of the configuration property with the specified name
*
* @param name a String declaring the name of the property to retrieve
* @return a String or null if the property value is not found
*/
public String getProperty(String name) {
return ((name == null) || (properties == null)) ? null : properties.get(name);
}
/**
* Adds or updates the value of the configuration property with the specified name
* <p/>
* If the property exists, it will be overwritten; else a new entry will be created.
*
* @param name a String declaring the name of the property to set
* @param value a String containing the value of the property
*/
public void putProperty(String name, String value) {
if (name == null) {
throw new IllegalArgumentException("The property name must not be null");
}
if (properties == null) {
properties = new TreeMap<String, String>();
}
properties.put(name, value);
}
/**
* Updates this KerberosConfigurationDescriptor with data from another KerberosConfigurationDescriptor
* <p/>
* Properties will be updated if the relevant updated values are not null.
*
* @param updates the KerberosConfigurationDescriptor containing the updated values
*/
public void update(KerberosConfigurationDescriptor updates) {
if (updates != null) {
setType(updates.getType());
Map<String, String> updatedProperties = updates.getProperties();
if (updatedProperties != null) {
for (Map.Entry<String, String> entry : updatedProperties.entrySet()) {
putProperty(entry.getKey(), entry.getValue());
}
}
}
}
/**
* Creates a Map of values that can be used to create a copy of this KerberosConfigurationDescriptor
* or generate the JSON structure described in
* {@link org.apache.ambari.server.state.kerberos.KerberosConfigurationDescriptor}
*
* @return a Map of values for this KerberosConfigurationDescriptor
* @see org.apache.ambari.server.state.kerberos.KerberosConfigurationDescriptor
*/
@Override
public Map<String, Object> toMap() {
Map<String, Object> map = new TreeMap<String, Object>();
map.put(getName(), (properties == null) ? null : new TreeMap<String, Object>(properties));
return map;
}
@Override
public int hashCode() {
return super.hashCode() +
((getProperties() == null)
? 0
: getProperties().hashCode());
}
@Override
public boolean equals(Object object) {
if (object == null) {
return false;
} else if (object == this) {
return true;
} else if (object.getClass() == KerberosConfigurationDescriptor.class) {
KerberosConfigurationDescriptor descriptor = (KerberosConfigurationDescriptor) object;
return super.equals(object) &&
(
(getProperties() == null)
? (descriptor.getProperties() == null)
: getProperties().equals(descriptor.getProperties())
);
} else {
return false;
}
}
}