[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 <[email protected]> Authored: Thu May 8 15:41:09 2014 +0200 Committer: Christian Amend <[email protected]> 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/"1""> + <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/"1""> + <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/"1""> + <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
