/*
* RHQ Management Platform
* Copyright (C) 2005-2011 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.common;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.rhq.core.domain.resource.group.ResourceGroup;
/**
* Category is assigned with the following preference assuming multiple categories can be satisfied with the available
* context information:
* <pre>
* ResourceGroup
* AutoGroup
* ResourceTemplate
* Resource
* <pre>
*
* @author Joseph Marques
*/
public class EntityContext implements Serializable {
private static final long serialVersionUID = 1L;
public enum Type {
Resource, //
ResourceTemplate, //
ResourceGroup, //
AutoGroup, // TODO: Deprecated, used in portal war
SubsystemView;
}
// can't make these fields final because need public no-arg ctor for GWT-compile
public Type type;
public int resourceId;
public int groupId;
public int parentResourceId;
public int resourceTypeId;
// further decoration available for the ResourceGroup context
private boolean isAutoCluster = false;
private boolean isAutoGroup = false;
public EntityContext() {
}
public boolean isResource() {
return Type.Resource == type;
}
public boolean isResourceGroup() {
return Type.ResourceGroup == type;
}
public boolean isAutoCluster() {
return Type.ResourceGroup == type && isAutoCluster;
}
public boolean isAutoGroup() {
return Type.ResourceGroup == type && isAutoGroup;
}
public boolean isSubsystemView() {
return Type.SubsystemView == type;
}
public Type getType() {
return type;
}
public int getResourceId() {
return resourceId;
}
public int getGroupId() {
return groupId;
}
public int getParentResourceId() {
return parentResourceId;
}
public int getResourceTypeId() {
return resourceTypeId;
}
public EntityContext(Integer resourceId, Integer groupId, Integer parentResourceId, Integer resourceTypeId) {
int rId = (resourceId != null && resourceId > 0) ? resourceId : -1;
int gId = (groupId != null && groupId > 0) ? groupId : -1;
int prId = (parentResourceId != null && parentResourceId > 0) ? parentResourceId : -1;
int rtId = (resourceTypeId != null && resourceTypeId > 0) ? resourceTypeId : -1;
this.resourceId = rId;
this.groupId = gId;
this.parentResourceId = prId;
this.resourceTypeId = rtId;
if (this.groupId > 0) {
type = Type.ResourceGroup;
} else if (this.resourceTypeId > 0) {
if (this.parentResourceId > 0) {
type = Type.AutoGroup;
} else {
type = Type.ResourceTemplate;
}
} else if (this.resourceId > 0) {
type = Type.Resource;
} else {
type = Type.SubsystemView;
}
}
public static EntityContext forResource(int resourceId) {
return new EntityContext(resourceId, null, null, null);
}
public static EntityContext forGroup(int groupId) {
return new EntityContext(null, groupId, null, null);
}
public static EntityContext forGroup(int groupId, boolean isAutoCluster, boolean isAutoGroup) {
EntityContext context = new EntityContext(null, groupId, null, null);
context.isAutoCluster = isAutoCluster;
context.isAutoGroup = isAutoGroup;
return context;
}
public static EntityContext forGroup(ResourceGroup group) {
EntityContext context = new EntityContext(null, group.getId(), null, null);
context.isAutoCluster = group.getClusterResourceGroup() != null;
context.isAutoGroup = group.getSubject() != null;
if (context.isAutoGroup) {
context.parentResourceId = group.getAutoGroupParentResource().getId();
context.resourceTypeId = group.getResourceType().getId();
}
return context;
}
// TODO: deprecated
public static EntityContext forAutoGroup(int parentResourceId, int resourceTypeId) {
return new EntityContext(null, null, parentResourceId, resourceTypeId);
}
public static EntityContext forTemplate(int resourceTypeId) {
return new EntityContext(null, null, null, resourceTypeId);
}
public static EntityContext forSubsystemView() {
return new EntityContext(null, null, null, null);
}
public static EntityContext fromCriteriaMap(Map<String, Object> criteriaMap) {
return new EntityContext(//
Integer.valueOf((String) criteriaMap.get("resourceId")), //
Integer.valueOf((String) criteriaMap.get("groupId")), //
Integer.valueOf((String) criteriaMap.get("parentResourceId")), //
Integer.valueOf((String) criteriaMap.get("resourceTypeId")));
}
public Map<String, String> toCriteriaMap() {
Map<String, String> criteriaMap = new HashMap<String, String>();
switch (type) {
case Resource:
criteriaMap.put("resourceId", String.valueOf(resourceId));
break;
case ResourceGroup:
criteriaMap.put("groupId", String.valueOf(groupId));
break;
case AutoGroup:
criteriaMap.put("parentResourceId", String.valueOf(parentResourceId));
criteriaMap.put("resourceTypeId", String.valueOf(resourceTypeId));
break;
case ResourceTemplate:
criteriaMap.put("resourceTypeId", String.valueOf(resourceTypeId));
break;
}
return criteriaMap;
}
public String getLegacyKey() {
switch (type) {
case Resource:
return String.valueOf(resourceId);
case ResourceGroup:
return "cg=" + String.valueOf(groupId);
case AutoGroup:
return "ag=" + String.valueOf(parentResourceId) + ":" + String.valueOf(resourceTypeId);
default:
throw new IllegalArgumentException(getUnknownContextMessage());
}
}
public String getUnknownContextMessage() {
return "Unsupported EntityContext '" + this + "'";
}
@Override
public String toString() {
return "EntityContext[category=" + type + ",resourceId=" + resourceId + "," + "groupId=" + groupId + ","
+ "parent=" + parentResourceId + "," + "type=" + resourceTypeId + "]";
}
public String toShortString() {
switch (type) {
case Resource:
return "resource[id=" + resourceId + "]";
case ResourceGroup:
return "resourceGroup[groupId=" + resourceId + "]";
case AutoGroup:
return "autoGroup[parent=" + parentResourceId + ",type=" + resourceTypeId + "]";
case ResourceTemplate:
return "template[type=" + resourceTypeId + "]";
default:
return toString();
}
}
}