/***************************************************************** 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; } }