/*
 * 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.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
        try
        {
            StartupServletContextPluginChainLoader.startup(CDIServletContainerInitializer.getContext());
            _classLoaderHolder.set(Thread.currentThread().getContextClassLoader());
            Thread.currentThread().setContextClassLoader(new ThrowAwayClassloader());
        }
        catch (IOException e)
        {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }

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


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