package org.ovirt.engine.core.utils;
import org.ovirt.engine.core.compat.*;
import org.ovirt.engine.core.compat.backendcompat.PropertyInfo;
import org.ovirt.engine.core.compat.backendcompat.TypeCompat;
public final class ObjectCompareUtils {
/**
* Compare two collections from same type and check if their data are same
*
* @param from
* first collection
* @param to
* second collection
* @param idField
* name of the identifier field in underline object
* @param properties
* list of properties to compare. If all the properties of all objects have the same value - collections
* decided to be equal
* @return
*/
public static boolean IsDataChanged(java.util.Collection from, java.util.Collection to, String idField,
java.util.ArrayList<String> properties) {
boolean returnValue = true;
try {
// First check if both collection have same count of members
if (from.size() == to.size()) {
// Create temporary hashtable from first collection to easy data
// access
// Hash table structure: kye:Id value: object
java.util.Hashtable table = CreateHashtable(from, idField);
/**
* Check if in both lists stored members with same Ids
*/
if (IsListsSame(table, to, idField)) {
/**
* Check if in both lists members have same value of identification properties
*/
returnValue = !IsListsEqual(table, to, idField, properties);
}
}
}
/**
* if one of functions failed - data wrong. Data decided be changed
*/
catch (java.lang.Exception e) {
}
return returnValue;
}
private static java.util.Hashtable CreateHashtable(java.util.Collection collection, String idField) {
java.util.Hashtable table = new java.util.Hashtable();
if (collection != null) {
for (Object obj : collection) {
java.lang.Class type = obj.getClass();
Object id = TypeCompat.GetProperty(type, idField).GetValue(obj, null);
table.put(id, obj);
}
}
return table;
}
private static boolean IsListsSame(java.util.Hashtable table, java.util.Collection collection, String idField) {
for (Object obj : collection) {
java.lang.Class type = obj.getClass();
Object id = TypeCompat.GetProperty(type, idField).GetValue(obj, null);
if (!table.containsKey(id)) {
return false;
}
}
return true;
}
private static boolean IsListsEqual(java.util.Hashtable table, java.util.Collection collection, String idField,
java.util.ArrayList<String> props) {
for (Object obj : collection) {
java.lang.Class type = obj.getClass();
Object id = TypeCompat.GetProperty(type, idField).GetValue(obj, null);
Object second = table.get(id);
if (!IsObjectsEqual(obj, second, props)) {
return false;
}
}
return true;
}
public static boolean IsObjectsEqual(Object first, Object second, java.util.ArrayList<String> props) {
java.lang.Class type = first.getClass();
if (type != second.getClass()) {
return false;
}
for (String property : props) {
PropertyInfo firstProperty = TypeCompat.GetProperty(type, property);
if (firstProperty == null) {
log.errorFormat(
"A property with name {0} was not found on object of type {1}. Please remove it from the Changable Property List.",
property,
type.getName());
continue;
}
Object firstValue = firstProperty.GetValue(first, null);
Object secondValue = TypeCompat.GetProperty(type, property).GetValue(second, null);
if (firstValue != null && !firstValue.equals(secondValue) || ((firstValue == null && secondValue != null))) {
return false;
}
}
return true;
}
public static void GetDiffBetweenGroups(java.util.Collection OriginalItems, java.util.Collection UpdatedItems,
String IdentifierAttribute, RefObject<java.util.ArrayList> NewItems,
RefObject<java.util.ArrayList> DeletedItems) {
NewItems.argvalue = new java.util.ArrayList();
DeletedItems.argvalue = new java.util.ArrayList();
java.util.Hashtable htOriginal = CreateHashtable(OriginalItems, IdentifierAttribute);
java.util.Hashtable htUpdated = CreateHashtable(UpdatedItems, IdentifierAttribute);
for (Object oldItemKey : htOriginal.keySet()) {
if (!htUpdated.contains(oldItemKey)) {
DeletedItems.argvalue.add(htOriginal.get(oldItemKey));
}
}
for (Object newItemKey : htUpdated.keySet()) {
if (!htOriginal.contains(newItemKey)) {
NewItems.argvalue.add(htUpdated.get(newItemKey));
}
}
}
public static void GetDiffBetweenGroups(java.util.List OriginalItems, java.util.List UpdatedItems,
RefObject<java.util.ArrayList> NewItems, RefObject<java.util.ArrayList> DeletedItems) {
NewItems.argvalue = new java.util.ArrayList();
DeletedItems.argvalue = new java.util.ArrayList();
for (Object oldItem : OriginalItems) {
if (!UpdatedItems.contains(oldItem)) {
DeletedItems.argvalue.add(oldItem);
}
}
for (Object newItem : UpdatedItems) {
if (!OriginalItems.contains(newItem)) {
NewItems.argvalue.add(newItem);
}
}
}
private static LogCompat log = LogFactoryCompat.getLog(ObjectCompareUtils.class);
}