svn commit: r1552073 - /ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r1552073 - /ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java

jleroux@apache.org
Author: jleroux
Date: Wed Dec 18 19:46:50 2013
New Revision: 1552073

URL: http://svn.apache.org/r1552073
Log:
Fixes <<FIXME: Replace DCL code with AtomicReference>>

Modified:
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java

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=1552073&r1=1552072&r2=1552073&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java (original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java Wed Dec 18 19:46:50 2013
@@ -32,6 +32,7 @@ import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Future;
 import java.util.concurrent.LinkedBlockingDeque;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 
 import javax.xml.parsers.ParserConfigurationException;
@@ -105,7 +106,7 @@ public class GenericDelegator implements
     protected DistributedCacheClear distributedCacheClear = null;
     protected boolean warnNoEcaHandler = false;
     protected EntityEcaHandler<?> entityEcaHandler = null;
-    protected SequenceUtil sequencer = null;
+    protected final AtomicReference<SequenceUtil> AtomicRefSequencer = new AtomicReference<SequenceUtil>(null);
     protected EntityCrypto crypto = null;
 
     /** A ThreadLocal variable to allow other methods to specify a user identifier (usually the userLoginId, though technically the Entity Engine doesn't know anything about the UserLogin entity) */
@@ -791,7 +792,7 @@ public class GenericDelegator implements
                     }
 
                     // found an existing value... was probably a duplicate key, so clean things up and try again
-                    this.sequencer.forceBankRefresh(value.getEntityName(), 1);
+                    this.AtomicRefSequencer.get().forceBankRefresh(value.getEntityName(), 1);
 
                     value.setNextSeqId();
                     value = helper.create(value);
@@ -2389,13 +2390,16 @@ public class GenericDelegator implements
                 beganTransaction = TransactionUtil.begin();
             }
 
-            // FIXME: Replace DCL code with AtomicReference
+            SequenceUtil sequencer = this.AtomicRefSequencer.get();
             if (sequencer == null) {
-                synchronized (this) {
-                    if (sequencer == null) {
-                        ModelEntity seqEntity = this.getModelEntity("SequenceValueItem");
-                        sequencer = new SequenceUtil(this, this.getEntityHelperInfo("SequenceValueItem"), seqEntity, "seqName", "seqId");
+                try {
+                    ModelEntity seqEntity = this.getModelEntity("SequenceValueItem");
+                    sequencer = new SequenceUtil(this, this.getEntityHelperInfo("SequenceValueItem"), seqEntity, "seqName", "seqId");
+                    if (!AtomicRefSequencer.compareAndSet(null, sequencer)) {
+                        sequencer = this.AtomicRefSequencer.get();
                     }
+                } catch (Exception e) {
+                    throw new IllegalStateException("Exception thrown while creating AtomicReference<SequenceUtil>: " + e);
                 }
             }
 
@@ -2421,14 +2425,14 @@ public class GenericDelegator implements
      * @see org.ofbiz.entity.Delegator#setSequencer(org.ofbiz.entity.util.SequenceUtil)
      */
     public void setSequencer(SequenceUtil sequencer) {
-        this.sequencer = sequencer;
+        this.AtomicRefSequencer.set(sequencer);
     }
 
     /* (non-Javadoc)
      * @see org.ofbiz.entity.Delegator#refreshSequencer()
      */
     public void refreshSequencer() {
-        this.sequencer = null;
+        this.AtomicRefSequencer.set(null);
     }