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

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

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

Adrian Crum-3
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 [hidden email]:

> 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 | Threaded
Open this post in threaded view
|

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

Jacques Le Roux
Administrator
Indeed, done at r1552120

Jacques

On Wednesday, December 18, 2013 9:33 PM [hidden email] [hidden email]

> 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 [hidden email]:
>
>> 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 | Threaded
Open this post in threaded view
|

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

Jacques Le Roux
Administrator
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 [hidden email]

> Indeed, done at r1552120
>
> Jacques
>
> On Wednesday, December 18, 2013 9:33 PM [hidden email] [hidden email]
>> 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 [hidden email]:
>>
>>> 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 | Threaded
Open this post in threaded view
|

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

Adrian Crum-3
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 [hidden email]
>> Indeed, done at r1552120
>>
>> Jacques
>>
>> On Wednesday, December 18, 2013 9:33 PM [hidden email] [hidden email]
>>> 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 [hidden email]:
>>>
>>>> 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 | Threaded
Open this post in threaded view
|

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

Jacques Le Roux
Administrator
OK, then I will add one to my last change.
This shows again that exceptions are a kind of goto :/

Jacques

On Thursday, December 19, 2013 12:24 AM Adrian Crum [hidden email]

> 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 [hidden email]
>>> Indeed, done at r1552120
>>>
>>> Jacques
>>>
>>> On Wednesday, December 18, 2013 9:33 PM [hidden email] [hidden email]
>>>> 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 [hidden email]:
>>>>
>>>>> 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);
>>>>>       }