/** * 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.lists.internal.exporter; import com.liferay.dynamic.data.lists.exporter.DDLExporter; import com.liferay.dynamic.data.lists.model.DDLRecord; import com.liferay.dynamic.data.lists.model.DDLRecordSetConstants; import com.liferay.dynamic.data.lists.model.DDLRecordSetVersion; import com.liferay.dynamic.data.lists.service.DDLRecordSetVersionService; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTypeServicesTracker; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldValueRenderer; import com.liferay.dynamic.data.mapping.model.DDMForm; import com.liferay.dynamic.data.mapping.model.DDMFormField; import com.liferay.dynamic.data.mapping.model.DDMFormFieldType; import com.liferay.dynamic.data.mapping.model.DDMStructureVersion; import com.liferay.dynamic.data.mapping.model.LocalizedValue; import com.liferay.dynamic.data.mapping.model.Value; import com.liferay.dynamic.data.mapping.render.DDMFormFieldValueRendererRegistry; import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue; import com.liferay.dynamic.data.mapping.storage.DDMFormValues; import com.liferay.portal.kernel.dao.orm.QueryUtil; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.util.HtmlUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.OrderByComparator; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.workflow.WorkflowConstants; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; /** * @author Marcellus Tavares * @author Manuel de la Peña */ public abstract class BaseDDLExporter implements DDLExporter { @Override public byte[] export(long recordSetId) throws Exception { return doExport( recordSetId, WorkflowConstants.STATUS_ANY, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null); } @Override public byte[] export(long recordSetId, int status) throws Exception { return doExport( recordSetId, status, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null); } @Override public byte[] export(long recordSetId, int status, int start, int end) throws Exception { return doExport(recordSetId, status, start, end, null); } @Override public byte[] export( long recordSetId, int status, int start, int end, OrderByComparator<DDLRecord> orderByComparator) throws Exception { return doExport(recordSetId, status, start, end, orderByComparator); } @Override public Locale getLocale() { if (_locale == null) { _locale = LocaleUtil.getSiteDefault(); } return _locale; } @Override public void setLocale(Locale locale) { _locale = locale; } protected abstract byte[] doExport( long recordSetId, int status, int start, int end, OrderByComparator<DDLRecord> orderByComparator) throws Exception; protected String formatDate( Date date, DateTimeFormatter dateTimeFormatter) { LocalDateTime localDateTime = LocalDateTime.ofInstant( date.toInstant(), ZoneId.systemDefault()); return dateTimeFormatter.format(localDateTime); } protected DateTimeFormatter getDateTimeFormatter() { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT); return dateTimeFormatter.withLocale(getLocale()); } protected abstract DDLRecordSetVersionService getDDLRecordSetVersionService(); protected DDMFormFieldRenderedValue getDDMFormFieldRenderedValue( int scope, DDMFormField ddmFormField, Map<String, List<DDMFormFieldValue>> ddmFormFieldValueMap) { List<DDMFormFieldValue> ddmForFieldValues = ddmFormFieldValueMap.get( ddmFormField.getName()); String valueString = StringPool.BLANK; if (scope == DDLRecordSetConstants.SCOPE_FORMS) { DDMFormFieldValueRenderer ddmFormFieldValueRenderer = getDDMFormFieldTypeServicesTracker(). getDDMFormFieldValueRenderer(ddmFormField.getType()); valueString = ddmFormFieldValueRenderer.render( ddmForFieldValues.get(0), getLocale()); } else { DDMFormFieldValueRendererRegistry ddmFormFieldValueRendererRegistry = getDDMFormFieldValueRendererRegistry(); com.liferay.dynamic.data.mapping.render.DDMFormFieldValueRenderer ddmFormFieldValueRenderer = ddmFormFieldValueRendererRegistry. getDDMFormFieldValueRenderer(ddmFormField.getType()); String ddmFormFieldType = ddmFormFieldValueRenderer.getSupportedDDMFormFieldType(); if (Objects.equals(DDMFormFieldType.TEXT_HTML, ddmFormFieldType)) { DDMFormFieldValue ddmFormFieldValue = ddmForFieldValues.get(0); Value value = ddmFormFieldValue.getValue(); valueString = HtmlUtil.escape(value.getString(getLocale())); } else { valueString = ddmFormFieldValueRenderer.render( ddmForFieldValues, getLocale()); } } valueString = HtmlUtil.render(valueString); return new DDMFormFieldRenderedValue( ddmFormField.getName(), ddmFormField.getLabel(), valueString); } protected abstract DDMFormFieldTypeServicesTracker getDDMFormFieldTypeServicesTracker(); protected abstract DDMFormFieldValueRendererRegistry getDDMFormFieldValueRendererRegistry(); protected Map<String, DDMFormField> getDistinctFields(long recordSetId) throws Exception { List<DDMStructureVersion> ddmStructureVersions = getStructureVersions( recordSetId); Map<String, DDMFormField> ddmFormFields = new LinkedHashMap<>(); for (DDMStructureVersion ddmStructureVersion : ddmStructureVersions) { DDMForm ddmForm = ddmStructureVersion.getDDMForm(); ddmFormFields.putAll(ddmForm.getDDMFormFieldsMap(true)); } return ddmFormFields; } protected Map<String, DDMFormFieldRenderedValue> getRenderedValues( int scope, Collection<DDMFormField> ddmFormFields, DDMFormValues ddmFormValues) throws Exception { Map<String, List<DDMFormFieldValue>> ddmFormFieldValueMap = ddmFormValues.getDDMFormFieldValuesMap(); Stream<DDMFormField> ddmFormFieldStream = ddmFormFields.stream().filter( ddmFormField -> ddmFormFieldValueMap.containsKey( ddmFormField.getName())); Stream<DDMFormFieldRenderedValue> valueStream = ddmFormFieldStream.map( ddmFormField -> getDDMFormFieldRenderedValue( scope, ddmFormField, ddmFormFieldValueMap)); return valueStream.collect( Collectors.toMap( DDMFormFieldRenderedValue::getFieldName, value -> value)); } protected String getStatusMessage(int status) { String statusLabel = WorkflowConstants.getStatusLabel(status); return LanguageUtil.get(_locale, statusLabel); } protected List<DDMStructureVersion> getStructureVersions(long recordSetId) throws Exception { DDLRecordSetVersionService recordSetVersionService = getDDLRecordSetVersionService(); List<DDLRecordSetVersion> recordSetVersions = recordSetVersionService.getRecordSetVersions( recordSetId, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null); List<DDMStructureVersion> ddmStructureVersions = new ArrayList<>(); for (DDLRecordSetVersion recordSetVersion : recordSetVersions) { ddmStructureVersions.add(recordSetVersion.getDDMStructureVersion()); } return ddmStructureVersions; } protected static class DDMFormFieldRenderedValue { protected DDMFormFieldRenderedValue( String fieldName, LocalizedValue label, String value) { _fieldName = fieldName; _label = label; _value = value; } protected String getFieldName() { return _fieldName; } protected LocalizedValue getLabel() { return _label; } protected String getValue() { return _value; } private final String _fieldName; private final LocalizedValue _label; private final String _value; } private Locale _locale; }