com.esofthead.mycollab.reporting.FormReportTemplateExecutor.java Source code

Java tutorial

Introduction

Here is the source code for com.esofthead.mycollab.reporting.FormReportTemplateExecutor.java

Source

/**
 * This file is part of mycollab-web.
 *
 * mycollab-web is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * mycollab-web 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with mycollab-web.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.esofthead.mycollab.reporting;

import com.esofthead.mycollab.common.domain.AuditChangeItem;
import com.esofthead.mycollab.common.domain.SimpleAuditLog;
import com.esofthead.mycollab.common.domain.SimpleComment;
import com.esofthead.mycollab.common.domain.criteria.AuditLogSearchCriteria;
import com.esofthead.mycollab.common.domain.criteria.CommentSearchCriteria;
import com.esofthead.mycollab.common.i18n.GenericI18Enum;
import com.esofthead.mycollab.common.service.AuditLogService;
import com.esofthead.mycollab.common.service.CommentService;
import com.esofthead.mycollab.core.MyCollabException;
import com.esofthead.mycollab.core.SimpleLogging;
import com.esofthead.mycollab.core.arguments.BasicSearchRequest;
import com.esofthead.mycollab.core.arguments.NumberSearchField;
import com.esofthead.mycollab.core.arguments.StringSearchField;
import com.esofthead.mycollab.core.utils.BeanUtility;
import com.esofthead.mycollab.core.utils.DateTimeUtils;
import com.esofthead.mycollab.core.utils.StringUtils;
import com.esofthead.mycollab.form.view.builder.type.AbstractDynaField;
import com.esofthead.mycollab.form.view.builder.type.DynaForm;
import com.esofthead.mycollab.form.view.builder.type.DynaSection;
import com.esofthead.mycollab.spring.AppContextUtil;
import com.esofthead.mycollab.vaadin.ui.formatter.DefaultFieldDisplayHandler;
import com.esofthead.mycollab.vaadin.ui.formatter.FieldGroupFormatter;
import com.esofthead.mycollab.vaadin.AppContext;
import com.esofthead.mycollab.vaadin.ui.registry.AuditLogRegistry;
import com.google.common.collect.Ordering;
import net.sf.dynamicreports.jasper.builder.JasperReportBuilder;
import net.sf.dynamicreports.report.builder.component.*;
import net.sf.dynamicreports.report.constant.PageOrientation;
import net.sf.dynamicreports.report.constant.PageType;
import net.sf.dynamicreports.report.exception.DRException;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.*;

import static net.sf.dynamicreports.report.builder.DynamicReports.cmp;
import static net.sf.dynamicreports.report.builder.DynamicReports.report;

/**
 * @author MyCollab Ltd
 * @since 5.2.11
 */
public class FormReportTemplateExecutor<B> extends ReportTemplateExecutor {
    private static final int FORM_CAPTION = 100;
    private static final Logger LOG = LoggerFactory.getLogger(FormReportTemplateExecutor.class);
    private static Ordering dateComparator = new Ordering() {
        @Override
        public int compare(Object o1, Object o2) {
            try {
                Date createTime1 = (Date) PropertyUtils.getProperty(o1, "createdtime");
                Date createTime2 = (Date) PropertyUtils.getProperty(o2, "createdtime");
                return createTime1.compareTo(createTime2);
            } catch (Exception e) {
                return 0;
            }
        }
    };
    private JasperReportBuilder reportBuilder;
    private MultiPageListBuilder titleContent;

    public FormReportTemplateExecutor(String reportTitle) {
        super(AppContext.getUser(), AppContext.getUserTimeZone(), AppContext.getUserLocale(), reportTitle,
                ReportExportType.PDF);
    }

