package org.jboss.resteasy.plugins.guice; import com.google.inject.Binding; import com.google.inject.Injector; import org.jboss.resteasy.plugins.guice.i18n.LogMessages; import org.jboss.resteasy.plugins.guice.i18n.Messages; import org.jboss.resteasy.spi.Registry; import org.jboss.resteasy.spi.ResourceFactory; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.jboss.resteasy.util.GetRestful; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import javax.ws.rs.ext.Provider; public class ModuleProcessor { private final Registry registry; private final ResteasyProviderFactory providerFactory; public ModuleProcessor(final Registry registry, final ResteasyProviderFactory providerFactory) { this.registry = registry; this.providerFactory = providerFactory; } public void processInjector(final Injector injector) { List<Binding<?>> rootResourceBindings = new ArrayList<Binding<?>>(); for (final Binding<?> binding : injector.getBindings().values()) { final Type type = binding.getKey().getTypeLiteral().getRawType(); if (type instanceof Class) { final Class<?> beanClass = (Class) type; if (GetRestful.isRootResource(beanClass)) { // deferred registration rootResourceBindings.add(binding); } if (beanClass.isAnnotationPresent(Provider.class)) { LogMessages.LOGGER.info(Messages.MESSAGES.registeringProviderInstance(beanClass.getName())); providerFactory.registerProviderInstance(binding.getProvider().get()); } } } for (Binding<?> binding : rootResourceBindings) { Class<?> beanClass = (Class) binding.getKey().getTypeLiteral().getType(); final ResourceFactory resourceFactory = new GuiceResourceFactory(binding.getProvider(), beanClass); LogMessages.LOGGER.info(Messages.MESSAGES.registeringFactory(beanClass.getName())); registry.addResourceFactory(resourceFactory); } } }