blob: 2112fccb2dd65cdd5406fa38c120482ee749f36f [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.Map;
import java.util.TreeMap;
/**
* AbstractKerberosDescriptor is the base class for all Kerberos*Descriptor and associated classes.
* <p/>
* It provides storage and management for the parent and name values on behalf of implementing classes.
* It also provides utility and helper methods.
*/
public abstract class AbstractKerberosDescriptor {
/**
* An AbstractKerberosDescriptor serving as the parent (or container) for this
* AbstractKerberosDescriptor.
* <p/>
* This value may be null in the event no parent has been identified.
*/
private AbstractKerberosDescriptor parent = null;
/**
* A String declaring the name of this AbstractKerberosDescriptor.
* <p/>
* This value may be null in the event a name (or identifier) is not relevant.
*/
private String name = null;
/**
* Generates a Map of data that represents this AbstractKerberosDescriptor implementation.
* <p/>
* This method should be overwritten by AbstractKerberosDescriptor implementations to generate a
* Map of data specific to it.
* <p/>
* It is not necessary to call this method from the overriding method.
* <p/>
* The map of data generated should be setup so that it can be fed back into the implementation
* class to build a copy of it. For example:
* <p/>
* <pre>
* descriptor1 = AbstractKerberosDescriptorImpl(...)
* map = descriptor1.toMap()
* descriptor2 = AbstractKerberosDescriptor(map)
* descriptor1 should have the same data as descriptor2
* </pre>
*
* @return a Map of date representing this AbstractKerberosDescriptor implementation
*/
public Map<String, Object> toMap() {
TreeMap<String, Object> dataMap = new TreeMap<String, Object>();
String name = getName();
if (name != null) {
dataMap.put("name", name);
}
return dataMap;
}
/**
* Returns the name of this descriptor
*
* @return a String indicating the name of this descriptor
*/
public String getName() {
return name;
}
/**
* Sets the name of this descriptor
*
* @param name a String indicating the name of this descriptor
*/
public void setName(String name) {
this.name = name;
}
/**
* Returns the parent (or container) of this descriptor
*
* @return an AbstractKerberosDescriptor representing the parent (or container) of this descriptor
* or null if no parent was set
*/
public AbstractKerberosDescriptor getParent() {
return parent;
}
/**
* Sets the parent (or container) of this descriptor
*
* @param parent an AbstractKerberosDescriptor representing the parent (or container) of this
* descriptor or null to clear the value
*/
public void setParent(AbstractKerberosDescriptor parent) {
this.parent = parent;
}
/**
* Test this AbstractKerberosDescriptor to see if it is a container.
* <p/>
* The default implementation always returns false. Implementing classes should override this
* method to return something different, like true.
*
* @return true if this AbstractKerberosDescriptor is a container, false otherwise
*/
public boolean isContainer() {
return false;
}
/**
* Safely retrieves the requested value from the supplied Map
*
* @param map a Map containing the relevant data
* @param key a String declaring the item to retrieve
* @return an Object representing the requested data; or null if not found
*/
protected static Object getValue(Map<?, ?> map, String key) {
return ((map == null) || key == null) ? null : map.get(key);
}
/**
* Safely retrieves the requested value (converted to a String) from the supplied Map
* <p/>
* The found value will be converted to a String using the {@link Object#toString()} method.
*
* @param map a Map containing the relevant data
* @param key a String declaring the item to retrieve
* @return a String representing the requested data; or null if not found
*/
protected static String getStringValue(Map<?, ?> map, String key) {
Object value = getValue(map, key);
return (value == null) ? null : value.toString();
}
/**
* Gets the requested AbstractKerberosDescriptor implementation using a type name and a relevant
* descriptor name.
* <p/>
* Implementation classes should override this method to handle relevant descriptor types.
*
* @param type a String indicating the type of the requested descriptor
* @param name a String indicating the name of the requested descriptor
* @return a AbstractKerberosDescriptor representing the requested descriptor or null if not found
*/
protected AbstractKerberosDescriptor getDescriptor(Type type, String name) {
return null;
}
/**
* Traverses up the hierarchy to find the "root" or "parent" container.
* <p/>
* The root AbstractKerberosDescriptor is the first descriptor in the hierarchy with a null parent.
*
* @return the AbstractKerberosDescriptor implementation that is found to be the root of the hierarchy.
*/
protected AbstractKerberosDescriptor getRoot() {
AbstractKerberosDescriptor root = this;
while (root.getParent() != null) {
root = root.getParent();
}
return root;
}
@Override
public int hashCode() {
return 37 *
((getName() == null)
? 0
: getName().hashCode());
}
@Override
public boolean equals(Object object) {
if (object == null) {
return false;
} else if (object == this) {
return true;
} else if (object instanceof AbstractKerberosDescriptor) {
AbstractKerberosDescriptor descriptor = (AbstractKerberosDescriptor) object;
return (
(getName() == null)
? (descriptor.getName() == null)
: getName().equals(descriptor.getName())
);
} else {
return false;
}
}
/**
* An enumeration of the different Kerberos (sub)descriptors for internal use.
*/
public enum Type {
SERVICE("service", "services"),
COMPONENT("component", "components"),
IDENTITY("identity", "identities"),
PRINCIPAL("principal", "principals"),
KEYTAB("keytab", "keytabs"),
CONFIGURATION("configuration", "configurations"),
AUTH_TO_LOCAL_PROPERTY("auth_to_local_property", "auth_to_local_properties");
private final String descriptorName;
private final String descriptorPluralName;
private Type(String descriptorName, String descriptorPluralName) {
this.descriptorName = descriptorName;
this.descriptorPluralName = descriptorPluralName;
}
/**
* Gets the identifying name for this Type
*
* @return a String declaring the identifying name for this Type
*/
public String getDescriptorName() {
return descriptorName;
}
/**
* Gets the identifying name for a group of this Type
*
* @return a String declaring the identifying name for a group of this Type
*/
public String getDescriptorPluralName() {
return descriptorPluralName;
}
}
}