2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.mdsal.binding.dom.codec.impl;
10 import static com.google.common.base.Preconditions.checkArgument;
11 import static com.google.common.base.Preconditions.checkState;
12 import static java.util.Objects.requireNonNull;
14 import com.google.common.collect.BiMap;
15 import com.google.common.collect.ImmutableBiMap;
16 import com.google.common.collect.ImmutableBiMap.Builder;
17 import java.util.concurrent.Callable;
18 import java.util.stream.Collectors;
19 import org.opendaylight.mdsal.binding.dom.codec.impl.ValueTypeCodec.SchemaUnawareCodec;
20 import org.opendaylight.yangtools.yang.binding.BindingMapping;
21 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
22 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
24 final class EnumerationCodec extends ReflectionBasedCodec implements SchemaUnawareCodec {
25 private final ImmutableBiMap<String, Enum<?>> yangValueToBinding;
27 EnumerationCodec(final Class<? extends Enum<?>> enumeration, final ImmutableBiMap<String, Enum<?>> schema) {
29 yangValueToBinding = requireNonNull(schema);
32 static Callable<EnumerationCodec> loader(final Class<?> returnType, final EnumTypeDefinition enumSchema) {
33 checkArgument(Enum.class.isAssignableFrom(returnType));
34 @SuppressWarnings({ "rawtypes", "unchecked" })
35 final Class<? extends Enum<?>> enumType = (Class) returnType;
37 final BiMap<String, String> identifierToYang = BindingMapping.mapEnumAssignedNames(
38 enumSchema.getValues().stream().map(EnumPair::getName).collect(Collectors.toList())).inverse();
40 final Builder<String, Enum<?>> builder = ImmutableBiMap.builder();
41 for (Enum<?> enumValue : enumType.getEnumConstants()) {
42 final String yangName = identifierToYang.get(enumValue.name());
43 checkState(yangName != null, "Failed to find enumeration constant %s in mapping %s", enumValue,
45 builder.put(yangName, enumValue);
48 return new EnumerationCodec(enumType, builder.build());
53 public Object deserialize(final Object input) {
54 Enum<?> value = yangValueToBinding.get(input);
55 checkArgument(value != null, "Invalid enumeration value %s. Valid values are %s", input,
56 yangValueToBinding.keySet());
61 public Object serialize(final Object input) {
62 checkArgument(getTypeClass().isInstance(input), "Input must be instance of %s", getTypeClass());
63 return yangValueToBinding.inverse().get(input);