PeopleConverter#unmarshal()

Change-Id: I6914c0e7e15433b700b88f7a61bfed60c8ab896a
Signed-off-by: Michael Ochmann <michael.ochmann@sap.com>
diff --git a/org.eclipse.skalli.core.test/src/main/java/org/eclipse/skalli/core/extension/people/PeopleConverterTest.java b/org.eclipse.skalli.core.test/src/main/java/org/eclipse/skalli/core/extension/people/PeopleConverterTest.java
index 3541127..654c978 100644
--- a/org.eclipse.skalli.core.test/src/main/java/org/eclipse/skalli/core/extension/people/PeopleConverterTest.java
+++ b/org.eclipse.skalli.core.test/src/main/java/org/eclipse/skalli/core/extension/people/PeopleConverterTest.java
@@ -10,21 +10,41 @@
  *******************************************************************************/
 package org.eclipse.skalli.core.extension.people;
 
+import static org.junit.Assert.assertTrue;
+
 import org.eclipse.skalli.model.Member;
 import org.eclipse.skalli.model.ext.commons.PeopleExtension;
+import org.eclipse.skalli.services.rest.RestReader;
 import org.eclipse.skalli.services.rest.RestWriter;
+import org.eclipse.skalli.testutil.AssertUtils;
 import org.eclipse.skalli.testutil.RestWriterTestBase;
 import org.junit.Test;
 
 @SuppressWarnings("nls")
 public class PeopleConverterTest extends RestWriterTestBase {
 
+    private static final String INITIAL_PEOPLE_EXTENSION_XML = "<people><leads/><members/></people>";
+    private static final String PEOPLE_EXTENSION_XML = "<people>"
+            + "<leads>"
+            + "<lead><userId>a</userId><link rel=\"user\" href=\"http://example.org:8080/api/users/a\"/></lead>"
+            + "<lead><userId>b</userId><link rel=\"user\" href=\"http://example.org:8080/api/users/b\"/></lead>"
+            + "</leads>"
+            + "<members>"
+            + "<member><userId>c</userId><link rel=\"user\" href=\"http://example.org:8080/api/users/c\"/></member>"
+            + "</members></people>";
+    private static final String INITIAL_PEOPLE_EXTENSION_JSON = "{\"leads\":[],\"members\":[]}";
+    private static final String PEOPLE_EXTENSION_JSON = "{\"leads\":["
+            + "{\"userId\":\"a\",\"link\":{\"rel\":\"user\",\"href\":\"http://example.org:8080/api/users/a\"}},"
+            + "{\"userId\":\"b\",\"link\":{\"rel\":\"user\",\"href\":\"http://example.org:8080/api/users/b\"}}],"
+            + "\"members\":["
+            + "{\"userId\":\"c\",\"link\":{\"rel\":\"user\",\"href\":\"http://example.org:8080/api/users/c\"}}]}";
+
     @Test
     public void testMarshalBlankExtensionXML() throws Exception {
         PeopleExtension people = new PeopleExtension();
         RestWriter restWriter = getRestWriterXML();
         marshalPeopleExtension(people, restWriter);
-        assertEqualsXML("<people><leads/><members/></people>");
+        assertEqualsXML(INITIAL_PEOPLE_EXTENSION_XML);
     }
 
     @Test
@@ -32,14 +52,7 @@
         PeopleExtension people = newPeopleExtension();
         RestWriter restWriter = getRestWriterXML();
         marshalPeopleExtension(people, restWriter);
-        assertEqualsXML("<people>"
-                + "<leads>"
-                + "<lead><userId>a</userId><link rel=\"user\" href=\"http://example.org:8080/api/users/a\"/></lead>"
-                + "<lead><userId>b</userId><link rel=\"user\" href=\"http://example.org:8080/api/users/b\"/></lead>"
-                + "</leads>"
-                + "<members>"
-                + "<member><userId>c</userId><link rel=\"user\" href=\"http://example.org:8080/api/users/c\"/></member>"
-                + "</members></people>");
+        assertEqualsXML(PEOPLE_EXTENSION_XML);
     }
 
     @Test
@@ -47,7 +60,7 @@
         PeopleExtension people = new PeopleExtension();
         RestWriter restWriter = getRestWriterJSON();
         marshalPeopleExtension(people, restWriter);
-        assertEqualsJSON("{\"leads\":[],\"members\":[]}");
+        assertEqualsJSON(INITIAL_PEOPLE_EXTENSION_JSON);
     }
 
     @Test
