2 * Copyright (c) 2024 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.restconf.openapi.impl;
10 import com.fasterxml.jackson.core.JsonGenerator;
11 import java.io.ByteArrayInputStream;
12 import java.io.ByteArrayOutputStream;
13 import java.io.IOException;
14 import java.io.InputStream;
15 import java.io.InputStreamReader;
16 import java.io.Reader;
17 import java.nio.charset.StandardCharsets;
18 import java.util.Iterator;
20 import org.opendaylight.restconf.openapi.jaxrs.OpenApiBodyWriter;
21 import org.opendaylight.restconf.openapi.model.security.Http;
22 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
23 import org.opendaylight.yangtools.yang.model.api.Module;
25 public final class ComponentsStream extends InputStream {
26 private static final String BASIC_AUTH_NAME = "basicAuth";
27 private static final Http OPEN_API_BASIC_AUTH = new Http("basic", null, null);
29 private final Iterator<? extends Module> iterator;
30 private final OpenApiBodyWriter writer;
31 private final EffectiveModelContext context;
32 private final JsonGenerator generator;
33 private final ByteArrayOutputStream stream;
34 private final boolean isForSingleModule;
36 private boolean schemasWritten;
37 private boolean securityWritten;
38 private Reader reader;
40 public ComponentsStream(final EffectiveModelContext context, final OpenApiBodyWriter writer,
41 final JsonGenerator generator, final ByteArrayOutputStream stream,
42 final Iterator<? extends Module> iterator, final boolean isForSingleModule) {
43 this.iterator = iterator;
44 this.context = context;
46 this.generator = generator;
48 this.isForSingleModule = isForSingleModule;
52 public int read() throws IOException {
54 generator.writeObjectFieldStart("components");
56 reader = new InputStreamReader(new ByteArrayInputStream(stream.toByteArray()), StandardCharsets.UTF_8);
60 var read = reader.read();
62 if (!schemasWritten) {
63 reader = new InputStreamReader(new SchemasStream(context, writer, generator, stream, iterator,
64 isForSingleModule), StandardCharsets.UTF_8);
66 schemasWritten = true;
69 if (!securityWritten) {
70 reader = new InputStreamReader(new SecuritySchemesStream(writer, Map.of(BASIC_AUTH_NAME,
71 OPEN_API_BASIC_AUTH)), StandardCharsets.UTF_8);
73 securityWritten = true;
74 generator.writeEndObject();
78 reader = new InputStreamReader(new ByteArrayInputStream(stream.toByteArray()), StandardCharsets.UTF_8);
86 public int read(final byte[] array, final int off, final int len) throws IOException {
87 return super.read(array, off, len);