Transient space bug in combination with removeItem() + addNode() + itemExists()
-------------------------------------------------------------------------------

                 Key: JCR-2985
                 URL: https://issues.apache.org/jira/browse/JCR-2985
             Project: Jackrabbit Content Repository
          Issue Type: Bug
          Components: jackrabbit-core
    Affects Versions: 2.2.5
         Environment: Win7
            Reporter: Thomas Auinger


Please see my original mailing list mail, and reply from Jukka following below


Hi,

I just tested against the brandnew 2.2.7, and can still repro this bug. Would 
you please check yourself? The test class code is below.

Simply grab a repositorty.xml file (I took mine from 
"jackrabbit-core-2.2.7-sources.jar\org\apache\jackrabbit\core\repository.xml").

When you start the test on a missing or empty repo-folder, it works. Running it 
a second time doesn't.

Thanks!
Tom


package de.byteconsult.spoon.cmd;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.jcr.Node;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;

import org.apache.jackrabbit.core.RepositoryImpl;
import org.apache.jackrabbit.core.config.RepositoryConfig;
import org.junit.Assert;
import org.junit.Test;

public class TestRepoBug {

        @Test
        public void addTest() throws Exception {
                Repository repo = 
this.createFileBasedRepository("target/test-jackrabbit",
                                "src/test/resources/test-repository.xml");
                if (repo != null) {
                        System.out.println("Version: " + 
repo.getDescriptor(Repository.REP_VERSION_DESC));
                        SimpleCredentials credentials = new 
SimpleCredentials("admin", "admin".toCharArray());
                        Session session = repo.login(credentials);
                        String path = "/test";
                        if (session.itemExists(path)) {
                                System.out.println("removing item at " + path);
                                session.removeItem(path);
                        }
                        Node node = session.getRootNode().addNode("test");
                        boolean existsBefore = session.itemExists(path);
                        node.getPath();
                        boolean existsAfter = session.itemExists(path);
                        Assert.assertTrue("Node must already exist before 
calling node.getPath()", existsBefore);
                        Assert.assertTrue("Node must still exist after calling 
node.getPath()", existsAfter);
                        session.save();
                }
                else {
                        Assert.fail("Failed to create repository");
                }
        }

        protected Repository createFileBasedRepository(String folderPath, 
String repositoryXmlPath)
                        throws RepositoryException, FileNotFoundException {
                // create homedir
                File homeDir = new File(folderPath);
                homeDir.mkdirs();

                File confFile = new File(repositoryXmlPath);
                if (!confFile.isFile()) {
                        throw new IllegalArgumentException("Repository config 
file is not a valid file: "
                                        + confFile.getAbsolutePath());
                }

                // create RepositoryConfig instance
                RepositoryConfig repositoryConfig = RepositoryConfig.create(new 
FileInputStream(confFile),
                                homeDir.getAbsolutePath());
                Repository repository = RepositoryImpl.create(repositoryConfig);
                return repository;
        }

}



-----Ursprüngliche Nachricht-----
Von: Tobias Bocanegra [mailto:[email protected]]
Gesendet: Mittwoch, 8. Juni 2011 09:05
An: [email protected]
Betreff: Re: Session Question

hi,
i tested it with jackrabbit 2.2.5 and 2.2.6 and i always get 'true', 'true'.

but with this test case:

    @Test
    public void addTest() throws RepositoryException {
        TransientRepository repo = new TransientRepository();
        System.out.println("Version: " + 
repo.getDescriptor(Repository.REP_VERSION_DESC));
        Session session = repo.login();
        String path = "/test";
        if (session.itemExists(path)) {
            System.out.println("removing item at " + path);
            session.removeItem(path);
        }
        Node node = session.getRootNode().addNode("test");
        System.out.println(session.itemExists(path));
        node.getPath();
        System.out.println(session.itemExists(path));
    }

regards, toby

On Tue, Jun 7, 2011 at 2:37 AM, Thomas Auinger <[email protected]> wrote:
> A very basic problem has just come up (Jackrabbit 2.2.5). It seems that 
> session.itemExists() returns true for a newly created Node only after 
> node.getPath() has been called.?!
>
> Here is the code:
>
>                Session session = prompt.getSession();
>                String path = "/test";
>                if (session.itemExists(path)) {
>                        System.out.println("removing item at " + path);
>                        session.removeItem(path);
>                }
>                Node node = session.getRootNode().addNode("test");
>                System.out.println(session.itemExists(path));
>                node.getPath();
>                System.out.println(session.itemExists(path));
>
> And the output is
>
> removing item at /test
> false
> true
>
> Does that make any sense at all? I know that I can get it to work by 
> calling session.save() after the addNode() line, but since its all the 
> same session, it seems like a bug. Yet a bug too fundamental to really 
> be one... :O
>
> The code runs with Spring Testing Framework, in-VM Repository, Session 
> created via Springmodules Bean
>
> Thanks
> Tom



----------------------------------


Jukka Zitting wrote:

Looks like Jackrabbit gets confused by the transient removeItem() operation 
that precedes the addNode(). Basically, the problem is not that addNode() + 
itemExists() wouldn't work, but that the much less common removeItem() + 
addNode() + itemExists() combination is having trouble. You can avoid the issue 
by adding a session.save() call after removeItem().





--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to