<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -16,4 +16,5 @@ public/themes
 *.swp
 vendor/engines/adva_rbac/spec/db/*.sqlite3
 vendor/engines/adva_rbac/spec/log/*
-.DS_Store
\ No newline at end of file
+.DS_Store
+*~</diff>
      <filename>.gitignore</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,8 @@ class Admin::WikipagesController &lt; Admin::BaseController
   before_filter :set_section
   before_filter :set_wikipage, :only =&gt; [:show, :edit, :update, :destroy]
   before_filter :set_categories, :only =&gt; [:new, :edit]
-
+  before_filter :optimistic_lock, :only =&gt; :update
+  
   cache_sweeper :wikipage_sweeper, :category_sweeper, :tag_sweeper,
                 :only =&gt; [:create, :update, :destroy]
 
@@ -96,4 +97,18 @@ class Admin::WikipagesController &lt; Admin::BaseController
       params[:wikipage] ||= {}
       params[:wikipage][key] = value
     end
+
+    def optimistic_lock
+      return unless params[:wikipage]
+
+      unless updated_at = params[:wikipage].delete(:updated_at)
+        # TODO raise something more explicit here
+        raise t(:'adva.wiki.exception.missing_timestamp')
+      end
+
+      if @wikipage.updated_at &amp;&amp; (Time.zone.parse(updated_at) != @wikipage.updated_at)
+        flash[:error] = t(:'adva.wiki.flash.optimistic_lock.failure')
+        render :action =&gt; :edit
+      end
+    end
 end</diff>
      <filename>engines/adva_wiki/app/controllers/admin/wikipages_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -97,7 +97,9 @@ class AdminWikipagesControllerTest &lt; ActionController::TestCase
   describe &quot;PUT to :update&quot; do
     action do
       Wikipage.with_observers :wikipage_sweeper do
-        put :update, default_params.merge(:id =&gt; @wikipage.id).merge(@params || {})
+        params = default_params.merge(:id =&gt; @wikipage.id).merge(@params || {})
+        params[:wikipage][:updated_at] = &quot;#{@wikipage.updated_at}&quot;
+        put :update, params
       end
     end
 
@@ -153,6 +155,91 @@ class AdminWikipagesControllerTest &lt; ActionController::TestCase
       end
     end
   end
+  
+  describe &quot;PUT to :update&quot; do
+    with &quot;incorrect time stamp&quot; do
+      action do
+        Wikipage.with_observers :wikipage_sweeper do
+          params = default_params.merge(@params || { :wikipage =&gt; {} }).merge(:id =&gt; @wikipage.id)
+          params[:wikipage][:updated_at] = &quot;#{Time.parse('2002-01-01 12:00:00')}&quot;
+          put :update, params
+        end
+      end
+      # FIXME - test with optimistic locking failing, too
+      with &quot;no version param given&quot; do
+        with :valid_wikipage_params do
+          it_guards_permissions :update, :wikipage
+          it_assigns :site, :section, :wikipage
+          it_assigns_flash_cookie :error =&gt; :not_nil          
+          it_does_not_trigger_any_event
+          it_does_not_sweep_page_cache #:by_reference =&gt; :wikipage
+        end
+      end
+    end
+  end
+
+  describe &quot;PUT to :update&quot; do
+    action do
+      Wikipage.with_observers :wikipage_sweeper do
+        params = default_params.merge(@params || { :wikipage =&gt; {} }).merge(:id =&gt; @wikipage.id)
+        params[:wikipage][:updated_at] = &quot;#{@wikipage.updated_at}&quot;
+        #params[:wikipage][:updated_at] = nil
+        #params[:article][:updated_at] = &quot;#{@wikipage.updated_at}&quot;
+        put :update, params
+      end
+    end
+
+    it_guards_permissions :update, :wikipage
+
+    # FIXME - test with optimistic locking failing, too
+    with &quot;no version param given&quot; do
+      it_guards_permissions :update, :wikipage
+
+      with :access_granted do
+        with :valid_wikipage_params do
+          it_updates :wikipage
+          
+          it_redirects_to { edit_admin_wikipage_url(@site, @section, @wikipage) }
+          
+          it_assigns_flash_cookie :notice =&gt; :not_nil
+          it_triggers_event :wikipage_updated
+          it_sweeps_page_cache :by_reference =&gt; :wikipage
+        end
+      end
+
+      with :invalid_wikipage_params do
+          it_does_not_update :wikipage
+          it_renders :template, :edit
+          it_assigns_flash_cookie :error =&gt; :not_nil
+          it_does_not_trigger_any_event
+          it_does_not_sweep_page_cache
+      end
+    end
+
+    with &quot;a version param given&quot; do
+      before { @params = { :wikipage =&gt; { :version =&gt; '1' } } }
+      it_guards_permissions :update, :wikipage
+
+      with :access_granted do
+        with 'the wikipage has the requested revision (succeeds)' do
+          it_rollsback :wikipage, :to =&gt; 1
+          it_triggers_event :wikipage_rolledback
+          it_assigns_flash_cookie :notice =&gt; :not_nil
+          it_redirects_to { edit_admin_wikipage_url(@site, @section, @wikipage) }
+          it_sweeps_page_cache :by_reference =&gt; :wikipage
+        end
+ 
+        with &quot;the wikipage does not have the requested revision (fails)&quot; do
+          before { @params = { :wikipage =&gt; { :version =&gt; '10' } } }
+            it_does_not_rollback :wikipage
+            it_does_not_trigger_any_event
+            it_assigns_flash_cookie :error =&gt; :not_nil
+            it_redirects_to { edit_admin_wikipage_url(@site, @section, @wikipage) }
+            it_does_not_sweep_page_cache
+        end
+      end
+    end
+  end
 
   describe &quot;DELETE to :destroy&quot; do
     action { delete :destroy, default_params.update(:id =&gt; @wikipage.id) }
@@ -165,4 +252,4 @@ class AdminWikipagesControllerTest &lt; ActionController::TestCase
       it_sweeps_page_cache :by_reference =&gt; :wikipage
     end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>engines/adva_wiki/test/functional/admin/wikipages_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -259,4 +259,4 @@ class WikiControllerTest &lt; ActionController::TestCase
       it_renders :template, 'comments/comments', :format =&gt; :atom
     end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>engines/adva_wiki/test/functional/wiki_controller_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>99cdcff186f0ed416cc03e6b8a3ce84f2d9a7a75</id>
    </parent>
  </parents>
  <author>
    <name>chris</name>
    <email>chris@turnstile.(none)</email>
  </author>
  <url>http://github.com/svenfuchs/adva_cms/commit/1f17e66297924b7223fab9fa592c9d9f0b556b1c</url>
  <id>1f17e66297924b7223fab9fa592c9d9f0b556b1c</id>
  <committed-date>2009-09-08T12:37:43-07:00</committed-date>
  <authored-date>2009-09-08T12:37:43-07:00</authored-date>
  <message>added optimistic lock to wiki backend</message>
  <tree>0da5c62201a78c024ec0cdc3f59fed32c9dce1f3</tree>
  <committer>
    <name>chris</name>
    <email>chris@turnstile.(none)</email>
  </committer>
</commit>
