org.javers.core.diff.appenders.levenshtein.LevenshteinListChangeAppender Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of javers-core Show documentation
Show all versions of javers-core Show documentation
JaVers - object auditing and diff framework for Java
package org.javers.core.diff.appenders.levenshtein;
import org.javers.common.validation.Validate;
import org.javers.core.diff.EqualsFunction;
import org.javers.core.diff.NodePair;
import org.javers.core.diff.appenders.CorePropertyChangeAppender;
import org.javers.core.diff.changetype.container.ContainerElementChange;
import org.javers.core.diff.changetype.container.ListChange;
import org.javers.core.metamodel.object.*;
import org.javers.core.metamodel.property.Property;
import org.javers.core.metamodel.type.*;
import java.util.List;
/**
* @author kornel kielczewski
*/
public class LevenshteinListChangeAppender extends CorePropertyChangeAppender {
private final TypeMapper typeMapper;
LevenshteinListChangeAppender(TypeMapper typeMapper) {
Validate.argumentsAreNotNull(typeMapper);
this.typeMapper = typeMapper;
}
@Override
public boolean supports(JaversType propertyType) {
return propertyType instanceof ListType;
}
@Override
public ListChange calculateChanges(Object leftValue, Object rightValue, NodePair pair, JaversProperty property) {
JaversType itemType = typeMapper.getContainerItemType(property);
final List leftList = (List) leftValue;
final List rightList = (List) rightValue;
EqualsFunction equalsFunction = itemType::equals;
Backtrack backtrack = new Backtrack(equalsFunction);
StepsToChanges stepsToChanges = new StepsToChanges(equalsFunction);
final BacktrackSteps[][] steps = backtrack.evaluateSteps(leftList, rightList);
final List changes = stepsToChanges.convert(steps, leftList, rightList);
ListChange result = getListChange(pair, property, changes);
if (result != null) {
renderNotParametrizedWarningIfNeeded(itemType.getBaseJavaType(), "item", "List", property);
}
return result;
}
private ListChange getListChange(NodePair pair, JaversProperty property, List changes) {
final ListChange result;
if (changes.size() == 0) {
result = null;
} else {
result = new ListChange(pair.createPropertyChangeMetadata(property), changes);
}
return result;
}
}