You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2014/05/18 07:07:03 UTC

[35/38] git commit: [OLINGO-275] Fix for xml and verified for json

[OLINGO-275] Fix for xml and verified for json


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/340d7c03
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/340d7c03
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/340d7c03

Branch: refs/heads/Olingo-129_PocJpaDataStore
Commit: 340d7c030d8818f065246b6511a4200adc196e43
Parents: 3887f7b
Author: Christian Amend <ch...@apache.org>
Authored: Thu May 8 15:41:09 2014 +0200
Committer: Christian Amend <ch...@apache.org>
Committed: Thu May 8 15:41:09 2014 +0200

----------------------------------------------------------------------
 .../core/ep/consumer/XmlEntityConsumer.java     |  2 +-
 .../core/ep/consumer/XmlEntryConsumer.java      | 20 ++++---
 .../core/ep/consumer/XmlFeedConsumer.java       |  2 +-
 .../core/ep/consumer/JsonEntryConsumerTest.java | 27 +++++++++
 .../consumer/JsonEntryDeepInsertEntryTest.java  |  2 +
 .../core/ep/consumer/JsonFeedConsumerTest.java  |  2 +
 .../core/ep/consumer/XmlEntityConsumerTest.java | 15 ++++-
 .../core/ep/consumer/XmlFeedConsumerTest.java   | 27 +++++++++
 .../odata-core/src/test/resources/JsonRoom.json | 24 ++++++++
 .../src/test/resources/feed_rooms_small.xml     | 62 ++++++++++++++++++++
 10 files changed, 170 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/340d7c03/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java
