/* * Copyright (c) 2015 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.resolving; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import java.util.Map; import java.util.Map.Entry; import javax.management.openmbean.ArrayType; import javax.management.openmbean.CompositeType; import javax.management.openmbean.OpenType; import javax.management.openmbean.SimpleType; import org.opendaylight.controller.config.facade.xml.mapping.attributes.AttributeIfcSwitchStatement; import org.opendaylight.controller.config.facade.xml.mapping.config.ServiceRegistryWrapper; import org.opendaylight.controller.config.facade.xml.osgi.EnumResolver; import org.opendaylight.controller.config.yangjmxgenerator.attribute.AttributeIfc; import org.opendaylight.controller.config.yangjmxgenerator.attribute.ListAttribute; import org.opendaylight.controller.config.yangjmxgenerator.attribute.ListDependenciesAttribute; import org.opendaylight.controller.config.yangjmxgenerator.attribute.TOAttribute; public class ObjectResolver extends AttributeIfcSwitchStatement>> { private final ServiceRegistryWrapper serviceTracker; private EnumResolver enumResolver; public ObjectResolver(final ServiceRegistryWrapper serviceTracker) { this.serviceTracker = serviceTracker; } public Map>> prepareResolving( final Map configDefinition, final EnumResolver enumResolver) { this.enumResolver = enumResolver; Map>> strategies = Maps.newHashMap(); for (Entry attrEntry : configDefinition.entrySet()) { strategies.put(attrEntry.getKey(), prepareStrategy(attrEntry.getValue())); } return strategies; } private AttributeResolvingStrategy> prepareStrategy(final AttributeIfc attributeIfc) { return switchAttribute(attributeIfc); } private Map createYangToJmxMapping(final TOAttribute attributeIfc) { Map retVal = Maps.newHashMap(); for (Entry entry : attributeIfc.getYangPropertiesToTypesMap().entrySet()) { retVal.put(entry.getKey(), (entry.getValue()).getLowerCaseCammelCase()); } return retVal; } @Override protected AttributeResolvingStrategy> caseJavaEnumAttribute(final OpenType openType) { return new EnumAttributeResolvingStrategy((CompositeType) openType, enumResolver); } @Override protected AttributeResolvingStrategy> caseJavaSimpleAttribute(final SimpleType openType) { return new SimpleAttributeResolvingStrategy(openType); } @Override protected AttributeResolvingStrategy> caseJavaArrayAttribute(final ArrayType openType) { SimpleType innerType = (SimpleType) openType.getElementOpenType(); AttributeResolvingStrategy> strat = new SimpleAttributeResolvingStrategy(innerType); return new ArrayAttributeResolvingStrategy(strat, openType); } @Override protected AttributeResolvingStrategy> caseJavaCompositeAttribute(final CompositeType openType) { Map>> innerMap = Maps.newHashMap(); Map yangToJmxMapping = Maps.newHashMap(); fillMappingForComposite(openType, innerMap, yangToJmxMapping); return new CompositeAttributeResolvingStrategy(innerMap, openType, yangToJmxMapping); } private void fillMappingForComposite(final CompositeType openType, final Map>> innerMap, final Map yangToJmxMapping) { for (String innerAttributeKey : openType.keySet()) { innerMap.put(innerAttributeKey, caseJavaAttribute(openType.getType(innerAttributeKey))); yangToJmxMapping.put(innerAttributeKey, innerAttributeKey); } } @Override protected AttributeResolvingStrategy> caseJavaUnionAttribute(final OpenType openType) { Preconditions.checkState(openType instanceof CompositeType, "Unexpected open type, expected %s but was %s"); CompositeType compositeType = (CompositeType) openType; Map>> innerMap = Maps.newHashMap(); Map yangToJmxMapping = Maps.newHashMap(); fillMappingForComposite(compositeType, innerMap, yangToJmxMapping); return new UnionCompositeAttributeResolvingStrategy(innerMap, compositeType, yangToJmxMapping); } @Override protected AttributeResolvingStrategy> caseDependencyAttribute( final SimpleType openType) { return new ObjectNameAttributeResolvingStrategy(serviceTracker); } @Override protected AttributeResolvingStrategy> caseTOAttribute(final CompositeType openType) { Preconditions.checkState(getLastAttribute() instanceof TOAttribute); TOAttribute toAttribute = (TOAttribute) getLastAttribute(); Map>> innerMap = Maps.newHashMap(); for (String innerName : openType.keySet()) { AttributeIfc innerAttributeIfc = toAttribute.getJmxPropertiesToTypesMap().get(innerName); innerMap.put(innerAttributeIfc.getAttributeYangName(), prepareStrategy(innerAttributeIfc)); } return new CompositeAttributeResolvingStrategy(innerMap, openType, createYangToJmxMapping(toAttribute)); } @Override protected AttributeResolvingStrategy> caseListAttribute(final ArrayType openType) { Preconditions.checkState(getLastAttribute() instanceof ListAttribute); AttributeIfc innerAttribute = ((ListAttribute) getLastAttribute()).getInnerAttribute(); return new ArrayAttributeResolvingStrategy(prepareStrategy(innerAttribute), openType); } @Override protected AttributeResolvingStrategy> caseListDependeciesAttribute(final ArrayType openType) { Preconditions.checkState(getLastAttribute() instanceof ListDependenciesAttribute); return new ArrayAttributeResolvingStrategy(caseDependencyAttribute(SimpleType.OBJECTNAME), openType); } }