Return-Path: Delivered-To: apmail-jackrabbit-users-archive@locus.apache.org Received: (qmail 87771 invoked from network); 10 Oct 2008 21:06:31 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 10 Oct 2008 21:06:31 -0000 Received: (qmail 197 invoked by uid 500); 10 Oct 2008 21:06:30 -0000 Delivered-To: apmail-jackrabbit-users-archive@jackrabbit.apache.org Received: (qmail 99616 invoked by uid 500); 10 Oct 2008 21:06:29 -0000 Mailing-List: contact users-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: users@jackrabbit.apache.org Delivered-To: mailing list users@jackrabbit.apache.org Received: (qmail 99605 invoked by uid 99); 10 Oct 2008 21:06:29 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 10 Oct 2008 14:06:29 -0700 X-ASF-Spam-Status: No, hits=2.0 required=10.0 tests=HTML_MESSAGE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: local policy) Received: from [193.173.25.11] (HELO boba.gx.nl) (193.173.25.11) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 10 Oct 2008 21:05:24 +0000 Received: from darth-malak.gx.local (vpn-dmz.gx.nl [192.168.16.2]) by boba.gx.nl (8.13.1/8.13.1) with ESMTP id m9AL5wZn006880 for ; Fri, 10 Oct 2008 23:05:58 +0200 Received: from darth-malak.gx.local ([172.16.3.3]) by darth-malak.gx.local ([172.16.3.3]) with mapi; Fri, 10 Oct 2008 23:05:57 +0200 From: Bram de Kruijff To: "users@jackrabbit.apache.org" Date: Fri, 10 Oct 2008 23:05:56 +0200 Subject: Removing a corrupt reference value? Thread-Topic: Removing a corrupt reference value? Thread-Index: AckrG/ziNQuQ2s0MRnmm3jLgJko5kQ== Message-ID: <7A5837CEF4D4834E97721F3BCC46D7F718865C0D5E@darth-malak.gx.local> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: multipart/alternative; boundary="_000_7A5837CEF4D4834E97721F3BCC46D7F718865C0D5Edarthmalakgxl_" MIME-Version: 1.0 X-Virus-Scanned: by amavisd-new X-Virus-Checked: Checked by ClamAV on apache.org --_000_7A5837CEF4D4834E97721F3BCC46D7F718865C0D5Edarthmalakgxl_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable 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 r= eproduce 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 referen= ce, check the uuids that no longer exist, exclude them and reassign the san= itized value array (code below). This approach seems to works until I hit s= ave 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 t= o delete them. Any thoughts/tips/workaround? Thanks, Bram Stacktrace: javax.jcr.ReferentialIntegrityException: Target node 7ad67c91-fb52-481d-a3b= =3D 3-f3708a390228 of REFERENCE property does not exist at org.apache.jackrabbi= t.core.state.SharedItemStateManager.checkReferential=3D Integrity(SharedItemStateManager.java:1497) at org.apache.jackrabbit.core.state.SharedItemStateManager$Update.begin(Sha= =3D redItemStateManager.java:594) at org.apache.jackrabbit.core.state.SharedItemStateManager.beginUpdate(Shar= =3D edItemStateManager.java:904) at org.apache.jackrabbit.core.state.SharedItemStateManager.update(SharedIte= =3D mStateManager.java:934) at org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemS= =3D tateManager.java:326) at org.apache.jackrabbit.core.state.XAItemStateManager.update(XAItemStateMa= =3D nager.java:313) at org.apache.jackrabbit.core.state.LocalItemStateManager.update(LocalItemS= =3D tateManager.java:302) at org.apache.jackrabbit.core.state.SessionItemStateManager.update(SessionI= =3D 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 =3D3D p.getValues(); List corruptedValues =3D3D new ArrayList(); 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 newValues =3D3D new ArrayList(); for (Value v : values) { if (!corruptedValues.contains(v)) { newValues.add(v); } } Value[] result =3D3D 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: Bram.deKruijff@gxwebmanager.com www.gxwebmanager.com --_000_7A5837CEF4D4834E97721F3BCC46D7F718865C0D5Edarthmalakgxl_--