You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by pa...@apache.org on 2015/07/20 17:32:37 UTC

[1/6] zest-qi4j git commit: Build, minor edits

Repository: zest-qi4j
Updated Branches:
  refs/heads/develop 3a2f6c948 -> 9f02f2ca0


Build, minor edits


Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/7b827e6e
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/7b827e6e
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/7b827e6e

Branch: refs/heads/develop
Commit: 7b827e6e0b15e9199249ce0721c145a2a7586472
Parents: 3a2f6c9
Author: Paul Merlin <pa...@apache.org>
Authored: Mon Jul 20 14:21:01 2015 +0200
Committer: Paul Merlin <pa...@apache.org>
Committed: Mon Jul 20 14:21:01 2015 +0200

----------------------------------------------------------------------
 .../valueserialization-jackson/build.gradle     |  2 +-
 .../src/test/resources/logback-test.xml         | 34 -------------------
 .../valueserialization-orgjson/build.gradle     |  2 +-
 extensions/valueserialization-stax/build.gradle |  2 +-
 .../src/test/resources/logback-test.xml         | 35 --------------------
 5 files changed, 3 insertions(+), 72 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/7b827e6e/extensions/valueserialization-jackson/build.gradle
----------------------------------------------------------------------
diff --git a/extensions/valueserialization-jackson/build.gradle b/extensions/valueserialization-jackson/build.gradle
index f821472..616e01b 100644
--- a/extensions/valueserialization-jackson/build.gradle
+++ b/extensions/valueserialization-jackson/build.gradle
@@ -29,7 +29,7 @@ dependencies {
     testCompile project(":org.qi4j.core:org.qi4j.core.testsupport")
 
     testRuntime project(":org.qi4j.core:org.qi4j.core.runtime")
-    testRuntime libraries.logback
+    testRuntime libraries.slf4j_simple
 
 }
 

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/7b827e6e/extensions/valueserialization-jackson/src/test/resources/logback-test.xml
----------------------------------------------------------------------
diff --git a/extensions/valueserialization-jackson/src/test/resources/logback-test.xml b/extensions/valueserialization-jackson/src/test/resources/logback-test.xml
deleted file mode 100644
index 22be2c1..0000000
--- a/extensions/valueserialization-jackson/src/test/resources/logback-test.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-  
-  http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<configuration>
-
-    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <Pattern>%-5level %logger{24} - %msg%n</Pattern>
-        </layout>
-    </appender>
-
-    <root level="info">
-        <appender-ref ref="stdout" />
-    </root>
-
-    <logger name="org.qi4j.spi.value" level="trace"/>
-    <logger name="org.qi4j.test.value" level="trace"/>
-    <logger name="org.qi4j.stateserializer" level="trace"/>
-
-</configuration>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/7b827e6e/extensions/valueserialization-orgjson/build.gradle
----------------------------------------------------------------------
diff --git a/extensions/valueserialization-orgjson/build.gradle b/extensions/valueserialization-orgjson/build.gradle
index a06c1de..a919f4e 100644
--- a/extensions/valueserialization-orgjson/build.gradle
+++ b/extensions/valueserialization-orgjson/build.gradle
@@ -28,7 +28,7 @@ dependencies {
     testCompile project(":org.qi4j.core:org.qi4j.core.testsupport")
 
     testRuntime project(":org.qi4j.core:org.qi4j.core.runtime")
-    testRuntime libraries.logback
+    testRuntime libraries.slf4j_simple
 
 }
 

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/7b827e6e/extensions/valueserialization-stax/build.gradle
----------------------------------------------------------------------
diff --git a/extensions/valueserialization-stax/build.gradle b/extensions/valueserialization-stax/build.gradle
index c89c7a1..ea05136 100644
--- a/extensions/valueserialization-stax/build.gradle
+++ b/extensions/valueserialization-stax/build.gradle
@@ -29,7 +29,7 @@ dependencies {
     testCompile project(":org.qi4j.core:org.qi4j.core.testsupport")
 
     testRuntime project(":org.qi4j.core:org.qi4j.core.runtime")
-    testRuntime libraries.logback
+    testRuntime libraries.slf4j_simple
 
 }
 

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/7b827e6e/extensions/valueserialization-stax/src/test/resources/logback-test.xml
----------------------------------------------------------------------
diff --git a/extensions/valueserialization-stax/src/test/resources/logback-test.xml b/extensions/valueserialization-stax/src/test/resources/logback-test.xml
deleted file mode 100644
index 199f328..0000000
--- a/extensions/valueserialization-stax/src/test/resources/logback-test.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-  
-  http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<configuration>
-
-    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <Pattern>%-5level %logger{24} - %msg%n</Pattern>
-        </layout>
-    </appender>
-
-    <root level="info">
-        <appender-ref ref="stdout" />
-    </root>
-
-    <logger name="org.qi4j.spi.value" level="debug"/>
-    <logger name="org.qi4j.test.value" level="debug"/>
-    <logger name="org.qi4j.valueserializer" level="debug"/>
-    <logger name="org.qi4j.valueserialization" level="debug"/>
-
-</configuration>
\ No newline at end of file


[3/6] zest-qi4j git commit: ValueSerialization tests: better DateTime construction for equality test

Posted by pa...@apache.org.
ValueSerialization tests: better DateTime construction for equality test


Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/eaeba9ca
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/eaeba9ca
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/eaeba9ca

Branch: refs/heads/develop
Commit: eaeba9cac092c059b91afa93ab5989aa44a6bdc6
Parents: 3e3e89d
Author: Paul Merlin <pa...@apache.org>
Authored: Mon Jul 20 16:48:14 2015 +0200
Committer: Paul Merlin <pa...@apache.org>
Committed: Mon Jul 20 16:48:14 2015 +0200

