ch.entwine.weblounge.contentrepository.index.SearchIndexRecencyPriorityTest.java Source code

Java tutorial

Introduction

Here is the source code for ch.entwine.weblounge.contentrepository.index.SearchIndexRecencyPriorityTest.java

Source

/*
 *  Weblounge: Web Content Management System
 *  Copyright (c) 2003 - 2011 The Weblounge Team
 *  http://entwinemedia.com/weblounge
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program; if not, write to the Free Software Foundation
 *  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */

package ch.entwine.weblounge.contentrepository.index;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import ch.entwine.weblounge.common.content.SearchQuery;
import ch.entwine.weblounge.common.content.SearchResultItem;
import ch.entwine.weblounge.common.content.page.Page;
import ch.entwine.weblounge.common.content.page.PageTemplate;
import ch.entwine.weblounge.common.content.page.Pagelet;
import ch.entwine.weblounge.common.impl.content.SearchQueryImpl;
import ch.entwine.weblounge.common.impl.content.page.PageReader;
import ch.entwine.weblounge.common.impl.language.LanguageUtils;
import ch.entwine.weblounge.common.language.Language;
import ch.entwine.weblounge.common.site.Site;
import ch.entwine.weblounge.common.url.PathUtils;
import ch.entwine.weblounge.contentrepository.impl.FileResourceSerializer;
import ch.entwine.weblounge.contentrepository.impl.ImageResourceSerializer;
import ch.entwine.weblounge.contentrepository.impl.MovieResourceSerializer;
import ch.entwine.weblounge.contentrepository.impl.PageSerializer;
import ch.entwine.weblounge.contentrepository.impl.ResourceSerializerServiceImpl;
import ch.entwine.weblounge.contentrepository.impl.index.SearchIndex;
import ch.entwine.weblounge.contentrepository.impl.index.elasticsearch.ElasticSearchUtils;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.easymock.EasyMock;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import java.util.UUID;

/**
 * Test case for {@link SearchIndex}.
 */
public class SearchIndexRecencyPriorityTest {

    /** The search index */
    protected static SearchIndex idx = null;

    /** The index root directory */
    protected static File idxRoot = null;

    /** Flag to indicate read only index */
    protected static boolean isReadOnly = false;

    /** Page template */
    protected static PageTemplate template = null;

    /** The mock site */
    protected static Site site = null;

    /** The sample page */
    protected String pageFile = "/page.xml";

    /** The sample live page */
    protected Page livePage = null;

    /** The live page identifier */
    protected String livePageId = "00000000-0000-0000-0000-00000000000A";

    /** The other live page identifier */
    protected String otherLivePageId = "00000000-0000-0000-0000-00000000000B";

    /** The other sample live page */
    protected Page otherLivePage = null;

    /** The sample pagelet */
    protected Pagelet pagelet = null;

    /** Sample content */
    protected String content = null;

    /** German */
    protected Language german = LanguageUtils.getLanguage(Locale.GERMAN);

    /** The resource serializer */
    private static ResourceSerializerServiceImpl serializer = null;

    /**
     * Sets up the solr search index. Since solr sometimes has a hard time
     * shutting down cleanly, it's done only once for all the tests.
     * 
     * @throws Exception
     */
    @BeforeClass
    public static void setupClass() throws Exception {
        // Template
        template = EasyMock.createNiceMock(PageTemplate.class);
        EasyMock.expect(template.getIdentifier()).andReturn("templateid").anyTimes();
        EasyMock.expect(template.getStage()).andReturn("non-existing").anyTimes();
        EasyMock.replay(template);

        Set<Language> languages = new HashSet<Language>();
        languages.add(LanguageUtils.getLanguage("en"));
        languages.add(LanguageUtils.getLanguage("de"));

        // Site
        site = EasyMock.createNiceMock(Site.class);
        EasyMock.expect(site.getIdentifier()).andReturn("test").anyTimes();
        EasyMock.expect(site.getTemplate((String) EasyMock.anyObject())).andReturn(template).anyTimes();
        EasyMock.expect(site.getDefaultTemplate()).andReturn(template).anyTimes();
        EasyMock.expect(site.getLanguages()).andReturn(languages.toArray(new Language[languages.size()]))
                .anyTimes();
        EasyMock.replay(site);

        // Resource serializer
        serializer = new ResourceSerializerServiceImpl();
        serializer.addSerializer(new PageSerializer());
        serializer.addSerializer(new FileResourceSerializer());
        serializer.addSerializer(new ImageResourceSerializer());
        serializer.addSerializer(new MovieResourceSerializer());

        String rootPath = PathUtils.concat(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString());
        idxRoot = new File(rootPath);
        System.setProperty("weblounge.home", rootPath);
        ElasticSearchUtils.createIndexConfigurationAt(idxRoot);
        idx = new SearchIndex(site, serializer, isReadOnly);
    }

    /**
     * Does the cleanup after the test suite.
     */
    @AfterClass
    public static void tearDownClass() {
        try {
            idx.close();
            FileUtils.deleteQuietly(idxRoot);
        } catch (IOException e) {
            fail("Error closing search index: " + e.getMessage());
        }
    }

    /**
     * Creates the test setup.
     * 
     * @throws java.lang.Exception
     *           if setup of the index fails
     */
    @Before
    public void setUp() throws Exception {
        // Prepare the pages
        PageReader pageReader = new PageReader();
        InputStream is = null;
        Calendar date = Calendar.getInstance();
        Date today = date.getTime();
        date.add(Calendar.YEAR, -1);
        Date lastYear = date.getTime();

        // Add the live page
        try {
            is = this.getClass().getResourceAsStream(pageFile);
            livePage = pageReader.read(is, site);
            livePage.setIdentifier(livePageId);
            livePage.setCreated(livePage.getCreator(), lastYear);
            livePage.setModified(livePage.getModifier(), lastYear);
            pagelet = livePage.getPagelets()[0];

            // Duplicate the content to gain higher ranking

            String elementId = "textid";
            content = pagelet.getContent(elementId, german);
            pagelet.setContent(elementId, content + " " + content, german);
            idx.add(livePage);
        } finally {
            IOUtils.closeQuietly(is);
        }

        // Add the second live page
        try {
            is = this.getClass().getResourceAsStream(pageFile);
            otherLivePage = pageReader.read(is, site);
            otherLivePage.setIdentifier(otherLivePageId);
            otherLivePage.setCreated(otherLivePage.getCreator(), today);
            otherLivePage.setModified(otherLivePage.getModifier(), today);
            idx.add(otherLivePage);
        } finally {
            IOUtils.closeQuietly(is);
        }
    }

    /**
     * Does the cleanup after each test.
     */
    @After
    public void tearDown() throws Exception {
        idx.clear();
    }

    /**
     * Test method for
     * {@link ch.entwine.weblounge.contentrepository.impl.index.SearchIndex#getByQuery(ch.entwine.weblounge.common.content.SearchQuery)}
     * .
     */
    @Test
    public void testGetWithRecencyPriority() throws Exception {
        SearchQuery q = new SearchQueryImpl(site).withText(true, content);

        // Search without recency boosting
        SearchResultItem[] items = idx.getByQuery(q).getItems();
        assertEquals(2, items.length);
        assertEquals(livePageId, items[0].getId());
        assertEquals(otherLivePageId, items[1].getId());

        // Search with recency boosting
        q.withRececyPriority();
        items = idx.getByQuery(q).getItems();
        assertEquals(2, items.length);
        assertEquals(otherLivePageId, items[0].getId());
        assertEquals(livePageId, items[1].getId());
    }

}