[skycastle-commits] SF.net SVN: skycastle: [548] trunk/skycastle/modules

  • From: zzorn@xxxxxxxxxxxxxxxxxxxxx
  • To: skycastle-commits@xxxxxxxxxxxxx
  • Date: Mon, 19 May 2008 14:47:34 -0700

Revision: 548
          http://skycastle.svn.sourceforge.net/skycastle/?rev=548&view=rev
Author:   zzorn
Date:     2008-05-19 14:47:33 -0700 (Mon, 19 May 2008)

Log Message:
-----------
More work on client-server communication with the entity framework.

Modified Paths:
--------------
    
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/AbstractFacet.java
    
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/EntityContainer.java
    
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/impl/local/ExternalMessageHandler.java
    
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/impl/local/LocalEntityContainer.java
    
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/impl/sgs/SgsEntityContainer.java
    
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/messaging/MessageImpl.java
    
trunk/skycastle/modules/core/src/test/java/org/skycastle/kernel/EntityTest.java
    
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/ClientView.java
    
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/ServerModel.java
    
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/LocationFacet.java
    
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/SensorFacet.java
    
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/renderers/WorldEntitiesRenderer.java
    
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/world/WorldImpl.java
    
trunk/skycastle/modules/scratchpad/src/test/java/org/skycastle/scratchpad/evolvingcreatures/world/WorldTest.java
    
trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/MutableParameterSet.java
    
trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/ParameterSetImpl.java

Added Paths:
-----------
    
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/BridgedExternalEntityContainers.java
    
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/MessageDebugFacet.java
    
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/SpaceFacet.java
    
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/space/
    
trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/metadata/ParameterValueFilter.java

Modified: 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/AbstractFacet.java
===================================================================
--- 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/AbstractFacet.java
  2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/AbstractFacet.java
  2008-05-19 21:47:33 UTC (rev 548)
@@ -206,18 +206,21 @@
         return getHostEntity().getContainer();
     }
 
-
-    /**
-     * @param serviceType the type of {@link EntityService} to get.
-     *
-     * @return the specified {@link EntityService].
-     *
-     * @throws IllegalArgumentException if the specified {@link EntityService 
} was not found.
-     */
+/*
+*/
+/**
+ * @param serviceType the type of {@link EntityService} to get.
+ *
+ * @return the specified {@link EntityService].
+ *
+ * @throws IllegalArgumentException if the specified {@link EntityService } 
was not found.
+ */
+/*
     protected final <T extends EntityService> T getService( final Class<T> 
serviceType )
     {
         return getContainer().getService( serviceType );
     }
+*/
 
     //======================================================================
     // Private Methods

Copied: 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/BridgedExternalEntityContainers.java
 (from rev 547, 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/ExternalEntityContainerBridge.java)
===================================================================
--- 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/BridgedExternalEntityContainers.java
                                (rev 0)
+++ 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/BridgedExternalEntityContainers.java
        2008-05-19 21:47:33 UTC (rev 548)
@@ -0,0 +1,73 @@
+package org.skycastle.kernel;
+
+import org.skycastle.kernel.messaging.Message;
+
+/**
+ * A class that provides two {@link ExternalEntityContainer}s that are linked 
together,
+ * so that when a message is sent to one, the listeners of the other recieve 
the message.
+ * <p/>
+ * Useful for unit testing and such.
+ *
+ * @author Hans Haggstrom
+ */
+public final class BridgedExternalEntityContainers
+{
+
+    //======================================================================
+    // Private Fields
+
+    private final AbstractExternalEntityContainer myContainerA;
+    private final AbstractExternalEntityContainer myContainerB;
+
+    //======================================================================
+    // Public Methods
+
+    //----------------------------------------------------------------------
+    // Constructors
+
+    /**
+     * Sets up the bridge.
+     */
+    public BridgedExternalEntityContainers()
+    {
+        myContainerA = new AbstractExternalEntityContainer()
+        {
+
+            public void onMessage( final EntityId sender, final EntityId 
target, final Message message )
+            {
+                myContainerB.sendMessage( sender, target, message );
+            }
+
+        };
+
+        myContainerB = new AbstractExternalEntityContainer()
+        {
+
+            public void onMessage( final EntityId sender, final EntityId 
target, final Message message )
+            {
+                myContainerA.sendMessage( sender, target, message );
+            }
+
+        };
+    }
+
+    //----------------------------------------------------------------------
+    // Other Public Methods
+
+    /**
+     * @return one of the {@link ExternalEntityContainer}s.
+     */
+    public ExternalEntityContainer getContainerA()
+    {
+        return myContainerA;
+    }
+
+    /**
+     * @return the other of the {@link ExternalEntityContainer}s.
+     */
+    public ExternalEntityContainer getContainerB()
+    {
+        return myContainerB;
+    }
+
+}