----------------------------------------------------------------------
 .../qi4j/test/value/AbstractPlainValueSerializationTest.java    | 2 ++
 .../test/value/AbstractValueCompositeSerializationTest.java     | 5 ++++-
 2 files changed, 6 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/eaeba9ca/core/testsupport/src/main/java/org/qi4j/test/value/AbstractPlainValueSerializationTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/qi4j/test/value/AbstractPlainValueSerializationTest.java b/core/testsupport/src/main/java/org/qi4j/test/value/AbstractPlainValueSerializationTest.java
index a99b1f2..218cca6 100644
--- a/core/testsupport/src/main/java/org/qi4j/test/value/AbstractPlainValueSerializationTest.java
+++ b/core/testsupport/src/main/java/org/qi4j/test/value/AbstractPlainValueSerializationTest.java
@@ -190,6 +190,8 @@ public abstract class AbstractPlainValueSerializationTest
     @Test
     public void givenDateTimeValueWhenSerializingAndDeserializingExpectEquals()
     {
+        // We specify the TimeZone explicitely here so that serialized/deserialized is equals
+        // See https://github.com/JodaOrg/joda-time/issues/106
         String serialized = valueSerialization.serialize( new DateTime( "2020-03-04T13:24:35", forOffsetHours( 1 ) ) );
         assertThat( serialized, equalTo( "2020-03-04T13:24:35.000+01:00" ) );
         DateTime deserialized = valueSerialization.deserialize( DateTime.class, serialized );

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/eaeba9ca/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java b/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
index 4bece76..71135a0 100644
--- a/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
+++ b/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
@@ -24,6 +24,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 import org.joda.time.LocalDate;
 import org.joda.time.LocalDateTime;
 import org.junit.Before;
@@ -152,7 +153,9 @@ public abstract class AbstractValueCompositeSerializationTest
         proto.string2().set( "/Foo/bar" );
         proto.number().set( 42L );
         proto.date().set( new Date() );
-        proto.dateTime().set( new DateTime() );
+        // We specify the TimeZone explicitely here so that serialized/deserialized is equals
+        // See https://github.com/JodaOrg/joda-time/issues/106
+        proto.dateTime().set( new DateTime( "2020-03-04T13:24:35", DateTimeZone.forOffsetHours( 1 ) ) );
         proto.localDate().set( new LocalDate() );
         proto.localDateTime().set( new LocalDateTime() );
         proto.entityReference().set( EntityReference.parseEntityReference( "12345" ) );


[4/6] zest-qi4j git commit: ValueSerialization tests: comment arrayOfValues as it is not supported

Posted by pa...@apache.org.
ValueSerialization tests: comment arrayOfValues as it is not supported

Commented Property<SomeValue[]> usage in
AbstractValueCompositeSerializationTest as arrays are not supported.


Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/bb14d5b0
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/bb14d5b0
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/bb14d5b0

Branch: refs/heads/develop
Commit: bb14d5b07dbc0a3a3a45a11d77d308d2d3129b9f
Parents: eaeba9c
Author: Paul Merlin <pa...@apache.org>
Authored: Mon Jul 20 16:51:42 2015 +0200
Committer: Paul Merlin <pa...@apache.org>
Committed: Mon Jul 20 16:51:42 2015 +0200

----------------------------------------------------------------------
 .../qi4j/test/value/AbstractValueCompositeSerializationTest.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/bb14d5b0/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java b/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
index 71135a0..82947e9 100644
--- a/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
+++ b/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
@@ -171,7 +171,7 @@ public abstract class AbstractValueCompositeSerializationTest
 
         proto.stringValueMap().get().put( "foo", anotherValue1 );
         proto.another().set( anotherValue1 );
-        proto.arrayOfValues().set( new AnotherValue[] { anotherValue1, anotherValue2, anotherValue3 } );
+        // proto.arrayOfValues().set( new AnotherValue[] { anotherValue1, anotherValue2, anotherValue3 } );
         proto.serializable().set( new SerializableObject() );
         proto.foo().set( module.newValue( FooValue.class ) );
         proto.fooValue().set( module.newValue( FooValue.class ) );
@@ -261,7 +261,7 @@ public abstract class AbstractValueCompositeSerializationTest
 
         Property<AnotherValue> another();
 
-        Property<AnotherValue[]> arrayOfValues();
+        // Property<AnotherValue[]> arrayOfValues();
 
         @Optional
         Property<AnotherValue> anotherNull();


[5/6] zest-qi4j git commit: Update DOAP file to be on par with https://zest.apache.org/doap.rdf

Posted by pa...@apache.org.
Update DOAP file to be on par with https://zest.apache.org/doap.rdf


Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/06d80149
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/06d80149
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/06d80149

Branch: refs/heads/develop
Commit: 06d80149bf41c0ac4b441350b4056a9dbd5c55af
Parents: bb14d5b
Author: Paul Merlin <pa...@apache.org>
Authored: Mon Jul 20 16:52:49 2015 +0200
Committer: Paul Merlin <pa...@apache.org>
Committed: Mon Jul 20 16:52:49 2015 +0200

----------------------------------------------------------------------
 doap.rdf | 38 ++++++++++++++++++--------------------
 1 file changed, 18 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/06d80149/doap.rdf
----------------------------------------------------------------------
diff --git a/doap.rdf b/doap.rdf
index 5c24e5f..537a6a0 100644
--- a/doap.rdf
+++ b/doap.rdf
@@ -1,4 +1,5 @@
 <?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl"?>
 <!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
@@ -15,8 +16,6 @@
   See the License for the specific language governing permissions and
   limitations under the License.
 -->
-
-<?xml-stylesheet type="text/xsl"?>
 <rdf:RDF xml:lang="en"
          xmlns="http://usefulinc.com/ns/doap#" 
          xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
@@ -34,29 +33,28 @@
     <created>2008-12-17</created>
     <license rdf:resource="http://usefulinc.com/doap/licenses/asl20" />
     <name>Apache Zest</name>
-    <homepage rdf:resource="http://zest.apache.org/" />
-    <asfext:pmc rdf:resource="http://zest.apache.org/" />
-    <shortdesc>Apache Zest is an open source platform for composite oriented programming.</shortdesc>
-    <description>Apache Zest is an open source platform for composite oriented programming. Zest is home for Qi4j,
-    the composite oriented programming platform for Java, and Qi4Net a port to the .NET CLR.
-    Composite oriented programming allows developers to work with 'fragments', smaller than classes, and 'compose'
-    fragments into larger 'composites' which acts like the regular objects. Zest also tackles the enforcement
-    of application composition, i.e. composites are declared in modules, modules are contained in layers and access
-    between layers are controlled/enforced.
-    </description>
-    <bug-database rdf:resource="http://issues.apache.org/jira/browse/ZEST" />
-    <mailing-list rdf:resource="http://zest.apache.org/community/get_help.html" />
-    <download-page rdf:resource="http://zest.apache.org/download.html" />
-
+    <homepage rdf:resource="https://zest.apache.org/" />
+    <asfext:pmc rdf:resource="https://zest.apache.org" />
+    <shortdesc>Apache Zest is a community based effort exploring Composite Oriented Programming for domain centric application development.</shortdesc>
+    <description>Apache Zest is a community based effort exploring Composite Oriented Programming for domain centric application development. This includes evolved concepts from Aspect Oriented Programming, Dependency Injection and Domain Driven Design. Composite Oriented Programming allows developers to work with 'fragments', smaller than classes, and 'compose' fragments into larger 'composites' which acts like the regular objects. Zest also tackles the enforcement of application composition, i.e. composites are declared in modules, modules are contained in layers and access between layers are controlled/enforced. Apache Zestâ„¢ (Java Edition), first Apache Zest sub-project, is an implementation of Composite Oriented Programming, using the standard Java platform, without the use of any pre-processors or new language elements. Everything you know from Java still applies and you can leverage both your experience and toolkits to become more productive with Composite Oriented Programmi
 ng today.</description>    
+    <bug-database rdf:resource="https://issues.apache.org/jira/browse/ZEST" />
+    <mailing-list rdf:resource="https://www.apache.org/foundation/mailinglists.html" />
+    <download-page rdf:resource="https://zest.apache.org/download.html" />
     <programming-language>Java</programming-language>
     <programming-language>C#</programming-language>
-    <programming-language>JavaScript</programming-language>
-    <programming-language>Ruby</programming-language>
     <programming-language>Scala</programming-language>
-    <category rdf:resource="http://projects.apache.org/category/osgi" />
+    <programming-language>Groovy</programming-language>
+    <programming-language>JavaScript</programming-language>
+    <category rdf:resource="http://projects.apache.org/category/library" />
+    <repository>
+      <SVNRepository>
+        <location rdf:resource="http://svn.apache.org/repos/asf/zest/"/>
+        <browse rdf:resource="http://svn.apache.org/viewcvs.cgi/zest/"/>
+      </SVNRepository>
+    </repository>
     <repository>
       <GitRepository>
-        <location rdf:resource="https://github.com/apache/zest-qi4j.git"/>
+        <location rdf:resource="https://git-wip-us.apache.org/repos/asf/zest-qi4j.git"/>
         <browse rdf:resource="https://github.com/apache/zest-qi4j"/>
       </GitRepository>
     </repository>


[6/6] zest-qi4j git commit: EventSourcing: fix Memory EventStore backward source & stabilize test

Posted by pa...@apache.org.
EventSourcing: fix Memory EventStore backward source & stabilize test


Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/9f02f2ca
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/9f02f2ca
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/9f02f2ca

Branch: refs/heads/develop
Commit: 9f02f2ca05ff778df7200880dc941dd645576aa3
Parents: 06d8014
Author: Paul Merlin <pa...@apache.org>
Authored: Mon Jul 20 17:32:15 2015 +0200
Committer: Paul Merlin <pa...@apache.org>
Committed: Mon Jul 20 17:32:15 2015 +0200

----------------------------------------------------------------------
 .../MemoryApplicationEventStoreService.java     | 22 +++++++----------
 .../application/ApplicationEventTest.java       | 25 ++++++++++++++------
 2 files changed, 26 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9f02f2ca/libraries/eventsourcing/src/main/java/org/qi4j/library/eventsourcing/application/source/memory/MemoryApplicationEventStoreService.java
----------------------------------------------------------------------
diff --git a/libraries/eventsourcing/src/main/java/org/qi4j/library/eventsourcing/application/source/memory/MemoryApplicationEventStoreService.java b/libraries/eventsourcing/src/main/java/org/qi4j/library/eventsourcing/application/source/memory/MemoryApplicationEventStoreService.java
index cce6cf4..6fa2bce 100644
--- a/libraries/eventsourcing/src/main/java/org/qi4j/library/eventsourcing/application/source/memory/MemoryApplicationEventStoreService.java
+++ b/libraries/eventsourcing/src/main/java/org/qi4j/library/eventsourcing/application/source/memory/MemoryApplicationEventStoreService.java
@@ -109,25 +109,19 @@ public interface MemoryApplicationEventStoreService
                             public <ReceiverThrowableType extends Throwable> void sendTo( Receiver<? super TransactionApplicationEvents, ReceiverThrowableType> receiver )
                                 throws ReceiverThrowableType, IOException
                             {
-                                ListIterator<TransactionApplicationEvents> iterator = store.listIterator();
+                                Iterator<TransactionApplicationEvents> iterator = store.descendingIterator();
 
-                                while( iterator.hasNext() )
+                                long count = 0;
+
+                                while( iterator.hasNext() && count < maxTransactions )
                                 {
                                     TransactionApplicationEvents next = iterator.next();
-                                    if( next.timestamp().get() >= beforeTimestamp )
+                                    if( next.timestamp().get() < beforeTimestamp )
                                     {
-                                        break;
+                                        receiver.receive( next );
+                                        count++;
                                     }
                                 }
-
-                                long count = 0;
-
-                                while( iterator.hasPrevious() && count < maxTransactions )
-                                {
-                                    TransactionApplicationEvents next = iterator.previous();
-                                    receiver.receive( next );
-                                    count++;
-                                }
                             }
                         });
                     }
