Hi list,


Does anyone know how to (force) remove a reference property value to a node 
that no longer exists? I am using JackRabbit 1.3.3. I do not know how to 
reproduce it or how I got there in the first place. Right now I just need to 
fix it.



My idea was simple. Find any (in my case multiple) property of type reference, 
check the uuids that no longer exist, exclude them and reassign the sanitized 
value array (code below). This approach seems to works until I hit save where I 
get a ReferentialIntegrityException on the very UUID that I am trying to 
remove. It seems JR checks the references even when I just want to delete them.



Any thoughts/tips/workaround?



Thanks,

Bram





Stacktrace:



javax.jcr.ReferentialIntegrityException: Target node 7ad67c91-fb52-481d-a3b=

3-f3708a390228 of REFERENCE property does not exist at 
org.apache.jackrabbit.core.state.SharedItemStateManager.checkReferential=

Integrity(SharedItemStateManager.java:1497)

at org.apache.jackrabbit.core.state.SharedItemStateManager$Update.begin(Sha=

redItemStateManager.java:594)

at org.apache.jackrabbit.core.state.SharedItemStateManager.beginUpdate(Shar=

edItemStateManager.java:904)

at org.apache.jackrabbit.core.state.SharedItemStateManager.update(SharedIte=

mStateManager.java:934)

at org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemS=

tateManager.java:326)

at org.apache.jackrabbit.core.state.XAItemStateManager.update(XAItemStateMa=

nager.java:313)

at org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemS=

tateManager.java:302)

at org.apache.jackrabbit.core.state.SessionItemStateManager.update(SessionI=

temStateManager.java:306)

at org.apache.jackrabbit.core.ItemImpl.save(ItemImpl.java:1400)

at org.apache.jackrabbit.core.SessionImpl.save(SessionImpl.java:849)





Snippet:



    // Check for corrupted references

    Value[] values =3D p.getValues();

    List<Value> corruptedValues =3D new ArrayList<Value>();

    for (Value v : values) {

        try {

            session.getNodeByUUID(v.getString());

        } catch (ItemNotFoundException e) {

            // Yep, we got one

            corruptedValues.add(v);

            LOG.log(Level.WARNING, "Corrupted reference found for node "

                    + n.getUUID().toString() + " property " + p.getName()

                    + " and value " + v.getString());

        }

    }

    if (corruptedValues.size() > 0) {



        // Exclude corrupted references

        List<Value> newValues =3D new ArrayList<Value>();

        for (Value v : values) {

            if (!corruptedValues.contains(v)) {

                newValues.add(v);

            }

        }

        Value[] result =3D newValues.toArray(new Value[newValues.size()]);



        // Re-Assign and save

        p.setValue(result);

    }




--
Bram de Kruijff
Product Architect

GX
open for business

t: +31(0)24 - 388 82 61
f: +31(0)24 - 388 86 21
e: [EMAIL PROTECTED]<mailto:[EMAIL PROTECTED]>

www.gxwebmanager.com<http://www.gxwebmanager.com>

Reply via email to