Skip to content
Snippets Groups Projects
Commit c811b54c authored by Shinsuke Sugaya's avatar Shinsuke Sugaya
Browse files

fix #1230 related content supports java regex

parent a2a144b7
No related branches found
No related tags found
No related merge requests found
...@@ -15,23 +15,34 @@ ...@@ -15,23 +15,34 @@
*/ */
package org.codelibs.fess.helper; package org.codelibs.fess.helper;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.regex.Pattern;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import org.codelibs.core.lang.StringUtil; import org.codelibs.core.lang.StringUtil;
import org.codelibs.core.misc.Pair;
import org.codelibs.fess.es.config.exbhv.RelatedContentBhv; import org.codelibs.fess.es.config.exbhv.RelatedContentBhv;
import org.codelibs.fess.es.config.exentity.RelatedContent; import org.codelibs.fess.es.config.exentity.RelatedContent;
import org.codelibs.fess.mylasta.direction.FessConfig; import org.codelibs.fess.mylasta.direction.FessConfig;
import org.codelibs.fess.util.ComponentUtil; import org.codelibs.fess.util.ComponentUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RelatedContentHelper { public class RelatedContentHelper {
protected volatile Map<String, Map<String, String>> relatedContentMap = Collections.emptyMap(); private static final Logger logger = LoggerFactory.getLogger(RelatedContentHelper.class);
protected volatile Map<String, Pair<Map<String, String>, List<Pair<Pattern, String>>>> relatedContentMap = Collections.emptyMap();
protected String regexPrefix = "regex:";
protected String queryPlaceHolder = "__QUERY__";
@PostConstruct @PostConstruct
public void init() { public void init() {
...@@ -52,15 +63,24 @@ public class RelatedContentHelper { ...@@ -52,15 +63,24 @@ public class RelatedContentHelper {
} }
protected void reload() { protected void reload() {
final Map<String, Map<String, String>> relatedContentMap = new HashMap<>(); final Map<String, Pair<Map<String, String>, List<Pair<Pattern, String>>>> relatedContentMap = new HashMap<>();
getAvailableRelatedContentList().stream().forEach(entity -> { getAvailableRelatedContentList().stream().forEach(entity -> {
final String key = getHostKey(entity); final String key = getHostKey(entity);
Map<String, String> map = relatedContentMap.get(key); Pair<Map<String, String>, List<Pair<Pattern, String>>> pair = relatedContentMap.get(key);
if (map == null) { if (pair == null) {
map = new HashMap<>(); pair = new Pair<>(new HashMap<>(), new ArrayList<>());
relatedContentMap.put(key, map); relatedContentMap.put(key, pair);
}
if (entity.getTerm().startsWith(regexPrefix)) {
String regex = entity.getTerm().substring(regexPrefix.length());
if (StringUtil.isBlank(regex)) {
logger.warn("Unknown regex pattern: " + entity.getTerm());
} else {
pair.getSecond().add(new Pair<>(Pattern.compile(regex), entity.getContent()));
}
} else {
pair.getFirst().put(toLowerCase(entity.getTerm()), entity.getContent());
} }
map.put(toLowerCase(entity.getTerm()), entity.getContent());
}); });
this.relatedContentMap = relatedContentMap; this.relatedContentMap = relatedContentMap;
} }
...@@ -73,12 +93,17 @@ public class RelatedContentHelper { ...@@ -73,12 +93,17 @@ public class RelatedContentHelper {
public String getRelatedContent(final String query) { public String getRelatedContent(final String query) {
final FessConfig fessConfig = ComponentUtil.getFessConfig(); final FessConfig fessConfig = ComponentUtil.getFessConfig();
final String key = fessConfig.getVirtualHostKey(); final String key = fessConfig.getVirtualHostKey();
final Map<String, String> map = relatedContentMap.get(key); final Pair<Map<String, String>, List<Pair<Pattern, String>>> pair = relatedContentMap.get(key);
if (map != null) { if (pair != null) {
final String content = map.get(toLowerCase(query)); final String content = pair.getFirst().get(toLowerCase(query));
if (StringUtil.isNotBlank(content)) { if (StringUtil.isNotBlank(content)) {
return content; return content;
} }
for (final Pair<Pattern, String> regexData : pair.getSecond()) {
if (regexData.getFirst().matcher(query).matches()) {
return regexData.getSecond().replace(queryPlaceHolder, query);
}
}
} }
return StringUtil.EMPTY; return StringUtil.EMPTY;
} }
...@@ -87,4 +112,12 @@ public class RelatedContentHelper { ...@@ -87,4 +112,12 @@ public class RelatedContentHelper {
return term != null ? term.toLowerCase(Locale.ROOT) : term; return term != null ? term.toLowerCase(Locale.ROOT) : term;
} }
public void setRegexPrefix(String regexPrefix) {
this.regexPrefix = regexPrefix;
}
public void setQueryPlaceHolder(String queryPlaceHolder) {
this.queryPlaceHolder = queryPlaceHolder;
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment