Search in sources :

Example 11 with Parameter

use of org.eclipse.microprofile.openapi.models.parameters.Parameter in project Payara by payara.

the class OperationImpl method merge.

public static void merge(Operation from, Operation to, boolean override, ApiContext context) {
    if (from == null) {
        return;
    }
    to.setSummary(mergeProperty(to.getSummary(), from.getSummary(), override));
    to.setDescription(mergeProperty(to.getDescription(), from.getDescription(), override));
    if (from.getExtensions() != null) {
        ExtensibleImpl.merge(from, to, override);
    }
    if (from.getExternalDocs() != null) {
        if (to.getExternalDocs() == null) {
            to.setExternalDocs(new ExternalDocumentationImpl());
        }
        ExternalDocumentationImpl.merge(from.getExternalDocs(), to.getExternalDocs(), override);
    }
    if (from.getParameters() != null) {
        for (Parameter parameter : from.getParameters()) {
            Parameter newParameter = new ParameterImpl();
            ParameterImpl.merge(parameter, newParameter, override, context);
        }
    }
    if (from.getRequestBody() != null) {
        if (to.getRequestBody() == null) {
            to.setRequestBody(new RequestBodyImpl());
        }
        RequestBodyImpl.merge(from.getRequestBody(), to.getRequestBody(), override, context);
    }
    if (from.getResponses() != null) {
        for (APIResponse response : from.getResponses().getAPIResponses().values()) {
            APIResponsesImpl.merge(response, to.getResponses(), override, context);
        }
    }
}
Also used : APIResponse(org.eclipse.microprofile.openapi.models.responses.APIResponse) ParameterImpl(fish.payara.microprofile.openapi.impl.model.parameters.ParameterImpl) Parameter(org.eclipse.microprofile.openapi.models.parameters.Parameter) RequestBodyImpl(fish.payara.microprofile.openapi.impl.model.parameters.RequestBodyImpl)

Example 12 with Parameter

use of org.eclipse.microprofile.openapi.models.parameters.Parameter in project Payara by payara.

the class ModelInvariantsTest method addKeyValueIgnoresNull.

