damlagent.java

来自「SRI international 发布的OAA框架软件」· Java 代码 · 共 389 行

JAVA
389
字号

package com.sri.oaa2.agt.oaadaml;

import com.sri.oaa2.lib.*;
import java.awt.event.*;
import java.awt.*;
import com.sri.oaa2.com.*;
import com.sri.oaa2.icl.*;
import com.hp.hpl.jena.rdf.arp.JenaReader;    
import com.hp.hpl.mesa.rdf.jena.mem.ModelMem;
import com.hp.hpl.mesa.rdf.jena.model.*;
import com.hp.hpl.mesa.rdf.jena.vocabulary.RDFS;
import com.hp.hpl.mesa.rdf.jena.common.*;
import java.io.*;
import java.lang.Object;
import java.lang.String;
import java.util.*;

/**
 * This class extends LibOaa and provides our daml agent with the facilities of connecting to the facilitator
 * and defines the appropriate actions to perform once a query does match with a registerd solvable. This code is 
 * given in the corresponding callback method.
 */

public class DamlAgent extends LibOaa{

    Model model;
    HashSet properties, classes;
    String defaultNs = null;
   
  
    /**
     * The agent is created with the set of properties and classes that we have already extracted from the ontology
     * using the jena model. An instance of our daml agent is defined with a set of properties, a set of classes, a 
     * default name space and a model. 
     */

    public DamlAgent(Model model,String defaultNs, HashSet properties, HashSet classes) {
       super(new LibCom(new LibComTcpProtocol(),null));
       this.model = model;
       this.properties = properties;
       this.defaultNs = defaultNs;	
       this.classes = classes;
   }
    
   public void oaaConnect(String inAgentName, String inSolvables) {
    
       System.out.println("Agent Name : " + inAgentName);
       System.out.println("Solvables : " + inSolvables);
       try {
       if (!getComLib().comConnect("parent", IclUtils.iclNewTermFromString("tcp(A,B)"), IclList.iclGetEmptyList())) {
           System.out.println("Could not connect");
           return;
       }
       }catch (Exception e) {
           System.out.println (" Exception in comConnect : " +e);
       }
       try {
       if (!oaaRegister("parent", inAgentName, IclUtils.iclNewTermFromString(inSolvables), IclList.iclGetEmptyList())) {
           System.out.println("Could not register : " +inSolvables);
           return;
       }	
       }catch (Exception e) {
           System.out.println (" Exception in oaaRegister : " +e);
       }
       oaaReady(true);
   }

   public void oaaDeclare(String inSolvables) {
       IclTerm solvables = IclUtils.iclNewTermFromString(inSolvables);
    
       System.out.println("Declaring : " + inSolvables.toString());

       oaaDeclare(solvables, IclList.iclGetEmptyList(), IclList.iclGetEmptyList(),
                  IclList.iclGetEmptyList());
   }
   
   public boolean oaaDoCallbackDamlClass(IclTerm goal,IclList params, IclList answers) {
       
       String prefix = "http://www.daml.org/2001/03/daml+oil#";
	
       String strGoal = goal.iclFunctor().substring(1,goal.iclFunctor().length()-1);
       // System.out.println(" it is a call to oaaDoCallbackDamlClass : " +strGoal);
       	try {
       	    SelectorImpl newselect = new SelectorImpl(null,null,model.createResource(prefix+strGoal));
       	    StmtIterator newiterator = model.listStatements(newselect);

       	    while (newiterator.hasNext()){
       		Statement triple = newiterator.next();	 
       		answers.iclAddToList(IclUtils.icl("'"+strGoal+"'('"+triple.getSubject()+"')"));
       	    }
			
       	}catch (Exception e) {
	    System.out.println("Failed: " + e.getMessage());
	    e.printStackTrace();
       	}

       return false;
   }
    
  /*
    goal is something like
    'http://www.daml.org/2001/03/daml+oil-ex.daml#Person'(X)
    */

