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