001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.journal.util;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
020    import com.liferay.portal.kernel.templateparser.BaseTransformerListener;
021    import com.liferay.portal.kernel.util.ArrayUtil;
022    import com.liferay.portal.kernel.util.GetterUtil;
023    import com.liferay.portal.kernel.util.LocaleUtil;
024    import com.liferay.portal.kernel.util.StringUtil;
025    import com.liferay.portal.kernel.xml.Document;
026    import com.liferay.portal.kernel.xml.Element;
027    import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
028    import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalServiceUtil;
029    
030    import java.util.List;
031    import java.util.Map;
032    
033    /**
034     * @author Raymond Aug??
035     */
036    public class LocaleTransformerListener extends BaseTransformerListener {
037    
038            @Override
039            public String onScript(
040                    String script, Document document, String languageId,
041                    Map<String, String> tokens) {
042    
043                    if (_log.isDebugEnabled()) {
044                            _log.debug("onScript");
045                    }
046    
047                    return StringUtil.replace(script, "@language_id@", languageId);
048            }
049    
050            @Override
051            public Document onXml(
052                    Document document, String languageId, Map<String, String> tokens) {
053    
054                    if (_log.isDebugEnabled()) {
055                            _log.debug("onXml");
056                    }
057    
058                    filterByLocalizability(document, tokens);
059    
060                    filterByLanguage(document, languageId);
061    
062                    return document;
063            }
064    
065            protected void filter(
066                            Element dynamicElementElement, DDMStructure ddmStructure,
067                            String name, String defaultLanguageId)
068                    throws PortalException {
069    
070                    boolean localizable = GetterUtil.getBoolean(
071                            ddmStructure.getFieldProperty(name, "localizable"));
072    
073                    List<Element> dynamicContentElements = dynamicElementElement.elements(
074                            "dynamic-content");
075    
076                    for (Element dynamicContentElement : dynamicContentElements) {
077                            String languageId = dynamicContentElement.attributeValue(
078                                    "language-id");
079    
080                            if (!localizable && !languageId.equals(defaultLanguageId)) {
081                                    dynamicElementElement.remove(dynamicContentElement);
082                            }
083                    }
084            }
085    
086            protected void filterByLanguage(Document document, String languageId) {
087                    Element rootElement = document.getRootElement();
088    
089                    String defaultLanguageId = LocaleUtil.toLanguageId(
090                            LocaleUtil.getSiteDefault());
091    
092                    String[] availableLanguageIds = StringUtil.split(
093                            rootElement.attributeValue("available-locales", defaultLanguageId));
094    
095                    String articleDefaultLanguageId = rootElement.attributeValue(
096                            "default-locale", defaultLanguageId);
097    
098                    if (!ArrayUtil.contains(availableLanguageIds, languageId, true)) {
099                            filterByLanguage(
100                                    rootElement, articleDefaultLanguageId, defaultLanguageId);
101                    }
102                    else {
103                            filterByLanguage(rootElement, languageId, defaultLanguageId);
104                    }
105            }
106    
107            protected void filterByLanguage(
108                    Element root, String languageId, String defaultLanguageId) {
109    
110                    Element defaultLanguageElement = null;
111    
112                    boolean hasLanguageIdElement = false;
113    
114                    for (Element element : root.elements()) {
115                            String tempLanguageId = element.attributeValue(
116                                    "language-id", languageId);
117    
118                            if (StringUtil.equalsIgnoreCase(tempLanguageId, languageId)) {
119                                    hasLanguageIdElement = true;
120    
121                                    filterByLanguage(element, languageId, defaultLanguageId);
122                            }
123                            else {
124                                    if (StringUtil.equalsIgnoreCase(
125                                                    tempLanguageId, defaultLanguageId)) {
126    
127                                            defaultLanguageElement = element;
128                                    }
129    
130                                    root.remove(element);
131                            }
132                    }
133    
134                    if (!hasLanguageIdElement && (defaultLanguageElement != null)) {
135                            root.add(defaultLanguageElement);
136    
137                            filterByLanguage(
138                                    defaultLanguageElement, languageId, defaultLanguageId);
139                    }
140            }
141    
142            protected void filterByLocalizability(
143                    Document document, Map<String, String> tokens) {
144    
145                    try {
146                            long ddmStructureId = GetterUtil.getLong(
147                                    tokens.get("ddm_structure_id"));
148    
149                            DDMStructure ddmStructure =
150                                    DDMStructureLocalServiceUtil.fetchDDMStructure(ddmStructureId);
151    
152                            if (ddmStructure == null) {
153                                    if (_log.isWarnEnabled()) {
154                                            _log.warn(
155                                                    "Not checking localization because dynamic data " +
156                                                            "mapping structure is not available");
157                                    }
158    
159                                    return;
160                            }
161    
162                            Element rootElement = document.getRootElement();
163    
164                            String defaultLanguageId = LocaleUtil.toLanguageId(
165                                    LocaleUtil.getSiteDefault());
166    
167                            String articleDefaultLanguageId = rootElement.attributeValue(
168                                    "default-locale", defaultLanguageId);
169    
170                            filterByLocalizability(
171                                    rootElement, articleDefaultLanguageId, ddmStructure);
172                    }
173                    catch (PortalException pe) {
174                            _log.error(pe);
175                    }
176                    catch (NullPointerException npe) {
177                            _log.error(npe);
178                    }
179            }
180    
181            protected void filterByLocalizability(
182                            Element root, String defaultLanguageId, DDMStructure ddmStructure)
183                    throws PortalException {
184    
185                    for (Element element : root.elements("dynamic-element")) {
186                            String name = element.attributeValue("name");
187    
188                            if (!ddmStructure.hasField(name)) {
189                                    continue;
190                            }
191    
192                            if (!ddmStructure.isFieldTransient(name)) {
193                                    filter(element, ddmStructure, name, defaultLanguageId);
194                            }
195    
196                            filterByLocalizability(element, defaultLanguageId, ddmStructure);
197                    }
198            }
199    
200            private static final Log _log = LogFactoryUtil.getLog(
201                    LocaleTransformerListener.class);
202    
203    }