[moriarty] r320 committed - made mirror_from_url cope with possible conflicts with different docum...

0 views
Skip to first unread message

mori...@googlecode.com

unread,
Aug 9, 2011, 4:23:32 AM8/9/11
to moriarty...@googlegroups.com
Revision: 320
Author: k.j.w.a...@gmail.com
Date: Tue Aug 9 01:22:12 2011
Log: made mirror_from_url cope with possible conflicts with different
documents removing the same triple
http://code.google.com/p/moriarty/source/detail?r=320

Modified:
/trunk/store.class.php
/trunk/tests/fakerequestfactory.class.php
/trunk/tests/store.test.php

=======================================
--- /trunk/store.class.php Sun Aug 7 03:54:49 2011
+++ /trunk/store.class.php Tue Aug 9 01:22:12 2011
@@ -210,7 +210,9 @@
*
* @return array of responses from http requests, and overall success
status
* @author Keith Alexander
- **/
+ *
+ *
+ **/
function mirror_from_url($url, $rdf_content=false)
{

@@ -265,6 +267,13 @@
$return['update_data'] =
$this->get_metabox()->apply_changeset($Changeset);
if($return['update_data']->is_success()){
$return['success'] = true;
+ } else if($return['update_data']->status_code=='409'){ # Conflict.
some statements already removed.
+ $before_graph = new SimpleGraph($before);
+ $return['reapply_before_triples'] =
$this->get_metabox()->submit_turtle($before_graph->to_turtle());
+ if($return['reapply_before_triples']->status_code=='204'){
#Succeeded. No content
+ $return['update_data'] =
$this->get_metabox()->apply_changeset($Changeset);
+ $return['success'] = $return['update_data']->is_success();
+ }
} else {
return $return;
}
@@ -273,6 +282,7 @@
$put_page_request->set_content_type('application/json');
$put_page_response = $put_page_request->execute();
$return['put_page'] = $put_page_response;
+ $return['success'] = $put_page_response->is_success();
return $return;
} else {
$return['success'] = true;
=======================================
--- /trunk/tests/fakerequestfactory.class.php Mon Mar 23 15:37:51 2009
+++ /trunk/tests/fakerequestfactory.class.php Tue Aug 9 01:22:12 2011
@@ -11,15 +11,21 @@
}

function register($method, $uri, $request ) {
- $this->_requests[$method . ' ' . $uri] = $request;
+ $key = $method . ' ' . $uri;
+ $this->_requests[$key][] = $request;
+ }
+
+ function get_registered_request($method, $uri){
+ $key = $method . ' ' . $uri;
+ if(isset($this->_requests[$key])) return
array_shift($this->_requests[$key]);
+ else return false;
}

function make( $method, $uri, $credentials = null) {
$this->_received[] = $method . ' ' . $uri;

- if (array_key_exists( $method . ' ' . $uri, $this->_requests) ) {
- $request = $this->_requests[$method . ' ' . $uri];
- if ( $credentials != null) {
+ if ($request = $this->get_registered_request($method,$uri)) {
+ if ( $credentials != null) {
$request->set_auth( $credentials->get_auth());
}
return $request;
=======================================
--- /trunk/tests/store.test.php Sat Aug 6 17:17:14 2011
+++ /trunk/tests/store.test.php Tue Aug 9 01:22:12 2011
@@ -438,6 +438,64 @@
);
$this->assertEquals($expected_response, $response,"the updated
document should not be PUT to the contentbox if the changes fail (changes
could fail if other changesets have already removed the triples)");
}
+
+ function test_mirror_from_url_resubmits_before_graph_if_changeset_409s(){
+ $url = "http://example.org/web-page";
+ $fake_request_factory = new FakeRequestFactory();
+ $webpage_response = new HttpResponse('200') ;
+ $webpage_response->body =
file_get_contents(dirname(__FILE__).DIRECTORY_SEPARATOR.'documents/after.ttl');
+ $fake_webpage_request = new FakeHttpRequest($webpage_response);
+ $fake_request_factory->register('GET',$url, $fake_webpage_request );
+
+
+ $contentbox_copy = new HttpResponse('200');
+ $contentbox_copy->body =
file_get_contents(dirname(__FILE__).DIRECTORY_SEPARATOR.'documents/before.ttl');
+ $fake_contentbox_request = new FakeHttpRequest($contentbox_copy);
+
$fake_request_factory->register('GET','http://api.talis.com/stores/example/items/mirrors/'.$url ,
$fake_contentbox_request);
+
+ $putResponse =new HttpResponse('201');
+ $fake_postContent_request = new FakeHttpRequest($putResponse);
+
$fake_request_factory->register('PUT', 'http://api.talis.com/stores/example/items/mirrors/'.$url ,
$fake_postContent_request );
+
+
+ $postDataResponse = new HttpResponse('409');
+ $fake_postData_request = new FakeHttpRequest($postDataResponse);
+
$fake_request_factory->register('POST', 'http://api.talis.com/stores/example/meta' ,
$fake_postData_request );
+
+ $submitDataToMetaboxResponse = new HttpResponse('204');
+ $fake_submitDataToMetabox_request = new
FakeHttpRequest($submitDataToMetaboxResponse );
+
$fake_request_factory->register('POST', 'http://api.talis.com/stores/example/meta' ,
$fake_submitDataToMetabox_request );
+
+ $resubmitChangesetResponse = new HttpResponse('202');
+ $fake_resubmitChangeset_request = new
FakeHttpRequest($resubmitChangesetResponse );
+
$fake_request_factory->register('POST', 'http://api.talis.com/stores/example/meta' ,
$fake_resubmitChangeset_request );
+
+
+
+
+ $store = new Store("http://api.talis.com/stores/example", new
FakeCredentials(), $fake_request_factory);
+ $response = $store->mirror_from_url($url);
+
+
+ $this->assertTrue($fake_webpage_request->was_executed(), "The webpage
$url should be retrieved over HTTP");
+
$this->assertTrue($fake_contentbox_request->was_executed(), "Store:mirror_from_url
should attempt to retrieve a copy of $url from the content box at
{storeuri}/items/mirrors/{$url} if it exists yet.");
+ $this->assertTrue($fake_postData_request->was_executed(), "The data
from $url (and its metadata) should be added to the store by POSTing a
document containing changesets to /meta");
+
+
$this->assertTrue($fake_submitDataToMetabox_request->was_executed(), "The
before graph should be resubmitted when the changeset returns 409");
+
$this->assertTrue($fake_resubmitChangeset_request->was_executed(), "The
changeset should be resubmitted");
+
+
+ $this->assertTrue($fake_postContent_request->was_executed(), "The
contents of $url should be POSTed to the contentbox");
+ $expected_response = array(
+ 'get_page' => $webpage_response,
+ 'get_copy' => $contentbox_copy,
+ 'put_page' => $putResponse,
+ 'update_data' => $resubmitChangesetResponse,
+ 'success' => true,
+ 'reapply_before_triples' => $submitDataToMetaboxResponse,
+ );
+ $this->assertEquals($expected_response, $response,"");
+ }

Reply all
Reply to author
Forward
0 new messages