001
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
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 }