/*
* Copyright 2011 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.semantics.builder.model.inference;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.agent.KnowledgeAgent;
import org.drools.agent.KnowledgeAgentConfiguration;
import org.drools.agent.KnowledgeAgentFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.Resource;
import org.drools.io.impl.ChangeSetImpl;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.semantics.builder.DLFactoryConfiguration;
import org.drools.semantics.builder.model.ModelFactory;
import org.drools.semantics.builder.model.OntoModel;
import org.drools.semantics.utils.NameUtils;
import org.semanticweb.owlapi.model.OWLAxiom;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.util.InferredAxiomGenerator;
import org.semanticweb.owlapi.util.InferredOntologyGenerator;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public abstract class AbstractModelInferenceStrategy implements ModelInferenceStrategy {
public OntoModel buildModel( String name,
OWLOntology ontoDescr,
DLFactoryConfiguration conf,
Map<InferenceTask, Resource> theory,
ClassLoader classLoader ) {
StatefulKnowledgeSession kSession = buildKnowledgeSession( theory );
OntoModel baseModel = ModelFactory.newModel( name, conf.getMode() );
baseModel.setOntology( ontoDescr );
baseModel.setClassLoader( classLoader );
baseModel.setDefaultPackage(NameUtils.namespaceURIToPackage(ontoDescr.getOntologyID().getOntologyIRI().toString()) );
baseModel.setDefaultNamespace( ontoDescr.getOntologyID().getOntologyIRI().toString() );
kSession.fireAllRules();
kSession.insert( ontoDescr );
kSession.fireAllRules();
OntoModel latticeModel = buildClassLattice( ontoDescr, kSession, theory, baseModel, conf );
latticeModel.sort();
OntoModel propertyModel = buildProperties( ontoDescr, kSession, theory, latticeModel, conf );
propertyModel.sort();
OntoModel populatedModel = buildIndividuals( ontoDescr, kSession, theory, propertyModel, conf );
populatedModel.reassignConceptCodes();
populatedModel.buildAreaTaxonomy();
populatedModel.getMode().getProcessor().process( populatedModel );
reportSessionStatus( kSession );
return populatedModel;
}
protected abstract OntoModel buildProperties( OWLOntology ontoDescr, StatefulKnowledgeSession kSession, Map<InferenceTask, Resource> theory, OntoModel hierachicalModel, DLFactoryConfiguration conf );
protected abstract OntoModel buildIndividuals( OWLOntology ontoDescr, StatefulKnowledgeSession kSession, Map<InferenceTask, Resource> theory, OntoModel hierachicalModel, DLFactoryConfiguration conf );
protected abstract OntoModel buildClassLattice( OWLOntology ontoDescr,
StatefulKnowledgeSession kSession,
Map<InferenceTask, Resource> theory,
OntoModel baseModel,
DLFactoryConfiguration conf );
protected abstract InferredOntologyGenerator initReasoner( StatefulKnowledgeSession kSession, OWLOntology ontoDescr, List<InferredAxiomGenerator<? extends OWLAxiom>> axiomGenerators );
private StatefulKnowledgeSession buildKnowledgeSession(Map<InferenceTask, Resource> theory) {
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
for ( InferenceTask task : theory.keySet() ) {
kbuilder.add( theory.get( task ), ResourceType.DRL );
if ( kbuilder.hasErrors() ) {
throw new RuntimeException( kbuilder.getErrors().toString() );
}
}
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
return kbase.newStatefulKnowledgeSession();
}
private void reportSessionStatus(StatefulKnowledgeSession kSession) {
System.err.println( "----------------------- WM " + kSession.getObjects().size() + " --------------------------");
for ( Object o : kSession.getObjects() ) {
System.err.println("\t" + o );
}
System.err.println( "----------------------------------------------------------------");
}
}