package org.projectusus.core.filerelations.model;
import static com.google.common.collect.Sets.union;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import net.sourceforge.c4j.ContractReference;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
@ContractReference( contractClassName = "RelationsContract" )
public class Relations<K> {
protected final Multimap<K, Relation<K>> incomingRelations;
protected final Multimap<K, Relation<K>> outgoingRelations;
public Relations() {
incomingRelations = ArrayListMultimap.create();
outgoingRelations = ArrayListMultimap.create();
}
public Set<Relation<K>> getDirectRelationsFrom( K sourceFile ) {
return getAsSet( outgoingRelations.get( sourceFile ) );
}
public Set<Relation<K>> getDirectRelationsTo( K targetFile ) {
return getAsSet( incomingRelations.get( targetFile ) );
}
public void removeDirectRelationsFrom( K sourceFile ) {
outgoingRelations.removeAll( sourceFile );
}
public Collection<Relation<K>> getAllDirectRelations() {
return Collections.unmodifiableSet( getAsSet( outgoingRelations.values() ) );
}
protected void add( K sourceKey, K targetKey ) {
Relation<K> relation = new Relation<K>( sourceKey, targetKey );
outgoingRelations.put( sourceKey, relation );
incomingRelations.put( targetKey, relation );
}
public void remove( K sourceKey, K targetKey ) {
Relation<K> relation = new Relation<K>( sourceKey, targetKey );
outgoingRelations.remove( sourceKey, relation );
incomingRelations.remove( targetKey, relation );
}
public boolean containsKey( K key ) {
return outgoingRelations.containsKey( key ) || incomingRelations.containsKey( key );
}
public Set<K> keySet() {
return union( outgoingRelations.keySet(), incomingRelations.keySet() );
}
protected Collection<Relation<K>> getAllOutgoingRelationsFrom( K key ) {
return outgoingRelations.get( key );
}
protected Collection<Relation<K>> getAllIncomingRelationsTo( K key ) {
return incomingRelations.get( key );
}
private HashSet<Relation<K>> getAsSet( Collection<Relation<K>> collection ) {
return Sets.newHashSet( collection );
}
}