RPC input/output are always present 83/72683/3
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 5 Jun 2018 09:59:13 +0000 (11:59 +0200)
committerRobert Varga <nite@hq.sk>
Tue, 5 Jun 2018 16:33:05 +0000 (16:33 +0000)
We are always generating input/output and hence we need to properly
bridge the methods. This simplifies the code a bit.

Change-Id: If19b7841692582179664debfba9dfeeb51401d51
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaRootCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnmappedRpcInputCodec.java [deleted file]
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/RpcRoutingStrategy.java

index a0698d8583641dbdbadd3610b04752e9613715be..1d7d75ad98c4b2ae5d8110250dc6e45329777c3d 100644 (file)
@@ -22,7 +22,6 @@ import java.lang.reflect.Method;
 import java.util.AbstractMap.SimpleEntry;
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
@@ -53,7 +52,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
@@ -62,8 +60,6 @@ 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;
-import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -311,16 +307,8 @@ public final class BindingToNormalizedNodeCodec implements BindingCodecTreeFacto
     private Method findRpcMethod(final Class<? extends RpcService> key, final RpcDefinition rpcDef)
             throws NoSuchMethodException {
         final String methodName = BindingMapping.getMethodName(rpcDef.getQName());
-        if (rpcDef.getInput() != null && isExplicitStatement(rpcDef.getInput())) {
-            final Class<?> inputClz = runtimeContext().getClassForSchema(rpcDef.getInput());
-            return key.getMethod(methodName, inputClz);
-        }
-        return key.getMethod(methodName);
-    }
-
-    private static boolean isExplicitStatement(final ContainerSchemaNode node) {
-        return node instanceof EffectiveStatement
-                && ((EffectiveStatement<?, ?>) node).getDeclared().getStatementSource() == StatementSource.DECLARATION;
+        final Class<?> inputClz = runtimeContext().getClassForSchema(rpcDef.getInput());
+        return key.getMethod(methodName, inputClz);
     }
 
     @Override
@@ -334,7 +322,7 @@ public final class BindingToNormalizedNodeCodec implements BindingCodecTreeFacto
     }
 
     @Nonnull
