/* * Copyright (c) 2015, 2017 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.controller.config.facade.xml.mapping.attributes.mapping; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import java.util.Map; import java.util.Set; import javax.management.openmbean.CompositeDataSupport; import javax.management.openmbean.CompositeType; import javax.management.openmbean.OpenType; import org.opendaylight.controller.config.facade.xml.util.Util; public class CompositeAttributeMappingStrategy extends AbstractAttributeMappingStrategy, CompositeType> { private final Map>> innerStrategies; private final Map jmxToJavaNameMapping; public CompositeAttributeMappingStrategy(final CompositeType compositeType, final Map>> innerStrategies, final Map jmxToJavaNameMapping) { super(compositeType); this.innerStrategies = innerStrategies; this.jmxToJavaNameMapping = jmxToJavaNameMapping; } @Override public Optional> mapAttribute(final Object value) { if (value == null) { return Optional.absent(); } Util.checkType(value, CompositeDataSupport.class); CompositeDataSupport compositeData = (CompositeDataSupport) value; CompositeType currentType = compositeData.getCompositeType(); CompositeType expectedType = getOpenType(); Set expectedCompositeTypeKeys = expectedType.keySet(); Set currentCompositeTypeKeys = currentType.keySet(); Preconditions.checkArgument(expectedCompositeTypeKeys.equals(currentCompositeTypeKeys), "Composite type mismatch, expected composite type with attributes " + expectedCompositeTypeKeys + " but was " + currentCompositeTypeKeys); Map retVal = Maps.newHashMap(); for (String jmxName : jmxToJavaNameMapping.keySet()) { Optional mapped = mapInnerAttribute(compositeData, jmxName, expectedType.getDescription(jmxName)); if (mapped.isPresent()) { retVal.put(jmxToJavaNameMapping.get(jmxName), mapped.get()); } } return Optional.of(retVal); } protected Optional mapInnerAttribute(final CompositeDataSupport compositeData, final String jmxName, final String description) { Object innerValue = compositeData.get(jmxName); AttributeMappingStrategy> attributeMappingStrategy = innerStrategies.get(jmxName); return attributeMappingStrategy.mapAttribute(innerValue); } }