content: /*
   * Copyright (c) 2009.
   */
  package ro.isdc.wro.model.group;
  
  import javax.servlet.http.HttpServletRequest;
  
  import org.apache.commons.io.FilenameUtils;
  import org.apache.commons.lang3.StringUtils;
  import org.apache.commons.lang3.Validate;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import ro.isdc.wro.config.Context;
  import ro.isdc.wro.model.resource.ResourceType;
  
  
  /**
   * Default implementation capable of extracting a single group from the request.
   *
   * @author Alex Objelean
   * @created Created on Nov 3, 2008
   */
  public class DefaultGroupExtractor
    implements GroupExtractor {
    private static final Logger LOG = LoggerFactory.getLogger(DefaultGroupExtractor.class);
    /**
     * The name of the attribute where the servlet path is stored when requestDispatcher.include is called.
     */
    public static final String ATTR_INCLUDE_PATH = "javax.servlet.include.servlet_path";
    /**
     * The name of the parameter used to decide if the group must be minimized.
     */
    public static final String PARAM_MINIMIZE = "minimize";
  
    /**
     * {@inheritDoc}
     */
    public String getGroupName(final HttpServletRequest request) {
      Validate.notNull(request);
      String uri = request.getRequestURI();
      // check if include or uri path are present and use one of these as request uri.
      final String includeUriPath = (String) request.getAttribute(ATTR_INCLUDE_PATH);
      uri = includeUriPath != null ? includeUriPath : uri;
      final String groupName = FilenameUtils.getBaseName(stripSessionID(uri));
      return StringUtils.isEmpty(groupName) ? null : groupName;
    }
  
    /**
     * Extracts the resource type, by parsing the uri & finds the extension. If extension is valid ('css' or 'js'),
     * returns corresponding ResourceType, otherwise throws exception.
     * <p>
     * Valid examples of uri are: <code>/context/somePath/test.js</code> or <code>/context/somePath/test.css</code>
     * {@inheritDoc}
     */
    public ResourceType getResourceType(final HttpServletRequest request) {
      Validate.notNull(request);
      final String uri = request.getRequestURI();
      Validate.notNull(uri);
      ResourceType type = null;
      try {
        type = ResourceType.get(FilenameUtils.getExtension(stripSessionID(uri)));
      } catch (final IllegalArgumentException e) {
        LOG.debug("[FAIL] Cannot identify resourceType for uri: {}", uri);
      }
      return type;
    }
  
    /**
     * The uri is cleaned up (the ;jsessionID is removed).
     * @return the extension of the resource.
     */
    private String stripSessionID(final String uri) {
      return uri.replaceFirst("(?i)(;jsessionid.*)", "");
    }
  
    /**
     * {@inheritDoc}
     */
    public String encodeGroupUrl(final String groupName, final ResourceType resourceType, final boolean minimize) {
      return String.format("%s.%s?" + PARAM_MINIMIZE + "=%s", groupName, resourceType.name().toLowerCase(), minimize);
    }
  
    /**
     * The minimization is can be switched off only in debug mode.
     *
     * @return false if the request contains parameter {@link DefaultGroupExtractor#PARAM_MINIMIZE} with value false,
     *         otherwise returns true.
     */
    public boolean isMinimized(final HttpServletRequest request) {
      Validate.notNull(request);
      final String minimizeAsString = request.getParameter(PARAM_MINIMIZE);
      return !(Context.get().getConfig().isDebug() && "false".equalsIgnoreCase(minimizeAsString));
    }
  }
  