sergio
sergio

Reputation: 634

Got NullPointerException when enabled search index for Jackrabbit

I'm currently developing application that actively uses jackrabbit. This is my first experience with jackrabbit. I use h2-based configuration for my junit tests. Lucene search was disabled in my repository.xml and the only problem was the following exception in log file:

ERROR org.apache.jackrabbit.core.security.user.MembershipCache  - Failed to retrieve membership references of 21232f29-7a57-35a7-8389-4a0e4a801fc3. 
javax.jcr.RepositoryException: no search manager configured for this workspace

All unit tests passed. When I started to test functionality that uses UserManager.findAuthorizables I had to enable SearchIndex in repository.xml.
Now all of my tests fail with frustrating NullPointerException:

java.lang.NullPointerException
    at org.apache.jackrabbit.core.query.lucene.MultiScorer.nextDoc(MultiScorer.java:68)
    at org.apache.lucene.search.ConjunctionScorer.<init>(ConjunctionScorer.java:42)
    at org.apache.lucene.search.ConjunctionScorer.<init>(ConjunctionScorer.java:33)
    at org.apache.lucene.search.BooleanScorer2$2.<init>(BooleanScorer2.java:173)
    at org.apache.lucene.search.BooleanScorer2.countingConjunctionSumScorer(BooleanScorer2.java:173)
    at org.apache.lucene.search.BooleanScorer2.makeCountingSumScorerSomeReq(BooleanScorer2.java:234)
    at org.apache.lucene.search.BooleanScorer2.makeCountingSumScorer(BooleanScorer2.java:211)
    at org.apache.lucene.search.BooleanScorer2.<init>(BooleanScorer2.java:101)
    at org.apache.lucene.search.BooleanQuery$BooleanWeight.scorer(BooleanQuery.java:328)
    at org.apache.jackrabbit.core.query.lucene.ChildAxisQuery$ChildAxisWeight.scorer(ChildAxisQuery.java:334)
    at org.apache.jackrabbit.core.query.lucene.ChildAxisQuery$ChildAxisWeight.scorer(ChildAxisQuery.java:332)
    at org.apache.jackrabbit.core.query.lucene.DescendantSelfAxisQuery$DescendantSelfAxisWeight.scorer(DescendantSelfAxisQuery.java:395)
    at org.apache.jackrabbit.core.query.lucene.LuceneQueryHits.<init>(LuceneQueryHits.java:52)
    at org.apache.jackrabbit.core.query.lucene.JackrabbitIndexSearcher.evaluate(JackrabbitIndexSearcher.java:107)
    at org.apache.jackrabbit.core.query.lucene.JackrabbitIndexSearcher.execute(JackrabbitIndexSearcher.java:85)
    at org.apache.jackrabbit.core.query.lucene.SearchIndex.executeQuery(SearchIndex.java:814)
    at org.apache.jackrabbit.core.query.lucene.SingleColumnQueryResult.executeQuery(SingleColumnQueryResult.java:74)
    at org.apache.jackrabbit.core.query.lucene.QueryResultImpl.getResults(QueryResultImpl.java:275)
    at org.apache.jackrabbit.core.query.lucene.SingleColumnQueryResult.<init>(SingleColumnQueryResult.java:66)
    at org.apache.jackrabbit.core.query.lucene.QueryImpl.execute(QueryImpl.java:134)
    at org.apache.jackrabbit.core.query.QueryImpl$1.perform(QueryImpl.java:132)
    at org.apache.jackrabbit.core.query.QueryImpl$1.perform(QueryImpl.java:129)
    at org.apache.jackrabbit.core.session.SessionState.perform(SessionState.java:216)
    at org.apache.jackrabbit.core.query.QueryImpl.execute(QueryImpl.java:128)
    at org.apache.jackrabbit.core.security.user.IndexNodeResolver.findNode(IndexNodeResolver.java:73)
    at org.apache.jackrabbit.core.security.user.UserManagerImpl.getAuthorizable(UserManagerImpl.java:465)
    at org.apache.jackrabbit.core.security.user.UserManagerImpl.setPrincipal(UserManagerImpl.java:698)
    at org.apache.jackrabbit.core.security.user.UserManagerImpl.createUser(UserManagerImpl.java:558)
    at org.apache.jackrabbit.core.security.user.UserManagerImpl.createUser(UserManagerImpl.java:541)
    at org.apache.jackrabbit.core.security.user.UserManagerImpl.createAdmin(UserManagerImpl.java:948)
    at org.apache.jackrabbit.core.security.user.UserManagerImpl.getAuthorizable(UserManagerImpl.java:426)
    at org.apache.jackrabbit.core.DefaultSecurityManager.createSystemUsers(DefaultSecurityManager.java:613)
    at org.apache.jackrabbit.core.DefaultSecurityManager.init(DefaultSecurityManager.java:204)
    at org.apache.jackrabbit.core.RepositoryImpl.initSecurityManager(RepositoryImpl.java:463)
    at org.apache.jackrabbit.core.RepositoryImpl.<init>(RepositoryImpl.java:324)
    at org.apache.jackrabbit.core.RepositoryImpl.create(RepositoryImpl.java:582)
    at org.apache.jackrabbit.core.TransientRepository$2.getRepository(TransientRepository.java:232)
    at org.apache.jackrabbit.core.TransientRepository.startRepository(TransientRepository.java:280)
    at org.apache.jackrabbit.core.TransientRepository.login(TransientRepository.java:376)
    at ru.e.e.s.s.BaseJackrabbitRelatedTests.startRepository(BaseJackrabbitRelatedTests.java:81)
    at ru.e.e.s.s.BaseJackrabbitRelatedTests.setUp(BaseJackrabbitRelatedTests.java:64)
    at ru.e.e.s.s.i.p.JackrabbitIdentityRepositoryTests.setUp(JackrabbitIdentityRepositoryTests.java:28)
    ...

