I've found that my latest problem is because when I delete a node from the preview workspace and its clone from the default workspace, these deletes do not trigger a lucene index refresh. All works fine while the app is running, things are indexed fine, I can drop the nodes and reload as many times as I like but but if I stop my application server and restart and then do the deletes then the indexres are out of wack. However, if I stop the server and manually delete the indexes then I do not get these errors. Is there a way that I can programmatically make lucene reindex after the deletes?
SalmasCM wrote: > > Hi: > > I got further but still some very frustrating errors. Now I both > synchronize and lock for each session access. So I: > > 1. use the XML import to load a tree of data under a node which lives > right under root. > 2. I then modify this data by doing setProperty (locking and > synchronizing) > 3. I clone the data to the default workspace. > 4. I exit my app. > 5. I log in with a new session. > 6. I delete the node from both preview and default workspaces. > 7. reimport he data under the same name node > 8. Atempt to invoke a Lucene query and get the following error > > failed to build path of dd740ff8-5108-40f2-9036-b6c769c86bd5: > cafebabe-cafe-babe-cafe-babecafebabe has no child entry for > dd740ff8-5108-40f2-9036-b6c769c86bd5 > javax.jcr.ItemNotFoundException: failed to build path of > dd740ff8-5108-40f2-9036-b6c769c86bd5: cafebabe-cafe-babe-cafe-babecafebabe > has no child entry for dd740ff8-5108-40f2-9036-b6c769c86bd5 > at > org.apache.jackrabbit.core.HierarchyManagerImpl.buildPath(HierarchyManagerImpl.java:289) > at > org.apache.jackrabbit.core.CachingHierarchyManager.buildPath(CachingHierarchyManager.java:195) > at > org.apache.jackrabbit.core.HierarchyManagerImpl.buildPath(HierarchyManagerImpl.java:278) > at > org.apache.jackrabbit.core.CachingHierarchyManager.buildPath(CachingHierarchyManager.java:195) > at > org.apache.jackrabbit.core.HierarchyManagerImpl.getPath(HierarchyManagerImpl.java:393) > at > org.apache.jackrabbit.core.CachingHierarchyManager.getPath(CachingHierarchyManager.java:229) > at org.apache.jackrabbit.core.ItemImpl.getPrimaryPath(ItemImpl.java:213) > at > org.apache.jackrabbit.core.NodeImpl.getPrimaryPath(NodeImpl.java:3240) > at org.apache.jackrabbit.core.ItemImpl.getPath(ItemImpl.java:1273) > at com.ashland.valvoline.ui.util.JCRUtil.getNodePath(JCRUtil.java:2353) > > However, when I do not do any modifications to the data then I do not get > these errors. > > > SalmasCM wrote: >> >> I am not convinced that this is a JackRabbit bug. It could well be but >> it's more likely an issue in my application code. I believe it has to do >> with concurrency and my using 2 sessions simultaneously. I believe that >> something screws up with consurrency before I exit and then when I >> restart my server everything is screwed up. I am going to try limiting >> things to one thread per session by synchronizing on the same object >> whenever I do something in preview and then having a second object that I >> synchronize whenever I do something in the default workspace. I will let >> you know if this solves things. >> However, I do think that it would be nice to have documentation about >> concurrency and how to do things in an application server environment.We >> use BEA Weblogic which spawns a bunch of threads and so its probably more >> challenging using Jackrabbit in this environment. >> >> Thanks so much for getting back to me. I have been struggling with this >> and really need to get it working asap. >> >> Regards >> >> >> Stefan Guggisberg wrote: >>> >>> On Sun, May 3, 2009 at 5:36 AM, SalmasCM <[email protected]> >>> wrote: >>>> >>>> I have been trying for weeks to get things working in my application >>>> and am >>>> not making any progress. >>>> I don't believe my use case is very unusual and I am hoping that you >>>> will be >>>> able to help me. >>>> >>>> 1. I have a lot of legacy data that I load in using the XML import >>>> feature. >>>> Each section is loaded under it's own top level node. The top level >>>> nodes >>>> live directly under root. >>>> 2. I have 2 workspaces , preview and default. Changes and data loads >>>> happen >>>> in preview and are cloned/merged into default. >>>> >>>> Everything works if I bulk load the data with the XML import once but >>>> falls >>>> apart if I load a all the sections into preview and then clone to >>>> default >>>> and then later wish to reload a node with the XML import. >>>> >>>> I am unable to reload since it thinks it's a new node so if I reload >>>> for >>>> example employees then it creates employees[1] which is not what I >>>> want. >>>> >>>> I have then 2 options. >>>> 1. to force it to recognize the top node as the same node as previously >>>> loaded, to do this I would have to indicate the UUID for the top node. >>>> However, I have no idea how to make the UUID in the XML data file the >>>> same >>>> as it would create when reloading? >>>> 2. So I tried to delete the node from both preview and default >>>> workspaces >>>> before loading. I ran into many issues and finally succeeded in >>>> reloading >>>> the data. However, I ran into issues when I modify any data in preview. >>>> >>>> I get >>>> >>>> Item cannot be saved because it has been modified externally: node / >>>> javax.jcr.InvalidItemStateException: Item cannot be saved because it >>>> has >>>> been modified externally: node / >>>> >>>> This is the sequence of events. >>>> >>>> 1. load data using the XML loading under topNodeA in preview workspace >>>> 2. I modify some of the data under topNodeA in preview workspace. >>>> 3. I save the session etc. >>>> 4. I clone the topNodeA and its subtree to the default space. >>>> 4. I stop my application server and restart. >>>> 5. I get a new session into the preview workspace >>>> 6. I try to delete topNodeA in the preview workspace and then I get the >>>> above error. >>> >>> without having seen your code i really can't tell but there might be a >>> problem in your application logic. when you do restart and connect >>> to the repository (assuming there isn't any other session interfering), >>> i can't think of any way how this exception could be triggered. >>> >>> please provide a simple complete test case and your exact >>> configuration/setup and i'll have a look what's going wrong. >>> >>> cheers >>> stefan >>> >>>> >>>> However, I do NOT receive this error when I do the following (do not >>>> get out >>>> of the existing session for that workspace and then subsequently get a >>>> new >>>> one but instead remain in the same session for the delete) >>>> >>>> 1. load data using the XML loading under topNodeA in preview workspace >>>> 2. I modify some of the data under topNodeA in preview workspace. >>>> 3. I save the session etc. >>>> 4. I clone the topNodeA and its subtree to the default space. >>>> 5. I try to delete topNodeA in the preview workspace and then I DO NOT >>>> get >>>> the above error. >>>> >>>> I lock the node while making changes like so: >>>> >>>> /** >>>> * >>>> * @param nodeToSet >>>> * The node in which to set the property. >>>> * @param attribute >>>> * @param value >>>> */ >>>> public static boolean saveAttribute(Node nodeToSet, String >>>> attribute, >>>> Object value) { >>>> boolean success = false; >>>> if ((nodeToSet != null) && (attribute != null) && (value != >>>> null)) { >>>> try { >>>> synchronized (nodeToSet) { >>>> boolean iLockedThis=false; >>>> if (!nodeToSet.isLocked()) { >>>> nodeToSet.addMixin("mix:lockable"); >>>> session.save(); >>>> nodeToSet.lock(true, true); >>>> iLockedThis=true; >>>> } >>>> if (value instanceof InputStream) { >>>> nodeToSet.setProperty(attribute, (InputStream) >>>> value); >>>> try { >>>> ((InputStream) value).close(); >>>> } catch (IOException e) { >>>> getInstance().logger.error("IOException >>>> in:saveAttribute " + e); >>>> } >>>> success = true; >>>> } else if (value instanceof Calendar) { >>>> nodeToSet.setProperty(attribute, (Calendar) >>>> value); >>>> success = true; >>>> } else if (value instanceof String) { >>>> String stringToSet = (String) value; >>>> nodeToSet.setProperty(attribute, stringToSet); >>>> success = true; >>>> } else if (value instanceof Long) { >>>> nodeToSet.setProperty(attribute, ((Long) >>>> value).longValue()); >>>> success = true; >>>> } else if (value instanceof Integer) { >>>> nodeToSet.setProperty(attribute, ((Integer) >>>> value).longValue()); >>>> success = true; >>>> } else if (value instanceof Double) { >>>> nodeToSet.setProperty(attribute, ((Double) >>>> value).doubleValue()); >>>> success = true; >>>> } else if (value instanceof Boolean) { >>>> nodeToSet.setProperty(attribute, ((Boolean) >>>> value).booleanValue()); >>>> success = true; >>>> } >>>> if (iLockedThis) { >>>> session.save(); >>>> nodeToSet.unlock(); >>>> } >>>> } >>>> } catch (final javax.jcr.ValueFormatException e) { >>>> getInstance().logger.error("ValueFormatException >>>> in:saveAttribute " + e); >>>> } catch (final javax.jcr.version.VersionException e) { >>>> getInstance().logger.error("VersionException >>>> in:saveAttribute " + e); >>>> } catch (final javax.jcr.lock.LockException e) { >>>> getInstance().logger.error("LockException >>>> in:saveAttribute " >>>> + e); >>>> } catch (final >>>> javax.jcr.nodetype.ConstraintViolationException >>>> e) { >>>> >>>> getInstance().logger.error("javax.jcr.nodetype.ConstraintViolationException >>>> in:saveAttribute " + e); >>>> } catch (final javax.jcr.RepositoryException e) { >>>> getInstance().logger.error("RepositoryException >>>> in:saveAttribute " + e); >>>> } >>>> } >>>> return success; >>>> } >>>> -- >>>> View this message in context: >>>> http://www.nabble.com/modified-externally%3A-node---when-deleting-node-tp23352361p23352361.html >>>> Sent from the Jackrabbit - Users mailing list archive at Nabble.com. >>>> >>>> >>> >>> >> >> > > -- View this message in context: http://www.nabble.com/modified-externally%3A-node---when-deleting-node-tp23352361p23377399.html Sent from the Jackrabbit - Users mailing list archive at Nabble.com.
