Bump mdsal to 4.0.0
[controller.git] / opendaylight / md-sal / sal-binding-broker / src / main / java / org / opendaylight / controller / md / sal / binding / impl / BindingToNormalizedNodeCodec.java
index 270ae504750dad1728dc77860f2238e4f3f76758..f5a1435b7f77292df7e1b6736302452d70932134 100644 (file)
  */
 package org.opendaylight.controller.md.sal.binding.impl;
 
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableBiMap;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.lang.reflect.Method;
 import java.util.Iterator;
-import java.util.Map.Entry;
-import javax.annotation.Nonnull;
+import java.util.Map;
 import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizationException;
 import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizationOperation;
 import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizer;
-import org.opendaylight.yangtools.binding.data.codec.api.BindingCodecTree;
-import org.opendaylight.yangtools.binding.data.codec.api.BindingCodecTreeFactory;
-import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
-import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
-import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext;
-import org.opendaylight.yangtools.yang.binding.BindingMapping;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
+import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
+import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.RpcService;
-import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
-import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException;
-import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
-public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, SchemaContextListener, AutoCloseable {
+@SuppressFBWarnings(value = "NM_SAME_SIMPLE_NAME_AS_SUPERCLASS", justification = "Migration path")
+public class BindingToNormalizedNodeCodec
+        extends org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec {
 
-    private final BindingNormalizedNodeCodecRegistry codecRegistry;
-    private DataNormalizer legacyToNormalized;
-    private final GeneratedClassLoadingStrategy classLoadingStrategy;
-    private BindingRuntimeContext runtimeContext;
+    private DataNormalizer legacyToNormalized = null;
 
-    public BindingToNormalizedNodeCodec(final GeneratedClassLoadingStrategy classLoadingStrategy,
+    public BindingToNormalizedNodeCodec(final ClassLoadingStrategy classLoadingStrategy,
             final BindingNormalizedNodeCodecRegistry codecRegistry) {
-        this.classLoadingStrategy = classLoadingStrategy;
-        this.codecRegistry = codecRegistry;
-
+        super(classLoadingStrategy, codecRegistry);
     }
 
-    public YangInstanceIdentifier toNormalized(final InstanceIdentifier<? extends DataObject> binding) {
-        return codecRegistry.toYangInstanceIdentifier(binding);
+    public BindingToNormalizedNodeCodec(final ClassLoadingStrategy classLoadingStrategy,
+            final BindingNormalizedNodeCodecRegistry codecRegistry, final boolean waitForSchema) {
+        super(classLoadingStrategy, codecRegistry, waitForSchema);
     }
 
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    public Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> toNormalizedNode(
-            final InstanceIdentifier<? extends DataObject> bindingPath, final DataObject bindingObject) {
-        return codecRegistry.toNormalizedNode((InstanceIdentifier) bindingPath, bindingObject);
-
+    DataNormalizer getDataNormalizer() {
+        return this.legacyToNormalized;
     }
 
-    public Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> toNormalizedNode(
-            final Entry<InstanceIdentifier<? extends DataObject>, DataObject> binding) {
-        return toNormalizedNode(binding.getKey(),binding.getValue());
-    }
-
-    /**
-     *
-     * Returns a Binding-Aware instance identifier from normalized
-     * instance-identifier if it is possible to create representation.
-     *
-     * Returns Optional.absent for cases where target is mixin node except
-     * augmentation.
-     *
-     */
-    public Optional<InstanceIdentifier<? extends DataObject>> toBinding(final YangInstanceIdentifier normalized)
-                    throws DeserializationException {
-        try {
-            return Optional.<InstanceIdentifier<? extends DataObject>>fromNullable(codecRegistry.fromYangInstanceIdentifier(normalized));
-        } catch (final IllegalArgumentException e) {
-            return Optional.absent();
-        }
-    }
-
-    public DataNormalizer getDataNormalizer() {
-        return legacyToNormalized;
-    }
-
-    public Optional<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> toBinding(
-            final @Nonnull Entry<YangInstanceIdentifier, ? extends NormalizedNode<?, ?>> normalized)
-                    throws DeserializationException {
-        try {
-            /*
-             * This cast is required, due to generics behaviour in openjdk / oracle javac
-             *
-             * InstanceIdentifier has definition InstanceIdentifier<T extends DataObject>,
-             * this means '?' is always  <? extends DataObject>. Eclipse compiler
-             * is able to determine this relationship and treats
-             * Entry<InstanceIdentifier<?>,DataObject> and Entry<InstanceIdentifier<? extends DataObject,DataObject>
-             * as assignable. However openjdk / oracle javac treats this two types
-             * as incompatible and issues a compile error.
-             *
-             * It is safe to  loose generic information and cast it to other generic signature.
-             *
-             */
-            @SuppressWarnings({ "unchecked", "rawtypes" })
-            final Entry<InstanceIdentifier<? extends DataObject>, DataObject> binding = Entry.class.cast(codecRegistry.fromNormalizedNode(normalized.getKey(), normalized.getValue()));
-            return Optional.fromNullable(binding);
-        } catch (final IllegalArgumentException e) {
-            return Optional.absent();
-        }
+    @Override
+    public YangInstanceIdentifier toYangInstanceIdentifierBlocking(
+            final InstanceIdentifier<? extends DataObject> binding) {
+        return super.toYangInstanceIdentifierBlocking(binding);
     }
 
     @Override
-    public void onGlobalContextUpdated(final SchemaContext arg0) {
-        legacyToNormalized = new DataNormalizer (arg0);
-        runtimeContext = BindingRuntimeContext.create(classLoadingStrategy, arg0);
-        codecRegistry.onBindingRuntimeContextUpdated(runtimeContext);
+    public YangInstanceIdentifier toYangInstanceIdentifierCached(final InstanceIdentifier<?> binding) {
+        return super.toYangInstanceIdentifierCached(binding);
     }
 
-    public <T extends DataObject> Function<Optional<NormalizedNode<?, ?>>, Optional<T>>  deserializeFunction(final InstanceIdentifier<T> path) {
-        return codecRegistry.deserializeFunction(path);
+    @Override
+    public void onGlobalContextUpdated(final SchemaContext schemaContext) {
+        this.legacyToNormalized = new DataNormalizer(schemaContext);
+        super.onGlobalContextUpdated(schemaContext);
     }
 
     /**
@@ -132,9 +70,10 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, Sc
      * @param path DOM Path
      * @return Node with defaults set on.
      */
+    @Override
     public NormalizedNode<?, ?> getDefaultNodeFor(final YangInstanceIdentifier path) {
         final Iterator<PathArgument> iterator = path.getPathArguments().iterator();
-        DataNormalizationOperation<?> currentOp = legacyToNormalized.getRootOperation();
+        DataNormalizationOperation<?> currentOp = this.legacyToNormalized.getRootOperation();
         while (iterator.hasNext()) {
             final PathArgument currentArg = iterator.next();
             try {
@@ -146,52 +85,14 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, Sc
         return currentOp.createDefault(path.getLastPathArgument());
     }
 
-    public BindingNormalizedNodeCodecRegistry getCodecRegistry() {
-        return codecRegistry;
-    }
-
-    @Override
-    public void close() {
-        // NOOP Intentionally
-    }
-
-    public BindingNormalizedNodeCodecRegistry getCodecFactory() {
-        return codecRegistry;
-    }
-
-    // FIXME: This should be probably part of Binding Runtime context
-    public ImmutableBiMap<Method, SchemaPath> getRpcMethodToSchemaPath(final Class<? extends RpcService> key) {
-        final QNameModule moduleName = BindingReflections.getQNameModule(key);
-        final Module module = runtimeContext.getSchemaContext().findModuleByNamespaceAndRevision(moduleName.getNamespace(), moduleName.getRevision());
-        final ImmutableBiMap.Builder<Method, SchemaPath> ret = ImmutableBiMap.<Method, SchemaPath>builder();
-        try {
-            for (final RpcDefinition rpcDef : module.getRpcs()) {
-                final Method method = findRpcMethod(key, rpcDef);
-                ret.put(method, rpcDef.getPath());
-            }
-        } catch (final NoSuchMethodException e) {
-            throw new IllegalStateException("Rpc defined in model does not have representation in generated class.", e);
-        }
-        return ret.build();
-    }
-
-    private Method findRpcMethod(final Class<? extends RpcService> key, final RpcDefinition rpcDef) throws NoSuchMethodException {
-        final String methodName = BindingMapping.getMethodName(rpcDef.getQName());
-        if(rpcDef.getInput() != null) {
-            final Class<?> inputClz = runtimeContext.getClassForSchema(rpcDef.getInput());
-            return key.getMethod(methodName, inputClz);
-        }
-        return key.getMethod(methodName);
-    }
-
     @Override
-    public BindingCodecTree create(BindingRuntimeContext context) {
-        return codecRegistry.create(context);
+    public ImmutableBiMap<Method, RpcDefinition> getRpcMethodToSchema(final Class<? extends RpcService> key) {
+        return super.getRpcMethodToSchema(key);
     }
 
     @Override
-    public BindingCodecTree create(SchemaContext context, Class<?>... bindingClasses) {
-        return codecRegistry.create(context, bindingClasses);
+    public Map.Entry<InstanceIdentifier<?>, BindingDataObjectCodecTreeNode<?>> getSubtreeCodec(
+            final YangInstanceIdentifier domIdentifier) {
+        return super.getSubtreeCodec(domIdentifier);
     }
-
 }