From a118d9d1a86983d8c75b4ca9da115c3fd5bfdcfc Mon Sep 17 00:00:00 2001
From: Kazuhiko Shiozaki <kazuhiko@nexedi.com>
Date: Wed, 18 Nov 2009 13:48:59 +0000
Subject: [PATCH] initial implement of new string divergence tester.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@30729 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 .../ERP5/Document/StringDivergenceTester.py   | 76 +++++++++++++++++--
 1 file changed, 70 insertions(+), 6 deletions(-)

diff --git a/product/ERP5/Document/StringDivergenceTester.py b/product/ERP5/Document/StringDivergenceTester.py
index f4705e7d12..7fd3852050 100644
--- a/product/ERP5/Document/StringDivergenceTester.py
+++ b/product/ERP5/Document/StringDivergenceTester.py
@@ -32,14 +32,14 @@ import zope.interface
 from AccessControl import ClassSecurityInfo
 
 from Products.ERP5.Document.Predicate import Predicate
-from Products.ERP5Type.DivergenceMessage import DivergenceMessage
 from Products.ERP5Type import Permissions, PropertySheet, interfaces
+from Products.ERP5.mixin.divergence_tester import DivergenceTesterMixin
 
-class StringDivergenceTester(Predicate):
+class StringDivergenceTester(Predicate, DivergenceTesterMixin):
   """
   The purpose of this divergence tester is to check the
   consistency between delivery movement and simulation movement
-  for some specific properties.
+  for a specific property.
   """
   meta_type = 'ERP5 String Divergence Tester'
   portal_type = 'String Divergence Tester'
@@ -49,9 +49,6 @@ class StringDivergenceTester(Predicate):
   security = ClassSecurityInfo()
   security.declareObjectProtected(Permissions.AccessContentsInformation)
 
-  # Declarative interfaces
-  zope.interface.implements( interfaces.IDivergenceTester, )
-
   # Declarative properties
   property_sheets = (   PropertySheet.Base
                       , PropertySheet.XMLObject
@@ -60,3 +57,70 @@ class StringDivergenceTester(Predicate):
                       , PropertySheet.DivergenceTester
                       , PropertySheet.SolverSelection
                      )
+
+  # Declarative interfaces
+  zope.interface.implements( interfaces.IDivergenceTester, )
+
+
+  def _compare(self, prevision_movement, decision_movement):
+    """
+    If prevision_movement and decision_movement don't match, it returns a
+    list : (prevision_value, decision_value, message, mapping)
+    """
+    tested_property = self.getTestedProperty()
+    decision_value = decision_movement.getProperty(tested_property)
+    if prevision_movement.isPropertyRecorded(tested_property):
+      prevision_value = prevision_movement.getRecordedProperty(tested_property)
+      if isinstance(prevision_value, (list, tuple)):
+        prevision_value = prevision_value[0]
+    else:
+      prevision_value = prevision_movement.getProperty(tested_property)
+
+    # XXX do we have configurable parameter for this divergence tester ?
+    # like ambiguity...
+    if decision_value != prevision_value:
+      return (
+        prevision_value, decision_value,
+        'The value of ${prperty_name} is different between decision and prevision.',
+        dict(property_name=tested_property))
+    return None
+
+  def getUpdatablePropertyDict(self, prevision_movement, decision_movement):
+    """
+    Returns a list of properties to update on decision_movement
+    prevision_movement so that next call to compare returns True.
+
+    prevision_movement -- a simulation movement (prevision)
+
+    decision_movement -- a delivery movement (decision)
+    """
+    tested_property = self.getTestedProperty()
+    if prevision_movement.isPropertyRecorded(tested_property):
+      prevision_value = prevision_movement.getRecordedProperty(tested_property)
+      if isinstance(prevision_value, (list, tuple)):
+        prevision_value = prevision_value[0]
+    else:
+      prevision_value = prevision_movement.getProperty(tested_property)
+    return {tested_property:prevision_value}
+
+  def accept(self, simulation_movement):
+    """
+    Copies the properties handled by the divergence tester
+    from the related delivery movement to simulation_movement.
+
+    NOTE: the future existence of this method is still unknown
+    because it is likely to be implemented in TargetSolver
+    instead.
+    """
+    raise NotImplementedError
+
+  def adopt(self, simulation_movement):
+    """
+    Copies the properties handled by the divergence tester
+    from simulation_movement to the related delivery movement
+
+    NOTE: the future existence of this method is still unknown
+    because it is likely to be implemented in TargetSolver
+    instead.
+    """
+    raise NotImplementedError
-- 
2.30.9