/* * 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, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also 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 and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.enterprise.gui.configuration.resource; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import javax.faces.application.FacesMessage; import org.rhq.core.domain.configuration.AbstractResourceConfigurationUpdate; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.RawConfiguration; import org.rhq.core.gui.util.FacesContextUtility; import org.rhq.enterprise.server.configuration.ConfigurationManagerLocal; import org.rhq.enterprise.server.util.LookupUtil; //@Name("configurationEditor") //@Scope(ScopeType.CONVERSATION) public class ResourceConfigurationEditor extends ResourceConfigurationViewer implements Serializable { private Configuration originalResourceConfiguration; private Set<String> modifiedFiles = new HashSet<String>(); private String modalEditorContents; // @RequestParameter private String tab; @Override protected void doInitialization() { if (tab != null) { setSelectedTab(tab); } originalResourceConfiguration = resourceConfiguration.deepCopy(true); } @Override protected void changeToRawTab() { resourceConfiguration = translateToRaw(); for (RawConfiguration raw : resourceConfiguration.getRawConfigurations()) { RawConfigUIBean uiBean = findRawConfigUIBeanByPath(raw.getPath()); uiBean.setRawConfiguration(raw); } } private Configuration translateToRaw() { ConfigurationManagerLocal configurationMgr = LookupUtil.getConfigurationManager(); return configurationMgr.translateResourceConfiguration(loggedInUser.getSubject(), resourceId, resourceConfiguration, STRUCTURED_MODE); } @Override protected void changeToStructuredTab() { resourceConfiguration = translateToStructured(); for (RawConfiguration raw : resourceConfiguration.getRawConfigurations()) { RawConfigUIBean uiBean = findRawConfigUIBeanByPath(raw.getPath()); uiBean.setRawConfiguration(raw); } } private Configuration translateToStructured() { ConfigurationManagerLocal configurationMgr = LookupUtil.getConfigurationManager(); return configurationMgr.translateResourceConfiguration(loggedInUser.getSubject(), resourceId, resourceConfiguration, RAW_MODE); } // @Observer("rawConfigUpdate") public void rawConfigUpdated(RawConfigUIBean rawConfigUIBean) { if (rawConfigUIBean.isModified()) { // If the file is modified and not already in the cache, then the file was previously in an unmodified state // so we want to increment the number of files modified and put the file in the cache to track its current // state. if (!modifiedFiles.contains(rawConfigUIBean.getPath())) { modifiedFiles.add(rawConfigUIBean.getPath()); } // There is kind of an implicit else block to do nothing. If the file is modified and already in the cache, // then that means we have already incremented the number of files modified, so we do not need to // increment again. } else if (modifiedFiles.contains(rawConfigUIBean.getPath())) { // We fall into this block if the file is not modified and if the cache contains the file, which means it // was previously in a modified state; therefore, we remove it from the cache, and decrement the number of // files modified. modifiedFiles.remove(rawConfigUIBean.getPath()); } } public boolean isDisplayChangedFilesLabel() { if (isStructuredMode()) { return false; } if (isRawSupported()) { return true; } return isRawMode(); } public String getModifiedFilesMsg() { if (!isDisplayChangedFilesLabel() || modifiedFiles.size() == 0) { return ""; } if (modifiedFiles.size() == 1) { return "1 file changed in this configuration"; } return modifiedFiles.size() + " files changed in this configuration"; } public boolean getRenderFileUpload() { return isRawSupported() || isStructuredAndRawSupported(); } public String updateConfiguration() { ConfigurationManagerLocal configurationMgr = LookupUtil.getConfigurationManager(); try { AbstractResourceConfigurationUpdate updateRequest; if (isStructuredAndRawSupported()) { updateRequest = configurationMgr.updateStructuredOrRawConfiguration(loggedInUser.getSubject(), resourceId, resourceConfiguration, isStructuredMode()); } else { updateRequest = configurationMgr.updateResourceConfiguration(loggedInUser.getSubject(), resourceId, resourceConfiguration); } clearErrors(); if (updateRequest != null) { switch (updateRequest.getStatus()) { case SUCCESS: case INPROGRESS: FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, "Configuration update request with id " + updateRequest.getId() + " has been sent to the Agent."); return "success"; case FAILURE: FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Configuration update request with id " + updateRequest.getId() + " failed.", updateRequest.getErrorMessage()); // for (RawConfiguration raw : resourceConfiguration.getRawConfigurations()) { // String message = raw.errorMessage; // if (message != null) { // FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, raw.getPath(), message); // } // } copyErrorMessages(updateRequest); return "failure"; case NOCHANGE: addNoChangeMsgToFacesContext(); return "nochange"; } } } catch (Exception e) { FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Unable to contact the remote agent.", e .getCause()); return "failure"; } // updateRequest will be null if there is no change to the configuration. ConfigurationManagerBean checks to // see if the configuration has been modified before sending the request to the agent. If no change is detected, // it simply returns null. addNoChangeMsgToFacesContext(); return "nochange"; } private void clearErrors() { for (RawConfigDirectory dir : rawConfigDirectories) { for (RawConfigUIBean bean : dir.getRawConfigUIBeans()) { bean.setErrorMessage(null); } } } private void copyErrorMessages(AbstractResourceConfigurationUpdate update) { Configuration updatedConfiguration = update.getConfiguration(); for (RawConfiguration updatedRaw : updatedConfiguration.getRawConfigurations()) { RawConfigUIBean rawUIBean = findRawConfigUIBeanByPath(updatedRaw.getPath()); if (rawUIBean != null) { rawUIBean.setErrorMessage(updatedRaw.errorMessage); } // RawConfiguration raw = findRawConfigurationByPath(updatedRaw.getPath()); // if (raw != null) { // raw.errorMessage = updatedRaw.errorMessage; // } } } private RawConfiguration findRawConfigurationByPath(String path) { for (RawConfiguration raw : resourceConfiguration.getRawConfigurations()) { if (raw.getPath().equals(path)) { return raw; } } return null; } private void addNoChangeMsgToFacesContext() { FacesContextUtility.addMessage(FacesMessage.SEVERITY_WARN, "No changes were made to the configuration, so " + "no update request has been sent to the Agent."); } public void undoEdit(String path) { RawConfigUIBean rawConfigUIBean = findRawConfigUIBeanByPath(path); rawConfigUIBean.undoEdit(); } /** * * @return */ public String finishAddMap() { FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, "Map added."); return "success"; } public String finishEditMap() { FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, "Map updated."); return "success"; } public void setModalEditorContents(String contents) { modalEditorContents = contents; } public void applyModalEditContents() { selectedRawUIBean.setContents(modalEditorContents); } }