// Path: src/main/java/com/rolfje/anonimatron/configuration/Column.java
// public class Column {
//     private String name;
//     private String type;
//     private int size = -1;
//     private boolean shortlived;
//     private Map<String, String> parameters;
// 
//     public Column() {
// 
//     }
// 
//     public Column(String name, String type) {
//         this.name = name;
//         this.type = type;
//     }
// 
//     public Column(String name, String type, int size) {
//         this(name, type);
//         this.size = size;
//     }
// 
//     public Column(String name, String type, int size, boolean shortlived) {
//         this(name, type);
//         this.size = size;
//         this.shortlived = shortlived;
//     }
// 
//     public Column(String name, String type, int size, boolean shortlived, Map<String, String> parameters) {
//         this(name, type, size, shortlived);
//         this.parameters = parameters;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getType() {
//         return type;
//     }
// 
//     public void setType(String type) {
//         this.type = type;
//     }
// 
//     public int getSize() {
//         return size;
//     }
// 
//     public void setSize(int size) {
//         this.size = size;
//     }
// 
//     public boolean isShortLived() {
//         return shortlived;
//     }
// 
//     public void setShortlived(boolean shortlived) {
//         this.shortlived = shortlived;
//     }
// 
//     public Map<String, String> getParameters() {
//         return parameters;
//     }
// 
//     public void setParameters(Map<String, String> parameters) {
//         this.parameters = parameters;
//     }
// }
// 
// Path: src/main/java/com/rolfje/anonimatron/synonyms/NullSynonym.java
// public class NullSynonym implements Synonym {
// 	private final String type;
// 	
// 	public NullSynonym(String type) {
// 		this.type=type;
// 	}
// 	
// 	public String getType() {
// 		return type;
// 	}
// 
// 	public Object getFrom() {
// 		return null;
// 	}
// 
// 	public Object getTo() {
// 		return null;
// 	}
// 
// 	@Override
// 	public boolean isShortLived() {
// 		return true;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		return (obj != null) && (this.getClass() == obj.getClass()) && (this.hashCode() == obj.hashCode());
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return type.hashCode();
// 	}
// }
// 
// Path: src/main/java/com/rolfje/anonimatron/synonyms/Synonym.java
// public interface Synonym {
// 
// 	/**
// 	 * Indicates if this Synonym is short-lived or transient, meaning that
//      * it should not be stored in the synonyms file. Transient Synonyms
//      * are not stored, need to be calculated each run time.
// 	 *
// 	 * Transient synonyms are:
// 	 *
// 	 * <ol>
// 	 *     <li>Not stored in memory.</li>
// 	 *     <li>Not stored in the synonym file.</li>
// 	 * </ol>
// 	 *
// 	 * @return <code>true</code> if the synonym should be thrown away
// 	 * after use (not stored in the synonym file).
// 	 */
// 	boolean isShortLived();
// 
// 	/**
// 	 * @return The semantic data type of this Synonym, usually something
// 	 *         descriptive as "NAME" or "STREET".
// 	 */
// 	String getType();
// 
// 	/**
// 	 * @return The data which was in the original database for this Synonym
// 	 */
// 	Object getFrom();
// 
// 	/**
// 	 * 
// 	 * @return The data with which the original data in the database will be or
// 	 *         is replaced when the Anonymizer runs.
// 	 */
// 	Object getTo();
// }


import com.rolfje.anonimatron.configuration.Column;
import com.rolfje.anonimatron.synonyms.NullSynonym;
import com.rolfje.anonimatron.synonyms.Synonym;
import org.apache.log4j.Logger;
import java.sql.Date;
import java.util.*;
		}

		LOG.info(anonymizers.size()+" anonymizers registered.");
	}

	public Set<String> getCustomAnonymizerTypes() {
		return Collections.unmodifiableSet(customAnonymizers.keySet());
	}

	public Set<String> getDefaultAnonymizerTypes() {
		return Collections.unmodifiableSet(defaultTypeMapping.keySet());
	}

	public Synonym anonymize(Column column, Object from) {
		if (from == null) {
			return new NullSynonym(column.getType());
		}

		// Find for regular type
		Synonym synonym = getSynonym(column, from);

		if (synonym == null) {
            Anonymizer anonymizer = getAnonymizer(column.getType());
            synonym = anonymizer.anonymize(from, column.getSize(), column.isShortLived(), column.getParameters());

			synonymCache.put(synonym);
		}
		return synonym;
	}

