// Path: src/main/java/ca/sqlpower/dao/SPPersister.java
// public enum DataType {
// 	STRING("String", String.class),
// 	INTEGER("Integer", Integer.class),
// 	DOUBLE("Double", Double.class),
// 	BOOLEAN("Boolean", Boolean.class),
// 	SHORT("Short", Short.class),
// 	LONG("Long", Long.class),
// 	FLOAT("Float", Float.class),
// 		
// 	/**
// 	 * This is an {@link SPObject} reference.
// 	 */
// 	REFERENCE("Reference", String.class),
// 	PNG_IMG("PNG_IMG", InputStream.class),
// 	NULL("Null", null),
// 	BLOB("Blob", Blob.class);
// 		
// 	private final String name;
// 	private final Class<?> representation;
// 		
// 	private DataType(String name, Class<?> representation){
// 		this.name = name;
// 		this.representation = representation;
// 	}
// 
// 	public String getTypeName() {
// 		return name;
// 	}
// 
// 	public Class<?> getRepresentation() {
// 		return representation;
// 	}
// 		
// 	/**
// 	 * Returns a DataType that represents the given class type. The class given
// 	 * can be null
// 	 */
// 	public static DataType getTypeByClass(Class<?> lookupValue) {
// 		for (DataType type : values()) {
// 			if ((type.getRepresentation() == null && lookupValue == null) || 
// 					(lookupValue != null && type.getRepresentation() != null && 
// 							type.representation.isAssignableFrom(lookupValue))) {
// 				return type;
// 			}
// 		}
// 		throw new IllegalArgumentException("The class type " + lookupValue.getName() + 
// 				" does not exist as a type in this DataType enum");
// 	}
// }


import ca.sqlpower.object.annotation.NonBound;
import ca.sqlpower.object.annotation.NonProperty;
import ca.sqlpower.object.annotation.Transient;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.annotation.Nonnull;
import junit.framework.TestCase;
import ca.sqlpower.dao.PersistedSPOProperty;
import ca.sqlpower.dao.PersistedSPObject;
import ca.sqlpower.dao.SPPersister.DataType;
import ca.sqlpower.object.annotation.Accessor;
        
        propertiesToRemove = new ArrayList<PersistedSPOProperty>();
        propertiesToAdd = new ArrayList<PersistedSPOProperty>();
        
        diff = new Differ();
        
        testRevisionOneObjects.add(new PersistedSPObject(null, DiffTestClass.class.getName(), "1", 0));
        testRevisionOneObjects.add(new PersistedSPObject("1", DiffTestClass.class.getName(), "2", 0));
        testRevisionOneObjects.add(new PersistedSPObject("1", DiffTestClass.class.getName(), "3", 1));
        testRevisionOneObjects.add(new PersistedSPObject("1", DiffTestClass.class.getName(), "4", 2));
        testRevisionOneObjects.add(new PersistedSPObject("2", DiffTestClass.class.getName(), "5", 0));
        testRevisionOneObjects.add(new PersistedSPObject("2", DiffTestClass.class.getName(), "6", 1));
        testRevisionOneObjects.add(new PersistedSPObject("4", DiffTestClass.class.getName(), "7", 0));
                
        testRevisionOneProperties.add(new PersistedSPOProperty("1", "name", DataType.STRING, "A1", "A1", false));
        testRevisionOneProperties.add(new PersistedSPOProperty("2", "name", DataType.STRING, "B1", "B1", false));
        testRevisionOneProperties.add(new PersistedSPOProperty("3", "name", DataType.STRING, "B2", "B2", false));
        testRevisionOneProperties.add(new PersistedSPOProperty("4", "name", DataType.STRING, "B3", "B3", false));
        testRevisionOneProperties.add(new PersistedSPOProperty("5", "name", DataType.STRING, "C1", "C1", false));
        testRevisionOneProperties.add(new PersistedSPOProperty("6", "name", DataType.STRING, "C2", "C2", false));
        testRevisionOneProperties.add(new PersistedSPOProperty("7", "name", DataType.STRING, "D1", "D1", false));
        testRevisionOneProperties.add(new PersistedSPOProperty("2", "value", DataType.INTEGER, 1, 1, false));
        testRevisionOneProperties.add(new PersistedSPOProperty("7", "value", DataType.DOUBLE, 1.1, 1.1, false));
        
        testRevisionTwoObjects.add(new PersistedSPObject(null, DiffTestClass.class.getName(), "1", 0));
        testRevisionTwoObjects.add(new PersistedSPObject("1", DiffTestClass.class.getName(), "2", 0));
        testRevisionTwoObjects.add(new PersistedSPObject("1", DiffTestClass.class.getName(), "3", 1));
        testRevisionTwoObjects.add(new PersistedSPObject("1", DiffTestClass.class.getName(), "4", 2));
        testRevisionTwoObjects.add(new PersistedSPObject("2", DiffTestClass.class.getName(), "5", 0));
        testRevisionTwoObjects.add(new PersistedSPObject("2", DiffTestClass.class.getName(), "6", 1));
