/**
* 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.dynamic.data.mapping.test.util.search;
import com.liferay.asset.kernel.AssetRendererFactoryRegistryUtil;
import com.liferay.asset.kernel.model.AssetEntry;
import com.liferay.asset.kernel.model.AssetRenderer;
import com.liferay.asset.kernel.model.AssetRendererFactory;
import com.liferay.asset.kernel.model.DDMFormValuesReader;
import com.liferay.asset.kernel.service.persistence.AssetEntryQuery;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormField;
import com.liferay.dynamic.data.mapping.model.DDMFormFieldOptions;
import com.liferay.dynamic.data.mapping.model.DDMFormFieldType;
import com.liferay.dynamic.data.mapping.model.DDMStructure;
import com.liferay.dynamic.data.mapping.model.DDMTemplate;
import com.liferay.dynamic.data.mapping.model.Value;
import com.liferay.dynamic.data.mapping.render.ValueAccessor;
import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue;
import com.liferay.dynamic.data.mapping.storage.DDMFormValues;
import com.liferay.dynamic.data.mapping.storage.FieldConstants;
import com.liferay.dynamic.data.mapping.test.util.DDMStructureTestUtil;
import com.liferay.dynamic.data.mapping.test.util.DDMTemplateTestUtil;
import com.liferay.dynamic.data.mapping.util.DDMBeanTranslatorUtil;
import com.liferay.dynamic.data.mapping.util.DDMIndexer;
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.search.Hits;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.test.util.SearchContextTestUtil;
import com.liferay.portal.kernel.test.util.ServiceContextTestUtil;
import com.liferay.portal.kernel.util.CharPool;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portlet.asset.service.persistence.test.AssetEntryQueryTestUtil;
import com.liferay.portlet.asset.util.AssetUtil;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.lang.ArrayUtils;
import org.junit.Assert;
/**
* @author Preston Crary
* @author André de Oliveira
*/
public abstract class TestOrderHelper {
public void testOrderByDDMBooleanField() throws Exception {
testOrderByDDMField(
new String[] {"false", "true", "false", "true"},
new String[] {"false", "false", "true", "true"},
FieldConstants.BOOLEAN, DDMFormFieldType.CHECKBOX);
}
public void testOrderByDDMBooleanFieldRepeatable() throws Exception {
testOrderByDDMFieldRepeatable(
new String[] {
"true|true", "false|false", "true|true", "false|false"
},
new String[] {
"false|false", "false|false", "true|true", "true|true"
},
FieldConstants.BOOLEAN, DDMFormFieldType.CHECKBOX);
}
public void testOrderByDDMDateField() throws Exception {
testOrderByDDMField(
new String[] {"20160417192501", "20160417192510", "20160417192503"},
new String[] {"20160417192501", "20160417192503", "20160417192510"},
FieldConstants.DATE, DDMFormFieldType.DATE);
}
public void testOrderByDDMIntegerField() throws Exception {
testOrderByDDMField(
new String[] {"1", "10", "3", "2"},
new String[] {"1", "2", "3", "10"}, FieldConstants.INTEGER,
DDMFormFieldType.INTEGER);
}
public void testOrderByDDMIntegerFieldRepeatable() throws Exception {
testOrderByDDMFieldRepeatable(
new String[] {"50", "707|25", "1|99|42"},
new String[] {"1|99|42", "707|25", "50"}, FieldConstants.INTEGER,
DDMFormFieldType.INTEGER);
}
public void testOrderByDDMNumberField() throws Exception {
testOrderByDDMField(
new String[] {"3", "3.14", "12.34", "2.72", "1.41", "23.45", "20"},
new String[] {"1.41", "2.72", "3", "3.14", "12.34", "20", "23.45"},
FieldConstants.NUMBER, DDMFormFieldType.NUMBER);
}
public void testOrderByDDMNumberFieldRepeatable() throws Exception {
testOrderByDDMFieldRepeatable(
new String[] {"20|12.34", "16.0", "3.14"},
new String[] {"3.14", "20|12.34", "16.0"}, FieldConstants.NUMBER,
DDMFormFieldType.NUMBER);
}
public void testOrderByDDMRadioField() throws Exception {
testOrderByDDMRadioField("text");
}
public void testOrderByDDMRadioFieldKeyword() throws Exception {
testOrderByDDMRadioField("keyword");
}
public void testOrderByDDMTextField() throws Exception {
testOrderByDDMTextField("text");
}
public void testOrderByDDMTextFieldKeyword() throws Exception {
testOrderByDDMTextField("keyword");
}
public void testOrderByDDMTextFieldRepeatable() throws Exception {
testOrderByDDMFieldRepeatable(
new String[] {"B", "X|Y", "D|A|C|Z"},
new String[] {"D|A|C|Z", "B", "X|Y"}, "string",
DDMFormFieldType.TEXT);
}
protected static String[] toJsonArrays(String... strings) {
String[] jsonArrays = new String[strings.length];
for (int i = 0; i < strings.length; i++) {
jsonArrays[i] = "[\"" + strings[i] + "\"]";
}
return jsonArrays;
}
protected TestOrderHelper(DDMIndexer ddmIndexer, Group group)
throws Exception {
_ddmIndexer = ddmIndexer;
_group = group;
_serviceContext = ServiceContextTestUtil.getServiceContext(
group.getGroupId());
}
protected DDMStructure addDDMStructure() throws Exception {
DDMForm ddmForm = DDMStructureTestUtil.getSampleDDMForm(
"name", _dataType, _indexType, _repeatable, _type,
new Locale[] {LocaleUtil.US}, LocaleUtil.US);
setDDMFormFieldOptions(ddmForm);
return DDMStructureTestUtil.addStructure(
_serviceContext.getScopeGroupId(),
getSearchableAssetEntryStructureClassName(), ddmForm);
}
protected DDMTemplate addDDMTemplate(DDMStructure ddmStructure)
throws Exception {
return DDMTemplateTestUtil.addTemplate(
_serviceContext.getScopeGroupId(), ddmStructure.getStructureId(),
getClassNameId());
}
protected void addSearchableAssetEntries(
DDMStructure ddmStructure, DDMTemplate ddmTemplate)
throws Exception {
BaseModel<?> parentBaseModel = getSearchableAssetEntryParentBaseModel(
_group, _serviceContext);
for (String value : _unsortedValues) {
if (!_repeatable) {
addSearchableAssetEntry(
value, parentBaseModel, ddmStructure, ddmTemplate,
_serviceContext);
}
else {
addSearchableAssetEntryRepeatable(
StringUtil.split(value, CharPool.PIPE), parentBaseModel,
ddmStructure, ddmTemplate, _serviceContext);
}
}
}
protected abstract BaseModel<?> addSearchableAssetEntry(
String fieldValue, BaseModel<?> parentBaseModel,
DDMStructure ddmStructure, DDMTemplate ddmTemplate,
ServiceContext serviceContext)
throws Exception;
protected abstract BaseModel<?> addSearchableAssetEntryRepeatable(
String[] fieldValues, BaseModel<?> parentBaseModel,
DDMStructure ddmStructure, DDMTemplate ddmTemplate,
ServiceContext serviceContext)
throws Exception;
protected void assertSearch(AssetEntryQuery assetEntryQuery)
throws Exception {
Hits hits = search(assetEntryQuery);
List<AssetEntry> assetEntries = AssetUtil.getAssetEntries(hits);
Assert.assertEquals(
ArrayUtils.toString(_sortedValues),
ArrayUtils.toString(getValues(assetEntries)));
}
protected AssetEntryQuery createAssetEntryQuery(DDMStructure ddmStructure)
throws Exception {
AssetEntryQuery assetEntryQuery =
AssetEntryQueryTestUtil.createAssetEntryQuery(
_group.getGroupId(),
new String[] {getSearchableAssetEntryClassName()});
String orderByCol1 = _ddmIndexer.encodeName(
ddmStructure.getStructureId(), "name");
assetEntryQuery.setOrderByCol1(orderByCol1);
assetEntryQuery.setOrderByType1("asc");
return assetEntryQuery;
}
protected AssetRendererFactory<?> getAssetRendererFactory() {
return AssetRendererFactoryRegistryUtil.
getAssetRendererFactoryByClassName(
getSearchableAssetEntryClassName());
}
protected abstract long getClassNameId();
protected abstract String getSearchableAssetEntryClassName();
protected abstract BaseModel<?> getSearchableAssetEntryParentBaseModel(
Group group, ServiceContext serviceContext)
throws Exception;
protected abstract String getSearchableAssetEntryStructureClassName();
protected String getValue(AssetRenderer<?> assetRenderer) throws Exception {
DDMFormValuesReader ddmFormValuesReader =
assetRenderer.getDDMFormValuesReader();
DDMFormValues ddmFormValues = DDMBeanTranslatorUtil.translate(
ddmFormValuesReader.getDDMFormValues());
Map<String, List<DDMFormFieldValue>> ddmFormFieldValuesMap =
ddmFormValues.getDDMFormFieldValuesMap();
return ListUtil.toString(
ddmFormFieldValuesMap.get("name"),
new ValueAccessor(LocaleUtil.getDefault()) {
@Override
public String get(DDMFormFieldValue ddmFormFieldValue) {
Value value = ddmFormFieldValue.getValue();
return value.getString(locale);
}
},
StringPool.PIPE);
}
protected String[] getValues(List<AssetEntry> assetEntries)
throws Exception {
AssetRendererFactory<?> assetRendererFactory =
getAssetRendererFactory();
String[] values = new String[assetEntries.size()];
for (int i = 0; i < assetEntries.size(); i++) {
AssetEntry assetEntry = assetEntries.get(i);
AssetRenderer<?> assetRenderer =
assetRendererFactory.getAssetRenderer(assetEntry.getClassPK());
values[i] = getValue(assetRenderer);
}
return values;
}
protected Hits search(AssetEntryQuery assetEntryQuery) throws Exception {
SearchContext searchContext = SearchContextTestUtil.getSearchContext();
searchContext.setGroupIds(assetEntryQuery.getGroupIds());
return AssetUtil.search(
searchContext, assetEntryQuery, QueryUtil.ALL_POS,
QueryUtil.ALL_POS);
}
protected void setDDMFormFieldOptions(DDMForm ddmForm) {
if (!_type.equals(DDMFormFieldType.RADIO)) {
return;
}
List<DDMFormField> ddmFormFields = ddmForm.getDDMFormFields();
DDMFormField ddmFormField = ddmFormFields.get(0);
DDMFormFieldOptions ddmFormFieldOptions = new DDMFormFieldOptions();
for (String option : _optionValues) {
ddmFormFieldOptions.addOptionLabel(option, LocaleUtil.US, option);
}
ddmFormField.setDDMFormFieldOptions(ddmFormFieldOptions);
}
protected void testOrderByDDMField() throws Exception {
DDMStructure ddmStructure = addDDMStructure();
DDMTemplate ddmTemplate = addDDMTemplate(ddmStructure);
addSearchableAssetEntries(ddmStructure, ddmTemplate);
final AssetEntryQuery assetEntryQuery = createAssetEntryQuery(
ddmStructure);
assertSearch(assetEntryQuery);
}
protected void testOrderByDDMField(
String[] unsortedValues, String[] sortedValues, String dataType,
String type)
throws Exception {
testOrderByDDMField(
unsortedValues, sortedValues, dataType, "text", type);
}
protected void testOrderByDDMField(
String[] unsortedValues, String[] sortedValues, String dataType,
String indexType, String type)
throws Exception {
_unsortedValues = unsortedValues;
_sortedValues = sortedValues;
_dataType = dataType;
_indexType = indexType;
_type = type;
_repeatable = false;
testOrderByDDMField();
}
protected void testOrderByDDMFieldRepeatable(
String[] unsortedValues, String[] sortedValues, String dataType,
String type)
throws Exception {
_unsortedValues = unsortedValues;
_sortedValues = sortedValues;
_dataType = dataType;
_indexType = "text";
_type = type;
_repeatable = true;
testOrderByDDMField();
}
protected void testOrderByDDMRadioField(String indexType) throws Exception {
testOrderByDDMRadioField(
new String[] {"a", "D", "c", "B"},
new String[] {"a", "B", "c", "D"}, FieldConstants.STRING, indexType,
DDMFormFieldType.RADIO);
}
protected void testOrderByDDMRadioField(
String[] unsortedValues, String[] sortedValues, String dataType,
String indexType, String type)
throws Exception {
_unsortedValues = toJsonArrays(unsortedValues);
_sortedValues = toJsonArrays(sortedValues);
_dataType = dataType;
_indexType = indexType;
_type = type;
_optionValues = unsortedValues;
_repeatable = false;
testOrderByDDMField();
}
protected void testOrderByDDMTextField(String indexType) throws Exception {
testOrderByDDMField(
new String[] {"a", "D", "c", "B"},
new String[] {"a", "B", "c", "D"}, FieldConstants.STRING, indexType,
DDMFormFieldType.TEXT);
}
private String _dataType;
private final DDMIndexer _ddmIndexer;
private final Group _group;
private String _indexType;
private String[] _optionValues;
private boolean _repeatable;
private final ServiceContext _serviceContext;
private String[] _sortedValues;
private String _type;
private String[] _unsortedValues;
}