172fb05292043e49612a8bee700750c6ca68810f
[controller.git] / opendaylight / md-sal / sal-binding-broker / src / main / java / org / opendaylight / controller / sal / binding / dom / serializer / impl / CodecMapping.java
1 package org.opendaylight.controller.sal.binding.dom.serializer.impl;
2
3 import java.lang.reflect.Field;
4 import java.util.Map;
5
6 import org.opendaylight.controller.sal.binding.dom.serializer.api.InstanceIdentifierCodec;
7 import org.opendaylight.yangtools.yang.binding.BindingCodec;
8 import org.opendaylight.yangtools.yang.common.QName;
9 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
10 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory;
12
13 public class CodecMapping {
14
15     private static final Logger LOG = LoggerFactory.getLogger(CodecMapping.class);
16     
17     public static final String INSTANCE_IDENTIFIER_CODEC = "INSTANCE_IDENTIFIER_CODEC";
18     public static final String CLASS_TO_CASE_MAP = "CLASS_TO_CASE";
19     public static final String COMPOSITE_TO_CASE = "COMPOSITE_TO_CASE";
20     public static final String AUGMENTATION_CODEC = "AUGMENTATION_CODEC";
21     
22     public static void setIdentifierCodec(Class<?> obj,InstanceIdentifierCodec codec) {
23         Field instanceIdField;
24         try {
25             instanceIdField = obj.getField(INSTANCE_IDENTIFIER_CODEC);
26             if(obj != null) {
27                 instanceIdField.set(null, codec);
28             }
29         } catch (NoSuchFieldException e) {
30            LOG.debug("Instance identifier codec is not needed for {}",obj.getName(),e);
31         } catch (SecurityException | IllegalAccessException e) {
32             LOG.error("Instance identifier could not be set for {}",obj.getName(),e);
33         }
34     }
35
36     public static void setClassToCaseMap(Class<? extends BindingCodec<?,?>> codec,
37             Map<Class<?>,BindingCodec<?,?>> classToCaseRawCodec) {
38         Field instanceIdField;
39         try {
40             instanceIdField = codec.getField(CLASS_TO_CASE_MAP);
41             instanceIdField.set(null, classToCaseRawCodec);
42         } catch (NoSuchFieldException e) {
43             LOG.debug("BUG: Class to case mappping is not needed for {}",codec.getName(),e);
44         } catch (SecurityException | IllegalAccessException e) {
45             LOG.error("Class to case mappping could not be set for {}",codec.getName(),e);
46         }
47     }
48
49     public static void setCompositeNodeToCaseMap(Class<? extends BindingCodec<?,?>> codec,
50             Map<CompositeNode,BindingCodec<?,?>> compositeToCase) {
51         Field instanceIdField;
52         try {
53             instanceIdField = codec.getField(COMPOSITE_TO_CASE);
54             instanceIdField.set(null, compositeToCase);
55         } catch (NoSuchFieldException e) {
56             LOG.debug("BUG: Class to case mappping is not needed for {}",codec.getName(),e);
57         } catch (SecurityException | IllegalAccessException e) {
58             LOG.error("Composite node to case mappping could not be set for {}",codec.getName(),e);
59         }
60     }
61
62     public static void setAugmentationCodec(Class<? extends BindingCodec<?,?>> dataCodec,
63             BindingCodec<?,?> augmentableCodec) {
64             Field instanceIdField;
65             try {
66                 instanceIdField = dataCodec.getField(AUGMENTATION_CODEC);
67                 instanceIdField.set(null, augmentableCodec);
68             } catch (NoSuchFieldException e) {
69                 LOG.debug("BUG: Augmentation codec is not needed for {}",dataCodec.getName(),e);
70             } catch (SecurityException | IllegalAccessException e) {
71                 LOG.error("Augmentation codec could not be set for {}",dataCodec.getName(),e);
72             }
73     }
74 }