@@ -142,7 +136,7 @@ public interface MemoryApplicationEventStoreService
         @Override
         protected void storeEvents( TransactionApplicationEvents transactionDomain ) throws IOException
         {
-            store.add(transactionDomain);
+            store.add( transactionDomain );
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/9f02f2ca/libraries/eventsourcing/src/test/java/org/qi4j/library/eventsourcing/application/ApplicationEventTest.java
----------------------------------------------------------------------
diff --git a/libraries/eventsourcing/src/test/java/org/qi4j/library/eventsourcing/application/ApplicationEventTest.java b/libraries/eventsourcing/src/test/java/org/qi4j/library/eventsourcing/application/ApplicationEventTest.java
index f566db8..7ccf0a2 100644
--- a/libraries/eventsourcing/src/test/java/org/qi4j/library/eventsourcing/application/ApplicationEventTest.java
+++ b/libraries/eventsourcing/src/test/java/org/qi4j/library/eventsourcing/application/ApplicationEventTest.java
@@ -92,7 +92,7 @@ public class ApplicationEventTest
 
 
     @Test
-    public void testApplicationEvent() throws UnitOfWorkCompletionException, IOException
+    public void testApplicationEvent() throws Exception
     {
         Users users = module.newTransient( Users.class );
 
@@ -107,20 +107,23 @@ public class ApplicationEventTest
 
         UnitOfWork uow1 = module.newUnitOfWork( UsecaseBuilder.newUsecase( "User signup" ) );
         uow1.setMetaInfo( administratorPrincipal );
-        users.signup( null, "user1", Arrays.asList( "news1", "news2" ) );
+        users.signup( null, "user1", Arrays.asList( "news-a", "news-b" ) );
         uow1.complete();
 
+        Thread.sleep( 1 ); // For UoWs not getting the same `currentTime`
+
         UnitOfWork uow2 = module.newUnitOfWork();
         uow2.setMetaInfo( administratorPrincipal );
         users.signup( null, "user2", Collections.EMPTY_LIST );
         uow2.complete();
 
+        Thread.sleep( 1 ); // For UoWs not getting the same `currentTime`
+
         UnitOfWork uow3 = module.newUnitOfWork();
         uow3.setMetaInfo( administratorPrincipal );
-        users.signup( null, "user3", Collections.singletonList( "news1" ) );
+        users.signup( null, "user3", Collections.singletonList( "news-c" ) );
         uow3.complete();
 
-
         // receive events from uow2 and later forwards
         EventsInbox afterInbox = new EventsInbox();
         eventSource.transactionsAfter( uow2.currentTime() - 1, Integer.MAX_VALUE ).transferTo( afterInbox );
@@ -128,24 +131,32 @@ public class ApplicationEventTest
         assertEquals( 2, afterInbox.getEvents().size() );
 
         ApplicationEvent signupEvent2 = afterInbox.getEvents().get( 0 ).events().get().get( 0 );
+        ApplicationEvent signupEvent3 = afterInbox.getEvents().get( 1 ).events().get().get( 0 );
 
         assertEquals( "signup", signupEvent2.name().get() );
         assertEquals( "user2", ApplicationEventParameters.getParameter( signupEvent2, "param1" ) );
         assertEquals( "[]", ApplicationEventParameters.getParameter( signupEvent2, "param2" ) );
 
+        assertEquals( "signup", signupEvent3.name().get() );
+        assertEquals( "user3", ApplicationEventParameters.getParameter( signupEvent3, "param1" ) );
+        assertEquals( "[\"news-c\"]", ApplicationEventParameters.getParameter( signupEvent3, "param2" ) );
+
         // receive events from uow2 backwards
         EventsInbox beforeInbox = new EventsInbox();
         eventSource.transactionsBefore( uow3.currentTime(), Integer.MAX_VALUE ).transferTo( beforeInbox );
 
         assertEquals( 2, beforeInbox.getEvents().size() );
 
+        signupEvent2 = beforeInbox.getEvents().get( 0 ).events().get().get( 0 );
         ApplicationEvent signupEvent1 = beforeInbox.getEvents().get( 1 ).events().get().get( 0 );
 
+        assertEquals( "signup", signupEvent2.name().get() );
+        assertEquals( "user2", ApplicationEventParameters.getParameter( signupEvent2, "param1" ) );
+        assertEquals( "[]", ApplicationEventParameters.getParameter( signupEvent2, "param2" ) );
+
         assertEquals( "signup", signupEvent1.name().get());
         assertEquals( "user1", ApplicationEventParameters.getParameter( signupEvent1, "param1" ) );
-        assertEquals( "[\"news1\",\"news2\"]", ApplicationEventParameters.getParameter( signupEvent1, "param2" ) );
-
-
+        assertEquals( "[\"news-a\",\"news-b\"]", ApplicationEventParameters.getParameter( signupEvent1, "param2" ) );
     }
 
     static class EventsInbox implements Output<TransactionApplicationEvents, RuntimeException>


[2/6] zest-qi4j git commit: ZEST-69 Fix and assert NamedAssociation equals/hashcode & serialization

Posted by pa...@apache.org.
ZEST-69 Fix and assert NamedAssociation equals/hashcode & serialization


Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/3e3e89d8
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/3e3e89d8
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/3e3e89d8

Branch: refs/heads/develop
Commit: 3e3e89d824772095925cbc89a1868abbdadb2bd6
Parents: 7b827e6
Author: Paul Merlin <pa...@apache.org>
Authored: Mon Jul 20 14:31:27 2015 +0200
Committer: Paul Merlin <pa...@apache.org>
Committed: Mon Jul 20 16:44:46 2015 +0200

----------------------------------------------------------------------
 .../runtime/entity/EntityStateInstance.java     |  2 +-
 .../value/NamedAssociationValueState.java       | 21 ------
 .../org/qi4j/runtime/value/ValueInstance.java   | 12 ++++
 .../qi4j/runtime/value/ValueStateInstance.java  |  5 +-
 .../org/qi4j/runtime/value/ValueStateModel.java |  2 +-
 .../association/AssociationEqualityTest.java    | 75 ++++++++++++++++++--
 .../qi4j/spi/value/ValueSerializerAdapter.java  |  2 +-
 ...AbstractValueCompositeSerializationTest.java | 14 +++-
 .../stax/StaxValueDeserializer.java             | 16 +++--
 9 files changed, 110 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/3e3e89d8/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityStateInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityStateInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityStateInstance.java
index d44a3f9..505509b 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityStateInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityStateInstance.java
@@ -248,7 +248,7 @@ public final class EntityStateInstance
             constraints.checkConstraints( association.get() );
         }
 
