From 34671bbd7b263df009ee8f29f8642b9b45fe24f1 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Fri, 19 Nov 2010 13:01:43 +0000
Subject: [PATCH] [LMS-1858] provided daoFactory to evaluator

SVN: 18816
---
 .../openbis/generic/server/CommonServer.java  |  7 +++-
 .../DefaultBatchDynamicPropertyEvaluator.java | 15 +++++--
 .../DynamicPropertyEvaluationRunnable.java    |  4 +-
 .../DynamicPropertyEvaluator.java             | 20 +++++++++-
 .../DynamicPropertyEvaluatorDbTest.java       | 39 +++++++++++++++++++
 .../DynamicPropertyEvaluatorTest.java         | 18 +++++++--
 6 files changed, 91 insertions(+), 12 deletions(-)
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluatorDbTest.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index ec8c4335e3a..ee847a3cd71 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -71,8 +71,10 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.IHibernateSearchDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IRoleAssignmentDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.HibernateSearchDataProvider;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.DynamicPropertyEvaluator;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.IDynamicPropertyEvaluator;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.calculator.DynamicPropertyCalculator;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.calculator.EntityAdaptorFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.calculator.IEntityAdaptor;
 import ch.systemsx.cisd.openbis.generic.server.plugin.IDataSetTypeSlaveServerPlugin;
 import ch.systemsx.cisd.openbis.generic.server.util.GroupIdentifierHelper;
 import ch.systemsx.cisd.openbis.generic.shared.basic.BasicEntityInformationHolder;
@@ -2059,8 +2061,9 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         {
             DynamicPropertyCalculator calculator =
                     DynamicPropertyCalculator.create(info.getScript());
-            calculator.setEntity(EntityAdaptorFactory
-                    .create(entity, new DynamicPropertyEvaluator()));
+            IDynamicPropertyEvaluator evaluator = new DynamicPropertyEvaluator(getDAOFactory());
+            IEntityAdaptor adaptor = EntityAdaptorFactory.create(entity, evaluator);
+            calculator.setEntity(adaptor);
             return calculator.evalAsString();
         } catch (Throwable e)
         {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultBatchDynamicPropertyEvaluator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultBatchDynamicPropertyEvaluator.java
index d444b36f6a9..06f8bb4e04f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultBatchDynamicPropertyEvaluator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultBatchDynamicPropertyEvaluator.java
@@ -33,6 +33,7 @@ import org.springframework.dao.DataAccessException;
 
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
@@ -66,10 +67,18 @@ final class DefaultBatchDynamicPropertyEvaluator implements IBatchDynamicPropert
 
     private final int batchSize;
 
-    DefaultBatchDynamicPropertyEvaluator(final int batchSize)
+    private final IDAOFactory daoFactory;
+
+    DefaultBatchDynamicPropertyEvaluator(final int batchSize, IDAOFactory daoFactory)
     {
         assert batchSize > -1 : "Batch size can not be negative.";
         this.batchSize = batchSize;
+        this.daoFactory = daoFactory;
+    }
+
+    private DynamicPropertyEvaluator createEvaluator()
+    {
+        return new DynamicPropertyEvaluator(daoFactory);
     }
 
     //
@@ -82,7 +91,7 @@ final class DefaultBatchDynamicPropertyEvaluator implements IBatchDynamicPropert
         operationLog.info(String.format("Evaluating dynamic properties for all %ss...",
                 clazz.getSimpleName()));
 
-        final IDynamicPropertyEvaluator evaluator = new DynamicPropertyEvaluator();
+        final IDynamicPropertyEvaluator evaluator = createEvaluator();
 
         Transaction transaction = null;
         try
@@ -137,7 +146,7 @@ final class DefaultBatchDynamicPropertyEvaluator implements IBatchDynamicPropert
         operationLog.info(String.format("Evaluating dynamic properties for %ss...",
                 clazz.getSimpleName()));
 
-        final IDynamicPropertyEvaluator evaluator = new DynamicPropertyEvaluator();
+        final IDynamicPropertyEvaluator evaluator = createEvaluator();
 
         Transaction transaction = null;
         try
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java
index 27ac5ae5671..6db9d24fb72 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java
@@ -30,6 +30,7 @@ import ch.systemsx.cisd.common.collections.ExtendedBlockingQueueFactory;
 import ch.systemsx.cisd.common.collections.IExtendedBlockingQueue;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IFullTextIndexUpdateScheduler;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IndexUpdateOperation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
@@ -59,11 +60,12 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport
     private final IFullTextIndexUpdateScheduler fullTextIndexUpdateScheduler;
 
     public DynamicPropertyEvaluationRunnable(final SessionFactory sessionFactory,
+            final IDAOFactory daoFactory,
             final IFullTextIndexUpdateScheduler fullTextIndexUpdateScheduler)
     {
         this.fullTextIndexUpdateScheduler = fullTextIndexUpdateScheduler;
         setSessionFactory(sessionFactory);
-        evaluator = new DefaultBatchDynamicPropertyEvaluator(BATCH_SIZE);
+        evaluator = new DefaultBatchDynamicPropertyEvaluator(BATCH_SIZE, daoFactory);
 
         final File queueFile = getEvaluatorQueueFile();
         operationLog.info(String.format("Evaluator queue file: %s.", queueFile.getAbsolutePath()));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluator.java
index bd532f7e3b3..fe956bbf3b9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluator.java
@@ -25,6 +25,7 @@ import org.apache.log4j.Logger;
 
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IPropertyValueValidator;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.PropertyValidator;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.calculator.DynamicPropertyCalculator;
@@ -59,6 +60,14 @@ public class DynamicPropertyEvaluator implements IDynamicPropertyEvaluator
     private final List<EntityTypePropertyTypePE> evaluationPath =
             new ArrayList<EntityTypePropertyTypePE>();
 
+    private final IDAOFactory daoFactory;
+
+    public DynamicPropertyEvaluator(IDAOFactory daoFactory)
+    {
+        assert daoFactory != null;
+        this.daoFactory = daoFactory;
+    }
+
     /** Returns a calculator for given script (creates a new one if nothing is found in cache). */
     private DynamicPropertyCalculator getCalculator(ScriptPE scriptPE)
     {
@@ -87,7 +96,14 @@ public class DynamicPropertyEvaluator implements IDynamicPropertyEvaluator
             if (etpt.isDynamic())
             {
                 final String dynamicValue = evaluateProperty(entityAdaptor, etpt, true);
-                property.setValue(dynamicValue);
+
+                if (dynamicValue.startsWith(BasicConstant.ERROR_PROPERTY_PREFIX))
+                {
+                    property.setValue(dynamicValue);
+                } else
+                {
+                    property.setUntypedValue(dynamicValue, null, null);
+                }
             }
         }
     }
@@ -102,7 +118,7 @@ public class DynamicPropertyEvaluator implements IDynamicPropertyEvaluator
         return evaluateProperty(entityAdaptor, etpt, false);
     }
 
