package com.book.balsa.web.context;

import com.google.inject.Guice;
import com.google.inject.Injector;
import net.sourceforge.stripes.action.Resolution;
import net.sourceforge.stripes.config.ConfigurableComponent;
import net.sourceforge.stripes.config.Configuration;
import net.sourceforge.stripes.controller.ExecutionContext;
import net.sourceforge.stripes.controller.Interceptor;
import net.sourceforge.stripes.controller.Intercepts;
import net.sourceforge.stripes.controller.LifecycleStage;

import javax.servlet.ServletContext;

@Intercepts(LifecycleStage.ActionBeanResolution)
public class GuiceInterceptor implements Interceptor, ConfigurableComponent {

  public static final String GUICE_CONTEXT_TOKEN = "guiceContext";

  public void init(Configuration configuration) throws Exception {
    final Injector injector = Guice.createInjector();
    configuration.getServletContext().setAttribute(GUICE_CONTEXT_TOKEN, injector);    
  }

  public Resolution intercept(ExecutionContext executionContext) throws Exception {
    Resolution resolution = executionContext.proceed();
    getGuiceInjector(executionContext.getActionBeanContext().getServletContext()).injectMembers(executionContext.getActionBean());
    return resolution;
  }

  private Injector getGuiceInjector(ServletContext context) {
    return (Injector) context.getAttribute(GUICE_CONTEXT_TOKEN);
  }
}
