package com.ctrip.framework.apollo.portal.component;
import com.ctrip.framework.apollo.common.dto.ItemChangeSets;
import com.ctrip.framework.apollo.common.dto.ItemDTO;
import com.ctrip.framework.apollo.common.utils.BeanUtils;
import com.ctrip.framework.apollo.core.utils.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@Component
public class ItemsComparator {
public ItemChangeSets compareIgnoreBlankAndCommentItem(long baseNamespaceId, List<ItemDTO> baseItems, List<ItemDTO> targetItems){
List<ItemDTO> filteredSourceItems = filterBlankAndCommentItem(baseItems);
List<ItemDTO> filteredTargetItems = filterBlankAndCommentItem(targetItems);
Map<String, ItemDTO> sourceItemMap = BeanUtils.mapByKey("key", filteredSourceItems);
Map<String, ItemDTO> targetItemMap = BeanUtils.mapByKey("key", filteredTargetItems);
ItemChangeSets changeSets = new ItemChangeSets();
for (ItemDTO item: targetItems){
String key = item.getKey();
ItemDTO sourceItem = sourceItemMap.get(key);
if (sourceItem == null){//add
ItemDTO copiedItem = copyItem(item);
copiedItem.setNamespaceId(baseNamespaceId);
changeSets.addCreateItem(copiedItem);
}else if (!Objects.equals(sourceItem.getValue(), item.getValue())){//update
//only value & comment can be update
sourceItem.setValue(item.getValue());
sourceItem.setComment(item.getComment());
changeSets.addUpdateItem(sourceItem);
}
}
for (ItemDTO item: baseItems){
String key = item.getKey();
ItemDTO targetItem = targetItemMap.get(key);
if(targetItem == null){//delete
changeSets.addDeleteItem(item);
}
}
return changeSets;
}
private List<ItemDTO> filterBlankAndCommentItem(List<ItemDTO> items){
List<ItemDTO> result = new LinkedList<>();
if (CollectionUtils.isEmpty(items)){
return result;
}
for (ItemDTO item: items){
if (!StringUtils.isEmpty(item.getKey())){
result.add(item);
}
}
return result;
}
private ItemDTO copyItem(ItemDTO sourceItem){
ItemDTO copiedItem = new ItemDTO();
copiedItem.setKey(sourceItem.getKey());
copiedItem.setValue(sourceItem.getValue());
copiedItem.setComment(sourceItem.getComment());
return copiedItem;
}
}