/* * Jopr Management Platform * Copyright (C) 2005-2009 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.plugins.jbossas5.adapter.impl.configuration.custom; import org.jboss.metatype.api.types.CompositeMetaType; import org.jboss.metatype.api.types.MapCompositeMetaType; import org.jboss.metatype.api.types.MetaType; import org.jboss.metatype.api.types.SimpleMetaType; import org.jboss.metatype.api.values.CompositeValue; import org.jboss.metatype.api.values.CompositeValueSupport; import org.jboss.metatype.api.values.MapCompositeValueSupport; import org.jboss.metatype.api.values.MetaValue; import org.jboss.metatype.plugins.types.MutableCompositeMetaType; import org.rhq.core.domain.configuration.Property; import org.rhq.core.domain.configuration.PropertyList; import org.rhq.core.domain.configuration.PropertyMap; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.configuration.definition.PropertyDefinition; import org.rhq.core.domain.configuration.definition.PropertyDefinitionList; import org.rhq.core.domain.configuration.definition.PropertyDefinitionMap; import org.rhq.plugins.jbossas5.adapter.api.AbstractPropertyListAdapter; import org.rhq.plugins.jbossas5.adapter.api.PropertyAdapter; import org.rhq.plugins.jbossas5.adapter.api.PropertyAdapterFactory; import org.rhq.plugins.jbossas5.adapter.impl.configuration.PropertyMapToMapCompositeValueSupportAdapter; import org.rhq.plugins.jbossas5.util.ConversionUtils; /** * This class provides code that maps back and forth between a {@link PropertyList} of {@link PropertyMap}s and a {@link * MapCompositeValueSupport} with the key being a JMS security role name and the value being a {@link * CompositeValueSupport}s representing the role's read/write/create permissions. Here's what the PropertyList looks * like: * <p/> * <code> <c:list-property name="securityConfig" min="2" max="4" displayName="Security Configurations" * description="This element specifies a XML fragment which describes the access control list to be used by the * SecurityManager to authorize client operations against the destination. The content model is the same as for the * SecurityManager SecurityConf attribute."> <c:map-property name="role" displayName="Security Configuration * Attributes" description="These are the attributes that define the role name, and if the role is allowed to read, * write or create Messages on this Queue."> <c:simple-property name="name" description="Name of the Security * Role. e.g. Guest" summary="true" required="true"/> <c:simple-property name="read" description="Is this role * allowed to read messages?" summary="true" required="false" type="boolean"/> <c:simple-property name="write" * description="Is this role allowed to write messages?" summary="true" required="false" type="boolean"/> * <c:simple-property name="create" description="Is this role allowed to create messages?" summary="true" * required="false" type="boolean"/> </c:map-property> </c:list-property> </code> * * @author Ian Springer */ public class JMSSecurityConfigAdapter extends AbstractPropertyListAdapter { public MetaValue convertToMetaValue(PropertyList propertyList, PropertyDefinitionList propertyDefinitionList, MetaType metaType) { MapCompositeMetaType securityConfigCompositeMetaType = (MapCompositeMetaType) metaType; MapCompositeValueSupport securityConfigCompositeValue = new MapCompositeValueSupport( securityConfigCompositeMetaType.getValueType()); populateMetaValueFromProperty(propertyList, securityConfigCompositeValue, propertyDefinitionList); return securityConfigCompositeValue; } public void populateMetaValueFromProperty(PropertyList propertyList, MetaValue metaValue, PropertyDefinitionList propertyDefinitionList) { MapCompositeValueSupport securityConfigCompositeValue = (MapCompositeValueSupport) metaValue; // First clear out all existing values from the MapCompositeValue. for (String key : securityConfigCompositeValue.getMetaType().keySet()) { securityConfigCompositeValue.remove(key); } // Now re-populate it with the values from the PropertyList. PropertyDefinitionMap memberPropDefMap = (PropertyDefinitionMap) propertyDefinitionList.getMemberDefinition(); for (Property memberProperty : propertyList.getList()) { PropertyMap memberPropMap = (PropertyMap) memberProperty; String roleName = memberPropMap.getSimple("name").getStringValue(); CompositeValueSupport roleCompositeValue = (CompositeValueSupport) createCompositeValue(memberPropDefMap); populateMetaValueFromProperty(memberPropMap, roleCompositeValue, memberPropDefMap); securityConfigCompositeValue.put(roleName, roleCompositeValue); } } public void populatePropertyFromMetaValue(PropertyList propertyList, MetaValue metaValue, PropertyDefinitionList propertyDefinitionList) { CompositeValue compositeValue = (CompositeValue) metaValue; CompositeMetaType compositeMetaType = compositeValue.getMetaType(); PropertyDefinitionMap memberPropertyDefinitionMap = (PropertyDefinitionMap) propertyDefinitionList .getMemberDefinition(); PropertyMapToMapCompositeValueSupportAdapter mapToMapCompositeValueAdapter = new PropertyMapToMapCompositeValueSupportAdapter(); for (String memberName : compositeMetaType.itemSet()) { MetaValue memberMetaValue = compositeValue.get(memberName); PropertyMap memberPropertyMap = mapToMapCompositeValueAdapter.convertToProperty(memberMetaValue, memberPropertyDefinitionMap); memberPropertyMap.put(new PropertySimple("name", memberName)); // add a simple for the role name to the map propertyList.add(memberPropertyMap); } } // NOTE: We can't just leverage PropertyMapToCompositeValueSupportAdapter, because we have to skip the "name" map member. private CompositeValue createCompositeValue(PropertyDefinitionMap propDefMap) { String name = (propDefMap != null) ? propDefMap.getName() : "CompositeMetaType"; String desc = (propDefMap != null && propDefMap.getDescription() != null) ? propDefMap.getDescription() : "none"; MutableCompositeMetaType compositeMetaType = new MutableCompositeMetaType(name, desc); if (propDefMap != null) { for (PropertyDefinition mapMemberPropDef : propDefMap.getOrderedPropertyDefinitions()) { if (mapMemberPropDef.getName().equals("name")) continue; String mapMemberDesc = (propDefMap.getDescription() != null) ? propDefMap.getDescription() : "none"; MetaType mapMemberMetaType = ConversionUtils.convertPropertyDefinitionToMetaType(mapMemberPropDef); compositeMetaType.addItem(mapMemberPropDef.getName(), mapMemberDesc, mapMemberMetaType); } } return new CompositeValueSupport(compositeMetaType); } // NOTE: We can't just leverage PropertyMapToCompositeValueSupportAdapter, because we have to skip the "name" map member. private void populateMetaValueFromProperty(PropertyMap propMap, MetaValue metaValue, PropertyDefinitionMap propDefMap) { CompositeValueSupport compositeValue = (CompositeValueSupport) metaValue; for (String mapMemberPropName : propMap.getMap().keySet()) { if (mapMemberPropName.equals("name")) continue; Property mapMemberProp = propMap.get(mapMemberPropName); PropertyDefinition mapMemberPropDef = propDefMap.get(mapMemberPropName); MetaType mapMemberMetaType = compositeValue.getMetaType().getType(mapMemberPropName); if (mapMemberMetaType == null) { // this will occur when new map properties are added since they are not present // in the original metaValue which we are using mapMemberMetaType = SimpleMetaType.STRING; } PropertyAdapter adapter = PropertyAdapterFactory.getPropertyAdapter(mapMemberMetaType); MetaValue mapMemberMetaValue = adapter.convertToMetaValue(mapMemberProp, mapMemberPropDef, mapMemberMetaType); compositeValue.set(mapMemberPropName, mapMemberMetaValue); } } }