/** * 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.dynamic.data.mapping.util; import com.liferay.dynamic.data.mapping.annotations.DDMFormLayout; import com.liferay.dynamic.data.mapping.annotations.DDMFormLayoutColumn; import com.liferay.dynamic.data.mapping.annotations.DDMFormLayoutPage; import com.liferay.dynamic.data.mapping.annotations.DDMFormLayoutRow; import com.liferay.dynamic.data.mapping.model.LocalizedValue; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.util.AggregateResourceBundle; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.LocaleThreadLocal; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.PortalClassLoaderUtil; import com.liferay.portal.kernel.util.ResourceBundleUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.Validator; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.ResourceBundle; /** * @author Leonardo Barros * @author Marcellus Tavares */ public class DDMFormLayoutFactoryHelper { public DDMFormLayoutFactoryHelper(Class<?> clazz) { _clazz = clazz; _ddmFormLayout = clazz.getAnnotation(DDMFormLayout.class); setDefaultLocale(); } public com.liferay.dynamic.data.mapping.model.DDMFormLayout createDDMFormLayout() { com.liferay.dynamic.data.mapping.model.DDMFormLayout ddmFormLayout = new com.liferay.dynamic.data.mapping.model.DDMFormLayout(); ddmFormLayout.setDefaultLocale(_defaultLocale); ddmFormLayout.setPaginationMode(_ddmFormLayout.paginationMode()); for (DDMFormLayoutPage ddmFormLayoutPage : _ddmFormLayout.value()) { ddmFormLayout.addDDMFormLayoutPage( createDDMFormLayoutPage(ddmFormLayoutPage)); } return ddmFormLayout; } protected void collectResourceBundles( Class<?> clazz, List<ResourceBundle> resourceBundles, Locale locale) { for (Class<?> interfaceClass : clazz.getInterfaces()) { collectResourceBundles(interfaceClass, resourceBundles, locale); } ResourceBundle resourceBundle = ResourceBundleUtil.getBundle( "content.Language", locale, clazz.getClassLoader()); if (resourceBundle != null) { resourceBundles.add(resourceBundle); } } protected com.liferay.dynamic.data.mapping.model.DDMFormLayoutColumn createDDMFormLayoutColumn( DDMFormLayoutColumn ddmFormLayoutColumnAnnotation) { com.liferay.dynamic.data.mapping.model.DDMFormLayoutColumn ddmFormLayoutColumn = new com.liferay.dynamic.data.mapping.model.DDMFormLayoutColumn(); ddmFormLayoutColumn.setDDMFormFieldNames( ListUtil.fromArray(ddmFormLayoutColumnAnnotation.value())); ddmFormLayoutColumn.setSize(ddmFormLayoutColumnAnnotation.size()); return ddmFormLayoutColumn; } protected com.liferay.dynamic.data.mapping.model.DDMFormLayoutPage createDDMFormLayoutPage(DDMFormLayoutPage ddmFormLayoutPageAnnotation) { com.liferay.dynamic.data.mapping.model.DDMFormLayoutPage ddmFormLayoutPage = new com.liferay.dynamic.data.mapping.model.DDMFormLayoutPage(); LocalizedValue title = createDDMFormLayoutPageTitle( ddmFormLayoutPageAnnotation.title()); ddmFormLayoutPage.setTitle(title); for (DDMFormLayoutRow ddmFormLayoutRow : ddmFormLayoutPageAnnotation.value()) { ddmFormLayoutPage.addDDMFormLayoutRow( createDDMFormLayoutRow(ddmFormLayoutRow)); } return ddmFormLayoutPage; } protected LocalizedValue createDDMFormLayoutPageTitle(String title) { LocalizedValue localizedValue = new LocalizedValue(_defaultLocale); if (Validator.isNull(title)) { return localizedValue; } if (isLocalizableValue(title)) { String languageKey = extractLanguageKey(title); localizedValue.addString( _defaultLocale, getLocalizedValue(_defaultLocale, languageKey)); } else { localizedValue.addString(_defaultLocale, title); } return localizedValue; } protected com.liferay.dynamic.data.mapping.model.DDMFormLayoutRow createDDMFormLayoutRow(DDMFormLayoutRow ddmFormLayoutRowAnnotation) { com.liferay.dynamic.data.mapping.model.DDMFormLayoutRow ddmFormLayoutRow = new com.liferay.dynamic.data.mapping.model.DDMFormLayoutRow(); for (DDMFormLayoutColumn ddmFormLayoutColumn : ddmFormLayoutRowAnnotation.value()) { ddmFormLayoutRow.addDDMFormLayoutColumn( createDDMFormLayoutColumn(ddmFormLayoutColumn)); } return ddmFormLayoutRow; } protected String extractLanguageKey(String value) { return StringUtil.extractLast(value, StringPool.PERCENT); } protected LocalizedValue getDDMFormLayoutPageTitle(String title) { Locale defaultLocale = LocaleUtil.getDefault(); LocalizedValue localizedValue = new LocalizedValue(defaultLocale); if (Validator.isNull(title)) { return localizedValue; } if (isLocalizableValue(title)) { String languageKey = extractLanguageKey(title); localizedValue.addString( defaultLocale, getLocalizedValue(defaultLocale, languageKey)); } else { localizedValue.addString(defaultLocale, title); } return localizedValue; } protected String getLocalizedValue(Locale locale, String value) { ResourceBundle resourceBundle = getResourceBundle(locale); return LanguageUtil.get(resourceBundle, value); } protected ResourceBundle getResourceBundle(Locale locale) { List<ResourceBundle> resourceBundles = new ArrayList<>(); ResourceBundle portalResourceBundle = ResourceBundleUtil.getBundle( "content.Language", locale, PortalClassLoaderUtil.getClassLoader()); resourceBundles.add(portalResourceBundle); collectResourceBundles(_clazz, resourceBundles, locale); ResourceBundle[] resourceBundlesArray = resourceBundles.toArray( new ResourceBundle[resourceBundles.size()]); return new AggregateResourceBundle(resourceBundlesArray); } protected boolean isLocalizableValue(String value) { if (StringUtil.startsWith(value, StringPool.PERCENT)) { return true; } return false; } protected void setDefaultLocale() { Locale defaultLocale = LocaleThreadLocal.getThemeDisplayLocale(); if (defaultLocale == null) { defaultLocale = LocaleUtil.getDefault(); } _defaultLocale = defaultLocale; } private final Class<?> _clazz; private final DDMFormLayout _ddmFormLayout; private Locale _defaultLocale; }