Hi,

We think that the following modification should work:

    /**
     * Notify the listeners that a node type <code>ntName</code> has
been registered.
     */
    private void notifyRegistered(QName ntName) {
        // copy listeners to array to avoid
ConcurrentModificationException
        NodeTypeRegistryListener[] la;
        synchronized (listeners) {
            la = (NodeTypeRegistryListener[])
listeners.values().toArray(new
NodeTypeRegistryListener[listeners.size()]);
                }

        for (int i = 0; i < la.length; i++) {
            if (la[i] != null) {
                la[i].nodeTypeRegistered(ntName);
            }
        }
    }

Feedback much appreciated!


Martijn Hendriks
<GX> creative online development B.V.
 
t: 024 - 3888 261
f: 024 - 3888 621
e: [EMAIL PROTECTED]
 
Wijchenseweg 111
6538 SW Nijmegen
http://www.gx.nl/  

> -----Original Message-----
> From: Martijn Hendriks [mailto:[EMAIL PROTECTED]
> Sent: Friday, January 19, 2007 11:05 AM
> To: [email protected]
> Subject: ConcurrentModificationException during registration of 
> nodetypes
> 
> Hi,
> 
> During the registration of a set of nodetypes I encountered this
> exception:
> 
> java.util.ConcurrentModificationException
>         at
> org.apache.commons.collections.map.AbstractReferenceMap$Refere
> nceEntrySe
> tIterator.checkMod(AbstractReferenceMap.java:761)
>         at
> org.apache.commons.collections.map.AbstractReferenceMap$Refere
> nceEntrySe
> tIterator.hasNext(AbstractReferenceMap.java:735)
>         at
> org.apache.jackrabbit.core.nodetype.NodeTypeRegistry.notifyReg
> istered(No
> deTypeRegistry.java:1750)
>         at
> org.apache.jackrabbit.core.nodetype.NodeTypeRegistry.registerN
> odeTypes(N
> odeTypeRegistry.java:223)
> 
> It seems that the copying of the listeners triggered this exception:
> 
>     private void notifyRegistered(QName ntName) {
>         // copy listeners to array to avoid 
> ConcurrentModificationException
>         NodeTypeRegistryListener[] la =
>                 new NodeTypeRegistryListener[listeners.size()];
>         Iterator iter = listeners.values().iterator();
>         int cnt = 0;
> 1750:   while (iter.hasNext()) {
>             la[cnt++] = (NodeTypeRegistryListener) iter.next();
>         }
>         for (int i = 0; i < la.length; i++) {
>             if (la[i] != null) {
>                 la[i].nodeTypeRegistered(ntName);
>             }
>         }
>     }
> 
> It seems that the methods "notifyReRegistered" and 
> "notifyUnregistered"
> will suffer from the same problem.
> 
> Is this a known issue, and can it be solved?
> 
> Thanks
> 
> Martijn Hendriks
> <GX> creative online development B.V.
>  
> t: 024 - 3888 261
> f: 024 - 3888 621
> e: [EMAIL PROTECTED]
>  
> Wijchenseweg 111
> 6538 SW Nijmegen
> http://www.gx.nl/ 

Martijn Hendriks
<GX> creative online development B.V.
 
t: 024 - 3888 261
f: 024 - 3888 621
e: [EMAIL PROTECTED]
 
Wijchenseweg 111
6538 SW Nijmegen
http://www.gx.nl/ 

Reply via email to