Modified: 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/EntityContainer.java
===================================================================
--- 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/EntityContainer.java
        2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/EntityContainer.java
        2008-05-19 21:47:33 UTC (rev 548)
@@ -109,7 +109,7 @@
     /**
      * @return the node with the specified name, or null if not found.
      */
-    Entity getNode( String name );
+    Entity getEntity( String name );
 
     /**
      * @return a {@link EntityId} that refers to the {@link Entity} with the 
specified name
@@ -122,9 +122,9 @@
      */
     EntityId createNodeId( String name, ExternalEntityContainer 
externalEntityContainer );
 
-    void bindName( EntityId id, String name );
+    void bindName( String name, EntityId id );
 
-    void bindName( Entity node, String name );
+    void bindName( String name, Entity node );
 
 
     /**
@@ -150,16 +150,21 @@
                                                     double timeUntilStart_s,
                                                     double intervall_s );
 
-
-    /**
-     * @return the {@link EntityService} of the specified type. Throws an 
exception if the service was not
-     *         found.
-     */
+/*
+*/
+/**
+ * @return the {@link EntityService} of the specified type. Throws an 
exception if the service was not
+ *         found.
+ */
+/*
     <T extends EntityService> T getService( Class<T> serviceType );
 
-    /**
-     * @param service a {@link EntityService} to add to this {@link 
EntityContainer}.
-     */
+    */
+/**
+ * @param service a {@link EntityService} to add to this {@link 
EntityContainer}.
+ */
+/*
     void addService( EntityService service );
+*/
 
 }

Modified: 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/impl/local/ExternalMessageHandler.java
===================================================================
--- 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/impl/local/ExternalMessageHandler.java
      2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/impl/local/ExternalMessageHandler.java
      2008-05-19 21:47:33 UTC (rev 548)
@@ -4,6 +4,9 @@
 import org.skycastle.kernel.EntityId;
 import org.skycastle.kernel.messaging.Message;
 import org.skycastle.kernel.messaging.MessageHandler;
+import org.skycastle.util.parameters.MutableParameterSet;
+import org.skycastle.util.parameters.ParameterSet;
+import org.skycastle.util.parameters.metadata.ParameterValueFilter;
 
 /**
  * @author Hans Haggstrom
@@ -40,6 +43,19 @@
         final EntityId fixedSender = sender.createCopyWithAnotherContainerId( 
myExternalContainerIndex );
         final EntityId fixedTarget = target.createCopyWithAnotherContainerId( 
EntityContainer.OWN_CONTAINER_ID );
 
+        final ParameterSet content = message.getMessageContent();
+        if ( content != null )
+        {
+            // NOTE: We are modifying the message here, on single JVM 
communication it will mess with the sent message...
+            ( (MutableParameterSet) content ).modifyValuesOfType( 
EntityId.class, new ParameterValueFilter<EntityId>()
+            {
+                public EntityId filter( final EntityId input )
+                {
+                    return input.createCopyWithAnotherContainerId( 
myExternalContainerIndex );
+                }
+            } );
+        }
+
         myLocalContainer.sendMessage( fixedSender, fixedTarget, message );
     }
 

Modified: 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/impl/local/LocalEntityContainer.java
===================================================================
--- 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/impl/local/LocalEntityContainer.java
        2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/impl/local/LocalEntityContainer.java
        2008-05-19 21:47:33 UTC (rev 548)
@@ -122,9 +122,16 @@
     }
 
 
-    public LocalEntity getNode( final String name )
+    public LocalEntity getEntity( final String name )
     {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+        final EntityId id = myBoundNames.get( name );
+
+        if ( id == null )
+        {
+            return null;
+        }
+
+        return getEntity( id );
     }
 
 
@@ -140,15 +147,17 @@
     }
 
 
-    public void bindName( final EntityId id, final String name )
+    private final Map<String, EntityId> myBoundNames = new HashMap<String, 
EntityId>();
+
+    public void bindName( final String name, final EntityId id )
     {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+        myBoundNames.put( name, id );
     }
 
 
-    public void bindName( final Entity node, final String name )
+    public void bindName( final String name, final Entity node )
     {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+        bindName( name, node.getId() );
     }
 
 
@@ -228,6 +237,7 @@
         } );
     }
 
+/*
     public <T extends EntityService> T getService( final Class<T> serviceType )
     {
         ParameterChecker.checkNotNull( serviceType, "serviceType" );
@@ -257,6 +267,7 @@
 
         myServices.put( type, service );
     }
+*/
 
     //======================================================================
     // Private Methods

