import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;
import java.util.Map;
private boolean schemasWritten;
private boolean securityWritten;
private Reader reader;
+ private ReadableByteChannel channel;
public ComponentsStream(final EffectiveModelContext context, final OpenApiBodyWriter writer,
final JsonGenerator generator, final ByteArrayOutputStream stream,
@Override
public int read(final byte[] array, final int off, final int len) throws IOException {
- return super.read(array, off, len);
+ if (channel == null) {
+ generator.writeObjectFieldStart("components");
+ generator.flush();
+ channel = Channels.newChannel(new ByteArrayInputStream(stream.toByteArray()));
+ stream.reset();
+ }
+
+ var read = channel.read(ByteBuffer.wrap(array, off, len));
+ while (read == -1) {
+ if (!schemasWritten) {
+ channel = Channels.newChannel(new SchemasStream(context, writer, generator, stream, iterator,
+ isForSingleModule));
+ read = channel.read(ByteBuffer.wrap(array));
+ schemasWritten = true;
+ continue;
+ }
+ if (!securityWritten) {
+ channel = Channels.newChannel(new SecuritySchemesStream(writer, Map.of(BASIC_AUTH_NAME,
+ OPEN_API_BASIC_AUTH)));
+ read = channel.read(ByteBuffer.wrap(array, off, len));
+ securityWritten = true;
+ generator.writeEndObject();
+ continue;
+ }
+ generator.flush();
+ channel = Channels.newChannel(new ByteArrayInputStream(stream.toByteArray()));
+ stream.reset();
+ return channel.read(ByteBuffer.wrap(array, off, len));
+ }
+ return read;
}
}
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
import java.nio.charset.StandardCharsets;
import org.opendaylight.restconf.openapi.jaxrs.OpenApiBodyWriter;
import org.opendaylight.restconf.openapi.model.InfoEntity;
private final OpenApiBodyWriter writer;
private Reader reader;
+ private ReadableByteChannel channel;
public InfoStream(final InfoEntity entity, final OpenApiBodyWriter writer) {
this.entity = entity;
@Override
public int read(final byte[] array, final int off, final int len) throws IOException {
- return super.read(array, off, len);
+ if (channel == null) {
+ channel = Channels.newChannel(new ByteArrayInputStream(writeNextEntity(entity)));
+ }
+ return channel.read(ByteBuffer.wrap(array, off, len));
}
private byte[] writeNextEntity(final OpenApiEntity next) throws IOException {
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
import java.nio.charset.StandardCharsets;
import java.util.ArrayDeque;
import java.util.Collection;
private final Deque<InputStream> stack = new ArrayDeque<>();
private Reader reader;
+ private ReadableByteChannel channel;
private boolean eof;
@Override
public int read(final byte[] array, final int off, final int len) throws IOException {
- return super.read(array, off, len);
+ if (eof) {
+ return -1;
+ }
+ if (channel == null) {
+ generator.writeStartObject();
+ generator.flush();
+ channel = Channels.newChannel(new ByteArrayInputStream(stream.toByteArray()));
+ stream.reset();
+ }
+
+ var read = channel.read(ByteBuffer.wrap(array, off, len));
+ while (read == -1) {
+ if (stack.isEmpty()) {
+ generator.writeEndObject();
+ generator.flush();
+ channel = Channels.newChannel(new ByteArrayInputStream(stream.toByteArray()));
+ stream.reset();
+ eof = true;
+ return channel.read(ByteBuffer.wrap(array, off, len));
+ }
+ channel = Channels.newChannel(stack.pop());
+ read = channel.read(ByteBuffer.wrap(array, off, len));
+ }
+
+ return read;
}
}
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
import java.nio.charset.StandardCharsets;
import org.opendaylight.restconf.openapi.jaxrs.OpenApiBodyWriter;
import org.opendaylight.restconf.openapi.model.OpenApiEntity;
private final OpenApiBodyWriter writer;
private Reader reader;
+ private ReadableByteChannel channel;
public OpenApiVersionStream(final OpenApiVersionEntity entity, final OpenApiBodyWriter writer) {
this.entity = entity;
@Override
public int read(final byte[] array, final int off, final int len) throws IOException {
- return super.read(array, off, len);
+ if (channel == null) {
+ channel = Channels.newChannel(new ByteArrayInputStream(writeNextEntity(entity)));
+ }
+ return channel.read(ByteBuffer.wrap(array, off, len));
}
private byte[] writeNextEntity(final OpenApiEntity next) throws IOException {
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
import java.nio.charset.StandardCharsets;
import java.util.ArrayDeque;
import java.util.ArrayList;
private boolean hasRootPostLink;
private boolean hasAddedDataStore;
private Reader reader;
+ private ReadableByteChannel channel;
public PathsStream(final EffectiveModelContext schemaContext, final OpenApiBodyWriter writer,
final String deviceName, final String urlPrefix, final boolean isForSingleModule,
@Override
public int read(final byte[] array, final int off, final int len) throws IOException {
- return super.read(array, off, len);
+ if (channel == null) {
+ channel = Channels.newChannel(new ByteArrayInputStream(writeNextEntity(new PathsEntity(toPaths()))));
+ }
+ return channel.read(ByteBuffer.wrap(array, off, len));
}
private byte[] writeNextEntity(final OpenApiEntity next) throws IOException {
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
import java.nio.charset.StandardCharsets;
import java.util.Deque;
import org.opendaylight.restconf.openapi.jaxrs.OpenApiBodyWriter;
private final OpenApiBodyWriter writer;
private Reader reader;
+ private ReadableByteChannel channel;
public SchemaStream(final Deque<SchemaEntity> schemas, final OpenApiBodyWriter writer) {
this.stack = schemas;
@Override
public int read(final byte[] array, final int off, final int len) throws IOException {
- return super.read(array, off, len);
+ if (channel == null) {
+ if (stack.isEmpty()) {
+ return -1;
+ }
+ channel = Channels.newChannel(new ByteArrayInputStream(writeNextEntity(stack.pop())));
+ }
+
+ var read = channel.read(ByteBuffer.wrap(array, off, len));
+ while (read == -1) {
+ if (stack.isEmpty()) {
+ return -1;
+ }
+ channel = Channels.newChannel(new ByteArrayInputStream(writeNextEntity(stack.pop())));
+ read = channel.read(ByteBuffer.wrap(array, off, len));
+ }
+
+ return read;
}
private byte[] writeNextEntity(final OpenApiEntity entity) throws IOException {
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
import java.nio.charset.StandardCharsets;
import java.util.ArrayDeque;
import java.util.ArrayList;
private final boolean isForSingleModule;
private Reader reader;
+ private ReadableByteChannel channel;
private boolean schemesWritten;
public SchemasStream(final EffectiveModelContext context, final OpenApiBodyWriter writer,
@Override
public int read(final byte[] array, final int off, final int len) throws IOException {
- return super.read(array, off, len);
+ if (channel == null) {
+ generator.writeObjectFieldStart("schemas");
+ generator.flush();
+ channel = Channels.newChannel(new ByteArrayInputStream(stream.toByteArray()));
+ stream.reset();
+ }
+
+ var read = channel.read(ByteBuffer.wrap(array, off, len));
+ while (read == -1) {
+ if (iterator.hasNext()) {
+ channel = Channels.newChannel(new SchemaStream(toComponents(iterator.next(), context,
+ isForSingleModule), writer));
+ read = channel.read(ByteBuffer.wrap(array, off, len));
+ continue;
+ }
+ if (!schemesWritten) {
+ generator.writeEndObject();
+ schemesWritten = true;
+ continue;
+ }
+ generator.flush();
+ channel = Channels.newChannel(new ByteArrayInputStream(stream.toByteArray()));
+ stream.reset();
+ return channel.read(ByteBuffer.wrap(array, off, len));
+ }
+
+ return read;
}
private static Deque<SchemaEntity> toComponents(final Module module, final EffectiveModelContext context,
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import org.opendaylight.restconf.openapi.jaxrs.OpenApiBodyWriter;
private final SecuritySchemesEntity securitySchemesEntity;
private Reader reader;
+ private ReadableByteChannel channel;
public SecuritySchemesStream(final OpenApiBodyWriter writer,
final Map<String, SecuritySchemeObject> securitySchemes) {
@Override
public int read(final byte[] array, final int off, final int len) throws IOException {
- return super.read(array, off, len);
+ if (channel == null) {
+ final var stream = new ByteArrayInputStream(writeNextEntity(securitySchemesEntity));
+ channel = Channels.newChannel(stream);
+ }
+ return channel.read(ByteBuffer.wrap(array, off, len));
}
private byte[] writeNextEntity(final OpenApiEntity next) throws IOException {
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
import java.nio.charset.StandardCharsets;
import org.opendaylight.restconf.openapi.jaxrs.OpenApiBodyWriter;
import org.opendaylight.restconf.openapi.model.OpenApiEntity;
private final SecurityEntity entity;
private Reader reader;
+ private ReadableByteChannel channel;
public SecurityStream(final OpenApiBodyWriter writer, final SecurityEntity entity) {
this.writer = writer;
@Override
public int read(final byte[] array, final int off, final int len) throws IOException {
- return super.read(array, off, len);
+ if (channel == null) {
+ channel = Channels.newChannel(new ByteArrayInputStream(writeNextEntity(entity)));
+ }
+ return channel.read(ByteBuffer.wrap(array, off, len));
}
private byte[] writeNextEntity(final OpenApiEntity next) throws IOException {
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
import java.nio.charset.StandardCharsets;
import org.opendaylight.restconf.openapi.jaxrs.OpenApiBodyWriter;
import org.opendaylight.restconf.openapi.model.OpenApiEntity;
private final OpenApiBodyWriter writer;
private Reader reader;
+ private ReadableByteChannel channel;
public ServersStream(final ServersEntity entity, final OpenApiBodyWriter writer) {
this.entity = entity;
@Override
public int read(final byte[] array, final int off, final int len) throws IOException {
- return super.read(array, off, len);
+ if (channel == null) {
+ channel = Channels.newChannel(new ByteArrayInputStream(writeNextEntity(entity)));
+ }
+ return channel.read(ByteBuffer.wrap(array, off, len));
}
private byte[] writeNextEntity(final OpenApiEntity next) throws IOException {