Integrate RestconfNormalizedNodeWriter
[netconf.git] / restconf / restconf-nb / src / main / java / org / opendaylight / restconf / nb / rfc8040 / jersey / providers / AbstractNormalizedNodeBodyWriter.java
index 56da396d34aeca6079b770fa2761a5f1f7cfcbd5..8bf81af721114a881f095d49cc5e92af1fa1c631 100644 (file)
@@ -16,13 +16,11 @@ 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.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.restconf.api.query.PrettyPrintParam;
 import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload;
-import org.opendaylight.restconf.nb.rfc8040.legacy.QueryParameters;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.restconf.nb.rfc8040.legacy.WriterParameters;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.model.api.stmt.ActionEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 
 abstract class AbstractNormalizedNodeBodyWriter implements MessageBodyWriter<NormalizedNodePayload> {
@@ -36,36 +34,11 @@ abstract class AbstractNormalizedNodeBodyWriter implements MessageBodyWriter<Nor
     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());
-            }
-        }
-
-        final var output = requireNonNull(entityStream);
-        final var stack = context.inference().toSchemaInferenceStack();
-        // FIXME: this dispatch is here to handle codec transition to 'output', but that should be completely okay with
-        //        the instantiation path we are using (based in Inference).
-        if (!stack.isEmpty()) {
-            final var stmt = stack.currentStatement();
-            if (stmt instanceof RpcEffectiveStatement rpc) {
-                stack.enterSchemaTree(rpc.output().argument());
-                writeOperationOutput(stack, context.getWriterParameters(), (ContainerNode) data, output);
-            } else if (stmt instanceof ActionEffectiveStatement action) {
-                stack.enterSchemaTree(action.output().argument());
-                writeOperationOutput(stack, context.getWriterParameters(), (ContainerNode) data, output);
-            }
-        }
-        writeData(stack, context.getWriterParameters(), data, output);
+        writeData(context.inference().toSchemaInferenceStack(), context.data(), context.writerParameters(),
+            context.prettyPrint(), requireNonNull(entityStream));
     }
 
-    abstract void writeOperationOutput(@NonNull SchemaInferenceStack stack, @NonNull QueryParameters writerParameters,
-        @NonNull ContainerNode output, @NonNull OutputStream entityStream) throws IOException;
-
-    abstract void writeData(@NonNull SchemaInferenceStack stack, @NonNull QueryParameters writerParameters,
-        @NonNull NormalizedNode data, @NonNull OutputStream entityStream) throws IOException;
+    @NonNullByDefault
+    abstract void writeData(SchemaInferenceStack stack, NormalizedNode data, WriterParameters writerParameters,
+        PrettyPrintParam prettyPrint, OutputStream out) throws IOException;
 }