/* * #%L * BroadleafCommerce CMS Module * %% * Copyright (C) 2009 - 2013 Broadleaf Commerce * %% * Licensed 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. * #L% */ package org.broadleafcommerce.cms.page.service; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.broadleafcommerce.cms.field.domain.FieldDefinition; import org.broadleafcommerce.cms.page.dao.PageDao; import org.broadleafcommerce.cms.page.domain.Page; import org.broadleafcommerce.cms.page.domain.PageAttribute; import org.broadleafcommerce.cms.page.domain.PageField; import org.broadleafcommerce.cms.page.domain.PageItemCriteria; import org.broadleafcommerce.cms.page.domain.PageRule; import org.broadleafcommerce.cms.page.domain.PageTemplateFieldGroupXref; import org.broadleafcommerce.common.dao.GenericEntityDao; import org.broadleafcommerce.common.extension.ExtensionResultHolder; import org.broadleafcommerce.common.extension.ExtensionResultStatusType; import org.broadleafcommerce.common.file.service.StaticAssetPathService; import org.broadleafcommerce.common.page.dto.PageDTO; import org.broadleafcommerce.common.presentation.client.SupportedFieldType; import org.broadleafcommerce.common.sandbox.SandBoxHelper; import org.broadleafcommerce.common.structure.dto.ItemCriteriaDTO; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.annotation.Resource; /** * This method is able to convert a fieldKey * Created by bpolster. */ @Service("blPageServiceUtility") public class PageServiceUtility { protected static final Log LOG = LogFactory.getLog(PageServiceUtility.class); protected static String AND = " && "; protected static final String FOREIGN_LOOKUP = "BLC_FOREIGN_LOOKUP"; @Resource(name="blPageDao") protected PageDao pageDao; @Resource(name = "blGenericEntityDao") protected GenericEntityDao genericDao; @Resource(name = "blPageServiceExtensionManager") protected PageServiceExtensionManager extensionManager; @Resource(name="blStaticAssetPathService") protected StaticAssetPathService staticAssetPathService; @Resource(name = "blSandBoxHelper") protected SandBoxHelper sandBoxHelper; public PageDTO buildPageDTO(Page page, boolean secure) { PageDTO pageDTO = new PageDTO(); pageDTO.setId(page.getId()); pageDTO.setDescription(page.getDescription()); pageDTO.setUrl(page.getFullUrl()); pageDTO.setPriority(page.getPriority()); if (page.getPageTemplate() != null) { pageDTO.setTemplatePath(page.getPageTemplate().getTemplatePath()); if (page.getPageTemplate().getLocale() != null) { pageDTO.setLocaleCode(page.getPageTemplate().getLocale().getLocaleCode()); } } for (String fieldKey : page.getPageFields().keySet()) { addPageFieldToDTO(page, secure, pageDTO, fieldKey); } pageDTO.setRuleExpression(buildRuleExpression(page)); if (page.getQualifyingItemCriteria() != null && page.getQualifyingItemCriteria().size() > 0) { pageDTO.setItemCriteriaDTOList(buildItemCriteriaDTOList(page)); } for (Entry<String, PageAttribute> entry : page.getAdditionalAttributes().entrySet()) { pageDTO.getPageAttributes().put(entry.getKey(), entry.getValue().getValue()); } pageDTO.getPageAttributes().put("title", page.getMetaTitle()); pageDTO.getPageAttributes().put("metaDescription", page.getMetaDescription()); return pageDTO; } public void addPageFieldToDTO(Page page, boolean secure, PageDTO pageDTO, String fieldKey) { addPageFieldToDTO(page, secure, pageDTO, fieldKey, null); } public void addPageFieldToDTO(Page page, boolean secure, PageDTO pageDTO, String fieldKey, String originalValue) { String cmsPrefix = staticAssetPathService.getStaticAssetUrlPrefix(); PageField pf = page.getPageFields().get(fieldKey); if (originalValue == null) { originalValue = pf.getValue(); } FieldDefinition fd = getFieldDefinition(page, fieldKey); if (fd != null && fd.getFieldType() == SupportedFieldType.ADDITIONAL_FOREIGN_KEY) { pageDTO.getPageFields().put(fieldKey, FOREIGN_LOOKUP + '|' + fd.getAdditionalForeignKeyClass() + '|' + originalValue); } else if (StringUtils.isNotBlank(originalValue) && StringUtils.isNotBlank(cmsPrefix) && originalValue.contains(cmsPrefix)) { //This may either be an ASSET_LOOKUP image path or an HTML block (with multiple <img>) or a plain STRING that contains the cmsPrefix. //If there is an environment prefix configured (e.g. a CDN), then we must replace the cmsPrefix with this one. String fldValue = staticAssetPathService.convertAllAssetPathsInContent(originalValue, secure); pageDTO.getPageFields().put(fieldKey, fldValue); } else { pageDTO.getPageFields().put(fieldKey, originalValue); } } protected FieldDefinition getFieldDefinition(Page page, String fieldKey) { ExtensionResultHolder<FieldDefinition> erh = new ExtensionResultHolder<FieldDefinition>(); ExtensionResultStatusType result = extensionManager.getProxy().getFieldDefinition(erh, page, fieldKey); if (result == ExtensionResultStatusType.HANDLED) { return erh.getResult(); } if (page.getPageTemplate() != null) { for (PageTemplateFieldGroupXref fgXrefs : page.getPageTemplate().getFieldGroupXrefs()) { for (FieldDefinition fd : fgXrefs.getFieldGroup().getFieldDefinitions()) { if (fd.getName().equals(fieldKey)) { return fd; } } } } return null; } protected String buildRuleExpression(Page page) { StringBuffer ruleExpression = null; Map<String, PageRule> ruleMap = page.getPageMatchRules(); if (ruleMap != null) { for (String ruleKey : ruleMap.keySet()) { if (ruleExpression == null) { ruleExpression = new StringBuffer(ruleMap.get(ruleKey).getMatchRule()); } else { ruleExpression.append(AND); ruleExpression.append(ruleMap.get(ruleKey).getMatchRule()); } } } if (ruleExpression != null) { return ruleExpression.toString(); } else { return null; } } protected List<ItemCriteriaDTO> buildItemCriteriaDTOList(Page page) { List<ItemCriteriaDTO> itemCriteriaDTOList = new ArrayList<ItemCriteriaDTO>(); for (PageItemCriteria criteria : page.getQualifyingItemCriteria()) { ItemCriteriaDTO criteriaDTO = new ItemCriteriaDTO(); criteriaDTO.setMatchRule(criteria.getMatchRule()); criteriaDTO.setQty(criteria.getQuantity()); itemCriteriaDTOList.add(criteriaDTO); } return itemCriteriaDTOList; } public PageDTO hydrateForeignLookups(PageDTO page) { for (Entry<String, Object> entry : page.getPageFields().entrySet()) { if (entry.getValue() instanceof String && ((String) entry.getValue()).startsWith(FOREIGN_LOOKUP)) { page.getForeignPageFields().put(entry.getKey(), entry.getValue()); } } if (page.getForeignPageFields().size() > 0) { PageDTO clone = new PageDTO(); clone.copy(page); for (Entry<String, Object> entry : page.getForeignPageFields().entrySet()) { String clazz = ((String) entry.getValue()).split("\\|")[1]; String id = ((String) entry.getValue()).split("\\|")[2]; Object newValue = null; if (StringUtils.isNotBlank(clazz) && StringUtils.isNotBlank(id) && !"null".equals(id)) { newValue = genericDao.readGenericEntity(genericDao.getImplClass(clazz), id); } if (newValue != null) { clone.getPageFields().put(entry.getKey(), newValue); } else { clone.getPageFields().remove(entry.getKey()); } } return clone; } else { return page; } } }