/* Copyright 2009 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.debugger.commands;
import java.io.CharArrayWriter;
import java.io.PrintWriter;
import java.util.Set;
import java.util.TreeSet;
import org.semanticweb.HermiT.debugger.Debugger;
import org.semanticweb.HermiT.debugger.Printing;
import org.semanticweb.HermiT.model.Concept;
import org.semanticweb.HermiT.model.DLPredicate;
import org.semanticweb.HermiT.tableau.ExtensionTable;
import org.semanticweb.HermiT.tableau.Node;
public class ShowModelCommand extends AbstractCommand {
public ShowModelCommand(Debugger debugger) {
super(debugger);
}
public String getCommandName() {
return "showModel";
}
public String[] getDescription() {
return new String[] {
"","prints all assertions",
"predicate","prints all assertions for the given predicate"
};
}
public void printHelp(PrintWriter writer) {
writer.println("usage: showModel");
writer.println(" Prints the entire current model.");
writer.println("usage: showModel predicate");
writer.println(" Prints all assertions containing the supplied predicate.");
}
public void execute(String[] args) {
Set<Object[]> facts=new TreeSet<Object[]>(Printing.FactComparator.INSTANCE);
String title;
if (args.length<2) {
for (ExtensionTable extensionTable : m_debugger.getTableau().getExtensionManager().getExtensionTables()) {
ExtensionTable.Retrieval retrieval=extensionTable.createRetrieval(new boolean[extensionTable.getArity()],ExtensionTable.View.TOTAL);
loadFacts(facts,retrieval);
}
title="Current model";
}
else {
DLPredicate dlPredicate=null;
try {
dlPredicate = getDLPredicate(args[1]);
} catch (Exception e) {
m_debugger.getOutput().println(args[1]+" is invalid: "+e.getMessage());
}
if (dlPredicate!=null) {
ExtensionTable extensionTable=m_debugger.getTableau().getExtensionManager().getExtensionTable(dlPredicate.getArity()+1);
boolean[] bindings=new boolean[extensionTable.getArity()];
bindings[0]=true;
ExtensionTable.Retrieval retrieval=extensionTable.createRetrieval(bindings,ExtensionTable.View.TOTAL);
retrieval.getBindingsBuffer()[0]=dlPredicate;
loadFacts(facts,retrieval);
title="Assertions containing the predicate '"+m_debugger.getPrefixes().abbreviateIRI(dlPredicate.toString())+"'.";
}
else {
int nodeID;
try {
nodeID=Integer.parseInt(args[1]);
}
catch (NumberFormatException e) {
m_debugger.getOutput().println("Invalid ID of the node.");
return;
}
Node node=m_debugger.getTableau().getNode(nodeID);
if (node==null) {
m_debugger.getOutput().println("Node with ID '"+nodeID+"' not found.");
return;
}
for (ExtensionTable extensionTable : m_debugger.getTableau().getExtensionManager().getExtensionTables())
for (int position=0;position<extensionTable.getArity();position++) {
boolean[] bindings=new boolean[extensionTable.getArity()];
bindings[position]=true;
ExtensionTable.Retrieval retrieval=extensionTable.createRetrieval(bindings,ExtensionTable.View.TOTAL);
retrieval.getBindingsBuffer()[position]=node;
loadFacts(facts,retrieval);
}
title="Assertions containing node '"+node.getNodeID()+"'.";
}
}
CharArrayWriter buffer=new CharArrayWriter();
PrintWriter writer=new PrintWriter(buffer);
Object lastPredicate=null;
for (Object[] fact : facts) {
if (lastPredicate!=fact[0]) {
lastPredicate=fact[0];
writer.println();
}
writer.print(' ');
printFact(fact,writer);
writer.println();
}
writer.flush();
showTextInWindow(buffer.toString(),title);
selectConsoleWindow();
}
protected void loadFacts(Set<Object[]> facts,ExtensionTable.Retrieval retrieval) {
retrieval.open();
while (!retrieval.afterLast()) {
facts.add(retrieval.getTupleBuffer().clone());
retrieval.next();
}
}
protected void printFact(Object[] fact,PrintWriter writer) {
Object dlPredicate=fact[0];
if (dlPredicate instanceof Concept)
writer.print(((Concept)dlPredicate).toString(m_debugger.getPrefixes()));
else if (dlPredicate instanceof DLPredicate)
writer.print(((DLPredicate)dlPredicate).toString(m_debugger.getPrefixes()));
else
throw new IllegalStateException("Internal error: invalid predicate.");
writer.print('[');
for (int position=1;position<fact.length;position++) {
if (position!=1)
writer.print(',');
writer.print(((Node)fact[position]).getNodeID());
}
writer.print(']');
}
}