package org.ovirt.engine.core.common.utils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.ovirt.engine.core.common.businessentities.network.NetworkAttachment;
import org.ovirt.engine.core.compat.Guid;
public class MapNetworkAttachments {
private final Collection<NetworkAttachment> networkAttachments;
/*
*Pointless method to present to please static analyzer.
*/
public MapNetworkAttachments() {
this(new ArrayList<NetworkAttachment>(0));
}
public MapNetworkAttachments(Collection<NetworkAttachment> networkAttachments) {
this.networkAttachments = networkAttachments;
}
private <K, I> Map<K, I> group(CalculateKey<I, K> calculateKey, Collection<I> instances) {
Map<K, I> result = new HashMap<>(instances.size());
for (I instance : instances) {
result.put(calculateKey.keyFrom(instance), instance);
}
return result;
}
private <K, I> Map<K, Set<I>> groupMultipleValues(CalculateKey<I, K> calculateKey, Collection<I> instances) {
Map<K, Set<I>> result = new HashMap<>(instances.size());
for (I instance : instances) {
getSetForKey(calculateKey.keyFrom(instance), result).add(instance);
}
return result;
}
private <K, I> Set<I> getSetForKey(K key, Map<K, Set<I>> result) {
if (!result.containsKey(key)) {
HashSet<I> values = new HashSet<>();
result.put(key, values);
return values;
} else {
return result.get(key);
}
}
public Set<String> nicNames() {
Set<String> result = new HashSet<>();
for (NetworkAttachment attachment : networkAttachments) {
result.add(new ByNicName().keyFrom(attachment));
}
return result;
}
public Map<Guid, NetworkAttachment> byNetworkId() {
return group(new ByNetworkId(), networkAttachments);
}
public Map<Guid, Set<NetworkAttachment>> byNicId() {
return groupMultipleValues(new ByNicId(), networkAttachments);
}
private interface CalculateKey<I, K> {
K keyFrom(I instance);
}
private static class ByNetworkId implements CalculateKey<NetworkAttachment, Guid> {
@Override
public Guid keyFrom(NetworkAttachment networkAttachment) {
return networkAttachment.getNetworkId();
}
}
private static class ByNicName implements CalculateKey<NetworkAttachment, String> {
@Override
public String keyFrom(NetworkAttachment networkAttachment) {
return networkAttachment.getNicName();
}
}
private static class ByNicId implements CalculateKey<NetworkAttachment, Guid> {
@Override
public Guid keyFrom(NetworkAttachment networkAttachment) {
return networkAttachment.getNicId();
}
}
}