-    protected Map.Entry<InstanceIdentifier<?>, BindingCodecTreeNode<?>> getSubtreeCodec(
+    protected Entry<InstanceIdentifier<?>, BindingCodecTreeNode<?>> getSubtreeCodec(
             final YangInstanceIdentifier domIdentifier) {
 
         final BindingCodecTree currentCodecTree = codecRegistry.getCodecContext();
index 9a1d3dd501164a719ba78cf6bc779e844bcfe441..a1b75d97e4f9f33df014744449a13fd15d907dd8 100644 (file)
@@ -33,8 +33,6 @@ import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
 import org.opendaylight.yangtools.yang.model.util.SchemaNodeUtils;
 
@@ -66,14 +64,14 @@ final class SchemaRootCodecContext<D extends DataObject> extends DataContainerCo
 
     private final LoadingCache<QName, DataContainerCodecContext<?,?>> childrenByQName = CacheBuilder.newBuilder().build(
             new CacheLoader<QName, DataContainerCodecContext<?,?>>() {
-                @SuppressWarnings("unchecked")
                 @Override
                 public DataContainerCodecContext<?,?> load(final QName qname) {
                     final DataSchemaNode childSchema = getSchema().getDataChildByName(qname);
                     childNonNull(childSchema, qname,"Argument %s is not valid child of %s", qname,getSchema());
                     if (childSchema instanceof DataNodeContainer || childSchema instanceof ChoiceSchemaNode) {
-                        @SuppressWarnings("rawtypes")
-                        final Class childCls = factory().getRuntimeContext().getClassForSchema(childSchema);
+                        @SuppressWarnings("unchecked")
+                        final Class<? extends DataObject> childCls = (Class<? extends DataObject>)
+                                factory().getRuntimeContext().getClassForSchema(childSchema);
                         return streamChild(childCls);
                     }
 
@@ -83,31 +81,24 @@ final class SchemaRootCodecContext<D extends DataObject> extends DataContainerCo
 
     private final LoadingCache<SchemaPath, RpcInputCodec<?>> rpcDataByPath = CacheBuilder.newBuilder().build(
         new CacheLoader<SchemaPath, RpcInputCodec<?>>() {
-            @SuppressWarnings({ "rawtypes", "unchecked" })
             @Override
-            public RpcInputCodec load(final SchemaPath key) {
+            public RpcInputCodec<?> load(final SchemaPath key) {
                 final ContainerSchemaNode schema = SchemaContextUtil.getRpcDataSchema(getSchema(), key);
-                if (schema instanceof EffectiveStatement
-                        && ((EffectiveStatement) schema).getDeclared().getStatementSource()
-                        != StatementSource.DECLARATION) {
-                    // This is an implicitly-defined input or output statement. We do not have a corresponding
-                    // data representation, so we hard-wire it to null.
-                    return UnmappedRpcInputCodec.getInstance();
-                }
-
-                final Class cls = factory().getRuntimeContext().getClassForSchema(schema);
+                @SuppressWarnings("unchecked")
+                final Class<? extends DataContainer> cls = (Class<? extends DataContainer>)
+                        factory().getRuntimeContext().getClassForSchema(schema);
                 return getRpc(cls);
             }
         });
 
     private final LoadingCache<SchemaPath, NotificationCodecContext<?>> notificationsByPath = CacheBuilder.newBuilder()
             .build(new CacheLoader<SchemaPath, NotificationCodecContext<?>>() {
-
-                @SuppressWarnings({ "rawtypes", "unchecked" })
                 @Override
-                public NotificationCodecContext load(final SchemaPath key) throws Exception {
+                public NotificationCodecContext<?> load(final SchemaPath key) {
                     final NotificationDefinition schema = SchemaContextUtil.getNotificationSchema(getSchema(), key);
-                    final Class clz = factory().getRuntimeContext().getClassForSchema(schema);
+                    @SuppressWarnings("unchecked")
+                    final Class<? extends Notification> clz = (Class<? extends Notification>)
+                            factory().getRuntimeContext().getClassForSchema(schema);
                     return getNotification(clz);
                 }
             });
diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnmappedRpcInputCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnmappedRpcInputCodec.java
deleted file mode 100644 (file)
index 6da23f6..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.mdsal.binding.dom.codec.impl;
-
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-
-/**
- * Singleton codec for translating RPCs with implicit input statements, which are not mapped by binding spec v1. Since
- * there is no equivalent, we always return null.
- *
- * @author Robert Varga
- *
- * @param <D> Data object type
- */
-final class UnmappedRpcInputCodec<D extends DataObject> implements RpcInputCodec<D> {
-    private static final UnmappedRpcInputCodec<?> INSTANCE = new UnmappedRpcInputCodec<>();
-
-    private UnmappedRpcInputCodec() {
-
-    }
-
-    @SuppressWarnings("unchecked")
-    static <D extends DataObject> UnmappedRpcInputCodec<D> getInstance() {
-        return (UnmappedRpcInputCodec<D>) INSTANCE;
-    }
-
-    @Override
-    public D deserialize(final NormalizedNode<?, ?> data) {
-        return null;
-    }
-
-    @Override
-    public NormalizedNode<?, ?> serialize(final D data) {
-        throw new UnsupportedOperationException("Serialization of " + data + " not supported");
-    }
-}
index 3d2d297e0afe79eea7386eea0d253cdbb9459461..6a60e0c222cf6cf293f35d0e36b74cd1a46f0dcb 100644 (file)
@@ -11,7 +11,6 @@ import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import org.opendaylight.yangtools.concepts.Identifiable;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
@@ -55,13 +54,10 @@ public abstract class RpcRoutingStrategy implements Identifiable<QName> {
     public abstract boolean isContextBasedRouted();
 
     public static RpcRoutingStrategy from(final RpcDefinition rpc) {
-        ContainerSchemaNode input = rpc.getInput();
-        if (input != null) {
-            for (DataSchemaNode schemaNode : input.getChildNodes()) {
-                Optional<QName> context = getRoutingContext(schemaNode);
-                if (context.isPresent()) {
-                    return new RoutedRpcStrategy(rpc.getQName(), context.get(), schemaNode.getQName());
-                }
+        for (DataSchemaNode schemaNode : rpc.getInput().getChildNodes()) {
+            Optional<QName> context = getRoutingContext(schemaNode);
+            if (context.isPresent()) {
+                return new RoutedRpcStrategy(rpc.getQName(), context.get(), schemaNode.getQName());
             }
         }
         return new GlobalRpcStrategy(rpc.getQName());