Package org.dspace.storage.rdbms

Source Code of org.dspace.storage.rdbms.DatabaseLegacyReindexer

/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.storage.rdbms;

import java.sql.Connection;
import java.util.Arrays;
import java.util.List;
import org.dspace.browse.IndexBrowse;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context;
import org.dspace.search.DSIndexer;
import org.flywaydb.core.api.MigrationInfo;
import org.flywaydb.core.api.callback.FlywayCallback;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* This is a FlywayCallback class which automatically reindexes Database
* contents into your Legacy search/browse engine of choice. It is NOT needed
* for Solr, but is necessary for Lucene / RDBMS indexes.
* <P>
* Reindexing is performed AFTER any database migration or repair. This
* ensures that your search/browse indexes are auto-updated post-upgrade.
*
* @author Tim Donohue
*/
public class DatabaseLegacyReindexer implements FlywayCallback
{
    /** logging category */
    private static final Logger log = LoggerFactory.getLogger(DatabaseLegacyReindexer.class);
   
    /**
     * Method to actually reindex all database contents. This method is "smart"
     * in that it determines which indexing consumer(s) you have enabled,
     * and then ensures each is reindexed appropriately.
     * <P>
     * NOTE: However, because Solr is never running when the Database is initialized,
     * this reindexer only really works for Lucene / DBMS. Once those are obsolete,
     * this can be safely removed, along with the reference to it in
     * DatabaseUtils.setupFlyway()
     */
    private void reindex()
    {
        Context context = null;
        try
        {
            context = new Context();

            // What indexing consumer(s) are configured in this DSpace?
            // TODO: This really should use the ConfigurationService, BUT for
            // some reason the DSpace Kernel is often not yet initialized at this point
            String consumers = ConfigurationManager.getProperty("event.dispatcher.default.consumers");
            if(consumers==null)
                consumers = "";
            List<String> consumerList = Arrays.asList(consumers.split("\\s*,\\s*"));

            // If Discovery indexing is enabled
            if (consumerList.contains("discovery"))
            {
                // Do nothing
                // Because Solr is normally not running when the DatabaseManager initializes,
                // Discovery autoindexing takes place in DatabaseUtils.checkReindexDiscovery(),
                // which is automatically called when Discovery initializes.
            }
           
            // If Lucene indexing is enabled
            if (consumerList.contains("search"))
            {
                log.info("Reindexing all content in Lucene search engine");
                // Clean and update Lucene index
                DSIndexer.cleanIndex(context);
                DSIndexer.updateIndex(context, true);
                log.info("Reindexing is complete");
            }
           
            // If traditional DBMS browse indexing is enabled
            if (consumerList.contains("browse"))
            {
                log.info("Reindexing all content in DBMS Browse tables");
                // Rebuild browse tables to perform a full index
                // (recreating tables as needed)
                IndexBrowse indexer = new IndexBrowse(context);
                indexer.setRebuild(true);
                indexer.setExecute(true);
                indexer.initBrowse();
                // Since the browse index is in the DB, we must commit & close context
                context.complete();
                log.info("Reindexing is complete");
            }
        }
        catch(Exception e)
        {
            log.error("Error attempting to reindex all contents for search/browse. You may need to manually reindex Lucene or DBMS", e);
        }
        finally
        {
            // Clean up our context, if it still exists & it was never completed
            if(context!=null && context.isValid())
                context.abort();
        }
    }
   
   
    @Override
    public void afterClean(Connection connection)
    {
        // do nothing
    }
   
    @Override
    public void afterEachMigrate(Connection connection, MigrationInfo info)
    {
        // do nothing
    }
   
    @Override
    public void afterInfo(Connection connection)
    {
        // do nothing
    }
   
    @Override
    public void afterInit(Connection connection)
    {
        // do nothing
    }
   
    @Override
    public void afterMigrate(Connection connection)
    {
        // Reindex after a database migration (upgrade)
        reindex();
    }
   
    @Override
    public void afterRepair(Connection connection)
    {
        // Reindex after a database repair
        reindex();
    }
   
    @Override
    public void afterValidate(Connection connection)
    {
        // do nothing
    }
   
    @Override
    public void beforeClean(Connection connection)
    {
        // do nothing
    }
   
    @Override
    public void beforeEachMigrate(Connection connection, MigrationInfo info)
    {
        // do nothing
    }
   
    @Override
    public void beforeInfo(Connection connection)
    {
        // do nothing
    }
   
    @Override
    public void beforeInit(Connection connection)
    {
        // do nothing
    }
   
    @Override
    public void beforeMigrate(Connection connection)
    {
        // do nothing
    }
   
    @Override
    public void beforeRepair(Connection connection)
    {
        // do nothing
    }
   
    @Override
    public void beforeValidate(Connection connection)
    {
        // do nothing
    }
   
}
TOP

Related Classes of org.dspace.storage.rdbms.DatabaseLegacyReindexer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.