Revision: 457 http://skycastle.svn.sourceforge.net/skycastle/?rev=457&view=rev Author: zzorn Date: 2008-04-14 09:43:49 -0700 (Mon, 14 Apr 2008) Log Message: ----------- Implemented collection property element removal and addition, now also messaages are sent. Modified Paths: -------------- trunk/skycastle/modules/core/src/main/java/org/skycastle/core/DefaultGameObject.java trunk/skycastle/modules/core/src/main/java/org/skycastle/core/property/PropertyFacade.java trunk/skycastle/modules/core/src/main/java/org/skycastle/core/property/PropertyFacadeImpl.java trunk/skycastle/modules/core/src/test/java/org/skycastle/core/AbstractGameObjectPropertiesTest.java trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/ParameterMetadataImpl.java Added Paths: ----------- trunk/skycastle/modules/core/src/main/java/org/skycastle/messaging/updates/property/CollectionPropertyElementAdded.java trunk/skycastle/modules/core/src/main/java/org/skycastle/messaging/updates/property/CollectionPropertyElementRemoved.java Modified: trunk/skycastle/modules/core/src/main/java/org/skycastle/core/DefaultGameObject.java =================================================================== --- trunk/skycastle/modules/core/src/main/java/org/skycastle/core/DefaultGameObject.java 2008-04-14 09:04:49 UTC (rev 456) +++ trunk/skycastle/modules/core/src/main/java/org/skycastle/core/DefaultGameObject.java 2008-04-14 16:43:49 UTC (rev 457) @@ -248,16 +248,16 @@ myPropertyFacade.removeProperty( propertyIdentifier ); } - public void addPropertyItem( final String propertyIdentifier, final Serializable collectionPropertyItem ) + public void addPropertyElement( final String propertyIdentifier, final Serializable collectionPropertyItem ) throws ParameterValidationException { - myPropertyFacade.addPropertyItem( propertyIdentifier, collectionPropertyItem ); + myPropertyFacade.addPropertyElement( propertyIdentifier, collectionPropertyItem ); } - public void removePropertyItem( final String propertyIdentifier, final Serializable collectionPropertyItem ) + public void removePropertyElement( final String propertyIdentifier, final Serializable collectionPropertyItem ) throws ParameterValidationException { - myPropertyFacade.removePropertyItem( propertyIdentifier, collectionPropertyItem ); + myPropertyFacade.removePropertyElement( propertyIdentifier, collectionPropertyItem ); } public void addPropertyMapping( final String propertyIdentifier, final Serializable key, final Serializable value ) Modified: trunk/skycastle/modules/core/src/main/java/org/skycastle/core/property/PropertyFacade.java =================================================================== --- trunk/skycastle/modules/core/src/main/java/org/skycastle/core/property/PropertyFacade.java 2008-04-14 09:04:49 UTC (rev 456) +++ trunk/skycastle/modules/core/src/main/java/org/skycastle/core/property/PropertyFacade.java 2008-04-14 16:43:49 UTC (rev 457) @@ -153,7 +153,7 @@ * * @throws ParameterValidationException a {@link ParameterValidationException} describing the error if there was a problem. */ - void addPropertyItem( String propertyIdentifier, Serializable collectionPropertyItem ) + void addPropertyElement( String propertyIdentifier, Serializable collectionPropertyItem ) throws ParameterValidationException; /** @@ -164,7 +164,7 @@ * * @throws ParameterValidationException a {@link ParameterValidationException} describing the error if there was a problem. */ - void removePropertyItem( String propertyIdentifier, Serializable collectionPropertyItem ) + void removePropertyElement( String propertyIdentifier, Serializable collectionPropertyItem ) throws ParameterValidationException; /** Modified: trunk/skycastle/modules/core/src/main/java/org/skycastle/core/property/PropertyFacadeImpl.java =================================================================== --- trunk/skycastle/modules/core/src/main/java/org/skycastle/core/property/PropertyFacadeImpl.java 2008-04-14 09:04:49 UTC (rev 456) +++ trunk/skycastle/modules/core/src/main/java/org/skycastle/core/property/PropertyFacadeImpl.java 2008-04-14 16:43:49 UTC (rev 457) @@ -3,10 +3,7 @@ import org.skycastle.core.AbstractFacade; import org.skycastle.core.GameObject; import org.skycastle.core.GameObjectContext; -import org.skycastle.messaging.updates.property.CollectionPropertyItemAdded; -import org.skycastle.messaging.updates.property.PropertyAddedMessage; -import org.skycastle.messaging.updates.property.PropertyChangedMessage; -import org.skycastle.messaging.updates.property.PropertyRemovedMessage; +import org.skycastle.messaging.updates.property.*; import org.skycastle.util.ParameterChecker; import org.skycastle.util.StringUtilities; import org.skycastle.util.listenable.map.ListenableLinkedMap; @@ -47,6 +44,7 @@ private static final String PROBLEM_WHEN_ADDING_PROPERTY = "Problem when adding property"; private static final String PROBLEM_WHEN_REMOVING_PROPERTY = "Problem when removing property"; private static final String PROBLEM_WHEN_ADDING_COLLECTION_PROPERTY_ITEM = "Can not add collection property item"; + private static final String PROBLEM_WHEN_REMOVING_COLLECTION_PROPERTY_ITEM = "Can not remove collection property item"; //====================================================================== // Public Methods @@ -239,7 +237,7 @@ propertyIdentifier ) ); } - public void addPropertyItem( final String propertyIdentifier, final Serializable collectionPropertyItem ) + public void addPropertyElement( final String propertyIdentifier, final Serializable collectionPropertyItem ) throws ParameterValidationException { // Check that the property exists @@ -289,13 +287,26 @@ collection.add( collectionPropertyItem ); // Notify about addition - getGameObject().sendUpdateToObservers( new CollectionPropertyItemAdded( getId(), propertyIdentifier, collectionPropertyItem ) ); + getGameObject().sendUpdateToObservers( new CollectionPropertyElementAdded( getId(), propertyIdentifier, collectionPropertyItem ) ); } - public void removePropertyItem( final String propertyIdentifier, final Serializable collectionPropertyItem ) + public void removePropertyElement( final String propertyIdentifier, final Serializable collectionPropertyItem ) throws ParameterValidationException { - throw new UnsupportedOperationException( "This method has not yet been implemented." ); // IMPLEMENT + // Check that the property exists + ensurePropertyExists( propertyIdentifier, PROBLEM_WHEN_REMOVING_COLLECTION_PROPERTY_ITEM ); + + // Remove property + Collection collection = (Collection) myPropertyValues.get( propertyIdentifier ); + + if ( collection != null ) + { + //noinspection unchecked + collection.remove( collectionPropertyItem ); + } + + // Notify about removal + getGameObject().sendUpdateToObservers( new CollectionPropertyElementRemoved( getId(), propertyIdentifier, collectionPropertyItem ) ); } public void addPropertyMapping( final String propertyIdentifier, final Serializable key, final Serializable value ) Copied: trunk/skycastle/modules/core/src/main/java/org/skycastle/messaging/updates/property/CollectionPropertyElementAdded.java (from rev 456, trunk/skycastle/modules/core/src/main/java/org/skycastle/messaging/updates/property/CollectionPropertyItemAdded.java) =================================================================== --- trunk/skycastle/modules/core/src/main/java/org/skycastle/messaging/updates/property/CollectionPropertyElementAdded.java (rev 0) +++ trunk/skycastle/modules/core/src/main/java/org/skycastle/messaging/updates/property/CollectionPropertyElementAdded.java 2008-04-14 16:43:49 UTC (rev 457) @@ -0,0 +1,75 @@ +package org.skycastle.messaging.updates.property; + +import org.skycastle.core.GameObjectContext; +import org.skycastle.core.GameObjectId; +import org.skycastle.messaging.updates.MemberUpdateMessage; +import org.skycastle.util.parameters.ValidationError; + +import java.io.Serializable; +import java.util.Set; + +/** + * Indicates that an item was added to a collection property. + * + * @author Hans Haggstrom + */ +public final class CollectionPropertyElementAdded + extends MemberUpdateMessage +{ + + //====================================================================== + // Private Fields + + private final Serializable myAddedItem; + + //====================================================================== + // Private Constants + + private static final long serialVersionUID = 1L; + + //====================================================================== + // Public Methods + + //---------------------------------------------------------------------- + // Constructors + + public CollectionPropertyElementAdded( final GameObjectId updatedObjectId, final String memberIdentifier, final Serializable addedItem ) + { + super( updatedObjectId, memberIdentifier ); + + myAddedItem = addedItem; + } + + //---------------------------------------------------------------------- + // Message Implementation + + @Override + public ValidationError validate( final Set<String> allowedContainedTypes, final String errorPrefix ) + { + ValidationError validationError = super.validate( allowedContainedTypes, errorPrefix ); + + if ( validationError == null ) + { + validationError = checkValue( myAddedItem, "addedItem", allowedContainedTypes ); + } + + return validationError; + } + + //---------------------------------------------------------------------- + // UpdateMessage Implementation + + public void applyStateChangeToModel( final GameObjectContext gameObjectContext ) + { + throw new UnsupportedOperationException( "This method has not yet been implemented." ); // IMPLEMENT + } + + //---------------------------------------------------------------------- + // Other Public Methods + + public Serializable getAddedItem() + { + return myAddedItem; + } + +} Copied: trunk/skycastle/modules/core/src/main/java/org/skycastle/messaging/updates/property/CollectionPropertyElementRemoved.java (from rev 456, trunk/skycastle/modules/core/src/main/java/org/skycastle/messaging/updates/property/CollectionPropertyItemRemoved.java) =================================================================== --- trunk/skycastle/modules/core/src/main/java/org/skycastle/messaging/updates/property/CollectionPropertyElementRemoved.java (rev 0) +++ trunk/skycastle/modules/core/src/main/java/org/skycastle/messaging/updates/property/CollectionPropertyElementRemoved.java 2008-04-14 16:43:49 UTC (rev 457) @@ -0,0 +1,77 @@ +package org.skycastle.messaging.updates.property; + +import org.skycastle.core.GameObjectContext; +import org.skycastle.core.GameObjectId; +import org.skycastle.messaging.updates.MemberUpdateMessage; +import org.skycastle.util.parameters.ValidationError; + +import java.io.Serializable; +import java.util.Set; + +/** + * Indicates that an item was removed from a collection property. + * + * @author Hans Haggstrom + */ +public final class CollectionPropertyElementRemoved + extends MemberUpdateMessage +{ + + //====================================================================== + // Private Fields + + private final Serializable myRemovedItem; + + //====================================================================== + // Private Constants + + //====================================================================== + // Private Constants + private static final long serialVersionUID = 1L; + + //====================================================================== + // Public Methods + + //---------------------------------------------------------------------- + // Constructors + + public CollectionPropertyElementRemoved( final GameObjectId updatedObjectId, final String memberIdentifier, final Serializable removedItem ) + { + super( updatedObjectId, memberIdentifier ); + + myRemovedItem = removedItem; + } + + //---------------------------------------------------------------------- + // Message Implementation + + @Override + public ValidationError validate( final Set<String> allowedContainedTypes, final String errorPrefix ) + { + ValidationError validationError = super.validate( allowedContainedTypes, errorPrefix ); + + if ( validationError == null ) + { + validationError = checkValue( myRemovedItem, "addedItem", allowedContainedTypes ); + } + + return validationError; + } + + //---------------------------------------------------------------------- + // UpdateMessage Implementation + + public void applyStateChangeToModel( final GameObjectContext gameObjectContext ) + { + throw new UnsupportedOperationException( "This method has not yet been implemented." ); // IMPLEMENT + } + + //---------------------------------------------------------------------- + // Other Public Methods + + public Serializable getRemovedItem() + { + return myRemovedItem; + } + +} \ No newline at end of file Modified: trunk/skycastle/modules/core/src/test/java/org/skycastle/core/AbstractGameObjectPropertiesTest.java =================================================================== --- trunk/skycastle/modules/core/src/test/java/org/skycastle/core/AbstractGameObjectPropertiesTest.java 2008-04-14 09:04:49 UTC (rev 456) +++ trunk/skycastle/modules/core/src/test/java/org/skycastle/core/AbstractGameObjectPropertiesTest.java 2008-04-14 16:43:49 UTC (rev 457) @@ -6,9 +6,7 @@ import org.skycastle.messaging.modifications.RemovePropertyMessage; import org.skycastle.messaging.modifications.property.AddPropertyMessage; import org.skycastle.messaging.modifications.property.SetPropertyMessage; -import org.skycastle.messaging.updates.property.PropertyAddedMessage; -import org.skycastle.messaging.updates.property.PropertyChangedMessage; -import org.skycastle.messaging.updates.property.PropertyRemovedMessage; +import org.skycastle.messaging.updates.property.*; import org.skycastle.util.parameters.ParameterMetadataImpl; import org.skycastle.util.parameters.ParameterValidationException; import org.skycastle.util.parameters.validators.notnull.NotNullValidator; @@ -33,6 +31,7 @@ private GameObject myGameObject; private List<Message> mySentMessages; + private ParameterMetadataImpl myMenuPropertyMetadata; //====================================================================== // Private Constants @@ -96,26 +95,52 @@ assertEquals( 0, getNumberOfProperties() ); } - public void testAddingToCollectionProperty() + public void testCollectionPropertyItemAddition() throws Exception { - final ParameterMetadataImpl valueMetadata = new ParameterMetadataImpl( String.class, - true, - new UiMetadataImpl( "Dish", "Name of lunch dish" ) ); - myGameObject.addProperty( "menu", - new ArrayList(), - new ParameterMetadataImpl( List.class, - true, - new UiMetadataImpl( "Menu", "This is what's for lunch" ), - valueMetadata ) ); + myGameObject.addProperty( "menu", new ArrayList(), myMenuPropertyMetadata ); + myGameObject.addPropertyElement( "menu", "bread" ); + myGameObject.addPropertyElement( "menu", "water" ); - myGameObject.addPropertyItem( "menu", "bread" ); - myGameObject.addPropertyItem( "menu", "water" ); - assertEquals( Arrays.asList( "bread", "water" ), myGameObject.getPropertyValue( "menu", null ) ); } + public void testCollectionPropertyItemRemoval() + throws Exception + { + myGameObject.addProperty( "menu", null, myMenuPropertyMetadata ); + myGameObject.addPropertyElement( "menu", "bread" ); + myGameObject.addPropertyElement( "menu", "water" ); + myGameObject.removePropertyElement( "menu", "bread" ); + + assertEquals( Arrays.asList( "water" ), myGameObject.getPropertyValue( "menu", null ) ); + } + + public void testCollectionPropertyItemAdditionSendsUpdateMessage() + throws Exception + { + myGameObject.addProperty( "menu", null, myMenuPropertyMetadata ); + myGameObject.addPropertyElement( "menu", "bread" ); + myGameObject.addPropertyElement( "menu", "water" ); + + assertEquals( "bread", ( (CollectionPropertyElementAdded) getMessage( 1 ) ).getAddedItem() ); + assertEquals( "water", ( (CollectionPropertyElementAdded) getMessage( 2 ) ).getAddedItem() ); + } + + public void testCollectionPropertyItemRemovalSendsUpdateMessage() + throws Exception + { + myGameObject.addProperty( "menu", null, myMenuPropertyMetadata ); + myGameObject.addPropertyElement( "menu", "bread" ); + myGameObject.addPropertyElement( "menu", "water" ); + myGameObject.removePropertyElement( "menu", "bread" ); + myGameObject.removePropertyElement( "menu", "water" ); + + assertEquals( "bread", ( (CollectionPropertyElementRemoved) getMessage( 3 ) ).getRemovedItem() ); + assertEquals( "water", ( (CollectionPropertyElementRemoved) getMessage( 4 ) ).getRemovedItem() ); + } + public void testGetPropertyIdentifiers() throws Exception { @@ -293,6 +318,13 @@ } } ); + + myMenuPropertyMetadata = new ParameterMetadataImpl( List.class, + true, + new UiMetadataImpl( "Menu", "This is what's for lunch" ), + new ParameterMetadataImpl( String.class, + true, + new UiMetadataImpl( "Dish", "Name of lunch dish" ) ) ); } //====================================================================== Modified: trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/ParameterMetadataImpl.java =================================================================== --- trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/ParameterMetadataImpl.java 2008-04-14 09:04:49 UTC (rev 456) +++ trunk/skycastle/modules/utils/src/main/java/org/skycastle/util/parameters/ParameterMetadataImpl.java 2008-04-14 16:43:49 UTC (rev 457) @@ -351,16 +351,11 @@ private ValidationError validateType( final Object parameter, final String parameterIdentifier ) { - if ( !myType.isInstance( parameter ) ) + if ( parameter != null && + !myType.isInstance( parameter ) ) { - Class actualType = null; - if ( parameter != null ) - { - actualType = parameter.getClass(); - } - return new ValidationError( parameterIdentifier, - "the type of the parameter is wrong, expected '" + myType + "' but was '" + actualType + "' " ); + "the type of the parameter is wrong, expected '" + myType + "' but was '" + parameter.getClass() + "' " ); } return null; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.