In the past, some committers have complained that the source of the exception is obscured by calling code (which may quietly swallow it), so the preferred method is to log the exception before throwing it.

Adrian Crum
Sandglass Software
www.sandglass-software.com

On 12/18/2013 6:16 PM, Jacques Le Roux wrote:
BTW Adrian,

Do we really need to have a pattern like
     Debug.logError(e, "Exception thrown while creating ConnectionFactoryInterface 
instance: ", module);
     throw new IllegalStateException("Error loading ConnectionFactoryInterface 
class: " + e);

     throw new IllegalStateException("Error loading ConnectionFactoryInterface 
class: " + e);
would not be enough?

Jacques

On Wednesday, December 18, 2013 10:57 PM Jacques Le Roux 
jacques.le.r...@les7arts.com
Indeed, done at r1552120

Jacques

On Wednesday, December 18, 2013 9:33 PM adrian.c...@sandglass-software.com 
adrian.c...@sandglass-software.com
Jacques,

Thank you for working on this.

It might be best to have the AtomicReference update outside the
try-catch block. So...

1. Try to create a new sequencer.
2. If successful, update the AtomicReference.

The end result will be the same, but (from my perspective) it will be
easier to read and understand.

-Adrian


Quoting jler...@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);
      }

Reply via email to