/** * 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.model.impl; import com.liferay.dynamic.data.mapping.exception.StructureFieldException; import com.liferay.dynamic.data.mapping.model.DDMForm; import com.liferay.dynamic.data.mapping.model.DDMFormField; import com.liferay.dynamic.data.mapping.model.DDMFormLayout; import com.liferay.dynamic.data.mapping.model.DDMStructure; import com.liferay.dynamic.data.mapping.model.DDMStructureLayout; import com.liferay.dynamic.data.mapping.model.DDMStructureVersion; import com.liferay.dynamic.data.mapping.model.DDMTemplate; import com.liferay.dynamic.data.mapping.model.LocalizedValue; import com.liferay.dynamic.data.mapping.service.DDMStructureLayoutLocalServiceUtil; import com.liferay.dynamic.data.mapping.service.DDMStructureLocalServiceUtil; import com.liferay.dynamic.data.mapping.service.DDMStructureVersionLocalServiceUtil; import com.liferay.dynamic.data.mapping.service.DDMTemplateLocalServiceUtil; import com.liferay.portal.kernel.bean.BeanPropertiesUtil; import com.liferay.portal.kernel.exception.LocaleException; 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.model.Group; import com.liferay.portal.kernel.model.cache.CacheField; import com.liferay.portal.kernel.service.GroupLocalServiceUtil; import com.liferay.portal.kernel.theme.ThemeDisplay; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.PredicateFilter; import com.liferay.portal.kernel.util.SetUtil; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.util.PropsValues; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; /** * @author Brian Wing Shun Chan */ public class DDMStructureImpl extends DDMStructureBaseImpl { @Override public DDMForm createFullHierarchyDDMForm() throws PortalException { DDMForm fullHierarchyDDMForm = getDDMForm(); DDMStructure parentDDMStructure = getParentDDMStructure(); if (parentDDMStructure != null) { DDMForm ancestorsDDMForm = parentDDMStructure.createFullHierarchyDDMForm(); List<DDMFormField> ddmFormFields = fullHierarchyDDMForm.getDDMFormFields(); ddmFormFields.addAll(ancestorsDDMForm.getDDMFormFields()); } return fullHierarchyDDMForm; } @Override public String[] getAvailableLanguageIds() { DDMForm ddmForm = getDDMForm(); Set<Locale> availableLocales = ddmForm.getAvailableLocales(); return LocaleUtil.toLanguageIds( availableLocales.toArray(new Locale[availableLocales.size()])); } @Override public List<String> getChildrenFieldNames(String fieldName) throws PortalException { DDMFormField ddmFormField = getDDMFormField(fieldName); return getDDMFormFieldNames(ddmFormField.getNestedDDMFormFields()); } @Override public String getClassName() { if (_className == null) { _className = PortalUtil.getClassName(getClassNameId()); } return _className; } @Override public DDMForm getDDMForm() { if (_ddmForm == null) { try { _ddmForm = DDMStructureLocalServiceUtil.getStructureDDMForm( this); } catch (Exception e) { _log.error(e, e); return new DDMForm(); } } return new DDMForm(_ddmForm); } @Override public DDMFormField getDDMFormField(String fieldName) throws PortalException { Map<String, DDMFormField> ddmFormFieldsMap = getFullHierarchyDDMFormFieldsMap(true); DDMFormField ddmFormField = ddmFormFieldsMap.get(fieldName); if (ddmFormField == null) { throw new StructureFieldException( "Unable to find field " + fieldName); } return ddmFormField; } @Override public List<DDMFormField> getDDMFormFields(boolean includeTransientFields) { Map<String, DDMFormField> ddmFormFieldsMap = getFullHierarchyDDMFormFieldsMap(true); List<DDMFormField> ddmFormFields = new ArrayList<>( ddmFormFieldsMap.values()); if (includeTransientFields) { return ddmFormFields; } return filterTransientDDMFormFields(ddmFormFields); } @Override public DDMFormLayout getDDMFormLayout() throws PortalException { DDMStructureVersion structureVersion = getStructureVersion(); DDMStructureLayout ddmStructureLayout = DDMStructureLayoutLocalServiceUtil. getStructureLayoutByStructureVersionId( structureVersion.getStructureVersionId()); return ddmStructureLayout.getDDMFormLayout(); } @Override public String getDefaultLanguageId() { DDMForm ddmForm = getDDMForm(); return LocaleUtil.toLanguageId(ddmForm.getDefaultLocale()); } @Override public String getFieldDataType(String fieldName) throws PortalException { DDMFormField ddmFormField = getDDMFormField(fieldName); return ddmFormField.getDataType(); } @Override public String getFieldLabel(String fieldName, Locale locale) throws PortalException { DDMFormField ddmFormField = getDDMFormField(fieldName); LocalizedValue label = ddmFormField.getLabel(); return label.getString(locale); } @Override public String getFieldLabel(String fieldName, String locale) throws PortalException { return getFieldLabel(fieldName, LocaleUtil.fromLanguageId(locale)); } @Override public Set<String> getFieldNames() { List<DDMFormField> ddmFormFields = getDDMFormFields(false); List<String> ddmFormFieldNames = getDDMFormFieldNames(ddmFormFields); return SetUtil.fromList(ddmFormFieldNames); } @Override public String getFieldProperty(String fieldName, String property) throws PortalException { DDMFormField ddmFormField = getDDMFormField(fieldName); return BeanPropertiesUtil.getString(ddmFormField, property); } @Override public boolean getFieldRepeatable(String fieldName) throws PortalException { DDMFormField ddmFormField = getDDMFormField(fieldName); return ddmFormField.isRepeatable(); } @Override public boolean getFieldRequired(String fieldName) throws PortalException { DDMFormField ddmFormField = getDDMFormField(fieldName); return ddmFormField.isRequired(); } @Override public String getFieldTip(String fieldName, Locale locale) throws PortalException { DDMFormField ddmFormField = getDDMFormField(fieldName); LocalizedValue tip = ddmFormField.getTip(); return tip.getString(locale); } @Override public String getFieldTip(String fieldName, String locale) throws PortalException { return getFieldTip(fieldName, LocaleUtil.fromLanguageId(locale)); } @Override public String getFieldType(String fieldName) throws PortalException { DDMFormField ddmFormField = getDDMFormField(fieldName); return ddmFormField.getType(); } @Override public DDMForm getFullHierarchyDDMForm() { try { DDMForm fullHierarchyDDMForm = createFullHierarchyDDMForm(); return new DDMForm(fullHierarchyDDMForm); } catch (Exception e) { _log.error(e, e); } return new DDMForm(); } @Override public Map<String, DDMFormField> getFullHierarchyDDMFormFieldsMap( boolean includeNestedDDMFormFields) { DDMForm ddmForm = getFullHierarchyDDMForm(); return ddmForm.getDDMFormFieldsMap(includeNestedDDMFormFields); } @Override public DDMStructureVersion getLatestStructureVersion() throws PortalException { return DDMStructureVersionLocalServiceUtil.getLatestStructureVersion( getStructureId()); } @Override public List<String> getRootFieldNames() { DDMForm ddmForm = getFullHierarchyDDMForm(); return getDDMFormFieldNames(ddmForm.getDDMFormFields()); } @Override public DDMStructureVersion getStructureVersion() throws PortalException { return DDMStructureVersionLocalServiceUtil.getStructureVersion( getStructureId(), getVersion()); } @Override public List<DDMTemplate> getTemplates() { return DDMTemplateLocalServiceUtil.getTemplates(getStructureId()); } @Override public String getUnambiguousName( List<DDMStructure> structures, long groupId, final Locale locale) throws PortalException { if (getGroupId() == groupId) { return getName(locale); } boolean hasAmbiguousName = ListUtil.exists( structures, new PredicateFilter<DDMStructure>() { @Override public boolean filter(DDMStructure structure) { if (structure.getStructureId() == getStructureId()) { return false; } String name = structure.getName(locale); if (name.equals(getName(locale))) { return true; } return false; } }); if (hasAmbiguousName) { Group group = GroupLocalServiceUtil.getGroup(getGroupId()); return group.getUnambiguousName(getName(locale), locale); } return getName(locale); } /** * Returns the WebDAV URL to access the structure. * * @param themeDisplay the theme display needed to build the URL. It can * set HTTPS access, the server name, the server port, the path * context, and the scope group. * @param webDAVToken the WebDAV token for the URL * @return the WebDAV URL */ @Override public String getWebDavURL(ThemeDisplay themeDisplay, String webDAVToken) { StringBundler sb = new StringBundler(11); boolean secure = false; if (themeDisplay.isSecure() || PropsValues.WEBDAV_SERVLET_HTTPS_REQUIRED) { secure = true; } String portalURL = PortalUtil.getPortalURL( themeDisplay.getServerName(), themeDisplay.getServerPort(), secure); sb.append(portalURL); sb.append(themeDisplay.getPathContext()); sb.append(StringPool.SLASH); sb.append("webdav"); Group group = themeDisplay.getScopeGroup(); sb.append(group.getFriendlyURL()); sb.append(StringPool.SLASH); sb.append(webDAVToken); sb.append(StringPool.SLASH); sb.append("Structures"); sb.append(StringPool.SLASH); sb.append(getStructureId()); return sb.toString(); } @Override public boolean hasField(String fieldName) { Map<String, DDMFormField> ddmFormFieldsMap = getFullHierarchyDDMFormFieldsMap(true); return ddmFormFieldsMap.containsKey(fieldName); } @Override public boolean isFieldRepeatable(String fieldName) throws PortalException { DDMFormField ddmFormField = getDDMFormField(fieldName); return ddmFormField.isRepeatable(); } @Override public boolean isFieldTransient(String fieldName) throws PortalException { DDMFormField ddmFormField = getDDMFormField(fieldName); if (Validator.isNull(ddmFormField.getDataType())) { return true; } return false; } @Override public void prepareLocalizedFieldsForImport(Locale defaultImportLocale) throws LocaleException { super.prepareLocalizedFieldsForImport(defaultImportLocale); try { setDefinition( DDMStructureLocalServiceUtil. prepareLocalizedDefinitionForImport( this, defaultImportLocale)); } catch (Exception e) { throw new LocaleException(LocaleException.TYPE_EXPORT_IMPORT, e); } } @Override public void setClassName(String className) { _className = className; } @Override public void setDDMForm(DDMForm ddmForm) { _ddmForm = ddmForm; } @Override public void setDefinition(String definition) { super.setDefinition(definition); _ddmForm = null; } protected List<DDMFormField> filterTransientDDMFormFields( List<DDMFormField> ddmFormFields) { PredicateFilter<DDMFormField> predicateFilter = new PredicateFilter<DDMFormField>() { @Override public boolean filter(DDMFormField ddmFormField) { if (Validator.isNull(ddmFormField.getDataType())) { return false; } return true; } }; return ListUtil.filter(ddmFormFields, predicateFilter); } protected List<String> getDDMFormFieldNames( List<DDMFormField> ddmFormFields) { List<String> fieldNames = new ArrayList<>(); for (DDMFormField ddmFormField : ddmFormFields) { fieldNames.add(ddmFormField.getName()); } return fieldNames; } protected DDMStructure getParentDDMStructure() throws PortalException { if (getParentStructureId() == 0) { return null; } DDMStructure parentStructure = DDMStructureLocalServiceUtil.getStructure(getParentStructureId()); return parentStructure; } private static final Log _log = LogFactoryUtil.getLog( DDMStructureImpl.class); @CacheField private String _className; @CacheField(methodName = "DDMForm", propagateToInterface = true) private DDMForm _ddmForm; }