Modified: 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/impl/sgs/SgsEntityContainer.java
===================================================================
--- 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/impl/sgs/SgsEntityContainer.java
    2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/impl/sgs/SgsEntityContainer.java
    2008-05-19 21:47:33 UTC (rev 548)
@@ -59,7 +59,7 @@
     }
 
 
-    public Entity getNode( final String name )
+    public Entity getEntity( final String name )
     {
         throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
     }
@@ -77,13 +77,13 @@
     }
 
 
-    public void bindName( final EntityId id, final String name )
+    public void bindName( final String name, final EntityId id )
     {
         throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
     }
 
 
-    public void bindName( final Entity node, final String name )
+    public void bindName( final String name, final Entity node )
     {
         throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
     }

Modified: 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/messaging/MessageImpl.java
===================================================================
--- 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/messaging/MessageImpl.java
  2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/core/src/main/java/org/skycastle/kernel/messaging/MessageImpl.java
  2008-05-19 21:47:33 UTC (rev 548)
@@ -73,4 +73,12 @@
         throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
     }
 
+
+    public String toString()
+    {
+        return "MessageImpl{" +
+               "myMessageType='" + myMessageType + '\'' +
+               ", myMessageContent=" + myMessageContent +
+               '}';
+    }
 }

Modified: 
trunk/skycastle/modules/core/src/test/java/org/skycastle/kernel/EntityTest.java
===================================================================
--- 
trunk/skycastle/modules/core/src/test/java/org/skycastle/kernel/EntityTest.java 
    2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/core/src/test/java/org/skycastle/kernel/EntityTest.java 
    2008-05-19 21:47:33 UTC (rev 548)
@@ -5,6 +5,7 @@
 import org.skycastle.kernel.impl.local.LocalEntityId;
 import org.skycastle.kernel.messaging.Message;
 import org.skycastle.kernel.messaging.MessageImpl;
