public static void main(String[] argv) {
try {
int verbosity=1;
boolean ignoreOntologyPrefixes=false;
Prefixes prefixes=new Prefixes();
PrintWriter output=new PrintWriter(System.out);
Collection<Action> actions=new LinkedList<Action>();
URI base;
IRI conclusionIRI=null;
Configuration config=new Configuration();
boolean doAll=true;
try {
base=new URI("file",System.getProperty("user.dir")+"/",null);
}
catch (java.net.URISyntaxException e) {
throw new RuntimeException("unable to create default IRI base");
}
Collection<IRI> ontologies=new LinkedList<IRI>();
boolean didSomething=false;
{
Getopt g=new Getopt("hermit",argv,Option.formatOptionsString(options),Option.createLongOpts(options));
g.setOpterr(false);
int opt;
while ((opt=g.getopt())!=-1) {
switch (opt) {
// meta:
case 'h': {
System.out.println(usageString);
for (String s : helpHeader)
System.out.println(s);
System.out.println(Option.formatOptionHelp(options));
for (String s : footer)
System.out.println(s);
System.exit(0);
didSomething=true;
}
break;
case 'V': {
System.out.println(versionString);
for (String s : footer)
System.out.println(s);
System.exit(0);
didSomething=true;
}
break;
case 'v': {
String arg=g.getOptarg();
if (arg==null) {
verbosity+=1;
}
else
try {
verbosity+=Integer.parseInt(arg,10);
}
catch (NumberFormatException e) {
throw new UsageException("argument to --verbose must be a number");
}
}
break;
case 'q': {
String arg=g.getOptarg();
if (arg==null) {
verbosity-=1;
}
else
try {
verbosity-=Integer.parseInt(arg,10);
}
catch (NumberFormatException e) {
throw new UsageException("argument to --verbose must be a number");
}
}
break;
case 'o': {
String arg=g.getOptarg();
if (arg==null)
throw new UsageException("--output requires an argument");
if (arg.equals("-"))
output=new PrintWriter(System.out);
else {
java.io.FileOutputStream f;
try {
f=new java.io.FileOutputStream(arg);
}
catch (java.io.FileNotFoundException e) {
throw new IllegalArgumentException("unable to open "+arg+" for writing");
}
catch (SecurityException e) {
throw new IllegalArgumentException("unable to write to "+arg);
}
output=new PrintWriter(f);
}
}
break;
case kPremise: {
String arg=g.getOptarg();
if (arg==null)
throw new UsageException("--premise requires a IRI as argument");
else {
ontologies.add(IRI.create(arg));
}
}
break;
case kConclusion: {
String arg=g.getOptarg();
if (arg==null)
throw new UsageException("--conclusion requires a IRI as argument");
else {
conclusionIRI=IRI.create(arg);
}
}
break;
// actions:
case 'l': {
// load is a no-op; loading happens no matter what the user asks
}
break;
case 'c': {
actions.add(new ClassifyAction(g.getOptarg()));
}
break;
case 'k': {
String arg=g.getOptarg();
if (arg==null) {
arg="<http://www.w3.org/2002/07/owl#Thing>";
}
actions.add(new SatisfiabilityAction(arg));
}
break;
case 'd': {
doAll=false;
}
break;
case 's': {
String arg=g.getOptarg();
actions.add(new SubsAction(arg,doAll));
doAll=true;
}
break;
case 'S': {
String arg=g.getOptarg();
actions.add(new SupersAction(arg,doAll));
doAll=true;
}
break;
case 'e': {
String arg=g.getOptarg();
actions.add(new EquivalentsAction(arg));
}
break;
case 'U': {
actions.add(new EquivalentsAction("<http://www.w3.org/2002/07/owl#Nothing>"));
}
break;
case 'E': {
if (conclusionIRI!=null)
actions.add(new EntailsAction(config, conclusionIRI));
}
break;
case kDumpPrefixes: {
actions.add(new DumpPrefixesAction());
}
break;
case 'N': {
ignoreOntologyPrefixes=true;
}
break;
case 'p': {
String arg=g.getOptarg();
int eqIndex=arg.indexOf('=');
if (eqIndex==-1) {
throw new IllegalArgumentException("the prefix declaration '"+arg+"' is not of the form PN=IRI.");
}
prefixes.declarePrefix(arg.substring(0,eqIndex),arg.substring(eqIndex+1));
}
break;
case kDefaultPrefix: {
String arg=g.getOptarg();
prefixes.declareDefaultPrefix(arg);
}
break;
case kBase: {
String arg=g.getOptarg();
try {
base=new URI(arg);
}
catch (java.net.URISyntaxException e) {
throw new IllegalArgumentException("'"+arg+"' is not a valid base URI.");
}
}
break;
case kDirectBlock: {
String arg=g.getOptarg();
if (arg.toLowerCase().equals("pairwise")) {
config.directBlockingType=Configuration.DirectBlockingType.PAIR_WISE;
}
else if (arg.toLowerCase().equals("single")) {
config.directBlockingType=Configuration.DirectBlockingType.SINGLE;
}
else if (arg.toLowerCase().equals("optimal")) {
config.directBlockingType=Configuration.DirectBlockingType.OPTIMAL;
}
else
throw new UsageException("unknown direct blocking type '"+arg+"'; supported values are 'pairwise', 'single', and 'optimal'");
}
break;
case kBlockStrategy: {
String arg=g.getOptarg();
if (arg.toLowerCase().equals("anywhere")) {
config.blockingStrategyType=Configuration.BlockingStrategyType.ANYWHERE;
}
else if (arg.toLowerCase().equals("ancestor")) {
config.blockingStrategyType=Configuration.BlockingStrategyType.ANCESTOR;
}
else
throw new UsageException("unknown blocking strategy type '"+arg+"'; supported values are 'ancestor' and 'anywhere'");
}
break;
case kBlockCache: {
String arg=g.getOptarg();
if (arg.toLowerCase().equals("on")) {
config.blockingSignatureCacheType=Configuration.BlockingSignatureCacheType.CACHED;
}
else if (arg.toLowerCase().equals("off")) {
config.blockingSignatureCacheType=Configuration.BlockingSignatureCacheType.NOT_CACHED;
}
else
throw new UsageException("unknown blocking cache type '"+arg+"'; supported values are 'on' and 'off'");
}
break;
case kExpansion: {
String arg=g.getOptarg();
if (arg.toLowerCase().equals("creation")) {
config.existentialStrategyType=Configuration.ExistentialStrategyType.CREATION_ORDER;
}
else if (arg.toLowerCase().equals("el")) {
config.existentialStrategyType=Configuration.ExistentialStrategyType.EL;
}
else if (arg.toLowerCase().equals("reuse")) {
config.existentialStrategyType=Configuration.ExistentialStrategyType.INDIVIDUAL_REUSE;
}
else
throw new UsageException("unknown existential strategy type '"+arg+"'; supported values are 'creation', 'el', and 'reuse'");
}
break;
case kIgnoreUnsupportedDatatypes: {
config.ignoreUnsupportedDatatypes=true;
}
break;
case kDumpClauses: {
actions.add(new DumpClausesAction(g.getOptarg()));
}
break;
case kTaxonomy: {
actions.add(new TaxonomyAction());
}
break;
default: {
if (g.getOptopt()!=0) {
throw new UsageException("invalid option -- "+(char)g.getOptopt());
}
throw new UsageException("invalid option");
}
} // end option switch
} // end loop over options
for (int i=g.getOptind();i<argv.length;++i) {
try {
ontologies.add(IRI.create(base.resolve(argv[i])));
}
catch (IllegalArgumentException e) {
throw new UsageException(argv[i]+" is not a valid ontology name");
}
}
} // done processing arguments
StatusOutput status=new StatusOutput(verbosity);
if (verbosity>3)
config.monitor=new Timer(new PrintWriter(System.err));
for (IRI ont : ontologies) {
didSomething=true;
status.log(2,"Processing "+ont.toString());
status.log(2,String.valueOf(actions.size())+" actions");
try {
long startTime=System.currentTimeMillis();
OWLOntologyManager ontologyManager=OWLManager.createOWLOntologyManager();
OWLOntology ontology=ontologyManager.loadOntology(ont);
long parseTime=System.currentTimeMillis()-startTime;
status.log(2,"Ontology parsed in "+String.valueOf(parseTime)+" msec.");
startTime=System.currentTimeMillis();
Reasoner hermit=new Reasoner(config,ontology);
long loadTime=System.currentTimeMillis()-startTime;
status.log(2,"Reasoner created in "+String.valueOf(loadTime)+" msec.");
if (!ignoreOntologyPrefixes)
prefixes.addPrefixes(hermit.getPrefixes());
for (Action action : actions) {
status.log(2,"Doing action...");
startTime=System.currentTimeMillis();
action.run(hermit,prefixes,status,output);
long actionTime=System.currentTimeMillis()-startTime;