-        // TODO Should ManyAssociations be checked too?
+        // TODO Should ManyAssociations and NamedAssociations be checked too?
     }
 
     private Map<AccessibleObject, Object> state()

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/3e3e89d8/core/runtime/src/main/java/org/qi4j/runtime/value/NamedAssociationValueState.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/value/NamedAssociationValueState.java b/core/runtime/src/main/java/org/qi4j/runtime/value/NamedAssociationValueState.java
index 694be18..4f3030d 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/NamedAssociationValueState.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/NamedAssociationValueState.java
@@ -81,25 +81,4 @@ public class NamedAssociationValueState
     {
         return references.keySet().iterator();
     }
-
-    @Override
-    public boolean equals( Object o )
-    {
-        if( this == o )
-        {
-            return true;
-        }
-        if( o == null || getClass() != o.getClass() )
-        {
-            return false;
-        }
-        NamedAssociationValueState strings = (NamedAssociationValueState) o;
-        return references.equals( strings.references );
-    }
-
-    @Override
-    public int hashCode()
-    {
-        return references.hashCode();
-    }
 }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/3e3e89d8/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java
index fc7c95e..3b11c04 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueInstance.java
@@ -21,6 +21,7 @@ import org.qi4j.api.composite.CompositeInstance;
 import org.qi4j.api.value.ValueComposite;
 import org.qi4j.runtime.association.AssociationModel;
 import org.qi4j.runtime.association.ManyAssociationModel;
