Changeset 1528


Ignore:
Timestamp:
03/01/2012 01:58:07 PM (7 years ago)
Author:
michael.kriegel
Message:

After migration, world model is updated with agent's KB

Location:
libs/cmion/cmionMain/src/cmion/level3/fatima
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libs/cmion/cmionMain/src/cmion/level3/fatima/FAtiMAConnector.java

    r1524 r1528  
    3030package cmion.level3.fatima; 
    3131 
    32 import ion.Meta.EventHandler; 
    33 import ion.Meta.IEvent; 
    34  
    3532import java.io.IOException; 
     33import java.io.StringReader; 
    3634import java.net.ServerSocket; 
    3735import java.net.Socket; 
    3836import java.util.HashMap; 
     37import java.util.HashSet; 
     38 
     39import javax.xml.parsers.DocumentBuilder; 
     40import javax.xml.parsers.DocumentBuilderFactory; 
    3941 
    4042import org.w3c.dom.Document; 
    4143import org.w3c.dom.Element; 
     44import org.w3c.dom.NamedNodeMap; 
    4245import org.w3c.dom.Node; 
     46import org.w3c.dom.NodeList; 
     47import org.xml.sax.InputSource; 
     48 
    4349import cmion.architecture.IArchitecture; 
    4450import cmion.level2.migration.Migrating; 
    4551import cmion.level2.migration.MigrationAware; 
    4652import cmion.level3.AgentMindConnector; 
    47 import cmion.level3.EventRemoteAction; 
    4853import cmion.level3.MindAction; 
     54import cmion.storage.CmionStorageContainer; 
     55import cmion.storage.WorldModel; 
    4956 
    5057 
     
    343350                                                Thread.sleep(100); 
    344351                                        } catch (InterruptedException e) {} 
    345                                 } 
     352                                }                        
    346353                                 
    347354                                // now that the state is set awake the mind 
     
    362369                                        mindThread.sendLookAtPerception(objectName); 
    363370                                 
     371                                // now that we have done this, update world model with fatima properties 
     372                                mindThread.send("CMD GET-PROPERTIES");                           
    364373                        } 
    365374                         
     
    472481                mindThread.send(message); 
    473482        } 
     483 
     484        /** parse the xml message containing the semantic memory of the connected agent, 
     485         *  use it to update the world model */ 
     486        public void parseSemanticMemory(String msg) 
     487        { 
     488                final class Container 
     489                { 
     490                        public HashMap<String,Object> properties; 
     491                        public HashSet<String> persistentProperties; 
     492                 
     493                        public Container() 
     494                        { 
     495                                properties = new HashMap<String,Object>(); 
     496                                persistentProperties = new HashSet<String>(); 
     497                        } 
     498                 
     499                } 
     500                 
     501                try 
     502                { 
     503                        HashMap<String,Container> containers = new HashMap<String,Container>();  
     504                        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     505                        DocumentBuilder db = dbf.newDocumentBuilder(); 
     506                        InputSource is = new InputSource(); 
     507                        is.setCharacterStream(new StringReader(msg)); 
     508                        Document doc = db.parse(is); 
     509                        NodeList nodes = doc.getElementsByTagName("Property"); 
     510                        for (int i=0; i<nodes.getLength(); i++) 
     511                        { 
     512                                NamedNodeMap attribs = nodes.item(i).getAttributes(); 
     513                                boolean persistent = Boolean.parseBoolean(attribs.getNamedItem("persistent").getNodeValue()); 
     514                                String fullName = attribs.getNamedItem("persistent").getNodeValue(); 
     515                                String propValue = attribs.getNamedItem("persistent").getNodeValue(); 
     516                                 
     517                                // extract propOwner and Name 
     518                                String propOwner = fullName.substring(0,fullName.indexOf("(")); 
     519                                String propName = fullName.substring(fullName.indexOf("("),fullName.length()-1); 
     520                                 
     521                                // write all properties into temporary container structure 
     522                                Container container = containers.get(propOwner); 
     523                                if (container==null) 
     524                                {        
     525                                        container = new Container(); 
     526                                        containers.put(propOwner, container); 
     527                                } 
     528                                container.properties.put(propName, propValue); 
     529                                if (persistent) container.persistentProperties.add(propName); 
     530                        } 
     531                 
     532                        WorldModel wm = architecture.getWorldModel(); 
     533                        // now write the values for all containers to the world model 
     534                        for (String containerName : containers.keySet()) 
     535                        { 
     536                                Container container = containers.get(containerName); 
     537                                // if the container already exists, just add the properties to it,  
     538                                // we dont need to worry about the agent/object distinction 
     539                                if (wm.hasSubContainer(containerName))  
     540                                { 
     541                                        CmionStorageContainer csc = wm.getSubContainer(containerName); 
     542                                        for (String propName: container.properties.keySet()) 
     543                                        { 
     544                                                csc.requestSetProperty(propName,  
     545                                                                                           container.properties.get(propName),  
     546                                                                                           container.persistentProperties.contains(propName)); 
     547                                        }        
     548                                } else // this is the trickier case, we dont know if this is an agent or object 
     549                                        // for now use this policy: make it an agent unless it has a property called isObject set to true 
     550                                { 
     551                                        String type = WorldModel.AGENT_TYPE_NAME; 
     552                                        if (container.properties.containsKey("isObject"))  
     553                                        { 
     554                                                boolean isObject = Boolean.parseBoolean(container.properties.get("isObject").toString()); 
     555                                                if (isObject) type = WorldModel.OBJECT_TYPE_NAME; 
     556                                        } 
     557                                        wm.requestAddSubContainer(containerName, type, container.properties, container.persistentProperties);                    
     558                                }                
     559                        } 
     560                } 
     561                catch (Exception e) 
     562                { 
     563                        e.printStackTrace(); 
     564                } 
     565        } 
    474566         
    475567} 
  • libs/cmion/cmionMain/src/cmion/level3/fatima/FAtiMAListenerThread.java

    r1525 r1528  
    161161                        // ignore this for now as well, normally the mind should not change properties by itself anyway 
    162162                        // they should be changed outside in the world simulation, i.e. in this application here 
    163                 }  
     163                } 
     164                else if (type.startsWith("<SemanticMemory>")) 
     165                { 
     166                        connector.parseSemanticMemory(type); 
     167                } 
    164168                // FAtiMA agent wants to look at something, i.e. requests information about the properties of a certain object or another agent 
    165169                else if (type.equals("look-at")) { 
Note: See TracChangeset for help on using the changeset viewer.