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