Author: hansbak
Date: Tue Apr 28 04:16:19 2009 New Revision: 769236 URL: http://svn.apache.org/viewvc?rev=769236&view=rev Log: intermittent error seems to be solved with this Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaSetField.java Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaSetField.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaSetField.java?rev=769236&r1=769235&r2=769236&view=diff ============================================================================== --- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaSetField.java (original) +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaSetField.java Tue Apr 28 04:16:19 2009 @@ -36,12 +36,18 @@ public static final String module = ServiceEcaSetField.class.getName(); protected String fieldName = null; + protected String mapName = null; + protected Map<String, Object> map = null; protected String envName = null; protected String value = null; protected String format = null; public ServiceEcaSetField(Element set) { this.fieldName = set.getAttribute("field-name"); + if (UtilValidate.isNotEmpty(this.fieldName) && this.fieldName.indexOf('.') != -1) { + this.mapName = fieldName.substring(0, this.fieldName.indexOf('.')); + this.fieldName = this.fieldName.substring(this.fieldName.indexOf('.') +1); + } this.envName = set.getAttribute("env-name"); this.value = set.getAttribute("value"); this.format = set.getAttribute("format"); @@ -61,34 +67,27 @@ } } // TODO: rewrite using the ContextAccessor.java see hack below to be able to use maps for email notifications - // check if target is a map - String mapName = null; - Map<String, Object> map = null; - if (UtilValidate.isNotEmpty(fieldName) && fieldName.indexOf('.') != -1) { - mapName = fieldName.substring(0, fieldName.indexOf('.')); - fieldName = fieldName.substring(fieldName.indexOf('.') +1); - if (context.containsKey(mapName)) { - map = (Map<String, Object>) context.get(mapName); - } else { - map = FastMap.newInstance(); - } - } - + // check if target is a map and create/get from contaxt + if (UtilValidate.isNotEmpty(this.mapName) && context.containsKey(this.mapName)) { + map = (Map<String, Object>) context.get(mapName); + } else { + map = FastMap.newInstance(); + } // process the context changes String newValue = null; - if (UtilValidate.isNotEmpty(value)) { - newValue = (String) this.format(value, context); - } else if (UtilValidate.isNotEmpty(envName) && context.get(envName) != null) { - newValue = (String) this.format((String) context.get(envName), context); + if (UtilValidate.isNotEmpty(this.value)) { + newValue = (String) this.format(this.value, context); + } else if (UtilValidate.isNotEmpty(envName) && context.get(this.envName) != null) { + newValue = (String) this.format((String) context.get(this.envName), context); } if (newValue != null) { - if (map != null) { - map.put(fieldName, newValue); - context.put(mapName, map); - } else { - context.put(fieldName, newValue); - } + if (UtilValidate.isNotEmpty(this.mapName)) { + this.map.put(this.fieldName, newValue); + context.put(this.mapName, this.map); + } else { + context.put(this.fieldName, newValue); + } } } } |
It looks like there is some non-thread-safe code in this change. The "map" class field is set when the set operation is run and not as part of the XML definition and so would be changed by multiple threads using the same ServiceEcaSetField definition object. The "map" field should be moved inside the "eval" method, preferable to just before where it is populated for the most localized use. -David On Apr 27, 2009, at 10:16 PM, [hidden email] wrote: > Author: hansbak > Date: Tue Apr 28 04:16:19 2009 > New Revision: 769236 > > URL: http://svn.apache.org/viewvc?rev=769236&view=rev > Log: > intermittent error seems to be solved with this > > Modified: > ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ > ServiceEcaSetField.java > > Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ > ServiceEcaSetField.java > URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaSetField.java?rev=769236&r1=769235&r2=769236&view=diff > = > = > = > = > = > = > = > = > ====================================================================== > --- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ > ServiceEcaSetField.java (original) > +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ > ServiceEcaSetField.java Tue Apr 28 04:16:19 2009 > @@ -36,12 +36,18 @@ > public static final String module = > ServiceEcaSetField.class.getName(); > > protected String fieldName = null; > + protected String mapName = null; > + protected Map<String, Object> map = null; > protected String envName = null; > protected String value = null; > protected String format = null; > > public ServiceEcaSetField(Element set) { > this.fieldName = set.getAttribute("field-name"); > + if (UtilValidate.isNotEmpty(this.fieldName) && > this.fieldName.indexOf('.') != -1) { > + this.mapName = fieldName.substring(0, > this.fieldName.indexOf('.')); > + this.fieldName = > this.fieldName.substring(this.fieldName.indexOf('.') +1); > + } > this.envName = set.getAttribute("env-name"); > this.value = set.getAttribute("value"); > this.format = set.getAttribute("format"); > @@ -61,34 +67,27 @@ > } > } > // TODO: rewrite using the ContextAccessor.java see hack > below to be able to use maps for email notifications > - // check if target is a map > - String mapName = null; > - Map<String, Object> map = null; > - if (UtilValidate.isNotEmpty(fieldName) && > fieldName.indexOf('.') != -1) { > - mapName = fieldName.substring(0, fieldName.indexOf('.')); > - fieldName = fieldName.substring(fieldName.indexOf('.') +1); > - if (context.containsKey(mapName)) { > - map = (Map<String, Object>) context.get(mapName); > - } else { > - map = FastMap.newInstance(); > - } > - } > - > + // check if target is a map and create/get from contaxt > + if (UtilValidate.isNotEmpty(this.mapName) && > context.containsKey(this.mapName)) { > + map = (Map<String, Object>) context.get(mapName); > + } else { > + map = FastMap.newInstance(); > + } > // process the context changes > String newValue = null; > - if (UtilValidate.isNotEmpty(value)) { > - newValue = (String) this.format(value, context); > - } else if (UtilValidate.isNotEmpty(envName) && > context.get(envName) != null) { > - newValue = (String) this.format((String) > context.get(envName), context); > + if (UtilValidate.isNotEmpty(this.value)) { > + newValue = (String) this.format(this.value, context); > + } else if (UtilValidate.isNotEmpty(envName) && > context.get(this.envName) != null) { > + newValue = (String) this.format((String) > context.get(this.envName), context); > } > > if (newValue != null) { > - if (map != null) { > - map.put(fieldName, newValue); > - context.put(mapName, map); > - } else { > - context.put(fieldName, newValue); > - } > + if (UtilValidate.isNotEmpty(this.mapName)) { > + this.map.put(this.fieldName, newValue); > + context.put(this.mapName, this.map); > + } else { > + context.put(this.fieldName, newValue); > + } > } > } > } > > |
Free forum by Nabble | Edit this page |