/* * Copyright (c) 2014 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.yangtools.binding.data.codec.impl; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableBiMap; import java.util.HashMap; import java.util.Map; import java.util.concurrent.Callable; import org.opendaylight.yangtools.yang.binding.BindingMapping; import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair; class EnumerationCodec extends ReflectionBasedCodec { ImmutableBiMap> yangValueToBinding; public EnumerationCodec(final Class> enumeration, final Map> schema) { super(enumeration); yangValueToBinding = ImmutableBiMap.copyOf(schema); } static Callable loader(final Class returnType, final EnumTypeDefinition enumSchema) { Preconditions.checkArgument(Enum.class.isAssignableFrom(returnType)); @SuppressWarnings({ "rawtypes", "unchecked" }) final Class> enumType = (Class) returnType; return new Callable() { @Override public ReflectionBasedCodec call() throws Exception { Map> nameToValue = new HashMap<>(); for (Enum enumValue : enumType.getEnumConstants()) { nameToValue.put(enumValue.toString(), enumValue); } Map> yangNameToBinding = new HashMap<>(); for (EnumPair yangValue : enumSchema.getValues()) { final String bindingName = BindingMapping.getClassName(yangValue.getName()); final Enum bindingVal = nameToValue.get(bindingName); yangNameToBinding.put(yangValue.getName(), bindingVal); } return new EnumerationCodec(enumType, yangNameToBinding); } }; } @Override public Object deserialize(final Object input) { Enum value = yangValueToBinding.get(input); Preconditions.checkArgument(value != null, "Invalid enumeration value %s. Valid values are %s", input, yangValueToBinding.keySet()); return value; } @Override public Object serialize(final Object input) { Preconditions.checkArgument(typeClass.isInstance(input), "Input must be instance of %s", typeClass); return yangValueToBinding.inverse().get(input); } }