/* * Copyright (c) 2013 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.netconf.confignetconfconnector.mapping.attributes.mapping; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import org.opendaylight.controller.netconf.confignetconfconnector.util.Util; import javax.management.openmbean.CompositeDataSupport; import javax.management.openmbean.CompositeType; import javax.management.openmbean.OpenType; import java.util.Map; import java.util.Set; public class CompositeAttributeMappingStrategy extends AbstractAttributeMappingStrategy, CompositeType> { private final Map>> innerStrategies; private final Map jmxToJavaNameMapping; public CompositeAttributeMappingStrategy(CompositeType compositeType, Map>> innerStrategies, Map jmxToJavaNameMapping) { super(compositeType); this.innerStrategies = innerStrategies; this.jmxToJavaNameMapping = jmxToJavaNameMapping; } @Override public Optional> mapAttribute(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(CompositeDataSupport compositeData, String jmxName, String description) { Object innerValue = compositeData.get(jmxName); AttributeMappingStrategy> attributeMappingStrategy = innerStrategies .get(jmxName); Optional mapAttribute = attributeMappingStrategy.mapAttribute(innerValue); return mapAttribute; } }