    @Override
    protected void initReport() throws Exception {
        reportBuilder = report();
        titleContent = cmp.multiPageList();
        titleContent.add(defaultTitleComponent());
        reportBuilder.setParameters(parameters);
        reportBuilder.title(titleContent).setPageFormat(PageType.A4, PageOrientation.PORTRAIT)
                .pageFooter(cmp.pageXofY().setStyle(reportStyles.getBoldCenteredStyle())).setLocale(locale);
    }

    @Override
    protected void fillReport() throws DRException {
        printForm();
        printActivities();
    }

    private void printForm() {
        Map<String, Object> parameters = this.getParameters();
        B bean = (B) parameters.get("bean");
        FormReportLayout formReportLayout = (FormReportLayout) parameters.get("layout");
        FieldGroupFormatter fieldGroupFormatter = AuditLogRegistry
                .getFieldGroupFormatter(formReportLayout.getModuleName());

        try {
            String titleValue = (String) PropertyUtils.getProperty(bean, formReportLayout.getTitleField());
            HorizontalListBuilder historyHeader = cmp.horizontalList()
                    .add(cmp.text(titleValue).setStyle(reportStyles.getH2Style()));
            titleContent.add(historyHeader, cmp.verticalGap(10));
        } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
            throw new MyCollabException("Error", e);
        }

