Package jade.domain

Source Code of jade.domain.DFMemKB

/*****************************************************************
JADE - Java Agent DEvelopment Framework is a framework to develop
multi-agent systems in compliance with the FIPA specifications.
Copyright (C) 2000 CSELT S.p.A.

The updating of this file to JADE 2.0 has been partially supported by the IST-1999-10211 LEAP Project

GNU Lesser General Public License

This library 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,
version 2.1 of the License.

This library 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 this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA  02111-1307, USA.
*****************************************************************/

package jade.domain;

//#MIDP_EXCLUDE_FILE
//#APIDOC_EXCLUDE_FILE

import jade.util.leap.Iterator;
import jade.util.leap.ArrayList;

import jade.core.AID;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.Property;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.KBManagement.*;

/**
* @author Elisabetta Cortese - TILab
*
*/
public class DFMemKB extends MemKB {

  boolean entriesToDelete = false; // gets true if there's at least one entry to delete for the method clean

  /**
   * Constructor
   * @param maxResultLimit JADE internal limit for maximum number of search results
   */
  public DFMemKB(int maxResultLimit){
    super(maxResultLimit);
    clean();
  }


  protected Object insert(Object name, Object fact) {
    DFAgentDescription desc = (DFAgentDescription)fact;
    if (desc.getLeaseTime() != null ) {
      entriesToDelete = true;
    }
    return super.insert(name, fact);
  }

  /**
     Scan the facts and remove those whose lease time has expired.
   */
  protected void clean(){

    if (entriesToDelete) {
      ArrayList toBeRemoved = new ArrayList();
      Iterator iter = facts.values().iterator();   
      while(iter.hasNext()){
        DFAgentDescription dfd = (DFAgentDescription) iter.next();
        if(dfd.checkLeaseTimeExpired()) {
          toBeRemoved.add(dfd.getName());
        }
      }
      iter = toBeRemoved.iterator();
      while (iter.hasNext()) {
        facts.remove((AID) iter.next());
      }
    }
  }

  // match
  public final boolean match(Object template, Object fact) {
    return compare(template, fact);
  }

  public static final boolean compare(Object template, Object fact) {

    try {
      DFAgentDescription templateDesc = (DFAgentDescription)template;
      DFAgentDescription factDesc = (DFAgentDescription)fact;
      // We must not return facts whose lease time has expired (no
      // matter if they match)
      if(factDesc.checkLeaseTimeExpired())
        return false;

      // Match name
      AID id1 = templateDesc.getName();
      if(id1 != null) {
        AID id2 = factDesc.getName();
        if((id2 == null) || (!matchAID(id1, id2)))
          return false;
      }

      // Match protocol set
      Iterator itTemplate = templateDesc.getAllProtocols();
      while(itTemplate.hasNext()) {
        String templateProto = (String)itTemplate.next();
        boolean found = false;
        Iterator itFact = factDesc.getAllProtocols();
        while(!found && itFact.hasNext()) {
          String factProto = (String)itFact.next();
          found = templateProto.equalsIgnoreCase(factProto);
        }
        if(!found)
          return false;
      }

      // Match ontologies set
      itTemplate = templateDesc.getAllOntologies();
      while(itTemplate.hasNext()) {
        String templateOnto = (String)itTemplate.next();
        boolean found = false;
        Iterator itFact = factDesc.getAllOntologies();
        while(!found && itFact.hasNext()) {
          String factOnto = (String)itFact.next();
          found = templateOnto.equalsIgnoreCase(factOnto);
        }
        if(!found)
          return false;
      }

      // Match languages set
      itTemplate = templateDesc.getAllLanguages();
      while(itTemplate.hasNext()) {
        String templateLang = (String)itTemplate.next();
        boolean found = false;
        Iterator itFact = factDesc.getAllLanguages();
        while(!found && itFact.hasNext()) {
          String factLang = (String)itFact.next();
          found = templateLang.equalsIgnoreCase(factLang);
        }
        if(!found)
          return false;
      }

      // Match services set
      itTemplate = templateDesc.getAllServices();
      while(itTemplate.hasNext()) {
        ServiceDescription templateSvc = (ServiceDescription)itTemplate.next();
        boolean found = false;
        Iterator itFact = factDesc.getAllServices();
        while(!found && itFact.hasNext()) {
          ServiceDescription factSvc = (ServiceDescription)itFact.next();
          found = compareServiceDesc(templateSvc, factSvc);
        }
        if(!found)
          return false;
      }

      return true;
    }
    catch(ClassCastException cce) {
      return false;
    }
  }

  // Helper method to compare two Service Description objects
  public static final boolean compareServiceDesc(ServiceDescription template, ServiceDescription fact) {

    // Match name
    String n1 = template.getName();
    if(n1 != null) {
      String n2 = fact.getName();
      if((n2 == null) || (!n1.equalsIgnoreCase(n2)))
        return false;
    }

    // Match type
    String t1 = template.getType();
    if(t1 != null) {
      String t2 = fact.getType();
      if((t2 == null) || (!t1.equalsIgnoreCase(t2)))
        return false;
    }

    // Match ownership
    String o1 = template.getOwnership();
    if(o1 != null) {
      String o2 = fact.getOwnership();
      if((o2 == null) || (!o1.equalsIgnoreCase(o2)))
        return false;
    }

    // Match ontologies set
    Iterator itTemplate = template.getAllOntologies();
    while(itTemplate.hasNext()) {
      String templateOnto = (String)itTemplate.next();
      boolean found = false;
      Iterator itFact = fact.getAllOntologies();
      while(!found && itFact.hasNext()) {
        String factOnto = (String)itFact.next();
        found = templateOnto.equalsIgnoreCase(factOnto);
      }
      if(!found)
        return false;
    }

    // Match languages set
    itTemplate = template.getAllLanguages();
    while(itTemplate.hasNext()) {
      String templateLang = (String)itTemplate.next();
      boolean found = false;
      Iterator itFact = fact.getAllLanguages();
      while(!found && itFact.hasNext()) {
        String factLang = (String)itFact.next();
        found = templateLang.equalsIgnoreCase(factLang);
      }
      if(!found)
        return false;
    }

    // Match protocols set
    itTemplate = template.getAllProtocols();
    while(itTemplate.hasNext()) {
      String templateProto = (String)itTemplate.next();
      boolean found = false;
      Iterator itFact = fact.getAllProtocols();
      while(!found && itFact.hasNext()) {
        String factProto = (String)itFact.next();
        found = templateProto.equalsIgnoreCase(factProto);
      }
      if(!found)
        return false;
    }

    // Match properties set
    itTemplate = template.getAllProperties();
    while(itTemplate.hasNext()) {
      Property templateProp = (Property)itTemplate.next();
      boolean found = false;
      Iterator itFact = fact.getAllProperties();
      while(!found && itFact.hasNext()) {
        Property factProp = (Property)itFact.next();
        found = templateProp.match(factProp);
        /*if (templateProp.getName().equals(factProp.getName())) {
          // The property name matches. Check the value
          Object templateValue = templateProp.getValue();
          if (templateValue == null) {
            found = true;
          }
          else if (templateValue instanceof String) {
            found = ((String)templateValue).equalsIgnoreCase(factProp.getValue().toString());
          }
          else {
            found = templateValue.equals(factProp.getValue());
          }
        }*/
      }
      if(!found)
        return false;
    }

    return true;
  }
}
TOP

Related Classes of jade.domain.DFMemKB

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.