@Test
public void addKeyValueIgnoresNull() {
    BiPredicate<Extensible<?>, String> hasExtension = (obj, key) -> obj.getExtensions().containsKey(key);
    assertAddIgnoresNull(new CallbackImpl(), Callback::addPathItem, Callback::hasPathItem);
    assertAddIgnoresNull(new CallbackImpl(), Callback::addExtension, hasExtension);
    assertAddIgnoresNull(new ExampleImpl(), Example::addExtension, hasExtension);
    assertAddIgnoresNull(new HeaderImpl(), Header::addExample, (obj, key) -> obj.getExamples().containsKey(key));
    assertAddIgnoresNull(new HeaderImpl(), Header::addExtension, hasExtension);
    assertAddIgnoresNull(new ContactImpl(), Contact::addExtension, hasExtension);
    assertAddIgnoresNull(new InfoImpl(), Info::addExtension, hasExtension);
    assertAddIgnoresNull(new LicenseImpl(), License::addExtension, hasExtension);
    assertAddIgnoresNull(new LinkImpl(), Link::addParameter, (obj, key) -> obj.getParameters().containsKey(key));
    assertAddIgnoresNull(new LinkImpl(), Link::addExtension, hasExtension);
    assertAddIgnoresNull(new ContentImpl(), Content::addMediaType, Content::hasMediaType);
    assertAddIgnoresNull(new DiscriminatorImpl(), Discriminator::addMapping, (obj, key) -> obj.getMapping().containsKey(key));
    assertAddIgnoresNull(new EncodingImpl(), Encoding::addHeader, (obj, key) -> obj.getHeaders().containsKey(key));
    assertAddIgnoresNull(new EncodingImpl(), Encoding::addExtension, hasExtension);
    assertAddIgnoresNull(new MediaTypeImpl(), MediaType::addEncoding, (obj, key) -> obj.getEncoding().containsKey(key));
    assertAddIgnoresNull(new MediaTypeImpl(), MediaType::addExample, (obj, key) -> obj.getExamples().containsKey(key));
    assertAddIgnoresNull(new MediaTypeImpl(), MediaType::addExtension, hasExtension);
    assertAddIgnoresNull(new SchemaImpl(), Schema::addProperty, (obj, key) -> obj.getProperties().containsKey(key));
    assertAddIgnoresNull(new SchemaImpl(), Schema::addExtension, hasExtension);
    assertAddIgnoresNull(new XMLImpl(), XML::addExtension, hasExtension);
    assertAddIgnoresNull(new ParameterImpl(), Parameter::addExample, (obj, key) -> obj.getExamples().containsKey(key));
    assertAddIgnoresNull(new ParameterImpl(), Parameter::addExtension, hasExtension);
    assertAddIgnoresNull(new RequestBodyImpl(), RequestBody::addExtension, hasExtension);
    assertAddIgnoresNull(new APIResponseImpl(), APIResponse::addHeader, (obj, key) -> obj.getHeaders().containsKey(key));
    assertAddIgnoresNull(new APIResponseImpl(), APIResponse::addLink, (obj, key) -> obj.getLinks().containsKey(key));
    assertAddIgnoresNull(new APIResponseImpl(), APIResponse::addExtension, hasExtension);
    assertAddIgnoresNull(new APIResponsesImpl(), APIResponses::addAPIResponse, APIResponses::hasAPIResponse);
    assertAddIgnoresNull(new APIResponsesImpl(), APIResponses::addExtension, hasExtension);
    assertAddIgnoresNull(new OAuthFlowImpl(), OAuthFlow::addExtension, hasExtension);
    assertAddIgnoresNull(new OAuthFlowsImpl(), OAuthFlows::addExtension, hasExtension);
    assertAddIgnoresNull(new SecuritySchemeImpl(), SecurityScheme::addExtension, hasExtension);
    assertAddIgnoresNull(new ServerImpl(), Server::addExtension, hasExtension);
    assertAddIgnoresNull(new ServerVariableImpl(), ServerVariable::addExtension, hasExtension);
    assertAddIgnoresNull(new TagImpl(), Tag::addExtension, hasExtension);
    assertAddIgnoresNull(new ComponentsImpl(), Components::addCallback, (obj, key) -> obj.getCallbacks().containsKey(key));
    assertAddIgnoresNull(new ComponentsImpl(), Components::addExample, (obj, key) -> obj.getExamples().containsKey(key));
    assertAddIgnoresNull(new ComponentsImpl(), Components::addHeader, (obj, key) -> obj.getHeaders().containsKey(key));
    assertAddIgnoresNull(new ComponentsImpl(), Components::addLink, (obj, key) -> obj.getLinks().containsKey(key));
    assertAddIgnoresNull(new ComponentsImpl(), Components::addParameter, (obj, key) -> obj.getParameters().containsKey(key));
    assertAddIgnoresNull(new ComponentsImpl(), Components::addRequestBody, (obj, key) -> obj.getRequestBodies().containsKey(key));
    assertAddIgnoresNull(new ComponentsImpl(), Components::addResponse, (obj, key) -> obj.getResponses().containsKey(key));
    assertAddIgnoresNull(new ComponentsImpl(), Components::addSchema, (obj, key) -> obj.getSchemas().containsKey(key));
    assertAddIgnoresNull(new ComponentsImpl(), Components::addSecurityScheme, (obj, key) -> obj.getSecuritySchemes().containsKey(key));
    assertAddIgnoresNull(new ComponentsImpl(), Components::addExtension, hasExtension);
    assertAddIgnoresNull(new ExternalDocumentationImpl(), ExternalDocumentation::addExtension, hasExtension);
    assertAddIgnoresNull(new OpenAPIImpl(), OpenAPI::addExtension, hasExtension);
    assertAddIgnoresNull(new OperationImpl(), Operation::addCallback, (obj, key) -> obj.getCallbacks().containsKey(key));
    assertAddIgnoresNull(new OperationImpl(), Operation::addExtension, hasExtension);
    assertAddIgnoresNull(new PathItemImpl(), PathItem::addExtension, hasExtension);
    assertAddIgnoresNull(new PathsImpl(), Paths::addPathItem, Paths::hasPathItem);
    assertAddIgnoresNull(new PathsImpl(), Paths::addExtension, hasExtension);
}
Also used : RequestBodyImpl(fish.payara.microprofile.openapi.impl.model.parameters.RequestBodyImpl) Components(org.eclipse.microprofile.openapi.models.Components) Discriminator(org.eclipse.microprofile.openapi.models.media.Discriminator) Info(org.eclipse.microprofile.openapi.models.info.Info) ExampleImpl(fish.payara.microprofile.openapi.impl.model.examples.ExampleImpl) EncodingImpl(fish.payara.microprofile.openapi.impl.model.media.EncodingImpl) HeaderImpl(fish.payara.microprofile.openapi.impl.model.headers.HeaderImpl) License(org.eclipse.microprofile.openapi.models.info.License) PathItem(org.eclipse.microprofile.openapi.models.PathItem) Tag(org.eclipse.microprofile.openapi.models.tags.Tag) OAuthFlowsImpl(fish.payara.microprofile.openapi.impl.model.security.OAuthFlowsImpl) Header(org.eclipse.microprofile.openapi.models.headers.Header) MediaTypeImpl(fish.payara.microprofile.openapi.impl.model.media.MediaTypeImpl) RequestBody(org.eclipse.microprofile.openapi.models.parameters.RequestBody) SecurityScheme(org.eclipse.microprofile.openapi.models.security.SecurityScheme) Contact(org.eclipse.microprofile.openapi.models.info.Contact) OAuthFlows(org.eclipse.microprofile.openapi.models.security.OAuthFlows) OpenAPI(org.eclipse.microprofile.openapi.models.OpenAPI) List(java.util.List) ServerImpl(fish.payara.microprofile.openapi.impl.model.servers.ServerImpl) TagImpl(fish.payara.microprofile.openapi.impl.model.tags.TagImpl) APIResponseImpl(fish.payara.microprofile.openapi.impl.model.responses.APIResponseImpl) ExternalDocumentation(org.eclipse.microprofile.openapi.models.ExternalDocumentation) Assert.assertFalse(org.junit.Assert.assertFalse) SchemaImpl(fish.payara.microprofile.openapi.impl.model.media.SchemaImpl) Server(org.eclipse.microprofile.openapi.models.servers.Server) LicenseImpl(fish.payara.microprofile.openapi.impl.model.info.LicenseImpl) ContentImpl(fish.payara.microprofile.openapi.impl.model.media.ContentImpl) ServerVariableImpl(fish.payara.microprofile.openapi.impl.model.servers.ServerVariableImpl) Example(org.eclipse.microprofile.openapi.models.examples.Example) SecuritySchemeImpl(fish.payara.microprofile.openapi.impl.model.security.SecuritySchemeImpl) SecurityRequirement(org.eclipse.microprofile.openapi.models.security.SecurityRequirement) Paths(org.eclipse.microprofile.openapi.models.Paths) APIResponse(org.eclipse.microprofile.openapi.models.responses.APIResponse) MediaType(org.eclipse.microprofile.openapi.models.media.MediaType) OAuthFlow(org.eclipse.microprofile.openapi.models.security.OAuthFlow) DiscriminatorImpl(fish.payara.microprofile.openapi.impl.model.media.DiscriminatorImpl) Encoding(org.eclipse.microprofile.openapi.models.media.Encoding) ServerVariable(org.eclipse.microprofile.openapi.models.servers.ServerVariable) LinkImpl(fish.payara.microprofile.openapi.impl.model.links.LinkImpl) SecurityRequirementImpl(fish.payara.microprofile.openapi.impl.model.security.SecurityRequirementImpl) Assert.assertSame(org.junit.Assert.assertSame) BiPredicate(java.util.function.BiPredicate) InfoImpl(fish.payara.microprofile.openapi.impl.model.info.InfoImpl) Operation(org.eclipse.microprofile.openapi.models.Operation) Schema(org.eclipse.microprofile.openapi.models.media.Schema) Callback(org.eclipse.microprofile.openapi.models.callbacks.Callback) Assert.assertNotNull(org.junit.Assert.assertNotNull) Content(org.eclipse.microprofile.openapi.models.media.Content) CallbackImpl(fish.payara.microprofile.openapi.impl.model.callbacks.CallbackImpl) APIResponsesImpl(fish.payara.microprofile.openapi.impl.model.responses.APIResponsesImpl) Assert.assertTrue(org.junit.Assert.assertTrue) Test(org.junit.Test) Link(org.eclipse.microprofile.openapi.models.links.Link) Parameter(org.eclipse.microprofile.openapi.models.parameters.Parameter) ParameterImpl(fish.payara.microprofile.openapi.impl.model.parameters.ParameterImpl) APIResponses(org.eclipse.microprofile.openapi.models.responses.APIResponses) OAuthFlowImpl(fish.payara.microprofile.openapi.impl.model.security.OAuthFlowImpl) ContactImpl(fish.payara.microprofile.openapi.impl.model.info.ContactImpl) XMLImpl(fish.payara.microprofile.openapi.impl.model.media.XMLImpl) Assert.assertEquals(org.junit.Assert.assertEquals) Extensible(org.eclipse.microprofile.openapi.models.Extensible) XML(org.eclipse.microprofile.openapi.models.media.XML) OAuthFlowsImpl(fish.payara.microprofile.openapi.impl.model.security.OAuthFlowsImpl) Server(org.eclipse.microprofile.openapi.models.servers.Server) Schema(org.eclipse.microprofile.openapi.models.media.Schema) SecuritySchemeImpl(fish.payara.microprofile.openapi.impl.model.security.SecuritySchemeImpl) License(org.eclipse.microprofile.openapi.models.info.License) ServerVariable(org.eclipse.microprofile.openapi.models.servers.ServerVariable) Components(org.eclipse.microprofile.openapi.models.Components) SchemaImpl(fish.payara.microprofile.openapi.impl.model.media.SchemaImpl) PathItem(org.eclipse.microprofile.openapi.models.PathItem) EncodingImpl(fish.payara.microprofile.openapi.impl.model.media.EncodingImpl) ExternalDocumentation(org.eclipse.microprofile.openapi.models.ExternalDocumentation) ContactImpl(fish.payara.microprofile.openapi.impl.model.info.ContactImpl) Example(org.eclipse.microprofile.openapi.models.examples.Example) MediaType(org.eclipse.microprofile.openapi.models.media.MediaType) ExampleImpl(fish.payara.microprofile.openapi.impl.model.examples.ExampleImpl) SecurityScheme(org.eclipse.microprofile.openapi.models.security.SecurityScheme) Encoding(org.eclipse.microprofile.openapi.models.media.Encoding) RequestBodyImpl(fish.payara.microprofile.openapi.impl.model.parameters.RequestBodyImpl) ContentImpl(fish.payara.microprofile.openapi.impl.model.media.ContentImpl) Header(org.eclipse.microprofile.openapi.models.headers.Header) ParameterImpl(fish.payara.microprofile.openapi.impl.model.parameters.ParameterImpl) OAuthFlow(org.eclipse.microprofile.openapi.models.security.OAuthFlow) Content(org.eclipse.microprofile.openapi.models.media.Content) MediaTypeImpl(fish.payara.microprofile.openapi.impl.model.media.MediaTypeImpl) OpenAPI(org.eclipse.microprofile.openapi.models.OpenAPI) Link(org.eclipse.microprofile.openapi.models.links.Link) APIResponse(org.eclipse.microprofile.openapi.models.responses.APIResponse) CallbackImpl(fish.payara.microprofile.openapi.impl.model.callbacks.CallbackImpl) HeaderImpl(fish.payara.microprofile.openapi.impl.model.headers.HeaderImpl) APIResponsesImpl(fish.payara.microprofile.openapi.impl.model.responses.APIResponsesImpl) Operation(org.eclipse.microprofile.openapi.models.Operation) LicenseImpl(fish.payara.microprofile.openapi.impl.model.info.LicenseImpl) OAuthFlowImpl(fish.payara.microprofile.openapi.impl.model.security.OAuthFlowImpl) ServerImpl(fish.payara.microprofile.openapi.impl.model.servers.ServerImpl) LinkImpl(fish.payara.microprofile.openapi.impl.model.links.LinkImpl) APIResponses(org.eclipse.microprofile.openapi.models.responses.APIResponses) Paths(org.eclipse.microprofile.openapi.models.Paths) RequestBody(org.eclipse.microprofile.openapi.models.parameters.RequestBody) DiscriminatorImpl(fish.payara.microprofile.openapi.impl.model.media.DiscriminatorImpl) Extensible(org.eclipse.microprofile.openapi.models.Extensible) OAuthFlows(org.eclipse.microprofile.openapi.models.security.OAuthFlows) TagImpl(fish.payara.microprofile.openapi.impl.model.tags.TagImpl) APIResponseImpl(fish.payara.microprofile.openapi.impl.model.responses.APIResponseImpl) Info(org.eclipse.microprofile.openapi.models.info.Info) XMLImpl(fish.payara.microprofile.openapi.impl.model.media.XMLImpl) Discriminator(org.eclipse.microprofile.openapi.models.media.Discriminator) Contact(org.eclipse.microprofile.openapi.models.info.Contact) ServerVariableImpl(fish.payara.microprofile.openapi.impl.model.servers.ServerVariableImpl) Callback(org.eclipse.microprofile.openapi.models.callbacks.Callback) XML(org.eclipse.microprofile.openapi.models.media.XML) Parameter(org.eclipse.microprofile.openapi.models.parameters.Parameter) Tag(org.eclipse.microprofile.openapi.models.tags.Tag) InfoImpl(fish.payara.microprofile.openapi.impl.model.info.InfoImpl) Test(org.junit.Test)

