/*
* NOTE: This copyright does *not* cover user programs that use HQ
* program services by normal system calls through the application
* program interfaces provided as part of the Hyperic Plug-in Development
* Kit or the Hyperic Client Development Kit - this is merely considered
* normal use of the program, and does *not* fall under the heading of
* "derived work".
*
* Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
* This file is part of HQ.
*
* HQ is free software; you can redistribute it and/or modify
* it under the terms version 2 of the GNU General Public License as
* published by the Free Software Foundation. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*/
package org.hyperic.hq.ui.taglib.display;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.views.jsp.TagUtils;
import org.hyperic.hq.appdef.shared.AppdefEntityConstants;
import org.hyperic.hq.appdef.shared.AppdefEntityID;
import org.hyperic.hq.appdef.shared.AppdefResourceTypeValue;
import org.hyperic.hq.appdef.shared.AppdefResourceValue;
import org.hyperic.hq.appdef.shared.InvalidAppdefTypeException;
import org.hyperic.hq.ui.util.RequestUtils;
/**
* This class is a two in one decorator/tag for use within the
* <code>TableTag</code>; it is a <code>ColumnDecorator</code> tag that returns
* property values of resources and their dependent objects, handling null
* values and the like.
*/
public class ResourceDecorator extends ColumnDecorator implements Tag {
private static Log log = LogFactory.getLog(ResourceDecorator.class
.getName());
private String baseKey;
private Boolean function;
private AppdefResourceValue resource;
private Boolean type;
private PageContext context;
private Tag parent;
private boolean resourceTypeIdIsSet = false;
private boolean resourceIdIsSet = false;
private Integer resourceId;
private Integer resourceTypeId;
private String resourceName;
public ResourceDecorator() {
super();
}
public String getBaseKey() {
return baseKey != null ? baseKey : "";
}
public void setBaseKey(String s) {
baseKey = s;
}
public Boolean getFunction() {
return function;
}
public void setFunction(Boolean s) {
function = s;
}
public AppdefResourceValue getResource() {
return resource;
}
public void setResource(AppdefResourceValue s) {
resource = s;
}
public Boolean getType() {
return type;
}
public void setType(Boolean s) {
type = s;
}
public String decorate(Object obj) throws JspException {
if (resourceTypeIdIsSet && resourceIdIsSet) {
try {
Integer id = getResourceId();
Integer typeId = getResourceTypeId();
String resourceName = getResourceName();
String resourceTypeName = AppdefEntityConstants.typeToString(typeId.intValue()).toLowerCase();
HttpServletRequest req = (HttpServletRequest) context.getRequest();
// resource/server/Inventory.do?mode=view&rid=${resource.resourceId}&type=${resource.resourceTypeId}
return "<a href=\"" + req.getContextPath() + "/resource/"
+ resourceTypeName + "/Inventory.do?mode=view&rid=" + id
+ "&type=" + typeId + " \" />" + resourceName + "</a>";
} catch(NullPointerException npe) {
log.debug(npe);
}
return "";
}
try {
AppdefResourceValue resource = getResource();
Boolean doFunction = getFunction();
if (Boolean.TRUE.equals(doFunction)) {
return doFunction(resource);
}
Boolean doType = getType();
if (Boolean.TRUE.equals(doType)) {
return doType(resource);
}
} catch (NullPointerException npe) {
log.debug(npe);
}
return "";
}
private String doFunction(AppdefResourceValue resource) {
// XXX: groups currently don't have entity ids. when they get
// them, we'll be able to return a function for them.
AppdefEntityID entityId = resource.getEntityId();
if (entityId == null) {
return "";
}
String typeName = entityId.getTypeName();
String key = getBaseKey() + '.' + typeName;
// String msg = TagUtils.getInstance().message(context, bundle, locale, key);
String msg = RequestUtils.message(key);
return msg != null ? msg : typeName;
}
private String doType(AppdefResourceValue resource) {
try {
// XXX: groups currently don't have resource types. when they
// get them, we'll be able to return a type for them.
AppdefResourceTypeValue resourceType = resource.getAppdefResourceTypeValue();
return resourceType != null ? resourceType.getName() : "";
} catch (InvalidAppdefTypeException e) {
log.debug("can't get resource type for resource [" + resource.getName() + "]: ", e);
return "";
}
}
public int doStartTag() throws JspTagException {
ColumnTag ancestorTag = (ColumnTag) TagSupport.findAncestorWithClass(this, ColumnTag.class);
if (ancestorTag == null) {
throw new JspTagException("A ResourceDecorator must be used within a ColumnTag.");
}
ancestorTag.setDecorator(this);
return SKIP_BODY;
}
public int doEndTag() {
return EVAL_PAGE;
}
public Tag getParent() {
return parent;
}
public void setParent(Tag t) {
this.parent = t;
}
public void setPageContext(PageContext pc) {
this.context = pc;
}
public void release() {
parent = null;
context = null;
function = null;
resource = null;
type = null;
baseKey = null;
parent = null;
}
public Integer getResourceId() {
return this.resourceId;
}
public void setResourceId(Integer resourceId) {
resourceIdIsSet = true;
this.resourceId = resourceId;
}
public Integer getResourceTypeId() {
return this.resourceTypeId;
}
public void setResourceTypeId(Integer resourceTypeId) {
resourceTypeIdIsSet = true;
this.resourceTypeId = resourceTypeId;
}
public String getResourceName() {
return this.resourceName;
}
public void setResourceName(String resourceName) {
this.resourceName = resourceName;
}
}