Fix implementation nullness guarantees
[yangtools.git] / yang / yang-data-util / src / main / java / org / opendaylight / yangtools / yang / data / util / ContainerSchemaNodes.java
index e1b68571e96c1fe9f874f2ceefd3c4b04eaa7d3e..8010b84fbb395a1b1b16c00a40a0d99012e54099 100644 (file)
@@ -7,32 +7,33 @@
  */
 package org.opendaylight.yangtools.yang.data.util;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
-
 import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
+import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.MustDefinition;
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
+import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
-
+import org.opendaylight.yangtools.yang.xpath.api.YangXPathExpression.QualifiedBound;
 
 /**
  * yang-data-util
@@ -46,17 +47,16 @@ public final class ContainerSchemaNodes {
     }
 
     @Beta
-    public static ContainerSchemaNode forNotification(final NotificationDefinition notification) {
+    public static ContainerLike forNotification(final NotificationDefinition notification) {
         return new NotificationContainerSchemaNode(notification);
     }
 
     @Beta
-    public static ContainerSchemaNode forRPC(final RpcDefinition rpc) {
+    public static ContainerLike forRPC(final RpcDefinition rpc) {
         return new RpcContainerSchemaNode(rpc);
     }
 
-    private abstract static class AbstractContainerSchemaNode implements ContainerSchemaNode {
-
+    private abstract static class AbstractContainerSchemaNode implements ContainerLike {
         private final SchemaNode schemaNode;
 
         private AbstractContainerSchemaNode(final SchemaNode schemaNode) {
@@ -64,12 +64,7 @@ public final class ContainerSchemaNodes {
         }
 
         @Override
-        public boolean isPresenceContainer() {
-            return false;
-        }
-
-        @Override
-        public Set<UsesNode> getUses() {
+        public Collection<? extends UsesNode> getUses() {
             return ImmutableSet.of();
         }
 
@@ -79,50 +74,45 @@ public final class ContainerSchemaNodes {
         }
 
         @Override
-        public boolean isConfiguration() {
-            return false;
+        public Optional<Boolean> effectiveConfig() {
+            return Optional.empty();
         }
 
-        @Override
-        public ConstraintDefinition getConstraints() {
-            return EmptyConstraintDefinition.create(false);
-        }
-
-        @Nonnull
         @Override
         public QName getQName() {
             return schemaNode.getQName();
         }
 
-        @Nonnull
         @Override
+        @Deprecated
         public SchemaPath getPath() {
             return schemaNode.getPath();
         }
 
-        @Nullable
         @Override
-        public String getDescription() {
+        public Optional<String> getDescription() {
             return schemaNode.getDescription();
         }
 
-        @Nullable
         @Override
-        public String getReference() {
+        public Optional<String> getReference() {
             return schemaNode.getReference();
         }
 
-        @Nonnull
         @Override
         public Status getStatus() {
             return schemaNode.getStatus();
         }
 
-        @Nonnull
         @Override
-        public List<UnknownSchemaNode> getUnknownSchemaNodes() {
+        public Collection<? extends @NonNull MustDefinition> getMustConstraints() {
             return ImmutableList.of();
         }
+
+        @Override
+        public Optional<? extends QualifiedBound> getWhenCondition() {
+            return Optional.empty();
+        }
     }
 
     private static final class RpcContainerSchemaNode extends AbstractContainerSchemaNode {
@@ -135,24 +125,24 @@ public final class ContainerSchemaNodes {
         }
 
         @Override
-        public Set<GroupingDefinition> getGroupings() {
+        public Collection<? extends GroupingDefinition> getGroupings() {
             return rpcDefinition.getGroupings();
         }
 
         @Override
-        public Set<TypeDefinition<?>> getTypeDefinitions() {
+        public Collection<? extends TypeDefinition<?>> getTypeDefinitions() {
             return rpcDefinition.getTypeDefinitions();
         }
 
         @Override
-        public Set<AugmentationSchemaNode> getAvailableAugmentations() {
+        public Collection<? extends AugmentationSchemaNode> getAvailableAugmentations() {
             return ImmutableSet.of();
         }
 
         @Override
-        public Collection<DataSchemaNode> getChildNodes() {
-            final ContainerSchemaNode input = rpcDefinition.getInput();
-            final ContainerSchemaNode output = rpcDefinition.getOutput();
+        public Collection<? extends DataSchemaNode> getChildNodes() {
+            final InputSchemaNode input = rpcDefinition.getInput();
+            final OutputSchemaNode output = rpcDefinition.getOutput();
             if (input == null && output == null) {
                 return ImmutableList.of();
             } else if (input != null && output != null) {
@@ -165,27 +155,38 @@ public final class ContainerSchemaNodes {
         }
 
         @Override
-        public DataSchemaNode getDataChildByName(QName name) {
+        public Optional<DataSchemaNode> findDataChildByName(final QName name) {
             switch (name.getLocalName()) {
                 case "input":
-                    return rpcDefinition.getInput();
+                    return Optional.of(rpcDefinition.getInput());
                 case "output":
-                    return rpcDefinition.getOutput();
+                    return Optional.of(rpcDefinition.getOutput());
                 default:
-                    return null;
+                    return Optional.empty();
             }
         }
 
+        @Deprecated
         @Override
         public boolean isAddedByUses() {
             return false;
         }
+
+        @Override
+        public Collection<? extends ActionDefinition> getActions() {
+            return ImmutableSet.of();
+        }
+
+        @Override
+        public Collection<? extends NotificationDefinition> getNotifications() {
+            return ImmutableSet.of();
+        }
     }
 
     private static final class NotificationContainerSchemaNode extends AbstractContainerSchemaNode {
 
         private final NotificationDefinition notification;
-        private final Map<QName, DataSchemaNode> mapNodes;
+        private final ImmutableMap<QName, ? extends DataSchemaNode> mapNodes;
 
         private NotificationContainerSchemaNode(final NotificationDefinition notification) {
             super(notification);
@@ -194,39 +195,45 @@ public final class ContainerSchemaNodes {
         }
 
         @Override
-        public Set<NotificationDefinition> getNotifications() {
+        public Collection<? extends NotificationDefinition> getNotifications() {
             return ImmutableSet.of(notification);
         }
 
         @Override
-        public Set<AugmentationSchemaNode> getAvailableAugmentations() {
+        public Collection<? extends AugmentationSchemaNode> getAvailableAugmentations() {
             return notification.getAvailableAugmentations();
         }
 
         @Override
-        public Set<TypeDefinition<?>> getTypeDefinitions() {
+        public Collection<? extends TypeDefinition<?>> getTypeDefinitions() {
             return notification.getTypeDefinitions();
         }
 
         @Override
-        public Collection<DataSchemaNode> getChildNodes() {
+        public Collection<? extends DataSchemaNode> getChildNodes() {
             return notification.getChildNodes();
         }
 
         @Override
-        public Set<GroupingDefinition> getGroupings() {
+        public Collection<? extends GroupingDefinition> getGroupings() {
             return notification.getGroupings();
         }
 
         @Override
-        public DataSchemaNode getDataChildByName(QName name) {
-            return mapNodes.get(name);
+        public Optional<DataSchemaNode> findDataChildByName(final QName name) {
+            return Optional.ofNullable(mapNodes.get(requireNonNull(name)));
         }
 
         @Override
+        @Deprecated
         public boolean isAddedByUses() {
             //FIXME: reference to https://bugs.opendaylight.org/show_bug.cgi?id=6897
             return false;
         }
+
+        @Override
+        public Collection<? extends ActionDefinition> getActions() {
+            return ImmutableSet.of();
+        }
     }
 }