-    public String evaluateProperty(IEntityAdaptor entityAdaptor, EntityTypePropertyTypePE etpt,
+    private String evaluateProperty(IEntityAdaptor entityAdaptor, EntityTypePropertyTypePE etpt,
             boolean startPath)
     {
         assert etpt.isDynamic() == true : "expected dynamic property";
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluatorDbTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluatorDbTest.java
new file mode 100644
index 00000000000..48841b537e0
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluatorDbTest.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2009 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property;
+
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.AbstractDAOTest;
+
+/**
+ * @author Piotr Buczek
+ */
+@Test(groups = "db")
+public class DynamicPropertyEvaluatorDbTest extends AbstractDAOTest
+{
+
+    DynamicPropertyEvaluator evaluator;
+
+    @BeforeMethod
+    public void beforeClass() throws Exception
+    {
+        evaluator = new DynamicPropertyEvaluator(daoFactory);
+    }
+
+}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluatorTest.java
index 4658bfbc16e..6e8d78a817a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluatorTest.java
@@ -22,9 +22,12 @@ import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
+import org.jmock.Mockery;
 import org.testng.AssertJUnit;
+import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.calculator.AbstractEntityAdaptor;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.calculator.BasicPropertyAdaptor;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.calculator.IEntityAdaptor;
@@ -43,15 +46,24 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ScriptPE;
 /**
  * @author Piotr Buczek
  */
-// TODO 2010-11-19, Piotr Buczek: extend AbstractDAOTest
 public class DynamicPropertyEvaluatorTest extends AssertJUnit
 {
 
+    private DynamicPropertyEvaluator evaluator;
+
+    private IDAOFactory daoFactory;
+
+    @BeforeMethod
+    public void setUp()
+    {
+        daoFactory = new Mockery().mock(IDAOFactory.class);
+        evaluator = new DynamicPropertyEvaluator(daoFactory);
+    }
+
     @Test
     public void testEvaluateProperty()
     {
         // test evaluation of a single dynamic property
-        final DynamicPropertyEvaluator evaluator = new DynamicPropertyEvaluator();
 
         IEntityPropertyAdaptor p1 = createProperty("p1", "v1");
         IEntityPropertyAdaptor p2 = createProperty("p2", "v2");
@@ -78,7 +90,6 @@ public class DynamicPropertyEvaluatorTest extends AssertJUnit
         // - error handling (error messages are stored as property values)
         // -- storing validation error when script evaluates to string instead of expected integer
         // -- storing python error when script tries to invoke nonexisting method
-        final DynamicPropertyEvaluator evaluator = new DynamicPropertyEvaluator();
 
         Set<SamplePropertyPE> properties = new HashSet<SamplePropertyPE>();
         // create normal properties
@@ -130,7 +141,6 @@ public class DynamicPropertyEvaluatorTest extends AssertJUnit
     {
         // check evaluation of dynamic properties that depend on other dynamic properties
         // (with and without cyclic dependencies)
-        final DynamicPropertyEvaluator evaluator = new DynamicPropertyEvaluator();
 
         final SamplePropertyPE p1 = createSampleProperty("p1", "v1"); // normal property
         final ScriptPE scriptP1 = createScript("get p1", "entity.propertyValue('p1')");
-- 
GitLab