// Path: src/main/java/com/rolfje/anonimatron/configuration/Column.java
// public class Column {
//     private String name;
//     private String type;
//     private int size = -1;
//     private boolean shortlived;
//     private Map<String, String> parameters;
// 
//     public Column() {
// 
//     }
// 
//     public Column(String name, String type) {
//         this.name = name;
//         this.type = type;
//     }
// 
//     public Column(String name, String type, int size) {
//         this(name, type);
//         this.size = size;
//     }
// 
//     public Column(String name, String type, int size, boolean shortlived) {
//         this(name, type);
//         this.size = size;
//         this.shortlived = shortlived;
//     }
// 
//     public Column(String name, String type, int size, boolean shortlived, Map<String, String> parameters) {
//         this(name, type, size, shortlived);
//         this.parameters = parameters;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getType() {
//         return type;
//     }
// 
//     public void setType(String type) {
//         this.type = type;
//     }
// 
//     public int getSize() {
//         return size;
//     }
// 
//     public void setSize(int size) {
//         this.size = size;
//     }
// 
//     public boolean isShortLived() {
//         return shortlived;
//     }
// 
//     public void setShortlived(boolean shortlived) {
//         this.shortlived = shortlived;
//     }
// 
//     public Map<String, String> getParameters() {
//         return parameters;
//     }
// 
//     public void setParameters(Map<String, String> parameters) {
//         this.parameters = parameters;
//     }
// }
// 
// Path: src/main/java/com/rolfje/anonimatron/synonyms/NullSynonym.java
// public class NullSynonym implements Synonym {
// 	private final String type;
// 	
// 	public NullSynonym(String type) {
// 		this.type=type;
// 	}
// 	
// 	public String getType() {
// 		return type;
// 	}
// 
// 	public Object getFrom() {
// 		return null;
// 	}
// 
// 	public Object getTo() {
// 		return null;
// 	}
// 
// 	@Override
// 	public boolean isShortLived() {
// 		return true;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		return (obj != null) && (this.getClass() == obj.getClass()) && (this.hashCode() == obj.hashCode());
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return type.hashCode();
// 	}
// }
// 
// Path: src/main/java/com/rolfje/anonimatron/synonyms/Synonym.java
// public interface Synonym {
// 
// 	/**
// 	 * Indicates if this Synonym is short-lived or transient, meaning that
//      * it should not be stored in the synonyms file. Transient Synonyms
//      * are not stored, need to be calculated each run time.
// 	 *
// 	 * Transient synonyms are:
// 	 *
// 	 * <ol>
// 	 *     <li>Not stored in memory.</li>
// 	 *     <li>Not stored in the synonym file.</li>
// 	 * </ol>
// 	 *
// 	 * @return <code>true</code> if the synonym should be thrown away
// 	 * after use (not stored in the synonym file).
// 	 */
// 	boolean isShortLived();
// 
// 	/**
// 	 * @return The semantic data type of this Synonym, usually something
// 	 *         descriptive as "NAME" or "STREET".
// 	 */
// 	String getType();
// 
// 	/**
// 	 * @return The data which was in the original database for this Synonym
// 	 */
// 	Object getFrom();
// 
// 	/**
// 	 * 
// 	 * @return The data with which the original data in the database will be or
// 	 *         is replaced when the Anonymizer runs.
// 	 */
// 	Object getTo();
// }


// Path: src/main/java/com/rolfje/anonimatron/anonymizer/AnonymizerService.java
import com.rolfje.anonimatron.configuration.Column;
import com.rolfje.anonimatron.synonyms.NullSynonym;
import com.rolfje.anonimatron.synonyms.Synonym;
import org.apache.log4j.Logger;
import java.sql.Date;
import java.util.*;

		}

		LOG.info(anonymizers.size()+" anonymizers registered.");
	}

	public Set<String> getCustomAnonymizerTypes() {
		return Collections.unmodifiableSet(customAnonymizers.keySet());
	}

	public Set<String> getDefaultAnonymizerTypes() {
		return Collections.unmodifiableSet(defaultTypeMapping.keySet());
	}

	public Synonym anonymize(Column column, Object from) {
		if (from == null) {
			return new NullSynonym(column.getType());
		}

		// Find for regular type
		Synonym synonym = getSynonym(column, from);

		if (synonym == null) {
            Anonymizer anonymizer = getAnonymizer(column.getType());
            synonym = anonymizer.anonymize(from, column.getSize(), column.isShortLived(), column.getParameters());

			synonymCache.put(synonym);
		}
		return synonym;
	}

	private Synonym getSynonym(Column c, Object from) {