Example 13 with Parameter

use of org.eclipse.microprofile.openapi.models.parameters.Parameter in project wildfly-swarm by wildfly-swarm.

the class OpenApiAnnotationScanner method processJaxRsMethod.

/**
 * Process a single JAX-RS method to produce an OpenAPI Operation.
 * @param openApi
 * @param resource
 * @param method
 * @param methodAnno
 * @param methodType
 * @param resourceTags
 */
private void processJaxRsMethod(OpenAPIImpl openApi, ClassInfo resource, MethodInfo method, AnnotationInstance methodAnno, HttpMethod methodType, Set<String> resourceTags) {
    LOG.debugf("Processing jax-rs method: {0}", method.toString());
    // Figure out the path for the operation.  This is a combination of the App, Resource, and Method @Path annotations
    String path;
    if (method.hasAnnotation(OpenApiConstants.DOTNAME_PATH)) {
        AnnotationInstance pathAnno = method.annotation(OpenApiConstants.DOTNAME_PATH);
        String methodPath = pathAnno.value().asString();
        path = makePath(this.currentAppPath, this.currentResourcePath, methodPath);
    } else {
        path = makePath(this.currentAppPath, this.currentResourcePath);
    }
    // Get or create a PathItem to hold the operation
    PathItem pathItem = ModelUtil.paths(openApi).get(path);
    if (pathItem == null) {
        pathItem = new PathItemImpl();
        ModelUtil.paths(openApi).addPathItem(path, pathItem);
    }
    // Figure out the current @Produces and @Consumes (if any)
    currentConsumes = null;
    currentProduces = null;
    AnnotationInstance consumesAnno = method.annotation(OpenApiConstants.DOTNAME_CONSUMES);
    if (consumesAnno == null) {
        consumesAnno = JandexUtil.getClassAnnotation(method.declaringClass(), OpenApiConstants.DOTNAME_CONSUMES);
    }
    AnnotationInstance producesAnno = method.annotation(OpenApiConstants.DOTNAME_PRODUCES);
    if (producesAnno == null) {
        producesAnno = JandexUtil.getClassAnnotation(method.declaringClass(), OpenApiConstants.DOTNAME_PRODUCES);
    }
    if (consumesAnno != null) {
        AnnotationValue annotationValue = consumesAnno.value();
        if (annotationValue != null) {
            currentConsumes = annotationValue.asStringArray();
        } else {
            currentConsumes = OpenApiConstants.DEFAULT_CONSUMES;
        }
    }
    if (producesAnno != null) {
        AnnotationValue annotationValue = producesAnno.value();
        if (annotationValue != null) {
            currentProduces = annotationValue.asStringArray();
        } else {
            currentProduces = OpenApiConstants.DEFAULT_PRODUCES;
        }
    }
    Operation operation = new OperationImpl();
    // ///////////////////////////////////////
    if (method.hasAnnotation(OpenApiConstants.DOTNAME_OPERATION)) {
        AnnotationInstance operationAnno = method.annotation(OpenApiConstants.DOTNAME_OPERATION);
        // If the operation is marked as hidden, just bail here because we don't want it as part of the model.
        if (operationAnno.value(OpenApiConstants.PROP_HIDDEN) != null && operationAnno.value(OpenApiConstants.PROP_HIDDEN).asBoolean()) {
            return;
        }
        // Otherwise, set various bits of meta-data from the values in the @Operation annotation
        operation.setSummary(JandexUtil.stringValue(operationAnno, OpenApiConstants.PROP_SUMMARY));
        operation.setDescription(JandexUtil.stringValue(operationAnno, OpenApiConstants.PROP_DESCRIPTION));
        operation.setOperationId(JandexUtil.stringValue(operationAnno, OpenApiConstants.PROP_OPERATION_ID));
        operation.setDeprecated(JandexUtil.booleanValue(operationAnno, OpenApiConstants.PROP_DEPRECATED));
    }
    // Process tags - @Tag and @Tags annotations combines with the resource tags we've already found (passed in)
    // ///////////////////////////////////////
    boolean hasOpTags = false;
    Set<String> tags = new HashSet<>();
    if (method.hasAnnotation(OpenApiConstants.DOTNAME_TAG)) {
        hasOpTags = true;
        AnnotationInstance tagAnno = method.annotation(OpenApiConstants.DOTNAME_TAG);
        if (JandexUtil.isRef(tagAnno)) {
            String tagRef = JandexUtil.stringValue(tagAnno, OpenApiConstants.PROP_REF);
            tags.add(tagRef);
        } else if (JandexUtil.isEmpty(tagAnno)) {
        // Nothing to do here.  The @Tag() was empty.
        } else {
            Tag tag = readTag(tagAnno);
            if (tag.getName() != null) {
                openApi.addTag(tag);
                tags.add(tag.getName());
            }
        }
    }
    if (method.hasAnnotation(OpenApiConstants.DOTNAME_TAGS)) {
        hasOpTags = true;
        AnnotationInstance tagsAnno = method.annotation(OpenApiConstants.DOTNAME_TAGS);
        AnnotationValue tagsArrayVal = tagsAnno.value();
        if (tagsArrayVal != null) {
            AnnotationInstance[] tagsArray = tagsArrayVal.asNestedArray();
            for (AnnotationInstance tagAnno : tagsArray) {
                if (JandexUtil.isRef(tagAnno)) {
                    String tagRef = JandexUtil.stringValue(tagAnno, OpenApiConstants.PROP_REF);
                    tags.add(tagRef);
                } else {
                    Tag tag = readTag(tagAnno);
                    if (tag.getName() != null) {
                        openApi.addTag(tag);
                        tags.add(tag.getName());
                    }
                }
            }
        }
        List<String> listValue = JandexUtil.stringListValue(tagsAnno, OpenApiConstants.PROP_REFS);
        if (listValue != null) {
            tags.addAll(listValue);
        }
    }
    if (!hasOpTags) {
        tags.addAll(resourceTags);
    }
    if (!tags.isEmpty()) {
        operation.setTags(new ArrayList<>(tags));
    }
    // Process @Parameter annotations
    // ///////////////////////////////////////
    List<AnnotationInstance> parameterAnnotations = JandexUtil.getRepeatableAnnotation(method, OpenApiConstants.DOTNAME_PARAMETER, OpenApiConstants.DOTNAME_PARAMETERS);
    for (AnnotationInstance annotation : parameterAnnotations) {
        Parameter parameter = readParameter(annotation);
        if (parameter == null) {
            // Param was hidden
            continue;
        }
        AnnotationTarget target = annotation.target();
        // If the target is METHOD_PARAMETER, then the @Parameter is on one of the method's arguments (THIS ONE WE CARE ABOUT)
        if (target != null && target.kind() == Kind.METHOD_PARAMETER) {
            In in = parameterIn(target.asMethodParameter());
            parameter.setIn(in);
            // if the Parameter model we read does *NOT* have a Schema at this point, then create one from the method argument's type
            if (!ModelUtil.parameterHasSchema(parameter)) {
                Type paramType = JandexUtil.getMethodParameterType(method, target.asMethodParameter().position());
                Schema schema = typeToSchema(paramType);
                ModelUtil.setParameterSchema(parameter, schema);
            }
        } else {
        // TODO if the @Parameter is on the method, we could perhaps find the one it refers to by name
        // and use its type to create a Schema (if missing)
        }
        operation.addParameter(parameter);
    }
    // Now process any jax-rs parameters that were NOT annotated with @Parameter (do not yet exist in the model)
    List<Type> parameters = method.parameters();
    for (int idx = 0; idx < parameters.size(); idx++) {
        JaxRsParameterInfo paramInfo = JandexUtil.getMethodParameterJaxRsInfo(method, idx);
        if (paramInfo != null && !ModelUtil.operationHasParameter(operation, paramInfo.name)) {
            Type paramType = parameters.get(idx);
            Parameter parameter = new ParameterImpl();
            parameter.setName(paramInfo.name);
            parameter.setIn(paramInfo.in);
            parameter.setRequired(true);
            Schema schema = typeToSchema(paramType);
            parameter.setSchema(schema);
            operation.addParameter(parameter);
        }
    }
    // TODO @Parameter can be located on a field - what does that mean?
    // TODO need to handle the case where we have @BeanParam annotations
    // Process any @RequestBody annotation
    // ///////////////////////////////////////
    // note: the @RequestBody annotation can be found on a method argument *or* on the method
    List<AnnotationInstance> requestBodyAnnotations = JandexUtil.getRepeatableAnnotation(method, OpenApiConstants.DOTNAME_REQUEST_BODY, null);
    for (AnnotationInstance annotation : requestBodyAnnotations) {
        RequestBody requestBody = readRequestBody(annotation);
        // TODO if the method argument type is Request, don't generate a Schema!
        if (!ModelUtil.requestBodyHasSchema(requestBody)) {
            Type requestBodyType = null;
            if (annotation.target().kind() == AnnotationTarget.Kind.METHOD_PARAMETER) {
                requestBodyType = JandexUtil.getMethodParameterType(method, annotation.target().asMethodParameter().position());
            } else if (annotation.target().kind() == AnnotationTarget.Kind.METHOD) {
                requestBodyType = JandexUtil.getRequestBodyParameterClassType(method);
            }
            if (requestBodyType != null) {
                Schema schema = typeToSchema(requestBodyType);
                ModelUtil.setRequestBodySchema(requestBody, schema, currentConsumes);
            }
        }
        operation.setRequestBody(requestBody);
    }
    // method declares that it @Consumes data
    if (operation.getRequestBody() == null && currentConsumes != null) {
        Type requestBodyType = JandexUtil.getRequestBodyParameterClassType(method);
        if (requestBodyType != null) {
            Schema schema = typeToSchema(requestBodyType);
            if (schema != null) {
                RequestBody requestBody = new RequestBodyImpl();
                ModelUtil.setRequestBodySchema(requestBody, schema, currentConsumes);
                operation.setRequestBody(requestBody);
            }
        }
    }
    // Process @APIResponse annotations
    // ///////////////////////////////////////
    List<AnnotationInstance> apiResponseAnnotations = JandexUtil.getRepeatableAnnotation(method, OpenApiConstants.DOTNAME_API_RESPONSE, OpenApiConstants.DOTNAME_API_RESPONSES);
    for (AnnotationInstance annotation : apiResponseAnnotations) {
        String responseCode = JandexUtil.stringValue(annotation, OpenApiConstants.PROP_RESPONSE_CODE);
        if (responseCode == null) {
            responseCode = APIResponses.DEFAULT;
        }
        APIResponse response = readResponse(annotation);
        APIResponses responses = ModelUtil.responses(operation);
        responses.addApiResponse(responseCode, response);
    }
    // If there are no responses from annotations, try to create a response from the method return value.
    if (operation.getResponses() == null || operation.getResponses().isEmpty()) {
        createResponseFromJaxRsMethod(method, operation);
    }
    // Process @SecurityRequirement annotations
    // /////////////////////////////////////////
    List<AnnotationInstance> securityRequirementAnnotations = JandexUtil.getRepeatableAnnotation(method, OpenApiConstants.DOTNAME_SECURITY_REQUIREMENT, OpenApiConstants.DOTNAME_SECURITY_REQUIREMENTS);
    securityRequirementAnnotations.addAll(JandexUtil.getRepeatableAnnotation(resource, OpenApiConstants.DOTNAME_SECURITY_REQUIREMENT, OpenApiConstants.DOTNAME_SECURITY_REQUIREMENTS));
    for (AnnotationInstance annotation : securityRequirementAnnotations) {
        SecurityRequirement requirement = readSecurityRequirement(annotation);
        if (requirement != null) {
            operation.addSecurityRequirement(requirement);
        }
    }
    // Process @Callback annotations
    // ///////////////////////////////////////
    List<AnnotationInstance> callbackAnnotations = JandexUtil.getRepeatableAnnotation(method, OpenApiConstants.DOTNAME_CALLBACK, OpenApiConstants.DOTNAME_CALLBACKS);
    Map<String, Callback> callbacks = new LinkedHashMap<>();
    for (AnnotationInstance annotation : callbackAnnotations) {
        String name = JandexUtil.stringValue(annotation, OpenApiConstants.PROP_NAME);
        if (name == null && JandexUtil.isRef(annotation)) {
            name = JandexUtil.nameFromRef(annotation);
        }
        if (name != null) {
            callbacks.put(name, readCallback(annotation));
        }
        if (!callbacks.isEmpty()) {
            operation.setCallbacks(callbacks);
        }
    }
    // Process @Server annotations
    // /////////////////////////////////
    List<AnnotationInstance> serverAnnotations = JandexUtil.getRepeatableAnnotation(method, OpenApiConstants.DOTNAME_SERVER, OpenApiConstants.DOTNAME_SERVERS);
    if (serverAnnotations.isEmpty()) {
        serverAnnotations.addAll(JandexUtil.getRepeatableAnnotation(method.declaringClass(), OpenApiConstants.DOTNAME_SERVER, OpenApiConstants.DOTNAME_SERVERS));
    }
    for (AnnotationInstance annotation : serverAnnotations) {
        Server server = readServer(annotation);
        operation.addServer(server);
    }
    // /////////////////////////////////////////
    switch(methodType) {
        case DELETE:
            pathItem.setDELETE(operation);
            break;
        case GET:
            pathItem.setGET(operation);
            break;
        case HEAD:
            pathItem.setHEAD(operation);
            break;
        case OPTIONS:
            pathItem.setOPTIONS(operation);
            break;
        case PATCH:
            pathItem.setPATCH(operation);
            break;
        case POST:
            pathItem.setPOST(operation);
            break;
        case PUT:
            pathItem.setPUT(operation);
            break;
        case TRACE:
            pathItem.setTRACE(operation);
            break;
        default:
            break;
    }
}
Also used : APIResponse(org.eclipse.microprofile.openapi.models.responses.APIResponse) Server(org.eclipse.microprofile.openapi.models.servers.Server) In(org.eclipse.microprofile.openapi.models.parameters.Parameter.In) Schema(org.eclipse.microprofile.openapi.models.media.Schema) Operation(org.eclipse.microprofile.openapi.models.Operation) LinkedHashMap(java.util.LinkedHashMap) PathItem(org.eclipse.microprofile.openapi.models.PathItem) OperationImpl(org.wildfly.swarm.microprofile.openapi.api.models.OperationImpl) APIResponses(org.eclipse.microprofile.openapi.models.responses.APIResponses) HashSet(java.util.HashSet) RequestBody(org.eclipse.microprofile.openapi.models.parameters.RequestBody) AnnotationTarget(org.jboss.jandex.AnnotationTarget) RequestBodyImpl(org.wildfly.swarm.microprofile.openapi.api.models.parameters.RequestBodyImpl) ClassType(org.jboss.jandex.ClassType) RefType(org.wildfly.swarm.microprofile.openapi.runtime.util.JandexUtil.RefType) MediaType(org.eclipse.microprofile.openapi.models.media.MediaType) Type(org.jboss.jandex.Type) Callback(org.eclipse.microprofile.openapi.models.callbacks.Callback) ParameterImpl(org.wildfly.swarm.microprofile.openapi.api.models.parameters.ParameterImpl) AnnotationValue(org.jboss.jandex.AnnotationValue) Parameter(org.eclipse.microprofile.openapi.models.parameters.Parameter) Tag(org.eclipse.microprofile.openapi.models.tags.Tag) JaxRsParameterInfo(org.wildfly.swarm.microprofile.openapi.runtime.util.JandexUtil.JaxRsParameterInfo) PathItemImpl(org.wildfly.swarm.microprofile.openapi.api.models.PathItemImpl) AnnotationInstance(org.jboss.jandex.AnnotationInstance) SecurityRequirement(org.eclipse.microprofile.openapi.models.security.SecurityRequirement)

