DataFormatters.java

package org.xandercat.pmdb.util.format;

import java.util.HashMap;
import java.util.Map;

import org.xandercat.pmdb.dto.Movie;

/**
 * Formatting class for formatting display and sort values for movie attributes.
 * 
 * @author Scott Arnold
 */
public class DataFormatters {

	private Map<String, DataFormatter> attributeFormatters = new HashMap<String, DataFormatter>();
	private DataFormatter genericFormatter;

	/**
	 * Sets the generic formatter that will be used to format values when no explicit formatter for an attribute has been set.
	 * 
	 * @param genericFormatter generic formatter
	 */
	public void setGenericFormatter(DataFormatter genericFormatter) {
		this.genericFormatter = genericFormatter;
	}
	
	/**
	 * Sets the formatters to be used for movie attributes.
	 * 
	 * @param attributeFormatters formatters for movie attributes (key is attribute name, value is formatter)
	 */
	public void setAttributeFormatters(Map<String, DataFormatter> attributeFormatters) {
		if (attributeFormatters != null) {
			this.attributeFormatters = attributeFormatters;
		} else {
			this.attributeFormatters.clear();
		}
	}
	
	/**
	 * Returns the attribute formatters for movie attributes.
	 * 
	 * @return attribute formatters for movie attributes
	 */
	public Map<String, DataFormatter> getAttributeFormatters() {
		return attributeFormatters;
	}
	
	/**
	 * Adds an attribute formatter for the given attribute name.
	 * 
	 * @param attributeName        name of attribute
	 * @param attributeFormatter   formatter for attribute
	 */
	public void addAttributeFormatter(String attributeName, DataFormatter attributeFormatter) {
		attributeFormatters.put(attributeName, attributeFormatter);
	}
	
	/**
	 * Returns the display value for the attribute of given name on the given movie.
	 * 
	 * @param movie          movie to get display value from
	 * @param attributeName  attribute name to get display value for
	 * 
	 * @return display value for attribute
	 */
	public String displayValue(Movie movie, String attributeName) {
		String attributeValue = movie.getAttribute(attributeName);
		DataFormatter attributeFormatter = attributeFormatters.get(attributeName);
		if (attributeFormatter == null) {
			attributeFormatter = genericFormatter;
		}
		if (attributeFormatter == null) {
			return attributeValue;
		} else {
			return attributeFormatter.displayValue(attributeValue);
		}
	}
	
	/**
	 * Returns the sort value for the attribute of given name on the given movie.
	 * 
	 * @param movie          movie to get sort value from
	 * @param attributeName  attribute name to get sort value for
	 * 
	 * @return sort value for attribute
	 */
	public String sortValue(Movie movie, String attributeName) {
		String attributeValue = movie.getAttribute(attributeName);
		DataFormatter attributeFormatter = attributeFormatters.get(attributeName);
		if (attributeFormatter == null) {
			attributeFormatter = genericFormatter;
		}
		if (attributeFormatter == null) {
			return attributeValue;
		} else {
			return attributeFormatter.sortValue(attributeValue);
		}		
	}
}