org.kuali.ole.docstore.discovery.service.IndexerService_UT.java Source code

Java tutorial

Introduction

Here is the source code for org.kuali.ole.docstore.discovery.service.IndexerService_UT.java

Source

package org.kuali.ole.docstore.discovery.service;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.kuali.ole.docstore.common.document.content.instance.Instance;
import org.kuali.ole.docstore.common.document.content.instance.InstanceCollection;
import org.kuali.ole.docstore.common.document.content.instance.Item;
import org.kuali.ole.docstore.common.document.content.instance.xstream.InstanceOlemlRecordProcessor;
import org.kuali.ole.docstore.discovery.BaseTestCase;
import org.kuali.ole.docstore.indexer.solr.DocumentIndexerManagerFactory;
import org.kuali.ole.docstore.indexer.solr.IndexerService;
import org.kuali.ole.docstore.indexer.solr.WorkBibDocumentIndexer;
import org.kuali.ole.docstore.model.enums.DocCategory;
import org.kuali.ole.docstore.model.enums.DocFormat;
import org.kuali.ole.docstore.model.enums.DocType;
import org.kuali.ole.docstore.model.xmlpojo.ingest.Content;
import org.kuali.ole.docstore.model.xmlpojo.ingest.Request;
import org.kuali.ole.docstore.model.xmlpojo.ingest.RequestDocument;
import org.kuali.ole.docstore.common.document.content.instance.OleHoldings;
import org.kuali.ole.docstore.model.xstream.ingest.RequestHandler;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import static org.junit.Assert.*;

/**
 * Unit tests for IndexerService class.
 * User: tirumalesh.b
 * Date: 22/11/11 Time: 5:23 PM
 */
public class IndexerService_UT extends BaseTestCase {

    private IndexerService indexerService = null;
    private int oleItemCount = 0;

    public IndexerService_UT() {

    }

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

    /**
     * Test the bulk indexing of instance records, which also links them with the already indexed Bib records.
     */
    @Ignore
    @Test
    public void testInstanceBulkIndex() {
        String result = "";
        try {
            // Initial log.
            printInitialLog();
            List<String> ids = new ArrayList<String>();
            ids.add("1234");
            ids.add("14445");
            ids.add("144446");
            ids.add("144447");
            ids.add("144448");
            ids.add("144449");
            ids.add("144450");
            ids.add("144451");
            ids.add("144452");
            ids.add("144453");
            ids.add("144454");
            ids.add("144455");
            ids.add("144456");
            String filePath = "/work/bib/marc/OLE-Bib-bulkIngest-IU-Set1-split.xml";
            URL resource = getClass().getResource(filePath);
            File file = new File(resource.toURI());
            String instanceRequestContent = readFile(file);
            RequestHandler requestHandler = new RequestHandler();
            Request request = requestHandler.toObject(instanceRequestContent);
            List<RequestDocument> marcRequestDocumentList = request.getRequestDocuments();
            LOG.info("requestDocuments size " + marcRequestDocumentList.size());
            int i = 0;
            for (RequestDocument requestDocument : marcRequestDocumentList) {
                if (requestDocument.getUuid() == null)
                    requestDocument.setUuid(ids.get(i));
                i++;
            }
            result = getIndexerService(marcRequestDocumentList.get(0)).bulkIndexDocuments(marcRequestDocumentList,
                    true);
            for (RequestDocument doc : marcRequestDocumentList) {
                LOG.info("Doc Marc : " + doc.getUuid());
            }
            LOG.info("RESULT: " + result);
            if (!result.toLowerCase().contains("success"))
                fail("Bulk Index Failed.");

            filePath = "/work/instance/oleml/OLE-Instance-bulkIngest-IU-Set1-split.xml";
            resource = getClass().getResource(filePath);
            file = new File(resource.toURI());
            instanceRequestContent = readFile(file);
            requestHandler = new RequestHandler();
            Request instanceRequest = requestHandler.toObject(instanceRequestContent);
            List<RequestDocument> newInstanceRequestDocumentList = new ArrayList<RequestDocument>();
            List<RequestDocument> instanceRequestDocumentList = instanceRequest.getRequestDocuments();
            LOG.info("requestDocuments size " + instanceRequestDocumentList.size());
            for (RequestDocument requestDocument : instanceRequestDocumentList) {
                if (requestDocument.getUuid() == null)
                    requestDocument.setUuid(String.valueOf(Math.round(Math.random())));
                if (requestDocument.getContent().getContentObject() == null) {
                    InstanceOlemlRecordProcessor oleMlProcessor = new InstanceOlemlRecordProcessor();
                    InstanceCollection instanceCollection = oleMlProcessor
                            .fromXML(requestDocument.getContent().getContent());
                    for (Instance instance : instanceCollection.getInstance()) {
                        if (instance.getInstanceIdentifier() == null)
                            instance.setInstanceIdentifier(requestDocument.getUuid());
                        if (instance.getOleHoldings().getHoldingsIdentifier() == null)
                            instance.getOleHoldings()
                                    .setHoldingsIdentifier(String.valueOf(Math.round(Math.random())));
                        for (Item item : instance.getItems().getItem())
                            if (item.getItemIdentifier() == null)
                                item.setItemIdentifier(String.valueOf(Math.round(Math.random())));
                    }
                    requestDocument.getContent().setContentObject(instanceCollection);
                    newInstanceRequestDocumentList.add(requestDocument);
                }

            }
            result = getIndexerService(newInstanceRequestDocumentList.get(0))
                    .bulkIndexDocuments(newInstanceRequestDocumentList, true);
            LOG.info("RESULT: " + result);
            if (!result.toLowerCase().contains("success"))
                fail("Bulk Index Failed.");

            for (RequestDocument bibDoc : marcRequestDocumentList) {
                List<SolrDocument> bibSolrDocs = getIndexerService(bibDoc)
                        .getSolrDocumentBySolrId(bibDoc.getUuid());
                if (bibSolrDocs == null || bibSolrDocs.size() <= 0)
                    fail(" Bulk Indexing Failed.");
                for (SolrDocument outDoc : bibSolrDocs) {
                    if (outDoc.getFieldValues("instanceIdentifier") != null)
                        for (Object instanceId : outDoc.getFieldValues("instanceIdentifier")) {
                            List<SolrDocument> linkedInstanceDocs = getIndexerService(bibDoc)
                                    .getSolrDocumentBySolrId(instanceId.toString());
                            if (linkedInstanceDocs.size() <= 0)
                                fail(" Bulk Indexing Failed.");
                            else
                                for (SolrDocument instDoc : linkedInstanceDocs)
                                    if (!instDoc.getFieldValues("bibIdentifier").contains(bibDoc.getUuid()))
                                        fail(" Bulk Indexing Failed.");
                        }
                }
            }
            // Final log.
            printFinalLog();

        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
            fail("Bulk Index Failed.");
        }
    }