+import org.qi4j.runtime.association.NamedAssociationModel;
 import org.qi4j.runtime.composite.MixinsInstance;
 import org.qi4j.runtime.composite.TransientInstance;
 import org.qi4j.runtime.property.PropertyInstance;
@@ -124,6 +125,12 @@ public final class ValueInstance
             state().manyAssociationFor( associationDescriptor.accessor() )
                 .setAssociationInfo( associationDescriptor.getBuilderInfo() );
         }
+
+        for( NamedAssociationModel associationDescriptor : descriptor().state().namedAssociations() )
+        {
+            state().namedAssociationFor( associationDescriptor.accessor() )
+                .setAssociationInfo( associationDescriptor.getBuilderInfo() );
+        }
     }
 
     /**
@@ -148,6 +155,11 @@ public final class ValueInstance
         {
             state().manyAssociationFor( associationDescriptor.accessor() ).setAssociationInfo( associationDescriptor );
         }
+
+        for( NamedAssociationModel associationDescriptor : descriptor().state().namedAssociations() )
+        {
+            state().namedAssociationFor( associationDescriptor.accessor() ).setAssociationInfo( associationDescriptor );
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/3e3e89d8/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java
index 3d41470..c66734f 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateInstance.java
@@ -25,7 +25,6 @@ import java.util.List;
 import java.util.Map;
 import org.qi4j.api.association.AssociationDescriptor;
 import org.qi4j.api.association.AssociationStateHolder;
-import org.qi4j.api.association.NamedAssociation;
 import org.qi4j.api.entity.EntityReference;
 import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.runtime.association.AssociationInfo;
@@ -181,7 +180,7 @@ public final class ValueStateInstance
 
     @Override
     @SuppressWarnings( "unchecked" )
-    public <T> NamedAssociation<T> namedAssociationFor( AccessibleObject accessor )
+    public <T> NamedAssociationInstance<T> namedAssociationFor( AccessibleObject accessor )
     {
         NamedAssociationInstance<T> namedAssociation = (NamedAssociationInstance<T>) namedAssociations.get( accessor );
 
@@ -194,7 +193,7 @@ public final class ValueStateInstance
     }
 
     @Override
-    public Iterable<? extends NamedAssociation<?>> allNamedAssociations()
+    public Iterable<? extends NamedAssociationInstance<?>> allNamedAssociations()
     {
         return namedAssociations.values();
     }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/3e3e89d8/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateModel.java b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateModel.java
index d3f8060..76e4bb8 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueStateModel.java
@@ -105,7 +105,7 @@ public final class ValueStateModel
     }
 
     @Override
-    public Iterable<? extends AssociationDescriptor> namedAssociations()
+    public Iterable<NamedAssociationModel> namedAssociations()
     {
         return namedAssociationsModel.namedAssociations();
     }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/3e3e89d8/core/runtime/src/test/java/org/qi4j/runtime/association/AssociationEqualityTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/qi4j/runtime/association/AssociationEqualityTest.java b/core/runtime/src/test/java/org/qi4j/runtime/association/AssociationEqualityTest.java
index 1c3852e..7aabc8c 100644
--- a/core/runtime/src/test/java/org/qi4j/runtime/association/AssociationEqualityTest.java
+++ b/core/runtime/src/test/java/org/qi4j/runtime/association/AssociationEqualityTest.java
@@ -20,6 +20,7 @@ import org.junit.Test;
 import org.qi4j.api.association.Association;
 import org.qi4j.api.association.AssociationDescriptor;
 import org.qi4j.api.association.ManyAssociation;
+import org.qi4j.api.association.NamedAssociation;
 import org.qi4j.api.common.Optional;
 import org.qi4j.api.unitofwork.UnitOfWork;
 import org.qi4j.api.value.ValueBuilder;
@@ -33,7 +34,7 @@ import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertThat;
 
 /**
- * Assert that Association and ManyAssociation equals/hashcode methods combine AssociationDescriptor and State.
+ * Assert that Association, ManyAssociation and NamedAssociation equals/hashcode methods combine AssociationDescriptor and State.
  */
 public class AssociationEqualityTest
     extends AbstractQi4jTest
