package org.javers.core.diff.appenders;
import org.javers.common.collections.Lists;
import org.javers.core.diff.NodePair;
import org.javers.core.diff.changetype.container.ContainerElementChange;
import org.javers.core.diff.changetype.container.ListChange;
import org.javers.core.diff.changetype.map.EntryChange;
import org.javers.core.metamodel.object.OwnerContext;
import org.javers.core.metamodel.object.PropertyOwnerContext;
import org.javers.core.metamodel.property.Property;
import org.javers.core.metamodel.type.*;
import java.util.List;
import static org.javers.common.collections.Lists.asMap;
/**
* @author pawel szymczyk
*/
public class SimpleListChangeAppender extends CorePropertyChangeAppender<ListChange> {
private final MapChangeAppender mapChangeAppender;
private final TypeMapper typeMapper;
SimpleListChangeAppender(MapChangeAppender mapChangeAppender, TypeMapper typeMapper) {
this.mapChangeAppender = mapChangeAppender;
this.typeMapper = typeMapper;
}
@Override
public boolean supports(JaversType propertyType) {
return propertyType instanceof ListType;
}
@Override
public ListChange calculateChanges(final NodePair pair, final Property property) {
List leftList = (List) pair.getLeftPropertyValue(property);
List rightList = (List) pair.getRightPropertyValue(property);
ListType listType = ((JaversProperty) property).getType();
OwnerContext owner = new PropertyOwnerContext(pair.getGlobalId(), property.getName());
MapContentType mapContentType = typeMapper.getMapContentType(listType);
List<EntryChange> entryChanges =
mapChangeAppender.calculateEntryChanges(asMap(leftList), asMap(rightList), owner, mapContentType);
if (!entryChanges.isEmpty()){
List<ContainerElementChange> elementChanges = Lists.transform(entryChanges, new MapChangesToListChangesFunction());
renderNotParametrizedWarningIfNeeded(listType.getItemType(), "item", "List", property);
return new ListChange(pair.getGlobalId(), property.getName(), elementChanges);
}
else {
return null;
}
}
}