    @Test
    public void testDublinBulkIndex() throws Exception {
        try {
            // Initial log.
            printInitialLog();
            String filePath = "/work/bib/dublin/DublinQ-Test1.xml";
            List<RequestDocument> dublinRequestDocumentList = getRequestDocumentList(filePath);
            String result = getIndexerService(dublinRequestDocumentList.get(0))
                    .bulkIndexDocuments(dublinRequestDocumentList, true);
            LOG.info("result:" + result);
            // Final log.
            printFinalLog();

        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        }
    }

    @Test
    public void testDublinUnqBulkIndex() throws Exception {
        try {
            // Initial log.
            printInitialLog();
            String filePath = "/work/bib/dublin/unqualified/DublinUnq-Test1.xml";
            List<RequestDocument> dublinUnqRequestDocumentList = getRequestDocumentList(filePath);
            System.out.println("size:" + dublinUnqRequestDocumentList.size());
            String result = getIndexerService(dublinUnqRequestDocumentList.get(0))
                    .bulkIndexDocuments(dublinUnqRequestDocumentList, true);
            LOG.info("result:" + result);
            // Final log.
            printFinalLog();

        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        }
    }

    public List<RequestDocument> getRequestDocumentList(String path) throws Exception {
        URL resource = getClass().getResource(path);
        File file = new File(resource.toURI());
        String requestContent = readFile(file);
        RequestHandler requestHandler = new RequestHandler();
        Request request = requestHandler.toObject(requestContent);
        List<RequestDocument> requestDocumentList = request.getRequestDocuments();
        int i = 1000004;
        for (RequestDocument requestDocument : requestDocumentList) {
            if (requestDocument.getUuid() == null) {
                requestDocument.setUuid("" + i + "");
            }
            i++;
        }
        return requestDocumentList;
    }

    @Test
    public void testDeleteDocuments() throws Exception {
        try {
            // Initial log.
            printInitialLog();
            List<String> UUIDList = new ArrayList<String>();
            // get uuids of the  record using author name
            // List<String> uuids = getUUIDsByAuthor("Test_Author_HTC (David George), 1940-");
            String inputFilePath = "/work/instance/oleml/Instance-Request.xml";
            Request request = getRequest(inputFilePath);
            List<RequestDocument> requestDocumentList = request.getRequestDocuments();
            for (RequestDocument requestDocument : requestDocumentList) {
                requestDocument.setUuid(String.valueOf(Math.round(Math.random())));
                UUIDList.add(requestDocument.getUuid());
                String result = getIndexerService(requestDocument).indexDocument(requestDocument);
                LOG.info("result:" + result);

            }

            printLogInfo("Record count after indexing:" + getRecordCount());
            getIndexerService(requestDocumentList.get(0)).deleteDocuments(DocCategory.WORK.getCode(), UUIDList);
            printLogInfo("Record count after deleting:" + getRecordCount());

            // Final log.
            printFinalLog();

        } catch (Exception e) {
            LOG.info("Exception+" + e.getMessage(), e);
            LOG.error(e.getMessage(), e);
        }
    }