@@ -55,11 +68,23 @@
         PeopleExtension people = newPeopleExtension();
         RestWriter restWriter = getRestWriterJSON();
         marshalPeopleExtension(people, restWriter);
-        assertEqualsJSON("{\"leads\":["
-                + "{\"userId\":\"a\",\"link\":{\"rel\":\"user\",\"href\":\"http://example.org:8080/api/users/a\"}},"
-                + "{\"userId\":\"b\",\"link\":{\"rel\":\"user\",\"href\":\"http://example.org:8080/api/users/b\"}}],"
-                + "\"members\":["
-                + "{\"userId\":\"c\",\"link\":{\"rel\":\"user\",\"href\":\"http://example.org:8080/api/users/c\"}}]}");
+        assertEqualsJSON(PEOPLE_EXTENSION_JSON);
+    }
+
+    @Test
+    public void testUnmarshallInitialJSON() throws Exception {
+        RestReader restReader = getRestReaderJSON(INITIAL_PEOPLE_EXTENSION_JSON);
+        PeopleExtension people = unmarshalPeopleExtension(restReader);
+        assertTrue(people.getLeads().isEmpty());
+        assertTrue(people.getMembers().isEmpty());
+    }
+
+    @Test
+    public void testUnmarshallJSON() throws Exception {
+        RestReader restReader = getRestReaderJSON(PEOPLE_EXTENSION_JSON);
+        PeopleExtension people = unmarshalPeopleExtension(restReader);
+        AssertUtils.assertEquals("getLeads", people.getLeads(), new Member("a"), new Member("b"));
+        AssertUtils.assertEquals("getMembers", people.getMembers(), new Member("c"));
     }
 
     private PeopleExtension newPeopleExtension() {
@@ -77,4 +102,12 @@
         restWriter.end();
         restWriter.flush();
     }
+
+    private PeopleExtension unmarshalPeopleExtension(RestReader restReader) throws Exception {
+        PeopleConverter converter = new PeopleConverter();
+        restReader.object();
+        PeopleExtension people = converter.unmarshal(restReader);
+        restReader.end();
+        return people;
+    }
 }
diff --git a/org.eclipse.skalli.core/src/main/java/org/eclipse/skalli/core/extension/people/PeopleConverter.java b/org.eclipse.skalli.core/src/main/java/org/eclipse/skalli/core/extension/people/PeopleConverter.java
index 55d910e..17313ef 100644
--- a/org.eclipse.skalli.core/src/main/java/org/eclipse/skalli/core/extension/people/PeopleConverter.java
+++ b/org.eclipse.skalli.core/src/main/java/org/eclipse/skalli/core/extension/people/PeopleConverter.java
@@ -11,10 +11,13 @@
 package org.eclipse.skalli.core.extension.people;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.eclipse.skalli.model.Member;
 import org.eclipse.skalli.model.ext.commons.PeopleExtension;
 import org.eclipse.skalli.services.extension.rest.RestConverterBase;
+import org.eclipse.skalli.services.extension.rest.RestException;
 import org.eclipse.skalli.services.extension.rest.RestUtils;
 
 import com.thoughtworks.xstream.converters.MarshallingContext;
@@ -56,6 +59,50 @@
         writer.end();
     }
 
+    @Override
+    protected PeopleExtension unmarshal() throws RestException, IOException {
+        return unmarshal(new PeopleExtension());
+    }
+
+    @SuppressWarnings("nls")
+    private PeopleExtension unmarshal(PeopleExtension ext) throws RestException, IOException {
+        while (reader.hasMore()) {
+            if (reader.isKey("leads")) {
+                ext.getLeads().addAll(readMembers("lead"));
+            } else if (reader.isKey("members")) {
+                ext.getMembers().addAll(readMembers("member"));
+            }
+        }
+        return ext;
+    }
+
+    private List<Member> readMembers(String itemKey) throws RestException, IOException {
+        List<Member> members = new ArrayList<Member>();
+        reader.array(itemKey);
+        while (reader.hasMore()) {
+            Member member = readMember();
+            if (member != null) {
+                members.add(member);
+            }
+        }
+        reader.end();
+        return members;
+    }
+
+    private Member readMember() throws RestException, IOException {
+        Member member = null;
+        reader.object();
+        while (reader.hasMore()) {
+            if (reader.isKey("userId")) { //$NON-NLS-1$
+                member = new Member(reader.valueString());
+            } else {
+                reader.skip();
+            }
+        }
+        reader.end();
+        return member;
+    }
+
     @Deprecated
     public PeopleConverter(String host) {
         super(PeopleExtension.class, "people", host); //$NON-NLS-1$