package org.drools.semantics.builder.reasoner;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.compiler.DrlParser;
import org.drools.compiler.DroolsParserException;
import org.drools.io.impl.ByteArrayResource;
import org.drools.lang.DrlDumper;
import org.drools.lang.api.CEDescrBuilder;
import org.drools.lang.api.DescrFactory;
import org.drools.lang.api.PackageDescrBuilder;
import org.drools.lang.api.PatternDescrBuilder;
import org.drools.lang.api.RuleDescrBuilder;
import org.drools.lang.api.TypeDeclarationDescrBuilder;
import org.drools.lang.descr.AndDescr;
import org.drools.lang.descr.AnnotatedBaseDescr;
import org.drools.lang.descr.BaseDescr;
import org.drools.lang.descr.OrDescr;
import org.drools.lang.descr.PackageDescr;
import org.drools.rule.TypeDeclaration;
import org.drools.semantics.builder.DLTemplateManager;
import org.drools.semantics.builder.model.Concept;
import org.drools.semantics.builder.model.ModelFactory;
import org.drools.semantics.builder.model.OntoModel;
import org.drools.semantics.builder.model.PropertyRelation;
import org.mvel2.templates.CompiledTemplate;
import org.mvel2.templates.TemplateRuntime;
import org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLClassExpression;
import org.semanticweb.owlapi.model.OWLDataSomeValuesFrom;
import org.semanticweb.owlapi.model.OWLNamedIndividual;
import org.semanticweb.owlapi.model.OWLObjectAllValuesFrom;
import org.semanticweb.owlapi.model.OWLObjectCardinalityRestriction;
import org.semanticweb.owlapi.model.OWLObjectComplementOf;
import org.semanticweb.owlapi.model.OWLObjectIntersectionOf;
import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom;
import org.semanticweb.owlapi.model.OWLObjectUnionOf;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLQuantifiedObjectRestriction;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;
public class TemplateRecognitionRuleBuilder {
protected boolean useTMS = true;
protected boolean usePropertyReactivity = false;
protected boolean debug = true;
private static DrlDumper dumper = new DrlDumper();
private static DrlParser parser = new DrlParser();
public String createDRL( OWLOntology onto, OntoModel model ) {
Map<OWLClassExpression,OWLClassExpression> definitions = new DLogicTransformer( onto ).getDefinitions();
Map<String,Object> params = new HashMap<String, Object>();
params.put( "definitions", definitions );
params.put( "debug", debug );
params.put( "useTMS", useTMS );
params.put( "usePR", usePropertyReactivity );
params.put( "context", new DLRecognitionBuildContext() );
params.put( "rootClass", org.w3._2002._07.owl.Thing.class.getName() );
CompiledTemplate drlTemplate = DLTemplateManager.getDataModelRegistry( ModelFactory.CompileTarget.RL ).getNamedTemplate( "recognitionRule.drlt" );
String drl = TemplateRuntime.execute( drlTemplate, model, params ).toString().trim();
drl = validateAndClean( drl );
System.out.println( "******************************************************************************" );
System.out.println( "******************************************************************************" );
System.out.println( "******************************************************************************" );
System.out.println( drl );
System.out.println( "******************************************************************************" );
System.out.println( "******************************************************************************" );
System.out.println( "******************************************************************************" );
return drl;
}
private String validateAndClean( String drl ) {
System.out.println( cleanWhites( drl ) );
KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kBuilder.add( new ByteArrayResource( drl.getBytes() ), ResourceType.DRL );
if ( kBuilder.hasErrors() ) {
throw new IllegalStateException( kBuilder.getErrors().toString() );
}
try {
return dumper.dump( parser.parse( false, drl ) );
} catch ( DroolsParserException e ) {
// MUST not happen here!
throw new IllegalStateException( "FATAL : parser could not parse a resource validated by the KnowledgeBuilder" );
}
}
private String cleanWhites( String drl ) {
return drl.replaceAll( "^ +| +$|( )+", "$1" ).replaceAll( "\\s*\n+\\s*(\\s*\n+\\s*)+", "\n" );
}
}