    @Test
    public void testDeleteDocument() throws Exception {
        try {
            // Initial log.
            printInitialLog();

            String inputFilePath = "/work/instance/oleml/Instance-Request.xml";
            Request request = getRequest(inputFilePath);
            List<RequestDocument> requestDocumentList = request.getRequestDocuments();
            RequestDocument requestDocument = requestDocumentList.get(0);
            requestDocument.setUuid(String.valueOf(Math.round(Math.random())));
            String result = getIndexerService(requestDocument).indexDocument(requestDocument);
            LOG.info("result:" + result);
            printLogInfo("Record count after indexing:" + getRecordCount());

            getIndexerService(requestDocument).deleteDocument(DocCategory.WORK.getCode(),
                    requestDocument.getUuid());

            printLogInfo("Record count after deleting:" + getRecordCount());

            // Final log.
            printFinalLog();

        } catch (Exception e) {
            LOG.info("Exception+" + e.getMessage(), e);
        }

    }

    @Ignore
    @Test
    public void testIndexDocumentsFromFilesBySolrDoc() throws Exception { // *********************
        // Initial log.
        printLogInfo("======");
        printLogInfo("Total record count before cleanup = " + getRecordCount());
        cleanUpData();
        printLogInfo("Total record count after cleanup = " + getRecordCount());

        // Test Marc Records
        LOG.info("testIndexDocumentsFromFileBySolrDoc() :  Marc Records Test");
        String docCategory = DocCategory.WORK.getCode();
        String docType = DocType.BIB.getDescription();
        String docFormat = DocFormat.MARC.getCode();
        String requestFile = "/bib/bib/marc/marc-one-record-xstream.xml"; // "/work/instance/oleml/Instance-Request.xml";
        invokeIndexDocumentsFromFileBySolrDoc(docCategory, docType, docFormat, requestFile);

        // Test Dublin Records
        LOG.info("testIndexDocumentsFromFileBySolrDoc() :  Dublin Records Test");
        docFormat = DocFormat.DUBLIN_CORE.getCode();
        requestFile = "/bib/bib/dublin/Bib-Bib-DublinQ-Test1.xml";
        invokeIndexDocumentsFromFileBySolrDoc(docCategory, docType, docFormat, requestFile);

        // Test Dublin UnQualified Records
        LOG.info("testIndexDocumentsFromFileBySolrDoc() :  Dublin Unqualified Records Test");
        requestFile = "/bib/bib/dublin/unqualified/Bib-Bib-DublinUnQ-Test1.xml";
        docFormat = DocFormat.DUBLIN_UNQUALIFIED.getCode();
        invokeIndexDocumentsFromFileBySolrDoc(docCategory, docType, docFormat, requestFile);

        // Final log.
        printLogInfo("Total record count after the test = " + getRecordCount());
        printLogInfo("======");
    }

    @Ignore
    @Test
    /**
     *  Same as testIndexDocumentsFromFileBySolrDoc, but user needs to provide dataDir=a/b/c.
     *  For manual testing. Test data inserted by this method is not deleted automatically.
     *  e.g. run with maven as follows:
     *  $ole-discovery-core>mvn -Dtest=IndexerService_UT#testIndexDocumentsFromFileBy
     SolrDocWithConfirm -DdataDir=.\src\test\resources\bib\bib\marc test
     */
    public void testIndexDocumentsFromDirBySolrDocWithConfirm() throws Exception {
        // Initial log.
        printLogInfo("======");
        printLogInfo("Total record count before cleanup = " + getRecordCount());
        cleanUpData();
        printLogInfo("Total record count after cleanup = " + getRecordCount());
        String dirPath = "/bib/bib/marc/request";
        invokeIndexDocumentsFromDirBySolrDoc(dirPath);
        // Final log.
        printLogInfo("Total record count after the test = " + getRecordCount());
        printLogInfo("======");
    }

    @Test
    public void testIndexDocumentsWithInvalidDirectoryORFile() throws Exception {
        try {
            String docCategory = DocCategory.WORK.getCode();
            String docType = DocType.BIB.getDescription();
            String docFormat = DocFormat.MARC.getCode();
            // Initial log.
            printInitialLog();
            String dirPath = "/bib/bib/marc/request/invalidDir";
            getIndexerService(docCategory, docType, docFormat).indexDocumentsFromDirBySolrDoc(docCategory, docType,
                    docFormat, dirPath);

            dirPath = "/work/emptyDir";
            getIndexerService(docCategory, docType, docFormat).indexDocumentsFromDirBySolrDoc(docCategory, docType,
                    docFormat, dirPath);
            // Final log.
            printFinalLog();
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        }

    }

    public void invokeIndexDocumentsFromDirBySolrDoc(String path) {
        try {
            printLogInfo("-----");
            printLogInfo("Input Dir/File : " + path);
            String docCategory = DocCategory.WORK.getCode();
            String docType = DocType.BIB.getDescription();
            String docFormat = DocFormat.MARC.getCode();
            URL resource = getClass().getResource(path);
            File file = new File(resource.toURI());
            String dataDir = file.getAbsolutePath();
            if (null == dataDir) {
                LOG.info("dataDir is null.");
                System.out.println("dataDir is null.");
                return;
            }
            String result = getIndexerService(docCategory, docType, docFormat)
                    .indexDocumentsFromDirBySolrDoc(docCategory, docType, docFormat, dataDir);
            LOG.info("result=" + result);
            System.out.println("result=" + result);
            assertNotNull(result);
            assertTrue(result.contains(IndexerService.SUCCESS));
            printLogInfo("-----");
        } catch (Exception e) {
            LOG.error("Exception:", e);
        }
    }

