in applications/product/src/main/java/org/apache/ofbiz/product/category/CatalogUrlFilter.java [75:360]
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
Delegator delegator = (Delegator) httpRequest.getSession().getServletContext().getAttribute("delegator");
// set initial parameters
String initDefaultLocalesString = config.getInitParameter("defaultLocaleString");
String initRedirectUrl = config.getInitParameter("redirectUrl");
setDefaultLocaleString(UtilValidate.isNotEmpty(initDefaultLocalesString) ? initDefaultLocalesString : "");
setRedirectUrl(UtilValidate.isNotEmpty(initRedirectUrl) ? initRedirectUrl : "");
String pathInfo = httpRequest.getServletPath();
if (UtilValidate.isNotEmpty(pathInfo)) {
List<String> pathElements = StringUtil.split(pathInfo, "/");
String alternativeUrl = pathElements.get(0);
String productId = null;
String productCategoryId = null;
String urlContentId = null;
try {
// look for productId
if (alternativeUrl.endsWith("-p")) {
List<EntityCondition> productContentConds = new LinkedList<>();
productContentConds.add(EntityCondition.makeCondition("productContentTypeId", "ALTERNATIVE_URL"));
productContentConds.add(EntityUtil.getFilterByDateExpr());
List<GenericValue> productContentInfos = EntityQuery.use(delegator).from("ProductContentAndInfo").where(productContentConds)
.orderBy("-fromDate").cache(true).queryList();
if (UtilValidate.isNotEmpty(productContentInfos)) {
for (GenericValue productContentInfo : productContentInfos) {
String contentId = (String) productContentInfo.get("contentId");
List<GenericValue> contentAssocDataResourceViewTos = EntityQuery.use(delegator).from("ContentAssocDataResourceViewTo")
.where("contentIdStart", contentId, "caContentAssocTypeId", "ALTERNATE_LOCALE", "drDataResourceTypeId",
"ELECTRONIC_TEXT").cache(true).queryList();
if (UtilValidate.isNotEmpty(contentAssocDataResourceViewTos)) {
for (GenericValue contentAssocDataResourceViewTo : contentAssocDataResourceViewTos) {
GenericValue electronicText = contentAssocDataResourceViewTo.getRelatedOne("ElectronicText", true);
if (electronicText != null) {
String textData = (String) electronicText.get("textData");
textData = UrlServletHelper.invalidCharacter(textData);
if (alternativeUrl.matches(textData + ".+$")) {
String productIdStr = null;
productIdStr = alternativeUrl.replace(textData + "-", "");
productIdStr = productIdStr.replace("-p", "");
String checkProductId = (String) productContentInfo.get("productId");
if (productIdStr.equalsIgnoreCase(checkProductId)) {
productId = checkProductId;
break;
}
}
}
}
}
if (UtilValidate.isEmpty(productId)) {
List<GenericValue> contentDataResourceViews = EntityQuery.use(delegator).from("ContentDataResourceView")
.where("contentId", contentId, "drDataResourceTypeId", "ELECTRONIC_TEXT").cache(true).queryList();
for (GenericValue contentDataResourceView : contentDataResourceViews) {
GenericValue electronicText = contentDataResourceView.getRelatedOne("ElectronicText", true);
if (UtilValidate.isNotEmpty(electronicText)) {
String textData = (String) electronicText.get("textData");
if (UtilValidate.isNotEmpty(textData)) {
textData = UrlServletHelper.invalidCharacter(textData);
if (alternativeUrl.matches(textData + ".+$")) {
String productIdStr = null;
productIdStr = alternativeUrl.replace(textData + "-", "");
productIdStr = productIdStr.replace("-p", "");
String checkProductId = (String) productContentInfo.get("productId");
if (productIdStr.equalsIgnoreCase(checkProductId)) {
productId = checkProductId;
break;
}
}
}
}
}
}
}
}
}
// look for productCategoryId
if (alternativeUrl.endsWith("-c")) {
List<EntityCondition> productCategoryContentConds = new LinkedList<>();
productCategoryContentConds.add(EntityCondition.makeCondition("prodCatContentTypeId", "ALTERNATIVE_URL"));
productCategoryContentConds.add(EntityUtil.getFilterByDateExpr());
List<GenericValue> productCategoryContentInfos = EntityQuery.use(delegator).from("ProductCategoryContentAndInfo")
.where(productCategoryContentConds).orderBy("-fromDate").cache(true).queryList();
if (UtilValidate.isNotEmpty(productCategoryContentInfos)) {
for (GenericValue productCategoryContentInfo : productCategoryContentInfos) {
String contentId = (String) productCategoryContentInfo.get("contentId");
List<GenericValue> contentAssocDataResourceViewTos = EntityQuery.use(delegator).from("ContentAssocDataResourceViewTo")
.where("contentIdStart", contentId, "caContentAssocTypeId", "ALTERNATE_LOCALE", "drDataResourceTypeId",
"ELECTRONIC_TEXT").cache(true).queryList();
if (UtilValidate.isNotEmpty(contentAssocDataResourceViewTos)) {
for (GenericValue contentAssocDataResourceViewTo : contentAssocDataResourceViewTos) {
GenericValue electronicText = contentAssocDataResourceViewTo.getRelatedOne("ElectronicText", true);
if (electronicText != null) {
String textData = (String) electronicText.get("textData");
if (UtilValidate.isNotEmpty(textData)) {
textData = UrlServletHelper.invalidCharacter(textData);
if (alternativeUrl.matches(textData + ".+$")) {
String productCategoryStr = null;
productCategoryStr = alternativeUrl.replace(textData + "-", "");
productCategoryStr = productCategoryStr.replace("-c", "");
String checkProductCategoryId = (String) productCategoryContentInfo.get("productCategoryId");
if (productCategoryStr.equalsIgnoreCase(checkProductCategoryId)) {
productCategoryId = checkProductCategoryId;
break;
}
}
}
}
}
}
if (UtilValidate.isEmpty(productCategoryId)) {
List<GenericValue> contentDataResourceViews = EntityQuery.use(delegator).from("ContentDataResourceView")
.where("contentId", contentId, "drDataResourceTypeId", "ELECTRONIC_TEXT").cache(true).queryList();
for (GenericValue contentDataResourceView : contentDataResourceViews) {
GenericValue electronicText = contentDataResourceView.getRelatedOne("ElectronicText", true);
if (electronicText != null) {
String textData = (String) electronicText.get("textData");
if (UtilValidate.isNotEmpty(textData)) {
textData = UrlServletHelper.invalidCharacter(textData);
if (alternativeUrl.matches(textData + ".+$")) {
String productCategoryStr = null;
productCategoryStr = alternativeUrl.replace(textData + "-", "");
productCategoryStr = productCategoryStr.replace("-c", "");
String checkProductCategoryId = (String) productCategoryContentInfo.get("productCategoryId");
if (productCategoryStr.equalsIgnoreCase(checkProductCategoryId)) {
productCategoryId = checkProductCategoryId;
break;
}
}
}
}
}
}
}
}
}
} catch (GenericEntityException e) {
Debug.logWarning("Cannot look for product and product category", MODULE);
}
// generate forward URL
StringBuilder urlBuilder = new StringBuilder();
urlBuilder.append("/" + WebAppUtil.CONTROL_MOUNT_POINT);
if (UtilValidate.isNotEmpty(productId)) {
try {
List<EntityCondition> conds = new LinkedList<>();
conds.add(EntityCondition.makeCondition("productId", productId));
conds.add(EntityUtil.getFilterByDateExpr());
List<GenericValue> productCategoryMembers = EntityQuery.use(delegator).select("productCategoryId").from("ProductCategoryMember")
.where(conds).orderBy("-fromDate").cache(true).queryList();
if (UtilValidate.isNotEmpty(productCategoryMembers)) {
GenericValue productCategoryMember = EntityUtil.getFirst(productCategoryMembers);
productCategoryId = productCategoryMember.getString("productCategoryId");
}
} catch (GenericEntityException e) {
Debug.logError(e, "Cannot find product category for product: " + productId, MODULE);
}
urlBuilder.append("/" + PRODUCT_REQUEST);
} else {
urlBuilder.append("/" + CATEGORY_REQUEST);
}
// generate trail belong to a top category
String topCategoryId = CategoryWorker.getCatalogTopCategory(httpRequest, null);
List<GenericValue> trailCategories = CategoryWorker.getRelatedCategoriesRet(httpRequest, "trailCategories",
topCategoryId, false, false, true);
List<String> trailCategoryIds = EntityUtil.getFieldListFromEntityList(trailCategories, "productCategoryId", true);
// look for productCategoryId from productId
if (UtilValidate.isNotEmpty(productId)) {
try {
List<EntityCondition> rolllupConds = new LinkedList<>();
rolllupConds.add(EntityCondition.makeCondition("productId", productId));
rolllupConds.add(EntityUtil.getFilterByDateExpr());
List<GenericValue> productCategoryMembers = EntityQuery.use(delegator).from("ProductCategoryMember").where(rolllupConds)
.orderBy("-fromDate").cache(true).queryList();
for (GenericValue productCategoryMember : productCategoryMembers) {
String trailCategoryId = productCategoryMember.getString("productCategoryId");
if (trailCategoryIds.contains(trailCategoryId)) {
productCategoryId = trailCategoryId;
break;
}
}
} catch (GenericEntityException e) {
Debug.logError(e, "Cannot generate trail from product category", MODULE);
}
}
// generate trail elements from productCategoryId
if (UtilValidate.isNotEmpty(productCategoryId)) {
List<String> trailElements = new LinkedList<>();
trailElements.add(productCategoryId);
String parentProductCategoryId = productCategoryId;
while (UtilValidate.isNotEmpty(parentProductCategoryId)) {
// find product category rollup
try {
List<EntityCondition> rolllupConds = new LinkedList<>();
rolllupConds.add(EntityCondition.makeCondition("productCategoryId", parentProductCategoryId));
rolllupConds.add(EntityUtil.getFilterByDateExpr());
List<GenericValue> productCategoryRollups = EntityQuery.use(delegator).from("ProductCategoryRollup").where(rolllupConds)
.orderBy("-fromDate").cache(true).queryList();
if (UtilValidate.isNotEmpty(productCategoryRollups)) {
// add only categories that belong to the top category to trail
for (GenericValue productCategoryRollup : productCategoryRollups) {
String trailCategoryId = productCategoryRollup.getString("parentProductCategoryId");
parentProductCategoryId = trailCategoryId;
if (trailCategoryIds.contains(trailCategoryId)) {
trailElements.add(trailCategoryId);
break;
}
}
} else {
parentProductCategoryId = null;
}
} catch (GenericEntityException e) {
Debug.logError(e, "Cannot generate trail from product category", MODULE);
}
}
Collections.reverse(trailElements);
List<String> trail = CategoryWorker.getTrail(httpRequest);
if (trail == null) {
trail = new LinkedList<>();
}
// adjust trail
String previousCategoryId = null;
if (!trail.isEmpty()) {
previousCategoryId = trail.get(trail.size() - 1);
}
trail = CategoryWorker.adjustTrail(trail, productCategoryId, previousCategoryId);
if (trailElements.size() == 1) {
CategoryWorker.setTrail(request, trailElements.get(0), null);
} else if (trailElements.size() == 2) {
CategoryWorker.setTrail(request, trailElements.get(1), trailElements.get(0));
} else if (trailElements.size() > 2) {
if (trail.contains(trailElements.get(0))) {
// first category is in the trail, so remove it everything after that and fill it in with the list from the pathInfo
int firstElementIndex = trail.indexOf(trailElements.get(0));
while (trail.size() > firstElementIndex) {
trail.remove(firstElementIndex);
}
trail.addAll(trailElements);
} else {
// first category is NOT in the trail, so clear out the trail and use the trailElements list
trail.clear();
trail.addAll(trailElements);
}
CategoryWorker.setTrail(request, trail);
}
request.setAttribute("productCategoryId", productCategoryId);
if (productId != null) {
request.setAttribute("product_id", productId);
request.setAttribute("productId", productId);
}
}
//Set view query parameters
UrlServletHelper.setViewQueryParameters(request, urlBuilder);
if (UtilValidate.isNotEmpty(productId) || UtilValidate.isNotEmpty(productCategoryId) || UtilValidate.isNotEmpty(urlContentId)) {
Debug.logInfo("[Filtered request]: " + pathInfo + " (" + urlBuilder + ")", MODULE);
RequestDispatcher dispatch = request.getRequestDispatcher(urlBuilder.toString());
dispatch.forward(request, response);
return;
}
//Check path alias
UrlServletHelper.checkPathAlias(request, httpResponse, delegator, pathInfo);
}
try {
String uriWithContext = httpRequest.getRequestURI();
String context = httpRequest.getContextPath();
String uri = uriWithContext.substring(context.length());
// support OFBizDynamicThresholdFilter in log4j2.xml
ThreadContext.put("uri", uri);
// we're done checking; continue on
chain.doFilter(request, response);
} finally {
ThreadContext.remove("uri");
}
}