/* * Copyright 2012 Jason Miller * * 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 jj.http.server; import com.google.inject.Binder; import com.google.inject.TypeLiteral; import com.google.inject.multibindings.MapBinder; import com.google.inject.multibindings.Multibinder; import jj.resource.ResourceBindingProcessor; import jj.util.StringUtils; /** * @author jason * */ public class ServableResourceBindingProcessor implements ResourceBindingProcessor<ServableResource> { private final MapBinder<String, Class<? extends ServableResource>> servableResourceBinder; private final MapBinder<String, RouteProcessor> routeProcessorBinder; private final MapBinder<Class<? extends ServableResource>, RouteProcessorConfiguration> routeProcessorConfigurationBinder; private final Multibinder<RouteContributor> routeContributorBinder; public ServableResourceBindingProcessor(Binder binder) { servableResourceBinder = MapBinder.newMapBinder( binder, new TypeLiteral<String>() {}, new TypeLiteral<Class<? extends ServableResource>>() {} ); routeProcessorBinder = MapBinder.newMapBinder(binder, String.class, RouteProcessor.class); routeProcessorConfigurationBinder = MapBinder.newMapBinder( binder, new TypeLiteral<Class<? extends ServableResource>>() {}, new TypeLiteral<RouteProcessorConfiguration>() {} ); routeContributorBinder = Multibinder.newSetBinder(binder, RouteContributor.class); } @Override public void process(Class<? extends ServableResource> resourceClassBinding) { String name = null; Class<? extends RouteProcessor> routeProcessorClass = SimpleRouteProcessor.class; Class<? extends RouteProcessorConfiguration> routeProcessorConfigurationClass = DefaultRouteProcessorConfiguration.class; Class<? extends RouteContributor> routeContributorClass = EmptyRouteContributor.class; ServableResourceConfiguration config = resourceClassBinding.getAnnotation(ServableResourceConfiguration.class); if (config != null) { name = config.name(); routeProcessorClass = config.processor(); routeProcessorConfigurationClass = config.processorConfig(); routeContributorClass = config.routeContributor(); } if (StringUtils.isEmpty(name)) { // figure it out! this is close but not bulletproof name = resourceClassBinding.getSimpleName(); int end = name.lastIndexOf("Resource"); if (end > 1) { name = name.substring(0, end); } name = name.substring(0, 1).toLowerCase() + name.substring(1); } servableResourceBinder.addBinding(name).toInstance(resourceClassBinding); routeProcessorBinder.addBinding(name).to(routeProcessorClass); routeProcessorConfigurationBinder.addBinding(resourceClassBinding).to(routeProcessorConfigurationClass); if (routeContributorClass != EmptyRouteContributor.class) { routeContributorBinder.addBinding().to(routeContributorClass); } } }