    @Ignore
    @Test
    public void testIndexDocumentFromStringBySolr() throws Exception {
        // Initial log.
        printInitialLog();
        String requestFile = "/bib/bib/marc/marc-one-record-xstream.xml";
        invokeIndexDocumentsFromStringBySolrDoc(requestFile);
        // Final log.
        printFinalLog();

    }

    public void invokeIndexDocumentsFromStringBySolrDoc(String requestFile) throws Exception {
        try {
            printLogInfo("-----");
            printLogInfo("Input Dir/File : " + requestFile);
            String docCategory = DocCategory.WORK.getCode();
            String docType = DocType.BIB.getDescription();
            String docFormat = DocFormat.MARC.getCode();
            URL resource = getClass().getResource(requestFile);
            File file = new File(resource.toURI());
            String requestContent = FileUtils.readFileToString(file);
            getIndexerService(docCategory, docType, docFormat).indexDocumentsFromStringBySolrDoc(docCategory,
                    docType, docFormat, requestContent);
            printLogInfo("-----");
        } catch (Exception e) {
            LOG.error("Exception:", e);
        }

    }

    public void invokeIndexDocumentsFromFileBySolrDoc(String docCategory, String docType, String docFormat,
            String requestFile) throws Exception {
        URL resource = getClass().getResource(requestFile);
        File file = new File(resource.toURI());
        String path = file.getAbsolutePath();
        String result = getIndexerService(docCategory, docType, docFormat)
                .indexDocumentsFromFileBySolrDoc(docCategory, docType, docFormat, path);
        System.out.println("result=" + result);
        LOG.info("result=" + result);
        assertNotNull(result);
        assertTrue(result.contains(IndexerService.SUCCESS));
    }

    @Test
    /**
     *  Same as deleteTestData, but user needs to provide confirmDelete=true.
     *  For manual testing. Used to manually delete test data.
     */
    public void deleteTestDataWithConfirm() {
        String confirmDelete = System.getProperty("confirmDelete");
        if (confirmDelete != null) {
            boolean confirm = Boolean.valueOf(confirmDelete);
            if (!confirm) {
                LOG.info("Delete is not confirmed through a system property.");
                return;
            }
            deleteTestData();
        }
    }

    @Test
    public void testSpecialCharsInInput() {
        assert (true);
    }

    protected void indexTestFile(String docCategory, String docType, String docFormat, String resFile)
            throws Exception {
        URL resource = getClass().getResource(resFile);
        File file = new File(resource.toURI());
        String filePath = file.getAbsolutePath();
        String result = getIndexerService(docCategory, docType, docFormat)
                .indexDocumentsFromFileBySolrDoc(docCategory, docType, docFormat, filePath);
        LOG.info("result =" + result);
        assertNotNull(result);
        assertTrue(result.contains(IndexerService.SUCCESS));
        String countStr = result.substring(result.indexOf("-") + 1);
        int count = Integer.parseInt(countStr);
        assertTrue(count > 0);
    }

    protected void deleteTestData() {
        String docCategory = DocCategory.WORK.getCode();
        // Test data is assumed to have id field value starting with "id_".
        String result = WorkBibDocumentIndexer.getInstance().deleteDocument(docCategory,
                indexerService.ID_FIELD_PREFIX + "*");
        LOG.info("result=" + result);
        assertNotNull(result);
        assertTrue(result.contains(IndexerService.SUCCESS));
    }

    protected List<String> getUUIDsByAuthor(String authorName) throws Exception {
        List<String> uuidList = new ArrayList<String>();
        SolrServer solr = SolrServerManager.getInstance().getSolrServer();
        SolrQuery query = new SolrQuery();
        query.setQuery("Author_display:" + authorName);
        QueryResponse queryResponse = solr.query(query);
        Iterator<SolrDocument> iter = queryResponse.getResults().iterator();
        while (iter.hasNext()) {
            SolrDocument resultDoc = iter.next();
            String id = (String) resultDoc.getFieldValue("id");
            uuidList.add(id);
            LOG.info("uuidList=" + uuidList);
        }
        return uuidList;
    }

