content: package ro.isdc.wro.cache;
  
  import static org.apache.commons.lang3.Validate.notNull;
  
  import java.io.Serializable;
  import java.util.HashMap;
  import java.util.Map;
  
  import org.apache.commons.lang3.builder.EqualsBuilder;
  import org.apache.commons.lang3.builder.HashCodeBuilder;
  import org.apache.commons.lang3.builder.ToStringBuilder;
  
  import ro.isdc.wro.model.resource.ResourceType;
  
  /**
   * Used as an entry for the cache.
   */
  @SuppressWarnings("serial")
  public final class CacheKey implements Serializable {
  	private final ResourceType type;
  	private final String groupName;
  	/**
  	 * Produce minimized version.
  	 */
  	private final boolean minimize;
  	/**
  	 * A map of custom attributes.
  	 */
  	private final Map<String, String> map = new HashMap<String, String>();
  
    /**
     * Uses default minimize flag to build {@link CacheKey} (minimize = true). Useful when this flag is not important
     * (example resource watcher).
     *
     * @see #CacheKey(String, ResourceType, boolean)
     */
    public CacheKey(final String groupName, final ResourceType type) {
  	  this(groupName, type, true);
  	}
  
  	/**
  	 * @param groupName name of the group.
  	 * @param type resource type (js or css)
  	 * @param minimize true if the result should produce minimized version.
  	 */
  	public CacheKey(final String groupName, final ResourceType type, final boolean minimize) {
  	  notNull(groupName);
  	  notNull(type);
  		this.groupName = groupName;
  		this.type = type;
  		this.minimize = minimize;
  	}
  
  
  	/**
  	 * @return the type
  	 */
  	public ResourceType getType() {
  		return this.type;
  	}
  
  
  	/**
  	 * @return the groupName
  	 */
  	public String getGroupName() {
  		return this.groupName;
  	}
  
  
  	/**
     * @return the minimize
     */
    public boolean isMinimize() {
      return this.minimize;
    }
  
    /**
     * Add a custom key-value pair attribute. Each pair is added to an internal map. The custom attributes can be used to
     * make the key more fine grained (Ex: based on browser version or a request parameter). Both elements of the
     * attribute (key & value) should be not null. If any of these are null, the attribute won't be added.
     *
     * @param key
     *          string representing the key of the attribute.
     * @param value
     *          string representing the value of the attribute.
     * @return reference to current {@link CacheKey} used for fluent interface.
     */
    public CacheKey addAttribute(final String key, final String value) {
      if (key != null && value != null) {
        map.put(key, value);
      }
      return this;
    }
  
    @Override
  	public boolean equals(final Object obj) {
      return EqualsBuilder.reflectionEquals(this, obj);
  	}
  
  	@Override
  	public int hashCode() {
  	  return HashCodeBuilder.reflectionHashCode(this, false);
    }
  
  	@Override
    public String toString() {
      return ToStringBuilder.reflectionToString(this);
    }
  }