/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jackrabbit.core; import java.io.IOException; import java.util.concurrent.TimeUnit; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.apache.jackrabbit.core.persistence.PersistenceManager; import org.apache.jackrabbit.core.persistence.check.ConsistencyChecker; import org.apache.jackrabbit.core.persistence.check.ConsistencyReport; import org.apache.jackrabbit.core.query.QueryHandler; import org.apache.jackrabbit.core.query.lucene.ConsistencyCheck; import org.apache.jackrabbit.core.query.lucene.SearchIndex; import org.apache.jackrabbit.test.NotExecutableException; /** * <code>TestHelper</code> provides test utility methods. */ public class TestHelper { /** * Shuts down the workspace with the given <code>name</code>. * * @param name the name of the workspace to shut down. * @param repo the repository. * @throws RepositoryException if the shutdown fails or there is no * workspace with the given name. */ public static void shutdownWorkspace(String name, RepositoryImpl repo) throws RepositoryException { repo.getWorkspaceInfo(name).dispose(); } /** * Runs a consistency check on the workspace used by the specified session. * * @param session the Session accessing the workspace to be checked * @param runFix whether to attempt fixup * @param lostNFoundId node to which to attach orphaned nodes (or <code>null</code>) * @throws RepositoryException if an error occurs while getting the * workspace with the given name. * @throws NotExecutableException if the {@link PersistenceManager} does * not implement {@link ConsistencyChecker}, or if the associated * {@link Repository} is not a {@link RepositoryImpl}. */ public static ConsistencyReport checkConsistency(Session session, boolean runFix, String lostNFoundId) throws NotExecutableException, RepositoryException { Repository r = session.getRepository(); if (!(r instanceof RepositoryImpl)) { throw new NotExecutableException(); } else { RepositoryImpl ri = (RepositoryImpl) r; PersistenceManager pm = ri.getWorkspaceInfo( session.getWorkspace().getName()).getPersistenceManager(); if (!(pm instanceof ConsistencyChecker)) { throw new NotExecutableException(); } else { return ((ConsistencyChecker) pm).check(null, true, runFix, lostNFoundId, null); } } } public static ConsistencyCheck checkIndexConsistency(Session session) throws RepositoryException, NotExecutableException, IOException { Repository r = session.getRepository(); if (!(r instanceof RepositoryImpl)) { throw new NotExecutableException(); } RepositoryImpl ri = (RepositoryImpl) r; final String workspaceName = session.getWorkspace().getName(); QueryHandler qh = ri.getSearchManager(workspaceName).getQueryHandler(); if (!(qh instanceof SearchIndex)) { throw new NotExecutableException("No search index"); } SearchIndex si = (SearchIndex) qh; return si.runConsistencyCheck(); } /** * Runs a consistency check on the versioning store used by the specified session. * * @param session the Session accessing the workspace to be checked * @param runFix whether to attempt fixup * @param lostNFoundId node to which to attach orphaned nodes (or <code>null</code>) * @throws RepositoryException * @throws NotExecutableException if the {@link PersistenceManager} does * not implement {@link ConsistencyChecker}, or if the associated * {@link Repository} is not a {@link RepositoryImpl}. */ public static ConsistencyReport checkVersionStoreConsistency(Session session, boolean runFix, String lostNFoundId) throws NotExecutableException, RepositoryException { Repository r = session.getRepository(); if (!(r instanceof RepositoryImpl)) { throw new NotExecutableException(); } else { RepositoryImpl ri = (RepositoryImpl) r; PersistenceManager pm = ri.getRepositoryContext() .getInternalVersionManager().getPersistenceManager(); if (!(pm instanceof ConsistencyChecker)) { throw new NotExecutableException(); } else { return ((ConsistencyChecker) pm).check(null, true, runFix, lostNFoundId, null); } } } /** * wait for async text-extraction tasks to finish */ public static void waitForTextExtractionTasksToFinish(Session session) throws Exception { final RepositoryContext context = JackrabbitRepositoryStub .getRepositoryContext(session.getRepository()); JackrabbitThreadPool jtp = ((JackrabbitThreadPool) context .getExecutor()); while (jtp.getPendingLowPriorityTaskCount() != 0) { TimeUnit.MILLISECONDS.sleep(100); } } public static SearchManager getSearchManager(Session session) throws NotExecutableException, RepositoryException { Repository r = session.getRepository(); if (!(r instanceof RepositoryImpl)) { throw new NotExecutableException(); } RepositoryImpl ri = (RepositoryImpl) r; return ri.getSearchManager(session.getWorkspace().getName()); } }