xc.mst.manager.record.MSTSolrService.java Source code

Java tutorial

Introduction

Here is the source code for xc.mst.manager.record.MSTSolrService.java

Source

/**
 * Copyright (c) 2009 eXtensible Catalog Organization
 *
 * This program is free software; you can redistribute it and/or modify it under the terms of the MIT/X11 license. The text of the
 * license can be found at http://www.opensource.org/licenses/mit-license.php and copy of the license can be found on the project
 * website http://www.extensiblecatalog.org/.
 *
 */

package xc.mst.manager.record;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;

import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
import org.apache.solr.core.CoreContainer;
import org.xml.sax.SAXException;

import xc.mst.bo.log.Log;
import xc.mst.constants.Constants;
import xc.mst.dao.DataException;
import xc.mst.dao.DatabaseConfigException;
import xc.mst.manager.BaseService;
import xc.mst.utils.LogWriter;
import xc.mst.utils.MSTConfiguration;

/**
 * Creates Solr Server instance
 *
 * @author Sharmila Ranganathan
 *
 */
public class MSTSolrService extends BaseService {

    /**
     * The logger object
     */
    protected static Logger log = Logger.getLogger(Constants.LOGGER_GENERAL);

    /** Solr server */
    protected SolrServer server = null;

    /**
     * The repository management log file name
     */
    protected Log logObj = null;

    public void init() {
        try {
            logObj = getLogDAO().getById(Constants.LOG_ID_SOLR_INDEX);
        } catch (DatabaseConfigException e) {
            log.error("Cannot connect to the database with the parameters in the configuration file.", e);
        }

        if (log.isDebugEnabled()) {
            log.debug("Initializing the MSTSolrServer instance.");
        }
        setServer(createSolrServer());
    }

    public void refreshServer() {
        SolrServer s = getServer();
        s = null;
        s = createSolrServer();
        setServer(s);
    }

    public SolrServer getServer() {
        return server;
    }

    public void setServer(SolrServer server) {
        this.server = server;
    }

    /**
     * Get Solr server instance
     *
     * @return
     */
    private SolrServer createSolrServer() {

        if (getServer() == null) {
            String solrHome = MSTConfiguration.getUrlPath();
            solrHome = solrHome + MSTConfiguration.FILE_SEPARATOR + "solr";
            System.setProperty("solr.home", solrHome);
            System.setProperty("solr.solr.home", solrHome);

            log.info("Opening Solr at 3" + solrHome);

            java.util.logging.Level logLevel = getLogLevel(config.getProperty(Constants.CONFIG_SOLR_LOG_LEVEL));
            log.info("1");

            try {
                java.util.logging.Logger logg = java.util.logging.Logger.getLogger("org.apache.solr");
                logg.setUseParentHandlers(false);
                logg.log(java.util.logging.Level.INFO, "Changing log level to " + logLevel);
                logg.setLevel(logLevel);
                log.info("2");

                // using multiple cores is a bit different with solrj, followed instructions found here:
                //    http://wiki.apache.org/solr/Solrj
                //    These 1st statements are the same regardless of the core, load the file describing the cores:
                File solrConfHomeBaseFile = new File(solrHome + MSTConfiguration.FILE_SEPARATOR + "conf");
                File solrHomeXmlFile = new File(solrConfHomeBaseFile, "solr.xml");
                CoreContainer container = new CoreContainer();
                container.load(solrHome, solrHomeXmlFile);

                // now, use the proper core for your EmbeddedSolrServer:
                //    use:
                //       "core name as defined in solr.xml"
                server = new EmbeddedSolrServer(container, getSolrCore());

                log.info("3");
                LogWriter.addInfo(logObj.getLogFileLocation(),
                        "The Solr server instance was successfully using the configuration in " + solrHome
                                + " for SolrCore: " + getSolrCore());
                log.info("successfully opened solr: " + server);
            } catch (IOException ioe) {
                log.error("Failure to create server instance. Solr Server is not created.", ioe);

                LogWriter.addError(logObj.getLogFileLocation(),
                        "Failed to create Solr server instance using the configuration in " + solrHome
                                + " for SolrCore: " + getSolrCore());

                logObj.setErrors(logObj.getErrors() + 1);
                try {
                    getLogDAO().update(logObj);
                } catch (DataException e) {
                    log.error("DataExcepiton while updating the log's error count.");
                }
            } catch (SAXException se) {
                log.error("Failure to create server instance. Solr Server is not created.", se);

                LogWriter.addError(logObj.getLogFileLocation(),
                        "Failed to create Solr server instance using the configuration in " + solrHome
                                + " for SolrCore: " + getSolrCore());

                logObj.setErrors(logObj.getErrors() + 1);
                try {
                    getLogDAO().update(logObj);
                } catch (DataException e) {
                    log.error("DataExcepiton while updating the log's error count.");
                }
            } catch (ParserConfigurationException pe) {
                log.error("Failure to create server instance. Solr Server is not created.", pe);

                LogWriter.addError(logObj.getLogFileLocation(),
                        "Failed to create Solr server instance using the configuration in " + solrHome
                                + " for SolrCore: " + getSolrCore());

                logObj.setErrors(logObj.getErrors() + 1);
                try {
                    getLogDAO().update(logObj);
                } catch (DataException e) {
                    log.error("DataExcepiton while updating the log's error count.");
                }
            } catch (Exception e) {
                log.error("Failure to create server instance. Solr Server is not created.", e);

                LogWriter.addError(logObj.getLogFileLocation(),
                        "Failed to create Solr server instance using the configuration in " + solrHome
                                + " for SolrCore: " + getSolrCore());

                logObj.setErrors(logObj.getErrors() + 1);
                try {
                    getLogDAO().update(logObj);
                } catch (DataException e1) {
                    log.error("DataExcepiton while updating the log's error count.");
                }
            }
        }

        return server;
    }

    protected String getSolrCore() {
        return "core1";
    }

    private static java.util.logging.Level getLogLevel(String level) {
        if (level.equalsIgnoreCase("DEBUG"))
            return java.util.logging.Level.ALL;
        if (level.equalsIgnoreCase("INFO"))
            return java.util.logging.Level.INFO;
        if (level.equalsIgnoreCase("WARN"))
            return java.util.logging.Level.WARNING;
        if (level.equalsIgnoreCase("WARNING"))
            return java.util.logging.Level.WARNING;
        if (level.equalsIgnoreCase("ERROR"))
            return java.util.logging.Level.SEVERE;
        if (level.equalsIgnoreCase("OFF"))
            return java.util.logging.Level.OFF;
        if (level.equalsIgnoreCase("CONFIG"))
            return java.util.logging.Level.CONFIG;
        if (level.equalsIgnoreCase("ALL"))
            return java.util.logging.Level.ALL;
        if (level.equalsIgnoreCase("FINE"))
            return java.util.logging.Level.FINE;
        if (level.equalsIgnoreCase("FINER"))
            return java.util.logging.Level.FINER;
        if (level.equalsIgnoreCase("FINEST"))
            return java.util.logging.Level.FINEST;
        if (level.equalsIgnoreCase("SEVERE"))
            return java.util.logging.Level.SEVERE;

        return java.util.logging.Level.WARNING;
    }

}