package io.fathom.cloud.jaxrs;
//package com.fathomdb.jaxrs;
//
//import java.lang.annotation.Annotation;
//import java.lang.reflect.InvocationTargetException;
//import java.lang.reflect.Method;
//import java.util.List;
//
//import javax.annotation.PostConstruct;
//import javax.annotation.PreDestroy;
//import javax.inject.Inject;
//import javax.servlet.ServletContext;
//import javax.servlet.ServletContextEvent;
//import javax.servlet.ServletContextListener;
//
//import org.jboss.resteasy.logging.Logger;
//import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener;
//import org.jboss.resteasy.plugins.guice.ModuleProcessor;
//import org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap;
//import org.jboss.resteasy.spi.Registry;
//import org.jboss.resteasy.spi.ResteasyProviderFactory;
//
//import com.google.common.collect.Lists;
//import com.google.inject.Injector;
//import com.google.inject.Module;
//import com.google.inject.Stage;
//
//public class RestEasyExternalInjector extends ResteasyBootstrap implements ServletContextListener {
// private final static Logger logger = Logger.getLogger(GuiceResteasyBootstrapServletContextListener.class);
//
// private List<Module> modules;
//
// @Inject
// Injector injector;
//
// @Override
// public void contextInitialized(final ServletContextEvent event) {
// super.contextInitialized(event);
// final ServletContext context = event.getServletContext();
// final Registry registry = (Registry) context.getAttribute(Registry.class.getName());
// final ResteasyProviderFactory providerFactory = (ResteasyProviderFactory) context
// .getAttribute(ResteasyProviderFactory.class.getName());
// final ModuleProcessor processor = new ModuleProcessor(registry, providerFactory);
// final List<Module> modules = getModules(context);
// final Stage stage = getStage(context);
// // final Injector injector;
// // if (stage == null) {
// // injector = Guice.createInjector(modules);
// // } else {
// // injector = Guice.createInjector(stage, modules);
// // }
// withInjector(injector);
// processor.processInjector(injector);
// this.modules = modules;
// triggerAnnotatedMethods(PostConstruct.class);
// }
//
// /**
// * Override this method to interact with the {@link Injector} after it has
// * been created. The default is no-op.
// *
// * @param injector
// */
// protected void withInjector(Injector injector) {
// }
//
// /**
// * Override this method to set the Stage. By default it is taken from
// * resteasy.guice.stage context param.
// *
// * @param context
// * @return Guice Stage
// */
// protected Stage getStage(ServletContext context) {
// final String stageAsString = context.getInitParameter("resteasy.guice.stage");
// if (stageAsString == null) {
// return null;
// }
// try {
// return Stage.valueOf(stageAsString.trim());
// } catch (IllegalArgumentException e) {
// throw new RuntimeException("Injector stage is not defined properly. " + stageAsString + " is wrong value."
// + " Possible values are PRODUCTION, DEVELOPMENT, TOOL.");
// }
// }
//
// /**
// * Override this method to instantiate your {@link Module}s yourself.
// *
// * @param context
// * @return
// */
// protected List<Module> getModules(final ServletContext context) {
// return Lists.newArrayList();
// //
// // final List<Module> result = new ArrayList<Module>();
// // final String modulesString =
// // context.getInitParameter("resteasy.guice.modules");
// // if (modulesString != null) {
// // final String[] moduleStrings = modulesString.trim().split(",");
// // for (final String moduleString : moduleStrings) {
// // try {
// // logger.info("found module: {0}", moduleString);
// // final Class clazz =
// // Thread.currentThread().getContextClassLoader().loadClass(moduleString.trim());
// // final Module module = (Module) clazz.newInstance();
// // result.add(module);
// // } catch (ClassNotFoundException e) {
// // throw new RuntimeException(e);
// // } catch (IllegalAccessException e) {
// // throw new RuntimeException(e);
// // } catch (InstantiationException e) {
// // throw new RuntimeException(e);
// // }
// // }
// //
// // }
// // return result;
// }
//
// @Override
// public void contextDestroyed(final ServletContextEvent event) {
// triggerAnnotatedMethods(PreDestroy.class);
// }
//
// private void triggerAnnotatedMethods(final Class<? extends Annotation> annotationClass) {
// for (Module module : this.modules) {
// final Method[] methods = module.getClass().getMethods();
// for (Method method : methods) {
// if (method.isAnnotationPresent(annotationClass)) {
// if (method.getParameterTypes().length > 0) {
// logger.warn(
// "Cannot execute expected module {}'s @{} method {} because it has unexpected parameters: skipping.",
// module.getClass().getSimpleName(), annotationClass.getSimpleName(), method.getName());
// continue;
// }
// try {
// method.invoke(module);
// } catch (InvocationTargetException ex) {
// logger.warn("Problem running annotation method @" + annotationClass.getSimpleName(), ex);
// } catch (IllegalAccessException ex) {
// logger.warn("Problem running annotation method @" + annotationClass.getSimpleName(), ex);
// }
// }
// }
// }
// }
// }