package org.exoplatform.services.jcr.impl.core.query; import org.exoplatform.services.jcr.config.RepositoryConfigurationException; import org.exoplatform.services.jcr.impl.core.query.lucene.ChangesHolder; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import java.io.IOException; import java.util.HashSet; import java.util.Set; import javax.jcr.RepositoryException; /** * This class will update the indexes of the related workspace */ public class Indexer { private static final Log log = ExoLogger.getLogger("exo.jcr.component.core.Indexer"); private final SearchManager searchManager; private final SearchManager parentSearchManager; private final QueryHandler handler; private final QueryHandler parentHandler; public Indexer(SearchManager searchManager, SearchManager parentSearchManager, QueryHandler handler, QueryHandler parentHandler) throws RepositoryConfigurationException { this.searchManager = searchManager; this.parentSearchManager = parentSearchManager; this.handler = handler; this.parentHandler = parentHandler; } /** * Flushes lists of added/removed nodes to SearchManagers, starting indexing. * * @param addedNodes * @param removedNodes * @param parentAddedNodes * @param parentRemovedNodes */ public void updateIndex(Set<String> addedNodes, Set<String> removedNodes, Set<String> parentAddedNodes, Set<String> parentRemovedNodes) { // pass lists to search manager if (searchManager != null && (addedNodes.size() > 0 || removedNodes.size() > 0)) { try { searchManager.updateIndex(removedNodes, addedNodes); } catch (RepositoryException e) { log.error("Error indexing changes " + e, e); } catch (IOException e) { log.error("Error indexing changes " + e, e); try { handler.logErrorChanges(removedNodes, addedNodes); } catch (IOException ioe) { log.warn("Exception occure when errorLog writed. Error log is not complete. " + ioe, ioe); } } } // pass lists to parent search manager if (parentSearchManager != null && (parentAddedNodes.size() > 0 || parentRemovedNodes.size() > 0)) { try { parentSearchManager.updateIndex(parentRemovedNodes, parentAddedNodes); } catch (RepositoryException e) { log.error("Error indexing changes " + e, e); } catch (IOException e) { log.error("Error indexing changes " + e, e); try { parentHandler.logErrorChanges(parentRemovedNodes, parentAddedNodes); } catch (IOException ioe) { log.warn("Exception occure when errorLog writed. Error log is not complete. " + ioe, ioe); } } } } /** * Flushes lists of added/removed nodes to SearchManagers, starting indexing. */ public void updateIndex(ChangesHolder changes, ChangesHolder parentChanges) { // pass lists to search manager if (searchManager != null && changes != null) { try { searchManager.apply(changes); } catch (RepositoryException e) { log.error("Error indexing changes " + e, e); } catch (IOException e) { log.error("Error indexing changes " + e, e); try { handler.logErrorChanges(new HashSet<String>(changes.getRemove()), new HashSet<String>(changes .getAddIds())); } catch (IOException ioe) { log.warn("Exception occure when errorLog writed. Error log is not complete. " + ioe, ioe); } } } // pass lists to parent search manager if (parentSearchManager != null && parentChanges != null) { try { parentSearchManager.apply(parentChanges); } catch (RepositoryException e) { log.error("Error indexing changes " + e, e); } catch (IOException e) { log.error("Error indexing changes " + e, e); try { parentHandler.logErrorChanges(new HashSet<String>(parentChanges.getRemove()), new HashSet<String>( parentChanges.getAddIds())); } catch (IOException ioe) { log.warn("Exception occure when errorLog writed. Error log is not complete. " + ioe, ioe); } } } } }