/*
* 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;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.managed.api.ManagedObject;
import org.jboss.managed.api.ManagedProperty;
import org.jboss.managed.plugins.ManagedObjectImpl;
import org.jboss.managed.plugins.ManagedPropertyImpl;
import org.jboss.metatype.api.types.GenericMetaType;
import org.jboss.metatype.api.types.MetaType;
import org.jboss.metatype.api.values.EnumValue;
import org.jboss.metatype.api.values.GenericValue;
import org.jboss.metatype.api.values.GenericValueSupport;
import org.jboss.metatype.api.values.MetaValue;
import org.jboss.metatype.api.values.SimpleValue;
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.configuration.definition.PropertyDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionMap;
import org.rhq.plugins.jbossas5.adapter.api.AbstractPropertyMapAdapter;
import org.rhq.plugins.jbossas5.adapter.api.PropertyAdapter;
import org.rhq.plugins.jbossas5.adapter.api.PropertyAdapterFactory;
import org.rhq.plugins.jbossas5.util.ConversionUtils;
/**
* This class provides code that maps back and forth between a {@link PropertyMap} and a {@link GenericValue}. The
* GenericValue's value is assumed to be a {@link ManagedObject}.
*
* @author Ian Springer
*/
public class PropertyMapToGenericValueAdapter extends AbstractPropertyMapAdapter implements
PropertyAdapter<PropertyMap, PropertyDefinitionMap> {
private final Log log = LogFactory.getLog(this.getClass());
public void populateMetaValueFromProperty(PropertyMap propMap, MetaValue metaValue, PropertyDefinitionMap propDefMap) {
GenericValue genericValue = (GenericValue) metaValue;
if (!(genericValue.getValue() instanceof ManagedObject)) {
log.error("GenericValue's value [" + genericValue.getValue() + "] is not a ManagedObject - not supported!");
return;
}
ManagedObject managedObject = (ManagedObject) genericValue.getValue();
for (String propName : propMap.getMap().keySet()) {
Property mapMemberProp = propMap.get(propName);
ManagedProperty managedProp = managedObject.getProperty(propName);
MetaType metaType = managedProp.getMetaType();
PropertyAdapter propertyAdapter = PropertyAdapterFactory.getPropertyAdapter(metaType);
PropertyDefinition mapMemberPropDef = propDefMap.get(propName);
if (managedProp.getValue() == null) {
MetaValue managedPropMetaValue = propertyAdapter.convertToMetaValue(mapMemberProp, mapMemberPropDef,
metaType);
managedProp.setValue(managedPropMetaValue);
} else {
MetaValue managedPropMetaValue = (MetaValue) managedProp.getValue();
propertyAdapter.populateMetaValueFromProperty(mapMemberProp, managedPropMetaValue, mapMemberPropDef);
}
}
}
public MetaValue convertToMetaValue(PropertyMap propMap, PropertyDefinitionMap propDefMap, MetaType metaType) {
//GenericMetaType genericMetaType = (GenericMetaType)metaType;
ManagedObjectImpl managedObject = new ManagedObjectImpl(propDefMap.getName());
for (PropertyDefinition mapMemberPropDef : propDefMap.getMap().values()) {
ManagedPropertyImpl managedProp = new ManagedPropertyImpl(mapMemberPropDef.getName());
MetaType managedPropMetaType = ConversionUtils.convertPropertyDefinitionToMetaType(mapMemberPropDef);
managedProp.setMetaType(managedPropMetaType);
managedProp.setManagedObject(managedObject);
managedObject.getProperties().put(managedProp.getName(), managedProp);
}
GenericValue genericValue = new GenericValueSupport(new GenericMetaType(propDefMap.getName(),
propDefMap.getDescription()), managedObject);
populateMetaValueFromProperty(propMap, genericValue, propDefMap);
return genericValue;
}
public void populatePropertyFromMetaValue(PropertyMap propMap, MetaValue metaValue, PropertyDefinitionMap propDefMap) {
GenericValue genericValue = (GenericValue) metaValue;
ManagedObject managedObject = (ManagedObject) genericValue.getValue();
for (String propName : propDefMap.getMap().keySet()) {
ManagedProperty managedProp = managedObject.getProperty(propName);
if (managedProp != null) {
MetaType metaType = managedProp.getMetaType();
Object value;
if (metaType.isSimple()) {
SimpleValue simpleValue = (SimpleValue) managedProp.getValue();
value = simpleValue.getValue();
} else if (metaType.isEnum()) {
EnumValue enumValue = (EnumValue) managedProp.getValue();
value = enumValue.getValue();
} else {
log.error("Nested ManagedProperty's value [" + managedProp.getValue()
+ "] is not a SimpleValue or EnumValue - unsupported!");
continue;
}
propMap.put(new PropertySimple(propName, value));
}
}
}
}