package ru.hflabs.rcd.event.modify; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Collections2; import lombok.Getter; import org.springframework.util.Assert; import ru.hflabs.rcd.event.ContextEvent; import ru.hflabs.rcd.model.change.ChangeMode; import ru.hflabs.rcd.model.change.ChangeSet; import ru.hflabs.rcd.model.change.ChangeType; import java.util.Collection; /** * Класс <class>ModifyEvent</class> содержит информацию о событии изменения объектов * * @see ChangeSet * @see ChangeType */ @Getter public abstract class ModifyEvent extends ContextEvent { private static final long serialVersionUID = 1557156668568360970L; /** Набор изменений */ private final ChangeSet<?> changeSet; public ModifyEvent(Object source, ChangeSet<?> changeSet) { super(source); this.changeSet = changeSet; } public Class<?> getChangedClass() { return changeSet.targetClass; } public ChangeType getChangeType() { return changeSet.changeType; } public ChangeMode getChangeMode() { return changeSet.changeMode; } public <T> Collection<T> getChanged(Class<T> expectedClass) { return getChanged(expectedClass, Predicates.<T>alwaysTrue()); } public <T> Collection<T> getChanged(final Class<T> expectedClass, Predicate<T> predicate) { Assert.isTrue(getChangedClass().equals(expectedClass), "Expected class is not equals changed class"); Assert.notNull(predicate, "Filter predicate must not be NULL"); Collection<T> targetCollection = Collections2.transform(changeSet.getChanged(), new Function<Object, T>() { @Override public T apply(Object input) { return expectedClass.cast(input); } }); return Collections2.filter(targetCollection, predicate); } }