index 5d73862..acbc77f 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumer.java
@@ -87,7 +87,7 @@ public class XmlEntityConsumer {
       reader = XmlHelper.createStreamReader(content);
       EntityInfoAggregator eia = EntityInfoAggregator.create(entitySet);
 
-      return new XmlEntryConsumer().readEntry(reader, eia, properties);
+      return new XmlEntryConsumer().readEntry(reader, eia, properties, false);
     } catch (EntityProviderException e) {
       cachedException = e;
       throw cachedException;

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/340d7c03/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntryConsumer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntryConsumer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntryConsumer.java
index a6111d1..4bc9173 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntryConsumer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntryConsumer.java
@@ -75,10 +75,14 @@ public class XmlEntryConsumer {
   private String currentHandledStartTagName;
 
   public ODataEntry readEntry(final XMLStreamReader reader, final EntityInfoAggregator eia,
-      final EntityProviderReadProperties readProperties) throws EntityProviderException {
+      final EntityProviderReadProperties readProperties, final boolean isInline) throws EntityProviderException {
     try {
       initialize(readProperties);
 
+      if (isInline) {
+        setETag(reader);
+      }
+
       while (reader.hasNext() && !isEntryEndTag(reader)) {
         reader.nextTag();
         if (reader.isStartElement()) {
@@ -206,7 +210,10 @@ public class XmlEntryConsumer {
 
   private void readEntry(final XMLStreamReader reader) throws EntityProviderException, XMLStreamException {
     reader.require(XMLStreamConstants.START_ELEMENT, Edm.NAMESPACE_ATOM_2005, FormatXml.ATOM_ENTRY);
+    setETag(reader);
+  }
 
+  private void setETag(final XMLStreamReader reader) {
     final String etag = reader.getAttributeValue(Edm.NAMESPACE_M_2007_08, FormatXml.M_ETAG);
     entryMetadata.setEtag(etag);
   }
@@ -278,7 +285,7 @@ public class XmlEntryConsumer {
     final EntityProviderReadProperties inlineProperties = createInlineProperties(readProperties, navigationProperty);
 
     // validations
-    boolean isFeed = isInlineFeedValidated(reader, eia, atomLinkType, navigationPropertyName);
+    boolean isFeed = isInlineFeedValidated(reader, eia, atomLinkType, navigationProperty);
 
     List<ODataEntry> inlineEntries = new ArrayList<ODataEntry>();
 
@@ -288,7 +295,7 @@ public class XmlEntryConsumer {
       if (reader.isStartElement() && Edm.NAMESPACE_ATOM_2005.equals(reader.getNamespaceURI())
           && FormatXml.ATOM_ENTRY.equals(reader.getLocalName())) {
         XmlEntryConsumer xec = new XmlEntryConsumer();
-        ODataEntry inlineEntry = xec.readEntry(reader, inlineEia, inlineProperties);
+        ODataEntry inlineEntry = xec.readEntry(reader, inlineEia, inlineProperties, true);
         inlineEntries.add(inlineEntry);
       }
       // next tag
@@ -462,13 +469,13 @@ public class XmlEntryConsumer {
    * @param reader xml content reader which already points to <code><m:inline> tag</code>
    * @param eia all necessary information about the entity
    * @param type the atom type attribute value of the <code>link</code> tag
-   * @param navigationPropertyName the navigation property name of the entity
+   * @param navigationProperty the navigation property name of the entity
    * @return <code>true</code> for <code>Feed</code> and <code>false</code> for <code>Entry</code>
    * @throws EntityProviderException is thrown if at least one validation fails.
    * @throws EdmException if edm access fails
    */
   private boolean isInlineFeedValidated(final XMLStreamReader reader, final EntityInfoAggregator eia,
-      final String type, final String navigationPropertyName) throws EntityProviderException, EdmException {
+      final String type, final EdmNavigationProperty navigationProperty) throws EntityProviderException, EdmException {
     boolean isFeed = false;
     try {
       reader.require(XMLStreamConstants.START_ELEMENT, Edm.NAMESPACE_M_2007_08, FormatXml.M_INLINE);
@@ -477,9 +484,6 @@ public class XmlEntryConsumer {
       if (cType == null) {
         throw new EntityProviderException(EntityProviderException.INVALID_INLINE_CONTENT.addContent("xml data"));
       }
-
-      EdmNavigationProperty navigationProperty =
-          (EdmNavigationProperty) eia.getEntityType().getProperty(navigationPropertyName);
       EdmMultiplicity navigationMultiplicity = navigationProperty.getMultiplicity();
 
       switch (navigationMultiplicity) {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/340d7c03/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumer.java
index 2ffec2e..9b427d5 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumer.java
@@ -106,7 +106,7 @@ public class XmlFeedConsumer {
 
     while (reader.hasNext() && !isFeedEndTag(reader)) {
       if (FormatXml.ATOM_ENTRY.equals(reader.getLocalName())) {
-        ODataEntry entry = xec.readEntry(reader, eia, entryReadProperties);
+        ODataEntry entry = xec.readEntry(reader, eia, entryReadProperties, true);
         results.add(entry);
       } else if (FormatXml.ATOM_TOMBSTONE_DELETED_ENTRY.equals(reader.getLocalName())) {
         reader.require(XMLStreamConstants.START_ELEMENT, FormatXml.ATOM_TOMBSTONE_NAMESPACE,

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/340d7c03/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java
index 0d4a2f4..30539fb 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java
@@ -33,6 +33,7 @@ import java.util.TimeZone;
 import org.apache.olingo.odata2.api.edm.EdmEntitySet;
 import org.apache.olingo.odata2.api.ep.EntityProviderException;
 import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties;
+import org.apache.olingo.odata2.api.ep.entry.EntryMetadata;
 import org.apache.olingo.odata2.api.ep.entry.MediaMetadata;
 import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
 import org.apache.olingo.odata2.testutil.mock.MockFacade;
@@ -44,6 +45,7 @@ import org.junit.Test;
 public class JsonEntryConsumerTest extends AbstractConsumerTest {
 
   private static final String SIMPLE_ENTRY_BUILDING = "JsonBuilding.json";
+  private static final String SIMPLE_ENTRY_ROOM = "JsonRoom.json";
   private static final String SIMPLE_ENTRY_EMPLOYEE = "JsonEmployee.json";
   private static final String SIMPLE_ENTRY_TEAM = "JsonTeam.json";
   private static final String INVALID_ENTRY_TEAM_DOUBLE_NAME_PROPERTY = "JsonInvalidTeamDoubleNameProperty.json";
@@ -63,6 +65,31 @@ public class JsonEntryConsumerTest extends AbstractConsumerTest {
     JsonEntityConsumer xec = new JsonEntityConsumer();
     xec.readEntry(entitySet, contentBody, DEFAULT_PROPERTIES);
   }
+  
+  @Test
+  public void readSimpleRoomEntry() throws Exception {
+    ODataEntry roomEntry = prepareAndExecuteEntry(SIMPLE_ENTRY_ROOM, "Rooms", DEFAULT_PROPERTIES);
+
+    // verify
+    Map<String, Object> properties = roomEntry.getProperties();
+    assertEquals(4, properties.size());
+
+    assertEquals("1", properties.get("Id"));
+    assertEquals("Room 1", properties.get("Name"));
+    assertEquals((short) 1, properties.get("Seats"));
+    assertEquals((short) 1, properties.get("Version"));
+
+    List<String> associationUris = roomEntry.getMetadata().getAssociationUris("nr_Employees");
+    assertEquals(1, associationUris.size());
+    assertEquals("http://localhost:8080/ReferenceScenario.svc/Rooms('1')/nr_Employees", associationUris.get(0));
+
+    associationUris = roomEntry.getMetadata().getAssociationUris("nr_Building");
+    assertEquals(1, associationUris.size());
+    assertEquals("http://localhost:8080/ReferenceScenario.svc/Rooms('1')/nr_Building", associationUris.get(0));
+
+    EntryMetadata metadata = roomEntry.getMetadata();
+    assertEquals("W/\"1\"",metadata.getEtag());
+  }
 
   @SuppressWarnings("unchecked")
   @Test

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/340d7c03/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java
index 1a057af..d35bbe4 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java
@@ -161,6 +161,8 @@ public class JsonEntryDeepInsertEntryTest extends AbstractConsumerTest {
 
     associationUris = innerRoom.getMetadata().getAssociationUris("nr_Building");
     assertEquals(Collections.emptyList(), associationUris);
+    
+    assertEquals("W/\"1\"", innerRoom.getMetadata().getEtag());
 
     ODataEntry innerBuilding = (ODataEntry) innerRoomProperties.get("nr_Building");
     assertNotNull(innerBuilding);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/340d7c03/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java
index 3d9201c..6495b73 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java
@@ -507,6 +507,8 @@ public class JsonFeedConsumerTest extends AbstractConsumerTest {
     assertNotNull(feedMetadata);
     assertEquals("http://localhost:8080/ReferenceScenario.svc/Rooms?!deltatoken=4711", feedMetadata.getDeltaLink());
 
+    assertEquals("W/\"2\"", entries.get(0).getMetadata().getEtag());
+
     List<DeletedEntryMetadata> deletedEntries = feed.getDeletedEntries();
     assertEquals(2, deletedEntries.size());
     for (DeletedEntryMetadata deletedEntry : deletedEntries) {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/340d7c03/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java
index 59df942..45e9861 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java
@@ -804,14 +804,20 @@ public class XmlEntityConsumerTest extends AbstractXmlConsumerTest {
 
     // execute
     XmlEntityConsumer xec = new XmlEntityConsumer();
-    ODataEntry entry =
+    ODataEntry employee =
         xec.readEntry(entitySet, reqContent, EntityProviderReadProperties.init().mergeSemantic(true).build());
 
     // validate
-    assertNotNull(entry);
-    Map<String, Object> properties = entry.getProperties();
+    assertNotNull(employee);
+    Map<String, Object> properties = employee.getProperties();
     assertEquals("1", properties.get("EmployeeId"));
     assertEquals("Walter Winter", properties.get("EmployeeName"));
+    EntryMetadata employeeMetadata = employee.getMetadata();
+    assertNotNull(employeeMetadata);
+    assertEquals("W/\"1\"", employeeMetadata.getEtag());
+    
+    
+    //Inline
     ODataEntry room = (ODataEntry) properties.get("ne_Room");
     Map<String, Object> roomProperties = room.getProperties();
     assertEquals(4, roomProperties.size());
@@ -819,6 +825,9 @@ public class XmlEntityConsumerTest extends AbstractXmlConsumerTest {
     assertEquals("Room 1", roomProperties.get("Name"));
     assertEquals(Short.valueOf("1"), roomProperties.get("Seats"));
     assertEquals(Short.valueOf("1"), roomProperties.get("Version"));
+    EntryMetadata roomMetadata = room.getMetadata();
+    assertNotNull(roomMetadata);
+    assertEquals("W/1", roomMetadata.getEtag());
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/340d7c03/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java
index 9301258..dace8eb 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
 import java.io.InputStream;
+import java.util.List;
 
 import junit.framework.Assert;
 
@@ -29,6 +30,8 @@ import org.apache.olingo.odata2.api.edm.EdmEntitySet;
 import org.apache.olingo.odata2.api.ep.EntityProvider;
 import org.apache.olingo.odata2.api.ep.EntityProviderException;
 import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties;
+import org.apache.olingo.odata2.api.ep.entry.EntryMetadata;
+import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
 import org.apache.olingo.odata2.api.ep.feed.FeedMetadata;
 import org.apache.olingo.odata2.api.ep.feed.ODataDeltaFeed;
 import org.apache.olingo.odata2.api.ep.feed.ODataFeed;
@@ -40,6 +43,30 @@ public class XmlFeedConsumerTest extends AbstractXmlConsumerTest {
   public XmlFeedConsumerTest(final StreamWriterImplType type) {
     super(type);
   }
+  
+  @Test
+  public void roomsFeedWithEtagEntries() throws Exception {
+    InputStream stream = getFileAsStream("feed_rooms_small.xml");
+    assertNotNull(stream);
+
+    ODataFeed feed =
+        EntityProvider.readFeed("application/atom+xml", MockFacade.getMockEdm().getDefaultEntityContainer()
+            .getEntitySet(
+                "Rooms"), stream, DEFAULT_PROPERTIES);
+    assertNotNull(feed);
+
+    FeedMetadata feedMetadata = feed.getFeedMetadata();
+    assertNotNull(feedMetadata);
+    assertNotNull(feedMetadata.getNextLink());
+    
+    List<ODataEntry> entries = feed.getEntries();
+    assertEquals(3, entries.size());
+    ODataEntry singleRoom = entries.get(0);
+    EntryMetadata roomMetadata = singleRoom.getMetadata();
+    assertNotNull(roomMetadata);
+    
+    assertEquals("W/\"1\"", roomMetadata.getEtag());
+  }
 
   @Test
   public void readLargeEmployeesFeed() throws Exception {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/340d7c03/odata2-lib/odata-core/src/test/resources/JsonRoom.json
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/resources/JsonRoom.json b/odata2-lib/odata-core/src/test/resources/JsonRoom.json
new file mode 100644
index 0000000..806aef2
--- /dev/null
+++ b/odata2-lib/odata-core/src/test/resources/JsonRoom.json
@@ -0,0 +1,24 @@
+{
+	"d" : {
+		"__metadata" : {
+			"id" : "http://localhost:8080/ReferenceScenario.svc/Rooms('1')",
+			"uri" : "http://localhost:8080/ReferenceScenario.svc/Rooms('1')",
+			"type" : "RefScenario.Room",
+			"etag" : "W/\"1\""
+		},
+		"Id" : "1",
+		"Name" : "Room 1",
+		"Seats" : 1,
+		"Version" : 1,
+		"nr_Employees" : {
+			"__deferred" : {
+				"uri" : "http://localhost:8080/ReferenceScenario.svc/Rooms('1')/nr_Employees"
+			}
+		},
+		"nr_Building" : {
+			"__deferred" : {
+				"uri" : "http://localhost:8080/ReferenceScenario.svc/Rooms('1')/nr_Building"
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/340d7c03/odata2-lib/odata-core/src/test/resources/feed_rooms_small.xml
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/resources/feed_rooms_small.xml b/odata2-lib/odata-core/src/test/resources/feed_rooms_small.xml
new file mode 100644
index 0000000..6b8c09b
--- /dev/null
+++ b/odata2-lib/odata-core/src/test/resources/feed_rooms_small.xml
@@ -0,0 +1,62 @@
+<?xml version='1.0' encoding='utf-8'?>
+<feed xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xml:base="http://localhost:8080/ReferenceScenario.svc/">
+	<id>http://localhost:8080/ReferenceScenario.svc/Rooms</id>
+	<title type="text">Rooms</title>
+	<updated>2014-05-08T13:06:23Z</updated>
+	<author>
+		<name/>
+	</author>
+	<link href="Rooms" rel="self" title="Rooms"/>
+	<entry m:etag="W/&quot;1&quot;">
+		<id>http://localhost:8080/ReferenceScenario.svc/Rooms('1')</id>
+		<title type="text">Room 1</title>
+		<updated>2014-05-08T13:06:23Z</updated>
+		<category term="RefScenario.Room" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
+		<link href="Rooms('1')" rel="edit" title="Room"/>
+		<link href="Rooms('1')/nr_Employees" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/nr_Employees" title="nr_Employees" type="application/atom+xml;type=feed"/>
+		<link href="Rooms('1')/nr_Building" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/nr_Building" title="nr_Building" type="application/atom+xml;type=entry"/>
+		<content type="application/xml">
+			<m:properties>
+				<d:Id>1</d:Id>
+				<d:Name>Room 1</d:Name>
+				<d:Seats>1</d:Seats>
+				<d:Version>1</d:Version>
+			</m:properties>
+		</content>
+	</entry>
+	<entry m:etag="W/&quot;1&quot;">
+		<id>http://localhost:8080/ReferenceScenario.svc/Rooms('10')</id>
+		<title type="text">Room 10</title>
+		<updated>2014-05-08T13:06:23Z</updated>
+		<category term="RefScenario.Room" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
+		<link href="Rooms('10')" rel="edit" title="Room"/>
+		<link href="Rooms('10')/nr_Employees" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/nr_Employees" title="nr_Employees" type="application/atom+xml;type=feed"/>
+		<link href="Rooms('10')/nr_Building" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/nr_Building" title="nr_Building" type="application/atom+xml;type=entry"/>
+		<content type="application/xml">
+			<m:properties>
+				<d:Id>10</d:Id>
+				<d:Name>Room 10</d:Name>
+				<d:Seats>6</d:Seats>
+				<d:Version>1</d:Version>
+			</m:properties>
+		</content>
+	</entry>
+	<entry m:etag="W/&quot;1&quot;">
+		<id>http://localhost:8080/ReferenceScenario.svc/Rooms('100')</id>
+		<title type="text">Room 100</title>
+		<updated>2014-05-08T13:06:23Z</updated>
+		<category term="RefScenario.Room" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
+		<link href="Rooms('100')" rel="edit" title="Room"/>
+		<link href="Rooms('100')/nr_Employees" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/nr_Employees" title="nr_Employees" type="application/atom+xml;type=feed"/>
+		<link href="Rooms('100')/nr_Building" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/nr_Building" title="nr_Building" type="application/atom+xml;type=entry"/>
+		<content type="application/xml">
+			<m:properties>
+				<d:Id>100</d:Id>
+				<d:Name>Room 100</d:Name>
+				<d:Seats>6</d:Seats>
+				<d:Version>1</d:Version>
+			</m:properties>
+		</content>
+	</entry>
+	<link href="http://localhost:8080/ReferenceScenario.svc/Rooms?$skiptoken=97" rel="next"/>
+</feed>
\ No newline at end of file