Share common parts of AbstractNormalizedNodeBodyWriter 56/107856/3
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 13 Sep 2023 16:34:47 +0000 (18:34 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 14 Sep 2023 07:48:22 +0000 (09:48 +0200)
The two specializations are doing similar things, let's move them closer
together by sharing the common bits. This has a nice effect of reducing
JAX-RS exposure a tiny bit.

JIRA: NETCONF-1157
Change-Id: I4868a890d77f7a8863e85969f94bcb260cada6ed
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/AbstractNormalizedNodeBodyWriter.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/JsonNormalizedNodeBodyWriter.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/XmlNormalizedNodeBodyWriter.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/legacy/NormalizedNodePayload.java

index fcdd638ee20e04df11a416abd425903886a28ac6..4788501b608b538a093353a4564ffc5b66d27a76 100644 (file)
@@ -7,11 +7,20 @@
  */
 package org.opendaylight.restconf.nb.rfc8040.jersey.providers;
 
+import static java.util.Objects.requireNonNull;
+
+import java.io.IOException;
+import java.io.OutputStream;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.ext.MessageBodyWriter;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.restconf.nb.rfc8040.legacy.InstanceIdentifierContext;
 import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload;
+import org.opendaylight.restconf.nb.rfc8040.legacy.QueryParameters;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
 abstract class AbstractNormalizedNodeBodyWriter implements MessageBodyWriter<NormalizedNodePayload> {
     @Override
@@ -19,4 +28,25 @@ abstract class AbstractNormalizedNodeBodyWriter implements MessageBodyWriter<Nor
             final MediaType mediaType) {
         return type.equals(NormalizedNodePayload.class);
     }
+
+    @Override
+    public final void writeTo(final NormalizedNodePayload context, final Class<?> type, final Type genericType,
+            final Annotation[] annotations, final MediaType mediaType, final MultivaluedMap<String, Object> httpHeaders,
+            final OutputStream entityStream) throws IOException {
+        final var data = context.getData();
+        if (data == null) {
+            return;
+        }
+        if (httpHeaders != null) {
+            for (var entry : context.getNewHeaders().entrySet()) {
+                httpHeaders.add(entry.getKey(), entry.getValue());
+            }
+        }
+
+        writeTo(context.getInstanceIdentifierContext(), context.getWriterParameters(), data,
+            requireNonNull(entityStream));
+    }
+
+    abstract void writeTo(@NonNull InstanceIdentifierContext context, @NonNull QueryParameters writerParameters,
+        @NonNull NormalizedNode data, @NonNull OutputStream entityStream) throws IOException;
 }
index 37a0580f067d66ccaab2d554ddd3a316ffddff30..1c5d5e9ea928ce7a8fe003d5698a5959178e5381 100644 (file)
@@ -11,22 +11,18 @@ import com.google.gson.stream.JsonWriter;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Set;
 import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.ext.Provider;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.restconf.api.query.DepthParam;
 import org.opendaylight.restconf.nb.rfc8040.MediaTypes;
 import org.opendaylight.restconf.nb.rfc8040.jersey.providers.api.RestconfNormalizedNodeWriter;
 import org.opendaylight.restconf.nb.rfc8040.legacy.InstanceIdentifierContext;
-import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload;
+import org.opendaylight.restconf.nb.rfc8040.legacy.QueryParameters;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.XMLNamespace;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
@@ -43,32 +39,16 @@ import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference
 
 @Provider
 @Produces({ MediaTypes.APPLICATION_YANG_DATA_JSON, MediaType.APPLICATION_JSON })
