lib/persevere_adapter.rb in dm-persevere-adapter-0.50.0 vs lib/persevere_adapter.rb in dm-persevere-adapter-0.51.0

- old
+ new

@@ -192,11 +192,11 @@ extend Deprecate RESERVED_CLASSNAMES = ['User','Transaction','Capability','File','Class', 'Object', 'Versioned'] include Migrations::PersevereAdapter - + # Default types for all data object based adapters. # # @return [Hash] default types for data objects adapters. # # @api private @@ -223,10 +223,13 @@ DataMapper::Types::URI => { :primitive => 'string', :format => 'uri'} }.freeze end end + # This should go away when we have more methods exposed to retrieve versioned data (and schemas) + attr_accessor :persevere + ## # Used by DataMapper to put records into a data-store: "INSERT" # in SQL-speak. It takes an array of the resources (model # instances) to be saved. Resources each have a key that can be # used to quickly look them up later without searching, if the @@ -596,39 +599,57 @@ # # If the user specified a versioned datastore load the versioning REST code # if ! @classes.include?("Versioned") && @options[:versioned] - json_contents = <<-EOF + versioned_class = <<-EOF { - id:"Versioned", - prototype: { - getVersionMethod: function() { - return java.lang.Class.forName("org.persvr.data.Persistable").getMethod("getVersion"); - }, - isCurrentVersion: function() { return this.getVersionMethod.invoke(this).isCurrent(); }, - getVersion: function() { return this.getVersionMethod.invoke(this).getVersionNumber(); }, - getPreviousVersion: function() { - var prev = getVersionMethod.invoke(this).getPreviousVersion(); - return prev; - }, - "representation:application/json+versioned": { - quality:0.2, - output:function(object) { - var prev = object.getPreviousVersion(); - response.setContentType("application/json+versioned"); - response.getOutputStream().print(serialize({ - version: object.getVersion(), - "parent-versions": prev ? [prev] : [], - content: object - })); - } + id: "Versioned", + prototype: { + getVersionMethod: function() { + return java.lang.Class.forName("org.persvr.data.Persistable").getMethod("getVersion"); + }, + isCurrentVersion: function() { + return this.getVersionMethod().invoke(this).isCurrent(); + }, + getVersionNumber: function() { + return this.getVersionMethod().invoke(this).getVersionNumber(); + }, + getPrevious: function() { + var prev = this.getVersionMethod().invoke(this).getPreviousVersion(); + return prev; + }, + getAllPrevious: function() { + + var current = this; + var prev = current && current.getPrevious(); + + var versions = [] + while(current && prev) { + versions.push(prev); + current = prev; + prev = current.getPrevious(); + } + + return versions; + }, + "representation:application/json+versioned": { + quality: 0.2, + output: function(object) { + var previous = object.getAllPrevious(); + response.setContentType("application/json+versioned"); + response.getOutputStream().print(JSON.stringify({ + version: object.getVersionNumber(), + current: object, + versions: previous + })); + } + } } - } } EOF begin - response = @persevere.persevere.send_request('POST', URI.encode('/Class/'), json_contents, { 'Content-Type' => 'application/javascript' } ) + response = @persevere.persevere.send_request('POST', URI.encode('/Class/'), versioned_class, { 'Content-Type' => 'application/javascript' } ) rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e puts "Persevere Create Failed: #{e}, Trying again." end end \ No newline at end of file