/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library 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.1 of the License, or (at your option)
* any later version.
*
* This library 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.
*/
package com.liferay.document.library.search.test;
import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian;
import com.liferay.document.library.kernel.model.DLFileEntry;
import com.liferay.document.library.kernel.model.DLFileEntryMetadata;
import com.liferay.document.library.kernel.model.DLFileEntryType;
import com.liferay.document.library.kernel.model.DLFolder;
import com.liferay.document.library.kernel.model.DLFolderConstants;
import com.liferay.document.library.kernel.service.DLAppLocalServiceUtil;
import com.liferay.document.library.kernel.service.DLAppServiceUtil;
import com.liferay.document.library.kernel.service.DLFileEntryLocalServiceUtil;
import com.liferay.document.library.kernel.service.DLFileEntryTypeLocalServiceUtil;
import com.liferay.document.library.kernel.service.DLTrashServiceUtil;
import com.liferay.dynamic.data.mapping.kernel.DDMFormFieldValue;
import com.liferay.dynamic.data.mapping.kernel.DDMFormValues;
import com.liferay.dynamic.data.mapping.kernel.LocalizedValue;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormLayout;
import com.liferay.dynamic.data.mapping.model.DDMStructure;
import com.liferay.dynamic.data.mapping.model.DDMTemplate;
import com.liferay.dynamic.data.mapping.service.DDMStructureLocalServiceUtil;
import com.liferay.dynamic.data.mapping.test.util.DDMStructureTestUtil;
import com.liferay.dynamic.data.mapping.test.util.search.TestOrderHelper;
import com.liferay.dynamic.data.mapping.util.DDMBeanTranslatorUtil;
import com.liferay.dynamic.data.mapping.util.DDMIndexer;
import com.liferay.dynamic.data.mapping.util.DDMUtil;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.model.BaseModel;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.repository.model.Folder;
import com.liferay.portal.kernel.search.Hits;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.security.auth.PrincipalThreadLocal;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.security.permission.PermissionThreadLocal;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.test.rule.AggregateTestRule;
import com.liferay.portal.kernel.test.rule.Sync;
import com.liferay.portal.kernel.test.rule.SynchronousDestinationTestRule;
import com.liferay.portal.kernel.test.util.RandomTestUtil;
import com.liferay.portal.kernel.test.util.SearchContextTestUtil;
import com.liferay.portal.kernel.test.util.ServiceContextTestUtil;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.MimeTypesUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.search.test.BaseSearchTestCase;
import com.liferay.portal.security.permission.SimplePermissionChecker;
import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
import com.liferay.portlet.documentlibrary.util.test.DLAppTestUtil;
import com.liferay.registry.Registry;
import com.liferay.registry.RegistryUtil;
import java.io.File;
import java.io.InputStream;
import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* @author Eudaldo Alonso
*/
@RunWith(Arquillian.class)
@Sync
public class DLFileEntrySearchTest extends BaseSearchTestCase {
@ClassRule
@Rule
public static final AggregateTestRule aggregateTestRule =
new AggregateTestRule(
new LiferayIntegrationTestRule(),
SynchronousDestinationTestRule.INSTANCE);
@Before
@Override
public void setUp() throws Exception {
super.setUp();
setUpPermissionThreadLocal();
setUpPrincipalThreadLocal();
setUpDDMIndexer();
}
@After
public void tearDown() {
PermissionThreadLocal.setPermissionChecker(_originalPermissionChecker);
PrincipalThreadLocal.setName(_originalName);
}
@Ignore
@Override
@Test
public void testLocalizedSearch() throws Exception {
}
@Test
public void testOrderByDDMBooleanField() throws Exception {
TestOrderHelper testOrderHelper = new DLFileEntrySearchTestOrderHelper(
_ddmIndexer, group);
testOrderHelper.testOrderByDDMBooleanField();
}
@Test
public void testOrderByDDMBooleanFieldRepeatable() throws Exception {
TestOrderHelper testOrderHelper = new DLFileEntrySearchTestOrderHelper(
_ddmIndexer, group);
testOrderHelper.testOrderByDDMBooleanFieldRepeatable();
}
@Test
public void testOrderByDDMIntegerField() throws Exception {
TestOrderHelper testOrderHelper = new DLFileEntrySearchTestOrderHelper(
_ddmIndexer, group);
testOrderHelper.testOrderByDDMIntegerField();
}
@Test
public void testOrderByDDMIntegerFieldRepeatable() throws Exception {
TestOrderHelper testOrderHelper = new DLFileEntrySearchTestOrderHelper(
_ddmIndexer, group);
testOrderHelper.testOrderByDDMIntegerFieldRepeatable();
}
@Test
public void testOrderByDDMNumberField() throws Exception {
TestOrderHelper testOrderHelper = new DLFileEntrySearchTestOrderHelper(
_ddmIndexer, group);
testOrderHelper.testOrderByDDMNumberField();
}
@Test
public void testOrderByDDMNumberFieldRepeatable() throws Exception {
TestOrderHelper testOrderHelper = new DLFileEntrySearchTestOrderHelper(
_ddmIndexer, group);
testOrderHelper.testOrderByDDMNumberFieldRepeatable();
}
@Test
public void testOrderByDDMRadioField() throws Exception {
TestOrderHelper testOrderHelper = new DLFileEntrySearchTestOrderHelper(
_ddmIndexer, group);
testOrderHelper.testOrderByDDMRadioField();
}
@Test
public void testOrderByDDMRadioFieldKeyword() throws Exception {
TestOrderHelper testOrderHelper = new DLFileEntrySearchTestOrderHelper(
_ddmIndexer, group);
testOrderHelper.testOrderByDDMRadioFieldKeyword();
}
@Test
public void testOrderByDDMTextField() throws Exception {
TestOrderHelper testOrderHelper = new DLFileEntrySearchTestOrderHelper(
_ddmIndexer, group);
testOrderHelper.testOrderByDDMTextField();
}
@Test
public void testOrderByDDMTextFieldKeyword() throws Exception {
TestOrderHelper testOrderHelper = new DLFileEntrySearchTestOrderHelper(
_ddmIndexer, group);
testOrderHelper.testOrderByDDMTextFieldKeyword();
}
@Test
public void testOrderByDDMTextFieldRepeatable() throws Exception {
TestOrderHelper testOrderHelper = new DLFileEntrySearchTestOrderHelper(
_ddmIndexer, group);
testOrderHelper.testOrderByDDMTextFieldRepeatable();
}
@Ignore
@Override
@Test
public void testSearchAttachments() throws Exception {
}
@Test
public void testSearchTikaRawMetadata() throws Exception {
ServiceContext serviceContext =
ServiceContextTestUtil.getServiceContext(group.getGroupId());
SearchContext searchContext = SearchContextTestUtil.getSearchContext(
group.getGroupId());
int initialBaseModelsSearchCount = 0;
assertBaseModelsCount(
initialBaseModelsSearchCount, "Word", searchContext);
String fileName = "OSX_Test.docx";
InputStream inputStream =
DLFileEntrySearchTest.class.getResourceAsStream(
"dependencies/" + fileName);
File file = null;
try {
String mimeType = MimeTypesUtil.getContentType(file, fileName);
file = FileUtil.createTempFile(inputStream);
DLAppLocalServiceUtil.addFileEntry(
serviceContext.getUserId(), serviceContext.getScopeGroupId(),
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, fileName, mimeType,
fileName, StringPool.BLANK, StringPool.BLANK, file,
serviceContext);
}
finally {
FileUtil.delete(file);
}
assertBaseModelsCount(
initialBaseModelsSearchCount + 1, "Word", searchContext);
}
protected BaseModel<?> addBaseModel(
String keywords, DDMStructure ddmStructure,
ServiceContext serviceContext)
throws Exception {
return addBaseModel(
new String[] {keywords}, ddmStructure, serviceContext);
}
protected BaseModel<?> addBaseModel(
String[] keywords, DDMStructure ddmStructure,
ServiceContext serviceContext)
throws Exception {
_ddmStructure = ddmStructure;
DLFileEntryType dlFileEntryType =
DLFileEntryTypeLocalServiceUtil.addFileEntryType(
TestPropsValues.getUserId(), serviceContext.getScopeGroupId(),
"Structure", StringPool.BLANK,
new long[] {ddmStructure.getStructureId()}, serviceContext);
String content = "Content: Enterprise. Open Source. For Life.";
DDMFormValues ddmFormValues = createDDMFormValues(
DDMBeanTranslatorUtil.translate(_ddmStructure.getDDMForm()));
for (String keyword : keywords) {
ddmFormValues.addDDMFormFieldValue(
createLocalizedDDMFormFieldValue(
"name", StringUtil.trim(keyword)));
}
DLAppTestUtil.populateServiceContext(
serviceContext, dlFileEntryType.getFileEntryTypeId());
serviceContext.setAttribute(
DDMFormValues.class.getName() + ddmStructure.getStructureId(),
ddmFormValues);
FileEntry fileEntry = DLAppLocalServiceUtil.addFileEntry(
TestPropsValues.getUserId(), serviceContext.getScopeGroupId(),
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, "Text.txt",
ContentTypes.TEXT_PLAIN, RandomTestUtil.randomString(),
StringPool.BLANK, StringPool.BLANK, content.getBytes(),
serviceContext);
return (DLFileEntry)fileEntry.getModel();
}
@Override
protected BaseModel<?> addBaseModelWithDDMStructure(
BaseModel<?> parentBaseModel, String keywords,
ServiceContext serviceContext)
throws Exception {
DDMForm ddmForm = DDMStructureTestUtil.getSampleDDMForm("name");
DDMStructure ddmStructure = DDMStructureTestUtil.addStructure(
serviceContext.getScopeGroupId(),
DLFileEntryMetadata.class.getName(), ddmForm);
return addBaseModel(keywords, ddmStructure, serviceContext);
}
@Override
protected BaseModel<?> addBaseModelWithWorkflow(
BaseModel<?> parentBaseModel, boolean approved, String keywords,
ServiceContext serviceContext)
throws Exception {
DLFolder dlFolder = (DLFolder)parentBaseModel;
long folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
if (dlFolder != null) {
folderId = dlFolder.getFolderId();
}
FileEntry fileEntry = DLAppTestUtil.addFileEntryWithWorkflow(
serviceContext.getUserId(), serviceContext.getScopeGroupId(),
folderId, keywords + ".txt", keywords, approved, serviceContext);
return (DLFileEntry)fileEntry.getModel();
}
protected DDMFormValues createDDMFormValues(
com.liferay.dynamic.data.mapping.kernel.DDMForm ddmForm) {
DDMFormValues ddmFormValues = new DDMFormValues(ddmForm);
ddmFormValues.addAvailableLocale(LocaleUtil.US);
ddmFormValues.setDefaultLocale(LocaleUtil.US);
return ddmFormValues;
}
protected DDMFormFieldValue createLocalizedDDMFormFieldValue(
String name, String value) {
DDMFormFieldValue ddmFormFieldValue = new DDMFormFieldValue();
ddmFormFieldValue.setName(name);
LocalizedValue localizedValue = new LocalizedValue(LocaleUtil.US);
localizedValue.addString(LocaleUtil.US, value);
ddmFormFieldValue.setValue(localizedValue);
return ddmFormFieldValue;
}
@Override
protected void deleteBaseModel(long primaryKey) throws Exception {
DLFileEntryLocalServiceUtil.deleteDLFileEntry(primaryKey);
}
@Override
protected void expireBaseModelVersions(
BaseModel<?> baseModel, boolean expireAllVersions,
ServiceContext serviceContext)
throws Exception {
DLFileEntry dlFileEntry = (DLFileEntry)baseModel;
if (expireAllVersions) {
DLAppServiceUtil.deleteFileEntry(dlFileEntry.getFileEntryId());
}
else {
DLAppServiceUtil.deleteFileVersion(
dlFileEntry.getFileEntryId(), dlFileEntry.getVersion());
}
}
@Override
protected Class<?> getBaseModelClass() {
return DLFileEntry.class;
}
@Override
protected String getDDMStructureFieldName() {
return _ddmIndexer.encodeName(
_ddmStructure.getStructureId(), "name",
LocaleUtil.getSiteDefault());
}
@Override
protected BaseModel<?> getParentBaseModel(
BaseModel<?> parentBaseModel, ServiceContext serviceContext)
throws Exception {
Folder folder = DLAppServiceUtil.addFolder(
serviceContext.getScopeGroupId(),
(Long)parentBaseModel.getPrimaryKeyObj(),
RandomTestUtil.randomString(_FOLDER_NAME_MAX_LENGTH),
RandomTestUtil.randomString(), serviceContext);
return (DLFolder)folder.getModel();
}
@Override
protected BaseModel<?> getParentBaseModel(
Group group, ServiceContext serviceContext)
throws Exception {
Folder folder = DLAppServiceUtil.addFolder(
serviceContext.getScopeGroupId(),
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
RandomTestUtil.randomString(_FOLDER_NAME_MAX_LENGTH),
RandomTestUtil.randomString(), serviceContext);
return (DLFolder)folder.getModel();
}
@Override
protected String getParentBaseModelClassName() {
return DLFolderConstants.getClassName();
}
@Override
protected String getSearchKeywords() {
return "Title";
}
@Override
protected boolean isExpirableAllVersions() {
return true;
}
@Override
protected void moveBaseModelToTrash(long primaryKey) throws Exception {
DLTrashServiceUtil.moveFileEntryToTrash(primaryKey);
}
@Override
protected void moveParentBaseModelToTrash(long primaryKey)
throws Exception {
DLTrashServiceUtil.moveFolderToTrash(primaryKey);
}
@Override
protected Hits searchGroupEntries(long groupId, long creatorUserId)
throws Exception {
return DLAppServiceUtil.search(
groupId, creatorUserId, WorkflowConstants.STATUS_APPROVED,
QueryUtil.ALL_POS, QueryUtil.ALL_POS);
}
protected void setUpDDMIndexer() {
Registry registry = RegistryUtil.getRegistry();
_ddmIndexer = registry.getService(DDMIndexer.class);
}
protected void setUpPermissionThreadLocal() throws Exception {
_originalPermissionChecker =
PermissionThreadLocal.getPermissionChecker();
PermissionThreadLocal.setPermissionChecker(
new SimplePermissionChecker() {
{
init(TestPropsValues.getUser());
}
@Override
public boolean hasOwnerPermission(
long companyId, String name, String primKey, long ownerId,
String actionId) {
return true;
}
});
}
protected void setUpPrincipalThreadLocal() throws Exception {
_originalName = PrincipalThreadLocal.getName();
PrincipalThreadLocal.setName(TestPropsValues.getUserId());
}
@Override
protected BaseModel<?> updateBaseModel(
BaseModel<?> baseModel, String keywords,
ServiceContext serviceContext)
throws Exception {
DLFileEntry dlFileEntry = (DLFileEntry)baseModel;
FileEntry fileEntry = DLAppServiceUtil.updateFileEntry(
dlFileEntry.getFileEntryId(), null, dlFileEntry.getMimeType(),
keywords, StringPool.BLANK, StringPool.BLANK, true, (byte[])null,
serviceContext);
return (DLFileEntry)fileEntry.getModel();
}
@Override
protected void updateDDMStructure(ServiceContext serviceContext)
throws Exception {
DDMForm ddmForm = DDMStructureTestUtil.getSampleDDMForm("title");
DDMFormLayout ddmFormLayout = DDMUtil.getDefaultDDMFormLayout(ddmForm);
DDMStructureLocalServiceUtil.updateStructure(
_ddmStructure.getUserId(), _ddmStructure.getStructureId(),
_ddmStructure.getParentStructureId(), _ddmStructure.getNameMap(),
_ddmStructure.getDescriptionMap(), ddmForm, ddmFormLayout,
serviceContext);
}
protected class DLFileEntrySearchTestOrderHelper extends TestOrderHelper {
protected DLFileEntrySearchTestOrderHelper(
DDMIndexer ddmIndexer, Group group)
throws Exception {
super(ddmIndexer, group);
}
@Override
protected DDMTemplate addDDMTemplate(DDMStructure ddmStructure)
throws Exception {
return null;
}
@Override
protected BaseModel<?> addSearchableAssetEntry(
String fieldValue, BaseModel<?> parentBaseModel,
DDMStructure ddmStructure, DDMTemplate ddmTemplate,
ServiceContext serviceContext)
throws Exception {
return addBaseModel(fieldValue, ddmStructure, serviceContext);
}
@Override
protected BaseModel<?> addSearchableAssetEntryRepeatable(
String[] fieldValues, BaseModel<?> parentBaseModel,
DDMStructure ddmStructure, DDMTemplate ddmTemplate,
ServiceContext serviceContext)
throws Exception {
return addBaseModel(fieldValues, ddmStructure, serviceContext);
}
@Override
protected long getClassNameId() {
return PortalUtil.getClassNameId(DLFileEntryMetadata.class);
}
@Override
protected String getSearchableAssetEntryClassName() {
return getBaseModelClassName();
}
@Override
protected BaseModel<?> getSearchableAssetEntryParentBaseModel(
Group group, ServiceContext serviceContext)
throws Exception {
return getParentBaseModel(group, serviceContext);
}
@Override
protected String getSearchableAssetEntryStructureClassName() {
return DLFileEntryMetadata.class.getName();
}
}
private static final int _FOLDER_NAME_MAX_LENGTH = 100;
private DDMIndexer _ddmIndexer;
private DDMStructure _ddmStructure;
private String _originalName;
private PermissionChecker _originalPermissionChecker;
}