Migrate users of Optional.get()
[yangtools.git] / model / yang-model-spi / src / main / java / org / opendaylight / yangtools / yang / model / spi / meta / EffectiveStatementMixins.java
index 80cffe88789c76183663c82f187e4b29b0c30ca2..c721b40f4a9ac32c51ef5abc706b28e86acbd22f 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.yangtools.yang.model.spi.meta;
 
+import static com.google.common.base.Verify.verifyNotNull;
+
 import com.google.common.annotations.Beta;
 import com.google.common.base.Strings;
 import com.google.common.collect.Collections2;
@@ -43,6 +45,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 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.UserOrderedAware;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
 import org.opendaylight.yangtools.yang.model.api.WhenConditionAware;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
@@ -51,6 +54,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatem
 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByAwareEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
@@ -149,9 +153,12 @@ public final class EffectiveStatementMixins {
      *
      * @param <A> Argument type ({@link Empty} if statement does not have argument.)
      * @param <D> Class representing declared version of this statement.
+     * @deprecated Scheduled for removal with {@link CopyableNode}.
      */
+    @Deprecated(since = "8.0.0")
     public interface CopyableMixin<A, D extends DeclaredStatement<A>> extends AddedByUsesMixin<A, D>, CopyableNode {
         @Override
+        @Deprecated(since = "8.0.0")
         default boolean isAugmenting() {
             return (flags() & FlagsBuilder.AUGMENTING) != 0;
         }
@@ -195,16 +202,12 @@ public final class EffectiveStatementMixins {
         @Override
         default Optional<Boolean> effectiveConfig() {
             final int fl = flags() & FlagsBuilder.MASK_CONFIG;
-            switch (fl) {
-                case FlagsBuilder.CONFIG_FALSE:
-                    return Optional.of(Boolean.FALSE);
-                case FlagsBuilder.CONFIG_TRUE:
-                    return Optional.of(Boolean.TRUE);
-                case FlagsBuilder.CONFIG_UNDEF:
-                    return Optional.empty();
-                default:
-                    throw new IllegalStateException("Unhandled effective config flags " + fl);
-            }
+            return switch (fl) {
+                case FlagsBuilder.CONFIG_FALSE -> Optional.of(Boolean.FALSE);
+                case FlagsBuilder.CONFIG_TRUE -> Optional.of(Boolean.TRUE);
+                case FlagsBuilder.CONFIG_UNDEF -> Optional.empty();
+                default -> throw new IllegalStateException("Unhandled effective config flags " + fl);
+            };
         }
     }
 
@@ -227,16 +230,12 @@ public final class EffectiveStatementMixins {
             @Override
             default Status getStatus() {
                 final int status = flags() & FlagsBuilder.MASK_STATUS;
-                switch (status) {
-                    case FlagsBuilder.STATUS_CURRENT:
-                        return Status.CURRENT;
-                    case FlagsBuilder.STATUS_DEPRECATED:
-                        return Status.DEPRECATED;
-                    case FlagsBuilder.STATUS_OBSOLETE:
-                        return Status.OBSOLETE;
-                    default:
-                        throw new IllegalStateException("Illegal status " + status);
-                }
+                return switch (status) {
+                    case FlagsBuilder.STATUS_CURRENT -> Status.CURRENT;
+                    case FlagsBuilder.STATUS_DEPRECATED -> Status.DEPRECATED;
+                    case FlagsBuilder.STATUS_OBSOLETE -> Status.OBSOLETE;
+                    default -> throw new IllegalStateException("Illegal status " + status);
+                };
             }
         }
 
@@ -324,7 +323,7 @@ public final class EffectiveStatementMixins {
             extends DocumentedNodeMixin.WithStatus<A, D>, CopyableMixin<A, D>, UnknownSchemaNode {
         @Override
         default String getNodeParameter() {
-            return Strings.nullToEmpty(getDeclared().rawArgument());
+            return Strings.nullToEmpty(verifyNotNull(getDeclared()).rawArgument());
         }
     }
 
@@ -333,9 +332,15 @@ public final class EffectiveStatementMixins {
      *
      * @param <A> Argument type ({@link Empty} if statement does not have argument.)
      * @param <D> Class representing declared version of this statement.
+     * @param <E> Class representing effective version of this statement.
      */
-    public interface UserOrderedMixin<A, D extends DeclaredStatement<A>> extends EffectiveStatementWithFlags<A, D> {
-        default boolean userOrdered() {
+    // FIXME: 9.0.0: remove this mixin once we have a properly-cached DataTree and JSON/XML codec tree and the speed
+    //               of isUserOrdered() is not really critical.
+    public interface UserOrderedAwareMixin<A, D extends DeclaredStatement<A>,
+            E extends OrderedByAwareEffectiveStatement<A, D>>
+            extends EffectiveStatementWithFlags<A, D>, UserOrderedAware<E> {
+        @Override
+        default boolean isUserOrdered() {
             return (flags() & FlagsBuilder.USER_ORDERED) != 0;
         }
     }
@@ -507,21 +512,11 @@ public final class EffectiveStatementMixins {
             }
 
             public FlagsBuilder setStatus(final Status status) {
-                final int bits;
-                switch (status) {
-                    case CURRENT:
-                        bits = STATUS_CURRENT;
-                        break;
-                    case DEPRECATED:
-                        bits = STATUS_DEPRECATED;
-                        break;
-                    case OBSOLETE:
-                        bits = STATUS_OBSOLETE;
-                        break;
-                    default:
-                        throw new IllegalStateException("Unhandled status " + status);
-                }
-
+                final int bits = switch (status) {
+                    case CURRENT -> STATUS_CURRENT;
+                    case DEPRECATED -> STATUS_DEPRECATED;
+                    case OBSOLETE -> STATUS_OBSOLETE;
+                };
                 flags = flags & ~MASK_STATUS | bits;
                 return this;
             }
@@ -547,7 +542,7 @@ public final class EffectiveStatementMixins {
 
     static <T extends ContainerLike> T findAsContainer(final EffectiveStatement<?, ?> stmt,
             final Class<? extends EffectiveStatement<QName, ?>> type, final Class<T> target) {
-        return target.cast(stmt.findFirstEffectiveSubstatement(type).get());
+        return target.cast(stmt.findFirstEffectiveSubstatement(type).orElseThrow());
     }
 
     static Collection<? extends @NonNull TypeDefinition<?>> filterTypeDefinitions(final Mixin<?, ?> stmt) {