Example 14 with Parameter

use of org.eclipse.microprofile.openapi.models.parameters.Parameter in project wildfly-swarm by wildfly-swarm.

the class OpenApiAnnotationScanner method readCallbackOperationParameters.

/**
 * Reads an array of Parameter annotations into a list.
 * @param value
 */
private List<Parameter> readCallbackOperationParameters(AnnotationValue value) {
    if (value == null) {
        return null;
    }
    LOG.debug("Processing a list of @Parameter annotations.");
    List<Parameter> parameters = new ArrayList<>();
    AnnotationInstance[] nestedArray = value.asNestedArray();
    for (AnnotationInstance nested : nestedArray) {
        parameters.add(readParameter(nested));
    }
    return parameters;
}
Also used : ArrayList(java.util.ArrayList) Parameter(org.eclipse.microprofile.openapi.models.parameters.Parameter) AnnotationInstance(org.jboss.jandex.AnnotationInstance)

Example 15 with Parameter

use of org.eclipse.microprofile.openapi.models.parameters.Parameter in project wildfly-swarm by wildfly-swarm.

the class OpenApiAnnotationScanner method readParameters.

/**
 * Reads a map of Parameter annotations.
 * @param value
 */
private Map<String, Parameter> readParameters(AnnotationValue value) {
    if (value == null) {
        return null;
    }
    LOG.debug("Processing a map of @Parameter annotations.");
    Map<String, Parameter> map = new LinkedHashMap<>();
    AnnotationInstance[] nestedArray = value.asNestedArray();
    for (AnnotationInstance nested : nestedArray) {
        String name = JandexUtil.stringValue(nested, OpenApiConstants.PROP_NAME);
        if (name == null && JandexUtil.isRef(nested)) {
            name = JandexUtil.nameFromRef(nested);
        }
        if (name != null) {
            Parameter parameter = readParameter(nested);
            if (parameter != null) {
                map.put(name, parameter);
            }
        }
    }
    return map;
}
Also used : Parameter(org.eclipse.microprofile.openapi.models.parameters.Parameter) AnnotationInstance(org.jboss.jandex.AnnotationInstance) LinkedHashMap(java.util.LinkedHashMap)

