06fbb0b9397bb99bf7fcc10414096302fa7f8803
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / mdsal / binding / dom / codec / impl / IdentityCodec.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.mdsal.binding.dom.codec.impl;
9
10 import static com.google.common.base.Preconditions.checkArgument;
11 import static java.util.Objects.requireNonNull;
12
13 import org.opendaylight.mdsal.binding.dom.codec.api.BindingIdentityCodec;
14 import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
15 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
16 import org.opendaylight.yangtools.concepts.AbstractIllegalArgumentCodec;
17 import org.opendaylight.yangtools.yang.binding.BaseIdentity;
18 import org.opendaylight.yangtools.yang.common.QName;
19
20 final class IdentityCodec extends AbstractIllegalArgumentCodec<QName, Class<?>> implements BindingIdentityCodec {
21     private final BindingRuntimeContext context;
22
23     IdentityCodec(final BindingRuntimeContext context) {
24         this.context = requireNonNull(context);
25     }
26
27     @Override
28     protected Class<?> deserializeImpl(final QName input) {
29         return context.getIdentityClass(input);
30     }
31
32     @Override
33     protected QName serializeImpl(final Class<?> input) {
34         checkArgument(BaseIdentity.class.isAssignableFrom(input), "%s is not an identity", input);
35         return BindingReflections.findQName(input);
36     }
37
38     @Override
39     public Class<? extends BaseIdentity> toBinding(final QName qname) {
40         final Class<?> identity = context.getIdentityClass(requireNonNull(qname));
41         checkArgument(BaseIdentity.class.isAssignableFrom(identity), "%s resolves to non-identity %s", qname, identity);
42         return identity.asSubclass(BaseIdentity.class);
43     }
44
45     @Override
46     public QName fromBinding(final Class<? extends BaseIdentity> bindingClass) {
47         return BindingReflections.getQName(bindingClass);
48     }
49 }