package fr.openwide.core.jpa.more.business.difference.access;
import java.util.Map;
import com.google.common.collect.Multimap;
import de.danielbechler.diff.access.Accessor;
import de.danielbechler.diff.selector.ElementSelector;
import fr.openwide.core.jpa.more.business.difference.selector.MapValueByKeySelector;
public class MultimapValueByKeyAccessor<K> implements Accessor, IKeyAwareAccessor<K> {
private final K key;
public MultimapValueByKeyAccessor(K key) {
super();
this.key = key;
}
@Override
public K getKey() {
return key;
}
@Override
public ElementSelector getElementSelector() {
return new MapValueByKeySelector<>(key);
}
@SuppressWarnings("rawtypes")
protected Map objectToMap(Object object) {
if (object == null) {
return null;
} else if (object instanceof Multimap) {
return ((Multimap) object).asMap();
} else {
throw new IllegalArgumentException("Expecting a Multimap");
}
}
@Override
public Object get(final Object target) {
final Map<?, ?> targetMap = objectToMap(target);
if (targetMap != null) {
return targetMap.get(key);
}
return null;
}
@SuppressWarnings({"rawtypes", "unchecked"})
@Override
public void set(final Object target, final Object value) {
final Map targetMap = objectToMap(target);
if (targetMap != null) {
targetMap.put(key, value);
}
}
@Override
public void unset(final Object target) {
final Map<?, ?> targetMap = objectToMap(target);
if (targetMap != null) {
targetMap.remove(key);
}
}
}