Added CI src files
This commit is contained in:
parent
678359d03e
commit
aa1a1c78e8
200
5.Code Inspection/src/ProductConfigItemContentWrapper.java
Normal file
200
5.Code Inspection/src/ProductConfigItemContentWrapper.java
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.apache.ofbiz.product.config;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import org.apache.ofbiz.base.util.Debug;
|
||||||
|
import org.apache.ofbiz.base.util.GeneralException;
|
||||||
|
import org.apache.ofbiz.base.util.StringUtil;
|
||||||
|
import org.apache.ofbiz.base.util.StringUtil.StringWrapper;
|
||||||
|
import org.apache.ofbiz.base.util.UtilCodec;
|
||||||
|
import org.apache.ofbiz.base.util.UtilHttp;
|
||||||
|
import org.apache.ofbiz.base.util.UtilValidate;
|
||||||
|
import org.apache.ofbiz.base.util.cache.UtilCache;
|
||||||
|
import org.apache.ofbiz.content.content.ContentWorker;
|
||||||
|
import org.apache.ofbiz.content.content.ContentWrapper;
|
||||||
|
import org.apache.ofbiz.entity.Delegator;
|
||||||
|
import org.apache.ofbiz.entity.DelegatorFactory;
|
||||||
|
import org.apache.ofbiz.entity.GenericValue;
|
||||||
|
import org.apache.ofbiz.entity.model.ModelEntity;
|
||||||
|
import org.apache.ofbiz.entity.model.ModelUtil;
|
||||||
|
import org.apache.ofbiz.entity.util.EntityQuery;
|
||||||
|
import org.apache.ofbiz.entity.util.EntityUtilProperties;
|
||||||
|
import org.apache.ofbiz.service.LocalDispatcher;
|
||||||
|
import org.apache.ofbiz.service.ServiceContainer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Product Config Item Content Worker: gets product content to display
|
||||||
|
*/
|
||||||
|
public class ProductConfigItemContentWrapper implements ContentWrapper {
|
||||||
|
|
||||||
|
public static final String module = ProductConfigItemContentWrapper.class.getName();
|
||||||
|
public static final String SEPARATOR = "::"; // cache key separator
|
||||||
|
private static final UtilCache<String, String> configItemContentCache = UtilCache.createUtilCache("configItem.content", true); // use soft reference to free up memory if needed
|
||||||
|
|
||||||
|
protected transient LocalDispatcher dispatcher;
|
||||||
|
protected String dispatcherName;
|
||||||
|
protected transient Delegator delegator;
|
||||||
|
protected String delegatorName;
|
||||||
|
protected GenericValue productConfigItem;
|
||||||
|
protected Locale locale;
|
||||||
|
protected String mimeTypeId;
|
||||||
|
|
||||||
|
|
||||||
|
public static ProductConfigItemContentWrapper makeProductConfigItemContentWrapper(GenericValue productConfigItem, HttpServletRequest request) {
|
||||||
|
return new ProductConfigItemContentWrapper(productConfigItem, request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductConfigItemContentWrapper(LocalDispatcher dispatcher, GenericValue productConfigItem, Locale locale, String mimeTypeId) {
|
||||||
|
this.dispatcher = dispatcher;
|
||||||
|
this.dispatcherName = dispatcher.getName();
|
||||||
|
this.delegator = productConfigItem.getDelegator();
|
||||||
|
this.delegatorName = delegator.getDelegatorName();
|
||||||
|
this.productConfigItem = productConfigItem;
|
||||||
|
this.locale = locale;
|
||||||
|
this.mimeTypeId = mimeTypeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductConfigItemContentWrapper(GenericValue productConfigItem, HttpServletRequest request) {
|
||||||
|
this.dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
|
||||||
|
this.dispatcherName = dispatcher.getName();
|
||||||
|
this.delegator = (Delegator) request.getAttribute("delegator");
|
||||||
|
this.delegatorName = delegator.getDelegatorName();
|
||||||
|
this.productConfigItem = productConfigItem;
|
||||||
|
this.locale = UtilHttp.getLocale(request);
|
||||||
|
this.mimeTypeId = EntityUtilProperties.getPropertyValue("content", "defaultMimeType", "text/html; charset=utf-8", this.delegator);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringWrapper get(String confItemContentTypeId, String encoderType) {
|
||||||
|
return StringUtil.makeStringWrapper(getProductConfigItemContentAsText(productConfigItem, confItemContentTypeId, locale, mimeTypeId, getDelegator(), getDispatcher(), encoderType));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Delegator getDelegator() {
|
||||||
|
if (delegator == null) {
|
||||||
|
delegator = DelegatorFactory.getDelegator(delegatorName);
|
||||||
|
}
|
||||||
|
return delegator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDispatcher getDispatcher() {
|
||||||
|
if (dispatcher == null) {
|
||||||
|
dispatcher = ServiceContainer.getLocalDispatcher(dispatcherName, this.getDelegator());
|
||||||
|
}
|
||||||
|
return dispatcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getProductConfigItemContentAsText(GenericValue productConfigItem, String confItemContentTypeId, HttpServletRequest request, String encoderType) {
|
||||||
|
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
|
||||||
|
String mimeTypeId = EntityUtilProperties.getPropertyValue("content", "defaultMimeType", "text/html; charset=utf-8", productConfigItem.getDelegator());
|
||||||
|
return getProductConfigItemContentAsText(productConfigItem, confItemContentTypeId, UtilHttp.getLocale(request), mimeTypeId, productConfigItem.getDelegator(), dispatcher, encoderType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getProductConfigItemContentAsText(GenericValue productConfigItem, String confItemContentTypeId, Locale locale, LocalDispatcher dispatcher, String encoderType) {
|
||||||
|
return getProductConfigItemContentAsText(productConfigItem, confItemContentTypeId, locale, null, null, dispatcher, encoderType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getProductConfigItemContentAsText(GenericValue productConfigItem, String confItemContentTypeId, Locale locale, String mimeTypeId, Delegator delegator, LocalDispatcher dispatcher, String encoderType) {
|
||||||
|
UtilCodec.SimpleEncoder encoder = UtilCodec.getEncoder(encoderType);
|
||||||
|
String candidateFieldName = ModelUtil.dbNameToVarName(confItemContentTypeId);
|
||||||
|
String cacheKey = confItemContentTypeId + SEPARATOR + locale + SEPARATOR + mimeTypeId + SEPARATOR + productConfigItem.get("configItemId") + SEPARATOR + encoderType + SEPARATOR + delegator;
|
||||||
|
try {
|
||||||
|
String cachedValue = configItemContentCache.get(cacheKey);
|
||||||
|
if (cachedValue != null) {
|
||||||
|
return cachedValue;
|
||||||
|
}
|
||||||
|
Writer outWriter = new StringWriter();
|
||||||
|
getProductConfigItemContentAsText(null, productConfigItem, confItemContentTypeId, locale, mimeTypeId, delegator, dispatcher, outWriter, false);
|
||||||
|
String outString = outWriter.toString();
|
||||||
|
if (UtilValidate.isEmpty(outString)) {
|
||||||
|
outString = productConfigItem.getModelEntity().isField(candidateFieldName) ? productConfigItem.getString(candidateFieldName): "";
|
||||||
|
outString = outString == null? "" : outString;
|
||||||
|
}
|
||||||
|
outString = encoder.sanitize(outString);
|
||||||
|
if (configItemContentCache != null) {
|
||||||
|
configItemContentCache.put(cacheKey, outString);
|
||||||
|
}
|
||||||
|
return outString;
|
||||||
|
} catch (GeneralException e) {
|
||||||
|
Debug.logError(e, "Error rendering ProdConfItemContent, inserting empty String", module);
|
||||||
|
String candidateOut = productConfigItem.getModelEntity().isField(candidateFieldName) ? productConfigItem.getString(candidateFieldName): "";
|
||||||
|
return candidateOut == null? "" : encoder.sanitize(candidateOut);
|
||||||
|
} catch (IOException e) {
|
||||||
|
Debug.logError(e, "Error rendering ProdConfItemContent, inserting empty String", module);
|
||||||
|
String candidateOut = productConfigItem.getModelEntity().isField(candidateFieldName) ? productConfigItem.getString(candidateFieldName): "";
|
||||||
|
return candidateOut == null? "" : encoder.sanitize(candidateOut);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void getProductConfigItemContentAsText(String configItemId, GenericValue productConfigItem, String confItemContentTypeId, Locale locale, String mimeTypeId, Delegator delegator, LocalDispatcher dispatcher, Writer outWriter) throws GeneralException, IOException {
|
||||||
|
getProductConfigItemContentAsText(configItemId, productConfigItem, confItemContentTypeId, locale, mimeTypeId, delegator, dispatcher, outWriter, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void getProductConfigItemContentAsText(String configItemId, GenericValue productConfigItem, String confItemContentTypeId, Locale locale, String mimeTypeId, Delegator delegator, LocalDispatcher dispatcher, Writer outWriter, boolean cache) throws GeneralException, IOException {
|
||||||
|
if (configItemId == null && productConfigItem != null) {
|
||||||
|
configItemId = productConfigItem.getString("configItemId");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delegator == null && productConfigItem != null) {
|
||||||
|
delegator = productConfigItem.getDelegator();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UtilValidate.isEmpty(mimeTypeId)) {
|
||||||
|
mimeTypeId = EntityUtilProperties.getPropertyValue("content", "defaultMimeType", "text/html; charset=utf-8", delegator);
|
||||||
|
}
|
||||||
|
|
||||||
|
GenericValue productConfigItemContent = EntityQuery.use(delegator).from("ProdConfItemContent")
|
||||||
|
.where("configItemId", configItemId, "confItemContentTypeId", confItemContentTypeId)
|
||||||
|
.orderBy("-fromDate")
|
||||||
|
.cache(cache)
|
||||||
|
.filterByDate()
|
||||||
|
.queryFirst();
|
||||||
|
if (productConfigItemContent != null) {
|
||||||
|
// when rendering the product config item content, always include the ProductConfigItem and ProdConfItemContent records that this comes from
|
||||||
|
Map<String, Object> inContext = new HashMap<String, Object>();
|
||||||
|
inContext.put("productConfigItem", productConfigItem);
|
||||||
|
inContext.put("productConfigItemContent", productConfigItemContent);
|
||||||
|
ContentWorker.renderContentAsText(dispatcher, delegator, productConfigItemContent.getString("contentId"), outWriter, inContext, locale, mimeTypeId, null, null, cache);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String candidateFieldName = ModelUtil.dbNameToVarName(confItemContentTypeId);
|
||||||
|
ModelEntity productConfigItemModel = delegator.getModelEntity("ProductConfigItem");
|
||||||
|
if (productConfigItemModel.isField(candidateFieldName)) {
|
||||||
|
if (productConfigItem == null) {
|
||||||
|
productConfigItem = EntityQuery.use(delegator).from("ProductConfigItem").where("configItemId", configItemId).cache().queryOne();
|
||||||
|
}
|
||||||
|
if (productConfigItem != null) {
|
||||||
|
String candidateValue = productConfigItem.getString(candidateFieldName);
|
||||||
|
if (UtilValidate.isNotEmpty(candidateValue)) {
|
||||||
|
outWriter.write(candidateValue);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
189
5.Code Inspection/src/SeoTransform.java
Normal file
189
5.Code Inspection/src/SeoTransform.java
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.apache.ofbiz.product.category.ftl;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.servlet.http.HttpSession;
|
||||||
|
|
||||||
|
import org.apache.oro.text.regex.Pattern;
|
||||||
|
import org.apache.oro.text.regex.Perl5Matcher;
|
||||||
|
import org.apache.ofbiz.base.util.Debug;
|
||||||
|
import org.apache.ofbiz.entity.GenericValue;
|
||||||
|
import org.apache.ofbiz.product.category.SeoConfigUtil;
|
||||||
|
import org.apache.ofbiz.webapp.control.RequestHandler;
|
||||||
|
|
||||||
|
import freemarker.core.Environment;
|
||||||
|
import freemarker.ext.beans.BeanModel;
|
||||||
|
import freemarker.template.SimpleScalar;
|
||||||
|
import freemarker.template.TemplateScalarModel;
|
||||||
|
import freemarker.template.TemplateTransformModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SeoTransform - Freemarker Transform for URLs (links)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class SeoTransform implements TemplateTransformModel {
|
||||||
|
|
||||||
|
private static final String module = SeoTransform.class.getName();
|
||||||
|
|
||||||
|
public boolean checkArg(Map args, String key, boolean defaultValue) {
|
||||||
|
if (!args.containsKey(key)) {
|
||||||
|
return defaultValue;
|
||||||
|
} else {
|
||||||
|
Object o = args.get(key);
|
||||||
|
if (o instanceof SimpleScalar) {
|
||||||
|
SimpleScalar s = (SimpleScalar) o;
|
||||||
|
return "true".equalsIgnoreCase(s.getAsString());
|
||||||
|
}
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Writer getWriter(final Writer out, Map args) {
|
||||||
|
final StringBuffer buf = new StringBuffer();
|
||||||
|
final boolean fullPath = checkArg(args, "fullPath", false);
|
||||||
|
final boolean secure = checkArg(args, "secure", false);
|
||||||
|
final boolean encode = checkArg(args, "encode", true);
|
||||||
|
|
||||||
|
return new Writer(out) {
|
||||||
|
|
||||||
|
public void write(char cbuf[], int off, int len) {
|
||||||
|
buf.append(cbuf, off, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void flush() throws IOException {
|
||||||
|
out.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() throws IOException {
|
||||||
|
try {
|
||||||
|
Environment env = Environment.getCurrentEnvironment();
|
||||||
|
BeanModel req = (BeanModel) env.getVariable("request");
|
||||||
|
BeanModel res = (BeanModel) env.getVariable("response");
|
||||||
|
Object prefix = env.getVariable("urlPrefix");
|
||||||
|
if (req != null) {
|
||||||
|
HttpServletRequest request = (HttpServletRequest) req.getWrappedObject();
|
||||||
|
ServletContext ctx = (ServletContext) request.getAttribute("servletContext");
|
||||||
|
HttpServletResponse response = null;
|
||||||
|
if (res != null) {
|
||||||
|
response = (HttpServletResponse) res.getWrappedObject();
|
||||||
|
}
|
||||||
|
HttpSession session = request.getSession();
|
||||||
|
GenericValue userLogin = (GenericValue) session.getAttribute("userLogin");
|
||||||
|
|
||||||
|
// anonymous shoppers are not logged in
|
||||||
|
if (userLogin != null && "anonymous".equals(userLogin.getString("userLoginId"))) {
|
||||||
|
userLogin = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
RequestHandler rh = (RequestHandler) ctx.getAttribute("_REQUEST_HANDLER_");
|
||||||
|
out.write(seoUrl(rh.makeLink(request, response, buf.toString(), fullPath, secure, encode), userLogin == null));
|
||||||
|
} else if (prefix != null) {
|
||||||
|
if (prefix instanceof TemplateScalarModel) {
|
||||||
|
TemplateScalarModel s = (TemplateScalarModel) prefix;
|
||||||
|
String prefixString = s.getAsString();
|
||||||
|
String bufString = buf.toString();
|
||||||
|
boolean prefixSlash = prefixString.endsWith("/");
|
||||||
|
boolean bufSlash = bufString.startsWith("/");
|
||||||
|
if (prefixSlash && bufSlash) {
|
||||||
|
bufString = bufString.substring(1);
|
||||||
|
} else if (!prefixSlash && !bufSlash) {
|
||||||
|
bufString = "/" + bufString;
|
||||||
|
}
|
||||||
|
out.write(prefixString + bufString);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.write(buf.toString());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new IOException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform a url according to seo pattern regular expressions.
|
||||||
|
*
|
||||||
|
* @param url , String to do the seo transform
|
||||||
|
* @param isAnon , boolean to indicate whether it's an anonymous visit.
|
||||||
|
*
|
||||||
|
* @return String, the transformed url.
|
||||||
|
*/
|
||||||
|
public static String seoUrl(String url, boolean isAnon) {
|
||||||
|
Perl5Matcher matcher = new Perl5Matcher();
|
||||||
|
if (SeoConfigUtil.checkUseUrlRegexp() && matcher.matches(url, SeoConfigUtil.getGeneralRegexpPattern())) {
|
||||||
|
Iterator<String> keys = SeoConfigUtil.getSeoPatterns().keySet().iterator();
|
||||||
|
boolean foundMatch = false;
|
||||||
|
while (keys.hasNext()) {
|
||||||
|
String key = keys.next();
|
||||||
|
Pattern pattern = SeoConfigUtil.getSeoPatterns().get(key);
|
||||||
|
if (pattern.getPattern().contains(";jsessionid=")) {
|
||||||
|
if (isAnon) {
|
||||||
|
if (SeoConfigUtil.isJSessionIdAnonEnabled()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (SeoConfigUtil.isJSessionIdUserEnabled()) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
boolean foundException = false;
|
||||||
|
for (int i = 0; i < SeoConfigUtil.getUserExceptionPatterns().size(); i++) {
|
||||||
|
if (matcher.matches(url, SeoConfigUtil.getUserExceptionPatterns().get(i))) {
|
||||||
|
foundException = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (foundException) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String replacement = SeoConfigUtil.getSeoReplacements().get(key);
|
||||||
|
if (matcher.matches(url, pattern)) {
|
||||||
|
for (int i = 1; i < matcher.getMatch().groups(); i++) {
|
||||||
|
replacement = replacement.replaceAll("\\$" + i, matcher.getMatch().group(i));
|
||||||
|
}
|
||||||
|
// break if found any matcher
|
||||||
|
url = replacement;
|
||||||
|
foundMatch = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!foundMatch) {
|
||||||
|
Debug.logVerbose("Can NOT find a seo transform pattern for this url: " + url, module);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
if (!SeoConfigUtil.isInitialed()) {
|
||||||
|
SeoConfigUtil.init();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
231
5.Code Inspection/src/UrlRegexpTransform.java
Normal file
231
5.Code Inspection/src/UrlRegexpTransform.java
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.apache.ofbiz.product.category.ftl;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.servlet.http.HttpSession;
|
||||||
|
|
||||||
|
import org.apache.oro.text.regex.Pattern;
|
||||||
|
import org.apache.oro.text.regex.Perl5Matcher;
|
||||||
|
import org.apache.ofbiz.base.util.Debug;
|
||||||
|
import org.apache.ofbiz.entity.GenericValue;
|
||||||
|
import org.apache.ofbiz.product.category.SeoConfigUtil;
|
||||||
|
import org.apache.ofbiz.webapp.control.RequestHandler;
|
||||||
|
|
||||||
|
import freemarker.core.Environment;
|
||||||
|
import freemarker.ext.beans.BeanModel;
|
||||||
|
import freemarker.template.SimpleScalar;
|
||||||
|
import freemarker.template.TemplateScalarModel;
|
||||||
|
import freemarker.template.TemplateTransformModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UrlRegexpTransform - Freemarker Transform for Products URLs (links)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class UrlRegexpTransform implements TemplateTransformModel {
|
||||||
|
|
||||||
|
private static final String module = UrlRegexpTransform.class.getName();
|
||||||
|
|
||||||
|
public boolean checkArg(Map args, String key, boolean defaultValue) {
|
||||||
|
if (!args.containsKey(key)) {
|
||||||
|
return defaultValue;
|
||||||
|
} else {
|
||||||
|
Object o = args.get(key);
|
||||||
|
if (o instanceof SimpleScalar) {
|
||||||
|
SimpleScalar s = (SimpleScalar) o;
|
||||||
|
return "true".equalsIgnoreCase(s.getAsString());
|
||||||
|
}
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Writer getWriter(final Writer out, Map args) {
|
||||||
|
final StringBuffer buf = new StringBuffer();
|
||||||
|
final boolean fullPath = checkArg(args, "fullPath", false);
|
||||||
|
final boolean secure = checkArg(args, "secure", false);
|
||||||
|
final boolean encode = checkArg(args, "encode", true);
|
||||||
|
|
||||||
|
return new Writer(out) {
|
||||||
|
|
||||||
|
public void write(char cbuf[], int off, int len) {
|
||||||
|
buf.append(cbuf, off, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void flush() throws IOException {
|
||||||
|
out.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() throws IOException {
|
||||||
|
try {
|
||||||
|
Environment env = Environment.getCurrentEnvironment();
|
||||||
|
BeanModel req = (BeanModel) env.getVariable("request");
|
||||||
|
BeanModel res = (BeanModel) env.getVariable("response");
|
||||||
|
Object prefix = env.getVariable("urlPrefix");
|
||||||
|
if (req != null) {
|
||||||
|
HttpServletRequest request = (HttpServletRequest) req.getWrappedObject();
|
||||||
|
ServletContext ctx = (ServletContext) request.getAttribute("servletContext");
|
||||||
|
HttpServletResponse response = null;
|
||||||
|
if (res != null) {
|
||||||
|
response = (HttpServletResponse) res.getWrappedObject();
|
||||||
|
}
|
||||||
|
HttpSession session = request.getSession();
|
||||||
|
GenericValue userLogin = (GenericValue) session.getAttribute("userLogin");
|
||||||
|
|
||||||
|
// anonymous shoppers are not logged in
|
||||||
|
if (userLogin != null && "anonymous".equals(userLogin.getString("userLoginId"))) {
|
||||||
|
userLogin = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
RequestHandler rh = (RequestHandler) ctx.getAttribute("_REQUEST_HANDLER_");
|
||||||
|
out.write(seoUrl(rh.makeLink(request, response, buf.toString(), fullPath, secure || request.isSecure() , encode), userLogin == null));
|
||||||
|
} else if (prefix != null) {
|
||||||
|
if (prefix instanceof TemplateScalarModel) {
|
||||||
|
TemplateScalarModel s = (TemplateScalarModel) prefix;
|
||||||
|
String prefixString = s.getAsString();
|
||||||
|
String bufString = buf.toString();
|
||||||
|
boolean prefixSlash = prefixString.endsWith("/");
|
||||||
|
boolean bufSlash = bufString.startsWith("/");
|
||||||
|
if (prefixSlash && bufSlash) {
|
||||||
|
bufString = bufString.substring(1);
|
||||||
|
} else if (!prefixSlash && !bufSlash) {
|
||||||
|
bufString = "/" + bufString;
|
||||||
|
}
|
||||||
|
out.write(prefixString + bufString);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.write(buf.toString());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new IOException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform a url according to seo pattern regular expressions.
|
||||||
|
*
|
||||||
|
* @param url
|
||||||
|
* , String to do the seo transform
|
||||||
|
* @param isAnon
|
||||||
|
* , boolean to indicate whether it's an anonymous visit.
|
||||||
|
*
|
||||||
|
* @return String, the transformed url.
|
||||||
|
*/
|
||||||
|
public static String seoUrl(String url, boolean isAnon) {
|
||||||
|
Perl5Matcher matcher = new Perl5Matcher();
|
||||||
|
if (SeoConfigUtil.checkUseUrlRegexp() && matcher.matches(url, SeoConfigUtil.getGeneralRegexpPattern())) {
|
||||||
|
Iterator<String> keys = SeoConfigUtil.getSeoPatterns().keySet().iterator();
|
||||||
|
boolean foundMatch = false;
|
||||||
|
while (keys.hasNext()) {
|
||||||
|
String key = keys.next();
|
||||||
|
Pattern pattern = SeoConfigUtil.getSeoPatterns().get(key);
|
||||||
|
if (pattern.getPattern().contains(";jsessionid=")) {
|
||||||
|
if (isAnon) {
|
||||||
|
if (SeoConfigUtil.isJSessionIdAnonEnabled()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (SeoConfigUtil.isJSessionIdUserEnabled()) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
boolean foundException = false;
|
||||||
|
for (int i = 0; i < SeoConfigUtil.getUserExceptionPatterns().size(); i++) {
|
||||||
|
if (matcher.matches(url, SeoConfigUtil.getUserExceptionPatterns().get(i))) {
|
||||||
|
foundException = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (foundException) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String replacement = SeoConfigUtil.getSeoReplacements().get(key);
|
||||||
|
if (matcher.matches(url, pattern)) {
|
||||||
|
for (int i = 1; i < matcher.getMatch().groups(); i++) {
|
||||||
|
replacement = replacement.replaceAll("\\$" + i, matcher.getMatch().group(i));
|
||||||
|
}
|
||||||
|
// break if found any matcher
|
||||||
|
url = replacement;
|
||||||
|
foundMatch = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!foundMatch) {
|
||||||
|
Debug.logVerbose("Can NOT find a seo transform pattern for this url: " + url, module);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
SeoConfigUtil.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Forward a uri according to forward pattern regular expressions. Note: this is developed for Filter usage.
|
||||||
|
*
|
||||||
|
* @param uri
|
||||||
|
* String to reverse transform
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public static boolean forwardUri(HttpServletResponse response, String uri) {
|
||||||
|
Perl5Matcher matcher = new Perl5Matcher();
|
||||||
|
boolean foundMatch = false;
|
||||||
|
Integer responseCodeInt = null;
|
||||||
|
if (SeoConfigUtil.checkUseUrlRegexp() && SeoConfigUtil.getSeoPatterns() != null && SeoConfigUtil.getForwardReplacements() != null) {
|
||||||
|
Iterator<String> keys = SeoConfigUtil.getSeoPatterns().keySet().iterator();
|
||||||
|
while (keys.hasNext()) {
|
||||||
|
String key = keys.next();
|
||||||
|
Pattern pattern = SeoConfigUtil.getSeoPatterns().get(key);
|
||||||
|
String replacement = SeoConfigUtil.getForwardReplacements().get(key);
|
||||||
|
if (matcher.matches(uri, pattern)) {
|
||||||
|
for (int i = 1; i < matcher.getMatch().groups(); i++) {
|
||||||
|
replacement = replacement.replaceAll("\\$" + i, matcher.getMatch().group(i));
|
||||||
|
}
|
||||||
|
// break if found any matcher
|
||||||
|
uri = replacement;
|
||||||
|
responseCodeInt = SeoConfigUtil.getForwardResponseCodes().get(key);
|
||||||
|
foundMatch = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (foundMatch) {
|
||||||
|
if (responseCodeInt == null) {
|
||||||
|
response.setStatus(SeoConfigUtil.getDefaultResponseCode());
|
||||||
|
} else {
|
||||||
|
response.setStatus(responseCodeInt.intValue());
|
||||||
|
}
|
||||||
|
response.setHeader("Location", uri);
|
||||||
|
} else {
|
||||||
|
Debug.logInfo("Can NOT forward this url: " + uri, module);
|
||||||
|
}
|
||||||
|
return foundMatch;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user