        DynaForm dynaForm = formReportLayout.getDynaForm();
        int sectionCount = dynaForm.getSectionCount();
        for (int i = 0; i < sectionCount; i++) {
            DynaSection section = dynaForm.getSection(i);
            if (section.isDeletedSection()) {
                continue;
            }

            if (StringUtils.isNotBlank(section.getHeader())) {
                HorizontalListBuilder historyHeader = cmp.horizontalList()
                        .add(cmp.text(section.getHeader()).setStyle(reportStyles.getH3Style()));
                titleContent.add(historyHeader, reportStyles.line(), cmp.verticalGap(10));
            }

            if (section.isDeletedSection() || section.getFieldCount() == 0) {
                continue;
            }

            if (section.getLayoutType() == DynaSection.LayoutType.ONE_COLUMN) {
                for (int j = 0; j < section.getFieldCount(); j++) {
                    AbstractDynaField dynaField = section.getField(j);
                    if (!formReportLayout.getExcludeFields().contains(dynaField.getFieldName())) {
                        String value = "";
                        try {
                            Object tmpVal = PropertyUtils.getProperty(bean, dynaField.getFieldName());
                            if (tmpVal != null) {
                                if (tmpVal instanceof Date) {
                                    value = DateTimeUtils.formatDateToW3C((Date) tmpVal);
                                } else {
                                    value = String.valueOf(tmpVal);
                                }
                            }
                        } catch (Exception e) {
                            LOG.error("Error while getting property {}", dynaField.getFieldName(), e);
                        }
                        HorizontalListBuilder newRow = cmp.horizontalList().add(
                                cmp.text(dynaField.getDisplayName()).setFixedWidth(FORM_CAPTION)
                                        .setStyle(reportStyles.getFormCaptionStyle()),
                                cmp.text(fieldGroupFormatter.getFieldDisplayHandler(dynaField.getFieldName())
                                        .getFormat().toString(value, false, "")));
                        titleContent.add(newRow);
                    }
                }
            } else if (section.getLayoutType() == DynaSection.LayoutType.TWO_COLUMN) {
                int columnIndex = 0;
                HorizontalListBuilder tmpRow = null;
                for (int j = 0; j < section.getFieldCount(); j++) {
                    AbstractDynaField dynaField = section.getField(j);
                    if (!formReportLayout.getExcludeFields().contains(dynaField.getFieldName())) {
                        String value = "";
                        try {
                            Object tmpVal = PropertyUtils.getProperty(bean, dynaField.getFieldName());
                            if (tmpVal != null) {
                                if (tmpVal instanceof Date) {
                                    value = DateTimeUtils.formatDateToW3C((Date) tmpVal);
                                } else {
                                    value = String.valueOf(tmpVal);
                                }
                            }
                        } catch (Exception e) {
                            LOG.error("Error while getting property {}", dynaField.getFieldName(), e);
                        }

                        try {
                            if (dynaField.isColSpan()) {
                                HorizontalListBuilder newRow = cmp.horizontalList().add(
                                        cmp.text(dynaField.getDisplayName()).setFixedWidth(FORM_CAPTION)
                                                .setStyle(reportStyles.getFormCaptionStyle()),
                                        cmp.text(
                                                fieldGroupFormatter.getFieldDisplayHandler(dynaField.getFieldName())
                                                        .getFormat().toString(value, false, "")));
                                titleContent.add(newRow);
                                columnIndex = 0;
                            } else {
                                if (columnIndex == 0) {
                                    tmpRow = cmp.horizontalList()
                                            .add(cmp.text(dynaField.getDisplayName()).setFixedWidth(FORM_CAPTION)
                                                    .setStyle(reportStyles.getFormCaptionStyle()),
                                                    cmp.text(fieldGroupFormatter
                                                            .getFieldDisplayHandler(dynaField.getFieldName())
                                                            .getFormat().toString(value, false, "")));
                                    titleContent.add(tmpRow);
                                } else {
                                    tmpRow.add(
                                            cmp.text(dynaField.getDisplayName()).setFixedWidth(FORM_CAPTION)
                                                    .setStyle(reportStyles.getFormCaptionStyle()),
                                            cmp.text(fieldGroupFormatter
                                                    .getFieldDisplayHandler(dynaField.getFieldName()).getFormat()
                                                    .toString(value, false, "")));
                                }

                                columnIndex++;
                                if (columnIndex == 2) {
                                    columnIndex = 0;
                                }
                            }
                        } catch (Exception e) {
                            LOG.error("Error while generate field " + BeanUtility.printBeanObj(dynaField));
                        }
                    }
                }
            } else {
                throw new MyCollabException("Does not support attachForm layout except 1 or 2 columns");
            }
        }
    }

    private void printActivities() {
        Map<String, Object> parameters = this.getParameters();
        B bean = (B) parameters.get("bean");
        Integer typeId;
        try {
            typeId = (Integer) PropertyUtils.getProperty(bean, "id");
        } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
            LOG.error("Error", e);
            return;
        }

        FormReportLayout formReportLayout = (FormReportLayout) parameters.get("layout");

        CommentService commentService = AppContextUtil.getSpringBean(CommentService.class);
        final CommentSearchCriteria commentCriteria = new CommentSearchCriteria();
        commentCriteria.setType(StringSearchField.and(formReportLayout.getModuleName()));
        commentCriteria.setTypeId(StringSearchField.and(typeId + ""));
        final int commentCount = commentService.getTotalCount(commentCriteria);

        AuditLogService auditLogService = AppContextUtil.getSpringBean(AuditLogService.class);
        final AuditLogSearchCriteria logCriteria = new AuditLogSearchCriteria();
        logCriteria.setSaccountid(new NumberSearchField(AppContext.getAccountId()));
        logCriteria.setType(StringSearchField.and(formReportLayout.getModuleName()));
        logCriteria.setTypeId(StringSearchField.and(typeId + ""));
        final int logCount = auditLogService.getTotalCount(logCriteria);
        int totalNums = commentCount + logCount;
        HorizontalListBuilder historyHeader = cmp.horizontalList()
                .add(cmp.text("History (" + totalNums + ")").setStyle(reportStyles.getH3Style()));
        titleContent.add(historyHeader, reportStyles.line(), cmp.verticalGap(10));

        List<SimpleComment> comments = commentService
                .findPagableListByCriteria(new BasicSearchRequest<>(commentCriteria, 0, Integer.MAX_VALUE));
        List<SimpleAuditLog> auditLogs = auditLogService
                .findPagableListByCriteria(new BasicSearchRequest<>(logCriteria, 0, Integer.MAX_VALUE));
        List activities = new ArrayList(commentCount + logCount);
        activities.addAll(comments);
        activities.addAll(auditLogs);
        Collections.sort(activities, dateComparator.reverse());
        for (Object activity : activities) {
            if (activity instanceof SimpleComment) {
                titleContent.add(buildCommentBlock((SimpleComment) activity), cmp.verticalGap(10));
            } else if (activity instanceof SimpleAuditLog) {
                ComponentBuilder component = buildAuditBlock((SimpleAuditLog) activity);
                if (component != null) {
                    titleContent.add(component, cmp.verticalGap(10));
                }
            } else {
                SimpleLogging.error("Do not support activity " + activity);
            }
        }
    }

    private ComponentBuilder buildCommentBlock(SimpleComment comment) {
        TextFieldBuilder<String> authorField = cmp
                .text(StringUtils.trimHtmlTags(AppContext.getMessage(GenericI18Enum.EXT_ADDED_COMMENT,
                        comment.getOwnerFullName(), AppContext.formatPrettyTime(comment.getCreatedtime())),
                        Integer.MAX_VALUE))
                .setStyle(reportStyles.getMetaInfoStyle());
        HorizontalListBuilder infoHeader = cmp.horizontalFlowList().add(authorField);
        return cmp
                .verticalList(infoHeader,
                        cmp.text(StringUtils.trimHtmlTags(comment.getComment(), Integer.MAX_VALUE)))
                .setStyle(reportStyles.getBorderStyle());
    }

    private ComponentBuilder buildAuditBlock(SimpleAuditLog auditLog) {
        List<AuditChangeItem> changeItems = auditLog.getChangeItems();
        FormReportLayout formReportLayout = (FormReportLayout) parameters.get("layout");
        FieldGroupFormatter fieldGroupFormatter = AuditLogRegistry
                .getFieldGroupFormatter(formReportLayout.getModuleName());
        if (CollectionUtils.isNotEmpty(changeItems)) {
            TextFieldBuilder<String> authorField = cmp
                    .text(StringUtils.trimHtmlTags(AppContext.getMessage(GenericI18Enum.EXT_MODIFIED_ITEM,
                            auditLog.getPostedUserFullName(),
                            AppContext.formatPrettyTime(auditLog.getPosteddate())), Integer.MAX_VALUE))
                    .setStyle(reportStyles.getMetaInfoStyle());
            HorizontalListBuilder infoHeader = cmp.horizontalFlowList().add(authorField);
            VerticalListBuilder block = cmp.verticalList().add(infoHeader).setStyle(reportStyles.getBorderStyle());
            for (int i = 0; i < changeItems.size(); i++) {
                AuditChangeItem item = changeItems.get(i);
                String fieldName = item.getField();

                DefaultFieldDisplayHandler fieldDisplayHandler = fieldGroupFormatter
                        .getFieldDisplayHandler(fieldName);
                if (fieldDisplayHandler != null) {
                    HorizontalListBuilder changeBlock = cmp.horizontalFlowList();
                    TextFieldBuilder<String> fieldLbl = cmp
                            .text(AppContext.getMessage(fieldDisplayHandler.getDisplayName()))
                            .setStyle(reportStyles.getMetaInfoStyle());
                    TextFieldBuilder<String> oldValue = cmp
                            .text(fieldDisplayHandler.getFormat().toString(item.getOldvalue(), false, ""));
                    TextFieldBuilder<String> newValue = cmp
                            .text(fieldDisplayHandler.getFormat().toString(item.getNewvalue(), false, ""));
                    changeBlock.add(fieldLbl, oldValue, cmp.text(" -> "), newValue);
                    block.add(changeBlock);
                }
            }
            return block;
        }
        return null;
    }

    @Override
    protected void outputReport(OutputStream outputStream) throws IOException, DRException {
        reportBuilder.toPdf(outputStream);
    }
}