// Path: proteus-core/src/main/java/io/sinistral/proteus/server/exceptions/ServerException.java
// public class ServerException extends RuntimeException
// {
//     /**
//      *
//      */
//     private static final long serialVersionUID = 8360356916374374408L;
// 
//     private Integer status = Status.BAD_REQUEST.getStatusCode();
// 
//     public ServerException(int status)
//     {
//         super();
// 
//         this.status = status;
//     }
// 
//     public ServerException(Status status)
//     {
//         super();
// 
//         this.status = status.getStatusCode();
//     }
// 
//     /**
//      * @param message
//      */
//     public ServerException(String message, int status)
//     {
//         super(message);
// 
//         this.status = status;
//     }
// 
//     /**
//      * @param message
//      */
//     public ServerException(String message, Status status)
//     {
//         super(message);
// 
//         this.status = status.getStatusCode();
//     }
// 
//     /**
//      * @param cause
//      */
//     public ServerException(Throwable cause, int status)
//     {
//         super(cause);
// 
//         this.status = status;
//     }
// 
//     /**
//      * @param cause
//      */
//     public ServerException(Throwable cause, Status status)
//     {
//         super(cause);
// 
//         this.status = status.getStatusCode();
//     }
// 
//     public ServerException(String message, Throwable cause, int status)
//     {
//         super(message, cause);
// 
//         this.status = status;
//     }
// 
//     public ServerException(String message, Throwable cause, Status status)
//     {
//         super(message, cause);
// 
//         this.status = status.getStatusCode();
//     }
// 
//     /**
//      * @return the status
//      */
//     public Integer getStatus()
//     {
//         return status;
//     }
// 
//     /**
//      * @param status the status to set
//      */
//     public void setStatus(Integer status)
//     {
//         this.status = status;
//     }
// }


import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.inject.name.Named;
import io.sinistral.proteus.server.exceptions.ServerException;
import io.undertow.server.HandlerWrapper;
import io.undertow.server.HttpHandler;
import io.undertow.util.AttachmentKey;
import io.undertow.util.HttpString;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ws.rs.core.Response;
import java.util.Optional;
package io.sinistral.proteus.openapi.wrappers;



@Singleton
public class HeaderApiKeyWrapper implements HandlerWrapper
{
    private static final Logger logger = LoggerFactory.getLogger(HeaderApiKeyWrapper.class.getName());

    public static final AttachmentKey<Throwable> THROWABLE = AttachmentKey.create(Throwable.class);

    @Inject
    @Named("openapi.securitySchemes.ApiKeyAuth.name")
    protected static String AUTH_KEY_NAME;

    @Inject(optional = true)
    @Named("security.apiKey")
    protected static String API_KEY;

    private final HttpString API_KEY_HEADER;

    public HeaderApiKeyWrapper()
    {
        API_KEY_HEADER = new HttpString(AUTH_KEY_NAME);
    }

    @Override
    public HttpHandler wrap(HttpHandler handler)
    {
        return exchange -> {

            if(API_KEY == null)
            {
                handler.handleRequest(exchange);
                return;
            }

            Optional<String> keyValue = Optional.ofNullable(exchange.getRequestHeaders().getFirst(API_KEY_HEADER));

            if(!keyValue.isPresent() || !keyValue.get().equals(API_KEY))
            {

                logger.error("Missing security credentials");
// Path: proteus-core/src/main/java/io/sinistral/proteus/server/exceptions/ServerException.java
// public class ServerException extends RuntimeException
// {
//     /**
//      *
//      */
//     private static final long serialVersionUID = 8360356916374374408L;
// 
//     private Integer status = Status.BAD_REQUEST.getStatusCode();
// 
//     public ServerException(int status)
//     {
//         super();
// 
//         this.status = status;
//     }
// 
//     public ServerException(Status status)
//     {
//         super();
// 
//         this.status = status.getStatusCode();
//     }
// 
//     /**
//      * @param message
//      */
//     public ServerException(String message, int status)
//     {
//         super(message);
// 
//         this.status = status;
//     }
// 
//     /**
//      * @param message
//      */
//     public ServerException(String message, Status status)
//     {
//         super(message);
// 
//         this.status = status.getStatusCode();
//     }
// 
//     /**
//      * @param cause
//      */
//     public ServerException(Throwable cause, int status)
//     {
//         super(cause);
// 
//         this.status = status;
//     }
// 
//     /**
//      * @param cause
//      */
//     public ServerException(Throwable cause, Status status)
//     {
//         super(cause);
// 
//         this.status = status.getStatusCode();
//     }
// 
//     public ServerException(String message, Throwable cause, int status)
//     {
//         super(message, cause);
// 
//         this.status = status;
//     }
// 
//     public ServerException(String message, Throwable cause, Status status)
//     {
//         super(message, cause);
// 
//         this.status = status.getStatusCode();
//     }
// 
//     /**
//      * @return the status
//      */
//     public Integer getStatus()
//     {
//         return status;
//     }
// 
//     /**
//      * @param status the status to set
//      */
//     public void setStatus(Integer status)
//     {
//         this.status = status;
//     }
// }


// Path: proteus-openapi/src/main/java/io/sinistral/proteus/openapi/wrappers/HeaderApiKeyWrapper.java
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.inject.name.Named;
import io.sinistral.proteus.server.exceptions.ServerException;
import io.undertow.server.HandlerWrapper;
import io.undertow.server.HttpHandler;
import io.undertow.util.AttachmentKey;
import io.undertow.util.HttpString;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ws.rs.core.Response;
import java.util.Optional;

package io.sinistral.proteus.openapi.wrappers;



@Singleton
public class HeaderApiKeyWrapper implements HandlerWrapper
{
    private static final Logger logger = LoggerFactory.getLogger(HeaderApiKeyWrapper.class.getName());

    public static final AttachmentKey<Throwable> THROWABLE = AttachmentKey.create(Throwable.class);

    @Inject
    @Named("openapi.securitySchemes.ApiKeyAuth.name")
    protected static String AUTH_KEY_NAME;

    @Inject(optional = true)
    @Named("security.apiKey")
    protected static String API_KEY;

    private final HttpString API_KEY_HEADER;

    public HeaderApiKeyWrapper()
    {
        API_KEY_HEADER = new HttpString(AUTH_KEY_NAME);
    }

    @Override
    public HttpHandler wrap(HttpHandler handler)
    {
        return exchange -> {

            if(API_KEY == null)
            {
                handler.handleRequest(exchange);
                return;
            }

            Optional<String> keyValue = Optional.ofNullable(exchange.getRequestHeaders().getFirst(API_KEY_HEADER));

            if(!keyValue.isPresent() || !keyValue.get().equals(API_KEY))
            {

                logger.error("Missing security credentials");
                exchange.putAttachment(THROWABLE, new ServerException("Unauthorized access", Response.Status.UNAUTHORIZED));