@@ -62,6 +63,8 @@ public class AssociationEqualityTest
         Association<AnEntity> anEntity();
 
         ManyAssociation<AnEntity> manyEntities();
+
+        NamedAssociation<AnEntity> namedEntities();
     }
 
     public interface OtherWithAssociations
@@ -71,6 +74,8 @@ public class AssociationEqualityTest
         Association<AnEntity> anEntity();
 
         ManyAssociation<AnEntity> manyEntities();
+
+        NamedAssociation<AnEntity> namedEntities();
     }
 
     //
@@ -87,10 +92,12 @@ public class AssociationEqualityTest
             SomeWithAssociations some = buildSomeWithAssociation( anEntity );
             AssociationDescriptor someAssocDesc = qi4j.api().associationDescriptorFor( some.anEntity() );
             AssociationDescriptor someManyAssocDesc = qi4j.api().associationDescriptorFor( some.manyEntities() );
+            AssociationDescriptor someNamedAssocDesc = qi4j.api().associationDescriptorFor( some.namedEntities() );
 
             SomeWithAssociations some2 = buildSomeWithAssociation( anEntity );
             AssociationDescriptor some2AssocDesc = qi4j.api().associationDescriptorFor( some2.anEntity() );
             AssociationDescriptor some2ManyAssocDesc = qi4j.api().associationDescriptorFor( some2.manyEntities() );
