/* * 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.core.domain.configuration.group; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.persistence.CascadeType; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import org.rhq.core.domain.configuration.AbstractPropertyMap; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.PluginConfigurationUpdate; import org.rhq.core.domain.configuration.Property; import org.rhq.core.domain.configuration.PropertyMap; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.group.ResourceGroup; @DiscriminatorValue("plugin") @Entity @NamedQueries( { @NamedQuery(name = GroupPluginConfigurationUpdate.QUERY_FIND_BY_GROUP_ID, query = "SELECT apcu " + "FROM GroupPluginConfigurationUpdate AS apcu " + "WHERE apcu.group.id = :groupId"), @NamedQuery(name = GroupPluginConfigurationUpdate.QUERY_FIND_LATEST_BY_GROUP_ID, query = "" // + "SELECT cgu " // + " FROM GroupPluginConfigurationUpdate cgu " // + " WHERE cgu.group.id = :groupId " // + " AND cgu.modifiedTime = ( SELECT MAX(cgu2.modifiedTime) " // + " FROM GroupPluginConfigurationUpdate cgu2 " // + " WHERE cgu2.group.id = :groupId ) "), @NamedQuery(name = GroupPluginConfigurationUpdate.QUERY_DELETE_BY_ID, query = "DELETE " + "FROM GroupPluginConfigurationUpdate AS apcu " + "WHERE apcu.id IN ( :ids ) ") }) public class GroupPluginConfigurationUpdate extends AbstractGroupConfigurationUpdate { public static final String QUERY_FIND_BY_GROUP_ID = "GroupPluginConfigurationUpdate.findByGroupId"; public static final String QUERY_FIND_LATEST_BY_GROUP_ID = "GroupPluginConfigurationUpdatee.findLatestByGroupId"; public static final String QUERY_DELETE_BY_ID = "GroupPluginConfigurationUpdate.deleteById"; private static final long serialVersionUID = 1L; @OneToMany(mappedBy = "groupConfigurationUpdate", fetch = FetchType.LAZY, cascade = { CascadeType.ALL }) private List<PluginConfigurationUpdate> configurationUpdates = new ArrayList<PluginConfigurationUpdate>(); protected GroupPluginConfigurationUpdate() { } // JPA public GroupPluginConfigurationUpdate(ResourceGroup group, String subjectName) { super(group, subjectName); /* * this.configuration = groupConfiguration.deepCopy(false); * * (ips, 02/13/09): This is a temporary workaround - we don't really need to store a Configuration at all, * since it can be recalculated from the member configs when needed, but the AbstractConfigurationUpdate * base class requires the configuration field to be non-null. */ this.configuration = new Configuration(); } public void setConfigurationUpdates(List<PluginConfigurationUpdate> configurationUpdates) { this.configurationUpdates = configurationUpdates; } public List<PluginConfigurationUpdate> getConfigurationUpdates() { return this.configurationUpdates; } public PluginConfigurationUpdate getPluginConfigurationUpdate(Resource updateTarget) { Configuration oldResourcePluginConfiguration = updateTarget.getPluginConfiguration(); Configuration newResourcePluginConfiguration = getMergedConfiguration(oldResourcePluginConfiguration, this.configuration); PluginConfigurationUpdate update = new PluginConfigurationUpdate(updateTarget, newResourcePluginConfiguration, getSubjectName()); return update; } private Configuration getMergedConfiguration(Configuration base, Configuration changes) { Configuration results = base.deepCopy(false); merge(results, changes); return results; } private void merge(AbstractPropertyMap base, AbstractPropertyMap changes) { for (Map.Entry<String, Property> changesEntry : changes.getMap().entrySet()) { String changesPropertyName = changesEntry.getKey(); Property changesProperty = changesEntry.getValue(); if (changesProperty instanceof PropertySimple) { PropertySimple changesPropertySimple = (PropertySimple) changesProperty; if ((changesPropertySimple.getOverride() == null) || (!changesPropertySimple.getOverride())) { continue; } PropertySimple basePropertySimple = (PropertySimple) base.get(changesPropertyName); if (basePropertySimple == null) { basePropertySimple = new PropertySimple(changesPropertyName, changesPropertySimple.getStringValue()); base.put(basePropertySimple); } else { basePropertySimple.setStringValue(changesPropertySimple.getStringValue()); } } else if (changesProperty instanceof PropertyMap) { PropertyMap changesPropertyMap = (PropertyMap) changesProperty; PropertyMap basePropertyMap = (PropertyMap) base.get(changesPropertyName); if (basePropertyMap == null) { basePropertyMap = new PropertyMap(changesPropertyName); base.put(basePropertyMap); } // Recurse... merge(basePropertyMap, changesPropertyMap); } /* else if (changesProperty instanceof PropertyList) { throw new UnsupportedOperationException( "PropertyList type not supported for group plugin configuration updates"); } else { throw new UnsupportedOperationException("Property of type '" + changesProperty.this.getClass().getName().substring(this.getClass().getName().lastIndexOf(".")+1) + "' " + "not supported for group plugin configuration updates"); } */ } } @Override protected void appendToStringInternals(StringBuilder str) { super.appendToStringInternals(str); //str.append(", pluginConfigurationUpdates=").append(getConfigurationUpdates()); } }