/*
 * Copyright (c) 2010, 2018 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
 */

import java.io.IOException;
import java.io.PrintWriter;

import jakarta.inject.Inject;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import test.artifacts.Asynchronous;
import test.artifacts.AsynchronousPaymentProcessor;
import test.artifacts.PaymentProcessor;
import test.artifacts.Synchronous;
import test.artifacts.SynchronousPaymentProcessor;
import test.beans.BeanToTestAny;
import test.beans.BeanToTestConstructorInjection;
import test.beans.BeanToTestInitializerMethodInjection;
import test.beans.BeanToTestMultipleQualifiers;

@WebServlet(name = "mytest", urlPatterns = { "/myurl" }, initParams = {
        @WebInitParam(name = "n1", value = "v1"),
        @WebInitParam(name = "n2", value = "v2") })
public class QualifierServlet extends HttpServlet {

    @Inject
    BeanToTestInitializerMethodInjection tb;

    @Inject
    BeanToTestConstructorInjection tb2;

    @Inject
    BeanToTestAny tb3;

    @Inject
    BeanToTestMultipleQualifiers tb4;

    @Inject
    @Synchronous
    PaymentProcessor synchronousPaymentProcessor;
    @Inject
    @Asynchronous
    PaymentProcessor asynchronousPaymentProcessor;

    public void service(HttpServletRequest req, HttpServletResponse res)
            throws IOException, ServletException {
        PrintWriter writer = res.getWriter();
        writer.write("Hello from Servlet 3.0. ");
        String msg = "n1=" + getInitParameter("n1") + ", n2="
                + getInitParameter("n2");
        if (tb == null)
            msg += "Bean injection into Servlet failed";

        boolean qualifierTestSuccess = synchronousPaymentProcessor instanceof SynchronousPaymentProcessor
                && asynchronousPaymentProcessor instanceof AsynchronousPaymentProcessor;
        if (!qualifierTestSuccess)
            msg += "Qualifier based injection into Servlet Failed";
        if (!tb.testInjection())
            msg += "Qualifier based injection into BeanToTestInitializerMethodInjection (initializer method injection) Failed";
        if (!tb2.testInjection())
            msg += "Qualifier based injection into BeanToTestConstructorMethodInjection (constructor method injection) Failed";
        if (!tb3.testInjection())
            msg += "Qualifier based @Any injection into BeanToTestAny Failed";
        if (!tb4.testInjection())
            msg += "Multiple qualifiers test failed";

        writer.write("initParams: " + msg + "\n");
    }
}
