use of io.smallrye.openapi.runtime.io.Format in project wildfly by wildfly.
the class OpenAPIModelServiceConfigurator method get.
@Override
public OpenAPI get() {
OpenApiConfig config = new OpenApiConfigImpl(this.config);
IndexView indexView = new FilteredIndexView(this.index, config);
OpenAPIDocumentBuilder builder = new OpenAPIDocumentBuilder();
builder.config(config);
Map.Entry<VirtualFile, Format> entry = findStaticFile(this.root);
if (entry != null) {
VirtualFile file = entry.getKey();
Format format = entry.getValue();
try (OpenApiStaticFile staticFile = new OpenApiStaticFile(file.openStream(), format)) {
builder.staticFileModel(OpenApiProcessor.modelFromStaticFile(staticFile));
} catch (IOException e) {
throw MicroProfileOpenAPILogger.LOGGER.failedToLoadStaticFile(e, file.getPathNameRelativeTo(this.root), this.deploymentName);
}
}
builder.annotationsModel(OpenApiProcessor.modelFromAnnotations(config, AnnotationScanner.class.getClassLoader(), indexView));
builder.readerModel(OpenApiProcessor.modelFromReader(config, this.module.getClassLoader()));
builder.filter(OpenApiProcessor.getFilter(config, this.module.getClassLoader()));
OpenAPI model = builder.build();
// Generate default title and description based on web metadata
DescriptionGroupMetaData descriptionMetaData = this.metaData.getDescriptionGroup();
String displayName = (descriptionMetaData != null) ? descriptionMetaData.getDisplayName() : null;
String title = (displayName != null) ? displayName : this.deploymentName;
String description = (descriptionMetaData != null) ? descriptionMetaData.getDescription() : null;
Info info = model.getInfo();
// Override SmallRye's default title
if (info.getTitle().equals(DEFAULT_TITLE)) {
info.setTitle(title);
}
if (info.getDescription() == null) {
info.setDescription(description);
}
Host host = this.host.get();
List<UndertowListener> listeners = host.getServer().getListeners();
if (model.getServers() == null) {
// Generate Server entries if none exist
String contextPath = this.info.get().getContextPath();
if (this.config.getOptionalValue(RELATIVE_SERVER_URLS, Boolean.class).orElse(Boolean.TRUE).booleanValue()) {
model.setServers(Collections.singletonList(OASFactory.createServer().url(contextPath)));
} else {
int aliases = host.getAllAliases().size();
int size = 0;
for (UndertowListener listener : listeners) {
size += aliases + listener.getSocketBinding().getClientMappings().size();
}
List<Server> servers = new ArrayList<>(size);
for (UndertowListener listener : listeners) {
SocketBinding binding = listener.getSocketBinding();
Set<String> virtualHosts = new TreeSet<>(host.getAllAliases());
// The name of the host is not a real virtual host (e.g. default-host)
virtualHosts.remove(host.getName());
InetAddress address = binding.getAddress();
// Omit wildcard addresses
if (!address.isAnyLocalAddress()) {
virtualHosts.add(address.getCanonicalHostName());
}
for (String virtualHost : virtualHosts) {
Server server = createServer(listener.getProtocol(), virtualHost, binding.getPort(), contextPath);
if (server != null) {
servers.add(server);
}
}
for (ClientMapping mapping : binding.getClientMappings()) {
Server server = createServer(listener.getProtocol(), mapping.getDestinationAddress(), mapping.getDestinationPort(), contextPath);
if (server != null) {
servers.add(server);
}
}
}
model.setServers(servers);
}
}
if (listeners.stream().map(UndertowListener::getProtocol).noneMatch(REQUISITE_LISTENERS::contains)) {
LOGGER.requiredListenersNotFound(host.getServer().getName(), REQUISITE_LISTENERS);
}
return model;
}
use of io.smallrye.openapi.runtime.io.Format in project wildfly by wildfly.
the class OpenAPIHttpHandler method parseFormatParameter.
private static Format parseFormatParameter(HttpServerExchange exchange) {
Deque<String> formatValues = exchange.getQueryParameters().get(FORMAT);
String formatValue = (formatValues != null) ? formatValues.peek() : null;
Format format = (formatValue != null) ? FORMATS.get(formatValue) : null;
// Default format is YAML
return (format != null) ? format : Format.YAML;
}
use of io.smallrye.openapi.runtime.io.Format in project wildfly by wildfly.
the class OpenAPIHttpHandler method handleRequest.
@Override
public void handleRequest(HttpServerExchange exchange) throws IOException {
HttpString requestMethod = exchange.getRequestMethod();
HeaderMap responseHeaders = exchange.getResponseHeaders();
// Add CORS response headers
responseHeaders.put(new HttpString("Access-Control-Allow-Origin"), "*");
responseHeaders.put(new HttpString("Access-Control-Allow-Credentials"), "true");
responseHeaders.put(new HttpString("Access-Control-Allow-Methods"), ALLOW_METHODS);
responseHeaders.put(new HttpString("Access-Control-Allow-Headers"), DEFAULT_ALLOW_HEADERS);
responseHeaders.put(new HttpString("Access-Control-Max-Age"), DEFAULT_MAX_AGE);
if (requestMethod.equals(Methods.GET) || requestMethod.equals(Methods.HEAD)) {
// Determine preferred media type
List<MediaType> preferredTypes = Collections.emptyList();
List<MediaType> types = parseAcceptedTypes(exchange);
for (MediaType type : types) {
List<MediaType> compatibleTypes = new ArrayList<>(ACCEPTED_TYPES.size());
for (MediaType acceptedType : ACCEPTED_TYPES.keySet()) {
if (type.isCompatible(acceptedType)) {
compatibleTypes.add(acceptedType);
}
}
if (!compatibleTypes.isEmpty()) {
preferredTypes = compatibleTypes;
break;
}
}
// Determine preferred charset
Charset charset = parseCharset(exchange);
if (preferredTypes.isEmpty() || (charset == null)) {
exchange.setStatusCode(StatusCodes.NOT_ACCEPTABLE);
return;
}
// Use format preferred by Accept header if unambiguous, otherwise determine format from query parameter
Format format = (preferredTypes.size() == 1) ? ACCEPTED_TYPES.get(preferredTypes.get(0)) : parseFormatParameter(exchange);
byte[] result = OpenApiSerializer.serialize(this.model, format).getBytes(charset);
responseHeaders.put(Headers.CONTENT_TYPE, format.getMimeType());
responseHeaders.put(Headers.CONTENT_LENGTH, result.length);
if (requestMethod.equals(Methods.GET)) {
exchange.getResponseSender().send(ByteBuffer.wrap(result));
}
} else if (requestMethod.equals(Methods.OPTIONS)) {
responseHeaders.put(Headers.ALLOW, ALLOW_METHODS);
} else {
exchange.setStatusCode(StatusCodes.METHOD_NOT_ALLOWED);
}
}
Aggregations