/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs.module.webservices.helper;
import java.util.Collection;
import java.util.Comparator;
/**
* Hibernate does not allow for replacing a collection in an attached object. The collection must be
* updated instead. This class is used to manipulate an existing collection property when calling
* set, by delegating to proper add and remove methods on the given instance and using a custom
* comparator for elements.
*
* @param <T>
* @param <E>
*/
public abstract class HibernateCollectionHelper<T, E> implements Comparator<E> {
protected T instance;
public HibernateCollectionHelper(T instance) {
this.instance = instance;
}
public abstract Collection<E> getAll();
public abstract void add(E item);
public abstract void remove(E item);
public void set(Collection<E> items) {
//delete objects which are absent in new list
for (E oldItem : getAll()) {
boolean found = false;
for (E newItem : items) {
if (compare(oldItem, newItem) == 0) {
found = true;
break;
}
}
if (!found) {
remove(oldItem);
}
}
//add objects which are absent in old list
for (E newItem : items) {
boolean found = false;
for (E oldItem : getAll()) {
if (compare(oldItem, newItem) == 0) {
found = true;
break;
}
}
if (!found) {
add(newItem);
}
}
}
}