/* * 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.serviceBinding; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.jboss.metatype.api.types.CollectionMetaType; import org.jboss.metatype.api.types.CompositeMetaType; import org.jboss.metatype.api.types.ImmutableCompositeMetaType; import org.jboss.metatype.api.types.MetaType; import org.jboss.metatype.api.values.CollectionValue; import org.jboss.metatype.api.values.CollectionValueSupport; import org.jboss.metatype.api.values.CompositeValue; import org.jboss.metatype.api.values.MapCompositeValueSupport; import org.jboss.metatype.api.values.MetaValue; import org.jboss.metatype.api.values.SimpleValue; import org.jboss.metatype.api.values.SimpleValueSupport; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.Property; import org.rhq.core.domain.configuration.PropertyMap; import org.rhq.core.domain.configuration.PropertySimple; /** * Utility class for the SBM components. * * @author Lukas Krejci */ class Util { public static final String STANDARD_BINDINGS_PROPERTY = "standardBindings"; public static final String OVERRIDE_BINDINGS_PROPERTY = "overrideBindings"; public static final String ACTIVE_BINDING_SET_NAME_PROPERTY = "activeBindingSetName"; public static final String BINDING_SETS_PROPERTY = "bindingSets"; public static final String NAME_PROPERTY = "name"; public static final String DEFAULT_HOST_NAME_PROPERTY = "defaultHostName"; public static final String DESCRIPTION_PROPERTY = "description"; public static final String FULLY_QUALIFIED_NAME_PROPERTY = "fullyQualifiedName"; public static final String BINDING_NAME_PROPERTY = "bindingName"; public static final String SERVICE_NAME_PROPERTY = "serviceName"; public static final String PORT_OFFSET_PROPERTY = "portOffset"; public static final String HOST_NAME_PROPERTY = "hostName"; public static final String PORT_PROPERTY = "port"; public static final String FIXED_HOST_NAME_PROPERTY = "fixedHostName"; public static final String FIXED_PORT_PROPERTY = "fixedPort"; public static class PropertyDefinition { public String propertyName; public Class<?> propertyType; public PropertyDefinition(String propertyName, Class<?> propertyType) { this.propertyName = propertyName; this.propertyType = propertyType; } } public static final PropertyDefinition[] BINDING_SET_SIMPLE_PROPERTIES = { new PropertyDefinition(NAME_PROPERTY, String.class), new PropertyDefinition(DEFAULT_HOST_NAME_PROPERTY, String.class), new PropertyDefinition(PORT_OFFSET_PROPERTY, Integer.class) }; /** * All the properties of the override binding. */ public static final PropertyDefinition[] BINDING_SET_OVERRIDE_PROPERTIES = { new PropertyDefinition(SERVICE_NAME_PROPERTY, String.class), new PropertyDefinition(BINDING_NAME_PROPERTY, String.class), new PropertyDefinition(FULLY_QUALIFIED_NAME_PROPERTY, String.class), new PropertyDefinition(DESCRIPTION_PROPERTY, String.class), new PropertyDefinition(HOST_NAME_PROPERTY, String.class), new PropertyDefinition(PORT_PROPERTY, Integer.class) }; /** * Properties of a standard binding. */ public static final PropertyDefinition[] STANDARD_BINDING_PROPERTIES = { new PropertyDefinition(SERVICE_NAME_PROPERTY, String.class), new PropertyDefinition(BINDING_NAME_PROPERTY, String.class), new PropertyDefinition(PORT_PROPERTY, Integer.class), new PropertyDefinition(HOST_NAME_PROPERTY, String.class), new PropertyDefinition(DESCRIPTION_PROPERTY, String.class), new PropertyDefinition(FULLY_QUALIFIED_NAME_PROPERTY, String.class), new PropertyDefinition(FIXED_HOST_NAME_PROPERTY, Boolean.class), new PropertyDefinition(FIXED_PORT_PROPERTY, Boolean.class) }; private Util() { } public static <T> T getValue(SimpleValue value, Class<T> type) { if (value == null) return null; return type.cast(value.getValue()); } public static <T> T getValue(CompositeValue compositeValue, String simpleValueName, Class<T> type) { SimpleValue val = (SimpleValue) compositeValue.get(simpleValueName); return getValue(val, type); } /** * Creates the binding set composite value from the supplied configuration. * * @param bindingSetValueType the meta type of the returned composite value * @param configuration the configuration of the binding set to create * @return the binding set composite value ready to supply to Profile service * @throws Exception on error */ public static CompositeValue getBindingSetFromConfiguration(MetaType bindingSetValueType, Configuration configuration) throws Exception { MapCompositeValueSupport currentBindingSet = new MapCompositeValueSupport(bindingSetValueType); //update the simple properties for (PropertyDefinition def : Arrays.asList(BINDING_SET_SIMPLE_PROPERTIES)) { currentBindingSet.put(def.propertyName, Util.wrap(configuration.getSimple(def.propertyName), def.propertyType)); } CollectionMetaType overrideBindingsMetaType = (CollectionMetaType) ((ImmutableCompositeMetaType) bindingSetValueType) .getType(OVERRIDE_BINDINGS_PROPERTY); //update the override bindings List<MetaValue> updatedOverrideBindings = new ArrayList<MetaValue>(); for (Property prop : configuration.getList(OVERRIDE_BINDINGS_PROPERTY).getList()) { PropertyMap updatedBinding = (PropertyMap) prop; MapCompositeValueSupport newBinding = new MapCompositeValueSupport( (CompositeMetaType) overrideBindingsMetaType.getElementType()); for (PropertyDefinition def : Arrays.asList(BINDING_SET_OVERRIDE_PROPERTIES)) { newBinding.put(def.propertyName, Util .wrap(updatedBinding.getSimple(def.propertyName), def.propertyType)); } updatedOverrideBindings.add(newBinding); } //recreate the collection of override bindings CollectionValueSupport newOverrideBindings = new CollectionValueSupport(overrideBindingsMetaType); newOverrideBindings.setElements(updatedOverrideBindings.toArray(new MetaValue[updatedOverrideBindings.size()])); currentBindingSet.put(OVERRIDE_BINDINGS_PROPERTY, newOverrideBindings); return currentBindingSet; } /** * Creates a new collection of metavalues from the supplied collection. * The collection is supposed to contain composite values which must have a * "name" composite. If the name composite matches the replacedName parameter, * the newValue will be inserted into the resulting list instead of that composite value. * If newValue is null, it is not inserted into the result. * * @param collection the collection to copy * @param replacedName the name of the composite value to replace * @param newValue a replacement for the composite value or null if the composite value should be removed from the collection * * @return a copy of the collection with the appropriate element replaced or removed */ public static List<MetaValue> replaceWithNew(CollectionValue collection, String replacedName, MetaValue newValue) { List<MetaValue> ret = new ArrayList<MetaValue>(); Iterator<MetaValue> it = collection.iterator(); while (it.hasNext()) { CompositeValue value = (CompositeValue) it.next(); String currentName = getValue(value, "name", String.class); if (replacedName.equals(currentName)) { if (newValue != null) { ret.add(newValue); } } else { ret.add(value); } } return ret; } /** * This can create an appropriate SimpleValue out of the property. * Obviously the method is not generic and supports only * the types that have corresponding conversion methods in the ProperySimple class. * * @param value * @param type * @return the simple value */ public static SimpleValue wrap(PropertySimple value, Class<?> type) { Serializable ret = null; if (value == null) { ret = null; } else if (value.getStringValue() == null) { ret = null; } else if (type == Integer.class) { ret = value.getIntegerValue(); } else if (type == Long.class) { ret = value.getLongValue(); } else if (type == Double.class) { ret = value.getDoubleValue(); } else if (type == Boolean.class) { ret = value.getBooleanValue(); } else if (type == Float.class) { ret = value.getFloatValue(); } else if (type == String.class) { ret = value.getStringValue(); } return ret == null ? null : SimpleValueSupport.wrap(ret); } public static List<PropertySimple> getProperties(List<PropertyDefinition> properties, CompositeValue value) { ArrayList<PropertySimple> ret = new ArrayList<PropertySimple>(); for (PropertyDefinition def : properties) { ret.add(new PropertySimple(def.propertyName, getValue(value, def.propertyName, def.propertyType))); } return ret; } }