/*
 * 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
 */

package test.extension;

import jakarta.enterprise.event.Observes;
import jakarta.enterprise.inject.spi.AfterBeanDiscovery;
import jakarta.enterprise.inject.spi.BeanManager;
import jakarta.enterprise.inject.spi.BeforeBeanDiscovery;
import jakarta.enterprise.inject.spi.Extension;
import jakarta.enterprise.inject.spi.ProcessAnnotatedType;

import test.beans.DuplicateTestBean;

public class MyExtension implements Extension{
    public static boolean beforeBeanDiscoveryCalled = false;
    public static boolean afterBeanDiscoveryCalled = false;
    public static boolean processAnnotatedTypeCalled = false;
    public MyExtension(){
        System.out.println("In MyExtension ctor");
        //new Throwable().printStackTrace();
    }

    void beforeBeanDiscovery(@Observes BeforeBeanDiscovery bdd){
        System.out.println("MyExtension::beforeBeanDiscovery" + bdd);
        beforeBeanDiscoveryCalled = true;
    }

    <T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> pat){
        System.out.println("MyExtension:Process annotated type" + pat.getAnnotatedType().getBaseType());
        processAnnotatedTypeCalled = true;
        //Vetoing the processing of DuplicateTestBean
        //If this is not vetoed, at the InjectionPoint in Servlet, there would be
        //an ambiguous dependency due to TestBean and DuplicateTestBean
        if (pat.getAnnotatedType().getBaseType().equals(DuplicateTestBean.class)){
            pat.veto();
        }
    }

    void afterBeanDiscovery(@Observes AfterBeanDiscovery abd, BeanManager bm){
        System.out.println("MyExtension: abd: " + abd + " BeanManager: " + bm);

        if (bm != null) {
            //ensure a valid BeanManager is injected
            afterBeanDiscoveryCalled = true;
        }
    }
}
