package org.cad.interruptus.repository;
import com.google.common.collect.MapDifference.ValueDifference;
import com.google.common.collect.MapDifference;
import com.google.common.collect.Maps;
import java.util.HashMap;
import java.util.Map;
import org.cad.interruptus.entity.Configuration;
import org.cad.interruptus.entity.Entity;
public class ConfigDiffTool
{
final Configuration oldConfig;
final Configuration newConfig;
final Map<Class, MapDifference<String, Entity>> diffMap = new HashMap<>();
public ConfigDiffTool(final Configuration oldConfig, final Configuration newConfig)
{
this.oldConfig = oldConfig;
this.newConfig = newConfig;
}
public void compute(final Class<? extends Entity> clazz)
{
diffMap.put(clazz, Maps.difference(oldConfig.mapOf(clazz), newConfig.mapOf(clazz)));
}
public MapDifference<String, Entity> getDiff(final Class<? extends Entity> clazz)
{
if ( ! diffMap.containsKey(clazz)) {
compute(clazz);
}
return diffMap.get(clazz);
}
public Map<String, Entity> computeInsertMap(final Class<? extends Entity> clazz)
{
final MapDifference<String, Entity> diff = getDiff(clazz);
final Map<String, Entity> result = diff.entriesOnlyOnRight();
return result;
}
public Map<String, Entity> computeDeleteMap(final Class<? extends Entity> clazz)
{
final MapDifference<String, Entity> diff = getDiff(clazz);
final Map<String, Entity> result = diff.entriesOnlyOnLeft();
return result;
}
public Map<String, Entity> computeUpdateMap(final Class<? extends Entity> clazz)
{
final Map<String, Entity> result = new HashMap<>();
final MapDifference<String, Entity> diff = getDiff(clazz);
final Map<String, ValueDifference<Entity>> differing = diff.entriesDiffering();
for (final Map.Entry<String, ValueDifference<Entity>> entry : differing.entrySet()) {
final String key = entry.getKey();
final ValueDifference<Entity> value = entry.getValue();
result.put(key, value.rightValue());
}
return result;
}
}