/*
* RHQ Management Platform
* Copyright (C) 2005-2008 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.enterprise.gui.legacy.taglib;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.enterprise.gui.common.tag.FunctionTagLibrary;
import org.rhq.enterprise.gui.legacy.util.RequestUtils;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
import org.rhq.enterprise.server.resource.ResourceTypeNotFoundException;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* A tag to show the inventory hierarchy links for the current resource or group, e.g.: _MAINFRAME_ > _JBoss Application
* Server 4.0.4.GA_ > _AgentQueue_
*
* @author Ian Springer
*/
public class InventoryHierarchyTag extends TagSupport {
private static final String SEPARATOR = " > ";
private Integer resourceId;
private Integer groupId;
private Integer resourceTypeId;
private Integer parentResourceId;
private ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
private ResourceGroupManagerLocal resourceGroupManager = LookupUtil.getResourceGroupManager();
private ResourceTypeManagerLocal resourceTypeManager = LookupUtil.getResourceTypeManager();
public Integer getResourceId() {
return resourceId;
}
public void setResourceId(Integer resourceId) {
this.resourceId = resourceId;
}
public Integer getGroupId() {
return groupId;
}
public void setGroupId(Integer groupId) {
this.groupId = groupId;
}
public Integer getParentResourceId() {
return parentResourceId;
}
public void setParentResourceId(Integer parentResourceId) {
this.parentResourceId = parentResourceId;
}
public Integer getResourceTypeId() {
return resourceTypeId;
}
public void setResourceTypeId(Integer resourceTypeId) {
this.resourceTypeId = resourceTypeId;
}
@Override
public final int doStartTag() throws JspException {
String html;
if (this.resourceId != null) {
html = buildResourceHTML(this.resourceId);
} else if (this.groupId != null) {
html = buildGroupHTML();
} else if (this.resourceTypeId != null) {
html = buildAutoGroupHTML();
} else {
throw new JspException("Neither 'resourceId' nor 'groupId' attribute is present on the tag.");
}
try {
this.pageContext.getOut().write(html);
} catch (IOException e) {
throw new JspException(e);
}
return SKIP_BODY;
}
private String buildResourceHTML(Integer resourceId) {
List<Resource> ancestorResources = this.resourceManager.getResourceLineage(resourceId);
if (ancestorResources.isEmpty()) {
throw new IllegalStateException(
"The list of ancestor resources should always contain at least one resource - the resource whose lineage was requested.");
}
Resource parentResource = ancestorResources.get(ancestorResources.size() - 1);
StringBuilder html = new StringBuilder();
for (Resource ancestorResource : ancestorResources) {
html.append("<a href=\"").append(buildResourceURL(ancestorResource)).append("\">");
html.append(ancestorResource.getName()).append("</a>");
if (ancestorResource.getId() != parentResource.getId()) // separator after every item except the last one
{
html.append(SEPARATOR);
}
}
return html.toString();
}
private String buildGroupHTML() throws JspException {
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
Subject subject;
try {
subject = RequestUtils.getSubject(request);
} catch (ServletException e) {
throw new JspException(e.getMessage());
}
ResourceGroup resourceGroup = this.resourceGroupManager.getResourceGroupById(subject, this.groupId, null);
StringBuilder html = new StringBuilder();
html.append("<a href=\"").append(buildGroupURL(resourceGroup)).append("\">");
html.append(resourceGroup.getName()).append("</a>");
return html.toString();
}
private String buildAutoGroupHTML() throws JspException {
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
Subject subject;
try {
subject = RequestUtils.getSubject(request);
} catch (ServletException e) {
throw new JspException(e.getMessage());
}
StringBuilder html = new StringBuilder();
html.append(buildResourceHTML(this.parentResourceId));
html.append(SEPARATOR);
try {
ResourceType resourceType = resourceTypeManager.getResourceTypeById(subject, this.resourceTypeId);
html.append("<a href=\"").append(buildAutoGroupURL()).append("\">");
html.append(resourceType.getName()).append("</a>");
} catch (ResourceTypeNotFoundException e) {
throw new JspException(e.getMessage());
}
return html.toString();
}
private String buildResourceURL(Resource resource) {
String url = FunctionTagLibrary.getDefaultResourceTabURL() + "?id=" + resource.getId();
// Session-encode the URL in case the client doesn't have cookies enabled.
return encodeURL(url);
}
private String buildGroupURL(ResourceGroup resourceGroup) {
GroupCategory category = resourceGroup.getGroupCategory();
String url = FunctionTagLibrary.getDefaultGroupTabURL() + "?category=" + category.name() + "&groupId="
+ resourceGroup.getId();
// Session-encode the URL in case the client doesn't have cookies enabled.
return encodeURL(url);
}
private String buildAutoGroupURL() {
String url = FunctionTagLibrary.getDefaultAutoGroupTabURL() + "?id=" + parentResourceId + "&parent="
+ parentResourceId + "&type=" + resourceTypeId;
// Session-encode the URL in case the client doesn't have cookies enabled.
return encodeURL(url);
}
private String encodeURL(String url) {
HttpServletResponse response = (HttpServletResponse) this.pageContext.getResponse();
return response.encodeURL(url);
}
}