Aggregations

Parameter (org.eclipse.microprofile.openapi.models.parameters.Parameter)19 SchemaImpl (fish.payara.microprofile.openapi.impl.model.media.SchemaImpl)7 ParameterImpl (fish.payara.microprofile.openapi.impl.model.parameters.ParameterImpl)5 RequestBodyImpl (fish.payara.microprofile.openapi.impl.model.parameters.RequestBodyImpl)5 Operation (org.eclipse.microprofile.openapi.models.Operation)5 MediaType (org.eclipse.microprofile.openapi.models.media.MediaType)5 Schema (org.eclipse.microprofile.openapi.models.media.Schema)5 APIResponse (org.eclipse.microprofile.openapi.models.responses.APIResponse)5 ArrayList (java.util.ArrayList)4 Callback (org.eclipse.microprofile.openapi.models.callbacks.Callback)4 RequestBody (org.eclipse.microprofile.openapi.models.parameters.RequestBody)4 CallbackImpl (fish.payara.microprofile.openapi.impl.model.callbacks.CallbackImpl)3 APIResponseImpl (fish.payara.microprofile.openapi.impl.model.responses.APIResponseImpl)3 SecuritySchemeImpl (fish.payara.microprofile.openapi.impl.model.security.SecuritySchemeImpl)3 LinkedHashMap (java.util.LinkedHashMap)3 PathItem (org.eclipse.microprofile.openapi.models.PathItem)3 In (org.eclipse.microprofile.openapi.models.parameters.Parameter.In)3 APIResponses (org.eclipse.microprofile.openapi.models.responses.APIResponses)3 SecurityRequirement (org.eclipse.microprofile.openapi.models.security.SecurityRequirement)3 SecurityScheme (org.eclipse.microprofile.openapi.models.security.SecurityScheme)3