org.hoteia.qalingo.core.service.EngineSettingService.java Source code

Java tutorial

Introduction

Here is the source code for org.hoteia.qalingo.core.service.EngineSettingService.java

Source

/**
 * 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.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Hibernate;
import org.hoteia.qalingo.core.Constants;
import org.hoteia.qalingo.core.annotation.CacheMethodInformation;
import org.hoteia.qalingo.core.annotation.CacheType;
import org.hoteia.qalingo.core.dao.EngineSettingDao;
import org.hoteia.qalingo.core.domain.AbstractCmsEntity;
import org.hoteia.qalingo.core.domain.Asset;
import org.hoteia.qalingo.core.domain.CmsContent;
import org.hoteia.qalingo.core.domain.CmsContentAsset;
import org.hoteia.qalingo.core.domain.CmsContentBlock;
import org.hoteia.qalingo.core.domain.EngineSetting;
import org.hoteia.qalingo.core.domain.EngineSettingValue;
import org.hoteia.qalingo.core.domain.MarketArea;
import org.hoteia.qalingo.core.domain.ProductMarketing;
import org.hoteia.qalingo.core.domain.ProductSku;
import org.hoteia.qalingo.core.util.CoreUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service("engineSettingService")
@Transactional
public class EngineSettingService {

    // TODO : enum or not for tall this key ?

    public static final String ENGINE_SETTING_ENVIRONMENT_STAGING_MODE_ENABLED = "ENVIRONMENT_STAGING_MODE_ENABLED";
    public static final String ENGINE_SETTING_ENVIRONMENT_TYPE = "ENVIRONMENT_TYPE";

    public static final String ENGINE_SETTING_CODE_ASSET_FILE_ROOT_PATH = "ASSET_FILE_ROOT_PATH";
    public static final String ENGINE_SETTING_CODE_ASSET_WEB_ROOT_PATH = "ASSET_WEB_ROOT_PATH";
    public static final String ENGINE_SETTING_CODE_ASSET_CATALOG_FILE_PATH = "ASSET_CATALOG_FILE_PATH";
    public static final String ENGINE_SETTING_CODE_ASSET_PRODUCT_MARKETING_FILE_PATH = "ASSET_PRODUCT_MARKETING_FILE_PATH";
    public static final String ENGINE_SETTING_CODE_ASSET_PRODUCT_SKU_FILE_PATH = "ASSET_PRODUCT_SKU_FILE_PATH";
    public static final String ENGINE_SETTING_CODE_ASSET_PRODUCT_BRAND_FILE_PATH = "ASSET_PRODUCT_BRAND_FILE_PATH";
    public static final String ENGINE_SETTING_CODE_ASSET_RETAILER_STORE_FILE_PATH = "ASSET_RETAILER_STORE_FILE_PATH";

    public static final String ENGINE_SETTING_CODE_THEME_RESOURCE_PREFIX_PATH = "THEME_RESOURCE_PREFIX_PATH";
    public static final String WEB_CACHE_ELEMENT_TIME_TO_LIVE = "WEB_CACHE_ELEMENT_TIME_TO_LIVE";

    public static final String ENGINE_SETTING_ESCAPE_ACCENT_FROM_URL = "ESCAPE_ACCENT_FROM_URL";

    public static final String ENGINE_SETTING_CODE_SPRING_BATCH_URL = "SPRING_BATCH_URL";
    public static final String ENGINE_SETTING_CONTEXT_CMS = "CMS";
    public static final String ENGINE_SETTING_CONTEXT_CRM = "CRM";
    public static final String ENGINE_SETTING_CONTEXT_ERP = "ERP";
    public static final String ENGINE_SETTING_CONTEXT_NOTIFICATION = "NOTIFICATION";

    public static final String ENGINE_SETTING_CODE_SOLR = "SOLR";
    public static final String ENGINE_SETTING_SOLR_MASTER_CONTEXT = "MASTER";

    // Document order
    public static final String ENGINE_SETTING_DOCUMENT_FILE_FOLDER_PATH = "DOCUMENT_FILE_FOLDER_PATH";
    public static final String ENGINE_SETTING_DOCUMENT_FILE_WEB_PATH = "DOCUMENT_FILE_WEB_PATH";

    public static final String ENGINE_SETTING_DEFAULT_ORDER_CONFIRMATION_TEMPLATE = "DEFAULT_ORDER_CONFIRMATION_TEMPLATE";
    public static final String ENGINE_SETTING_DEFAULT_SHIPPING_CONFIRMATION_TEMPLATE = "DEFAULT_SHIPPING_CONFIRMATION_TEMPLATE";
    public static final String ENGINE_SETTING_DEFAULT_INVOICE_TEMPLATE = "DEFAULT_INVOICE_TEMPLATE";

    // Email file mirroring
    public static final String ENGINE_SETTING_EMAIL_FILE_MIRRORING_ACTIVATED = "EMAIL_FILE_MIRRORING_ACTIVATED";
    public static final String ENGINE_SETTING_EMAIL_FILE_MIRRORING_FOLDER_PATH = "EMAIL_FILE_MIRRORING_FOLDER_PATH";
    public static final String ENGINE_SETTING_EMAIL_FILE_MIRRORING_WEB_PATH = "EMAIL_FILE_MIRRORING_FOLDER_WEB";
    public static final String ENGINE_SETTING_EMAIL_FILE_MIRRORING_EXTENSION = "EMAIL_FILE_MIRRORING_EXTENSION";
    public static final String ENGINE_SETTING_DEFAULT_EMAIL_ADDRESS = "DEFAULT_EMAIL_ADDRESS";

    // COUNT ITEM BY PAGE - PAGE SIZE
    public static final String ENGINE_SETTING_CODE_COUNT_ITEM_BY_PAGE = "COUNT_ITEM_BY_PAGE";
    public static final String ENGINE_SETTING_CONTEXT_BO_TECHNICAL_ENGINE_SETTING_LIST = "BO_TECHNICAL_ENGINE_SETTING_LIST";
    public static final String ENGINE_SETTING_CONTEXT_BO_TECHNICAL_USER_LIST = "BO_TECHNICAL_USER_LIST";
    public static final String ENGINE_SETTING_CONTEXT_BO_TECHNICAL_CACHE_LIST = "BO_TECHNICAL_CACHE_LIST";
    public static final String ENGINE_SETTING_CONTEXT_BO_TECHNICAL_BATCH_LIST = "BO_TECHNICAL_BATCH_LIST";

    // Web tracking like: Google Analytics
    public static final String ENGINE_SETTING_WEB_TRACKING_NUMBER = "WEB_TRACKING_NUMBER";
    public static final String ENGINE_SETTING_WEB_TRACKING_NAME = "WEB_TRACKING_NAME";

    // Web monitoring like: Pingdom
    public static final String ENGINE_SETTING_WEB_MONITORING_NUMBER = "WEB_MONITORING_NUMBER";
    public static final String ENGINE_SETTING_WEB_MONITORING_NAME = "WEB_MONITORING_NAME";

    // Web monitoring like: Google reCaptcha
    public static final String ENGINE_SETTING_WEB_CAPTCHA_SITE_KEY = "WEB_CAPTCHA_SITE_KEY";
    public static final String ENGINE_SETTING_WEB_CAPTCHA_SECRET_KEY = "WEB_CAPTCHA_SECRET_KEY";

    // OAUTH : FACEBOOK, TWITTER, GOOGLE, etc
    public static final String ENGINE_SETTING_OAUTH_APP_KEY_OR_ID = "OAUTH_APP_KEY_OR_ID";
    public static final String ENGINE_SETTING_OAUTH_APP_SECRET = "OAUTH_APP_SECRET";
    public static final String ENGINE_SETTING_OAUTH_APP_PERMISSIONS = "OAUTH_APP_PERMISSIONS";

    // MAX USER LOGIN SUCCES TO LOG
    public static final String ENGINE_SETTING_MAX_USER_CONNECTION_LOG = "MAX_USER_CONNECTION_LOG";
    public static final String ENGINE_SETTING_MAX_CUSTOMER_CONNECTION_LOG = "MAX_CUSTOMER_CONNECTION_LOG";

    // SCORE
    public static final String ENGINE_SETTING_CONTEXT_STAR_SCORE_MAX = "STAR_SCORE_MAX";
    public static final String ENGINE_SETTING_CONTEXT_PRODUCT_SCORE_MAX = "PRODUCT_QUALITY_OF_SERVICE";
    public static final String ENGINE_SETTING_CONTEXT_RETAILER_SCORE_MAX = "RETAILER_QUALITY_OF_SERVICE";

    // GEOLOC
    public static final String ENGINE_SETTING_GEOLOC_CITY_DATABASE_PATH = "CITY_DATABASE_PATH";
    public static final String ENGINE_SETTING_GEOLOC_COUNTRY_DATABASE_PATH = "COUNTRY_DATABASE_PATH";
    public static final String ENGINE_SETTING_GOOGLE_GEOLOC_API_KEY = "GOOGLE_GEOLOC_API_KEY";
    public static final String ENGINE_SETTING_GOOGLE_GEOLOC_OVER_QUOTA_KEY = "GOOGLE_GEOLOC_OVER_QUOTA_TIMESTAMP";
    public static final String ENGINE_SETTING_GOOGLE_MAP_API_KEY = "GOOGLE_MAP_API_KEY";
    public static final String ENGINE_SETTING_GOOGLE_MAP_OVER_QUOTA_KEY = "GOOGLE_MAP_OVER_QUOTA_TIMESTAMP";

    // LIGTH CMS
    public static final String ENGINE_SETTING_CODE_ASSET_CMS_CONTENT_FILE_PATH = "ASSET_CMS_CONTENT_FILE_PATH";

    // MANGOPAY
    public static final String ENGINE_SETTING_MANGOPAY_CLIENT_ID = "MANGOPAY_CLIENT_ID";
    public static final String ENGINE_SETTING_MANGOPAY_CLIENT_PASSWORD = "MANGOPAY_CLIENT_PASSWORD";
    public static final String ENGINE_SETTING_MANGOPAY_BASE_URL = "MANGOPAY_DEFAULT_BASE_URL";
    public static final String ENGINE_SETTING_MANGOPAY_DEFAULT_OWNER_ID = "MANGOPAY_DEFAULT_OWNER_ID";
    public static final String ENGINE_SETTING_MANGOPAY_DASHBOARD_URL = "MANGOPAY_DASHBOARD_URL";
    public static final String ENGINE_SETTING_MANGOPAY_PAYOUT_FEES_PERCENTAGE = "MANGOPAY_PAYOUT_FEES_PERCENTAGE";

    public static SimpleDateFormat timestampPattern = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

    @Autowired
    protected EngineSettingDao engineSettingDao;

    @Autowired
    protected ProductService productService;

    // Engine Setting

    public EngineSetting getEngineSettingById(final Long engineSettingId, Object... params) {
        return engineSettingDao.getEngineSettingById(engineSettingId, params);
    }

    public EngineSetting getEngineSettingById(final String rawEngineSettingId, Object... params) {
        long engineSettingId = -1;
        try {
            engineSettingId = Long.parseLong(rawEngineSettingId);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException(e);
        }
        return getEngineSettingById(engineSettingId, params);
    }

    public EngineSetting getEngineSettingByCode(final String code, Object... params) {
        return engineSettingDao.getEngineSettingByCode(code, params);
    }

    public List<EngineSetting> findEngineSettings(Object... params) {
        return engineSettingDao.findEngineSettings(params);
    }

    public EngineSetting saveOrUpdateEngineSetting(final EngineSetting engineSetting) {
        return engineSettingDao.saveEngineSetting(engineSetting);
    }

    public void deleteEngineSetting(final EngineSetting engineSetting) {
        engineSettingDao.deleteEngineSetting(engineSetting);
    }

    // Engine Setting Value

    public EngineSettingValue getEngineSettingValueById(final Long engineSettingValueId, Object... params) {
        return engineSettingDao.getEngineSettingValueById(engineSettingValueId, params);
    }

    public EngineSettingValue getEngineSettingValueById(final String rawEngineSettingValueId, Object... params) {
        long engineSettingValueId = -1;
        try {
            engineSettingValueId = Long.parseLong(rawEngineSettingValueId);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException(e);
        }
        return getEngineSettingValueById(engineSettingValueId, params);
    }

    public EngineSettingValue saveOrUpdateEngineSettingValue(final EngineSettingValue engineSettingValue) {
        return engineSettingDao.saveOrUpdateEngineSettingValue(engineSettingValue);
    }

    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getEngineSettingValueByCode(final String engineSettingCode, final String engineSettingValueCode) {
        EngineSetting engineSetting = getEngineSettingByCode(engineSettingCode);
        if (engineSetting != null) {
            EngineSettingValue engineSettingValue = engineSetting.getEngineSettingValue(engineSettingValueCode);
            if (engineSettingValue != null) {
                return engineSettingValue.getValue();
            } else {
                return engineSetting.getDefaultValue();
            }
        }
        return null;
    }

    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getEngineSettingDefaultValueByCode(final String engineSettingCode) {
        EngineSetting engineSetting = getEngineSettingByCode(engineSettingCode);
        if (engineSetting != null) {
            return engineSetting.getDefaultValue();
        }
        return null;
    }

    // Common Engine Setting Value

    public EngineSetting getSettingEnvironmentStagingModeEnabled() {
        return getEngineSettingByCode(ENGINE_SETTING_ENVIRONMENT_STAGING_MODE_ENABLED);
    }

    public EngineSetting getSettingEnvironmentType() {
        return getEngineSettingByCode(ENGINE_SETTING_ENVIRONMENT_TYPE);
    }

    public EngineSetting getSettingAssetFileRootPath() {
        return getEngineSettingByCode(ENGINE_SETTING_CODE_ASSET_FILE_ROOT_PATH);
    }

    public EngineSetting getSettingAssetWebRootPath() {
        return getEngineSettingByCode(ENGINE_SETTING_CODE_ASSET_WEB_ROOT_PATH);
    }

    public EngineSetting getSettingAssetCatalogFilePath() {
        return getEngineSettingByCode(ENGINE_SETTING_CODE_ASSET_CATALOG_FILE_PATH);
    }

    public EngineSetting getSettingAssetProductMarketingFilePath() {
        return getEngineSettingByCode(ENGINE_SETTING_CODE_ASSET_PRODUCT_MARKETING_FILE_PATH);
    }

    public EngineSetting getSettingAssetProductSkuFilePath() {
        return getEngineSettingByCode(ENGINE_SETTING_CODE_ASSET_PRODUCT_SKU_FILE_PATH);
    }

    public EngineSetting getSettingAssetProductBrandFilePath() {
        return getEngineSettingByCode(ENGINE_SETTING_CODE_ASSET_PRODUCT_BRAND_FILE_PATH);
    }

    public EngineSetting getSettingAssetRetailerAndStoreFilePath() {
        return getEngineSettingByCode(ENGINE_SETTING_CODE_ASSET_RETAILER_STORE_FILE_PATH);
    }

    public EngineSetting getSettingThemeResourcePrefixPath() {
        return getEngineSettingByCode(ENGINE_SETTING_CODE_THEME_RESOURCE_PREFIX_PATH);
    }

    public EngineSetting getSettingWithEscapeAccent() {
        return getEngineSettingByCode(ENGINE_SETTING_ESCAPE_ACCENT_FROM_URL);
    }

    public EngineSetting getSettingProductMaxScoreValue() {
        return getEngineSettingByCode(ENGINE_SETTING_CONTEXT_PRODUCT_SCORE_MAX);
    }

    public EngineSetting getSettingRetailerMaxScoreValue() {
        return getEngineSettingByCode(ENGINE_SETTING_CONTEXT_RETAILER_SCORE_MAX);
    }

    public EngineSetting getSettingOAuthAppKeyOrId() {
        return getEngineSettingByCode(ENGINE_SETTING_OAUTH_APP_KEY_OR_ID);
    }

    public EngineSetting getSettingOAuthAppSecret() {
        return getEngineSettingByCode(ENGINE_SETTING_OAUTH_APP_SECRET);
    }

    public EngineSetting getSettingOAuthAppPermissions() {
        return getEngineSettingByCode(ENGINE_SETTING_OAUTH_APP_PERMISSIONS);
    }

    public EngineSetting getSettingWebTrackingNumber() {
        return getEngineSettingByCode(ENGINE_SETTING_WEB_TRACKING_NUMBER);
    }

    public EngineSetting getSettingWebTrackingName() {
        return getEngineSettingByCode(ENGINE_SETTING_WEB_TRACKING_NAME);
    }

    public EngineSetting getSettingWebMonitoringNumber() {
        return getEngineSettingByCode(ENGINE_SETTING_WEB_MONITORING_NUMBER);
    }

    public EngineSetting getSettingWebMonitoringName() {
        return getEngineSettingByCode(ENGINE_SETTING_WEB_MONITORING_NAME);
    }

    public EngineSetting getSettingWebCaptchaSecretKey() {
        return getEngineSettingByCode(ENGINE_SETTING_WEB_CAPTCHA_SECRET_KEY);
    }

    public EngineSetting getSettingWebCaptchaSiteKey() {
        return getEngineSettingByCode(ENGINE_SETTING_WEB_CAPTCHA_SITE_KEY);
    }

    // GEOLOC SETTINGS

    public EngineSetting getSettingGeolocCityFilePath() {
        return getEngineSettingByCode(ENGINE_SETTING_GEOLOC_CITY_DATABASE_PATH);
    }

    public EngineSetting getSettingGeolocCountryFilePath() {
        return getEngineSettingByCode(ENGINE_SETTING_GEOLOC_COUNTRY_DATABASE_PATH);
    }

    public EngineSetting getSettingGoogleGeolocationApiKey() {
        return getEngineSettingByCode(ENGINE_SETTING_GOOGLE_GEOLOC_API_KEY);
    }

    public EngineSetting getSettingGoogleGeolocationApiQuotaTimeStamp() {
        return getEngineSettingByCode(ENGINE_SETTING_GOOGLE_GEOLOC_OVER_QUOTA_KEY);
    }

    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getGoogleGeolocationApiKey() throws Exception {
        EngineSetting engineSetting = getSettingGoogleGeolocationApiKey();
        String key = "";
        if (engineSetting != null) {
            key = engineSetting.getDefaultValue();
        }
        return key;
    }

    public boolean isGoogleGeolocationApiOverQuotas() throws Exception {
        EngineSetting engineSetting = getSettingGoogleGeolocationApiQuotaTimeStamp();
        String timestamp = null;
        if (engineSetting != null) {
            timestamp = engineSetting.getDefaultValue();
        }
        if (timestamp != null) {
            return true;
        }
        return false;
    }

    public boolean isGoogleGeolocationApiStillOverQuotas(final Date newDate) throws ParseException {
        EngineSetting engineSetting = getSettingGoogleGeolocationApiQuotaTimeStamp();
        String timestamp = null;
        if (engineSetting != null) {
            timestamp = engineSetting.getDefaultValue();
        }
        if (timestamp != null) {
            Date dateOverQuota = timestampPattern.parse(timestamp);
            if (newDate.getTime() > (dateOverQuota.getTime() + Constants.MILLISECONDS_IN_A_DAY.longValue())) {
                return false;
            }
            return true;
        }
        return false;
    }

    public void flagSettingGoogleGeolocationApiOverQuota() {
        EngineSetting engineSetting = getSettingGoogleGeolocationApiQuotaTimeStamp();
        engineSetting.setDefaultValue(timestampPattern.format(new Date()));
        saveOrUpdateEngineSetting(engineSetting);
    }

    // GOOGLE MAP SETTINGS

    public EngineSetting getSettingGoogleMapApiKey() {
        return getEngineSettingByCode(ENGINE_SETTING_GOOGLE_MAP_API_KEY);
    }

    public EngineSetting getSettingGoogleMapApiQuotaTimeStamp() {
        return getEngineSettingByCode(ENGINE_SETTING_GOOGLE_MAP_OVER_QUOTA_KEY);
    }

    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getGoogleMapApiKey() throws Exception {
        EngineSetting engineSetting = getSettingGoogleMapApiKey();
        String key = "";
        if (engineSetting != null) {
            key = engineSetting.getDefaultValue();
        }
        return key;
    }

    public boolean isGoogleMapApiOverQuotas() throws Exception {
        EngineSetting engineSetting = getSettingGoogleMapApiQuotaTimeStamp();
        String timestamp = null;
        if (engineSetting != null) {
            timestamp = engineSetting.getDefaultValue();
        }
        if (timestamp != null) {
            return true;
        }
        return false;
    }

    public boolean isGoogleMapApiStillOverQuotas(final Date newDate) throws ParseException {
        EngineSetting engineSetting = getSettingGoogleMapApiQuotaTimeStamp();
        String timestamp = null;
        if (engineSetting != null) {
            timestamp = engineSetting.getDefaultValue();
        }
        if (timestamp != null) {
            Date dateOverQuota = timestampPattern.parse(timestamp);
            if (newDate.getTime() > (dateOverQuota.getTime() + Constants.MILLISECONDS_IN_A_DAY.longValue())) {
                return false;
            }
            return true;
        }
        return false;
    }

    public void flagSettingGoogleMapApiOverQuota() {
        EngineSetting engineSetting = getSettingGoogleMapApiQuotaTimeStamp();
        engineSetting.setDefaultValue(timestampPattern.format(new Date()));
        saveOrUpdateEngineSetting(engineSetting);
    }

    // DOCUMENT SETTINGS

    public EngineSetting getSettingDocumentFileRootPath() {
        return getEngineSettingByCode(ENGINE_SETTING_DOCUMENT_FILE_FOLDER_PATH);
    }

    public EngineSetting getSettingDocumentWebRootPath() {
        return getEngineSettingByCode(ENGINE_SETTING_DOCUMENT_FILE_WEB_PATH);
    }

    public EngineSetting getSettingDefaultOrderConfirmationTemplate() {
        return getEngineSettingByCode(ENGINE_SETTING_DEFAULT_ORDER_CONFIRMATION_TEMPLATE);
    }

    public EngineSetting getSettingDefaultShippingConfirmationTemplate() {
        return getEngineSettingByCode(ENGINE_SETTING_DEFAULT_SHIPPING_CONFIRMATION_TEMPLATE);
    }

    public EngineSetting getSettingDefaultInvoiceTemplate() {
        return getEngineSettingByCode(ENGINE_SETTING_DEFAULT_INVOICE_TEMPLATE);
    }

    // EMAIL SETTINGS

    public EngineSetting getSettingEmailFileMirroringActivated() {
        return getEngineSettingByCode(ENGINE_SETTING_EMAIL_FILE_MIRRORING_ACTIVATED);
    }

    public boolean getEmailFileMirroringActivated(String context) {
        EngineSetting engineSetting = getSettingEmailFileMirroringActivated();
        boolean emailFileMirroringActivated = false;
        if (engineSetting != null) {
            emailFileMirroringActivated = BooleanUtils.toBoolean(engineSetting.getDefaultValue());
            EngineSettingValue engineSettingValue = engineSetting.getEngineSettingValue(context);
            if (engineSettingValue != null) {
                emailFileMirroringActivated = BooleanUtils.toBoolean(engineSettingValue.getValue());
            }
        }
        return emailFileMirroringActivated;
    }

    public EngineSetting getSettingEmailFileMirroringFolderPath() {
        return getEngineSettingByCode(ENGINE_SETTING_EMAIL_FILE_MIRRORING_FOLDER_PATH);
    }

    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getEmailFileMirroringFolderPath(String context) {
        EngineSetting engineSetting = getSettingEmailFileMirroringFolderPath();
        String emailFileMirroringFolderPath = "";
        if (engineSetting != null) {
            emailFileMirroringFolderPath = engineSetting.getDefaultValue();
            EngineSettingValue engineSettingValue = engineSetting.getEngineSettingValue(context);
            if (engineSettingValue != null) {
                emailFileMirroringFolderPath = engineSettingValue.getValue();
            }
        }
        return emailFileMirroringFolderPath;
    }

    public EngineSetting getSettingEmailFileMirroringWebPath() {
        return getEngineSettingByCode(ENGINE_SETTING_EMAIL_FILE_MIRRORING_WEB_PATH);
    }

    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getEmailFileMirroringWebPath(String context) {
        EngineSetting engineSetting = getSettingEmailFileMirroringWebPath();
        String emailFileMirroringWebPath = "";
        if (engineSetting != null) {
            emailFileMirroringWebPath = engineSetting.getDefaultValue();
            EngineSettingValue engineSettingValue = engineSetting.getEngineSettingValue(context);
            if (engineSettingValue != null) {
                emailFileMirroringWebPath = engineSettingValue.getValue();
            }
        }
        return emailFileMirroringWebPath;
    }

    public EngineSetting getSettingEmailFileMirroringExtension() {
        return getEngineSettingByCode(ENGINE_SETTING_EMAIL_FILE_MIRRORING_EXTENSION);
    }

    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getEmailFileMirroringExtension(String context) {
        EngineSetting engineSetting = getSettingEmailFileMirroringExtension();
        String emailFileMirroringPath = "";
        if (engineSetting != null) {
            emailFileMirroringPath = engineSetting.getDefaultValue();
            EngineSettingValue engineSettingValue = engineSetting.getEngineSettingValue(context);
            if (engineSettingValue != null) {
                emailFileMirroringPath = engineSettingValue.getValue();
            }
        }
        return emailFileMirroringPath;
    }

    public EngineSetting getDefaultEmailAddress() {
        return getEngineSettingByCode(ENGINE_SETTING_DEFAULT_EMAIL_ADDRESS);
    }

    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getDefaultEmailAddress(String context) {
        EngineSetting engineSetting = getDefaultEmailAddress();
        String defaultEmailAddress = "";
        if (engineSetting != null) {
            defaultEmailAddress = engineSetting.getDefaultValue();
            EngineSettingValue engineSettingValue = engineSetting.getEngineSettingValue(context);
            if (engineSettingValue != null) {
                defaultEmailAddress = engineSettingValue.getValue();
            }
        }
        return defaultEmailAddress;
    }

    // ASSETS

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getRootAssetFilePath() throws Exception {
        EngineSetting engineSetting = getSettingAssetFileRootPath();
        String prefixPath = "";
        if (engineSetting != null) {
            prefixPath = engineSetting.getDefaultValue();
        }
        if (prefixPath.endsWith(File.separator)) {
            prefixPath = prefixPath.substring(0, prefixPath.length() - 1);
        }
        return handleFilePath(prefixPath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getRootAssetWebPath() throws Exception {
        EngineSetting engineSetting = getSettingAssetWebRootPath();
        String prefixPath = "";
        if (engineSetting != null) {
            prefixPath = engineSetting.getDefaultValue();
        }
        if (prefixPath.endsWith("/")) {
            prefixPath = prefixPath.substring(0, prefixPath.length() - 1);
        }
        return prefixPath;
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getCatalogImageFilePath(String assetType) throws Exception {
        EngineSetting engineSetting = getSettingAssetCatalogFilePath();
        String prefixPath = "";
        if (engineSetting != null) {
            prefixPath = engineSetting.getDefaultValue();
        }
        String rootAssetFilePath = getRootAssetFilePath();
        if (rootAssetFilePath.endsWith("/") && prefixPath.startsWith("/")) {
            rootAssetFilePath = rootAssetFilePath.substring(0, rootAssetFilePath.length() - 1);
        }
        String catalogImageFilePath = rootAssetFilePath + prefixPath + File.separator + assetType + File.separator;
        if (catalogImageFilePath.endsWith(File.separator)) {
            catalogImageFilePath = catalogImageFilePath.substring(0, catalogImageFilePath.length() - 1);
        }
        return handleFilePath(catalogImageFilePath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getCatalogImageWebPath(final Asset asset) throws Exception {
        EngineSetting engineSetting = getSettingAssetCatalogFilePath();
        String prefixPath = "";
        if (engineSetting != null) {
            prefixPath = engineSetting.getDefaultValue();
        }
        String catalogImageWebPath = getRootAssetWebPath() + prefixPath + "/" + asset.getType() + "/"
                + asset.getPath();
        return handleWebPath(catalogImageWebPath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getProductMarketingImageFilePath(final String assetType) throws Exception {
        EngineSetting engineSetting = getSettingAssetProductMarketingFilePath();
        String prefixPath = "";
        if (engineSetting != null) {
            prefixPath = engineSetting.getDefaultValue();
        }
        String rootAssetFilePath = getRootAssetFilePath();
        if (rootAssetFilePath.endsWith(File.separator) && prefixPath.startsWith(File.separator)) {
            rootAssetFilePath = rootAssetFilePath.substring(0, rootAssetFilePath.length() - 1);
        }
        String productMarketingImageFilePath = rootAssetFilePath + prefixPath + File.separator + assetType
                + File.separator;
        return handleFilePath(productMarketingImageFilePath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getProductMarketingImageFilePath(final ProductMarketing productMarketing, final String assetType)
            throws Exception {
        String productMarketingImageFilePath = getProductMarketingImageFilePath(assetType);
        if (productMarketing.getProductBrand() != null) {
            productMarketingImageFilePath += productMarketing.getProductBrand().getCode() + File.separator;
        }
        productMarketingImageFilePath += productMarketing.getCode() + File.separator;
        return handleFilePath(productMarketingImageFilePath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getProductMarketingImageFilePath(final ProductMarketing productMarketing, final String assetType,
            final String filePath) throws Exception {
        String productMarketingImageFilePath = getProductMarketingImageFilePath(productMarketing, assetType)
                + filePath;
        return handleFilePath(productMarketingImageFilePath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getProductMarketingImageWebPath(final Asset asset) throws Exception {
        String productMarketingImageWebPath = getProductMarketingPrefixImageWebPath(asset) + asset.getPath();
        return handleWebPath(productMarketingImageWebPath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getProductMarketingImageWebPath(final ProductMarketing productMarketing, final Asset asset)
            throws Exception {
        String productMarketingImageWebPath = getProductMarketingPrefixImageWebPath(asset);
        if (!productMarketingImageWebPath.endsWith("/")) {
            productMarketingImageWebPath += "/";
        }
        if (productMarketing.getProductBrand() != null) {
            productMarketingImageWebPath += productMarketing.getProductBrand().getCode() + "/";
        }
        productMarketingImageWebPath += productMarketing.getCode() + "/" + asset.getPath();
        return handleWebPath(productMarketingImageWebPath);
    }

    protected String getProductMarketingPrefixImageWebPath(final Asset asset) throws Exception {
        EngineSetting engineSetting = getSettingAssetProductMarketingFilePath();
        String prefixPath = "";
        if (engineSetting != null) {
            prefixPath = engineSetting.getDefaultValue();
        }
        return getRootAssetWebPath() + prefixPath + "/" + asset.getType() + "/";
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getProductSkuImageFilePath(String assetType) throws Exception {
        EngineSetting engineSetting = getSettingAssetProductSkuFilePath();
        String prefixPath = "";
        if (engineSetting != null) {
            prefixPath = engineSetting.getDefaultValue();
        }
        String rootAssetFilePath = getRootAssetFilePath();
        if (rootAssetFilePath.endsWith(File.separator) && prefixPath.startsWith(File.separator)) {
            rootAssetFilePath = rootAssetFilePath.substring(0, rootAssetFilePath.length() - 1);
        }
        String productSkuImageFilePath = rootAssetFilePath + prefixPath + File.separator + assetType
                + File.separator;
        return handleFilePath(productSkuImageFilePath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getProductSkuImageFilePath(final ProductSku productSku, final String assetType) throws Exception {
        String productMarketingImageFilePath = getProductSkuImageFilePath(assetType);
        if (productSku.getProductBrand() != null) {
            productMarketingImageFilePath += productSku.getProductBrand().getCode() + File.separator;
        }
        productMarketingImageFilePath += productSku.getCode() + File.separator;
        return handleFilePath(productMarketingImageFilePath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getProductSkuImageFilePath(final ProductSku productSku, final String assetType,
            final String filePath) throws Exception {
        String productMarketingImageFilePath = getProductSkuImageFilePath(productSku, assetType) + filePath;
        return handleFilePath(productMarketingImageFilePath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getProductSkuImageWebPath(final Asset asset) throws Exception {
        String productSkuImageWebPath = getProductSkuPrefixImageWebPath(asset) + asset.getPath();
        return handleWebPath(productSkuImageWebPath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getProductSkuImageWebPath(final String productSkuCode, final Asset asset) throws Exception {
        ProductSku productSkuByCode = productService.getProductSkuByCode(productSkuCode);
        return getProductSkuImageWebPath(productSkuByCode, asset);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getProductSkuImageWebPath(final ProductSku productSku, final Asset asset) throws Exception {
        String productSkuImageWebPath = getProductSkuPrefixImageWebPath(asset);
        if (!productSkuImageWebPath.endsWith("/")) {
            productSkuImageWebPath += "/";
        }
        Hibernate.initialize(productSku.getProductBrand());
        if (productSku.getProductBrand() != null) {
            productSkuImageWebPath += productSku.getProductBrand().getCode() + "/";
        }
        productSkuImageWebPath += productSku.getCode() + "/" + asset.getPath();
        return handleWebPath(productSkuImageWebPath);
    }

    protected String getProductSkuPrefixImageWebPath(final Asset asset) throws Exception {
        EngineSetting engineSetting = getSettingAssetProductSkuFilePath();
        String prefixPath = "";
        if (engineSetting != null) {
            prefixPath = engineSetting.getDefaultValue();
        }
        return getRootAssetWebPath() + prefixPath + "/" + asset.getType() + "/";
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getProductBrandImageFilePath(String assetType) throws Exception {
        EngineSetting engineSetting = getSettingAssetProductBrandFilePath();
        String prefixPath = "";
        if (engineSetting != null) {
            prefixPath = engineSetting.getDefaultValue();
        }
        String rootAssetFilePath = getRootAssetFilePath();
        if (rootAssetFilePath.endsWith("/") && prefixPath.startsWith("/")) {
            rootAssetFilePath = rootAssetFilePath.substring(0, rootAssetFilePath.length() - 1);
        }
        String productBrandImageFilePath = rootAssetFilePath + prefixPath + File.separator + assetType
                + File.separator;
        if (productBrandImageFilePath.endsWith(File.separator)) {
            productBrandImageFilePath = productBrandImageFilePath.substring(0,
                    productBrandImageFilePath.length() - 1);
        }
        return handleFilePath(productBrandImageFilePath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getProductBrandImageWebPath(final Asset asset) throws Exception {
        EngineSetting engineSetting = getSettingAssetProductBrandFilePath();
        String prefixPath = "";
        if (engineSetting != null) {
            prefixPath = engineSetting.getDefaultValue();
        }
        String productBrandImageWebPath = getRootAssetWebPath() + prefixPath + "/" + asset.getType() + "/"
                + asset.getPath();
        return handleWebPath(productBrandImageWebPath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getRetailerOrStoreImageFilePath(String assetType) throws Exception {
        EngineSetting engineSetting = getSettingAssetRetailerAndStoreFilePath();
        String prefixPath = "";
        if (engineSetting != null) {
            prefixPath = engineSetting.getDefaultValue();
        }
        String rootAssetFilePath = getRootAssetFilePath();
        if (rootAssetFilePath.endsWith("/") && prefixPath.startsWith("/")) {
            rootAssetFilePath = rootAssetFilePath.substring(0, rootAssetFilePath.length() - 1);
        }
        String retailerImageFilePath = rootAssetFilePath + prefixPath + File.separator + assetType + File.separator;
        if (retailerImageFilePath.endsWith(File.separator)) {
            retailerImageFilePath = retailerImageFilePath.substring(0, retailerImageFilePath.length() - 1);
        }
        return handleFilePath(retailerImageFilePath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getRetailerOrStoreImageWebPath(final Asset asset) throws Exception {
        EngineSetting engineSetting = getSettingAssetRetailerAndStoreFilePath();
        String prefixPath = "";
        if (engineSetting != null) {
            prefixPath = engineSetting.getDefaultValue();
        }
        String retailerImageWebPath = getRootAssetWebPath() + prefixPath + "/" + asset.getScopePathValue() + "/"
                + asset.getType() + "/" + asset.getPath();
        return handleWebPath(retailerImageWebPath);
    }

    // CMS

    public EngineSetting getSettingAssetCmsContentFilePath() {
        return getEngineSettingByCode(ENGINE_SETTING_CODE_ASSET_CMS_CONTENT_FILE_PATH);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getCmsContentImageFilePath(MarketArea marketArea, CmsContent cmsContent,
            CmsContentBlock cmsContentBlock, CmsContentAsset asset) throws Exception {
        String assetFileRootPath = getSettingAssetFileRootPath().getDefaultValue();
        assetFileRootPath.replaceAll("\\\\", "/");
        if (assetFileRootPath.endsWith("/")) {
            assetFileRootPath = assetFileRootPath.substring(0, assetFileRootPath.length() - 1);
        }
        String assetCmsContentFilePath = getSettingAssetCmsContentFilePath().getDefaultValue();
        assetCmsContentFilePath.replaceAll("\\\\", "/");
        if (assetCmsContentFilePath.endsWith("/")) {
            assetCmsContentFilePath = assetCmsContentFilePath.substring(0, assetCmsContentFilePath.length() - 1);
        }
        if (!assetCmsContentFilePath.startsWith("/")) {
            assetCmsContentFilePath = "/" + assetCmsContentFilePath;
        }

        String absoluteFolderPath = assetFileRootPath + assetCmsContentFilePath + "/"
                + marketArea.getName().toLowerCase() + "/" + cmsContent.getType().toLowerCase() + "/"
                + cmsContent.getCode().toLowerCase();
        if (cmsContentBlock != null) {
            if (cmsContentBlock.getCmsContentBlock() != null) {
                absoluteFolderPath += "/" + cmsContentBlock.getCmsContentBlock().getType() + "/"
                        + cmsContentBlock.getType();
            } else {
                absoluteFolderPath += "/" + cmsContentBlock.getType();
            }
        }
        absoluteFolderPath = absoluteFolderPath + "/" + asset.getType().toLowerCase() + "/";
        absoluteFolderPath = absoluteFolderPath.replace("_", "-").replace(" ", "-");
        return handleFilePath(absoluteFolderPath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getCmsContentImageWebPath(final AbstractCmsEntity cmsContent, final CmsContentAsset asset)
            throws Exception {
        EngineSetting engineSetting = getSettingAssetCmsContentFilePath();
        String prefixPath = "";
        if (engineSetting != null) {
            prefixPath = engineSetting.getDefaultValue();
        }
        String cmsContentImageWebPath = getRootAssetWebPath() + prefixPath + "/"
                + cmsContent.getMarketArea().getName().toLowerCase() + "/" + handleFilePath(cmsContent.getType())
                + "/";
        //        if("HOME".equals(cmsContent.getType()) || "MENU".equals(cmsContent.getType()) || "ARTICLE".equals(cmsContent.getType()) || "PAGE".equals(cmsContent.getType())){
        cmsContentImageWebPath += handleFilePath(cmsContent.getCode()) + "/" + handleFilePath(asset.getType()) + "/"
                + asset.getPath();
        //        } else {
        //            cmsContentImageWebPath += handleFilePath(asset.getScopePathValue()) + "/" + handleFilePath(asset.getType()) + "/" + asset.getPath();
        //        }
        if (cmsContentImageWebPath.endsWith("/")) {
            cmsContentImageWebPath = cmsContentImageWebPath.substring(0, cmsContentImageWebPath.length() - 1);
        }
        return handleWebPath(cmsContentImageWebPath);
    }

    /**
     * 
     */
    @CacheMethodInformation(cacheName = "web_cache_engine_setting_value", cacheType = CacheType.CACHE_STRING)
    public String getCmsContentImageWebPath(final AbstractCmsEntity cmsContent,
            final CmsContentBlock cmsContentBlock, final CmsContentAsset asset) throws Exception {
        EngineSetting engineSetting = getSettingAssetCmsContentFilePath();
        String prefixPath = "";
        if (engineSetting != null) {
            prefixPath = engineSetting.getDefaultValue();
        }
        String cmsContentImageWebPath = getRootAssetWebPath() + prefixPath + "/"
                + cmsContent.getMarketArea().getName().toLowerCase() + "/" + handleFilePath(cmsContent.getType())
                + "/" + handleFilePath(cmsContent.getCode()) + "/";
        if (cmsContentBlock != null) {
            if (cmsContentBlock.getCmsContentBlock() != null) {
                cmsContentImageWebPath += cmsContentBlock.getCmsContentBlock().getType() + "/"
                        + cmsContentBlock.getType() + "/" + handleFilePath(asset.getType()) + "/" + asset.getPath();
            } else {
                cmsContentImageWebPath += cmsContentBlock.getType() + "/" + handleFilePath(asset.getType()) + "/"
                        + asset.getPath();
            }
        } else {
            cmsContentImageWebPath += handleFilePath(asset.getType()) + "/" + asset.getPath();
        }
        if (cmsContentImageWebPath.endsWith("/")) {
            cmsContentImageWebPath = cmsContentImageWebPath.substring(0, cmsContentImageWebPath.length() - 1);
        }
        return handleWebPath(cmsContentImageWebPath);
    }

    protected String handleWebPath(String path) {
        if (StringUtils.isNotEmpty(path)) {
            return path.replace("_", "-").toLowerCase();
        }
        return path;
    }

    protected String handleFilePath(String path) {
        String newFilePath = path;
        if (StringUtils.isNotEmpty(newFilePath)) {
            newFilePath = newFilePath.replace("_", "-").toLowerCase();
            newFilePath = newFilePath.replace("&", "-").toLowerCase();
            newFilePath = newFilePath.replace("$", "-").toLowerCase();
            newFilePath = newFilePath.replace("%", "-").toLowerCase();
            newFilePath = CoreUtil.cleanDash(newFilePath);
            return newFilePath.toLowerCase();
        }
        return newFilePath;
    }

}