/* * 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.definition.group; import javax.faces.application.FacesMessage; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.resource.group.GroupDefinition; import org.rhq.core.gui.util.FacesContextUtility; import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility; import org.rhq.enterprise.server.resource.group.ResourceGroupUpdateException; import org.rhq.enterprise.server.resource.group.definition.GroupDefinitionManagerLocal; import org.rhq.enterprise.server.resource.group.definition.exception.GroupDefinitionException; import org.rhq.core.domain.resource.group.InvalidExpressionException; import org.rhq.enterprise.server.util.LookupUtil; public class EditGroupDefinitionGeneralPropertiesUIBean { private final Log log = LogFactory.getLog(EditGroupDefinitionGeneralPropertiesUIBean.class); public static final String MANAGED_BEAN_NAME = "EditGroupDefinitionGeneralPropertiesUIBean"; private static final String OUTCOME_SUCCESS = "success"; private static final String OUTCOME_FAILURE = "failure"; private static final String TEMPORARY_EDIT_MARKER = "temporaryEditGroupDef-Marker"; private static final String TEMPORARY_EXPRESSION_ATTRIBUTE = "temporaryGroupDefExpr"; private static final String TEMPORARY_NAME_ATTRIBUTE = "temporaryGroupDefName"; private static final String TEMPORARY_DESCRIPTION_ATTRIBUTE = "temporaryGroupDefDescription"; private static final String TEMPORARY_RECURSIVE_ATTRIBUTE = "temporaryGroupDefRecursive"; private static final String TEMPORARY_RECALCULATION_INTERVAL = "recalculationInterval"; private String name; private String description; private boolean recursive; private int recalculationInterval; private String expression; private GroupDefinitionManagerLocal groupDefinitionManager = LookupUtil.getGroupDefinitionManager(); public EditGroupDefinitionGeneralPropertiesUIBean() { GroupDefinition groupDefinition = null; try { groupDefinition = GroupDefinitionUIBean.lookupGroupDefinition(); } catch (GroupDefinitionException gde) { FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Problem looking up group definition: " + gde.getMessage()); return; } HttpSession session = FacesContextUtility.getRequest().getSession(); String marker = (String) session.getAttribute(TEMPORARY_EDIT_MARKER); String previousExpression = (String) session.getAttribute(TEMPORARY_EXPRESSION_ATTRIBUTE); String previousName = (String) session.getAttribute(TEMPORARY_NAME_ATTRIBUTE); String previousDescription = (String) session.getAttribute(TEMPORARY_DESCRIPTION_ATTRIBUTE); String previousRecursive = (String) session.getAttribute(TEMPORARY_RECURSIVE_ATTRIBUTE); String previousInterval = (String) session.getAttribute(TEMPORARY_RECALCULATION_INTERVAL); if (marker == null) { this.expression = groupDefinition.getExpression(); this.name = groupDefinition.getName(); this.description = groupDefinition.getDescription(); this.recursive = groupDefinition.isRecursive(); this.recalculationInterval = (int) (groupDefinition.getRecalculationInterval() / 60000L); } else { this.expression = previousExpression; this.name = previousName; this.description = previousDescription; this.recursive = previousRecursive.equals("TRUE"); this.recalculationInterval = previousInterval == null ? 0 : Integer.parseInt(previousInterval); } session.removeAttribute(TEMPORARY_EDIT_MARKER); session.removeAttribute(TEMPORARY_EXPRESSION_ATTRIBUTE); session.removeAttribute(TEMPORARY_NAME_ATTRIBUTE); session.removeAttribute(TEMPORARY_DESCRIPTION_ATTRIBUTE); session.removeAttribute(TEMPORARY_RECURSIVE_ATTRIBUTE); session.removeAttribute(TEMPORARY_RECALCULATION_INTERVAL); } public String begin() { return OUTCOME_SUCCESS; } public String update() { HttpSession session = FacesContextUtility.getRequest().getSession(); try { GroupDefinition groupDefinition = GroupDefinitionUIBean.lookupGroupDefinition(); groupDefinition.setName(this.name); groupDefinition.setDescription(this.description); groupDefinition.setRecursive(this.recursive); groupDefinition.setRecalculationInterval(this.recalculationInterval * 60000L); /* * cleanse expression of system-dependent new line chars * * unified everything as a single '\n' character by replacing singular instances of '\f' and '\r' with '\n', * and then replacing all adjacent '\n' characters with a single character of the same */ groupDefinition.setExpression(expression.replaceAll("\\r", "\n").replaceAll("\\f", "\n").replaceAll("\\n+", "\n")); session.setAttribute(TEMPORARY_EDIT_MARKER, "marker"); session.setAttribute(TEMPORARY_EXPRESSION_ATTRIBUTE, expression); session.setAttribute(TEMPORARY_NAME_ATTRIBUTE, name); session.setAttribute(TEMPORARY_DESCRIPTION_ATTRIBUTE, description); session.setAttribute(TEMPORARY_RECURSIVE_ATTRIBUTE, (recursive ? "TRUE" : "FALSE")); session.setAttribute(TEMPORARY_RECALCULATION_INTERVAL, String.valueOf(recalculationInterval)); this.groupDefinitionManager.updateGroupDefinition(EnterpriseFacesContextUtility.getSubject(), groupDefinition); // don't bother logging the GroupDefinitionException or InvalidExpressionException, since these are expected } catch (GroupDefinitionException gde) { FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Problem updating group definition: " + gde.getMessage()); return OUTCOME_FAILURE; } catch (InvalidExpressionException iee) { FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Syntax error in your group definition: " + iee.getMessage()); return OUTCOME_FAILURE; } catch (Exception e) { FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Error updating group definition: " + e.getMessage()); log.error("Error updating group definition: ", e); return OUTCOME_FAILURE; } session.removeAttribute(TEMPORARY_EDIT_MARKER); FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, "General properties updated."); return OUTCOME_SUCCESS; } public String reset() { return OUTCOME_FAILURE; } public String createGroups() { try { GroupDefinition groupDefinition = GroupDefinitionUIBean.lookupGroupDefinition(); Subject subject = EnterpriseFacesContextUtility.getSubject(); this.groupDefinitionManager.calculateGroupMembership(subject, groupDefinition.getId()); } catch (GroupDefinitionException gde) { FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Problem updating group definition: " + gde.getMessage()); log.error("Problem updating group definition: ", gde); return OUTCOME_FAILURE; } catch (InvalidExpressionException iee) { FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Syntax error in one of your group definition expressions: " + iee.getMessage()); log.error("Syntax error in one of your group definition expressions: ", iee); return OUTCOME_FAILURE; } catch (ResourceGroupUpdateException rgue) { FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "There was a problem adding one or more resource groups: " + rgue.getMessage()); log.error("There was a problem adding one or more resource groups: ", rgue); return OUTCOME_FAILURE; } catch (Exception e) { Throwable t = e.getCause(); if (t instanceof ClassCastException) { FacesContextUtility.addMessage(FacesMessage.SEVERITY_WARN, "Probable syntax error: " + "this is likely due to comparing an integer property of resource (such as id) to a non-numeric, " + "or using a string function (startswith, endswith, or contains) on an integer property"); log.error("There was a problem calculating the results: ", t); return OUTCOME_FAILURE; } else { FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "There was a problem calculating the results: " + e.getMessage()); log.error("There was a problem calculating the results: ", e); return OUTCOME_FAILURE; } } FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, "Group Definition's Resource Groups Calculated."); return OUTCOME_SUCCESS; } public String cancel() { FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, "General properties not updated."); return OUTCOME_SUCCESS; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getDescription() { return this.description; } public void setDescription(String description) { this.description = description; } public boolean getRecursive() { return recursive; } public void setRecursive(boolean recursive) { this.recursive = recursive; } public String getExpression() { return expression; } public void setExpression(String expression) { this.expression = expression; } public int getRecalculationInterval() { return recalculationInterval; } public void setRecalculationInterval(int recalculationInterval) { this.recalculationInterval = recalculationInterval; } }