/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.journal.transformer; import com.liferay.dynamic.data.mapping.model.DDMStructure; import com.liferay.dynamic.data.mapping.service.DDMStructureLocalService; import com.liferay.journal.constants.JournalPortletKeys; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.templateparser.BaseTransformerListener; import com.liferay.portal.kernel.templateparser.TransformerListener; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.xml.Document; import com.liferay.portal.kernel.xml.Element; import java.util.List; import java.util.Map; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Raymond Augé */ @Component( immediate = true, property = {"javax.portlet.name=" + JournalPortletKeys.JOURNAL}, service = TransformerListener.class ) public class LocaleTransformerListener extends BaseTransformerListener { @Override public String onScript( String script, Document document, String languageId, Map<String, String> tokens) { if (_log.isDebugEnabled()) { _log.debug("onScript"); } return StringUtil.replace(script, "@language_id@", languageId); } @Override public Document onXml( Document document, String languageId, Map<String, String> tokens) { if (_log.isDebugEnabled()) { _log.debug("onXml"); } filterByLocalizability(document, tokens); filterByLanguage(document, languageId); return document; } protected void filter( Element dynamicElementElement, DDMStructure ddmStructure, String name, String defaultLanguageId) throws PortalException { boolean localizable = GetterUtil.getBoolean( ddmStructure.getFieldProperty(name, "localizable")); List<Element> dynamicContentElements = dynamicElementElement.elements( "dynamic-content"); for (Element dynamicContentElement : dynamicContentElements) { String languageId = dynamicContentElement.attributeValue( "language-id"); if (!localizable && !languageId.equals(defaultLanguageId)) { dynamicElementElement.remove(dynamicContentElement); } } } protected void filterByLanguage(Document document, String languageId) { Element rootElement = document.getRootElement(); String defaultLanguageId = LocaleUtil.toLanguageId( LocaleUtil.getSiteDefault()); String articleDefaultLanguageId = rootElement.attributeValue( "default-locale", defaultLanguageId); String[] availableLanguageIds = StringUtil.split( rootElement.attributeValue( "available-locales", articleDefaultLanguageId)); if (!ArrayUtil.contains(availableLanguageIds, languageId, true)) { filterByLanguage( rootElement, articleDefaultLanguageId, articleDefaultLanguageId); } else { filterByLanguage(rootElement, languageId, articleDefaultLanguageId); } } protected void filterByLanguage( Element root, String languageId, String defaultLanguageId) { Element defaultLanguageElement = null; boolean hasLanguageIdElement = false; for (Element element : root.elements()) { String tempLanguageId = element.attributeValue( "language-id", languageId); if (StringUtil.equalsIgnoreCase(tempLanguageId, languageId)) { if (Validator.isNotNull( element.attributeValue( "language-id", StringPool.BLANK))) { hasLanguageIdElement = true; } filterByLanguage(element, languageId, defaultLanguageId); } else { if (StringUtil.equalsIgnoreCase( tempLanguageId, defaultLanguageId)) { defaultLanguageElement = element; } root.remove(element); } } if (!hasLanguageIdElement && (defaultLanguageElement != null)) { root.add(defaultLanguageElement); filterByLanguage( defaultLanguageElement, languageId, defaultLanguageId); } } protected void filterByLocalizability( Document document, Map<String, String> tokens) { try { long ddmStructureId = GetterUtil.getLong( tokens.get("ddm_structure_id")); DDMStructure ddmStructure = _ddmStructureLocalService.fetchDDMStructure(ddmStructureId); if (ddmStructure == null) { if (_log.isWarnEnabled()) { _log.warn( "Not checking localization because dynamic data " + "mapping structure is not available"); } return; } Element rootElement = document.getRootElement(); String defaultLanguageId = LocaleUtil.toLanguageId( LocaleUtil.getSiteDefault()); String articleDefaultLanguageId = rootElement.attributeValue( "default-locale", defaultLanguageId); filterByLocalizability( rootElement, articleDefaultLanguageId, ddmStructure); } catch (PortalException pe) { _log.error(pe); } catch (NullPointerException npe) { _log.error(npe); } } protected void filterByLocalizability( Element root, String defaultLanguageId, DDMStructure ddmStructure) throws PortalException { for (Element element : root.elements("dynamic-element")) { String name = element.attributeValue("name"); if (!ddmStructure.hasField(name)) { continue; } if (!ddmStructure.isFieldTransient(name)) { filter(element, ddmStructure, name, defaultLanguageId); } filterByLocalizability(element, defaultLanguageId, ddmStructure); } } @Reference(unbind = "-") protected void setDDMStructureLocalService( DDMStructureLocalService ddmStructureLocalService) { _ddmStructureLocalService = ddmStructureLocalService; } private static final Log _log = LogFactoryUtil.getLog( LocaleTransformerListener.class); private DDMStructureLocalService _ddmStructureLocalService; }