/*
* 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.fs;
import static ch.entwine.weblounge.common.content.Resource.LIVE;
import static ch.entwine.weblounge.common.content.Resource.WORK;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import ch.entwine.weblounge.common.content.ResourceSearchResultItem;
import ch.entwine.weblounge.common.content.ResourceURI;
import ch.entwine.weblounge.common.content.SearchQuery;
import ch.entwine.weblounge.common.content.SearchQuery.Order;
import ch.entwine.weblounge.common.content.SearchResult;
import ch.entwine.weblounge.common.content.page.Page;
import ch.entwine.weblounge.common.content.page.PageTemplate;
import ch.entwine.weblounge.common.impl.content.SearchQueryImpl;
import ch.entwine.weblounge.common.impl.content.page.PageImpl;
import ch.entwine.weblounge.common.impl.content.page.PageURIImpl;
import ch.entwine.weblounge.common.impl.language.LanguageUtils;
import ch.entwine.weblounge.common.impl.security.SiteAdminImpl;
import ch.entwine.weblounge.common.impl.security.UserImpl;
import ch.entwine.weblounge.common.impl.util.TestUtils;
import ch.entwine.weblounge.common.language.Language;
import ch.entwine.weblounge.common.repository.ContentRepositoryException;
import ch.entwine.weblounge.common.site.Environment;
import ch.entwine.weblounge.common.site.Module;
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.fs.FileSystemContentRepository;
import ch.entwine.weblounge.contentrepository.index.SearchIndexImplStub;
import ch.entwine.weblounge.search.impl.elasticsearch.ElasticSearchUtils;
import org.apache.commons.io.FileUtils;
import org.easymock.EasyMock;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.Dictionary;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Set;
import java.util.UUID;
/**
* Test case for {@link DocumentVersionTest}.
*/
public class DocumentVersionTest {
/** The content repository */
protected FileSystemContentRepository repository = null;
/** The repository root directory */
protected File repositoryRoot = null;
/** The mock site */
protected Site site = null;
/** Page template */
protected PageTemplate template = null;
/** The mock search index */
protected SearchIndexImplStub searchIndex = null;
/** The resource serializer */
private static ResourceSerializerServiceImpl serializer = null;
/**
* Sets up static test data.
*/
@BeforeClass
public static void setUpClass() {
// Resource serializer
serializer = new ResourceSerializerServiceImpl();
serializer.addSerializer(new PageSerializer());
serializer.addSerializer(new FileResourceSerializer());
serializer.addSerializer(new ImageResourceSerializer());
serializer.addSerializer(new MovieResourceSerializer());
}
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
String rootPath = PathUtils.concat(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString());
repositoryRoot = new File(rootPath);
FileUtils.deleteQuietly(repositoryRoot);
// Create the index configuration
System.setProperty("weblounge.home", rootPath);
TestUtils.startTesting();
ElasticSearchUtils.createIndexConfigurationAt(repositoryRoot);
// 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.expect(site.getModules()).andReturn(new Module[] {}).anyTimes();
EasyMock.expect(site.getDefaultLanguage()).andReturn(LanguageUtils.getLanguage("de")).anyTimes();
EasyMock.expect(site.getAdministrator()).andReturn(new SiteAdminImpl("admin")).anyTimes();
EasyMock.replay(site);
// Search Index
searchIndex = new SearchIndexImplStub();
searchIndex.bindResourceSerializerService(serializer);
// Connect to the repository
repository = new FileSystemContentRepository();
repository.setSerializer(serializer);
repository.setEnvironment(Environment.Production);
repository.setSearchIndex(searchIndex);
Dictionary<String, Object> repositoryProperties = new Hashtable<String, Object>();
repositoryProperties.put(FileSystemContentRepository.OPT_ROOT_DIR, repositoryRoot.getAbsolutePath());
repository.updated(repositoryProperties);
repository.connect(site);
// Remove the default home page
repository.delete(new PageURIImpl(site, "/"), true);
}
/**
* Does the cleanup after each test.
*/
@After
public void tearDown() {
try {
repository.disconnect();
FileUtils.deleteQuietly(repositoryRoot);
} catch (ContentRepositoryException e) {
fail("Error disconnecting content repository: " + e.getMessage());
}
try {
searchIndex.clear();
searchIndex.close();
} catch (IOException e) {
fail("Error clearing & closing search index: " + e.getMessage());
}
}
/**
* Test method for {@link SearchQuery#withPreferredVersion(long)}.
*/
@Test
public void testWithPreferredVersion() throws Exception {
SearchResult result = null;
// Make sure the homepage doesn't get into our way
repository.delete(new PageURIImpl(site, "/"), true);
SearchQuery workPreferredQuery = new SearchQueryImpl(site).withPreferredVersion(WORK).sortByCreationDate(Order.Ascending);
SearchQuery livePreferredQuery = new SearchQueryImpl(site).withPreferredVersion(LIVE).sortByCreationDate(Order.Ascending);
SearchQuery workOnlyQuery = new SearchQueryImpl(site).withVersion(WORK).sortByCreationDate(Order.Ascending);
SearchQuery liveOnlyQuery = new SearchQueryImpl(site).withVersion(LIVE).sortByCreationDate(Order.Ascending);
// Test empty repository
assertEquals(0, repository.find(workPreferredQuery).getDocumentCount());
assertEquals(0, repository.find(livePreferredQuery).getDocumentCount());
assertEquals(0, repository.find(workOnlyQuery).getDocumentCount());
assertEquals(0, repository.find(liveOnlyQuery).getDocumentCount());
// Create URI and pages and add them to the repository
ResourceURI liveOnlyURI = new PageURIImpl(site, "/liveonly", LIVE);
ResourceURI liveAndWorkLiveURI = new PageURIImpl(site, "/liveandwork", LIVE);
ResourceURI liveAndWorkWorkURI = new PageURIImpl(site, "/liveandwork", WORK);
ResourceURI workOnlyURI = new PageURIImpl(site, "/workonly", WORK);
Page liveOnly = new PageImpl(liveOnlyURI);
liveOnly.setTemplate(template.getIdentifier());
Page liveAndWorkLive = new PageImpl(liveAndWorkLiveURI);
liveAndWorkLive.setTemplate(template.getIdentifier());
Page liveAndWorkWork = new PageImpl(liveAndWorkWorkURI);
liveAndWorkWork.setTemplate(template.getIdentifier());
Page workOnly = new PageImpl(workOnlyURI);
workOnly.setTemplate(template.getIdentifier());
// Add the live only live page
repository.put(liveOnly);
assertEquals(0, repository.find(workOnlyQuery).getDocumentCount());
assertEquals(1, repository.find(liveOnlyQuery).getDocumentCount());
result = repository.find(workPreferredQuery);
assertEquals(1, result.getDocumentCount());
ResourceSearchResultItem searchResultItem = (ResourceSearchResultItem) result.getItems()[0];
assertEquals(LIVE, searchResultItem.getResourceURI().getVersion());
result = repository.find(livePreferredQuery);
assertEquals(1, result.getDocumentCount());
assertEquals(LIVE, ((ResourceSearchResultItem) result.getItems()[0]).getResourceURI().getVersion());
// Add the work only work page
repository.put(workOnly);
assertEquals(1, repository.find(workOnlyQuery).getDocumentCount());
assertEquals(1, repository.find(liveOnlyQuery).getDocumentCount());
result = repository.find(workPreferredQuery);
assertEquals(2, result.getDocumentCount());
assertEquals(LIVE, ((ResourceSearchResultItem) result.getItems()[0]).getResourceURI().getVersion());
assertEquals(WORK, ((ResourceSearchResultItem) result.getItems()[1]).getResourceURI().getVersion());
result = repository.find(livePreferredQuery);
assertEquals(2, result.getDocumentCount());
assertEquals(LIVE, ((ResourceSearchResultItem) result.getItems()[0]).getResourceURI().getVersion());
assertEquals(WORK, ((ResourceSearchResultItem) result.getItems()[1]).getResourceURI().getVersion());
// Add the live and work live page
repository.put(liveAndWorkLive);
assertEquals(1, repository.find(workOnlyQuery).getDocumentCount());
assertEquals(2, repository.find(liveOnlyQuery).getDocumentCount());
result = repository.find(workPreferredQuery);
assertEquals(3, result.getDocumentCount());
assertEquals(LIVE, ((ResourceSearchResultItem) result.getItems()[0]).getResourceURI().getVersion());
assertEquals(WORK, ((ResourceSearchResultItem) result.getItems()[1]).getResourceURI().getVersion());
assertEquals(LIVE, ((ResourceSearchResultItem) result.getItems()[2]).getResourceURI().getVersion());
result = repository.find(livePreferredQuery);
assertEquals(3, result.getDocumentCount());
assertEquals(LIVE, ((ResourceSearchResultItem) result.getItems()[0]).getResourceURI().getVersion());
assertEquals(WORK, ((ResourceSearchResultItem) result.getItems()[1]).getResourceURI().getVersion());
assertEquals(LIVE, ((ResourceSearchResultItem) result.getItems()[2]).getResourceURI().getVersion());
// Add the live and work work page
repository.put(liveAndWorkWork);
assertEquals(2, repository.find(workOnlyQuery).getDocumentCount());
assertEquals(2, repository.find(liveOnlyQuery).getDocumentCount());
result = repository.find(workPreferredQuery);
assertEquals(3, result.getDocumentCount());
assertEquals(LIVE, ((ResourceSearchResultItem) result.getItems()[0]).getResourceURI().getVersion());
assertEquals(WORK, ((ResourceSearchResultItem) result.getItems()[1]).getResourceURI().getVersion());
assertEquals(WORK, ((ResourceSearchResultItem) result.getItems()[2]).getResourceURI().getVersion());
result = repository.find(livePreferredQuery);
assertEquals(3, result.getDocumentCount());
assertEquals(LIVE, ((ResourceSearchResultItem) result.getItems()[0]).getResourceURI().getVersion());
assertEquals(WORK, ((ResourceSearchResultItem) result.getItems()[1]).getResourceURI().getVersion());
assertEquals(LIVE, ((ResourceSearchResultItem) result.getItems()[2]).getResourceURI().getVersion());
// Lock the page, which will trigger a call to index.update()
repository.lock(liveAndWorkWorkURI, new UserImpl("user"));
assertEquals(2, repository.find(workOnlyQuery).getDocumentCount());
assertEquals(2, repository.find(liveOnlyQuery).getDocumentCount());
result = repository.find(workPreferredQuery);
assertEquals(3, result.getDocumentCount());
assertEquals(LIVE, ((ResourceSearchResultItem) result.getItems()[0]).getResourceURI().getVersion());
assertEquals(WORK, ((ResourceSearchResultItem) result.getItems()[1]).getResourceURI().getVersion());
assertEquals(WORK, ((ResourceSearchResultItem) result.getItems()[2]).getResourceURI().getVersion());
result = repository.find(livePreferredQuery);
assertEquals(3, result.getDocumentCount());
assertEquals(LIVE, ((ResourceSearchResultItem) result.getItems()[0]).getResourceURI().getVersion());
assertEquals(WORK, ((ResourceSearchResultItem) result.getItems()[1]).getResourceURI().getVersion());
assertEquals(LIVE, ((ResourceSearchResultItem) result.getItems()[2]).getResourceURI().getVersion());
}
}