/** * 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.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.hibernate.Hibernate; import org.hoteia.qalingo.core.Constants; import org.hoteia.qalingo.core.RequestConstants; import org.hoteia.qalingo.core.domain.CartItem; import org.hoteia.qalingo.core.domain.CatalogCategoryMaster; import org.hoteia.qalingo.core.domain.CatalogCategoryVirtual; import org.hoteia.qalingo.core.domain.CmsLink; import org.hoteia.qalingo.core.domain.CurrencyReferential; 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.ProductBrand; import org.hoteia.qalingo.core.domain.ProductMarketing; import org.hoteia.qalingo.core.domain.ProductSku; import org.hoteia.qalingo.core.domain.Retailer; import org.hoteia.qalingo.core.domain.Store; import org.hoteia.qalingo.core.domain.Tag; import org.hoteia.qalingo.core.domain.enumtype.FoUrls; import org.hoteia.qalingo.core.web.resolver.RequestData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service(value = "urlService") @Transactional public class UrlService extends AbstractUrlService { private final Logger logger = LoggerFactory.getLogger(getClass()); public String buildCustomerDetailsUrl(final RequestData requestData, String permalink) throws Exception { return buildContextPath(requestData) + "/customer/" + permalink; } public String buildAddThisUrl(String shareCode, String absoluteUrl) throws Exception { String url = null; if (StringUtils.isNotEmpty(shareCode) && StringUtils.isNotEmpty(absoluteUrl)) { try { url = "http://api.addthis.com/oexchange/0.8/forward/" + shareCode + "/offer?url=" + URLEncoder.encode(absoluteUrl, Constants.ANSI); } catch (Exception e) { logger.error("SocialNetwork AddThis URL can't be encode!", e); } } return url; } public String buildChangeBackofficeLanguageUrl(final RequestData requestData, final Localization localization) throws Exception { return buildDefaultPrefix(requestData) + FoUrls.CHANGE_LANGUAGE.getUrlWithoutWildcard() + "?" + RequestConstants.REQUEST_PARAMETER_LOCALE_CODE + "=" + handleParamValue(localization.getCode()); } public String buildChangeLanguageUrl(final RequestData requestData) 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 CurrencyReferential currency = requestData.getMarketAreaCurrency(); String url = buildDefaultPrefix(requestData) + FoUrls.CHANGE_LANGUAGE.getUrlWithoutWildcard() + "?"; url = url + RequestConstants.REQUEST_PARAMETER_MARKET_PLACE_CODE + "=" + handleParamValue(marketPlace.getCode()); url = url + "&" + RequestConstants.REQUEST_PARAMETER_MARKET_CODE + "=" + handleParamValue(market.getCode()); url = url + "&" + RequestConstants.REQUEST_PARAMETER_MARKET_AREA_CODE + "=" + handleParamValue(marketArea.getCode()); url = url + "&" + RequestConstants.REQUEST_PARAMETER_MARKET_AREA_LANGUAGE + "=" + handleParamValue(localization.getCode()); url = url + "&" + RequestConstants.REQUEST_PARAMETER_MARKET_AREA_RETAILER_CODE + "=" + handleParamValue(retailer.getCode()); url = url + "&" + RequestConstants.REQUEST_PARAMETER_MARKET_AREA_CURRENCY_CODE + "=" + handleParamValue(currency.getCode()); return url; } public String buildChangeContextUrl(final RequestData requestData) 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 CurrencyReferential currency = requestData.getMarketAreaCurrency(); String url = buildDefaultPrefix(requestData) + FoUrls.CHANGE_CONTEXT.getUrlWithoutWildcard() + "?"; url = url + RequestConstants.REQUEST_PARAMETER_MARKET_PLACE_CODE + "=" + handleParamValue(marketPlace.getCode()); url = url + "&" + RequestConstants.REQUEST_PARAMETER_MARKET_CODE + "=" + handleParamValue(market.getCode()); url = url + "&" + RequestConstants.REQUEST_PARAMETER_MARKET_AREA_CODE + "=" + handleParamValue(marketArea.getCode()); url = url + "&" + RequestConstants.REQUEST_PARAMETER_MARKET_AREA_LANGUAGE + "=" + handleParamValue(localization.getCode()); url = url + "&" + RequestConstants.REQUEST_PARAMETER_MARKET_AREA_RETAILER_CODE + "=" + handleParamValue(retailer.getCode()); url = url + "&" + RequestConstants.REQUEST_PARAMETER_MARKET_AREA_CURRENCY_CODE + "=" + handleParamValue(currency.getCode()); return url; } public String buildOAuthConnectUrl(final RequestData requestData, final String socialNetworkCode) throws Exception { return buildContextPath(requestData) + "/connect-oauth-" + socialNetworkCode + ".html"; } public String buildOAuthCallBackUrl(final RequestData requestData, String socialNetworkCode) throws Exception { return buildContextPath(requestData) + "/callback-oauth-" + socialNetworkCode + ".html"; } public String buildOpenIdConnectUrl(final RequestData requestData, final String socialNetworkCode) throws Exception { return buildContextPath(requestData) + "/connect-openid-" + socialNetworkCode + ".html"; } public String buildOpenIdCallBackUrl(final RequestData requestData) throws Exception { return buildContextPath(requestData) + "/callback-openid.html"; } public String generateUrl(final FoUrls url, final RequestData requestData, Object... params) { return generateUrl(url.getUrlWithoutWildcard(), false, url.withPrefixSEO(), requestData, params); } public String generateRedirectUrl(final FoUrls url, final RequestData requestData, Object... params) { return generateUrl(url.getUrlWithoutWildcard(), true, url.withPrefixSEO(), requestData, params); } @SuppressWarnings("unchecked") @Override public String generateUrl(final String urlWithoutWildcard, final boolean isEncoded, final boolean isSEO, final RequestData requestData, Object... params) { final Localization localization = requestData.getMarketAreaLocalization(); final String localizationCode = localization.getCode(); String urlStr = null; Map<String, String> getParams = new HashMap<String, String>(); Map<String, String> urlParams = new HashMap<String, String>(); try { if (params != null) { for (Object param : params) { if (param == null) continue; if (param instanceof Retailer) { Retailer retailer = (Retailer) param; urlParams.put(RequestConstants.URL_PATTERN_RETAILER_CODE, handleParamValue(retailer.getCode())); urlStr = addFullPrefixUrl(requestData, urlStr, isEncoded) + handleSeoSegmentMain(retailer.getI18nName(localizationCode), isEncoded) + "/"; } else if (param instanceof ProductSku) { ProductSku productSku = (ProductSku) param; urlParams.put(RequestConstants.URL_PATTERN_PRODUCT_SKU_CODE, handleParamValue(productSku.getCode())); urlStr = addFullPrefixUrl(requestData, urlStr, isEncoded); } else if (param instanceof ProductMarketing) { ProductMarketing productMarketing = (ProductMarketing) param; urlParams.put(RequestConstants.URL_PATTERN_PRODUCT_MARKETING_CODE, handleParamValue(productMarketing.getCode())); urlStr = addFullPrefixUrl(requestData, urlStr, isEncoded) + handleSeoSegmentMain(productMarketing.getI18nName(localizationCode), isEncoded) + "/"; } else if (param instanceof CatalogCategoryVirtual) { CatalogCategoryVirtual category = (CatalogCategoryVirtual) param; urlParams.put(RequestConstants.URL_PATTERN_CATEGORY_CODE, handleParamValue(category.getCode())); urlStr = addFullPrefixUrl(requestData, urlStr, isEncoded); if(Hibernate.isInitialized(category.getParentCatalogCategory()) && category.getParentCatalogCategory() != null){ urlStr = urlStr + handleSeoSegmentMain(category.getParentCatalogCategory().getI18nName(localizationCode), isEncoded) + "/"; } urlStr = urlStr + handleSeoSegmentMain(category.getI18nName(localizationCode), isEncoded) + "/"; } else if (param instanceof CatalogCategoryMaster) { CatalogCategoryMaster category = (CatalogCategoryMaster) param; urlStr = addFullPrefixUrl(requestData, urlStr, isEncoded); if(Hibernate.isInitialized(category.getParentCatalogCategory()) && category.getParentCatalogCategory() != null){ urlStr = urlStr + handleSeoSegmentMain(category.getParentCatalogCategory().getI18nName(localizationCode), isEncoded) + "/"; } urlStr = urlStr + handleSeoSegmentMain(category.getI18nName(localizationCode), isEncoded) + "/"; } else if (param instanceof ProductBrand) { ProductBrand productBrand = (ProductBrand) param; urlParams.put(RequestConstants.URL_PATTERN_BRAND_CODE, handleParamValue(productBrand.getCode())); urlStr = addFullPrefixUrl(requestData, urlStr, isEncoded) + handleSeoSegmentMain(productBrand.getI18nName(localizationCode), isEncoded) + "/"; } else if (param instanceof CartItem) { CartItem cartItem = (CartItem) param; urlParams.put(RequestConstants.URL_PATTERN_CART_ITEM_CODE, handleParamValue(cartItem.getId().toString())); } else if (param instanceof Store) { Store store = (Store) param; urlParams.put(RequestConstants.URL_PATTERN_STORE_CODE, handleParamValue(store.getCode().toString())); urlStr = addFullPrefixUrl(requestData, urlStr, isEncoded) + handleSeoSegmentMain(store.getI18nName(localizationCode), isEncoded) + "/"; } else if (param instanceof Tag) { Tag tag = (Tag) param; urlParams.put(RequestConstants.URL_PATTERN_TAG_CODE, handleParamValue(tag.getCode().toString())); urlStr = addFullPrefixUrl(requestData, urlStr, isEncoded) + handleSeoSegmentMain(tag.getI18nName(localizationCode), isEncoded) + "/"; } else if (param instanceof Map) { Map<String, String> paramMap = (Map<String, String>) param; getParams.putAll(paramMap); } else { logger.warn("Unknowned url parameter : [{}]", param); } } } if (StringUtils.isEmpty(urlStr)) { // AD THE DEFAULT PREFIX - DEFAULT PATH IS urlStr = buildDefaultPrefix(requestData); if(isSEO){ urlStr = getFullPrefixUrl(requestData, isEncoded); } } // REMOVE THE / AT EH END BEFORE ADDING THE /**.html segment if (urlStr.endsWith("/")) { urlStr = urlStr.substring(0, urlStr.length() - 1); } urlStr = urlStr + urlWithoutWildcard; } catch (Exception e) { logger.error("Can't build Url!", e); } return handleUrlParameters(urlStr, urlParams, getParams); } public String generateCmsLink(RequestData requestData, CmsLink link, Object... params){ // try { // FoUrls urlType = FoUrls.valueOf(FoUrls.class, link.getType()); // return generateUrl(urlType, requestData, params); // // } catch (Exception e) { // logger.debug("Can't build link: " + link.toString(), e); // } try { FoUrls urlType = FoUrls.valueOf(FoUrls.class, link.getType()); if(FoUrls.ARTICLE_CMS_CONTENT.equals(urlType) || FoUrls.PAGE_CMS_CONTENT.equals(urlType)){ if(StringUtils.isNotEmpty(link.getParams())){ return generateUrl(urlType, requestData, params); } } else { return generateUrl(urlType, requestData, params); } } catch (Exception e) { logger.debug("Can't build link: " + link.toString(), e); } return null; } public String buildSpringSecurityCheckUrl(final RequestData requestData) throws Exception { return buildContextPath(requestData) + FoUrls.SPRING_SECURITY_URL; } protected String addFullPrefixUrl(final RequestData requestData, String url, boolean isEncoded) throws Exception { String fullPrefixUrl = getFullPrefixUrl(requestData, isEncoded); if (url == null || !url.contains(fullPrefixUrl)) { url = fullPrefixUrl; } return url; } }