Bump versions to 14.0.0-SNAPSHOT
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / mdsal / binding / dom / codec / impl / CompositeValueCodec.java
1 /*
2  * Copyright (c) 2014 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.eclipse.jdt.annotation.NonNull;
14 import org.opendaylight.yangtools.yang.binding.BaseIdentity;
15 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
18
19 // FIXME: sealed once we have JDK17+
20 abstract class CompositeValueCodec extends AbstractValueCodec<Object, Object> {
21     static final class OfIdentity extends CompositeValueCodec {
22         private final IdentityCodec valueCodec;
23
24         OfIdentity(final Class<?> valueType, final IdentityCodec codec) {
25             super(valueType);
26             valueCodec = requireNonNull(codec);
27         }
28
29         @Override
30         Object bindingToDom(final Object bindingValue) {
31             checkArgument(bindingValue instanceof BaseIdentity, "Unexpected Binding value %s", bindingValue);
32             return valueCodec.fromBinding((BaseIdentity) bindingValue);
33         }
34
35         @Override
36         Object domToBinding(final Object domValue) {
37             checkArgument(domValue instanceof QName, "Unexpected DOM value %s", domValue);
38             return valueCodec.toBinding((QName) domValue);
39         }
40     }
41
42     static final class OfInstanceIdentifier extends CompositeValueCodec {
43         private final InstanceIdentifierCodec valueCodec;
44
45         OfInstanceIdentifier(final Class<?> valueType, final InstanceIdentifierCodec codec) {
46             super(valueType);
47             valueCodec = requireNonNull(codec);
48         }
49
50         @Override
51         Object domToBinding(final Object domValue) {
52             checkArgument(domValue instanceof YangInstanceIdentifier, "Unexpected DOM value %s", domValue);
53             final var binding = valueCodec.toBinding((YangInstanceIdentifier) domValue);
54             checkArgument(binding != null, "Cannot represent %s in binding", domValue);
55             return binding;
56         }
57
58         @Override
59         Object bindingToDom(final Object bindingValue) {
60             checkArgument(bindingValue instanceof InstanceIdentifier, "Unexpected Binding value %s", bindingValue);
61             return valueCodec.fromBinding((InstanceIdentifier<?>) bindingValue);
62         }
63     }
64
65     private final EncapsulatedValueCodec typeObjectCodec;
66
67     private CompositeValueCodec(final Class<?> valueType) {
68         typeObjectCodec = EncapsulatedValueCodec.ofUnchecked(valueType);
69     }
70
71     @Override
72     protected Object deserializeImpl(final Object input) {
73         return typeObjectCodec.deserialize(domToBinding(input));
74     }
75
76     abstract @NonNull Object domToBinding(@NonNull Object domValue);
77
78     @Override
79     protected Object serializeImpl(final Object input) {
80         return bindingToDom(typeObjectCodec.serialize(input));
81     }
82
83     abstract @NonNull Object bindingToDom(@NonNull Object bindingValue);
84 }