if-regexp conditions in Minilang and Screens not thread safe
------------------------------------------------------------

                 Key: OFBIZ-4107
                 URL: https://issues.apache.org/jira/browse/OFBIZ-4107
             Project: OFBiz
          Issue Type: Bug
          Components: framework
    Affects Versions: SVN trunk
            Reporter: Martin Kreidenweis


The Perl5Matcher Perl5Compiler are not thread safe, as mentioned in their 
documentation: 
http://jakarta.apache.org/oro/api/org/apache/oro/text/regex/Perl5Compiler.html
A separate instance should be used per thread. 

The concrete issue occurred in our system in the createCommContentDataResource 
service. The service tries to save emails to the database after they have been 
sent. It failed because of the described issue. This caused the whole email 
service (sendMailFromScreen) to be rescheduled. So customers got emails twice. 

The Perl5Matcher and Perl5Compiler instances are assigned to static fields in 
the org.ofbiz.minilang.method.ifops.IfRegexp class. So every thread will use 
the same instance. No synchronization is done currently. Changing the fields to 
be non-static will not work either, as SimpleMethods are cached. So all calls 
to the same simple method use the same IfRegexp instance. 

We fixed the problem by moving the instantiation of the Perl5Matcher and 
Perl5Compiler to the exec() method in IfRegexp. 

Other classes are most likely affected, too: 
org.ofbiz.entity.condition.EntityComparisonOperator, 
org.ofbiz.minilang.method.conditional.RegexpCondition, 
org.ofbiz.minilang.operation.Regexp, 
org.ofbiz.widget.menu.ModelMenuCondition$IfRegexp, 
org.ofbiz.widget.screen.ModelScreenCondition$IfRegexp, 
org.ofbiz.widget.tree.ModelTreeCondition$IfRegexp

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to