package ru.hflabs.rcd.model.change;
import com.google.common.base.Function;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import org.springframework.util.CollectionUtils;
import ru.hflabs.rcd.model.Historical;
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
/**
* Класс <class>ChangeSet</class> содержит набор сущностей с однотипными изменениями
*
* @see History
* @see ChangeType
*/
public final class ChangeSet<E> implements Serializable {
private static final long serialVersionUID = 5829683980564622438L;
/** Класс изменившихся объектов */
public final Class<E> targetClass;
/** Тип изменения */
public final ChangeType changeType;
/** Режим изменения */
public final ChangeMode changeMode;
/** Коллекция изменений */
private final Collection<E> changed;
public ChangeSet(Class<E> targetClass, ChangeType changeType, ChangeMode changeMode) {
this(targetClass, changeType, changeMode, Lists.<E>newArrayList());
}
public ChangeSet(Class<E> targetClass, ChangeType changeType, ChangeMode changeMode, Collection<E> changed) {
this.targetClass = targetClass;
this.changeType = changeType;
this.changeMode = changeMode;
this.changed = changed;
}
public void appendChange(E change) {
changed.add(change);
}
public void appendChanges(Collection<E> changes) {
changed.addAll(changes);
}
public boolean isEmpty() {
return changed.isEmpty();
}
public Collection<E> getChanged() {
return Collections.unmodifiableCollection(changed);
}
public Collection<History> getChanges() {
return (Historical.class.isAssignableFrom(targetClass) && !CollectionUtils.isEmpty(changed)) ?
Collections2.transform(changed, new Function<E, History>() {
@Override
public History apply(E input) {
return ((Historical) input).getHistory();
}
}) :
Collections.<History>emptyList();
}
}