Thanks Marcel,
I'll give that a try.
Bob
On 4/20/06, Marcel Reutegger <[EMAIL PROTECTED]> wrote:
>
> Hi Bob,
>
> in general your code should work, but the while loop is more or less a
> busy wait. that is your cpu will go to 100% while waiting for the lock.
>
> There is a utility in jackrabbit that you can use to achieve exactly
> what you are trying to do:
> org.apache.jackrabbit.util.Locked
>
> here's an example how to use it:
>
> final Node n = .... // the node where you want to add a folder
> Node folder = (Node) new Locked() {
> protected Object run() throws RepositoryException {
> Node f = n.addNode("testFolder_" + System.currentTimeMillis(),
> "nt:folder");
> n.save();
> return f;
> }
> }.with(n, false);
> // do something with the newly created folder
> folder.getPath();
>
> The utility however is not included in the jackrabbit 1.0 release. You
> have to look it up in the jackrabbit svn trunk or build jackrabbit from
> trunk.
>
> regards
> marcel
>
> Robert Shiner wrote:
> > Hi,
> >
> > I wonder if you can help me.
> >
> > I would like to write some code that adds a folder to a parent, but I
> want
> > to do this in such a way that it will work during concurrent
> modifications.
> >
> > The code I currently have is as follows ...
> >
> > // Start the session
> > Session session = repository.login(new SimpleCredentials("admin",
> > "admin".toCharArray()));
> > try
> > {
> > // Get the root node for now
> > Node rootNode = session.getRootNode();
> >
> > // Wait untill a lock is available on the parent folder
> > boolean hasLock = false;
> > while (hasLock == false)
> > {
> > if (folder.isLocked() == false)
> > {
> > try
> > {
> > // Take the lock out on the parent
> > folder.lock(false, true);
> > hasLock = true;
> > }
> > catch (Exception exception)
> > {
> > // Ignore and retry
> > }
> > }
> >
> > Thread.yield();
> > }
> >
> > // Add the new folder
> > rootNode.addNode ("testFolder_" + System.currentTimeMillis(),
> > "nt:folder");
> >
> > // Save the session
> > session.save();
> > }
> > finally
> > {
> > // Log out, lock is revoked
> > session.logout();
> > }
> >
> > I have a couple of questions:
> >
> > 1) Is this pattern ok or is there a better way to do things?
> > 2) I have assumed that the parent node (the root node in this example)
> is
> > lockable. If it isn't what is the best way to apply the lockable aspect
> in
> > a concurrent safe way?
> >
> > I'm new to JackRabbit and trying to evaluate its capabilities. Any help
> or
> > feedback will be gratefully received.
> >
> > Thanks in advance,
> > Bob
> >
>
>