Here is my repository.xml, which uses default search index configuration:

<?xml version="1.0"?> 
<!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 2.0//EN" "http://jackrabbit.apache.org/dtd/repository-2.0.dtd">
<Repository>
    <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
        <param name="driver" value="org.h2.Driver"/>
        <param name="url" value="jdbc:h2:memFS:test"/>
    </FileSystem>
    <DataStore class="org.apache.jackrabbit.core.data.FileDataStore"/>
    <Security appName="Jackrabbit">
        <SecurityManager class="org.apache.jackrabbit.core.DefaultSecurityManager" workspaceName="security">
            <WorkspaceAccessManager class="org.apache.jackrabbit.core.security.simple.SimpleWorkspaceAccessManager"/> 
        </SecurityManager>
        <AccessManager class="org.apache.jackrabbit.core.security.DefaultAccessManager" />
        <LoginModule class="org.apache.jackrabbit.core.security.authentication.DefaultLoginModule">
            <param name="adminId" value="admin"/>
            <param name="anonimousId" value=""/>
        </LoginModule>
    </Security>
    <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/>
    <Workspace name="${wsp.name}">
        <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
            <param name="driver" value="org.h2.Driver"/>
            <param name="url" value="jdbc:h2:memFS:testWsp"/>
        </FileSystem>
        <PersistenceManager class="org.apache.jackrabbit.core.persistence.pool.H2PersistenceManager">
            <param name="driver" value="org.h2.Driver"/>
            <param name="url" value="jdbc:h2:mem:itemState"/>
        </PersistenceManager>
        <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
            <param name="path" value="${wsp.home}/index"/>
            <param name="extractorPoolSize" value="2"/>
        </SearchIndex>
    </Workspace>
    <Versioning rootPath="${rep.home}/version">
        <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
            <param name="driver" value="org.h2.Driver"/>
            <param name="url" value="jdbc:h2:memFS:test/version"/>
        </FileSystem>
        <PersistenceManager class="org.apache.jackrabbit.core.persistence.pool.H2PersistenceManager">
            <param name="driver" value="org.h2.Driver"/>
            <param name="url" value="jdbc:h2:mem:version;db_close_delay=10"/>
        </PersistenceManager>
    </Versioning>
    <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
        <param name="path" value="${rep.home}/repository/index"/>
        <param name="extractorPoolSize" value="2"/>
    </SearchIndex>
</Repository>

Repository startup code:

public abstract class BaseJackrabbitRelatedTests {
    protected static Repository testRepository;
    protected static Credentials adminCredentials;
    private Session keepAliveSession;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        cleanRepository();
        testRepository = new TransientRepository(JACKRABBIT_CONFIGURATION_FILE, JACKRABBIT_REPOSITORY_PATH);
        adminCredentials = new SimpleCredentials(JACKRABBIT_USERNAME, JACKRABBIT_PASSWORD.toCharArray());
    }

    private static void cleanRepository() throws Exception {
        FileUtils.deleteQuietly(new File(JACKRABBIT_REPOSITORY_PATH));
    }

    @Before
    public void setUp() throws Exception {
        startRepository();
        ...
    }

    private void startRepository() throws Exception {
        if (keepAliveSession == null) {
            keepAliveSession = testRepository.login(adminCredentials, JACKRABBIT_DEFAULT_WORKSPACE);
        }
    }
    ...
}

I've found this problem on Jackrabbit 2.3.4. I've tried to use recently released 2.4.0 - no success.
It seems that jackrabbit fails to create users listed in LoginModule configuration section. But why? What am I missing?

Upvotes: 0

Views: 1133

Answers (2)

Omid Nazifi
Omid Nazifi

Reputation: 5234

I know this question is so old. But I would answer it for new comers who got this error.

If you want to use the search function of Repository you need to configure it manually. When it cannot find configuration for search manager in workspace, it means SearchIndex tag in workspace.xml is inactive properly.

Here is how to do this:

open file ./jackrabbit/workspaces/your_workspace/worspace.xml add or active the following between

<SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
    <param name="path" value="${wsp.home}/index"/>
    <param name="extractorPoolSize" value="2"/>
</SearchIndex>

Then restart your instance.

Note: I recommend you to copy SearchIndex tag from your repository.xml in workspace.xml.

Upvotes: 0

sergio
sergio

Reputation: 634

My mistake.
I've checked my ivy repository and found that apache lucene was published by newer version 3.3.0. Jackrabbit in it's distribution uses lucene 3.0.3
When I published "jackrabbit friendly" lucene version tests began to pass.

Upvotes: 1

Related Questions