fix #2562 lang support for label

This commit is contained in:
Shinsuke Sugaya 2021-04-21 21:41:21 +09:00
parent 9d57960b6c
commit b222649d02
7 changed files with 150 additions and 9 deletions

View file

@ -119,7 +119,8 @@ public abstract class FessSearchAction extends FessBaseAction {
runtime.registerData("osddLink", openSearchHelper.hasOpenSearchFile());
final List<Map<String, String>> labelTypeItems = labelTypeHelper.getLabelTypeItemList(SearchRequestType.SEARCH);
final List<Map<String, String>> labelTypeItems = labelTypeHelper.getLabelTypeItemList(SearchRequestType.SEARCH,
request.getLocale() == null ? Locale.ROOT : request.getLocale());
runtime.registerData("labelTypeItems", labelTypeItems);
runtime.registerData("displayLabelTypeItems", labelTypeItems != null && !labelTypeItems.isEmpty());
@ -158,7 +159,8 @@ public abstract class FessSearchAction extends FessBaseAction {
}
// label
final List<Map<String, String>> labelTypeItems = labelTypeHelper.getLabelTypeItemList(SearchRequestType.SEARCH);
final List<Map<String, String>> labelTypeItems = labelTypeHelper.getLabelTypeItemList(SearchRequestType.SEARCH,
request.getLocale() == null ? Locale.ROOT : request.getLocale());
if (!labelTypeItems.isEmpty() && !form.fields.containsKey(FessSearchAction.LABEL_FIELD)) {
final String[] defaultLabelValues = fessConfig.getDefaultLabelValues(getUserBean());

View file

@ -21,6 +21,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
@ -157,8 +158,8 @@ public class SearchAction extends FessSearchAction {
form.q = renderData.getSearchQuery();
}
renderData.register(data);
RenderDataUtil.register(data, "displayQuery",
getDisplayQuery(form, labelTypeHelper.getLabelTypeItemList(SearchRequestType.SEARCH)));
RenderDataUtil.register(data, "displayQuery", getDisplayQuery(form, labelTypeHelper
.getLabelTypeItemList(SearchRequestType.SEARCH, request.getLocale() == null ? Locale.ROOT : request.getLocale())));
createPagingQuery(form);
final String[] relatedContents = relatedContentHelper.getRelatedContents(form.getQuery());
RenderDataUtil.register(data, "relatedContents", relatedContents);

View file

@ -15,7 +15,10 @@
*/
package org.codelibs.fess.es.config.exentity;
import java.util.Locale;
import org.codelibs.fess.es.config.bsentity.BsLabelType;
import org.codelibs.fess.util.ComponentUtil;
/**
* @author FreeGen
@ -23,6 +26,7 @@ import org.codelibs.fess.es.config.bsentity.BsLabelType;
public class LabelType extends BsLabelType {
private static final long serialVersionUID = 1L;
private Locale locale;
public String getId() {
return asDocMeta().id();
@ -40,6 +44,16 @@ public class LabelType extends BsLabelType {
asDocMeta().version(version);
}
public Locale getLocale() {
if (locale == null) {
if (getValue() == null) {
return Locale.ROOT;
}
locale = ComponentUtil.getFessConfig().getQueryLocaleFromName(getValue());
}
return locale;
}
@Override
public String toString() {
return "LabelType [createdBy=" + createdBy + ", createdTime=" + createdTime + ", excludedPaths=" + excludedPaths

View file

@ -22,6 +22,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
@ -73,12 +74,17 @@ public class LabelTypeHelper {
item.setValue(labelType.getValue());
item.setPermissions(labelType.getPermissions());
item.setVirtualHost(labelType.getVirtualHost());
item.setLocale(labelType.getLocale());
itemList.add(item);
}
labelTypeItemList = itemList;
}
public List<Map<String, String>> getLabelTypeItemList(final SearchRequestType searchRequestType) {
return getLabelTypeItemList(searchRequestType, Locale.ROOT);
}
public List<Map<String, String>> getLabelTypeItemList(final SearchRequestType searchRequestType, final Locale requestLocale) {
if (labelTypeItemList == null) {
init();
}
@ -86,10 +92,12 @@ public class LabelTypeHelper {
final String virtualHostKey = ComponentUtil.getVirtualHostHelper().getVirtualHostKey();
final List<LabelTypeItem> labelList;
if (StringUtil.isBlank(virtualHostKey)) {
labelList = labelTypeItemList;
} else {
labelList =
labelTypeItemList.stream().filter(item -> virtualHostKey.equals(item.getVirtualHost())).collect(Collectors.toList());
labelTypeItemList.stream().filter(item -> matchLocale(requestLocale, item.getLocale())).collect(Collectors.toList());
} else {
labelList = labelTypeItemList.stream()
.filter(item -> matchLocale(requestLocale, item.getLocale()) && virtualHostKey.equals(item.getVirtualHost()))
.collect(Collectors.toList());
}
final List<Map<String, String>> itemList = new ArrayList<>();
@ -121,6 +129,22 @@ public class LabelTypeHelper {
return itemList;
}
protected boolean matchLocale(final Locale requestLocale, final Locale targetLocale) {
if (targetLocale.equals(requestLocale) || targetLocale.equals(Locale.ROOT)) {
return true;
}
if (requestLocale == null) {
return false;
}
if (!requestLocale.getLanguage().equals(targetLocale.getLanguage())) {
return false;
}
if (targetLocale.getCountry().length() > 0 && !requestLocale.getCountry().equals(targetLocale.getCountry())) {
return false;
}
return true;
}
public Set<String> getMatchedLabelValueSet(final String path) {
if (labelTypePatternList == null) {
synchronized (this) {
@ -169,6 +193,8 @@ public class LabelTypeHelper {
private String virtualHost;
private Locale locale;
public String getLabel() {
return label;
}
@ -200,6 +226,14 @@ public class LabelTypeHelper {
public void setVirtualHost(final String virtualHost) {
this.virtualHost = virtualHost;
}
public Locale getLocale() {
return locale;
}
public void setLocale(Locale locale) {
this.locale = locale;
}
}
public static class LabelTypePattern {

View file

@ -1000,7 +1000,7 @@ public interface FessProp {
String getQueryLanguageMapping();
default String[] normalizeQueryLanguages(final String[] langs) {
default Map<String, String> getQueryLanguageMappingMap() {
@SuppressWarnings("unchecked")
Map<String, String> params = (Map<String, String>) propMap.get(QUERY_LANGUAGE_MAPPING);
if (params == null) {
@ -1013,7 +1013,11 @@ public interface FessProp {
}).collect(Collectors.toMap(Pair::getFirst, Pair::getSecond)));
propMap.put(QUERY_LANGUAGE_MAPPING, params);
}
final Map<String, String> mapping = params;
return params;
}
default String[] normalizeQueryLanguages(final String[] langs) {
final Map<String, String> mapping = getQueryLanguageMappingMap();
return stream(langs).get(stream -> stream.map(s -> {
if (StringUtil.isBlank(s)) {
return null;
@ -1060,6 +1064,29 @@ public interface FessProp {
}).toArray(n -> new String[n]));
}
default Locale getQueryLocaleFromName(final String name) {
if (name == null) {
return Locale.ROOT;
}
final String value = name.toLowerCase(Locale.ROOT);
final Map<String, String> mapping = getQueryLanguageMappingMap();
for (final String key : mapping.keySet()) {
if (value.endsWith("_" + key.toLowerCase(Locale.ROOT))) {
final String[] values = key.split("_");
if (values.length == 1) {
return new Locale(values[0]);
}
if (values.length == 2) {
return new Locale(values[0], values[1]);
}
if (values.length == 3) {
return new Locale(values[0], values[1], values[2]);
}
}
}
return Locale.ROOT;
}
String getSupportedUploadedFiles();
default boolean isSupportedUploadedFile(final String name) {

View file

@ -0,0 +1,44 @@
/*
* Copyright 2012-2021 CodeLibs Project and the Others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.codelibs.fess.helper;
import java.util.Locale;
import org.codelibs.fess.unit.UnitFessTestCase;
public class LabelTypeHelperTest extends UnitFessTestCase {
private LabelTypeHelper labelTypeHelper;
@Override
public void setUp() throws Exception {
super.setUp();
labelTypeHelper = new LabelTypeHelper();
}
public void test_matchLocale() {
assertFalse(labelTypeHelper.matchLocale(Locale.ENGLISH, Locale.JAPANESE));
assertFalse(labelTypeHelper.matchLocale(Locale.SIMPLIFIED_CHINESE, Locale.TRADITIONAL_CHINESE));
assertTrue(labelTypeHelper.matchLocale(null, Locale.ROOT));
assertTrue(labelTypeHelper.matchLocale(Locale.ENGLISH, Locale.ROOT));
assertTrue(labelTypeHelper.matchLocale(Locale.ROOT, Locale.ROOT));
assertTrue(labelTypeHelper.matchLocale(Locale.ENGLISH, Locale.ENGLISH));
assertTrue(labelTypeHelper.matchLocale(Locale.JAPAN, Locale.JAPANESE));
assertTrue(labelTypeHelper.matchLocale(Locale.SIMPLIFIED_CHINESE, Locale.CHINESE));
assertTrue(labelTypeHelper.matchLocale(Locale.TRADITIONAL_CHINESE, Locale.CHINESE));
}
}

View file

@ -20,6 +20,7 @@ import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Locale;
import org.codelibs.core.io.FileUtil;
import org.codelibs.core.misc.DynamicProperties;
@ -215,6 +216,24 @@ public class FessPropTest extends UnitFessTestCase {
assertArrays(new String[] { "zh-tw" }, fessConfig.normalizeQueryLanguages(new String[] { "zh_TW" }));
}
public void test_getQueryLocaleFromName() {
FessProp.propMap.clear();
FessConfig fessConfig = new FessConfig.SimpleImpl() {
@Override
public String getQueryLanguageMapping() {
return "ja=ja\nzh_cn=zh-cn\nzh_TW=zh-tw\nzh=zh-cn";
}
};
assertEquals(Locale.ROOT, fessConfig.getQueryLocaleFromName(null));
assertEquals(Locale.ROOT, fessConfig.getQueryLocaleFromName(""));
assertEquals(Locale.ROOT, fessConfig.getQueryLocaleFromName("ja"));
assertEquals(Locale.JAPANESE, fessConfig.getQueryLocaleFromName("test_ja"));
assertEquals(Locale.CHINESE, fessConfig.getQueryLocaleFromName("test_zh"));
assertEquals(Locale.SIMPLIFIED_CHINESE, fessConfig.getQueryLocaleFromName("test_zh_cn"));
assertEquals(Locale.TRADITIONAL_CHINESE, fessConfig.getQueryLocaleFromName("test_zh_TW"));
}
private void assertArrays(final String[] expected, final String[] actual) {
Arrays.sort(expected);
Arrays.sort(actual);