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