/*
* RHQ Management Platform
* Copyright (C) 2005-2009 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.core.domain.plugin;
import java.io.Serializable;
import org.jetbrains.annotations.Nullable;
/**
* Encapsulates informaton that can uniquely identify a plugin.
*
* @author John Mazzitelli
*/
public class PluginKey implements Serializable {
private static final long serialVersionUID = 1L;
private PluginDeploymentType deployment;
private String pluginType;
private String pluginName;
/**
* Creates a plugin key that identifies an agent plugin. There is only
* one plugin container that runs in the agent, thus there is only
* one "type" of an agent plugin. Therefore, {@link #getPluginType()} on the
* returned object will return <code>null</code> to signify this.
*
* @param pluginName the name of the plugin
* @return the plugin key for the agent plugin
*/
public static PluginKey createAgentPluginKey(String pluginName) {
return new PluginKey(PluginDeploymentType.AGENT, null, pluginName);
}
/**
* Creates a plugin key that identifies a server plugin. All server plugins
* must have a type and a name.
*
* @param pluginType the type of plugin - must not be null or an empty string
* @param pluginName the name of the plugin
* @return the plugin key for the server plugin
*/
public static PluginKey createServerPluginKey(String pluginType, String pluginName) {
// for server plugins, cannot allow an empty string for plugin type
if (pluginType == null || pluginType.length() == 0) {
throw new IllegalArgumentException("invalid pluginType: " + pluginType);
}
return new PluginKey(PluginDeploymentType.SERVER, pluginType, pluginName);
}
protected PluginKey() {
// required for GWT
}
/**
* Create a plugin key that identifies the given agent plugin.
*
* @param plugin agent plugin
*/
public PluginKey(Plugin plugin) {
this(plugin.getDeployment(), null, plugin.getName());
}
/**
* Create a plugin key that identifies the given server plugin.
*
* @param plugin server plugin
*/
public PluginKey(ServerPlugin plugin) {
this(plugin.getDeployment(), plugin.getType(), plugin.getName());
}
public PluginKey(PluginDeploymentType deployment, String pluginType, String pluginName) {
if (deployment == null) {
throw new IllegalArgumentException("deployment==null");
}
if (pluginType == null && deployment != PluginDeploymentType.AGENT) {
throw new IllegalArgumentException("only agent plugins can have null type");
}
if (pluginType != null && deployment == PluginDeploymentType.AGENT) {
throw new IllegalArgumentException("agent plugins must have null type");
}
if (pluginName == null || pluginName.length() == 0) {
throw new IllegalArgumentException("invalid pluginName: " + pluginName);
}
this.deployment = deployment;
this.pluginType = pluginType;
this.pluginName = pluginName;
}
public PluginDeploymentType getDeployment() {
return deployment;
}
public String getPluginName() {
return pluginName;
}
@Nullable
public String getPluginType() {
return pluginType;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("PluginKey [deployment=").append(deployment).append(", pluginType=").append(pluginType)
.append(", pluginName=").append(pluginName).append("]");
return builder.toString();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + deployment.hashCode();
result = prime * result + ((pluginType == null) ? 0 : pluginType.hashCode());
result = prime * result + pluginName.hashCode();
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof PluginKey)) {
return false;
}
PluginKey other = (PluginKey) obj;
if (!pluginName.equals(other.pluginName)) {
return false;
}
if (pluginType == null) {
if (other.pluginType != null) {
return false;
}
} else if (!pluginType.equals(other.pluginType)) {
return false;
}
if (deployment != other.deployment) {
return false;
}
return true;
}
}