  public boolean
   oaaDoCallbackOntologyClass(IclTerm goal,IclList params, IclList answers) 
    {
     System.out.println("call to oaaDoCallbackOntologyClass : " + goal.toString());
     String functor = goal.iclFunctor();
     // Remove open/close quotes if present:
     functor = IclString.iclStRemoveQuotes(functor); 

     // functor adjusted for namespace, if necessary:
     String functorNs; 
     if ((defaultNs != null) && functor.startsWith(DamlOAA.url + "#")) {
	 StringBuffer temp = new StringBuffer(functor);
	 temp.replace(0, DamlOAA.url.length()+1, defaultNs);
	 System.out.println("functorNS: " + temp.toString());
	 functorNs = temp.toString();
     } else {
	 functorNs = functor;
     }
     // TBD: is looping through the class array needed?:
       Object[] classArray = classes.toArray();
       for(int i=0;i<classes.size();i++){
         if (functor.equals(classArray[i].toString())) {
	 try {
	   Property property = model.getProperty("http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
	   SelectorImpl select = new SelectorImpl(null,property, model.getResource(functorNs));
	   // SelectorImpl select = new SelectorImpl(null,property, temp.toString());
	   StmtIterator iterator = model.listStatements(select);
     
	   while (iterator.hasNext()){
	     Statement stmtFound = iterator.next();
	     // System.out.println("'"+functor+"'('"+stmtFound.getSubject().toString()+"')");
	     answers.iclAddToList(IclUtils.icl("'"+functor+"'('"+stmtFound.getSubject().toString()+"')"));
	   }
	 }catch (Exception e) {
	   System.out.println("Failed: " + e.getMessage());
	   e.printStackTrace();
	 }
       }
     }
     return false;
  }

  public boolean 
  oaaDoCallbackRDFprop(IclTerm goal,IclList params, IclList answers) 
    {
    try {
      String prefix = "http://www.w3.org/2000/01/rdf-schema#";
      String strGoal = goal.iclFunctor();
      System.out.println(" it is a call to oaaDoCallbackRDFprop : " +strGoal);
      SelectorImpl select = 
	new SelectorImpl(null,model.getProperty(prefix+strGoal),(String)null);
      StmtIterator iterator = model.listStatements(select);
		
      while (iterator.hasNext()){
	Statement triple = iterator.next();
	answers.iclAddToList(IclUtils.icl(
	  strGoal+"('"+
	  triple.getSubject()+
	  "','"+triple.getObject()+"')"));
      }
    }catch (Exception e) {
	System.out.println("Failed: " + e.getMessage());
	e.printStackTrace();
    }
       return false;
  }

  public boolean oaaDoCallbackDamlprop(IclTerm goal,IclList params, IclList answers) 
    {

    String prefix = "http://www.daml.org/2001/03/daml+oil#";
    String strGoal = goal.iclFunctor();
    // System.out.println(" it is a call to oaaDoCallbackDamlProp : " +strGoal);
    try {
      SelectorImpl select = new SelectorImpl(null,model.getProperty(prefix+strGoal),(String)null);
      StmtIterator iterator = model.listStatements(select);
      while (iterator.hasNext()){
       	Statement triple = iterator.next();
       	answers.iclAddToList(IclUtils.icl(strGoal+"('"+triple.getSubject()+"','"+triple.getObject()+"')"));
      }
    }catch (Exception e) {
      System.out.println("Failed: " + e.getMessage());
      e.printStackTrace();
    }
    return false;
  }

  /*
    goal is something like
    'http://www.daml.org/2001/03/daml+oil-ex.daml#shoesize'(X,Y)
    */
  public boolean 
  oaaDoCallbackOntologyProp(IclTerm goal,IclList params, IclList answers) 
    {

    Object[] propArray = properties.toArray();
    String functor = goal.iclFunctor();
    // Remove open/close quotes if present:
    functor = IclString.iclStRemoveQuotes(functor); 
    System.out.println("in oaaDoCallbackOntologyProp: " + functor);
    // functor adjusted for namespace, if necessary:
    String functorNs; 
    if ((defaultNs != null) && functor.startsWith(DamlOAA.url + "#")) {
	StringBuffer temp = new StringBuffer(functor);
	temp.replace(0, DamlOAA.url.length()+1, defaultNs);
	System.out.println("prop functorNS: " + temp.toString());
	functorNs = temp.toString();
    } else {
	functorNs = functor;
    }

    if (functorNs.indexOf('#') >= 0 ){
	//System.out.println("this is a long form ");
      for(int i=0;i<properties.size();i++){
		 
	  // System.out.println(propArray[i].toString());
	if (functor.equals(propArray[i].toString())) {
	  try {
	    // System.out.println(propArray[i]);
	    // StringBuffer temp = new StringBuffer(propArray[i].toString());
	    // temp.replace(0,defaultNs.length()+8,prefix);
	    // System.out.println(temp.toString());
	    // Property property = model.getProperty(temp.toString());
	    Property property = model.getProperty(functorNs);
	    SelectorImpl selectProperty = new SelectorImpl(null,property,(String)null);
	    StmtIterator propIter = model.listStatements(selectProperty);
	    while (propIter.hasNext()){
	      Statement triple = propIter.next();		
	      // System.out.println("'"+propArray[i]+"'('"+triple.getSubject()+"','"+triple.getObject()+"')");
	      answers.iclAddToList(IclUtils.icl("'"+propArray[i]+"'('"+triple.getSubject()+"','"+triple.getObject()+"')"));
	    }
	  }catch (Exception e) {
	    System.out.println("Failed: " + e.getMessage());
	    e.printStackTrace();
	  }   
	} 
      }
    }
    // else 
    // System.out.println("this is a short form");
	
    return false;
  }
   public boolean oaaCallbackList(IclTerm goal, IclList params, IclList answers) 
    {

       String prefix1 = defaultNs+"#";//http://www.daml.org/2001/03/daml+oil#";
	//String prefix2 = "http://www.daml.org/2001/03/daml+oil-ex.daml#";
       String strGoal = goal.iclFunctor();
       String arg1 = goal.iclNthTerm(1).toString();
       String arg = arg1.substring(1,arg1.length()-1);

       // System.out.println("this is a callback to oaaCallbackList : " +arg);
       try {
           Resource subject = model.createResource(arg);
           SelectorImpl select = new SelectorImpl(subject,model.getProperty(prefix1+strGoal),(String)null);   
           StmtIterator iterator = model.listStatements(select);

           while (iterator.hasNext()){
       	Statement triple = iterator.next();
       	RDFNode object = triple.getObject();
          
       	SelectorImpl first = new SelectorImpl((Resource)object,model.getProperty("http://www.daml.org/2001/03/daml+oil#first"),(String)null);
       	SelectorImpl rest = new SelectorImpl((Resource)object,model.getProperty("http://www.daml.org/2001/03/daml+oil#rest"),(String)null);
       	StmtIterator firstIter = model.listStatements(first);	
       	StmtIterator restIter = model.listStatements(rest);

       	while (firstIter.hasNext()){
       	    Statement restElmt;
       	    Statement firstElmt =firstIter.next();
       	    if(restIter.hasNext()){		
       		restElmt = restIter.next();
       		if (model.contains((Resource)restElmt.getObject(),model.getProperty("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), model.getResource("http://www.daml.org/2001/03/daml+oil#List"))){

			    StmtIterator listFirstElmt = model.listStatements(new SelectorImpl((Resource)restElmt.getObject(),model.getProperty("http://www.daml.org/2001/03/daml+oil#first"),(String)null));
       		    StmtIterator listRestElmt = model.listStatements(new SelectorImpl((Resource)restElmt.getObject(),model.getProperty("http://www.daml.org/2001/03/daml+oil#rest"),(String)null));

       		    if (listFirstElmt.hasNext()){
			
       			Statement listFirst = listFirstElmt.next();
       			Statement listRest = listRestElmt.next();
       			if (listRest.getObject().toString().equals("http://www.daml.org/2001/03/daml+oil#nil")) {
				    answers.iclAddToList(IclUtils.icl("['"+firstElmt.getObject()+"', '"+listFirst.getObject()+"']"));
				}
				else {
				    answers.iclAddToList(IclUtils.icl("['"+firstElmt.getObject()+"', '"+listFirst.getObject()+"', '"+listRest.getObject()+"']"));
				}
			    }
			}
			else {	
			    answers.iclAddToList(IclUtils.icl("['"+firstElmt.getObject()+"', '"+restElmt.getObject()+"']"));
			}
		    }
		    else {
			answers.iclAddToList(IclUtils.icl("'"+firstElmt.getObject()+"'"));		
		    }
		}		
	    }
	}catch (Exception e) {
	    System.out.println("Failed: " + e.getMessage());
	    e.printStackTrace();
	}
	return false;
    }

  /*
    goal = 'Property'(X)
   */

    public boolean oaaCallbackProp(IclTerm goal, IclList params, IclList answers)
  {
    // System.out.println(" it is a call to oaaCallbackProp "); 
    Object[] propArray = properties.toArray();
    for (int i=0;i<properties.size();i++) {
      answers.iclAddToList(IclUtils.icl(
	"'Property'('"+propArray[i].toString()+"')"));
    }
    return false;
  }


  /*
    goal = daml_triple(X, Y, Z)
    where any combination of X, Y, Z may be ground
   */

  public boolean 
    oaaCallbackTriple(IclTerm goal, IclList params, IclList answers)
    {

      String strGoal = goal.iclFunctor();
      // System.out.println(" it is a call to oaaCallbackTriple : " +strGoal); 
      com.sri.oaa2.icl.IclUtils iclutil = new  com.sri.oaa2.icl.IclUtils(); 
      String arg1 = goal.iclNthTerm(1).toString().substring(1,goal.iclNthTerm(1).toString().length()-1); 
      String arg2 = goal.iclNthTerm(2).toString().substring(1,goal.iclNthTerm(2).toString().length()-1); 
      String arg3 =  goal.iclNthTerm(3).toString().substring(1,goal.iclNthTerm(3).toString().length()-1);

      Resource subj = null, obj = null;
      Property prop = null;

      boolean test1 = iclutil.iclIsVar(goal.iclNthTerm(1));
      boolean test2 = iclutil.iclIsVar(goal.iclNthTerm(2));
      boolean test3 = iclutil.iclIsVar(goal.iclNthTerm(3));

      try {
	if (test1 == false)
	  subj = model.getResource(arg1);
	if (test2 == false)
	  prop = model.getProperty(arg2);
	if (test3 == false)
	  obj = model.getResource(arg3);
      } catch (Exception e) {
	System.out.println("Failed: " + e.getMessage());
	e.printStackTrace();
      }

      try {
	StmtIterator 
	  stmtIterRes = model.listStatements(new SelectorImpl(subj, prop, obj));
	while(stmtIterRes.hasNext()){
	  Statement tripleRes = stmtIterRes.next();
	  answers.iclAddToList(IclUtils.icl(
		  "daml_triple('"+tripleRes.getSubject().toString()+
		  "','"+tripleRes.getPredicate().toString()+
		  "','"+tripleRes.getObject().toString()+"')"));
	}
	StmtIterator stmtIterlitl = 
	  model.listStatements(new SelectorImpl(subj, prop, arg3));
	while(stmtIterlitl.hasNext()){
	  Statement triplelitl = stmtIterlitl.next();
	  answers.iclAddToList(IclUtils.icl(
                  "daml_triple('"+triplelitl.getSubject().toString()+
		  "','"+triplelitl.getPredicate().toString()+
		  "','"+triplelitl.getObject().toString()+"')"));
	}
      } catch (Exception e) {
	System.out.println("Triple retrieval problem: " + e);
      }

      return false;
  }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?