Modernize GSON codec a bit 25/101325/4
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 29 May 2022 18:02:42 +0000 (20:02 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 29 May 2022 19:14:41 +0000 (21:14 +0200)
Use instanceof pattern matching and switch expressions.

Change-Id: I48362f161187de4b76314b889e59994dfbf1d107
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
codec/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/IdentityrefJSONCodec.java
codec/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactorySupplier.java
codec/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONInstanceIdentifierCodec.java
codec/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java
codec/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONStreamWriterContext.java
codec/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java
codec/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonWriterFactory.java

index 5257e9d02a23830f0c68af7f64c74c9045f4f91a..893d9045d2169d354269f131cc18dab1609d7fb4 100644 (file)
@@ -12,8 +12,7 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.gson.stream.JsonWriter;
 import java.io.IOException;
-import java.util.Iterator;
-import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.data.util.codec.IdentityCodecUtil;
@@ -22,11 +21,11 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.Module;
 
 final class IdentityrefJSONCodec implements JSONCodec<QName> {
-    private final EffectiveModelContext schemaContext;
-    private final QNameModule parentModule;
+    private final @NonNull EffectiveModelContext context;
+    private final @NonNull QNameModule parentModule;
 
     IdentityrefJSONCodec(final EffectiveModelContext context, final QNameModule parentModule) {
-        this.schemaContext = requireNonNull(context);
+        this.context = requireNonNull(context);
         this.parentModule = requireNonNull(parentModule);
     }
 
@@ -37,12 +36,12 @@ final class IdentityrefJSONCodec implements JSONCodec<QName> {
 
     @Override
     public QName parseValue(final Object ctx, final String value) {
-        return IdentityCodecUtil.parseIdentity(value, schemaContext, prefix -> {
+        return IdentityCodecUtil.parseIdentity(value, context, prefix -> {
             if (prefix.isEmpty()) {
                 return parentModule;
             }
 
-            final Iterator<? extends Module> modules = schemaContext.findModules(prefix).iterator();
+            final var modules = context.findModules(prefix).iterator();
             checkArgument(modules.hasNext(), "Could not find module %s", prefix);
             return modules.next().getQNameModule();
         }).getQName();
@@ -56,11 +55,8 @@ final class IdentityrefJSONCodec implements JSONCodec<QName> {
      */
     @Override
     public void writeValue(final JsonWriter writer, final QName value) throws IOException {
-        final String str = QNameCodecUtil.encodeQName(value, uri -> {
-            final Optional<String> optName = schemaContext.findModule(uri).map(Module::getName);
-            checkArgument(optName.isPresent(), "Cannot find module for %s", uri);
-            return optName.get();
-        });
+        final String str = QNameCodecUtil.encodeQName(value, uri -> context.findModule(uri)
+            .map(Module::getName).orElseThrow(() -> new IllegalArgumentException("Cannot find module for " + uri)));
         writer.value(str);
     }
 }
index 8e0667158575be11ee32a713f8c7561662b3aaa7..be187642aa6dd25f556fa60ca75d292a51dd1cc4 100644 (file)
@@ -94,12 +94,12 @@ public enum JSONCodecFactorySupplier {
             int ret = 0;
             for (var entry : parent.getAll(DataTreeNamespace.class).entrySet()) {
                 final var child = entry.getValue();
-                if (child instanceof DataTreeAwareEffectiveStatement) {
+                if (child instanceof DataTreeAwareEffectiveStatement<?, ?> dataTree) {
                     stack.enterDataTree(entry.getKey());
-                    ret += codecsForChildren(lazy, stack, (DataTreeAwareEffectiveStatement<?, ?>) child);
+                    ret += codecsForChildren(lazy, stack, dataTree);
                     stack.exit();
-                } else if (child instanceof TypedDataSchemaNode) {
-                    lazy.codecFor((TypedDataSchemaNode) child, stack);
+                } else if (child instanceof TypedDataSchemaNode typed) {
+                    lazy.codecFor(typed, stack);
                     ++ret;
                 }
             }
index cf7388f7e4cd66c26265a69796e1d52026c0a694..419dc12f7faea0d76858774054a19ead07e07e41 100644 (file)
@@ -12,7 +12,7 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.gson.stream.JsonWriter;
 import java.io.IOException;
-import java.util.Iterator;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.XMLNamespace;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.util.AbstractModuleStringInstanceIdentifierCodec;
@@ -25,25 +25,25 @@ import org.opendaylight.yangtools.yang.model.util.LeafrefResolver;
 
 abstract class JSONInstanceIdentifierCodec extends AbstractModuleStringInstanceIdentifierCodec
         implements JSONCodec<YangInstanceIdentifier> {
-    private final DataSchemaContextTree dataContextTree;
+    private final @NonNull DataSchemaContextTree dataContextTree;
     private final JSONCodecFactory codecFactory;
     private final EffectiveModelContext context;
 
     JSONInstanceIdentifierCodec(final EffectiveModelContext context, final JSONCodecFactory jsonCodecFactory) {
         this.context = requireNonNull(context);
-        this.dataContextTree = DataSchemaContextTree.from(context);
-        this.codecFactory = requireNonNull(jsonCodecFactory);
+        dataContextTree = DataSchemaContextTree.from(context);
+        codecFactory = requireNonNull(jsonCodecFactory);
     }
 
     @Override
     protected final Module moduleForPrefix(final String prefix) {
-        final Iterator<? extends Module> modules = context.findModules(prefix).iterator();
+        final var modules = context.findModules(prefix).iterator();
         return modules.hasNext() ? modules.next() : null;
     }
 
     @Override
     protected final String prefixForNamespace(final XMLNamespace namespace) {
-        final Iterator<? extends Module> modules = context.findModules(namespace).iterator();
+        final var modules = context.findModules(namespace).iterator();
         return modules.hasNext() ? modules.next().getName() : null;
     }
 
index a62b8029f5e7fef20cb8ea31411f625f0a5627f7..a4c9fe10f7278aa11d4858d29240b452e12e02bb 100644 (file)
@@ -101,9 +101,9 @@ public abstract class JSONNormalizedNodeStreamWriter implements NormalizedNodeSt
     JSONNormalizedNodeStreamWriter(final JSONCodecFactory codecFactory, final NormalizedNodeStreamWriterStack tracker,
             final JsonWriter writer, final JSONStreamWriterRootContext rootContext) {
         this.writer = requireNonNull(writer);
-        this.codecs = requireNonNull(codecFactory);
+        codecs = requireNonNull(codecFactory);
         this.tracker = requireNonNull(tracker);
-        this.context = requireNonNull(rootContext);
+        context = requireNonNull(rootContext);
     }
 
     /**
@@ -303,8 +303,8 @@ public abstract class JSONNormalizedNodeStreamWriter implements NormalizedNodeSt
     @Override
     public final void startContainerNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
         final SchemaNode schema = tracker.startContainerNode(name);
-        final boolean isPresence = schema instanceof ContainerSchemaNode
-            ? ((ContainerSchemaNode) schema).isPresenceContainer() : DEFAULT_EMIT_EMPTY_CONTAINERS;
+        final boolean isPresence = schema instanceof ContainerSchemaNode container
+            ? container.isPresenceContainer() : DEFAULT_EMIT_EMPTY_CONTAINERS;
         context = new JSONStreamWriterNamedObjectContext(context, name, isPresence);
     }
 
@@ -405,8 +405,8 @@ public abstract class JSONNormalizedNodeStreamWriter implements NormalizedNodeSt
     @Override
     public void scalarValue(final Object value) throws IOException {
         final Object current = tracker.getParent();
-        if (current instanceof TypedDataSchemaNode) {
-            writeValue(value, codecs.codecFor((TypedDataSchemaNode) current, tracker));
+        if (current instanceof TypedDataSchemaNode typed) {
+            writeValue(value, codecs.codecFor(typed, tracker));
         } else if (current instanceof AnydataSchemaNode) {
             writeAnydataValue(value);
         } else {
@@ -428,8 +428,8 @@ public abstract class JSONNormalizedNodeStreamWriter implements NormalizedNodeSt
     }
 
     private void writeAnydataValue(final Object value) throws IOException {
-        if (value instanceof NormalizedAnydata) {
-            writeNormalizedAnydata((NormalizedAnydata) value);
+        if (value instanceof NormalizedAnydata normalized) {
+            writeNormalizedAnydata(normalized);
         } else {
             throw new IllegalStateException("Unexpected anydata value " + value);
         }
@@ -533,17 +533,10 @@ public abstract class JSONNormalizedNodeStreamWriter implements NormalizedNodeSt
             return;
         }
         switch (childNodeText) {
-            case "null":
-                writer.nullValue();
-                break;
-            case "false":
-                writer.value(false);
-                break;
-            case "true":
-                writer.value(true);
-                break;
-            default:
-                writer.value(childNodeText);
+            case "null" -> writer.nullValue();
+            case "false" -> writer.value(false);
+            case "true" -> writer.value(true);
+            default -> writer.value(childNodeText);
         }
     }
 
index edb1dec66573179af90b1f344c941876344b023c..7cbc38fc7b1eacf7ad22433a814fca9e33078ba6 100644 (file)
@@ -7,14 +7,12 @@
  */
 package org.opendaylight.yangtools.yang.data.codec.gson;
 
-import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.gson.stream.JsonWriter;
 import java.io.IOException;
-import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
@@ -67,9 +65,10 @@ abstract class JSONStreamWriterContext {
         // Prepend module name if namespaces do not match
         final QNameModule module = qname.getModule();
         if (!module.getNamespace().equals(getNamespace())) {
-            final Optional<String> modules = schema.findModule(module).map(Module::getName);
-            checkArgument(modules.isPresent(), "Could not find module for namespace %s", module);
-            sb.append(modules.get()).append(':');
+            final var name = schema.findModule(module)
+                .map(Module::getName)
+                .orElseThrow(() -> new IllegalArgumentException("Could not find module for namespace " + module));
+            sb.append(name).append(':');
         }
         sb.append(qname.getLocalName());
 
index e8c50700d664d577410056f7762a91ae5d8e00bc..1717602a805edb0edcb9d2628725385c166cf455 100644 (file)
@@ -91,12 +91,12 @@ public final class JsonParserStream implements Closeable, Flushable {
 
         if (!stack.isEmpty()) {
             final EffectiveStatement<?, ?> parent = stack.currentStatement();
-            if (parent instanceof DataSchemaNode) {
-                parentNode = (DataSchemaNode) parent;
-            } else if (parent instanceof OperationDefinition) {
-                parentNode = OperationAsContainer.of((OperationDefinition) parent);
-            } else if (parent instanceof NotificationDefinition) {
-                parentNode = NotificationAsContainer.of((NotificationDefinition) parent);
+            if (parent instanceof DataSchemaNode data) {
+                parentNode = data;
+            } else if (parent instanceof OperationDefinition oper) {
+                parentNode = OperationAsContainer.of(oper);
+            } else if (parent instanceof NotificationDefinition notif) {
+                parentNode = NotificationAsContainer.of(notif);
             } else {
                 throw new IllegalArgumentException("Illegal parent node " + parent);
             }
@@ -329,8 +329,8 @@ public final class JsonParserStream implements Closeable, Flushable {
                     final QName qname = childDataSchemaNodes.peekLast().getQName();
                     final AbstractNodeDataWithSchema<?> newChild = ((CompositeNodeDataWithSchema<?>) parent)
                             .addChild(childDataSchemaNodes, ChildReusePolicy.NOOP);
-                    if (newChild instanceof AnyXmlNodeDataWithSchema) {
-                        readAnyXmlValue(in, (AnyXmlNodeDataWithSchema) newChild, jsonElementName);
+                    if (newChild instanceof AnyXmlNodeDataWithSchema anyxml) {
+                        readAnyXmlValue(in, anyxml, jsonElementName);
                     } else {
                         stack.enterDataTree(qname);
                         read(in, newChild);
@@ -350,10 +350,10 @@ public final class JsonParserStream implements Closeable, Flushable {
     }
 
     private static AbstractNodeDataWithSchema<?> newArrayEntry(final AbstractNodeDataWithSchema<?> parent) {
-        if (!(parent instanceof MultipleEntryDataWithSchema)) {
-            throw new IllegalStateException("Found an unexpected array nested under " + parent.getSchema().getQName());
+        if (parent instanceof MultipleEntryDataWithSchema<?> multiple) {
+            return multiple.newChildEntry();
         }
-        return ((MultipleEntryDataWithSchema<?>) parent).newChildEntry();
+        throw new IllegalStateException("Found an unexpected array nested under " + parent.getSchema().getQName());
     }
 
     private void setValue(final AbstractNodeDataWithSchema<?> parent, final String value) {
@@ -428,10 +428,10 @@ public final class JsonParserStream implements Closeable, Flushable {
             final DataSchemaNode dataSchemaNode) {
         final Set<XMLNamespace> potentialUris = new HashSet<>();
         final Set<ChoiceSchemaNode> choices = new HashSet<>();
-        if (dataSchemaNode instanceof DataNodeContainer) {
-            for (final DataSchemaNode childSchemaNode : ((DataNodeContainer) dataSchemaNode).getChildNodes()) {
-                if (childSchemaNode instanceof ChoiceSchemaNode) {
-                    choices.add((ChoiceSchemaNode)childSchemaNode);
+        if (dataSchemaNode instanceof DataNodeContainer container) {
+            for (final DataSchemaNode childSchemaNode : container.getChildNodes()) {
+                if (childSchemaNode instanceof ChoiceSchemaNode choice) {
+                    choices.add(choice);
                 } else if (childSchemaNode.getQName().getLocalName().equals(elementName)) {
                     potentialUris.add(childSchemaNode.getQName().getNamespace());
                 }
index 35ff4bbc3c2dfc25aa6d9a0c9882f83509cf2c9a..ae30db0202e95a6cb4746c4553e48a4a5fc49842 100644 (file)
@@ -39,8 +39,7 @@ public final class JsonWriterFactory {
      */
     public static JsonWriter createJsonWriter(final Writer writer, final int indentSize) {
         JsonWriter jsonWriter = new JsonWriter(writer);
-        final String indent = " ".repeat(indentSize);
-        jsonWriter.setIndent(indent);
+        jsonWriter.setIndent(" ".repeat(indentSize));
         return jsonWriter;
     }
 }