/**
* 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
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* 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.spi;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* The resource object represents a requested resource. The resource
* contains a collection of values for the requested properties.
*/
public interface Resource {
/**
* Get the resource type.
*
* @return the resource type
*/
Type getType();
/**
* Obtain the properties contained by this group in a map structure.
* The category/property hierarchy is flattened into a map where
* each key is the absolute category name and the corresponding
* value is a map of properties(name/value pairs) for that category.
*
* @return resource properties map
*/
Map<String, Map<String, Object>> getPropertiesMap();
/**
* Set a property value for the given property id on this resource.
*
* @param id the property id
* @param value the value
*/
void setProperty(String id, Object value);
/**
* Add an empty category to this resource.
*
* @param id the category id
*/
void addCategory(String id);
/**
* Get a property value for the given property id from this resource.
*
* @param id the property id
* @return the property value
*/
Object getPropertyValue(String id);
// ----- Enum : InternalType -----------------------------------------------
/**
* Enum of internal types.
*/
enum InternalType {
Cluster,
Service,
Setting,
Host,
Component,
HostComponent,
Configuration,
ServiceConfigVersion,
ConfigGroup,
Action,
Request,
RequestSchedule,
Task,
User,
Group,
Member,
Stack,
StackVersion,
ExtensionLink,
Extension,
ExtensionVersion,
OperatingSystem,
Repository,
StackService,
StackConfiguration,
StackConfigurationDependency,
StackServiceComponent,
StackServiceComponentDependency,
DRFeed,
DRTargetCluster,
DRInstance,
Workflow,
Job,
TaskAttempt,
RootService,
RootServiceComponent,
RootServiceHostComponent,
View,
ViewURL,
ViewVersion,
ViewInstance,
Blueprint,
Recommendation,
Validation,
HostComponentProcess,
Permission,
Alert,
AlertDefinition,
AlertHistory,
AlertGroup,
AlertTarget,
AlertNotice,
AmbariPrivilege,
ClusterPrivilege,
ViewPrivilege,
ViewPermission,
ClientConfig,
StackLevelConfiguration,
LdapSyncEvent,
UserPrivilege,
GroupPrivilege,
RepositoryVersion,
CompatibleRepositoryVersion,
ClusterStackVersion,
HostStackVersion,
Upgrade,
UpgradeGroup,
UpgradeItem,
UpgradeSummary,
PreUpgradeCheck,
Stage,
StackArtifact,
Artifact,
Widget,
WidgetLayout,
ActiveWidgetLayout,
Theme,
QuickLink,
HostKerberosIdentity,
Credential,
KerberosDescriptor,
RoleAuthorization,
UserAuthorization,
VersionDefinition,
ClusterKerberosDescriptor,
LoggingQuery,
RemoteCluster;
/**
* Get the {@link Type} that corresponds to this InternalType.
*
* @return the corresponding type.
*/
private Type getType() {
String name = name();
Type type = Type.getType(name);
return type == null ? new Type(name(), ordinal()) : type;
}
}
// ----- Inner class : Type ------------------------------------------------
/**
* Resource types. Allows for the addition of external types.
*/
final class Type implements Comparable<Type>{
/**
* Map of all registered types.
*/
private static Map<String, Type> types = new ConcurrentHashMap<>();
/**
* Ordinal number counter for registering external types.
*/
private static int nextOrdinal = 10000;
/**
* Internal types. See {@link InternalType}.
*/
public static final Type Cluster = InternalType.Cluster.getType();
public static final Type Service = InternalType.Service.getType();
public static final Type Setting = InternalType.Setting.getType();
public static final Type Host = InternalType.Host.getType();
public static final Type Component = InternalType.Component.getType();
public static final Type HostComponent = InternalType.HostComponent.getType();
public static final Type Configuration = InternalType.Configuration.getType();
public static final Type ServiceConfigVersion = InternalType.ServiceConfigVersion.getType();
public static final Type ConfigGroup = InternalType.ConfigGroup.getType();
public static final Type Action = InternalType.Action.getType();
public static final Type Request = InternalType.Request.getType();
public static final Type RequestSchedule = InternalType.RequestSchedule.getType();
public static final Type Task = InternalType.Task.getType();
public static final Type User = InternalType.User.getType();
public static final Type Group = InternalType.Group.getType();
public static final Type Member = InternalType.Member.getType();
public static final Type Stack = InternalType.Stack.getType();
public static final Type StackVersion = InternalType.StackVersion.getType();
public static final Type ExtensionLink = InternalType.ExtensionLink.getType();
public static final Type Extension = InternalType.Extension.getType();
public static final Type ExtensionVersion = InternalType.ExtensionVersion.getType();
public static final Type OperatingSystem = InternalType.OperatingSystem.getType();
public static final Type Repository = InternalType.Repository.getType();
public static final Type StackService = InternalType.StackService.getType();
public static final Type StackConfiguration = InternalType.StackConfiguration.getType();
public static final Type StackConfigurationDependency = InternalType.StackConfigurationDependency.getType();
public static final Type StackServiceComponent = InternalType.StackServiceComponent.getType();
public static final Type StackServiceComponentDependency = InternalType.StackServiceComponentDependency.getType();
public static final Type DRFeed = InternalType.DRFeed.getType();
public static final Type DRTargetCluster = InternalType.DRTargetCluster.getType();
public static final Type DRInstance = InternalType.DRInstance.getType();
public static final Type Workflow = InternalType.Workflow.getType();
public static final Type Job = InternalType.Job.getType();
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 RootServiceHostComponent = InternalType.RootServiceHostComponent.getType();
public static final Type View = InternalType.View.getType();
public static final Type ViewURL = InternalType.ViewURL.getType();
public static final Type ViewVersion = InternalType.ViewVersion.getType();
public static final Type ViewInstance = InternalType.ViewInstance.getType();
public static final Type Blueprint = InternalType.Blueprint.getType();
public static final Type Recommendation = InternalType.Recommendation.getType();
public static final Type Validation = InternalType.Validation.getType();
public static final Type HostComponentProcess = InternalType.HostComponentProcess.getType();
public static final Type Permission = InternalType.Permission.getType();
public static final Type Alert = InternalType.Alert.getType();
public static final Type AlertDefinition = InternalType.AlertDefinition.getType();
public static final Type AlertHistory = InternalType.AlertHistory.getType();
public static final Type AlertGroup = InternalType.AlertGroup.getType();
public static final Type AlertTarget = InternalType.AlertTarget.getType();
public static final Type AlertNotice = InternalType.AlertNotice.getType();
public static final Type AmbariPrivilege = InternalType.AmbariPrivilege.getType();
public static final Type ClusterPrivilege = InternalType.ClusterPrivilege.getType();
public static final Type ViewPrivilege = InternalType.ViewPrivilege.getType();
public static final Type ViewPermission = InternalType.ViewPermission.getType();
public static final Type ClientConfig = InternalType.ClientConfig.getType();
public static final Type StackLevelConfiguration = InternalType.StackLevelConfiguration.getType();
public static final Type LdapSyncEvent = InternalType.LdapSyncEvent.getType();
public static final Type UserPrivilege = InternalType.UserPrivilege.getType();
public static final Type GroupPrivilege = InternalType.GroupPrivilege.getType();
public static final Type RepositoryVersion = InternalType.RepositoryVersion.getType();
public static final Type CompatibleRepositoryVersion = InternalType.CompatibleRepositoryVersion.getType();
public static final Type ClusterStackVersion = InternalType.ClusterStackVersion.getType();
public static final Type HostStackVersion = InternalType.HostStackVersion.getType();
public static final Type Upgrade = InternalType.Upgrade.getType();
public static final Type UpgradeGroup = InternalType.UpgradeGroup.getType();
public static final Type UpgradeItem = InternalType.UpgradeItem.getType();
public static final Type UpgradeSummary = InternalType.UpgradeSummary.getType();
public static final Type PreUpgradeCheck = InternalType.PreUpgradeCheck.getType();
public static final Type Stage = InternalType.Stage.getType();
public static final Type StackArtifact = InternalType.StackArtifact.getType();
public static final Type Artifact = InternalType.Artifact.getType();
public static final Type Theme = InternalType.Theme.getType();
public static final Type QuickLink = InternalType.QuickLink.getType();
public static final Type Widget = InternalType.Widget.getType();
public static final Type WidgetLayout = InternalType.WidgetLayout.getType();
public static final Type ActiveWidgetLayout = InternalType.ActiveWidgetLayout.getType();
public static final Type HostKerberosIdentity = InternalType.HostKerberosIdentity.getType();
public static final Type Credential = InternalType.Credential.getType();
public static final Type KerberosDescriptor = InternalType.KerberosDescriptor.getType();
public static final Type RoleAuthorization = InternalType.RoleAuthorization.getType();
public static final Type UserAuthorization = InternalType.UserAuthorization.getType();
public static final Type VersionDefinition = InternalType.VersionDefinition.getType();
public static final Type ClusterKerberosDescriptor = InternalType.ClusterKerberosDescriptor.getType();
public static final Type LoggingQuery = InternalType.LoggingQuery.getType();
public static final Type RemoteCluster = InternalType.RemoteCluster.getType();
/**
* The type name.
*/
private final String name;
/**
* The type ordinal value.
*/
private final int ordinal;
// ----- Constructors ----------------------------------------------------
/**
* Construct an internal type.
*
* @param name the type name
* @param ordinal the ordinal number
*/
private Type(String name, int ordinal) {
assert(name != null);
this.name = name;
this.ordinal = ordinal;
setType(name, this);
}
/**
* Construct an extended type.
*
* @param name the type name
*/
public Type(String name) {
this(name, getNextOrdinal());
}
// ----- Resource.Type ---------------------------------------------------
/**
* Get the ordinal number for this type.
*
* @return the ordinal number
*/
public final int ordinal() {
return ordinal;
}
/**
* Get the name for this type.
*
* @return the name
*/
public String name() {
return name;
}
/**
* Indicate whether this is an internal type.
*
* @return true if this is an internal type; false otherwise
*/
public boolean isInternalType() {
return ordinal < InternalType.values().length;
}
/**
* Get the internal type enum associated with this type.
*
* @return the internal type enum
*
* @throws UnsupportedOperationException if this type is not an internal type
*/
public InternalType getInternalType() {
if (isInternalType()) {
return InternalType.values()[ordinal];
}
throw new UnsupportedOperationException(name + " is not an internal type.");
}
/**
* Get the type associated with the given type name.
*
* @param name the type name
*
* @return the associated type
*
* @throws IllegalArgumentException if the given type name is not associated with any known type
*/
public static Type valueOf(String name) {
Type type = types.get(name);
if (type == null) {
throw new IllegalArgumentException(name + " is not a type.");
}
return type;
}
/**
* Get all of the known types.
*
* @return all of the types
*/
public static Type[] values() {
return types.values().toArray(new Type[types.size()]);
}
// ----- Object overrides ------------------------------------------------
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Type type = (Type) o;
return ordinal == type.ordinal && name.equals(type.name);
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + ordinal;
return result;
}
@Override
protected Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
@Override
public String toString() {
return name;
}
// ----- Comparable<Type> ------------------------------------------------
@Override
public int compareTo(Type type) {
return ordinal - type.ordinal();
}
// ----- helper methods --------------------------------------------------
// get the next ordinal number
private static synchronized int getNextOrdinal() {
return nextOrdinal++;
}
// register the type by name
private static void setType(String name, Type type) {
types.put(name, type);
}
// get the type for the given name; null if not present
private static Type getType(String name) {
return types.get(name);
}
}
}