/*
* 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.inventory.resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.MeasurementData;
import org.rhq.core.domain.measurement.MeasurementDataTrait;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceError;
import org.rhq.core.domain.resource.ResourceErrorType;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.composite.ResourceAvailabilitySummary;
import org.rhq.core.domain.resource.composite.ResourceFacets;
import org.rhq.core.domain.resource.composite.ResourcePermission;
import org.rhq.core.template.TemplateEngine;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.measurement.AvailabilityManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementDataManagerLocal;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* A JSF managed bean that represents a RHQ resource. In addition to exposing the core Resource properties, it also
* exposes the resource's parent, facets and the current user's implicit permissions for that resource. Note: This bean
* is only intended for reading this information, not updating it.
*
* @author Ian Springer
*/
//@Name(ResourceUIBean.MANAGED_BEAN_NAME)
//@Scope(ScopeType.EVENT)
public class ResourceUIBean {
protected final Log log = LogFactory.getLog(ResourceUIBean.class);
public static final String MANAGED_BEAN_NAME = "ResourceUIBean";
private Resource resource;
private Resource parent;
private ResourcePermission permissions;
private ResourceFacets facets;
private List<?> tabs;
private ResourceError invalidPluginConfigurationError;
private ResourceAvailabilitySummary availabilitySummary;
private AvailabilityType availabilityType;
private boolean canShowParent = false;
private ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
private ResourceTypeManagerLocal resourceTypeManager = LookupUtil.getResourceTypeManager();
private AuthorizationManagerLocal authorizationManager = LookupUtil.getAuthorizationManager();
//private PerspectiveManagerLocal perspectiveManager = LookupUtil.getPerspectiveManager();
private String message;
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
public ResourceUIBean() {
this(EnterpriseFacesContextUtility.getResource());
log.debug("Creating " + ResourceUIBean.class.getSimpleName());
}
public ResourceUIBean(Resource resource) {
this(resource, EnterpriseFacesContextUtility.getSubject());
}
public ResourceUIBean(Resource resource, Subject subject) {
this.resource = resource;
this.parent = resourceManager.getParentResource(this.resource.getId());
Set<Permission> resourcePerms = this.authorizationManager.getImplicitResourcePermissions(subject, this.resource
.getId());
this.permissions = new ResourcePermission(resourcePerms);
this.facets = this.resourceTypeManager.getResourceFacets(getResourceType().getId());
//this.tabs = this.perspectiveManager.getResourceTabs(subject, this.resource);
//parent can be viewed by user only if he is allowed to see it
if (parent != null)
this.canShowParent = this.authorizationManager.canViewResource(subject, parent.getId());
List<ResourceError> errors = this.resourceManager.findResourceErrors(subject, this.resource.getId(),
ResourceErrorType.INVALID_PLUGIN_CONFIGURATION);
if (errors.size() == 1) {
this.invalidPluginConfigurationError = errors.get(0);
}
}
public int getId() {
return this.resource.getId();
}
public String getUuid() {
return this.resource.getUuid();
}
@NotNull
public String getName() {
return this.resource.getName();
}
public String getResourceKey() {
return this.resource.getResourceKey();
}
public ResourceType getResourceType() {
return this.resource.getResourceType();
}
public InventoryStatus getInventoryStatus() {
return this.resource.getInventoryStatus();
}
public boolean isConnected() {
return this.resource.isConnected();
}
public String getVersion() {
return this.resource.getVersion();
}
public String getDescription() {
return this.resource.getDescription();
}
public long getCtime() {
return this.resource.getCtime();
}
public long getMtime() {
return this.resource.getMtime();
}
public String getModifiedBy() {
return this.resource.getModifiedBy();
}
public String getLocation() {
return this.resource.getLocation();
}
public Resource getParent() {
return this.parent;
}
public ResourcePermission getPermissions() {
return this.permissions;
}
public ResourceFacets getFacets() {
return this.facets;
}
public List<?> getTabs() {
return this.tabs;
}
@Nullable
public ResourceError getInvalidPluginConfigurationError() {
return this.invalidPluginConfigurationError;
}
public AvailabilityType getAvailabilityType() {
if (availabilityType == null) {
AvailabilityManagerLocal manager = LookupUtil.getAvailabilityManager();
Subject subject = EnterpriseFacesContextUtility.getSubject();
availabilityType = manager.getCurrentAvailabilityTypeForResource(subject, getId());
}
return availabilityType;
}
public ResourceAvailabilitySummary getAvailabilitySummary() {
if (availabilitySummary == null) {
availabilitySummary = resourceManager.getAvailabilitySummary(EnterpriseFacesContextUtility.getSubject(),
getId());
}
return availabilitySummary;
}
public boolean isCanShowParent() {
return canShowParent;
}
TemplateEngine templateEngine;
public TemplateEngine getTemplateEngine() {
try {
if (null == templateEngine) {
Subject subject = EnterpriseFacesContextUtility.getSubject();
Resource platform = this.resourceManager.getPlaformOfResource(subject, this.resource.getId());
MeasurementDataManagerLocal measurementDataManager = LookupUtil.getMeasurementDataManager();
List<MeasurementDataTrait> traits = measurementDataManager.findCurrentTraitsForResource(subject,
platform.getId(), null);
Map<String, String> tokens = new HashMap<String, String>();
for (MeasurementData data : traits) {
String name = data.getName().toLowerCase().replace(' ', '_');
tokens.put("rhq.system." + name, data.getValue().toString());
}
templateEngine = new TemplateEngine(tokens);
}
} catch (Throwable t) {
//No clean way to recover. This is probably indicative of a problem elsewhere
log.error("Cannot fetch data for template engine", t);
}
return templateEngine;
}
public void setTemplateEngine(TemplateEngine templateEngine) {
this.templateEngine = templateEngine;
}
}