/*
* 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.configuration;
import java.util.Hashtable;
import java.util.Map;
import javax.faces.context.FacesContext;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.gui.util.FacesContextUtility;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.configuration.ConfigurationManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* This is an abstract JSF managed bean for Configuration view and edit pages. The contents of the pages are
* dynamically generated based on the ConfigurationDefinition (metadata) and current Configuration (data)
* properties of this managed bean.
*
* @author Ian Springer
*/
public abstract class AbstractConfigurationUIBean {
protected static final String SUCCESS_OUTCOME = "success";
protected static final String FAILURE_OUTCOME = "failure";
protected ConfigurationManagerLocal configurationManager = LookupUtil.getConfigurationManager();
private Map<Integer, ConfigurationDefinition> configurationDefinitionMap; // maps subclass-specified Integer keys to resource ConfigurationDefinitions
private Map<Integer, Configuration> configurationMap; // maps subclass-specified Integer keys to resource Configurations
protected AbstractConfigurationUIBean() {
this.configurationDefinitionMap = new Hashtable<Integer, ConfigurationDefinition>();
this.configurationMap = new Hashtable<Integer, Configuration>();
}
protected <T> void removeSessionScopedBeanIfInView(String targetViewId, Class<T> clazz) {
try {
String viewId = FacesContext.getCurrentInstance().getViewRoot().getViewId();
if (viewId != null && viewId.equals(targetViewId)) {
FacesContextUtility.removeSessionScopedBean(clazz);
}
} catch (Throwable t) {
/*
* catch all possible issues so as to always let the page keep loading;
* if our trick (RHQ-1841) didn't work fall back to existing functionality
*/
}
}
@Nullable
protected abstract ConfigurationDefinition lookupConfigurationDefinition();
protected abstract int getConfigurationDefinitionKey();
public void setConfigurationDefinition(@NotNull ConfigurationDefinition configurationDefinition) {
this.configurationDefinitionMap.put(getConfigurationDefinitionKey(), configurationDefinition);
}
public ConfigurationDefinition getConfigurationDefinition() {
ConfigurationDefinition configurationDefinition = this.configurationDefinitionMap
.get(getConfigurationDefinitionKey());
if (configurationDefinition == null) {
configurationDefinition = lookupConfigurationDefinition();
if (configurationDefinition != null) {
this.configurationDefinitionMap.put(getConfigurationDefinitionKey(), configurationDefinition);
}
}
return configurationDefinition;
}
@Nullable
protected abstract Configuration lookupConfiguration();
protected abstract int getConfigurationKey();
public void setConfiguration(@NotNull Configuration configuration) {
this.configurationMap.put(getConfigurationKey(), configuration);
}
public Configuration getConfiguration() {
Configuration configuration = this.configurationMap.get(getConfigurationKey());
if (configuration == null) {
configuration = lookupConfiguration();
if (configuration != null) {
this.configurationMap.put(getConfigurationKey(), configuration);
}
}
return configuration;
}
public void clearConfiguration() {
this.configurationMap.remove(getConfigurationKey());
}
public boolean isUpdateInProgress() {
Subject subject = EnterpriseFacesContextUtility.getSubject();
int resourceId = EnterpriseFacesContextUtility.getResource().getId();
return this.configurationManager.isResourceConfigurationUpdateInProgress(subject, resourceId);
}
public String getNullConfigurationDefinitionMessage() {
return "This resource does not expose a configuration.";
}
public String getNullConfigurationMessage() {
return "This resource's configuration has not yet been initialized.";
}
}