    @Ignore
    @Test
    public void testWorkInstanceOlemlIndexDocuments() throws Exception {
        cleanUpData();
        RequestDocument rd = null;
        QueryResponse response;
        String instanceRequestFile = "/work/instance/oleml/Instance-Request.xml"; // "/work/instance/oleml/Instance-Request.xml";
        URL resource = getClass().getResource(instanceRequestFile);
        File file = new File(resource.toURI());
        String instanceRequestContent = readFile(file);
        RequestHandler requestHandler = new RequestHandler();
        org.kuali.ole.docstore.model.xmlpojo.ingest.Request request = requestHandler
                .toObject(instanceRequestContent);
        List<RequestDocument> requestDocumentList = request.getRequestDocuments();
        LOG.info("requestDocuments size " + requestDocumentList.size());
        int i = 0;

        for (RequestDocument requestDocument : requestDocumentList) {
            modifyRequestDocument(requestDocument);
            display(requestDocument);
            getIndexerService(requestDocument).indexDocument(requestDocument);
            response = searchBibRecord(DocCategory.WORK.getCode(), DocType.BIB.getDescription(),
                    DocFormat.MARC.getCode(), "id", requestDocument.getUuid());
            // LOG.info("searchBibRecord : response " + response);
            SolrDocumentList solrDocumentList = response.getResults();

            //assertEquals(1, solrDocumentList.getNumFound());
            LOG.info("getNumFound marc " + solrDocumentList.getNumFound());

            for (RequestDocument requestDocumentLinks : requestDocument.getLinkedRequestDocuments()) {
                InstanceCollection ic = (InstanceCollection) requestDocumentLinks.getContent().getContentObject();
                for (Instance oleInstance : ic.getInstance()) {
                    response = searchInstanceRecord(requestDocumentLinks.getCategory(),
                            requestDocumentLinks.getType(), requestDocumentLinks.getFormat(), "id",
                            oleInstance.getInstanceIdentifier());
                    solrDocumentList = response.getResults();
                    LOG.info("getNumFound oleinstance " + solrDocumentList.getNumFound());
                    //assertEquals(1, solrDocumentList.getNumFound());
                    response = searchHoldingRecord(DocCategory.WORK.getCode(), "holding", DocFormat.OLEML.getCode(),
                            "id", oleInstance.getOleHoldings().getHoldingsIdentifier());
                    solrDocumentList = response.getResults();
                    LOG.info("getNumFound oleholding " + solrDocumentList.getNumFound());
                    //assertEquals(1, solrDocumentList.getNumFound());
                    for (Item oleItem : oleInstance.getItems().getItem()) {
                        response = searchItemsRecord(DocCategory.WORK.getCode(), "item", DocFormat.OLEML.getCode(),
                                "id", oleItem.getItemIdentifier());
                        solrDocumentList = response.getResults();
                        LOG.info("getNumFound oleitem " + solrDocumentList.getNumFound());
                        // assertEquals(1, solrDocumentList.getNumFound());
                    }
                }
            }
        }
    }

    public QueryResponse searchRecord(String docCat, String docType, String docFormat, String fieldName,
            String fieldValue) throws Exception {
        LOG.info("fieldNameIdentifier " + fieldName);
        String identifier_args = "(" + fieldName + ":" + fieldValue + ")";
        String docCategory_args = "(DocCategory" + ":" + docCat + ")";
        String docType_args = "(DocType" + ":" + docType + ")";
        String docFormat_args = "(DocFormat" + ":" + docFormat + ")";
        String args = identifier_args + "AND" + docCategory_args + "AND" + docType_args + "AND" + docFormat_args;
        //SolrServer solr = new CommonsHttpSolrServer(PropertyUtil.getPropertyUtil().getProperty("docSearchURL") + "bib");
        SolrServer solr = SolrServerManager.getInstance().getSolrServer();
        SolrQuery query = new SolrQuery();
        LOG.info("args " + args);
        query.setQuery(args);
        //query.setQuery(docCategory_args);
        //query.setQuery(docType_args);
        //query.setQuery(docFormat_args);
        //LOG.info("getQuery "+query.getQuery());

        QueryResponse response = solr.query(query);
        // LOG.info("response "+response);
        return response;
    }

    public QueryResponse searchBibRecord(String docCat, String docType, String docFormat,
            String fieldNameIdentifier, String fieldValueIdentifier) throws Exception {
        return searchRecord(docCat, docType, docFormat, fieldNameIdentifier, fieldValueIdentifier);
    }

    public QueryResponse searchInstanceRecord(String docCat, String docType, String docFormat,
            String fieldNameIdentifier, String fieldValueIdentifier) throws Exception {
        return searchRecord(docCat, docType, docFormat, fieldNameIdentifier, fieldValueIdentifier);
    }

    public QueryResponse searchHoldingRecord(String docCat, String docType, String docFormat,
            String fieldNameIdentifier, String fieldValueIdentifier) throws Exception {
        return searchRecord(docCat, docType, docFormat, fieldNameIdentifier, fieldValueIdentifier);
    }

    public QueryResponse searchItemsRecord(String docCat, String docType, String docFormat,
            String fieldNameIdentifier, String fieldValueIdentifier) throws Exception {
        return searchRecord(docCat, docType, docFormat, fieldNameIdentifier, fieldValueIdentifier);

    }

    private static int count = 0;

