Author: adrianc Date: Sat May 25 10:30:12 2013 New Revision: 1486310 URL: http://svn.apache.org/r1486310 Log: Backported entity cache fixes from the trunk. This commit breaks the rule of no API changes in a release, but I am making an exception here because the methods that were removed should NEVER be used because they GUARANTEE data corruption.
Modified: ofbiz/branches/release12.04/ (props changed) ofbiz/branches/release12.04/framework/entity/entitydef/entitymodel_test.xml ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/Delegator.java ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/GenericDelegator.java ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/GenericValue.java ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/AbstractEntityConditionCache.java ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/Cache.java ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/EntityCache.java ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/EntityListCache.java ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/eca/EntityEcaHandler.java ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java Propchange: ofbiz/branches/release12.04/ ------------------------------------------------------------------------------ Merged /ofbiz/trunk:r1471284,1471739,1476296,1484279 Modified: ofbiz/branches/release12.04/framework/entity/entitydef/entitymodel_test.xml URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/entity/entitydef/entitymodel_test.xml?rev=1486310&r1=1486309&r2=1486310&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/entity/entitydef/entitymodel_test.xml (original) +++ ofbiz/branches/release12.04/framework/entity/entitydef/entitymodel_test.xml Sat May 25 10:30:12 2013 @@ -71,6 +71,27 @@ under the License. <prim-key field="testingTypeId"/> </entity> <!-- ========================================================= + Used for testing views with pks. + This simulates the Party->PartyGroup and Party->Person entity relationships. + ========================================================= --> + <entity entity-name="TestingSubtype" package-name="org.ofbiz.entity.test" title="Testing Subtype Entity"> + <field name="testingTypeId" type="id-ne" /> + <field name="subtypeDescription" type="description" /> + <prim-key field="testingTypeId" /> + </entity> + <!-- ========================================================= + Used for testing views with pks + ========================================================= --> + <view-entity entity-name="TestingViewPks" package-name="org.ofbiz.entity.test" title="Testing And TestingSubtype View"> + <member-entity entity-alias="TST" entity-name="TestingType" /> + <member-entity entity-alias="TSTSUB" entity-name="TestingSubtype" /> + <alias-all entity-alias="TST" /> + <alias-all entity-alias="TSTSUB" /> + <view-link entity-alias="TST" rel-entity-alias="TSTSUB"> + <key-map field-name="testingTypeId" /> + </view-link> + </view-entity> + <!-- ========================================================= An entity for testing the BLOB data type ========================================================== --> <entity entity-name="TestBlob" Modified: ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/Delegator.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/Delegator.java?rev=1486310&r1=1486309&r2=1486310&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/Delegator.java (original) +++ ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/Delegator.java Sat May 25 10:30:12 2013 @@ -157,8 +157,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; @@ -181,7 +182,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; @@ -220,7 +222,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; @@ -864,7 +867,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; @@ -913,7 +917,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; @@ -927,8 +932,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 @@ -959,8 +965,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; @@ -997,8 +1004,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; @@ -1018,8 +1026,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; @@ -1049,8 +1058,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; @@ -1070,8 +1080,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; @@ -1113,7 +1124,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; @@ -1150,7 +1162,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; @@ -1170,7 +1183,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 @@ -1202,8 +1216,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/branches/release12.04/framework/entity/src/org/ofbiz/entity/GenericDelegator.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/GenericDelegator.java?rev=1486310&r1=1486309&r2=1486310&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/GenericDelegator.java (original) +++ ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/GenericDelegator.java Sat May 25 10:30:12 2013 @@ -996,12 +996,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 @@ -1014,6 +1008,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) { @@ -1065,11 +1064,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 @@ -1085,6 +1079,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) { @@ -1330,12 +1329,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); @@ -1351,6 +1344,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)); @@ -2176,11 +2173,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/branches/release12.04/framework/entity/src/org/ofbiz/entity/GenericValue.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/GenericValue.java?rev=1486310&r1=1486309&r2=1486310&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/GenericValue.java (original) +++ ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/GenericValue.java Sat May 25 10:30:12 2013 @@ -56,12 +56,6 @@ public class GenericValue extends Generi } }; - /** Map to cache various related entity collections */ - public transient Map<String, List<GenericValue>> relatedCache = null; - - /** Map to cache various related cardinality one entity collections */ - public transient Map<String, GenericValue> relatedOneCache = null; - /** A Map containing the original field values from the database. */ private Map<String, Object> originalDbValues = null; @@ -105,12 +99,7 @@ public class GenericValue extends Generi @Override public void reset() { - // from GenericEntity super.reset(); - - // from GenericValue - this.relatedCache = null; - this.relatedOneCache = null; this.originalDbValues = null; } @@ -245,59 +234,6 @@ public class GenericValue extends Generi return this.getRelatedCache(relationName, null, orderBy); } - /** Get the named Related Entity for the GenericValue from the persistent - * store, looking first in a cache associated with this entity which is - * destroyed with this ValueObject when no longer used. - *@param relationName String containing the relation name which is the combination of relation.title and relation.rel-entity-name as specified in the entity XML definition file - *@return List of GenericValue instances as specified in the relation definition - */ - public List<GenericValue> getRelatedEmbeddedCache(String relationName) throws GenericEntityException { - if (relatedCache == null) relatedCache = FastMap.newInstance(); - List<GenericValue> col = relatedCache.get(relationName); - - if (col == null) { - col = getRelated(relationName); - relatedCache.put(relationName, col); - } - return col; - } - - /** Get the named Related Entity for the GenericValue from the persistent - * store, looking first in a cache associated with this entity which is - * destroyed with this ValueObject when no longer used. - *@param relationName String containing the relation name which is the combination of relation.title and relation.rel-entity-name as specified in the entity XML definition file - * @param byAndFields the fields that must equal in order to keep; may be null - * @param orderBy The fields of the named entity to order the query by; may be null; - * optionally add a " ASC" for ascending or " DESC" for descending - *@return List of GenericValue instances as specified in the relation definition - */ - public List<GenericValue> getRelatedEmbeddedCache(String relationName, Map<String, ? extends Object> byAndFields, List<String> orderBy) throws GenericEntityException { - List<GenericValue> col = getRelatedEmbeddedCache(relationName); - - if (byAndFields != null) col = EntityUtil.filterByAnd(col, byAndFields); - if (UtilValidate.isNotEmpty(orderBy)) col = EntityUtil.orderBy(col, orderBy); - return col; - } - - public void removeRelatedEmbeddedCache(String relationName) { - if (relatedCache == null) return; - relatedCache.remove(relationName); - } - - public void storeRelatedEmbeddedCache(String relationName, List<GenericValue> col) { - if (relatedCache == null) relatedCache = FastMap.newInstance(); - relatedCache.put(relationName, col); - } - - public void storeRelatedEmbeddedCache(String relationName, GenericValue value) { - if (relatedCache == null) relatedCache = FastMap.newInstance(); - relatedCache.put(relationName, UtilMisc.toList(value)); - } - - public void clearEmbeddedCache() { - relatedCache.clear(); - } - /** Get the named Related Entity for the GenericValue from the persistent store *@param relationName String containing the relation name which is the combination of relation.title and relation.rel-entity-name as specified in the entity XML definition file *@return List of GenericValue instances as specified in the relation definition @@ -315,23 +251,6 @@ public class GenericValue extends Generi return this.getDelegator().getRelatedOneCache(relationName, this); } - /** Get the named Related Entity for the GenericValue from the persistent - * store, looking first in a cache associated with this entity which is - * destroyed with this ValueObject when no longer used. - *@param relationName String containing the relation name which is the combination of relation.title and relation.rel-entity-name as specified in the entity XML definition file - *@return List of GenericValue instances as specified in the relation definition - */ - public GenericValue getRelatedOneEmbeddedCache(String relationName) throws GenericEntityException { - if (relatedOneCache == null) relatedOneCache = FastMap.newInstance(); - GenericValue value = relatedOneCache.get(relationName); - - if (value == null) { - value = getRelatedOne(relationName); - if (value != null) relatedOneCache.put(relationName, value); - } - return value; - } - /** Get the named Related Entity for the GenericValue from the persistent store and filter it *@param relationName String containing the relation name which is the combination of relation.title and relation.rel-entity-name as specified in the entity XML definition file *@param fields the fields that must equal in order to keep @@ -351,17 +270,6 @@ public class GenericValue extends Generi return EntityUtil.filterByAnd(this.getDelegator().getRelatedCache(relationName, this), fields); } - /** Get the named Related Entity for the GenericValue from the persistent - * store and filter it, looking first in a cache associated with this entity which is - * destroyed with this ValueObject when no longer used. - *@param relationName String containing the relation name which is the combination of relation.title and relation.rel-entity-name as specified in the entity XML definition file - *@param fields the fields that must equal in order to keep - *@return List of GenericValue instances as specified in the relation definition - */ - public List<GenericValue> getRelatedByAndEmbeddedCache(String relationName, Map<String, ? extends Object> fields) throws GenericEntityException { - return EntityUtil.filterByAnd(getRelatedEmbeddedCache(relationName), fields); - } - /** Get the named Related Entity for the GenericValue from the persistent store and order it *@param relationName String containing the relation name which is the combination of relation.title and relation.rel-entity-name as specified in the entity XML definition file *@param orderBy the order that they should be returned @@ -381,17 +289,6 @@ public class GenericValue extends Generi return EntityUtil.orderBy(this.getDelegator().getRelatedCache(relationName, this), orderBy); } - /** Get the named Related Entity for the GenericValue from the persistent - * store and order it, looking first in a cache associated with this entity which is - * destroyed with this ValueObject when no longer used. - *@param relationName String containing the relation name which is the combination of relation.title and relation.rel-entity-name as specified in the entity XML definition file - *@param orderBy the order that they should be returned - *@return List of GenericValue instances as specified in the relation definition - */ - public List<GenericValue> getRelatedOrderByEmbeddedCache(String relationName, List<String> orderBy) throws GenericEntityException { - return EntityUtil.orderBy(getRelatedEmbeddedCache(relationName), orderBy); - } - /** Remove the named Related Entity for the GenericValue from the persistent store *@param relationName String containing the relation name which is the combination of relation.title and relation.rel-entity-name as specified in the entity XML definition file */ Modified: ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/AbstractEntityConditionCache.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/AbstractEntityConditionCache.java?rev=1486310&r1=1486309&r2=1486310&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/AbstractEntityConditionCache.java (original) +++ ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/AbstractEntityConditionCache.java Sat May 25 10:30:12 2013 @@ -61,6 +61,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/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/Cache.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/Cache.java?rev=1486310&r1=1486309&r2=1486310&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/Cache.java (original) +++ ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/Cache.java Sat May 25 10:30:12 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/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/EntityCache.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/EntityCache.java?rev=1486310&r1=1486309&r2=1486310&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/EntityCache.java (original) +++ ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/EntityCache.java Sat May 25 10:30:12 2013 @@ -18,11 +18,14 @@ *******************************************************************************/ package org.ofbiz.entity.cache; +import java.util.Iterator; + import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.cache.UtilCache; import org.ofbiz.entity.GenericPK; import org.ofbiz.entity.GenericValue; import org.ofbiz.entity.condition.EntityCondition; +import org.ofbiz.entity.model.ModelEntity; public class EntityCache extends AbstractCache<GenericPK, GenericValue> { public static final String module = EntityCache.class.getName(); @@ -77,6 +80,14 @@ public class EntityCache extends Abstrac if (Debug.verboseOn()) Debug.logVerbose("Removing from EntityCache with PK [" + pk + "], will remove from this cache: " + (entityCache == null ? "[No cache found to remove from]" : entityCache.getName()), module); if (entityCache == null) return null; GenericValue retVal = entityCache.remove(pk); + ModelEntity model = pk.getModelEntity(); + if (model != null) { + Iterator<String> it = model.getViewConvertorsIterator(); + while (it.hasNext()) { + String targetEntityName = it.next(); + UtilCache.clearCache(getCacheName(targetEntityName)); + } + } if (Debug.verboseOn()) Debug.logVerbose("Removing from EntityCache with PK [" + pk + "], found this in the cache: " + retVal, module); return retVal; } Modified: ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/EntityListCache.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/EntityListCache.java?rev=1486310&r1=1486309&r2=1486310&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/EntityListCache.java (original) +++ ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/cache/EntityListCache.java Sat May 25 10:30:12 2013 @@ -23,8 +23,10 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentMap; +import org.ofbiz.base.util.Debug; import org.ofbiz.entity.GenericValue; import org.ofbiz.entity.condition.EntityCondition; +import org.ofbiz.entity.model.ModelEntity; import org.ofbiz.entity.util.EntityUtil; public class EntityListCache extends AbstractEntityConditionCache<Object, List<GenericValue>> { @@ -65,7 +67,16 @@ public class EntityListCache extends Abs } public List<GenericValue> put(String entityName, EntityCondition condition, List<String> orderBy, List<GenericValue> entities) { - return super.put(entityName, getFrozenConditionKey(condition), getOrderByKey(orderBy), entities); + ModelEntity entity = this.getDelegator().getModelEntity(entityName); + if (entity.getNeverCache()) { + Debug.logWarning("Tried to put a value of the " + entityName + " entity in the cache but this entity has never-cache set to true, not caching.", module); + return null; + } + for (GenericValue memberValue : entities) { + memberValue.setImmutable(); + } + Map<Object, List<GenericValue>> conditionCache = getOrCreateConditionCache(entityName, getFrozenConditionKey(condition)); + return conditionCache.put(getOrderByKey(orderBy), entities); } public List<GenericValue> remove(String entityName, EntityCondition condition, List<String> orderBy) { Modified: ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/eca/EntityEcaHandler.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/eca/EntityEcaHandler.java?rev=1486310&r1=1486309&r2=1486310&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/eca/EntityEcaHandler.java (original) +++ ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/eca/EntityEcaHandler.java Sat May 25 10:30:12 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/branches/release12.04/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java?rev=1486310&r1=1486309&r2=1486310&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java (original) +++ ofbiz/branches/release12.04/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java Sat May 25 10:30:12 2013 @@ -143,7 +143,6 @@ public class EntityTestSuite extends Ent } catch (UnsupportedOperationException e) { } // Test entity value update operation updates the cache - /* Requires revision 1471284, 1476296 testValue = (GenericValue) testValue.clone(); testValue.put("description", "New Testing Type #3"); testValue.store(); @@ -188,9 +187,7 @@ public class EntityTestSuite extends Ent testValue.remove(); testList = delegator.findList("TestingType", testCondition, null, null, null, true); assertEquals("Delegator findList returned empty list", 0, testList.size()); - */ // Test view entities in the pk cache - updating an entity should clear pk caches for all view entities containing that entity. - /* Requires revision 1484279 testValue = delegator.create("TestingSubtype", "testingTypeId", "TEST-9", "subtypeDescription", "Testing Subtype #9"); assertNotNull("TestingSubtype created", testValue); // Confirm member entity appears in the view @@ -204,7 +201,6 @@ public class EntityTestSuite extends Ent // Check if cached view contains the modification testValue = delegator.findOne("TestingViewPks", true, "testingTypeId", "TEST-9"); assertEquals("View retrieved from cache has the correct member description", "New Testing Subtype #9", testValue.getString("subtypeDescription")); - */ } /*