content: /**
   * Copyright@2011 wro4j
   */
  package ro.isdc.wro.http.handler.factory;
  
  import java.util.Collection;
  import java.util.List;
  import java.util.Map;
  import java.util.Properties;
  
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import ro.isdc.wro.http.handler.RequestHandler;
  import ro.isdc.wro.http.handler.spi.RequestHandlerProvider;
  import ro.isdc.wro.model.resource.support.AbstractConfigurableMultipleStrategy;
  
  
  /**
   * A {@link RequestHandler} implementation which is easy to configure using a {@link Properties} object.
   * 
   * @author Alex Objelean
   * @created 30 Jul 2011
   * @since 1.5.0
   */
  public class ConfigurableRequestHandlerFactory
      extends AbstractConfigurableMultipleStrategy<RequestHandler, RequestHandlerProvider>
      implements RequestHandlerFactory {
    private static final Logger LOG = LoggerFactory.getLogger(ConfigurableRequestHandlerFactory.class);
    /**
     * Name of the property used to configure requestHandlers.
     */
    public static final String KEY = "requestHandlers";
    
    private final RequestHandlerFactory requestHandlerFactory = newRequestHandlerFactory();
  
    /**
     * {@inheritDoc}
     */
    @Override
    protected String getStrategyKey() {
      return KEY;
    }
    
    /**
     * {@inheritDoc}
     */
    @Override
    protected Map<String, RequestHandler> getStrategies(final RequestHandlerProvider provider) {
      return provider.provideRequestHandlers();
    }
  
    /**
     * {@inheritDoc}
     */
    public Collection<RequestHandler> create() {
      return requestHandlerFactory.create();
    }
    
    /**
     * {@inheritDoc}
     */
    private RequestHandlerFactory newRequestHandlerFactory() {
      final SimpleRequestHandlerFactory factory = new SimpleRequestHandlerFactory();
      final List<RequestHandler> requestHandlers = getConfiguredStrategies();
      for (final RequestHandler requestHandler : requestHandlers) {
        factory.addHandler(requestHandler);
      }
      // use default when none provided
      if (requestHandlers.isEmpty()) {
        LOG.debug("No locators configured. Using Default locator factory.");
        return new DefaultRequestHandlerFactory();
      }
      return factory;
    }
  
    /**
     * {@inheritDoc}
     */
    @Override
    protected Class<RequestHandlerProvider> getProviderClass() {
      return RequestHandlerProvider.class;
    }
  }
  