package org.javers.guava;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
import org.javers.common.collections.EnumerableFunction;
import org.javers.common.validation.Validate;
import org.javers.core.metamodel.object.OwnerContext;
import org.javers.core.metamodel.type.KeyValueType;
import org.javers.core.metamodel.type.MapEnumerationOwnerContext;
import org.javers.core.metamodel.type.MapType;
import java.lang.reflect.Type;
import java.util.function.Function;
import static org.javers.guava.Multimaps.toNotNullMultimap;
/**
* @author akrystian
*/
public class MultimapType extends KeyValueType {
public static MultimapType getInstance(){
return new MultimapType(Multimap.class);
}
public MultimapType(Type baseJavaType) {
super(baseJavaType,2);
}
/**
* @return immutable Multimap
*/
@Override
public Multimap map(Object sourceEnumerable, EnumerableFunction mapFunction, OwnerContext owner) {
Validate.argumentIsNotNull(mapFunction);
Multimap sourceMultimap = toNotNullMultimap(sourceEnumerable);
Multimap targetMultimap = ArrayListMultimap.create();
MapEnumerationOwnerContext enumeratorContext = new MapEnumerationOwnerContext(owner, true);
MapType.mapEntrySet(sourceMultimap.entries(), mapFunction, enumeratorContext, (k,v) -> targetMultimap.put(k,v));
return Multimaps.unmodifiableMultimap(targetMultimap);
}
@Override
public boolean isEmpty(Object container){
return container == null || ((Multimap) container).isEmpty();
}
/**
* Nulls keys are filtered
*/
@Override
public Object map(Object sourceEnumerable, Function mapFunction) {
Validate.argumentIsNotNull(mapFunction);
Multimap sourceMultimap = toNotNullMultimap(sourceEnumerable);
Multimap targetMultimap = ArrayListMultimap.create();
MapType.mapEntrySetFilterNulls(sourceMultimap.entries(), mapFunction, (k,v) -> targetMultimap.put(k,v));
return targetMultimap;
}
}