    public void modifyRequestDocument(RequestDocument requestDocument) {
        count++;
        LOG.info("count " + count);
        oleItemCount = 0;
        String marcID = String.valueOf(Math.round(Math.random()));
        LOG.info("modifyRequestDocument : marcID " + marcID);
        String oleHoldingID = String.valueOf(Math.round(Math.random()));

        LOG.info("modifyRequestDocument : oleHoldingID " + oleHoldingID);
        String oleItemID = "";
        String instanceID = String.valueOf(Math.round(Math.random()));
        LOG.info("modifyRequestDocument : instanceID " + instanceID);

        requestDocument.setUuid(marcID);
        InstanceOlemlRecordProcessor instanceOlemlRecordProcessor = new InstanceOlemlRecordProcessor();
        List<RequestDocument> linkedRequestDocumentsModified = new ArrayList<RequestDocument>();
        Content content = null;
        for (RequestDocument req : requestDocument.getLinkedRequestDocuments()) {
            InstanceCollection ic = instanceOlemlRecordProcessor.fromXML(req.getContent().getContent());
            List<Instance> oleInstances = ic.getInstance();
            req.getContent().setContentObject(ic);
            req.setUuid(instanceID);
            for (Instance oleInstance : oleInstances) {
                oleInstance.setInstanceIdentifier(instanceID);
                //                oleInstance.setResourceIdentifier(marcID);
                /*
                            rd = (RequestDocument) req.clone();
                            content1 = new Content();
                            rd.setContent(content1);
                */
                OleHoldings holding = oleInstance.getOleHoldings();
                holding.setHoldingsIdentifier(oleHoldingID);
                //                holding.setInstanceIdentifier(instanceID);
                /*
                            rd.getContent().setContentObject(holding);
                            linkedRequestDocumentsModified.add(rd);
                */
                for (Item oleItem : oleInstance.getItems().getItem()) {
                    oleItemCount++;
                    oleItemID = String.valueOf(Math.round(Math.random()));
                    //                    rd = (RequestDocument) req.clone();
                    oleItem.setItemIdentifier(oleItemID);
                    //                    oleItem.setInstanceIdentifier(instanceID);
                    /*
                                    content1 = new Content();
                                    rd.setContent(content1);
                                    rd.getContent().setContentObject(oleItem);
                                    linkedRequestDocumentsModified.add(rd);
                    */
                }
            }
            //            requestDocument.setLinkedRequestDocuments(linkedRequestDocumentsModified);
        }

    }

    public void display(RequestDocument requestDocument) {
        LOG.info("in display");
        LOG.info("requestDocument.getId " + requestDocument.getId());
        LOG.info("requestDocument.getCategory " + requestDocument.getCategory());
        LOG.info("requestDocument.getFormat " + requestDocument.getFormat());
        LOG.info("requestDocument.getType " + requestDocument.getType());
        //  LOG.info("requestDocument.getType " + requestDocument.getType());
        List<RequestDocument> links = requestDocument.getLinkedRequestDocuments();
        LOG.info("links.size " + links.size());
        for (RequestDocument requestDocumentLinks : links) {
            LOG.info("requestDocumentLinks.getId " + requestDocumentLinks.getId());
            LOG.info("requestDocumentLinks.getUuid " + requestDocumentLinks.getUuid());
            LOG.info("requestDocumentLinks.getCategory " + requestDocumentLinks.getCategory());
            LOG.info("requestDocumentLinks.getFormat " + requestDocumentLinks.getFormat());
            LOG.info("requestDocumentLinks.getType " + requestDocumentLinks.getType());
            LOG.info("requestDocumentLinks getContentObject "
                    + requestDocumentLinks.getContent().getContentObject());
            InstanceCollection ic = (InstanceCollection) requestDocumentLinks.getContent().getContentObject();
            for (Instance oleInstance : ic.getInstance()) {
                LOG.info("getResourceIdentifier " + oleInstance.getResourceIdentifier());
                LOG.info("getHoldingsIdentifier " + oleInstance.getOleHoldings().getHoldingsIdentifier());
                //               LOG.info("getInstanceIdentifier " + oleInstance.getHoldings().getInstanceIdentifier());
                for (Item oleItem : oleInstance.getItems().getItem()) {
                    LOG.info("getItemIdentifier " + oleItem.getItemIdentifier());
                    //                    LOG.info("getInstanceIdentifier " + oleItem.getInstanceIdentifier());

                }

            }

            if (requestDocumentLinks.getContent().getContentObject() instanceof OleHoldings) {
                LOG.info("requestDocumentLinks.getHoldingsIdentifier "
                        + ((OleHoldings) requestDocumentLinks.getContent().getContentObject())
                                .getHoldingsIdentifier());
                //               LOG.info(
                //                        "requestDocumentLinks.Holding getInstanceIdentifier " + ((OleHolding) requestDocumentLinks
                //                                .getContent().getContentObject()).getInstanceIdentifier());

            }
            if (requestDocumentLinks.getContent().getContentObject() instanceof Item) {
                LOG.info("requestDocumentLinks.getItemIdentifier "
                        + ((Item) requestDocumentLinks.getContent().getContentObject()).getItemIdentifier());
                //               LOG.info("requestDocumentLinks.item getInstanceIdentifier " + ((OleItem) requestDocumentLinks
                //                        .getContent().getContentObject()).getInstanceIdentifier());

            }

        }
    }

    @Ignore
    @Test
    /**
     * This method manages the testing of {@link IndexerService#indexDocuments(List<RequestDocument> requestDocuments)}
     */
    public void testIndexDocuments() throws Exception {
        // Initial log.
        printInitialLog();
        String inputFilePath = "/work/bib/marc/OLE-Bib-bulkIngest-IU-Set1-split.xml";
        invokeIndexDocuments(inputFilePath);

        inputFilePath = "/work/bib/dublin/DublinQ-Test1.xml";
        invokeIndexDocuments(inputFilePath);

        inputFilePath = "/work/bib/dublin/unqualified/DublinUnq-Test1.xml";
        invokeIndexDocuments(inputFilePath);

        // inputFilePath = "/work/instance/oleml/instanceOneRec-Test1.xml";
        //invokeIndexDocuments(inputFilePath);
        // Test with more input files.

        // Final log.
        printFinalLog();
    }

