|
|
|
|
Re: Yikes! ConcurrentModificationException [message #384229 is a reply to message #384227] |
Thu, 04 December 2008 15:12 |
Tom Eugelink Messages: 825 Registered: July 2009 |
Senior Member |
|
|
Zooming in on Buyorder... The error is caused by this line:
public void setReindersRelation(nl.reinders.bm.Relation value)
{
if (value == iReindersRelation) return; // optimalisation and prevent looping
nl.reinders.bm.Relation lValue = iReindersRelation;
if (log4j.isDebugEnabled()) log4j.debug("setReindersRelation: " + lValue + " -> " + value);
fireVetoableChange(REINDERSRELATION_PROPERTY_ID, lValue, value);
if (lValue != null) lValue.removeBuyordersWhereIAmReindersRelation( (nl.reinders.bm.Buyorder)this );
iReindersRelation = value;
try {
if (value != null) value.addBuyordersWhereIAmReindersRelation( (nl.reinders.bm.Buyorder)this ); // <----------------------
} catch (RuntimeException e) { iReindersRelation = lValue; throw e; } // restore upon exception
firePropertyChange(REINDERSRELATION_PROPERTY_ID, lValue, value);
}
So, if a buyorder is created, it searches for a specific relation as a default value, sets it and because of the 1-N, that buyorder is also added to the relation's collection.
Zooming in again on Relation:
public void addBuyordersWhereIAmReindersRelation(nl.reinders.bm.Buyorder value)
{
if (value != null && !iBuyordersWhereIAmReindersRelation.contains(value))
{
java.util.List<nl.reinders.bm.Buyorder> lValue = new java.util.ArrayList<nl.reinders.bm.Buyorder>();
lValue.addAll(iBuyordersWhereIAmReindersRelation);
lValue.add(value);
fireVetoableChange(BUYORDERSWHEREIAMREINDERSRELATION_PROPERT Y_ID, java.util.Collections.unmodifiableList(iBuyordersWhereIAmRei ndersRelation), java.util.Collections.unmodifiableList(lValue));
boolean lWasAdded = iBuyordersWhereIAmReindersRelation.add(value); // <----------------------
lValue.remove(value);
firePropertyChange(BUYORDERSWHEREIAMREINDERSRELATION_PROPERT Y_ID, java.util.Collections.unmodifiableList(lValue), java.util.Collections.unmodifiableList(iBuyordersWhereIAmRei ndersRelation));
try {
value.setReindersRelation( (nl.reinders.bm.Relation)this);
} catch (RuntimeException e) { if (lWasAdded) {iBuyordersWhereIAmReindersRelation.remove(value);} throw e; } // restore upon exception
}
}
If the add is commented out, the error does not occur.
For the CME to occur, it must be processing the iBuyordersWhereIAmReindersRelation. In what way will processing the iBuyordersWhereIAmReindersRelation create a new Buyorder instance?
|
|
|
|
Powered by
FUDForum. Page generated in 0.04417 seconds