/**
 * Copyright (C) 2007 Google Inc.
 *
 * Licensed 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 com.google.inject.servlet;

import com.google.inject.Injector;

import java.lang.ref.WeakReference;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * As of Guice 2.0 you can still use (your subclasses of) {@code GuiceServletContextListener}
 * class as a logical place to create and configure your injector. This will ensure the injector
 * is created when the web application is deployed.
 * 
 * @author Kevin Bourrillion (kevinb@google.com)
 * @since 2.0
 */
public abstract class GuiceServletContextListener
    implements ServletContextListener {

  static final String INJECTOR_NAME = Injector.class.getName();

  public void contextInitialized(ServletContextEvent servletContextEvent) {
    final ServletContext servletContext = servletContextEvent.getServletContext();

    // Set the Servletcontext early for those people who are using this class.
    // NOTE(dhanji): This use of the servletContext is deprecated.
    GuiceFilter.servletContext = new WeakReference<ServletContext>(servletContext);

    Injector injector = getInjector();
    injector.getInstance(InternalServletModule.BackwardsCompatibleServletContextProvider.class)
        .set(servletContext);
    servletContext.setAttribute(INJECTOR_NAME, injector);
  }

  public void contextDestroyed(ServletContextEvent servletContextEvent) {
    ServletContext servletContext = servletContextEvent.getServletContext();
    servletContext.removeAttribute(INJECTOR_NAME);
  }

  /**
   * Override this method to create (or otherwise obtain a reference to) your
   * injector.
   */
  protected abstract Injector getInjector();
}
