/* * Contributed by Asaf Shakarchi <asaf000@gmail.com> * * 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/LICENSE2.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 org.atteo.moonshine.resteasy; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlIDREF; import javax.xml.bind.annotation.XmlRootElement; import org.atteo.config.XmlDefaultValue; import org.atteo.moonshine.ServiceConfiguration; import org.atteo.moonshine.jaxrs.Jaxrs; import org.atteo.moonshine.services.ImportService; import org.atteo.moonshine.webserver.WebServerService; import org.jboss.resteasy.plugins.guice.GuiceResourceFactory; import org.jboss.resteasy.plugins.server.servlet.FilterDispatcher; import org.jboss.resteasy.spi.ResourceFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.inject.Module; import com.google.inject.PrivateModule; import com.google.inject.Singleton; /** * Starts RESTEasy JAXRS implementation. */ @XmlRootElement(name = "resteasy") @ServiceConfiguration(autoConfiguration = "" + "<prefix>${oneof:${resteasy.prefix},${jaxrs.prefix},}</prefix>" + "<discoverResources>true</discoverResources>") public class Resteasy extends Jaxrs { Logger log = LoggerFactory.getLogger(Resteasy.class); @XmlElement @XmlIDREF @ImportService private org.atteo.moonshine.webserver.ServletContainer servletContainer; @XmlElement @XmlIDREF @ImportService private WebServerService webServer; /** * Prefix under which JAXRS resources should be registered. */ @XmlElement @XmlDefaultValue("/") private String prefix; @Override public Module configure() { return new PrivateModule() { @Override protected void configure() { Map<String, String> params = new HashMap<>(); params.put("resteasy.servlet.mapping.prefix", prefix); bind(FilterDispatcher.class).in(Singleton.class); servletContainer.addFilter(getProvider(FilterDispatcher.class), params, prefix + "/*"); registerResources(binder()); registerProviders(binder()); } }; } @Inject private FilterDispatcher filterDispatcher; @Override public void start() { for (final JaxrsResource<?> resourceWithProvider : getResources()) { final ResourceFactory resourceFactory = new GuiceResourceFactory( (com.google.inject.Provider<Object>) resourceWithProvider.getProvider()::get, resourceWithProvider.getResourceClass()); filterDispatcher.getDispatcher().getRegistry().addResourceFactory(resourceFactory); } for (JaxrsResource<?> provider : getProviders()) { filterDispatcher.getDispatcher().getProviderFactory().registerProviderInstance( provider.getProvider().get()); } } }