package org.javers.core.diff.appenders;
import org.javers.core.diff.NodePair;
import org.javers.core.diff.changetype.ValueChange;
import org.javers.core.metamodel.property.Property;
import org.javers.core.metamodel.type.EntityType;
import org.javers.core.metamodel.type.JaversType;
import org.javers.core.metamodel.type.ManagedType;
import org.javers.core.metamodel.type.PrimitiveOrValueType;
import java.util.Objects;
import static org.javers.common.reflection.ReflectionUtil.reflectiveToString;
/**
* @author bartosz walacik
*/
class ValueChangeAppender extends CorePropertyChangeAppender<ValueChange> {
@Override
public boolean supports(JaversType propertyType) {
return propertyType instanceof PrimitiveOrValueType;
}
/**
* @param property supported property (of PrimitiveType or ValueObjectType)
*/
@Override
public ValueChange calculateChanges(NodePair pair, Property property) {
Object leftValue = pair.getLeftPropertyValue(property);
Object rightValue = pair.getRightPropertyValue(property);
//special treatment for EmbeddedId - could be ValueObjects without good equals() implementation
if (isIdProperty(pair, property)) {
if (Objects.equals(reflectiveToString(leftValue),
reflectiveToString(rightValue))){
return null;
}
}else {
if (Objects.equals(leftValue, rightValue)) {
return null;
}
}
return new ValueChange(pair.getGlobalId(), property.getName(), leftValue, rightValue);
}
private boolean isIdProperty(NodePair nodePair, Property property){
ManagedType managedType = nodePair.getManagedType();
if (managedType instanceof EntityType) {
return ((EntityType)managedType).getIdProperty().equals(property);
}
return false;
}
}