Author: lindner
Date: Sat Feb 5 02:50:09 2011
New Revision: 1067382
URL: http://svn.apache.org/viewvc?rev=1067382&view=rev
Log:
SHINDIG-1500 | Patch from Eric Woods | ActivityStreams Cleanups
Modified:
shindig/trunk/config/container.js
shindig/trunk/content/sampledata/canonicaldb.json
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityEntryImpl.java
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityObjectImpl.java
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/xstream/XStream081Configuration.java
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityEntry.java
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityObject.java
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java
shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityEntryTest.java
shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulXmlActivityEntryTest.java
Modified: shindig/trunk/config/container.js
URL:
http://svn.apache.org/viewvc/shindig/trunk/config/container.js?rev=1067382&r1=1067381&r2=1067382&view=diff
==============================================================================
--- shindig/trunk/config/container.js (original)
+++ shindig/trunk/config/container.js Sat Feb 5 02:50:09 2011
@@ -253,6 +253,8 @@
"activity" : ["appId", "body", "bodyId", "externalId", "id",
"mediaItems", "postedTime", "priority",
"streamFaviconUrl", "streamSourceUrl", "streamTitle",
"streamUrl", "templateParams", "title",
"url", "userId"],
+ "activityEntry" : ["icon", "postedTime", "actor", "verb", "object",
"target", "generator", "provider", "title",
+ "body", "standardLinks", "to", "cc", "bcc"],
"album" : ["id", "thumbnailUrl", "title", "description", "location",
"ownerId"],
"mediaItem" : ["album_id", "created", "description", "duration",
"file_size", "id", "language", "last_updated",
"location", "mime_type", "num_comments", "num_views",
"num_votes", "rating", "start_time",
Modified: shindig/trunk/content/sampledata/canonicaldb.json
URL:
http://svn.apache.org/viewvc/shindig/trunk/content/sampledata/canonicaldb.json?rev=1067382&r1=1067381&r2=1067382&view=diff
==============================================================================
--- shindig/trunk/content/sampledata/canonicaldb.json (original)
+++ shindig/trunk/content/sampledata/canonicaldb.json Sat Feb 5 02:50:09 2011
@@ -361,21 +361,21 @@
"to": ["jane.doe", "canonical"],
"cc": ["george.doe"],
"verb": "post",
- "standardLinks": {
+ "links": {
"myRel1":
- [{"href": "www.mypics.com/1", "type":
"image/jpg"},
- {"href": "www.mypics.com/2", "type":
"image/jpg"}],
+ [{"href":
"http://www.example.com/johnsalbum/1.jpg", "type": "image/jpg"},
+ {"href":
"http://www.example.com/johnsalbum/2.jpg", "type": "image/jpg"}],
"myRel2":
- [{"href": "www.mypics.com/3", "type":
"image/jpg"},
- {"href": "www.mypics.com/4", "type":
"image/jpg"}]
+ [{"href":
"http://www.example.com/johnsalbum/3.jpg", "type": "image/jpg"},
+ {"href":
"http://www.example.com/johnsalbum/4.jpg", "type": "image/jpg"}]
},
"object": {
"id": "object1",
"displayName": "Frozen Eric",
- "link": "http://www.johnsalbums/germany123",
+ "link": "http://www.example.com/johnsalbum",
"objectType": "picture",
"image": {
- "url":
"https://docs.google.com/uc?id=0B-zwcqgujo7CMTRmZTg3Y2UtZGZlYS00MTY4LWFjOTItNDRiNmY3MzRmYzQ5&export=download&hl=en",
+ "url":
"http://www.example.com/johnsalbum/cover.jpg",
"type":
"http://activitystrea.ms/schema/1.0/picture",
"width": 400,
"height": 300,
@@ -383,10 +383,10 @@
},
"actionLinks": [
{
- "target":
"http://johnsalbums/germany123/mediaItem3",
+ "target":
"http://example.com/johnsalbum/frozen.jpg",
"caption": "Frozen at the top of the
German Alps"
}, {
- "target":
"http://johnsalbums/germany123/mediaItem6",
+ "target":
"http://example.com/johnsalbum/sign.jpg",
"caption": "Sign of
Garmisch-Partenkirchen"
}
]
Modified:
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityEntryImpl.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityEntryImpl.java?rev=1067382&r1=1067381&r2=1067382&view=diff
==============================================================================
---
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityEntryImpl.java
(original)
+++
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityEntryImpl.java
Sat Feb 5 02:50:09 2011
@@ -42,7 +42,7 @@ public class ActivityEntryImpl implement
private ActivityObject provider;
private String title;
private String body;
- private Map<String, List<StandardLink>> standardLinks;
+ private Map<String, List<StandardLink>> links;
private List<String> to;
private List<String> cc;
private List<String> bcc;
@@ -154,13 +154,13 @@ public class ActivityEntryImpl implement
}
/** {@inheritDoc} */
- public Map<String, List<StandardLink>> getStandardLinks() {
- return standardLinks;
+ public Map<String, List<StandardLink>> getLinks() {
+ return links;
}
/** {@inheritDoc} */
- public void setStandardLinks(Map<String, List<StandardLink>> standardLinks) {
- this.standardLinks = standardLinks;
+ public void setLinks(Map<String, List<StandardLink>> links) {
+ this.links = links;
}
/** {@inheritDoc} */
Modified:
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityObjectImpl.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityObjectImpl.java?rev=1067382&r1=1067381&r2=1067382&view=diff
==============================================================================
---
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityObjectImpl.java
(original)
+++
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/model/ActivityObjectImpl.java
Sat Feb 5 02:50:09 2011
@@ -45,7 +45,7 @@ public class ActivityObjectImpl implemen
private List<ActionLink> actionLinks;
private List<String> upstreamDuplicates;
private List<String> downstreamDuplicates;
- private Map<String, List<StandardLink>> standardLinks;
+ private Map<String, List<StandardLink>> links;
/**
* A simple implementation of an ActivtyObject
@@ -184,12 +184,12 @@ public class ActivityObjectImpl implemen
}
/** {@inheritDoc} */
- public Map<String, List<StandardLink>> getStandardLinks() {
- return standardLinks;
+ public Map<String, List<StandardLink>> getLinks() {
+ return links;
}
/** {@inheritDoc} */
- public void setStandardLinks(Map<String, List<StandardLink>> standardLinks) {
- this.standardLinks = standardLinks;
+ public void setLinks(Map<String, List<StandardLink>> links) {
+ this.links = links;
}
}
Modified:
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/xstream/XStream081Configuration.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/xstream/XStream081Configuration.java?rev=1067382&r1=1067381&r2=1067382&view=diff
==============================================================================
---
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/xstream/XStream081Configuration.java
(original)
+++
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/core/util/xstream/XStream081Configuration.java
Sat Feb 5 02:50:09 2011
@@ -164,7 +164,7 @@ public class XStream081Configuration imp
new ClassFieldMapping("activity", Activity.class),
new ClassFieldMapping("activityEntry", ActivityEntry.class),
new ClassFieldMapping("object", ActivityObject.class),
- new ClassFieldMapping("standardLink", StandardLink.class),
+ new ClassFieldMapping("link", StandardLink.class),
new ClassFieldMapping("actionLink", ActionLink.class),
new ClassFieldMapping("mediaLink", MediaLink.class),
new ClassFieldMapping("account", Account.class),
@@ -204,7 +204,7 @@ public class XStream081Configuration imp
new ClassFieldMapping("activity", Activity.class),
new ClassFieldMapping("activityEntry", ActivityEntry.class),
new ClassFieldMapping("object", ActivityObject.class),
- new ClassFieldMapping("standardLink", StandardLink.class),
+ new ClassFieldMapping("link", StandardLink.class),
new ClassFieldMapping("actionLink", ActionLink.class),
new ClassFieldMapping("mediaLink", MediaLink.class),
new ClassFieldMapping("account", Account.class),
@@ -245,7 +245,7 @@ public class XStream081Configuration imp
.put("activity", Activity.class)
.put("activityEntry", ActivityEntry.class)
.put("object", ActivityObject.class)
- .put("standardLink", StandardLink.class)
+ .put("link", StandardLink.class)
.put("actionLink", ActionLink.class)
.put("mediaLink", MediaLink.class)
.put("account", Account.class)
Modified:
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityEntry.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityEntry.java?rev=1067382&r1=1067381&r2=1067382&view=diff
==============================================================================
---
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityEntry.java
(original)
+++
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityEntry.java
Sat Feb 5 02:50:09 2011
@@ -51,7 +51,7 @@ public interface ActivityEntry {
PROVIDER("provider"),
TITLE("title"),
BODY("body"),
- STANDARD_LINKS("standardLinks"),
+ LINKS("links"),
TO("to"),
CC("cc"),
BCC("bcc");
@@ -261,18 +261,18 @@ public interface ActivityEntry {
void setBody(String body);
/**
- * <p>getStandardLinks</p>
+ * <p>links</p>
*
* @return a {@link java.util.Map} object.
*/
- Map<String, List<StandardLink>> getStandardLinks();
+ Map<String, List<StandardLink>> getLinks();
/**
- * <p>setStandardLinks</p>
+ * <p>setLinks</p>
*
- * @param standardLinks a {@link java.util.Map} object.
+ * @param links a {@link java.util.Map} object.
*/
- void setStandardLinks(Map<String, List<StandardLink>> standardLinks);
+ void setLinks(Map<String, List<StandardLink>> links);
/**
* <p>getTo</p>
Modified:
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityObject.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityObject.java?rev=1067382&r1=1067381&r2=1067382&view=diff
==============================================================================
---
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityObject.java
(original)
+++
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/model/ActivityObject.java
Sat Feb 5 02:50:09 2011
@@ -50,7 +50,7 @@ public interface ActivityObject {
ACTION_LINKS("actionLinks"),
UPSTREAM_DUPLICATES("upstreamDuplicates"),
DOWNSTREAM_DUPLICATES("downstreamDuplicates"),
- STANDARD_LINKS("standardLinks");
+ LINKS("links");
/*
* The name of the JSON element.
@@ -259,12 +259,12 @@ public interface ActivityObject {
*
* @return Map<String, List<StandardLink>> is the list of StandardLinks
*/
- Map<String, List<StandardLink>> getStandardLinks();
+ Map<String, List<StandardLink>> getLinks();
/**
- * Set the standard link string
+ * Set the standard links
*
- * @param standardLinks the list of standard links
+ * @param links the list of standard links
*/
- void setStandardLinks(Map<String, List<StandardLink>> standardLinks);
+ void setLinks(Map<String, List<StandardLink>> links);
}
Modified:
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java?rev=1067382&r1=1067381&r2=1067382&view=diff
==============================================================================
---
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java
(original)
+++
shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java
Sat Feb 5 02:50:09 2011
@@ -1183,8 +1183,6 @@ public class JsonDbOpensocialService imp
jsonEntry.put(ActivityEntry.Field.OBJECT.toString(), jsonEntryObject);
}
- // TODO: bug fixed: jsonArray will not be null; will throw exception!
- // Fix in createActivity()
JSONArray jsonArray;
if
(db.getJSONObject(ACTIVITYSTREAMS_TABLE).has(userId.getUserId(token))) {
jsonArray =
db.getJSONObject(ACTIVITYSTREAMS_TABLE).getJSONArray(userId.getUserId(token));
@@ -1192,7 +1190,17 @@ public class JsonDbOpensocialService imp
jsonArray = new JSONArray();
db.getJSONObject(ACTIVITYSTREAMS_TABLE).put(userId.getUserId(token),
jsonArray);
}
- jsonArray.put(jsonEntry);
+
+ // Check for object's ID in array; replace entry if found
+ boolean found = false;
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject entry = jsonArray.getJSONObject(i);
+ if
(entry.getJSONObject("object").getString("id").equals(jsonEntry.getJSONObject("object").getString("id")))
{
+ jsonArray.put(i, jsonEntry);
+ found = true;
+ }
+ }
+ if (!found) jsonArray.put(jsonEntry);
return ImmediateFuture.newInstance(null);
} catch (JSONException je) {
throw new
ProtocolException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
je.getMessage(), je);
Modified:
shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityEntryTest.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityEntryTest.java?rev=1067382&r1=1067381&r2=1067382&view=diff
==============================================================================
---
shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityEntryTest.java
(original)
+++
shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulJsonActivityEntryTest.java
Sat Feb 5 02:50:09 2011
@@ -135,8 +135,8 @@ public class RestfulJsonActivityEntryTes
@Test
public void testCreateActivityEntry() throws Exception {
- String postData = "{title : 'hi mom!', body : 'and dad.', object : {id:
'1'}}";
// Create the activity entry
+ String postData = "{title : 'hi mom!', body : 'and dad.', object : {id:
'1'}}";
getResponse("/activitystreams/john.doe/@self", "POST", postData, null,
ContentTypes.OUTPUT_JSON_CONTENT_TYPE);
@@ -144,7 +144,6 @@ public class RestfulJsonActivityEntryTes
String resp = getResponse("/activitystreams/john.doe/@self", "GET", null,
ContentTypes.OUTPUT_JSON_CONTENT_TYPE);
JSONObject result = getJson(resp);
-
assertEquals(3, result.getInt("totalResults"));
assertEquals(0, result.getInt("startIndex"));
@@ -162,6 +161,43 @@ public class RestfulJsonActivityEntryTes
assertEquals("and dad.", jsonEntry.getString("body"));
assertEquals("1", jsonEntry.getJSONObject("object").getString("id"));
}
+
+ @Test
+ public void testUpdateActivityEntry() throws Exception {
+ // Create an activity entry
+ String postData = "{title : 'hi mom!', body : 'and dad.', object : {id:
'1'}}";
+ getResponse("/activitystreams/john.doe/@self", "POST", postData, null,
+ ContentTypes.OUTPUT_JSON_CONTENT_TYPE);
+
+ // Verify it can be retrieved
+ String resp = getResponse("/activitystreams/john.doe/@self", "GET", null,
+ ContentTypes.OUTPUT_JSON_CONTENT_TYPE);
+ JSONObject result = getJson(resp);
+ assertEquals(3, result.getInt("totalResults"));
+ assertEquals(0, result.getInt("startIndex"));
+
+ // Update activity entry
+ postData = "{title: 'hi mom2!', body: 'and dad2.', object: {id: '1'}}";
+ getResponse("/activitystreams/john.doe/@self", "PUT", postData, null,
+ ContentTypes.OUTPUT_JSON_CONTENT_TYPE);
+
+ // Retrieve activities and verify PUT was successful
+ resp = getResponse("/activitystreams/john.doe/@self", "GET", null,
+ ContentTypes.OUTPUT_JSON_CONTENT_TYPE);
+ result = getJson(resp);
+ assertEquals(3, result.getInt("totalResults"));
+ assertEquals(0, result.getInt("startIndex"));
+
+ // Find updated entry and test
+ JSONArray entries = result.getJSONArray("entry");
+ for(int i = 0; i < entries.length(); i++) {
+ JSONObject entry = entries.getJSONObject(i);
+ if (entry.getJSONObject("object").getString("id").equals("1")) {
+ assertEquals("hi mom2!", entry.getString("title"));
+ assertEquals("and dad2.", entry.getString("body"));
+ }
+ }
+ }
// TODO: Add tests for the fields= parameter
}
Modified:
shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulXmlActivityEntryTest.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulXmlActivityEntryTest.java?rev=1067382&r1=1067381&r2=1067382&view=diff
==============================================================================
---
shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulXmlActivityEntryTest.java
(original)
+++
shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/RestfulXmlActivityEntryTest.java
Sat Feb 5 02:50:09 2011
@@ -67,7 +67,7 @@ public class RestfulXmlActivityEntryTest
actor.setDisplayName("John Doe");
MediaLink image = new MediaLinkImpl();
-
image.setUrl("https://docs.google.com/uc?id=0B-zwcqgujo7CMTRmZTg3Y2UtZGZlYS00MTY4LWFjOTItNDRiNmY3MzRmYzQ5&export=download&hl=en");
+ image.setUrl("http://www.example.com/johnsalbum/cover.jpg");
image.setType("http://activitystrea.ms/schema/1.0/picture");
image.setWidth(400);
image.setHeight(300);
@@ -75,25 +75,25 @@ public class RestfulXmlActivityEntryTest
ActionLink actionLink1 = new ActionLinkImpl();
actionLink1.setCaption("Frozen at the top of the German Alps");
- actionLink1.setTarget("http://johnsalbums/germany123/mediaItem3");
+ actionLink1.setTarget("http://example.com/johnsalbum/frozen.jpg");
ActionLink actionLink2 = new ActionLinkImpl();
actionLink2.setCaption("Sign of Garmisch-Partenkirchen");
- actionLink2.setTarget("http://johnsalbums/germany123/mediaItem6");
+ actionLink2.setTarget("http://example.com/johnsalbum/sign.jpg");
List<ActionLink> actionLinks = new ArrayList<ActionLink>();
actionLinks.add(actionLink1);
actionLinks.add(actionLink2);
StandardLink standardLink1 = new StandardLinkImpl();
- standardLink1.setHref("www.mypics.com/1");
+ standardLink1.setHref("http://www.example.com/johnsalbum/1.jpg");
standardLink1.setType("image/jpg");
StandardLink standardLink2 = new StandardLinkImpl();
- standardLink2.setHref("www.mypics.com/2");
+ standardLink2.setHref("http://www.example.com/johnsalbum/2.jpg");
standardLink2.setType("image/jpg");
StandardLink standardLink3 = new StandardLinkImpl();
- standardLink3.setHref("www.mypics.com/3");
+ standardLink3.setHref("http://www.example.com/johnsalbum/3.jpg");
standardLink3.setType("image/jpg");
StandardLink standardLink4 = new StandardLinkImpl();
- standardLink4.setHref("www.mypics.com/4");
+ standardLink4.setHref("http://www.example.com/johnsalbum/4.jpg");
standardLink4.setType("image/jpg");
List<StandardLink> standardLinksList1 = new ArrayList<StandardLink>();
standardLinksList1.add(standardLink1);
@@ -108,7 +108,7 @@ public class RestfulXmlActivityEntryTest
ActivityObject johnsObject = new ActivityObjectImpl();
johnsObject.setId("object1");
johnsObject.setDisplayName("Frozen Eric");
- johnsObject.setLink("http://www.johnsalbums/germany123");
+ johnsObject.setLink("http://www.example.com/johnsalbum");
johnsObject.setObjectType("picture");
johnsObject.setImage(image);
johnsObject.setActionLinks(actionLinks);
@@ -126,7 +126,7 @@ public class RestfulXmlActivityEntryTest
entry.setActor(actor);
entry.setVerb("post");
entry.setObject(johnsObject);
- entry.setStandardLinks(standardLinks);
+ entry.setLinks(standardLinks);
entry.setTo(to);
entry.setCc(cc);
return entry;
@@ -239,7 +239,7 @@ public class RestfulXmlActivityEntryTest
assertListsStringEqual(entry.getBcc(), (NodeList)xpath.evaluate("bcc",
entryNode, XPathConstants.NODESET));
// Test ActivityEntry's Map<String, List<StandardLink>>
- assertStandardLinkMapsEqual(entry.getStandardLinks(),
(Node)xpath.evaluate("standardLinks", entryNode, XPathConstants.NODE));
+ assertStandardLinkMapsEqual(entry.getLinks(),
(Node)xpath.evaluate("links", entryNode, XPathConstants.NODE));
} else {
assertNull("EntryNode should be null", entryNode);
}
@@ -267,7 +267,7 @@ public class RestfulXmlActivityEntryTest
assertActivityObjectsEqual(object.getInReplyTo(),
(Node)xpath.evaluate("inReplyTo", objectNode, XPathConstants.NODE));
// Test ActivityObject's Map<String, List<StandardLink>> standardLinks
- assertStandardLinkMapsEqual(object.getStandardLinks(),
(Node)xpath.evaluate("standardLinks", objectNode, XPathConstants.NODE));
+ assertStandardLinkMapsEqual(object.getLinks(),
(Node)xpath.evaluate("links", objectNode, XPathConstants.NODE));
// Test ActivityObject's List<ActivityObject> elements
assertListsActivityObjectEqual(object.getAttachedObjects(),
(NodeList)xpath.evaluate("attachedObjects", objectNode,
XPathConstants.NODESET));
@@ -296,7 +296,7 @@ public class RestfulXmlActivityEntryTest
for (String rel : map.keySet()) {
Node relNode = findNode("key", rel, entries);
assertNotNull("'" + rel + "' rel not found", relNode);
- NodeList standardLinkNodes =
(NodeList)xpath.evaluate("value/standardLink", relNode, XPathConstants.NODESET);
+ NodeList standardLinkNodes = (NodeList)xpath.evaluate("value/link",
relNode, XPathConstants.NODESET);
List<StandardLink> standardLinks = map.get(rel);
assertListsStandardLinkEqual(standardLinks, standardLinkNodes);
}