/* Copyright 2008, 2009, 2010 by the Oxford University Computing Laboratory
This file is part of HermiT.
HermiT is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
HermiT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with HermiT. If not, see <http://www.gnu.org/licenses/>.
*/
package org.semanticweb.HermiT.hierarchy;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.semanticweb.HermiT.model.AtomicRole;
import org.semanticweb.HermiT.model.Individual;
public class RoleElementManager {
public static final String LB=System.getProperty("line.separator");
protected final Map<AtomicRole,RoleElement> m_roleToElement;
protected RoleElementManager() {
m_roleToElement=new HashMap<AtomicRole, RoleElement>();
}
public RoleElement getRoleElement(AtomicRole role) {
if (m_roleToElement.containsKey(role))
return m_roleToElement.get(role);
else {
RoleElement element=new RoleElement(role);
m_roleToElement.put(role, element);
return element;
}
}
public String toString() {
StringBuffer buffer=new StringBuffer();
for (AtomicRole role : m_roleToElement.keySet()) {
buffer.append(role);
buffer.append(" -> ");
buffer.append(m_roleToElement.get(role).toString());
buffer.append(LB);
}
return buffer.toString();
}
public class RoleElement {
protected final AtomicRole m_role;
protected Map<Individual,Set<Individual>> m_knownRelations;
protected Map<Individual,Set<Individual>> m_possibleRelations;
protected RoleElement(AtomicRole role) {
m_role=role;
m_knownRelations=new HashMap<Individual,Set<Individual>>();
m_possibleRelations=new HashMap<Individual,Set<Individual>>();
}
public AtomicRole getRole() {
return m_role;
}
public boolean isKnown(Individual individual1, Individual individual2) {
return m_knownRelations.containsKey(individual1) && m_knownRelations.get(individual1).contains(individual2);
}
public boolean isPossible(Individual individual1, Individual individual2) {
return m_possibleRelations.containsKey(individual1) && m_possibleRelations.get(individual1).contains(individual2);
}
public Map<Individual,Set<Individual>> getKnownRelations() {
return m_knownRelations;
}
public Map<Individual,Set<Individual>> getPossibleRelations() {
return m_possibleRelations;
}
public boolean hasPossibles() {
return !m_possibleRelations.isEmpty();
}
public void setToKnown(Individual individual1, Individual individual2) {
Set<Individual> successors=m_possibleRelations.get(individual1);
successors.remove(individual2);
if (successors.isEmpty())
m_possibleRelations.remove(individual1);
addKnown(individual1, individual2);
}
public boolean addKnown(Individual individual1, Individual individual2) {
Set<Individual> successors=m_knownRelations.get(individual1);
if (successors==null) {
successors=new HashSet<Individual>();
m_knownRelations.put(individual1, successors);
}
return successors.add(individual2);
}
public boolean addKnowns(Individual individual, Set<Individual> individuals) {
Set<Individual> successors=m_knownRelations.get(individual);
if (successors==null) {
successors=new HashSet<Individual>();
m_knownRelations.put(individual, successors);
}
return successors.addAll(individuals);
}
public boolean removeKnown(Individual individual1, Individual individual2) {
Set<Individual> successors=m_knownRelations.get(individual1);
boolean removed=false;
if (successors!=null) {
removed=successors.remove(individual2);
if (successors.isEmpty())
m_knownRelations.remove(individual1);
}
return removed;
}
public boolean addPossible(Individual individual1, Individual individual2) {
Set<Individual> successors=m_possibleRelations.get(individual1);
if (successors==null) {
successors=new HashSet<Individual>();
m_possibleRelations.put(individual1, successors);
}
return successors.add(individual2);
}
public boolean removePossible(Individual individual1, Individual individual2) {
Set<Individual> successors=m_possibleRelations.get(individual1);
boolean removed=false;
if (successors!=null) {
removed=successors.remove(individual2);
if (successors.isEmpty())
m_possibleRelations.remove(individual1);
}
return removed;
}
public boolean addPossibles(Individual individual, Set<Individual> individuals) {
Set<Individual> successors=m_possibleRelations.get(individual);
if (successors==null) {
successors=new HashSet<Individual>();
m_possibleRelations.put(individual, successors);
}
return successors.addAll(individuals);
}
public String toString() {
StringBuffer buffer=new StringBuffer();
buffer.append(m_role);
buffer.append(" (known instances: ");
boolean notfirst=false;
for (Individual individual : m_knownRelations.keySet()) {
for (Individual successor : m_knownRelations.get(individual)) {
if (notfirst) {
buffer.append(", ");
notfirst=true;
}
buffer.append("(");
buffer.append(individual.toString());
buffer.append(", ");
buffer.append(successor.toString());
buffer.append(")");
}
}
buffer.append(" | possible instances: ");
notfirst=false;
for (Individual individual : m_possibleRelations.keySet()) {
for (Individual successor : m_possibleRelations.get(individual)) {
if (notfirst) {
buffer.append(", ");
notfirst=true;
}
buffer.append("(");
buffer.append(individual.toString());
buffer.append(", ");
buffer.append(successor.toString());
buffer.append(")");
}
}
buffer.append(") ");
return buffer.toString();
}
}
}