+import org.skycastle.util.parameters.ParameterSetImpl;
 
 /**
  * @author Hans Haggstrom
@@ -104,6 +105,34 @@
         assertTrue( entity.hasFacet( DummyFacet2.class ) );
     }
 
+    public void 
testEntityIdsInMessagesAreTranslatedWhenMovedBetweenContainers()
+            throws Exception
+    {
+        BridgedExternalEntityContainers bridge = new 
BridgedExternalEntityContainers();
+
+        EntityContainer otherContainer = new LocalEntityContainer( false );
+
+        myContainer.addExternalNodeContainer( bridge.getContainerA() );
+        otherContainer.addExternalNodeContainer( bridge.getContainerB() );
+
+        myContainer.createEntity();
+        myContainer.createEntity();
+        Entity a = myContainer.createEntity();
+        final DummyFacet testFacet = new DummyFacet();
+        Entity b = otherContainer.createEntity( testFacet );
+
+
+        myContainer.sendMessage( a.getId(), new LocalEntityId( 1, 2 ), new 
MessageImpl( "Test", new ParameterSetImpl( "aId", a.getId() ) ) );
+
+        assertNotNull( testFacet.getLatestMessage() );
+
+        assertEquals( -1, a.getId().getContainerId() );
+
+        final EntityId messageEntityId = 
testFacet.getLatestMessage().getMessageContent().getParameter( "aId", null, 
EntityId.class );
+        assertEquals( 1, messageEntityId.getContainerId() );
+
+    }
+
     //======================================================================
     // Protected Methods
 

Modified: 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/ClientView.java
===================================================================
--- 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/ClientView.java
 2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/ClientView.java
 2008-05-19 21:47:33 UTC (rev 548)
@@ -1,11 +1,12 @@
 package org.skycastle.scratchpad.evolvingcreatures;
 
+import org.skycastle.kernel.BridgedExternalEntityContainers;
 import org.skycastle.kernel.Entity;
 import org.skycastle.kernel.EntityContainer;
 import org.skycastle.kernel.EntityId;
-import org.skycastle.kernel.ExternalEntityContainerBridge;
 import org.skycastle.kernel.impl.local.LocalEntityContainer;
 import org.skycastle.scratchpad.evolvingcreatures.facets.InputControllerFacet;
+import org.skycastle.scratchpad.evolvingcreatures.facets.MessageDebugFacet;
 
 /**
  * @author Hans Haggstrom
@@ -24,12 +25,16 @@
 
     public void start()
     {
-        myAvatarViewer = myContainer.createEntity();
+/*
+        myContainer.addService( new BruteForceLocationService() );
+*/
+
+        myAvatarViewer = myContainer.createEntity( MessageDebugFacet.class );
     }
 
     public void connectToServer( ServerModel serverModel )
     {
-        ExternalEntityContainerBridge bridge = new 
ExternalEntityContainerBridge();
+        BridgedExternalEntityContainers bridge = new 
BridgedExternalEntityContainers();
 
         final int serverIndex = myContainer.addExternalNodeContainer( 
bridge.getContainerA() );
 

Modified: 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/ServerModel.java
===================================================================
--- 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/ServerModel.java
        2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/ServerModel.java
        2008-05-19 21:47:33 UTC (rev 548)
@@ -30,7 +30,15 @@
 
     public void start()
     {
+
+        final Entity space = myContainer.createEntity( new SpaceFacet() );
+        myContainer.bindName( "Space", space );
+
         createInitialCreatures( myContainer );
+
+/*
+        myContainer.addService( new BruteForceLocationService() );
+*/
     }
 
     /**

Modified: 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/LocationFacet.java
===================================================================
--- 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/LocationFacet.java
       2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/LocationFacet.java
       2008-05-19 21:47:33 UTC (rev 548)
@@ -5,7 +5,6 @@
 import org.skycastle.kernel.EntityService;
 import org.skycastle.kernel.Facet;
 import org.skycastle.kernel.messaging.Message;
-import 
org.skycastle.scratchpad.evolvingcreatures.locationservice.LocationService;
 import org.skycastle.util.ParameterChecker;
 import org.skycastle.util.quadtree.AbstractLocatedObject;
 
@@ -14,6 +13,7 @@
  *
  * @author Hans Haggstrom
  */
+// TODO: Also keep track in which space this entity is located.
 public final class LocationFacet
         extends AbstractLocatedObject
         implements Facet
@@ -71,6 +71,7 @@
     {
         super( x, y );
 
+
         myDirection = direction;
     }
 
@@ -83,15 +84,27 @@
 
         myHostEntity = hostEntity;
 
+/*
         final LocationService locationService = getService( 
LocationService.class );
         locationService.addElement( myHostEntity );
+*/
+
+        final Entity space = myHostEntity.getContainer().getEntity( "Space" );
+        final SpaceFacet spaceFacet = space.getFacet( SpaceFacet.class );
+        spaceFacet.addEntity( myHostEntity.getId() );
     }
 
     public void deinit( final Entity hostEntity )
     {
+/*
         final LocationService locationService = getService( 
LocationService.class );
         locationService.removeElement( myHostEntity );
+*/
 
+        final Entity space = myHostEntity.getContainer().getEntity( "Space" );
+        final SpaceFacet spaceFacet = space.getFacet( SpaceFacet.class );
+        spaceFacet.removeEntity( myHostEntity.getId() );
+
         myHostEntity = null;
     }
 
