Switched codecs infrastructure to use yang-data-impl codecs
[controller.git] / opendaylight / md-sal / sal-rest-connector / src / main / java / org / opendaylight / controller / sal / restconf / impl / RestCodec.java
index 6452b72f1e972bd9013b986e4c3734172a69683f..450ba02b56071412d8aff89030db7b221a128605 100644 (file)
@@ -2,19 +2,21 @@ package org.opendaylight.controller.sal.restconf.impl;
 
 import java.net.URI;
 
+import org.opendaylight.controller.sal.rest.impl.RestUtil;
 import org.opendaylight.controller.sal.restconf.impl.IdentityValuesDTO.IdentityValue;
 import org.opendaylight.yangtools.concepts.Codec;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.codec.IdentityrefCodec;
+import org.opendaylight.yangtools.yang.data.api.codec.LeafrefCodec;
 import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class RestCodec {
-    
-    @SuppressWarnings("rawtypes")
-    public static final Codec IDENTITYREF_DEFAULT_CODEC = new IdentityrefCodecImpl();
-    
+
     private RestCodec() {
     }
     
@@ -22,31 +24,63 @@ public class RestCodec {
         return new ObjectCodec(typeDefinition);
     }
     
+    @SuppressWarnings("rawtypes")
     public static final class ObjectCodec implements Codec<Object, Object> {
 
-        private TypeDefinition<?> type;
+        private final Logger logger = LoggerFactory.getLogger(RestCodec.class);
         
+        public static final Codec IDENTITYREF_DEFAULT_CODEC = new IdentityrefCodecImpl();
+        public static final Codec LEAFREF_DEFAULT_CODEC = new LeafrefCodecImpl();
+
+        private TypeDefinition<?> type;
+
         private ObjectCodec(TypeDefinition<?> typeDefinition) {
-            type = typeDefinition;
+            type = RestUtil.resolveBaseTypeFrom(typeDefinition);
         }
         
         @SuppressWarnings("unchecked")
         @Override
         public Object deserialize(Object input) {
-            if (type instanceof IdentityrefTypeDefinition) {
-                return IDENTITYREF_DEFAULT_CODEC.deserialize(input);
-            } else {
-                return TypeDefinitionAwareCodec.from(type).deserialize(String.valueOf(input));
+            try {
+                if (type instanceof IdentityrefTypeDefinition) {
+                    return IDENTITYREF_DEFAULT_CODEC.deserialize(input);
+                } else if (type instanceof LeafrefTypeDefinition) {
+                    return LEAFREF_DEFAULT_CODEC.deserialize(input);
+                } else {
+                    TypeDefinitionAwareCodec<Object,? extends TypeDefinition<?>> typeAwarecodec = TypeDefinitionAwareCodec.from(type);
+                    if (typeAwarecodec != null) {
+                        return typeAwarecodec.deserialize(String.valueOf(input));
+                    } else {
+                        logger.debug("Codec for type \"" + type.getQName().getLocalName() + "\" is not implemented yet.");
+                        return null;
+                    }
+                }
+            } catch (ClassCastException e) { // TODO remove this catch when everyone use codecs
+                logger.error("ClassCastException was thrown when codec is invoked with parameter " + String.valueOf(input), e);
+                return input;
             }
         }
 
         @SuppressWarnings("unchecked")
         @Override
         public Object serialize(Object input) {
-            if (type instanceof IdentityrefTypeDefinition) {
-                return IDENTITYREF_DEFAULT_CODEC.serialize(input);
-            } else {
-                return TypeDefinitionAwareCodec.from(type).serialize(input);
+            try {
+                if (type instanceof IdentityrefTypeDefinition) {
+                    return IDENTITYREF_DEFAULT_CODEC.serialize(input);
+                } else if (type instanceof LeafrefTypeDefinition) {
+                    return LEAFREF_DEFAULT_CODEC.serialize(input);
+                } else {
+                    TypeDefinitionAwareCodec<Object,? extends TypeDefinition<?>> typeAwarecodec = TypeDefinitionAwareCodec.from(type);
+                    if (typeAwarecodec != null) {
+                        return typeAwarecodec.serialize(input);
+                    } else {
+                        logger.debug("Codec for type \"" + type.getQName().getLocalName() + "\" is not implemented yet.");
+                        return null;
+                    }
+                }
+            } catch (ClassCastException e) { // TODO remove this catch when everyone use codecs
+                logger.error("ClassCastException was thrown when codec is invoked with parameter " + String.valueOf(input), e);
+                return input;
             }
         }
         
@@ -72,4 +106,18 @@ public class RestCodec {
 
     }
     
+    public static class LeafrefCodecImpl implements LeafrefCodec<String> {
+
+        @Override
+        public String serialize(Object data) {
+            return String.valueOf(data);
+        }
+
+        @Override
+        public Object deserialize(String data) {
+            return data;
+        }
+        
+    }
+    
 }