+            AssociationDescriptor some2NamedAssocDesc = qi4j.api().associationDescriptorFor( some2.namedEntities() );
 
             assertThat( "AssociationDescriptor equal",
                         someAssocDesc,
@@ -104,6 +111,12 @@ public class AssociationEqualityTest
             assertThat( "ManyAssociationDescriptor hashcode equal",
                         someManyAssocDesc.hashCode(),
                         equalTo( some2ManyAssocDesc.hashCode() ) );
+            assertThat( "NamedAssociationDescriptor equal",
+                        someNamedAssocDesc,
+                        equalTo( some2NamedAssocDesc ) );
+            assertThat( "NamedAssociationDescriptor hashcode equal",
+                        someNamedAssocDesc.hashCode(),
+                        equalTo( some2NamedAssocDesc.hashCode() ) );
         }
         finally
         {
@@ -120,10 +133,12 @@ public class AssociationEqualityTest
             SomeWithAssociations some = buildSomeWithAssociation( uow.newEntity( AnEntity.class ) );
             AssociationDescriptor someAssocDesc = qi4j.api().associationDescriptorFor( some.anEntity() );
             AssociationDescriptor someManyAssocDesc = qi4j.api().associationDescriptorFor( some.manyEntities() );
+            AssociationDescriptor someNamedAssocDesc = qi4j.api().associationDescriptorFor( some.namedEntities() );
 
             SomeWithAssociations some2 = buildSomeWithAssociation( uow.newEntity( AnEntity.class ) );
             AssociationDescriptor some2AssocDesc = qi4j.api().associationDescriptorFor( some2.anEntity() );
             AssociationDescriptor some2ManyAssocDesc = qi4j.api().associationDescriptorFor( some2.manyEntities() );
+            AssociationDescriptor some2NamedAssocDesc = qi4j.api().associationDescriptorFor( some2.namedEntities() );
 
             assertThat( "AssociationDescriptor equal",
                         someAssocDesc,
@@ -137,6 +152,12 @@ public class AssociationEqualityTest
             assertThat( "ManyAssociationDescriptor hashcode equal",
                         someManyAssocDesc.hashCode(),
                         equalTo( some2ManyAssocDesc.hashCode() ) );
+            assertThat( "NamedAssociationDescriptor equal",
+                        someNamedAssocDesc,
+                        equalTo( some2NamedAssocDesc ) );
+            assertThat( "NamedAssociationDescriptor hashcode equal",
+                        someNamedAssocDesc.hashCode(),
+                        equalTo( some2NamedAssocDesc.hashCode() ) );
         }
         finally
         {
@@ -155,10 +176,12 @@ public class AssociationEqualityTest
             SomeWithAssociations some = buildSomeWithAssociation( anEntity );
             AssociationDescriptor someAssocDesc = qi4j.api().associationDescriptorFor( some.anEntity() );
             AssociationDescriptor someManyAssocDesc = qi4j.api().associationDescriptorFor( some.manyEntities() );
+            AssociationDescriptor someNamedAssocDesc = qi4j.api().associationDescriptorFor( some.namedEntities() );
 
             OtherWithAssociations other = buildOtherWithAssociation( anEntity );
             AssociationDescriptor otherAssocDesc = qi4j.api().associationDescriptorFor( other.anEntity() );
-            AssociationDescriptor some2ManyAssocDesc = qi4j.api().associationDescriptorFor( other.manyEntities() );
+            AssociationDescriptor otherManyAssocDesc = qi4j.api().associationDescriptorFor( other.manyEntities() );
+            AssociationDescriptor otherNamedAssocDesc = qi4j.api().associationDescriptorFor( other.namedEntities() );
 
             assertThat( "AssociationDescriptor not equal",
                         someAssocDesc,
@@ -168,10 +191,16 @@ public class AssociationEqualityTest
                         not( equalTo( otherAssocDesc.hashCode() ) ) );
             assertThat( "ManyAssociationDescriptor not equal",
                         someManyAssocDesc,
-                        not( equalTo( some2ManyAssocDesc ) ) );
+                        not( equalTo( otherManyAssocDesc ) ) );
             assertThat( "ManyAssociationDescriptor hashcode not equal",
                         someManyAssocDesc.hashCode(),
-                        not( equalTo( some2ManyAssocDesc.hashCode() ) ) );
+                        not( equalTo( otherManyAssocDesc.hashCode() ) ) );
+            assertThat( "NamedAssociationDescriptor not equal",
+                        someNamedAssocDesc,
+                        not( equalTo( otherNamedAssocDesc ) ) );
+            assertThat( "NamedAssociationDescriptor hashcode not equal",
+                        someNamedAssocDesc.hashCode(),
+                        not( equalTo( otherNamedAssocDesc.hashCode() ) ) );
         }
         finally
         {
@@ -203,6 +232,12 @@ public class AssociationEqualityTest
             assertThat( "ManyAssociation State hashcode not equal",
                         some.manyEntities().toList().hashCode(),
                         not( equalTo( some2.manyEntities().toList().hashCode() ) ) );
+            assertThat( "NamedAssociation State not equal",
+                        some.namedEntities().toMap(),
+                        not( equalTo( some2.namedEntities().toMap() ) ) );
+            assertThat( "NamedAssociation State hashcode not equal",
+                        some.namedEntities().toMap().hashCode(),
+                        not( equalTo( some2.namedEntities().toMap().hashCode() ) ) );
         }
         finally
         {
@@ -233,6 +268,12 @@ public class AssociationEqualityTest
             assertThat( "ManyAssociation State hashcode equal",
                         some.manyEntities().toList().hashCode(),
                         equalTo( other.manyEntities().toList().hashCode() ) );
+            assertThat( "NamedAssociation State equal",
+                        some.namedEntities().toMap(),
+                        equalTo( other.namedEntities().toMap() ) );
+            assertThat( "NamedAssociation State hashcode equal",
+                        some.namedEntities().toMap().hashCode(),
+                        equalTo( other.namedEntities().toMap().hashCode() ) );
         }
         finally
         {
@@ -266,6 +307,12 @@ public class AssociationEqualityTest
             assertThat( "ManyAssociation hashcode equal",
                         some.manyEntities().hashCode(),
                         equalTo( some2.manyEntities().hashCode() ) );
+            assertThat( "NamedAssociation equal",
+                        some.namedEntities(),
+                        equalTo( some2.namedEntities() ) );
+            assertThat( "NamedAssociation hashcode equal",
+                        some.namedEntities().hashCode(),
+                        equalTo( some2.namedEntities().hashCode() ) );
         }
         finally
         {
@@ -294,6 +341,12 @@ public class AssociationEqualityTest
             assertThat( "ManyAssociation hashcode not equal",
                         some.manyEntities().hashCode(),
                         not( equalTo( some2.manyEntities().hashCode() ) ) );
+            assertThat( "NamedAssociation not equal",
+                        some.namedEntities(),
+                        not( equalTo( some2.namedEntities() ) ) );
+            assertThat( "NamedAssociation hashcode not equal",
+                        some.namedEntities().hashCode(),
+                        not( equalTo( some2.namedEntities().hashCode() ) ) );
         }
         finally
         {
@@ -324,6 +377,12 @@ public class AssociationEqualityTest
             assertThat( "ManyAssociation hashcode not equal",
                         some.manyEntities().hashCode(),
                         not( equalTo( other.manyEntities().hashCode() ) ) );
+            assertThat( "NamedAssociation not equal",
+                        some.namedEntities(),
+                        not( equalTo( other.namedEntities() ) ) );
+            assertThat( "NamedAssociation hashcode not equal",
+                        some.namedEntities().hashCode(),
+                        not( equalTo( other.namedEntities().hashCode() ) ) );
         }
         finally
         {
@@ -352,6 +411,12 @@ public class AssociationEqualityTest
             assertThat( "ManyAssociation hashcode not equal",
                         some.manyEntities().hashCode(),
                         not( equalTo( other.manyEntities().hashCode() ) ) );
+            assertThat( "NamedAssociation not equal",
+                        some.namedEntities(),
+                        not( equalTo( other.namedEntities() ) ) );
+            assertThat( "NamedAssociation hashcode not equal",
+                        some.namedEntities().hashCode(),
+                        not( equalTo( other.namedEntities().hashCode() ) ) );
         }
         finally
         {
@@ -369,6 +434,7 @@ public class AssociationEqualityTest
             ValueBuilder<SomeWithAssociations> builder = module.newValueBuilder( SomeWithAssociations.class );
             builder.prototype().anEntity().set( associated );
             builder.prototype().manyEntities().add( associated );
+            builder.prototype().namedEntities().put( "someKey", associated );
             some = builder.newInstance();
         }
         return some;
