diff --git a/src/main/java/org/codelibs/fess/app/web/admin/pathmap/CreateForm.java b/src/main/java/org/codelibs/fess/app/web/admin/pathmap/CreateForm.java index 5025b2cb8..db62d81af 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/pathmap/CreateForm.java +++ b/src/main/java/org/codelibs/fess/app/web/admin/pathmap/CreateForm.java @@ -59,6 +59,9 @@ public class CreateForm { @ValidateTypeFailure public Long createdTime; + @Required + public String userAgent; + public void initialize() { crudMode = CrudMode.CREATE; sortOrder = 0; diff --git a/src/main/java/org/codelibs/fess/es/config/exentity/PathMapping.java b/src/main/java/org/codelibs/fess/es/config/exentity/PathMapping.java index caaec1449..41fcc7c86 100644 --- a/src/main/java/org/codelibs/fess/es/config/exentity/PathMapping.java +++ b/src/main/java/org/codelibs/fess/es/config/exentity/PathMapping.java @@ -18,6 +18,7 @@ package org.codelibs.fess.es.config.exentity; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.codelibs.core.lang.StringUtil; import org.codelibs.fess.es.config.bsentity.BsPathMapping; /** @@ -29,6 +30,8 @@ public class PathMapping extends BsPathMapping { private Pattern regexPattern; + private Pattern userAgentPattern; + public String getId() { return asDocMeta().id(); } @@ -52,10 +55,25 @@ public class PathMapping extends BsPathMapping { return regexPattern.matcher(input); } + public boolean hasUAMathcer() { + return StringUtil.isNotBlank(getUserAgent()); + } + + public Matcher getUAMatcher(final CharSequence input) { + if (!hasUAMathcer()) { + return null; + } + + if (userAgentPattern == null) { + userAgentPattern = Pattern.compile(getUserAgent()); + } + return userAgentPattern.matcher(input); + } + @Override public String toString() { return "PathMapping [regexPattern=" + regexPattern + ", createdBy=" + createdBy + ", createdTime=" + createdTime + ", processType=" - + processType + ", regex=" + regex + ", replacement=" + replacement + ", sortOrder=" + sortOrder + ", updatedBy=" - + updatedBy + ", updatedTime=" + updatedTime + ", docMeta=" + docMeta + "]"; + + processType + ", regex=" + regex + ", replacement=" + replacement + ", sortOrder=" + sortOrder + ", userAgent=" + + userAgent + ", updatedBy=" + updatedBy + ", updatedTime=" + updatedTime + ", docMeta=" + docMeta + "]"; } } diff --git a/src/main/java/org/codelibs/fess/helper/PathMappingHelper.java b/src/main/java/org/codelibs/fess/helper/PathMappingHelper.java index 8e25d45ad..0403f47df 100644 --- a/src/main/java/org/codelibs/fess/helper/PathMappingHelper.java +++ b/src/main/java/org/codelibs/fess/helper/PathMappingHelper.java @@ -22,11 +22,14 @@ import java.util.Map; import java.util.regex.Matcher; import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; +import org.codelibs.core.lang.StringUtil; import org.codelibs.fess.Constants; import org.codelibs.fess.es.config.exbhv.PathMappingBhv; import org.codelibs.fess.es.config.exentity.PathMapping; import org.codelibs.fess.util.ComponentUtil; +import org.lastaflute.web.util.LaRequestUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -95,7 +98,10 @@ public class PathMappingHelper { } String result = text; for (final PathMapping pathMapping : cachedPathMappingList) { - result = result.replaceAll("(\"[^\"]*)" + pathMapping.getRegex() + "([^\"]*\")", "$1" + pathMapping.getReplacement() + "$2"); + if (matchUserAgent(pathMapping)) { + result = + result.replaceAll("(\"[^\"]*)" + pathMapping.getRegex() + "([^\"]*\")", "$1" + pathMapping.getReplacement() + "$2"); + } } return result; } @@ -114,11 +120,42 @@ public class PathMappingHelper { private String replaceUrl(final List pathMappingList, final String url) { String newUrl = url; for (final PathMapping pathMapping : pathMappingList) { - final Matcher matcher = pathMapping.getMatcher(newUrl); - if (matcher.find()) { - newUrl = matcher.replaceAll(pathMapping.getReplacement()); + if (matchUserAgent(pathMapping)) { + final Matcher matcher = pathMapping.getMatcher(newUrl); + if (matcher.find()) { + newUrl = matcher.replaceAll(pathMapping.getReplacement()); + } } } return newUrl; } + + private boolean matchUserAgent(final PathMapping pathMapping) { + if (!pathMapping.hasUAMathcer()) { + return true; + } + + //TODO use OptionalThing + final HttpServletRequest request; + try { + request = LaRequestUtil.getRequest(); + } catch (IllegalStateException e) { + //could not get request. + return false; + } + /* + final OptionalThing op = LaRequestUtil.getOptionalRequest(); + if (!op.isPresent()) { + return false; + } + final HttpServletRequest request = op.get(); + */ + + final String userAgent = request.getHeader("user-agent"); + if (StringUtil.isBlank(userAgent)) { + return false; + } + + return pathMapping.getUAMatcher(userAgent).find(); + } } diff --git a/src/main/webapp/WEB-INF/view/admin/pathmap/admin_pathmap_details.jsp b/src/main/webapp/WEB-INF/view/admin/pathmap/admin_pathmap_details.jsp index 5a4fe2ec0..c47d88620 100644 --- a/src/main/webapp/WEB-INF/view/admin/pathmap/admin_pathmap_details.jsp +++ b/src/main/webapp/WEB-INF/view/admin/pathmap/admin_pathmap_details.jsp @@ -72,6 +72,10 @@ ${f:h(sortOrder)} + + + ${f:h(userAgent)} + diff --git a/src/main/webapp/WEB-INF/view/admin/pathmap/admin_pathmap_edit.jsp b/src/main/webapp/WEB-INF/view/admin/pathmap/admin_pathmap_edit.jsp index 43a03d3ab..3a7397c9e 100644 --- a/src/main/webapp/WEB-INF/view/admin/pathmap/admin_pathmap_edit.jsp +++ b/src/main/webapp/WEB-INF/view/admin/pathmap/admin_pathmap_edit.jsp @@ -88,6 +88,13 @@ min="0" max="100000"> +
+ +
+ + +
+