    /**
     * This method prepares the input and calls the test for {@link IndexerService#indexDocuments(List<RequestDocument>)}
     *
     * @param inputFilePath
     */
    private void invokeIndexDocuments(String inputFilePath) {
        try {
            printLogInfo("-----");
            printLogInfo("Input file : " + inputFilePath);
            // Preparation for test.
            URL resource = getClass().getResource(inputFilePath);
            File file = new File(resource.toURI());
            String requestContent = readFile(file);
            RequestHandler requestHandler = new RequestHandler();
            Request request = requestHandler.toObject(requestContent);
            List<RequestDocument> requestDocumentList = request.getRequestDocuments();

            indexDocuments(requestDocumentList);
            printLogInfo("-----");
        } catch (Exception e) {
            LOG.error("Exception:", e);
        }
    }

    /**
     * This method actually tests {@link IndexerService#indexDocuments(List<RequestDocument>)}
     *
     * @param requestDocuments
     */
    private void indexDocuments(List<RequestDocument> requestDocuments) throws Exception {
        String methodName = getCallingMethod().toString();
        printLogInfo("Testing " + methodName + "...");

        int numInputDocs = requestDocuments.size();
        printLogInfo("Num of input documents : " + numInputDocs);
        String result = "";
        for (RequestDocument requestDocument : requestDocuments) {
            result += getIndexerService(requestDocument).indexDocument(requestDocument);
            printLogInfo("result = " + result);
        }
        // Assertions.
        assertTrue(result.contains("success"));
        long numOfIndexedDocs = getCountFromResult(result);
        String message = "Number of indexed docs equals number of input docs.";
        assertEquals("Assertion failed:" + message, numInputDocs, numOfIndexedDocs);

        printLogInfo(message);
        printLogInfo("Testing " + methodName + "...done");
    }

    private long getCountFromResult(String result) {
        result = result.replaceAll("success", "");
        long count = 0;
        String[] strings = result.split("-");
        for (int i = 0; i < strings.length; i++) {
            if (StringUtils.isNotEmpty(strings[i])) {
                count = count + Integer.parseInt(strings[i]);
            }
        }
        return count;
    }

    protected String getRecordField(String filedName, String fieldValue) throws Exception {
        QueryResponse response = executeQuery(filedName + ":" + fieldValue);
        String result = response.getResults().toString();
        return result;
    }

    @Test
    public void testIndexDocument() {
        try {
            printInitialLog();
            String filePath = "/work/bib/marc/OLE-Bib-bulkIngest-IU-Set1-split.xml";
            URL resource = getClass().getResource(filePath);
            File file = new File(resource.toURI());
            String requestContent = readFile(file);
            RequestHandler requestHandler = new RequestHandler();
            Request request = requestHandler.toObject(requestContent);
            List<RequestDocument> requestDocumentList = request.getRequestDocuments();
            int i = 0;
            for (RequestDocument requestDocument : requestDocumentList) {
                requestDocument.setUuid(String.valueOf(Math.round(Math.random())));
                String result = getIndexerService(requestDocument).indexDocument(requestDocument);
                assertTrue(result.contains("success"));
            }
            printFinalLog();
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        }
    }

    @Test
    public void testdeleteDocumentsByUUIDList() {
        try {
            // Initial log.
            printInitialLog();
            String filePath = "/work/bib/marc/marcOneRec-Test1.xml";
            List<String> UUIDList = new ArrayList<String>();
            URL resource = getClass().getResource(filePath);
            File file = new File(resource.toURI());
            String requestContent = readFile(file);
            RequestHandler requestHandler = new RequestHandler();
            Request request = requestHandler.toObject(requestContent);
            List<RequestDocument> requestDocumentList = request.getRequestDocuments();
            int i = 0;
            for (RequestDocument requestDocument : requestDocumentList) {
                requestDocument.setUuid(String.valueOf(Math.round(Math.random())));
                UUIDList.add(requestDocument.getUuid());
                String result = getIndexerService(requestDocument).indexDocument(requestDocument);
                assertTrue(result.contains("success"));
            }
            System.out.println("uuid list size:" + UUIDList.size());
            LOG.info("Record count before deletion:" + getRecordCount());
            getIndexerService(requestDocumentList.get(0)).deleteDocuments(DocCategory.WORK.getCode(), UUIDList);
            LOG.info("Record count after deletion:" + getRecordCount());
            // Final log.
            printFinalLog();
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        }
    }

    @Ignore
    @Test
    public void testIndexDocumentsForONIXPL() throws Exception {
        try {
            cleanUpData();
            String filePath = "/work/license/onixpl/OLE-License-ONIXPL.xml";
            URL resource = getClass().getResource(filePath);
            File file = new File(resource.toURI());
            String requestContent = readFile(file);
            RequestHandler requestHandler = new RequestHandler();
            Request request = requestHandler.toObject(requestContent);
            List<RequestDocument> requestDocumentList = request.getRequestDocuments();
            int i = 0;
            for (RequestDocument requestDocument : requestDocumentList) {
                requestDocument.setUuid(String.valueOf(Math.round(Math.random())));
                String result = getIndexerService(requestDocument).indexDocument(requestDocument);
                LOG.info("uuid-->" + requestDocument.getUuid());
                LOG.info("result-->" + result);
                String searchValue = getRecordField("Title_search", "Test Title");
                LOG.info("search result-->" + searchValue);
                assertTrue(result.contains("success"));
            }
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        }

    }

    @Test
    public void testIndexDocumentsForBinary() throws Exception {
        try {
            cleanUpData();
            String filePath = "/work/license/binary/OLE-License-Binary.xml";
            Request request = getRequest(filePath);
            List<RequestDocument> requestDocumentList = request.getRequestDocuments();
            for (RequestDocument requestDocument : requestDocumentList) {
                requestDocument.setUuid(String.valueOf(Math.round(Math.random())));
                String result = getIndexerService(requestDocument).indexDocument(requestDocument);
                LOG.info("uuid-->" + requestDocument.getUuid());
                LOG.info("result-->" + result);
                String searchValue = getRecordField("FileName_search", "test.xslt");
                LOG.info("search result-->" + searchValue);
                assertTrue(result.contains("success"));
            }
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        }
    }

    //      @Test
    //    public void testIndexWithSpecialChars() {
    //        List<String> uuids = null;
    //        try {
    //            cleanUpData();
    //            String filePath = "/work/bib/marc/marcOneRec-Test1.xml";
    //            URL resource = getClass().getResource(filePath);
    //            File file = new File(resource.toURI());
    //            String input = readFile(file);
    //            StringBuffer stringBuffer = new StringBuffer();
    //            String regex = "BIAC journal";
    //            String replace = "BIAC journal H.X1< 9+&5#%,&*(2)\\[\\^\\!\\}";
    //            Pattern pattern = Pattern.compile(regex);
    //            Matcher matcher = pattern.matcher(input);
    //            while (matcher.find()) {
    //                matcher.appendReplacement(stringBuffer, replace);
    //            }
    //            matcher.appendTail(stringBuffer);
    //            String inputFile = stringBuffer.toString();
    //            System.out.println(inputFile);
    //            RequestHandler requestHandler = new RequestHandler();
    //            Request request = requestHandler.toObject(inputFile);
    //            List<RequestDocument> requestDocumentList = request.getRequestDocuments();
    //            indexerService.indexDocuments(requestDocumentList);
    //            uuids = getUUIDsByAuthor(replace);
    //
    //        } catch (Exception e) {
    //            LOG.error("Exception:", e);
    //        }
    //        assertNotNull(uuids);
    //        assertTrue(uuids.size() > 0);
    //    }

    @Ignore
    @Test
    public void cleanupDiscoveryData() throws Exception {
        String inputFilePath = "/work/bib/marc/OLE-Bib-bulkIngest-IU-Set1-split.xml";
        List<SolrInputDocument> SolrInputDocument = new ArrayList<org.apache.solr.common.SolrInputDocument>();
        URL resource = getClass().getResource(inputFilePath);
        File file = new File(resource.toURI());
        String requestContent = readFile(file);
        RequestHandler requestHandler = new RequestHandler();
        Request request = requestHandler.toObject(requestContent);
        List<RequestDocument> requestDocumentList = request.getRequestDocuments();
        for (RequestDocument requestDocument : requestDocumentList) {
            requestDocument.setUuid(String.valueOf(Math.round(Math.random())));
            String result = getIndexerService(requestDocument).indexDocument(requestDocument);
            LOG.info("uuid-->" + requestDocument.getUuid());
            System.out.println("Solr Document before delete -->"
                    + getIndexerService(requestDocument).getSolrDocumentBySolrId(requestDocument.getUuid()));
            System.out.println("result-->" + result);
            assertTrue(result.contains("success"));
            getIndexerService(requestDocument).cleanupDiscoveryData();
            System.out.println("Solr Document after delete -->"
                    + getIndexerService(requestDocument).getSolrDocumentBySolrId(requestDocument.getUuid()));
        }

    }

    public Request getRequest(String filePath) throws Exception {
        URL resource = getClass().getResource(filePath);
        File file = new File(resource.toURI());
        String requestContent = readFile(file);
        RequestHandler requestHandler = new RequestHandler();
        Request request = requestHandler.toObject(requestContent);
        return request;
    }

    public void printInitialLog() throws Exception {
        printLogInfo("======");
        printLogInfo("Total record count before cleanup = " + getRecordCount());
        cleanUpData();
        printLogInfo("Total record count after cleanup = " + getRecordCount());
    }

    public void printFinalLog() throws Exception {
        printLogInfo("Total record count after the test = " + getRecordCount());
        printLogInfo("======");
    }

    private IndexerService getIndexerService(RequestDocument requestDocument) {
        IndexerService indexerService = DocumentIndexerManagerFactory.getInstance().getDocumentIndexManager(
                requestDocument.getCategory(), requestDocument.getType(), requestDocument.getFormat());
        return indexerService;
    }

    private IndexerService getIndexerService(String category, String type, String format) {
        IndexerService indexerService = DocumentIndexerManagerFactory.getInstance()
                .getDocumentIndexManager(category, type, format);
        return indexerService;
    }
}