-public class JsonNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWriter {
+public final class JsonNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWriter {
     private static final int DEFAULT_INDENT_SPACES_NUM = 2;
 
     @Override
-    public void writeTo(final NormalizedNodePayload context,
-                        final Class<?> type,
-                        final Type genericType,
-                        final Annotation[] annotations,
-                        final MediaType mediaType,
-                        final MultivaluedMap<String, Object> httpHeaders,
-                        final OutputStream entityStream) throws IOException, WebApplicationException {
-        if (context.getData() == null) {
-            return;
-        }
-
-        if (httpHeaders != null) {
-            for (var entry : context.getNewHeaders().entrySet()) {
-                httpHeaders.add(entry.getKey(), entry.getValue());
-            }
-        }
-
-        final var pretty = context.getWriterParameters().prettyPrint();
+    void writeTo(final InstanceIdentifierContext context, final QueryParameters writerParameters,
+            final NormalizedNode data, final OutputStream entityStream) throws IOException {
+        final var pretty = writerParameters.prettyPrint();
         try (var jsonWriter = createJsonWriter(entityStream, pretty == null ? false : pretty.value())) {
             jsonWriter.beginObject();
-            writeNormalizedNode(jsonWriter, context.getInstanceIdentifierContext(), context.getData(),
-                context.getWriterParameters().depth(), context.getWriterParameters().fields());
+            writeNormalizedNode(jsonWriter, context, data, writerParameters.depth(), writerParameters.fields());
             jsonWriter.endObject();
             jsonWriter.flush();
         }
index ad0b33adb3cd367015c0350d38a372c328717242..9d7b6e63d369323be0cec07ece0e376dbec1e3cb 100644 (file)
@@ -9,16 +9,12 @@ package org.opendaylight.restconf.nb.rfc8040.jersey.providers;
 
 import java.io.IOException;
 import java.io.OutputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Set;
 import javanet.staxutils.IndentingXMLStreamWriter;
 import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.ext.Provider;
 import javax.xml.XMLConstants;
 import javax.xml.stream.FactoryConfigurationError;
@@ -29,7 +25,7 @@ import org.opendaylight.restconf.api.query.DepthParam;
 import org.opendaylight.restconf.nb.rfc8040.MediaTypes;
 import org.opendaylight.restconf.nb.rfc8040.jersey.providers.api.RestconfNormalizedNodeWriter;
 import org.opendaylight.restconf.nb.rfc8040.legacy.InstanceIdentifierContext;
-import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload;
+import org.opendaylight.restconf.nb.rfc8040.legacy.QueryParameters;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
@@ -43,7 +39,7 @@ import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference
 
 @Provider
 @Produces({ MediaTypes.APPLICATION_YANG_DATA_XML, MediaType.APPLICATION_XML, MediaType.TEXT_XML })
-public class XmlNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWriter {
+public final class XmlNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWriter {
     private static final XMLOutputFactory XML_FACTORY;
 
     static {
@@ -52,27 +48,13 @@ public class XmlNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWrite
     }
 
     @Override
-    public void writeTo(final NormalizedNodePayload context,
-                        final Class<?> type,
-                        final Type genericType,
-                        final Annotation[] annotations,
-                        final MediaType mediaType,
-                        final MultivaluedMap<String, Object> httpHeaders,
-                        final OutputStream entityStream) throws IOException, WebApplicationException {
-        if (context.getData() == null) {
-            return;
-        }
-        if (httpHeaders != null) {
-            for (var entry : context.getNewHeaders().entrySet()) {
-                httpHeaders.add(entry.getKey(), entry.getValue());
-            }
-        }
-
+    void writeTo(final InstanceIdentifierContext context, final QueryParameters writerParameters,
+            final NormalizedNode data, final OutputStream entityStream) throws IOException {
         XMLStreamWriter xmlWriter;
         try {
             xmlWriter = XML_FACTORY.createXMLStreamWriter(entityStream, StandardCharsets.UTF_8.name());
 
-            final var prettyPrint = context.getWriterParameters().prettyPrint();
+            final var prettyPrint = writerParameters.prettyPrint();
             if (prettyPrint != null && prettyPrint.value()) {
                 xmlWriter = new IndentingXMLStreamWriter(xmlWriter);
             }
@@ -80,8 +62,7 @@ public class XmlNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWrite
             throw new IllegalStateException(e);
         }
 
-        writeNormalizedNode(xmlWriter, context.getInstanceIdentifierContext(), context.getData(),
-            context.getWriterParameters().depth(), context.getWriterParameters().fields());
+        writeNormalizedNode(xmlWriter, context, data, writerParameters.depth(), writerParameters.fields());
     }
 
     private static void writeNormalizedNode(final XMLStreamWriter xmlWriter,
index 24249024e44c978d091e87ea96757daa04d0d4cb..f86111dcabffceebe85e04100fcce56b1c341a97 100644 (file)
@@ -12,6 +12,7 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.collect.ImmutableMap;
 import java.net.URI;
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
@@ -22,8 +23,8 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
  */
 public final class NormalizedNodePayload {
     private final InstanceIdentifierContext context;
-    private final ImmutableMap<String, Object> headers;
-    private final QueryParameters writerParameters;
+    private final @NonNull ImmutableMap<String, Object> headers;
+    private final @NonNull QueryParameters writerParameters;
     private final NormalizedNode data;
 
     private NormalizedNodePayload(final InstanceIdentifierContext context, final NormalizedNode data,
@@ -63,7 +64,7 @@ public final class NormalizedNodePayload {
         return context;
     }
 
-    public NormalizedNode getData() {
+    public @Nullable NormalizedNode getData() {
         return data;
     }
 
@@ -73,11 +74,11 @@ public final class NormalizedNodePayload {
      * @return map of headers
      */
     // FIXME: this is only used for redirect on subscribe
-    public ImmutableMap<String, Object> getNewHeaders() {
+    public @NonNull ImmutableMap<String, Object> getNewHeaders() {
         return headers;
     }
 
-    public QueryParameters getWriterParameters() {
+    public @NonNull QueryParameters getWriterParameters() {
         return writerParameters;
     }
 }