@@ -381,6 +447,7 @@ public class AssociationEqualityTest
             ValueBuilder<OtherWithAssociations> builder = module.newValueBuilder( OtherWithAssociations.class );
             builder.prototype().anEntity().set( associated );
             builder.prototype().manyEntities().add( associated );
+            builder.prototype().namedEntities().put( "someKey", associated );
             some = builder.newInstance();
         }
         return some;

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/3e3e89d8/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
index 004745a..6f17569 100644
--- a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
+++ b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
@@ -479,7 +479,7 @@ public abstract class ValueSerializerAdapter<OutputType>
                 onFieldStart( output, name );
                 onValueStart( output );
                 EntityReference ref = namedAssociation.referenceOf( name );
-                onValue( output, ( (Identity) namedAssociation.get( name ) ).identity().get() );
+                onValue( output, ref.identity() );
                 onValueEnd( output );
                 onFieldEnd( output );
             }

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/3e3e89d8/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java b/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
index 01d2f51..4bece76 100644
--- a/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
+++ b/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
@@ -32,6 +32,7 @@ import org.junit.Test;
 import org.junit.rules.TestName;
 import org.qi4j.api.association.Association;
 import org.qi4j.api.association.ManyAssociation;
+import org.qi4j.api.association.NamedAssociation;
 import org.qi4j.api.common.Optional;
 import org.qi4j.api.common.UseDefaults;
 import org.qi4j.api.common.Visibility;
@@ -58,7 +59,6 @@ import static org.junit.Assert.assertThat;
 /**
  * Assert that ValueSerialization behaviour on ValueComposites is correct.
  */
-// TODO Assert Association, ManyAssociation and NamedAssociation serialization behaviour!
 // TODO Assert Arrays behaviour!
 // TODO Assert Generics behaviour!
 public abstract class AbstractValueCompositeSerializationTest
@@ -105,7 +105,7 @@ public abstract class AbstractValueCompositeSerializationTest
             SomeValue some2 = module.newValueFromSerializedState( SomeValue.class, stateString );
 
             assertThat( "Same value toString", some.toString(), equalTo( some2.toString() ) );
-//            assertThat( "Same value", some, equalTo( some2 ) );
+            assertThat( "Same value", some, equalTo( some2 ) );
             assertThat( "Same JSON value toString", stateString, equalTo( some2.toString() ) );
             assertThat( "Same JSON value", some.customFoo().get() instanceof CustomFooValue, is( true ) );
             assertThat( "Same JSON value explicit", some.customFooValue().get() instanceof CustomFooValue, is( true ) );
@@ -193,6 +193,10 @@ public abstract class AbstractValueCompositeSerializationTest
         proto.barManyAssociation().add( buildBarEntity( "bazar TWO in barManyAssociation" ) );
         proto.barEntityManyAssociation().add( buildBarEntity( "bazar ONE in barEntityManyAssociation" ) );
         proto.barEntityManyAssociation().add( buildBarEntity( "bazar TWO in barEntityManyAssociation" ) );
+        proto.barNamedAssociation().put( "bazar", buildBarEntity( "bazar in barNamedAssociation" ) );
+        proto.barNamedAssociation().put( "cathedral", buildBarEntity( "cathedral in barNamedAssociation" ) );
+        proto.barEntityNamedAssociation().put( "bazar", buildBarEntity( "bazar in barEntityNamedAssociation" ) );
+        proto.barEntityNamedAssociation().put( "cathedral", buildBarEntity( "cathedral in barEntityNamedAssociation" ) );
 
         return builder.newInstance();
     }
@@ -309,6 +313,12 @@ public abstract class AbstractValueCompositeSerializationTest
         ManyAssociation<Bar> barManyAssociation();
 
         ManyAssociation<BarEntity> barEntityManyAssociation();
+
+        NamedAssociation<Bar> barNamedAssociationEmpty();
+
+        NamedAssociation<Bar> barNamedAssociation();
+
+        NamedAssociation<BarEntity> barEntityNamedAssociation();
     }
 
     public interface SpecificCollection

http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/3e3e89d8/extensions/valueserialization-stax/src/main/java/org/qi4j/valueserialization/stax/StaxValueDeserializer.java
----------------------------------------------------------------------
diff --git a/extensions/valueserialization-stax/src/main/java/org/qi4j/valueserialization/stax/StaxValueDeserializer.java b/extensions/valueserialization-stax/src/main/java/org/qi4j/valueserialization/stax/StaxValueDeserializer.java
index 2051eb7..6c61ffb 100644
--- a/extensions/valueserialization-stax/src/main/java/org/qi4j/valueserialization/stax/StaxValueDeserializer.java
+++ b/extensions/valueserialization-stax/src/main/java/org/qi4j/valueserialization/stax/StaxValueDeserializer.java
@@ -432,14 +432,18 @@ public class StaxValueDeserializer
         {
             return;
         }
-        NodeList entriesNodes = inputNode.getChildNodes();
-        for( int idx = 0; idx < entriesNodes.getLength(); idx++ )
+        if( !"object".equals( inputNode.getLocalName() ) )
         {
-            Node entryNode = entriesNodes.item( idx );
-            String key  = ((Element) entryNode).getTagName();
-            V value = getObjectFieldValue( entryNode, "value", valueDeserializer );
-            if( key != null )
+            throw new ValueSerializationException( "Expected an <object/> but got " + inputNode );
+        }
+        NodeList fieldsNodes = inputNode.getChildNodes();
+        for( int idx = 0; idx < fieldsNodes.getLength(); idx++ )
+        {
+            Node fieldNode = fieldsNodes.item( idx );
+            String key = getDirectChildNode( fieldNode, "name" ).getTextContent();
+            if( key != null && key.length() > 0 )
             {
+                V value = getObjectFieldValue( inputNode, key, valueDeserializer );
                 map.put( key, value );
             }
         }