Merge "ArpHandler to ignore ip packet sent to default GW"
[controller.git] / opendaylight / md-sal / sal-rest-connector / src / main / java / org / opendaylight / controller / sal / restconf / impl / RestCodec.java
index 6452b72f1e972bd9013b986e4c3734172a69683f..45f3f7f30bd3de9b29117e27b50767ae7e5c5166 100644 (file)
@@ -2,56 +2,100 @@ 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() {
     }
-    
+
     public static final Codec<Object, Object> from(TypeDefinition<?> typeDefinition) {
         return new ObjectCodec(typeDefinition);
     }
-    
+
+    @SuppressWarnings("rawtypes")
     public static final class ObjectCodec implements Codec<Object, Object> {
 
+        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;
             }
         }
-        
+
     }
-    
+
     public static class IdentityrefCodecImpl implements IdentityrefCodec<IdentityValuesDTO> {
 
         @Override
@@ -63,7 +107,7 @@ public class RestCodec {
         public QName deserialize(IdentityValuesDTO data) {
             IdentityValue valueWithNamespace = data.getValuesWithNamespaces().get(0);
             String namespace = valueWithNamespace.getNamespace();
-            URI validNamespace = ControllerContext.getInstance().findNamespaceByModule(namespace);
+            URI validNamespace = ControllerContext.getInstance().findNamespaceByModuleName(namespace);
             if (validNamespace == null) {
                 validNamespace = URI.create(namespace);
             }
@@ -71,5 +115,19 @@ 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;
+        }
+
+    }
+
 }