/** * Copyright 2015 ArcBees 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.arcbees.gaestudio.server.guice; import java.lang.reflect.Type; import javax.inject.Inject; import javax.inject.Singleton; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.ws.rs.ext.Provider; import org.jboss.resteasy.plugins.guice.GuiceResourceFactory; import org.jboss.resteasy.plugins.server.servlet.FilterDispatcher; 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 com.google.inject.Binding; import com.google.inject.Injector; @Singleton public class GuiceRestEasyFilterDispatcher extends FilterDispatcher { @Inject Injector injector; @Override public void init(FilterConfig servletConfig) throws ServletException { super.init(servletConfig); Registry registry = getDispatcher().getRegistry(); ResteasyProviderFactory providerFactory = getDispatcher().getProviderFactory(); for (Binding<?> binding : injector.getBindings().values()) { Type type = binding.getKey().getTypeLiteral().getType(); if (type instanceof Class) { Class<?> beanClass = (Class) type; if (GetRestful.isRootResource(beanClass) && beanClass.isAnnotationPresent(GaeStudioResource.class)) { ResourceFactory resourceFactory = new GuiceResourceFactory(binding.getProvider(), beanClass); registry.removeRegistrations(beanClass); registry.addResourceFactory(resourceFactory); } if (beanClass.isAnnotationPresent(Provider.class)) { providerFactory.registerProviderInstance(binding.getProvider().get()); } } } } }