@@ -175,16 +188,20 @@
     //======================================================================
     // Private Methods
 
-    /**
-     * @param serviceType the type of {@link EntityService} to get.
-     *
-     * @return the specified {@link EntityService].
-     *
-     * @throws IllegalArgumentException if the specified {@link EntityService} 
was not found.
-     */
+/*
+    */
+/**
+ * @param serviceType the type of {@link EntityService} to get.
+ *
+ * @return the specified {@link EntityService].
+ *
+ * @throws IllegalArgumentException if the specified {@link EntityService} was 
not found.
+ */
+/*
     private <T extends EntityService> T getService( final Class<T> serviceType 
)
     {
         return getHostEntity().getContainer().getService( serviceType );
     }
+*/
 
 }

Added: 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/MessageDebugFacet.java
===================================================================
--- 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/MessageDebugFacet.java
                           (rev 0)
+++ 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/MessageDebugFacet.java
   2008-05-19 21:47:33 UTC (rev 548)
@@ -0,0 +1,51 @@
+package org.skycastle.scratchpad.evolvingcreatures.facets;
+
+import org.skycastle.kernel.AbstractFacet;
+import org.skycastle.kernel.EntityId;
+import org.skycastle.kernel.Facet;
+import org.skycastle.kernel.messaging.Message;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * A {@link Facet} that logs the messages it recieves, to enable debugging.
+ *
+ * @author Hans Haggstrom
+ */
+public class MessageDebugFacet
+        extends AbstractFacet
+{
+
+    //======================================================================
+    // Private Constants
+
+    private static final Logger LOGGER = Logger.getLogger( 
MessageDebugFacet.class.getName() );
+
+    //======================================================================
+    // Public Methods
+
+    //----------------------------------------------------------------------
+    // Facet Implementation
+
+    public boolean shouldHandle( final String messageType )
+    {
+        return true;
+    }
+
+    public Facet createCopy()
+    {
+        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+    }
+
+    //----------------------------------------------------------------------
+    // MessageHandler Implementation
+
+
+    public void onMessage( final EntityId sender, final EntityId target, final 
Message message )
+    {
+        LOGGER.log( Level.INFO,
+                    "Entity '" + getHostEntity().getId() + "' received message 
sent from '" + sender + "' to '" + target + "' with the content: '" + message + 
"' " );
+    }
+
+}

Modified: 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/SensorFacet.java
===================================================================
--- 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/SensorFacet.java
 2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/SensorFacet.java
 2008-05-19 21:47:33 UTC (rev 548)
@@ -1,6 +1,7 @@
 package org.skycastle.scratchpad.evolvingcreatures.facets;
 
 import org.skycastle.kernel.AbstractFacet;
+import org.skycastle.kernel.Entity;
 import org.skycastle.kernel.EntityId;
 import org.skycastle.kernel.Facet;
 
