package org.javers.core.diff.changetype.container;
import org.javers.common.collections.Lists;
import org.javers.common.validation.Validate;
import org.javers.core.commit.CommitMetadata;
import org.javers.core.diff.changetype.PropertyChange;
import org.javers.core.metamodel.object.GlobalId;
import java.util.*;
import static org.javers.common.string.ToStringBuilder.addEnumField;
/**
* Collection or Array change
*
* @author bartosz walacik
*/
public abstract class ContainerChange extends PropertyChange {
private final List<ContainerElementChange> changes;
ContainerChange(GlobalId affectedCdoId, String propertyName, List<ContainerElementChange> changes, Optional<CommitMetadata> commitMetadata) {
super(affectedCdoId, propertyName, commitMetadata);
Validate.argumentIsNotNull(changes);
Validate.argumentCheck(!changes.isEmpty(),"changes list should not be empty");
this.changes = Collections.unmodifiableList(new ArrayList<>(changes));
}
public List<ContainerElementChange> getChanges() {
return changes;
}
public List<ValueAdded> getValueAddedChanges() {
return (List)Lists.positiveFilter(changes, input -> input instanceof ValueAdded);
}
public List<ValueRemoved> getValueRemovedChanges() {
return (List)Lists.positiveFilter(changes, input -> input instanceof ValueRemoved);
}
public List<?> getAddedValues() {
return Lists.transform(getValueAddedChanges(), input -> input.getAddedValue());
}
public List<?> getRemovedValues() {
return Lists.transform(getValueRemovedChanges(), input -> input.getRemovedValue());
}
@Override
protected String fieldsToString() {
StringBuilder changesAsString = new StringBuilder();
for (ContainerElementChange c : changes){
if (changesAsString.length() > 0) { changesAsString.append(", "); }
changesAsString.append(c);
}
return super.fieldsToString() + addEnumField("containerChanges", changesAsString);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof ContainerChange) {
ContainerChange that = (ContainerChange) obj;
return super.equals(that)
&& Objects.equals(this.changes, that.changes);
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), changes);
}
}