/**
* Most of the code in the Qalingo project is copyrighted Hoteia and licensed
* under the Apache License Version 2.0 (release version 0.8.0)
* http://www.apache.org/licenses/LICENSE-2.0
*
* Copyright (c) Hoteia, 2012-2014
* http://www.hoteia.com - http://twitter.com/hoteia - contact@hoteia.com
*
*/
package org.hoteia.qalingo.core.service;
import java.net.URLEncoder;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.hoteia.qalingo.core.Constants;
import org.hoteia.qalingo.core.domain.Localization;
import org.hoteia.qalingo.core.domain.Market;
import org.hoteia.qalingo.core.domain.MarketArea;
import org.hoteia.qalingo.core.domain.MarketPlace;
import org.hoteia.qalingo.core.domain.Retailer;
import org.hoteia.qalingo.core.domain.enumtype.CommonUrls;
import org.hoteia.qalingo.core.i18n.enumtype.I18nKeyValueUniverse;
import org.hoteia.qalingo.core.i18n.enumtype.ScopeWebMessage;
import org.hoteia.qalingo.core.i18n.message.CoreMessageSource;
import org.hoteia.qalingo.core.util.CoreUtil;
import org.hoteia.qalingo.core.web.resolver.RequestData;
import org.springframework.beans.factory.annotation.Autowired;
public abstract class AbstractUrlService {
@Autowired
protected CoreMessageSource coreMessageSource;
@Autowired
protected EngineSettingService engineSettingService;
@Autowired
protected ReferentialDataService referentialDataService;
public abstract String generateUrl(final String urlWithoutWildcard, final boolean isEncoded, final boolean isSEO, final RequestData requestData, Object... params);
public String generateUrl(final CommonUrls url, final RequestData requestData, Object... params) {
return generateUrl(url.getUrlWithoutWildcard(), false, url.withPrefixSEO(), requestData, params);
}
public String generateRedirectUrl(final CommonUrls url, final RequestData requestData, Object... params) {
return generateUrl(url.getUrlWithoutWildcard(), true, url.withPrefixSEO(), requestData, params);
}
public String buildAbsoluteUrl(final RequestData requestData, final String relativeUrl) throws Exception {
if(relativeUrl != null){
final HttpServletRequest request = requestData.getRequest();
String cleanedRelativeUrl = relativeUrl.replace(buildDefaultPrefix(requestData), "");
String absoluteUrl = buildDomainePathUrl(requestData);
if (!cleanedRelativeUrl.startsWith("/")) {
absoluteUrl = absoluteUrl + "/" + cleanedRelativeUrl;
} else {
absoluteUrl = absoluteUrl + cleanedRelativeUrl;
}
if (request != null && !absoluteUrl.startsWith(request.getScheme() + "://")) {
absoluteUrl = request.getScheme() + "://" + absoluteUrl;
}
return absoluteUrl;
}
return relativeUrl;
}
public String cleanAbsoluteUrl(final RequestData requestData, String absoluteUrl) throws Exception {
final HttpServletRequest request = requestData.getRequest();
if(absoluteUrl != null && absoluteUrl.startsWith(request.getScheme())){
String domainePathUrl = buildDomainePathUrl(requestData);
absoluteUrl = absoluteUrl.replace(domainePathUrl, "");
}
return absoluteUrl;
}
// ALIAS FOR DOMAINE PATH
public String buildBaseUrl(final RequestData requestData) throws Exception {
return buildDomainePathUrl(requestData);
}
public String buildDomainePathUrl(final RequestData requestData) throws Exception {
final HttpServletRequest request = requestData.getRequest();
final MarketPlace marketPlace = requestData.getMarketPlace();
final Market market = requestData.getMarket();
final MarketArea marketArea = requestData.getMarketArea();
final String contextNameValue = requestData.getContextNameValue();
// CHOSE DOMAIN PATH FROM MARKET PLACE AND MARKET AND MARKET AREA
String domainePathUrl = "";
if (marketPlace != null) {
String domainName = marketPlace.getDomainName(contextNameValue);
if (StringUtils.isNotEmpty(domainName)) {
domainePathUrl = domainName;
}
}
if (market != null) {
String domainName = market.getDomainName(contextNameValue);
if (StringUtils.isNotEmpty(domainName)) {
domainePathUrl = domainName;
}
}
if (marketArea != null) {
String domainName = marketArea.getDomainName(contextNameValue);
if (StringUtils.isNotEmpty(domainName)) {
domainePathUrl = domainName;
}
}
if (request != null && StringUtils.isEmpty(domainePathUrl)) {
String requestUrl = request.getRequestURL().toString();
requestUrl = requestUrl.replace(request.getScheme() + "://", "");
String[] urlBlock = requestUrl.split("/");
domainePathUrl = urlBlock[0];
}
if (request != null && !domainePathUrl.startsWith(request.getScheme())) {
domainePathUrl = request.getScheme() + "://" + domainePathUrl;
}
if (!domainePathUrl.contains("http")) {
// Default value
domainePathUrl = "http://" + domainePathUrl;
}
return domainePathUrl;
}
public String getSeoSegmentMain(Locale locale, boolean isEncoded) throws Exception {
return handleSeoSegmentMain(coreMessageSource.getSpecificMessage(getMessageAppUniverse(), ScopeWebMessage.SEO.getPropertyKey(), "seo.url.main", locale), isEncoded);
}
public String handleSeoSegmentMain(String seoSegment, boolean isEncoded) throws Exception {
return CoreUtil.handleSeoSpecificEscape(seoSegment, isEncoded);
}
public String getFullPrefixUrl(final RequestData requestData, boolean isEncoded) throws Exception {
return getSeoPrefixUrl(requestData, isEncoded) + "/";
}
protected String getMessageAppUniverse(){
return I18nKeyValueUniverse.FO.getPropertyKey();
}
protected String handleUrlParameters(String url, Map<String, String> urlParams, Map<String, String> getParams) {
if (StringUtils.isNotEmpty(url)) {
if (urlParams != null) {
for (Entry<String, String> entry : urlParams.entrySet()) {
String key = String.format("\\{%s(:[^\\}]+)?\\}", entry.getKey());
if (StringUtils.equals(entry.getKey(), "slug")) {
key = "\\*\\*";
}
if (entry.getValue() != null) {
url = url.replaceAll(key, entry.getValue());
}
}
}
String queryString = "";
if (getParams != null) {
for (Entry<String, String> entry : getParams.entrySet()) {
if(StringUtils.isNotEmpty(entry.getValue())){
queryString += "&" + entry.getKey() + "=" + entry.getValue();
}
}
}
return url.toLowerCase() + queryString.replaceFirst("&", "?");
}
return url;
}
protected String getSeoPrefixUrl(final RequestData requestData, boolean isEncoded) throws Exception {
final MarketPlace marketPlace = requestData.getMarketPlace();
final Market market = requestData.getMarket();
final MarketArea marketArea = requestData.getMarketArea();
final Localization localization = requestData.getMarketAreaLocalization();
final Retailer retailer = requestData.getMarketAreaRetailer();
final Locale locale = requestData.getLocale();
String seoPrefixUrl = buildContextPath(requestData) + "/" + getMarketPlacePrefixUrl(marketPlace) + getMarketPrefixUrl(market) + getMarketAreaPrefixUrl(marketArea)
+ getLocalizationPrefixUrl(localization) + getRetailerPrefixUrl(retailer);
String seoSegmentMain = getSeoSegmentMain(locale, isEncoded);
if (StringUtils.isNotEmpty(seoSegmentMain)) {
seoPrefixUrl = seoPrefixUrl + getSeoSegmentMain(locale, isEncoded);
}
if (StringUtils.isNotEmpty(seoPrefixUrl)) {
seoPrefixUrl = seoPrefixUrl.replace(" ", "-");
}
if (seoPrefixUrl.endsWith("/")) {
seoPrefixUrl = seoPrefixUrl.substring(0, seoPrefixUrl.length() - 1);
}
return seoPrefixUrl;
}
protected String getMarketPlacePrefixUrl(final MarketPlace marketPlace) throws Exception {
return marketPlace.getCode().toLowerCase() + "/";
}
protected String getMarketPrefixUrl(final Market market) throws Exception {
return market.getCode().toLowerCase() + "/";
}
protected String getMarketAreaPrefixUrl(final MarketArea marketArea) throws Exception {
return marketArea.getCode().toLowerCase() + "/";
}
protected String getLocalizationPrefixUrl(final Localization localization) throws Exception {
return localization.getCode().toLowerCase() + "/";
}
protected String getRetailerPrefixUrl(final Retailer retailer) throws Exception {
return retailer.getCode().toLowerCase() + "/";
}
protected String encodeString(String url) throws Exception {
if (StringUtils.isNotEmpty(url)) {
return URLEncoder.encode(url, Constants.UTF8);
}
return url;
}
protected String handleParamValue(String string) throws Exception {
return CoreUtil.replaceSpaceAndUnderscore(string);
}
protected String buildDefaultPrefix(final RequestData requestData) {
return buildContextPath(requestData) + Constants.SPRING_URL_PATH;
}
protected String buildContextPath(final RequestData requestData) {
if (StringUtils.isNotEmpty(requestData.getContextPath())) {
return requestData.getContextPath();
}
return "";
}
}