@@ -12,16 +13,27 @@
 public class SensorFacet
         extends AbstractFacet
 {
+    private EntityId myListener;
+
     public SensorFacet()
     {
     }
 
-    public SensorFacet( final EntityId clientAvatarId )
+    public SensorFacet( final EntityId listener )
     {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+        myListener = listener;
 
     }
 
+    protected void onInitialized( final Entity hostEntity )
+    {
+        final Entity space = getContainer().getEntity( "Space" );
+
+        final SpaceFacet spaceFacet = space.getFacet( SpaceFacet.class );
+
+        spaceFacet.addEntityListener( myListener );
+    }
+
     public Facet createCopy()
     {
         throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT

Added: 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/SpaceFacet.java
===================================================================
--- 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/SpaceFacet.java
                          (rev 0)
+++ 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/facets/SpaceFacet.java
  2008-05-19 21:47:33 UTC (rev 548)
@@ -0,0 +1,149 @@
+package org.skycastle.scratchpad.evolvingcreatures.facets;
+
+import org.skycastle.kernel.AbstractFacet;
+import org.skycastle.kernel.Entity;
+import org.skycastle.kernel.EntityId;
+import org.skycastle.kernel.Facet;
+import org.skycastle.kernel.messaging.MessageImpl;
+import org.skycastle.util.ParameterChecker;
+import org.skycastle.util.parameters.ParameterSetImpl;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * A {@link Facet} that contains located {@link Entity}ies and allows 
listeners by area.
+ * <p/>
+ * This Space is just a brute force space, where everyone sees everyone.
+ * TODO: Create a grid type space, that consist of many spaces like this,
+ * but create the spaces lazily so we can have an infinite grid / surface.
+ *
+ * @author Hans Haggstrom
+ */
+// TODO: Allow interface facets, and different implementations of them.
+public final class SpaceFacet
+        extends AbstractFacet
+{
+
+    //======================================================================
+    // Private Fields
+
+    private final Set<EntityId> myContainedEntities = new HashSet<EntityId>();
+    private final Set<EntityId> myListeners = new HashSet<EntityId>();
+
+    //======================================================================
+    // Public Methods
+
+    //----------------------------------------------------------------------
+    // Constructors
+
+    public SpaceFacet()
+    {
+
+    }
+
+    //----------------------------------------------------------------------
+    // Facet Implementation
+
+    public Facet createCopy()
+    {
+        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+    }
+
+    //----------------------------------------------------------------------
+    // Other Public Methods
+
+    /**
+     * Adds an entity to this space.
+     *
+     * @param entityId
+     */
+    public void addEntity( EntityId entityId )
+    {
+        ParameterChecker.checkNotNull( entityId, "entityId" );
+
+        if ( !myContainedEntities.contains( entityId ) )
+        {
+            myContainedEntities.add( entityId );
+
+            final MessageImpl message = new MessageImpl( "Space.entityAdded",
+                                                         new ParameterSetImpl( 
"addedEntity", entityId ) );
+            sendMessageToListeners( message );
+        }
+    }
+
+    /**
+     * Adds an entity to this space.
+     */
+    public void removeEntity( EntityId entityId )
+    {
+        ParameterChecker.checkNotNull( entityId, "entityId" );
+
+        if ( myContainedEntities.contains( entityId ) )
+        {
+            myContainedEntities.remove( entityId );
+
+            final MessageImpl message = new MessageImpl( "Space.entityRemoved",
+                                                         new ParameterSetImpl( 
"removedEntity", entityId ) );
+            sendMessageToListeners( message );
+        }
+    }
+
+
+    /**
+     * Sends updates about entities that leave and enter this space to the 
specified entity
+     */
+    public void addEntityListener( EntityId listener )
+    {
+        ParameterChecker.checkNotNull( listener, "listener" );
+
+        if ( !myListeners.contains( listener ) )
+        {
+            myListeners.add( listener );
+
+            // Notify listener about current entities
+            final MessageImpl message = new MessageImpl( "Space.entitiesAdded",
+                                                         new ParameterSetImpl( 
"addedEntities", new ArrayList<EntityId>( myContainedEntities ) ) );
+
+            sendMessage( listener, message );
+        }
+    }
+
+    /**
+     */
+    public void removeEntityListener( EntityId listener )
+    {
+        ParameterChecker.checkNotNull( listener, "listener" );
+
+        if ( myListeners.contains( listener ) )
+        {
+            myListeners.remove( listener );
+
+            // Notify listener about removed entities
+            final MessageImpl message = new MessageImpl( 
"Space.entitiesRemoved",
+                                                         new ParameterSetImpl( 
"removedEntities", new ArrayList<EntityId>( myContainedEntities ) ) );
+
+            sendMessage( listener, message );
+        }
+    }
+
+    //======================================================================
+    // Private Methods
+
+    private void sendMessageToListeners( final MessageImpl message )
+    {
+        for ( EntityId listener : myListeners )
+        {
+            sendMessage( listener, message );
+        }
+    }
+
+    private void sendMessage( final EntityId listener, final MessageImpl 
message )
+    {
+        getContainer().sendMessage( getHostEntity().getId(),
+                                    listener,
+                                    message );
+    }
+
+}

Modified: 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/renderers/WorldEntitiesRenderer.java
===================================================================
--- 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/renderers/WorldEntitiesRenderer.java
    2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/renderers/WorldEntitiesRenderer.java
    2008-05-19 21:47:33 UTC (rev 548)
@@ -3,7 +3,6 @@
 import org.skycastle.kernel.Entity;
 import org.skycastle.scratchpad.evolvingcreatures.facets.AppearanceFacet;
 import org.skycastle.scratchpad.evolvingcreatures.facets.LocationFacet;
-import 
org.skycastle.scratchpad.evolvingcreatures.locationservice.LocationService;
 import org.skycastle.scratchpad.evolvingcreatures.world.World;
 import org.skycastle.util.ParameterChecker;
 import org.skycastle.util.parameters.MutableParameterSet;
@@ -64,10 +63,16 @@
                              final Camera2D camera,
                              final ParameterSet renderingParameters )
     {
+/*
         final LocationService locationService = 
myWorld.getEntityContainer().getService( LocationService.class );
+*/
 
+/*
         locationService.getElements( worldRegion, myTempElementCollection );
+*/
 
+        // TODO: Fix
+
         for ( Entity entity : myTempElementCollection )
         {
             // Project rendering position

Modified: 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/world/WorldImpl.java
===================================================================
--- 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/world/WorldImpl.java
    2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/scratchpad/src/main/java/org/skycastle/scratchpad/evolvingcreatures/world/WorldImpl.java
    2008-05-19 21:47:33 UTC (rev 548)
@@ -3,7 +3,6 @@
 import org.skycastle.kernel.EntityContainer;
 import org.skycastle.kernel.Facet;
 import org.skycastle.kernel.impl.local.LocalEntityContainer;
-import 
org.skycastle.scratchpad.evolvingcreatures.locationservice.BruteForceLocationService;
 import 
org.skycastle.scratchpad.evolvingcreatures.renderers.WorldEntitiesRenderer;
 import org.skycastle.util.tilemap.TileMap;
 import org.skycastle.util.tilemap.TileMapImpl;
@@ -40,7 +39,9 @@
      */
     public WorldImpl( final double zoom )
     {
+/*
         myEntityContainer.addService( new BruteForceLocationService() );
+*/
 
         myLayeredView.addLayer( myTileMap.getRenderer() );
         myLayeredView.addLayer( new WorldEntitiesRenderer( this ) );

Modified: 
trunk/skycastle/modules/scratchpad/src/test/java/org/skycastle/scratchpad/evolvingcreatures/world/WorldTest.java
===================================================================
--- 
trunk/skycastle/modules/scratchpad/src/test/java/org/skycastle/scratchpad/evolvingcreatures/world/WorldTest.java
    2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/scratchpad/src/test/java/org/skycastle/scratchpad/evolvingcreatures/world/WorldTest.java
    2008-05-19 21:47:33 UTC (rev 548)
@@ -1,15 +1,15 @@
 package org.skycastle.scratchpad.evolvingcreatures.world;
 
 import junit.framework.TestCase;
+import org.skycastle.kernel.DummyFacet;
 import org.skycastle.kernel.Entity;
-import org.skycastle.scratchpad.evolvingcreatures.facets.LocationFacet;
-import 
org.skycastle.scratchpad.evolvingcreatures.locationservice.LocationService;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  * @author Hans Haggstrom
+ * @deprecated doesnt test anything atm
  */
 @SuppressWarnings( { "JavaDoc" } )
 public class WorldTest
@@ -30,12 +30,20 @@
     public void testCreateWorld()
             throws Exception
     {
-        myWorld.createEntity( new LocationFacet( 9, 11 ) );
+        myWorld.createEntity( new DummyFacet() );
 
         final List<Entity> elements = new ArrayList<Entity>();
+
+/*
         myWorld.getEntityContainer().getService( LocationService.class 
).getElements( 10, 10, 5, elements );
+*/
 
+        // TODO: Fix
+
+/*
         assertSame( 1, elements.size() );
+*/
+        assertSame( 0, elements.size() );
     }
 
     //======================================================================

Modified: 
trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/MutableParameterSet.java
===================================================================
--- 
trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/MutableParameterSet.java
  2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/MutableParameterSet.java
  2008-05-19 21:47:33 UTC (rev 548)
@@ -1,5 +1,7 @@
 package org.skycastle.util.parameters;
 
+import org.skycastle.util.parameters.metadata.ParameterValueFilter;
+
 import java.io.Serializable;
 import java.util.List;
 import java.util.Map;
@@ -112,6 +114,15 @@
     void removeParameter( String name );
 
     /**
+     * Goes through this {@link ParameterSet} and any contained containers, 
and replaces each instance
+     * of the specified type with the one created by applying the filter 
function.
+     *
+     * @param typeToModify the type of values to apply the filter on.
+     * @param filter       the filter to apply to each value of the specified 
type.
+     */
+    <T extends Serializable> void modifyValuesOfType( final Class<T> 
typeToModify, ParameterValueFilter<T> filter );
+
+    /**
      * Removes all parameters.
      */
     void clear();

Modified: 
trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/ParameterSetImpl.java
===================================================================
--- 
trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/ParameterSetImpl.java
     2008-05-18 12:05:28 UTC (rev 547)
+++ 
trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/ParameterSetImpl.java
     2008-05-19 21:47:33 UTC (rev 548)
@@ -2,9 +2,11 @@
 
 import org.skycastle.util.ParameterChecker;
 import org.skycastle.util.StringUtilities;
+import org.skycastle.util.parameters.metadata.ParameterValueFilter;
 
 import java.io.Serializable;
 import java.util.*;
+import java.util.Map.Entry;
 
 /**
  * {@inheritDoc}
@@ -177,7 +179,43 @@
         }
     }
 
+    public <T extends Serializable> void modifyValuesOfType( final Class<T> 
typeToModify, final ParameterValueFilter<T> filter )
+    {
+        ParameterChecker.checkNotNull( typeToModify, "typeToModify" );
+        ParameterChecker.checkNotNull( filter, "filter" );
 
+        for ( Entry<String, Serializable> entry : myParameters.entrySet() )
+        {
+            final Serializable value = entry.getValue();
+            if ( value != null )
+            {
+                if ( typeToModify.isAssignableFrom( value.getClass() ) )
+                {
+                    //noinspection unchecked
+                    entry.setValue( filter.filter( (T) value ) );
+                }
+                else if ( value instanceof List )
+                {
+                    List list = (List) value;
+
+                    for ( int i = 0; i < list.size(); i++ )
+                    {
+                        Object o = list.get( i );
+                        if ( o != null && typeToModify.isAssignableFrom( 
o.getClass() ) )
+                        {
+                            //noinspection unchecked
+                            list.set( i, filter.filter( (T) o ) );
+                        }
+
+                    }
+                }
+
+                // TODO: Also check insides of collections, maps, etc?? Or 
come up with some more global id.
+            }
+        }
+    }
+
+
     public void clear()
     {
         myParameters.clear();
@@ -495,4 +533,20 @@
         return myParameters != null ? myParameters.hashCode() : 0;
     }
 
+
+    @Override
+    public String toString()
+    {
+        StringBuilder builder = new StringBuilder( 100 );
+
+        builder.append( "ParameterSet { \n" );
+        for ( Entry<String, Serializable> entry : myParameters.entrySet() )
+        {
+            builder.append( "  " ).append( entry.getKey() ).append( ": " 
).append( entry.getValue() ).append( "\n" );
+        }
+        builder.append( "} \n" );
+
+        return builder.toString();
+    }
+
 }

Added: 
trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/metadata/ParameterValueFilter.java
===================================================================
--- 
trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/metadata/ParameterValueFilter.java
                                (rev 0)
+++ 
trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/metadata/ParameterValueFilter.java
        2008-05-19 21:47:33 UTC (rev 548)
@@ -0,0 +1,14 @@
+package org.skycastle.util.parameters.metadata;
+
+/**
+ * An interface for filters that modify paramerer values.
+ *
+ * @author Hans Haggstrom
+ */
+public interface ParameterValueFilter<T>
+{
+    /**
+     * @return the filtered value for the specified input value.
+     */
+    T filter( T input );
+}


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

Other related posts:

  • » [skycastle-commits] SF.net SVN: skycastle: [548] trunk/skycastle/modules