/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.myfaces.extensions.scripting.cdi.startup;

import org.apache.myfaces.extensions.scripting.cdi.core.CDIThrowAwayClassloader;
import org.apache.myfaces.extensions.scripting.core.engine.ThrowAwayClassloader;
import org.apache.myfaces.extensions.scripting.jsf.startup.StartupServletContextPluginChainLoader;

import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.AfterDeploymentValidation;
import javax.enterprise.inject.spi.BeforeBeanDiscovery;
import javax.enterprise.inject.spi.Extension;
import java.io.IOException;

/**
 * @author Werner Punz (latest modification by $Author$)
 * @version $Revision$ $Date$
 *          <p/>
 *          An extension for cdi which does the initial lifecycle
 *          trigger from CDI instead of JSF since CDI is enabled
 *          before JSF we have to do it that way
 *
 *          Stage 1 of our startup cycle
 */

public class StartupExtension implements Extension
{
    static ThreadLocal<ClassLoader> _classLoaderHolder = new ThreadLocal<ClassLoader>();

    void beforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd)
    {
        //We have to trigger our initial lifecycle with
        //the compile runs but not with the daemon thread
        //after that we can load the classes
        //by temporarily plugging in our throw away classloader
       _classLoaderHolder.set(Thread.currentThread().getContextClassLoader());
       Thread.currentThread().setContextClassLoader(new CDIThrowAwayClassloader(Thread.currentThread().getContextClassLoader()));
    }

    void afterBeanDiscovery(@Observes AfterBeanDiscovery abd)
    {
        //here we unplug our temporary classloader
    }


    void afterDeploymentValidation(@Observes AfterDeploymentValidation abv)
      {
            Thread.currentThread().setContextClassLoader(_classLoaderHolder.get());
      }
}
