Jacques Le Roux wrote: > (sorry for previous message; seems my email client did me a joke) > > Then I would also add a warning in log. > > But I'm not quite sure all this would be enough. > It'd be better to refactor it, to remove any possible confusions. Fortunately > those methods seems to not be much used OOTB.
Of course this would be done in trunk only. What you proposed + log warning would be in branches releases. Jacques > Of course this means that we are sure we will not lose anything from this > refactoring. It seems you are quite sure from the > javadoc, right? > > Jacques > > From: "Adrian Crum" <adrian.c...@sandglass-software.com> >> We could change the code to always clear the cache, but leave the method >> signature the same and mention in the JavaDocs that the doCacheClear >> parameter will be ignored. >> >> -Adrian >> >> On 5/11/2013 12:54 PM, Jacques Le Roux wrote: >>> Adrian, >>> >>> In javadoc of numbers of methods of Delegator.java you added this sentence >>> - * boolean that specifies whether to clear related cache >>> entries >>> - * for this primaryKey to be created >>> + * boolean that specifies whether or not to automatically >>> clear >>> + * cache entries related to this operation. This should >>> always be >>> + * <code>true</code> - otherwise you will lose data >>> integrity.Now I wonder if we should no more and remove all >>> those . What's the point of letting users not doing a cache clear >>> there?ThanksJacquesFrom: <adri...@apache.org> >>>> Author: adrianc >>>> Date: Fri Apr 26 17:04:49 2013 >>>> New Revision: 1476296 >>>> >>>> URL: http://svn.apache.org/r1476296 >>>> Log: >>>> Some bug fixes for entity engine caches. GenericDelegator was inconsistent >>>> in clearing caches - some methods cleared the cache >>>> before the entity operation (wrong) while others cleared the cache after >>>> the entity operation (right). Also, I updated the >>>> Delegator JavaDocs to warn against skipping the cache clearing step - >>>> which shouldn't be done. Finally, the >>>> AbstractEntityConditionCache.storeHook method doesn't work (for a number >>>> of reasons) so I bypassed it. >>>> >>>> Modified: >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/Delegator.java >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java >>>> >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/cache/AbstractEntityConditionCache.java >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/cache/Cache.java >>>> >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/eca/EntityEcaHandler.java >>>> >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java >>>> >>>> Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/Delegator.java >>>> URL: >>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/Delegator.java?rev=1476296&r1=1476295&r2=1476296&view=diff >>>> ============================================================================== >>>> --- >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/Delegator.java >>>> (original) +++ >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/Delegator.java Fri Apr >>>> 26 17:04:49 2013 @@ -159,8 +159,9 @@ public interface >>>> Delegator { >>>> * @param primaryKey >>>> * The GenericPK to create a value in the datasource from >>>> * @param doCacheClear >>>> - * boolean that specifies whether to clear related cache >>>> entries >>>> - * for this primaryKey to be created >>>> + * boolean that specifies whether or not to automatically >>>> clear >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> * @return GenericValue instance containing the new instance >>>> */ >>>> public GenericValue create(GenericPK primaryKey, boolean >>>> doCacheClear) throws GenericEntityException; >>>> @@ -183,7 +184,8 @@ public interface Delegator { >>>> * The GenericValue to create a value in the datasource >>>> from >>>> * @param doCacheClear >>>> * boolean that specifies whether or not to automatically >>>> clear >>>> - * cache entries related to this operation >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> * @return GenericValue instance containing the new instance >>>> */ >>>> public GenericValue create(GenericValue value, boolean doCacheClear) >>>> throws GenericEntityException; >>>> @@ -222,7 +224,8 @@ public interface Delegator { >>>> * instance >>>> * @param doCacheClear >>>> * boolean that specifies whether or not to automatically >>>> clear >>>> - * cache entries related to this operation >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> * @return GenericValue instance containing the new or updated >>>> instance >>>> */ >>>> public GenericValue createOrStore(GenericValue value, boolean >>>> doCacheClear) throws GenericEntityException; >>>> @@ -950,7 +953,8 @@ public interface Delegator { >>>> * GenericValue instance containing the entity to refresh >>>> * @param doCacheClear >>>> * boolean that specifies whether or not to automatically >>>> clear >>>> - * cache entries related to this operation >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> */ >>>> public void refresh(GenericValue value, boolean doCacheClear) throws >>>> GenericEntityException; >>>> >>>> @@ -999,7 +1003,8 @@ public interface Delegator { >>>> * or by and fields to remove >>>> * @param doCacheClear >>>> * boolean that specifies whether or not to automatically >>>> clear >>>> - * cache entries related to this operation >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> * @return int representing number of rows effected by this operation >>>> */ >>>> public int removeAll(List<? extends GenericEntity> dummyPKs, boolean >>>> doCacheClear) throws GenericEntityException; >>>> @@ -1013,8 +1018,9 @@ public interface Delegator { >>>> * @param entityName >>>> * The Name of the Entity as defined in the entity XML file >>>> * @param doCacheClear >>>> - * boolean that specifies whether to clear cache entries >>>> for this >>>> - * value to be removed >>>> + * boolean that specifies whether or not to automatically >>>> clear >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> * @param fields >>>> * The fields of the named entity to query by with their >>>> * corresponding values >>>> @@ -1045,8 +1051,9 @@ public interface Delegator { >>>> * The fields of the named entity to query by with their >>>> * corresponding values >>>> * @param doCacheClear >>>> - * boolean that specifies whether to clear cache entries >>>> for this >>>> - * value to be removed >>>> + * boolean that specifies whether or not to automatically >>>> clear >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> * @return int representing number of rows effected by this operation >>>> */ >>>> public int removeByAnd(String entityName, Map<String, ? extends >>>> Object> fields, boolean doCacheClear) throws >>>> GenericEntityException; @@ -1083,8 +1090,9 @@ public interface Delegator { >>>> * @param condition >>>> * The condition used to restrict the removing >>>> * @param doCacheClear >>>> - * boolean that specifies whether to clear cache entries >>>> for this >>>> - * value to be removed >>>> + * boolean that specifies whether or not to automatically >>>> clear >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> * @return int representing number of rows effected by this operation >>>> */ >>>> public int removeByCondition(String entityName, EntityCondition >>>> condition, boolean doCacheClear) throws >>>> GenericEntityException; @@ -1104,8 +1112,9 @@ public interface Delegator { >>>> * @param primaryKey >>>> * The primary key of the entity to remove. >>>> * @param doCacheClear >>>> - * boolean that specifies whether to clear cache entries >>>> for this >>>> - * primaryKey to be removed >>>> + * boolean that specifies whether or not to automatically >>>> clear >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> * @return int representing number of rows effected by this operation >>>> */ >>>> public int removeByPrimaryKey(GenericPK primaryKey, boolean >>>> doCacheClear) throws GenericEntityException; >>>> @@ -1135,8 +1144,9 @@ public interface Delegator { >>>> * @param value >>>> * GenericValue instance containing the entity >>>> * @param doCacheClear >>>> - * boolean that specifies whether to clear cache entries >>>> for this >>>> - * value to be removed >>>> + * boolean that specifies whether or not to automatically >>>> clear >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> * @return int representing number of rows effected by this operation >>>> */ >>>> public int removeRelated(String relationName, GenericValue value, >>>> boolean doCacheClear) throws GenericEntityException; >>>> @@ -1156,8 +1166,9 @@ public interface Delegator { >>>> * @param value >>>> * The GenericValue object of the entity to remove. >>>> * @param doCacheClear >>>> - * boolean that specifies whether to clear cache entries >>>> for this >>>> - * value to be removed >>>> + * boolean that specifies whether or not to automatically >>>> clear >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> * @return int representing number of rows effected by this operation >>>> */ >>>> public int removeValue(GenericValue value, boolean doCacheClear) >>>> throws GenericEntityException; >>>> @@ -1199,7 +1210,8 @@ public interface Delegator { >>>> * GenericValue instance containing the entity >>>> * @param doCacheClear >>>> * boolean that specifies whether or not to automatically >>>> clear >>>> - * cache entries related to this operation >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> * @return int representing number of rows effected by this operation >>>> */ >>>> public int store(GenericValue value, boolean doCacheClear) throws >>>> GenericEntityException; >>>> @@ -1236,7 +1248,8 @@ public interface Delegator { >>>> * store >>>> * @param doCacheClear >>>> * boolean that specifies whether or not to automatically >>>> clear >>>> - * cache entries related to this operation >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> * @return int representing number of rows effected by this operation >>>> */ >>>> public int storeAll(List<GenericValue> values, boolean doCacheClear) >>>> throws GenericEntityException; >>>> @@ -1256,7 +1269,8 @@ public interface Delegator { >>>> * store >>>> * @param doCacheClear >>>> * boolean that specifies whether or not to automatically >>>> clear >>>> - * cache entries related to this operation >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> * @param createDummyFks >>>> * boolean that specifies whether or not to automatically >>>> create >>>> * "dummy" place holder FKs >>>> @@ -1288,8 +1302,9 @@ public interface Delegator { >>>> * @param condition >>>> * The condition that restricts the list of stored values >>>> * @param doCacheClear >>>> - * boolean that specifies whether to clear cache entries >>>> for >>>> - * these values >>>> + * boolean that specifies whether or not to automatically >>>> clear >>>> + * cache entries related to this operation. This should >>>> always be >>>> + * <code>true</code> - otherwise you will lose data >>>> integrity. >>>> * @return int representing number of rows effected by this operation >>>> * @throws GenericEntityException >>>> */ >>>> >>>> Modified: >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java >>>> URL: >>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java?rev=1476296&r1=1476295&r2=1476296&view=diff >>>> ============================================================================== >>>> --- >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java >>>> (original) +++ >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java >>>> Fri Apr 26 17:04:49 2013 @@ -995,12 +995,6 @@ public >>>> class GenericDelegator implements >>>> >>>> GenericHelper helper = >>>> getEntityHelper(primaryKey.getEntityName()); >>>> >>>> - if (doCacheClear) { >>>> - // always clear cache before the operation >>>> - ecaRunner.evalRules(EntityEcaHandler.EV_CACHE_CLEAR, >>>> EntityEcaHandler.OP_REMOVE, primaryKey, false); >>>> - this.clearCacheLine(primaryKey); >>>> - } >>>> - >>>> ecaRunner.evalRules(EntityEcaHandler.EV_RUN, >>>> EntityEcaHandler.OP_REMOVE, primaryKey, false); >>>> >>>> // if audit log on for any fields, save old value before >>>> removing so it's still there >>>> @@ -1013,6 +1007,11 @@ public class GenericDelegator implements >>>> removedEntity = this.findOne(primaryKey.getEntityName(), >>>> primaryKey, false); >>>> } >>>> int num = helper.removeByPrimaryKey(primaryKey); >>>> + if (doCacheClear) { >>>> + ecaRunner.evalRules(EntityEcaHandler.EV_CACHE_CLEAR, >>>> EntityEcaHandler.OP_REMOVE, primaryKey, false); >>>> + this.clearCacheLine(primaryKey); >>>> + } >>>> + >>>> this.saveEntitySyncRemoveInfo(primaryKey); >>>> >>>> if (testMode) { >>>> @@ -1064,11 +1063,6 @@ public class GenericDelegator implements >>>> >>>> GenericHelper helper = getEntityHelper(value.getEntityName()); >>>> >>>> - if (doCacheClear) { >>>> - ecaRunner.evalRules(EntityEcaHandler.EV_CACHE_CLEAR, >>>> EntityEcaHandler.OP_REMOVE, value, false); >>>> - this.clearCacheLine(value); >>>> - } >>>> - >>>> ecaRunner.evalRules(EntityEcaHandler.EV_RUN, >>>> EntityEcaHandler.OP_REMOVE, value, false); >>>> >>>> // if audit log on for any fields, save old value before >>>> actual remove >>>> @@ -1084,6 +1078,11 @@ public class GenericDelegator implements >>>> int num = helper.removeByPrimaryKey(value.getPrimaryKey()); >>>> // Need to call removedFromDatasource() here because the >>>> helper calls removedFromDatasource() on the PK instead >>>> of the GenericEntity. value.removedFromDatasource(); >>>> + if (doCacheClear) { >>>> + ecaRunner.evalRules(EntityEcaHandler.EV_CACHE_CLEAR, >>>> EntityEcaHandler.OP_REMOVE, value, false); >>>> + this.clearCacheLine(value); >>>> + } >>>> + >>>> >>>> if (testMode) { >>>> if (removedValue != null) { >>>> @@ -1329,12 +1328,6 @@ public class GenericDelegator implements >>>> ecaRunner.evalRules(EntityEcaHandler.EV_VALIDATE, >>>> EntityEcaHandler.OP_STORE, value, false); >>>> GenericHelper helper = getEntityHelper(value.getEntityName()); >>>> >>>> - if (doCacheClear) { >>>> - // always clear cache before the operation >>>> - ecaRunner.evalRules(EntityEcaHandler.EV_CACHE_CLEAR, >>>> EntityEcaHandler.OP_STORE, value, false); >>>> - this.clearCacheLine(value); >>>> - } >>>> - >>>> ecaRunner.evalRules(EntityEcaHandler.EV_RUN, >>>> EntityEcaHandler.OP_STORE, value, false); >>>> this.encryptFields(value); >>>> >>>> @@ -1350,6 +1343,10 @@ public class GenericDelegator implements >>>> } >>>> >>>> int retVal = helper.store(value); >>>> + if (doCacheClear) { >>>> + ecaRunner.evalRules(EntityEcaHandler.EV_CACHE_CLEAR, >>>> EntityEcaHandler.OP_STORE, value, false); >>>> + this.clearCacheLine(value); >>>> + } >>>> >>>> if (testMode) { >>>> storeForTestRollback(new >>>> TestOperation(OperationType.UPDATE, updatedEntity)); >>>> @@ -2192,11 +2189,6 @@ public class GenericDelegator implements >>>> * @see >>>> org.ofbiz.entity.Delegator#clearCacheLine(org.ofbiz.entity.GenericValue, >>>> boolean) >>>> */ >>>> public void clearCacheLine(GenericValue value, boolean distribute) { >>>> - // TODO: make this a bit more intelligent by passing in the >>>> operation being done (create, update, remove) so we can >>>> not do unnecessary cache clears... >>>> - // for instance: >>>> - // on create don't clear by primary cache (and won't clear >>>> original values because there won't be any) >>>> - // on remove don't clear by and for new values, but do for >>>> original values >>>> - >>>> // Debug.logInfo("running clearCacheLine for value: " + value + >>>> ", distribute: " + distribute, module); >>>> if (value == null) { >>>> return; >>>> >>>> Modified: >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/cache/AbstractEntityConditionCache.java >>>> URL: >>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/cache/AbstractEntityConditionCache.java?rev=1476296&r1=1476295&r2=1476296&view=diff >>>> ============================================================================== >>>> --- >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/cache/AbstractEntityConditionCache.java >>>> (original) +++ >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/cache/AbstractEntityConditionCache.java >>>> Fri Apr 26 17:04:49 2013 @@ -59,6 >>>> +59,21 @@ public abstract class AbstractEntityCond return >>>> conditionCache.put(key, value); >>>> } >>>> >>>> + /** >>>> + * Removes all condition caches that include the specified entity. >>>> + */ >>>> + public void remove(GenericEntity entity) { >>>> + UtilCache.clearCache(getCacheName(entity.getEntityName())); >>>> + ModelEntity model = entity.getModelEntity(); >>>> + if (model != null) { >>>> + Iterator<String> it = model.getViewConvertorsIterator(); >>>> + while (it.hasNext()) { >>>> + String targetEntityName = it.next(); >>>> + UtilCache.clearCache(getCacheName(targetEntityName)); >>>> + } >>>> + } >>>> + } >>>> + >>>> public void remove(String entityName, EntityCondition condition) { >>>> UtilCache<EntityCondition, ConcurrentMap<K, V>> cache = >>>> getCache(entityName); >>>> if (cache == null) return; >>>> >>>> Modified: >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/cache/Cache.java >>>> URL: >>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/cache/Cache.java?rev=1476296&r1=1476295&r2=1476296&view=diff >>>> ============================================================================== >>>> --- >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/cache/Cache.java >>>> (original) +++ >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/cache/Cache.java Fri Apr >>>> 26 17:04:49 2013 @@ -112,16 +112,22 @@ public class >>>> Cache { public GenericValue remove(GenericEntity entity) { >>>> if (Debug.verboseOn()) Debug.logVerbose("Cache remove >>>> GenericEntity: " + entity, module); >>>> GenericValue oldEntity = >>>> entityCache.remove(entity.getPrimaryKey()); >>>> - entityListCache.storeHook(entity, null); >>>> - entityObjectCache.storeHook(entity, null); >>>> + // Workaround because AbstractEntityConditionCache.storeHook >>>> doesn't work. >>>> + entityListCache.remove(entity); >>>> + entityObjectCache.remove(entity); >>>> + // entityListCache.storeHook(entity, null); >>>> + // entityObjectCache.storeHook(entity, null); >>>> return oldEntity; >>>> } >>>> >>>> public GenericValue remove(GenericPK pk) { >>>> if (Debug.verboseOn()) Debug.logVerbose("Cache remove GenericPK: >>>> " + pk, module); >>>> GenericValue oldEntity = entityCache.remove(pk); >>>> - entityListCache.storeHook(pk, null); >>>> - entityObjectCache.storeHook(pk, null); >>>> + // Workaround because AbstractEntityConditionCache.storeHook >>>> doesn't work. >>>> + entityListCache.remove(pk); >>>> + entityObjectCache.remove(pk); >>>> + // entityListCache.storeHook(pk, null); >>>> + // entityObjectCache.storeHook(pk, null); >>>> return oldEntity; >>>> } >>>> } >>>> >>>> Modified: >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/eca/EntityEcaHandler.java >>>> URL: >>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/eca/EntityEcaHandler.java?rev=1476296&r1=1476295&r2=1476296&view=diff >>>> ============================================================================== >>>> --- >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/eca/EntityEcaHandler.java >>>> (original) +++ >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/eca/EntityEcaHandler.java >>>> Fri Apr 26 17:04:49 2013 @@ -34,6 +34,9 @@ public >>>> interface EntityEcaHandler<T> { public static final String >>>> EV_VALIDATE = "validate"; >>>> public static final String EV_RUN = "run"; >>>> public static final String EV_RETURN = "return"; >>>> + /** >>>> + * Invoked after the entity operation, but before the cache is >>>> cleared. >>>> + */ >>>> public static final String EV_CACHE_CLEAR = "cache-clear"; >>>> public static final String EV_CACHE_CHECK = "cache-check"; >>>> public static final String EV_CACHE_PUT = "cache-put"; >>>> >>>> Modified: >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java >>>> URL: >>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java?rev=1476296&r1=1476295&r2=1476296&view=diff >>>> ============================================================================== >>>> --- >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java >>>> (original) +++ >>>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java >>>> Fri Apr 26 17:04:49 2013 @@ -107,7 +107,7 @@ >>>> public class EntityTestSuite extends Ent observer.arg = null; >>>> GenericValue clonedValue = (GenericValue) testValue.clone(); >>>> clonedValue.put("description", "New Testing Type #1"); >>>> - assertTrue("Observable has changed", testValue.hasChanged()); >>>> + assertTrue("Cloned Observable has changed", >>>> clonedValue.hasChanged()); >>>> assertEquals("Observer called with cloned GenericValue field >>>> name", "description", observer.arg); >>>> // now store it >>>> testValue.store(); >>>> @@ -142,12 +142,11 @@ public class EntityTestSuite extends Ent >>>> */ >>>> public void testEntityCache() throws Exception { >>>> // Test primary key cache >>>> - GenericValue testValue = delegator.findOne("TestingType", true, >>>> "testingTypeId", "TEST-2"); >>>> - assertEquals("Retrieved from cache value has the correct >>>> description", "Testing Type #2", >>>> testValue.getString("description")); + GenericValue testValue = >>>> delegator.findOne("TestingType", true, "testingTypeId", >>>> "TEST-3"); + assertEquals("Retrieved from cache value has the >>>> correct description", "Testing Type #3", >>>> testValue.getString("description")); // Test immutable >>>> try { >>>> - testValue.put("description", "New Testing Type #2"); >>>> - testValue.store(); >>>> + testValue.put("description", "New Testing Type #3"); >>>> fail("Modified an immutable GenericValue"); >>>> } catch (IllegalStateException e) { >>>> } >>>> @@ -156,6 +155,17 @@ public class EntityTestSuite extends Ent >>>> fail("Modified an immutable GenericValue"); >>>> } catch (UnsupportedOperationException e) { >>>> } >>>> + // Test entity value update operation updates the cache >>>> + testValue = (GenericValue) testValue.clone(); >>>> + testValue.put("description", "New Testing Type #3"); >>>> + testValue.store(); >>>> + testValue = delegator.findOne("TestingType", true, >>>> "testingTypeId", "TEST-3"); >>>> + assertEquals("Retrieved from cache value has the correct >>>> description", "New Testing Type #3", >>>> testValue.getString("description")); + // Test entity value remove >>>> operation updates the cache >>>> + testValue = (GenericValue) testValue.clone(); >>>> + testValue.remove(); >>>> + testValue = delegator.findOne("TestingType", true, >>>> "testingTypeId", "TEST-3"); >>>> + assertEquals("Retrieved from cache value is null", null, >>>> testValue); >>>> // Test entity condition cache >>>> EntityCondition testCondition = >>>> EntityCondition.makeCondition("description", EntityOperator.EQUALS, >>>> "Testing Type >>>> #2"); List<GenericValue> testList = >>>> delegator.findList("TestingType", testCondition, null, null, null, true); >>>> @@ -165,7 +175,6 @@ public class EntityTestSuite extends Ent >>>> // Test immutable >>>> try { >>>> testValue.put("description", "New Testing Type #2"); >>>> - testValue.store(); >>>> fail("Modified an immutable GenericValue"); >>>> } catch (IllegalStateException e) { >>>> } >>>> @@ -174,13 +183,24 @@ public class EntityTestSuite extends Ent >>>> fail("Modified an immutable GenericValue"); >>>> } catch (UnsupportedOperationException e) { >>>> } >>>> - /* Commenting this out for now because the tests fail due to >>>> flaws in the EntityListCache implementation. >>>> + // Test entity value create operation updates the cache >>>> testValue = (GenericValue) testValue.clone(); >>>> + testValue.put("testingTypeId", "TEST-9"); >>>> + testValue.create(); >>>> + testList = delegator.findList("TestingType", testCondition, null, >>>> null, null, true); >>>> + assertEquals("Delegator findList returned two values", 2, >>>> testList.size()); >>>> + // Test entity value update operation updates the cache >>>> testValue.put("description", "New Testing Type #2"); >>>> testValue.store(); >>>> testList = delegator.findList("TestingType", testCondition, null, >>>> null, null, true); >>>> + assertEquals("Delegator findList returned one value", 1, >>>> testList.size()); >>>> + // Test entity value remove operation updates the cache >>>> + testValue = testList.get(0); >>>> + testValue = (GenericValue) testValue.clone(); >>>> + testValue.remove(); >>>> + testList = delegator.findList("TestingType", testCondition, null, >>>> null, null, true); >>>> assertEquals("Delegator findList returned empty list", 0, >>>> testList.size()); >>>> - */ >>>> + // TODO: Test view entities. >>>> } >>>> >>>> /*