// Path: src/main/java/ca/sqlpower/dao/SPPersister.java
// public enum DataType {
// 	STRING("String", String.class),
// 	INTEGER("Integer", Integer.class),
// 	DOUBLE("Double", Double.class),
// 	BOOLEAN("Boolean", Boolean.class),
// 	SHORT("Short", Short.class),
// 	LONG("Long", Long.class),
// 	FLOAT("Float", Float.class),
// 		
// 	/**
// 	 * This is an {@link SPObject} reference.
// 	 */
// 	REFERENCE("Reference", String.class),
// 	PNG_IMG("PNG_IMG", InputStream.class),
// 	NULL("Null", null),
// 	BLOB("Blob", Blob.class);
// 		
// 	private final String name;
// 	private final Class<?> representation;
// 		
// 	private DataType(String name, Class<?> representation){
// 		this.name = name;
// 		this.representation = representation;
// 	}
// 
// 	public String getTypeName() {
// 		return name;
// 	}
// 
// 	public Class<?> getRepresentation() {
// 		return representation;
// 	}
// 		
// 	/**
// 	 * Returns a DataType that represents the given class type. The class given
// 	 * can be null
// 	 */
// 	public static DataType getTypeByClass(Class<?> lookupValue) {
// 		for (DataType type : values()) {
// 			if ((type.getRepresentation() == null && lookupValue == null) || 
// 					(lookupValue != null && type.getRepresentation() != null && 
// 							type.representation.isAssignableFrom(lookupValue))) {
// 				return type;
// 			}
// 		}
// 		throw new IllegalArgumentException("The class type " + lookupValue.getName() + 
// 				" does not exist as a type in this DataType enum");
// 	}
// }


// Path: src/test/java/ca/sqlpower/object/DifferTest.java
import ca.sqlpower.object.annotation.NonBound;
import ca.sqlpower.object.annotation.NonProperty;
import ca.sqlpower.object.annotation.Transient;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.annotation.Nonnull;
import junit.framework.TestCase;
import ca.sqlpower.dao.PersistedSPOProperty;
import ca.sqlpower.dao.PersistedSPObject;
import ca.sqlpower.dao.SPPersister.DataType;
import ca.sqlpower.object.annotation.Accessor;

        
        propertiesToRemove = new ArrayList<PersistedSPOProperty>();
        propertiesToAdd = new ArrayList<PersistedSPOProperty>();
        
        diff = new Differ();
        
        testRevisionOneObjects.add(new PersistedSPObject(null, DiffTestClass.class.getName(), "1", 0));
        testRevisionOneObjects.add(new PersistedSPObject("1", DiffTestClass.class.getName(), "2", 0));
        testRevisionOneObjects.add(new PersistedSPObject("1", DiffTestClass.class.getName(), "3", 1));
        testRevisionOneObjects.add(new PersistedSPObject("1", DiffTestClass.class.getName(), "4", 2));
        testRevisionOneObjects.add(new PersistedSPObject("2", DiffTestClass.class.getName(), "5", 0));
        testRevisionOneObjects.add(new PersistedSPObject("2", DiffTestClass.class.getName(), "6", 1));
        testRevisionOneObjects.add(new PersistedSPObject("4", DiffTestClass.class.getName(), "7", 0));
                
        testRevisionOneProperties.add(new PersistedSPOProperty("1", "name", DataType.STRING, "A1", "A1", false));
        testRevisionOneProperties.add(new PersistedSPOProperty("2", "name", DataType.STRING, "B1", "B1", false));
        testRevisionOneProperties.add(new PersistedSPOProperty("3", "name", DataType.STRING, "B2", "B2", false));
        testRevisionOneProperties.add(new PersistedSPOProperty("4", "name", DataType.STRING, "B3", "B3", false));
        testRevisionOneProperties.add(new PersistedSPOProperty("5", "name", DataType.STRING, "C1", "C1", false));
        testRevisionOneProperties.add(new PersistedSPOProperty("6", "name", DataType.STRING, "C2", "C2", false));
        testRevisionOneProperties.add(new PersistedSPOProperty("7", "name", DataType.STRING, "D1", "D1", false));
        testRevisionOneProperties.add(new PersistedSPOProperty("2", "value", DataType.INTEGER, 1, 1, false));
        testRevisionOneProperties.add(new PersistedSPOProperty("7", "value", DataType.DOUBLE, 1.1, 1.1, false));
        
        testRevisionTwoObjects.add(new PersistedSPObject(null, DiffTestClass.class.getName(), "1", 0));
        testRevisionTwoObjects.add(new PersistedSPObject("1", DiffTestClass.class.getName(), "2", 0));
        testRevisionTwoObjects.add(new PersistedSPObject("1", DiffTestClass.class.getName(), "3", 1));
        testRevisionTwoObjects.add(new PersistedSPObject("1", DiffTestClass.class.getName(), "4", 2));
        testRevisionTwoObjects.add(new PersistedSPObject("2", DiffTestClass.class.getName(), "5", 0));
        testRevisionTwoObjects.add(new PersistedSPObject("2", DiffTestClass.class.getName(), "6", 1));
        testRevisionTwoObjects.add(new PersistedSPObject("4", DiffTestClass.class.getName(), "7", 0));