InjectionChecker.java

/*
 * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package org.glassfish.jersey.tests.cdi.inject;


import org.glassfish.jersey.internal.PropertiesDelegate;
import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.servlet.WebConfig;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ResourceContext;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Configuration;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.ParamConverterProvider;
import javax.ws.rs.ext.Providers;
import java.lang.annotation.Annotation;
import java.util.Iterator;

class InjectionChecker {
    static final String APPLICATION_PROPERTY = "ApplicationProperty";
    static final String HEADER = "HttpHeader";
    static final String ROOT = "resource";

    static boolean checkApplication(Application application, StringBuilder sb) {
        if (application == null) {
            sb.append("Application is null.");
            return false;
        }
        if (!application.getProperties().containsKey(APPLICATION_PROPERTY)) {
            sb.append("Application does not contain expected key.");
            return false;
        }
        if (!APPLICATION_PROPERTY.equals(application.getProperties().get(APPLICATION_PROPERTY))) {
            sb.append("Application does not contain expected value.");
            return false;
        }
        return true;
    }

    static boolean checkConfiguration(Configuration configuration, StringBuilder sb) {
        if (configuration == null) {
            sb.append("Configuration is null.");
            return false;
        }
        if (!configuration.getProperties().containsKey(APPLICATION_PROPERTY)) {
            sb.append("Configuration does not contain expected key.");
            return false;
        }
        if (!APPLICATION_PROPERTY.equals(configuration.getProperties().get(APPLICATION_PROPERTY))) {
            sb.append("Configuration does not contain expected value.");
            return false;
        }
        return true;
    }

    static boolean checkContainerRequestContext(ContainerRequestContext containerRequestContext, StringBuilder sb) {
        if (containerRequestContext == null) {
            sb.append("ContainerRequestContext is null.");
            return false;
        }

        return checkRequest(containerRequestContext.getRequest(), sb) && checkUriInfo(containerRequestContext.getUriInfo(), sb);
    }

    static boolean checkHttpHeaders(HttpHeaders headers, StringBuilder sb) {
        if (headers == null) {
            sb.append("HttpHeaders is null.");
            return false;
        }
        if (headers.getHeaderString(HEADER) == null) {
            sb.append("HttpHeaders does not contain expected header.");
            return false;
        }
        if (!HEADER.equals(headers.getHeaderString(HEADER))) {
            sb.append("HttpHeaders does not contain expected header value.");
            return false;
        }
        return true;
    }

    static boolean checkParamConverterProvider(ParamConverterProvider provider, StringBuilder sb) {
        if (provider == null) {
            sb.append("ParamConverterProvider is null.");
            return false;
        }
        return true;
    }

    static boolean checkPropertiesDelegate(PropertiesDelegate propertiesDelegate, StringBuilder sb) {
        if (propertiesDelegate == null) {
            sb.append("PropertiesDelegate is null.");
            return false;
        }
        if (null == propertiesDelegate.getProperty(APPLICATION_PROPERTY)) {
            sb.append("PropertiesDelegate does not contain expected key.");
            return false;
        }
        return true;
    }

    static boolean checkProviders(Providers providers, StringBuilder sb) {
        if (providers == null) {
            sb.append("Providers is null.");
            return false;
        }
        MessageBodyWriter<String> mbw =
                providers.getMessageBodyWriter(String.class, String.class, new Annotation[]{}, MediaType.TEXT_PLAIN_TYPE);
        if (mbw == null) {
            sb.append("String MessageBodyWriter is null.");
            return false;
        }
        return true;
    }

    static boolean checkRequest(Request request, StringBuilder sb) {
        if (request == null) {
            sb.append("Request is null.");
            return false;
        }
        final String method = request.getMethod();
        if (method == null) {
            sb.append("Request did not get a method.");
            return false;
        }
        if (!HttpMethod.GET.equals(method)) {
            sb.append("Request did not correct method, but ").append(method).append(" .");
            return false;
        }
        return true;
    }

    static boolean checkResourceContext(ResourceContext context, StringBuilder sb) {
        if (context == null) {
            sb.append("ResourceContext is null.");
            return false;
        }
        ScopedResource resource = context.getResource(ScopedResource.class);
        if (resource == null) {
            sb.append("ResourceContext did not get the resource.");
            return false;
        }
        return true;
    }

    static boolean checkResourceInfo(ResourceInfo info, StringBuilder sb) {
        if (info == null) {
            sb.append("ResourceInfo is null.");
            return false;
        }
        final Class<?> resourceClass = info.getResourceClass();
        if (resourceClass == null) {
            sb.append("ResourceInfo did not get the resource.");
            return false;
        }
        if (!resourceClass.getSimpleName().endsWith("ScopedResource")) {
            sb.append("ResourceInfo did not get the proper resource.");
            return false;
        }
        return true;
    }

    static boolean checkSecurityContext(SecurityContext context, StringBuilder sb) {
        if (context == null) {
            sb.append("SecurityContext is null.");
            return false;
        }
        if (context.isSecure()) {
            sb.append("SecurityContext returned unexpected security.");
            return false;
        }
        return true;
    }

    static boolean checkUriInfo(UriInfo info, StringBuilder sb) {
        if (info == null) {
            sb.append("UriInfo is null.");
            return false;
        }
        if (!info.getPath().startsWith(ROOT)) {
            sb.append("UriInfo does not start with expected ").append(ROOT)
                    .append(" but it is ").append(info.getPath()).append(".");
        }
        return true;
    }

    static boolean checkWebConfig(WebConfig config, StringBuilder sb) {
        if (config == null) {
            sb.append("WebConfig is null.");
            return false;
        }
        if (config.getServletContext() == null) {
            sb.append("WebConfig#getServletContext() is null.");
            return false;
        }
        if (!checkServletContext(config.getServletContext(), sb)) {
            return false;
        }
        if (!checkServletConfig(config.getServletConfig(), sb)) {
            return false;
        }
        return true;
    }

    static boolean checkServletContext(ServletContext context, StringBuilder sb) {
        if (context == null) {
            sb.append("ServletContext is null.");
            return false;
        }
        if (context.getServletRegistrations() == null) {
            sb.append("ServletContext#getServletRegistrations is null.");
            return false;
        }
        Iterator<String> it = context.getServletRegistrations().keySet().iterator();
        if (!it.hasNext()) {
            sb.append("ServletContext#getServletRegistrations is empty.");
            return false;
        }
        if (!ServletContainer.class.getName().equals(it.next())) {
            sb.append("ServletContext#getServletRegistrations does not contain ServletContainer registration.");
            return false;
        }
        return true;
    }

    static boolean checkServletConfig(ServletConfig config, StringBuilder sb) {
        if (config == null) {
            sb.append("ServletConfig is null.");
            return false;
        }
        if (!ServletContainer.class.getName().equals(config.getServletName())) {
            sb.append("ServletConfig has unexpected servlet name ").append(config.getServletName()).append(" .");
            return false;
        }
        return true;
    }

    static boolean checkHttpServletRequest(HttpServletRequest request, StringBuilder sb) {
        if (request == null) {
            sb.append("HttpServletRequest is null.");
            return false;
        }
        if (request.getHeaderNames() == null) {
            sb.append("HttpServletRequest header names is null.");
            return false;
        }
        if (request.getHeader(HEADER) == null) {
            sb.append("HttpServletRequest does not contain expected header.");
            return false;
        }
        if (!HEADER.equals(request.getHeader(HEADER))) {
            sb.append("HttpServletRequest does not contain expected header value.");
            return false;
        }
        return true;
    }

    static boolean checkHttpServletResponse(HttpServletResponse response, StringBuilder sb) {
        if (response == null) {
            sb.append("HttpServletResponse is null.");
            return false;
        }
        if (response.getStatus() != 200) {
            sb.append("HttpServletResponse has unexpectes status.");
            return false;
        }
        return true;
    }
}