All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.tcdng.jacklyn.report.business.ReportServiceImpl Maven / Gradle / Ivy

/*
 * Copyright 2018-2019 The Code Department.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.tcdng.jacklyn.report.business;

import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.tcdng.jacklyn.common.business.AbstractJacklynBusinessService;
import com.tcdng.jacklyn.common.constants.JacklynApplicationAttributeConstants;
import com.tcdng.jacklyn.common.data.ReportColumnOptions;
import com.tcdng.jacklyn.common.data.ReportFilterOptions;
import com.tcdng.jacklyn.common.data.ReportJoinOptions;
import com.tcdng.jacklyn.common.data.ReportOptions;
import com.tcdng.jacklyn.common.utils.JacklynUtils;
import com.tcdng.jacklyn.report.constants.ReportModuleNameConstants;
import com.tcdng.jacklyn.report.constants.ReportModuleSysParamConstants;
import com.tcdng.jacklyn.report.entities.ReportableDefinition;
import com.tcdng.jacklyn.report.entities.ReportableDefinitionQuery;
import com.tcdng.jacklyn.report.entities.ReportableField;
import com.tcdng.jacklyn.report.entities.ReportableFieldQuery;
import com.tcdng.jacklyn.shared.report.ReportParameterConstants;
import com.tcdng.jacklyn.shared.xml.config.module.FieldConfig;
import com.tcdng.jacklyn.shared.xml.config.module.ManagedConfig;
import com.tcdng.jacklyn.shared.xml.config.module.ModuleConfig;
import com.tcdng.jacklyn.shared.xml.config.module.ParameterConfig;
import com.tcdng.jacklyn.shared.xml.config.module.ReportConfig;
import com.tcdng.jacklyn.system.business.SystemService;
import com.tcdng.jacklyn.system.constants.SystemModuleSysParamConstants;
import com.tcdng.unify.core.UnifyException;
import com.tcdng.unify.core.annotation.Component;
import com.tcdng.unify.core.annotation.Configurable;
import com.tcdng.unify.core.annotation.Transactional;
import com.tcdng.unify.core.constant.HAlignType;
import com.tcdng.unify.core.constant.OrderType;
import com.tcdng.unify.core.operation.Update;
import com.tcdng.unify.core.report.Report;
import com.tcdng.unify.core.report.ReportColumn;
import com.tcdng.unify.core.report.ReportFormat;
import com.tcdng.unify.core.report.ReportLayout;
import com.tcdng.unify.core.report.ReportServer;
import com.tcdng.unify.core.system.entities.ParameterDef;
import com.tcdng.unify.core.util.DataUtils;
import com.tcdng.unify.core.util.IOUtils;
import com.tcdng.unify.core.util.ReflectUtils;
import com.tcdng.unify.web.util.WebUtils;

/**
 * Default implementation of report business service.
 * 
 * @author Lateef Ojulari
 * @since 1.0
 */
@Transactional
@Component(ReportModuleNameConstants.REPORTSERVICE)
public class ReportServiceImpl extends AbstractJacklynBusinessService implements ReportService {

    @Configurable
    private SystemService systemService;

    @Override
    public List findReportables(ReportableDefinitionQuery query) throws UnifyException {
        return db().listAll(query.installed(Boolean.TRUE));
    }

    @Override
    public ReportableDefinition findReportDefinition(Long id) throws UnifyException {
        return db().list(ReportableDefinition.class, id);
    }

    @Override
    public List findRoleReportables(Long moduleId) throws UnifyException {
        // TODO
        return null;
    }

    @Override
    public ReportColumn[] findReportableColumns(String reportableName) throws UnifyException {
        ReportableDefinition reportableDefinition = db().find(new ReportableDefinitionQuery().name(reportableName));

        List reportFieldList =
                db().findAll(new ReportableFieldQuery().reportableId(reportableDefinition.getId())
                        .installed(Boolean.TRUE).orderById());

        ReportColumn[] reportColumns = new ReportColumn[reportFieldList.size()];
        for (int i = 0; i < reportColumns.length; i++) {
            ReportableField reportableField = reportFieldList.get(i);
            reportColumns[i] =
                    ReportColumn.newBuilder().title(reportableField.getDescription()).name(reportableField.getName())
                            .className(reportableField.getType()).widthRatio(reportableField.getWidth())
                            .formatter(reportableField.getFormatter())
                            .horizontalAlignment(HAlignType.fromName(reportableField.getHorizontalAlign())).build();
        }
        return reportColumns;
    }

    @Override
    public ReportOptions getDynamicReportOptions(String recordName, List priorityPropertyList)
            throws UnifyException {
        ReportableDefinition reportableDefinition =
                db().find(new ReportableDefinitionQuery().recordName(recordName).dynamic(true));
        ReportOptions reportOptions = new ReportOptions();
        reportOptions.setReportName(reportableDefinition.getName());
        reportOptions.setTitle(reportableDefinition.getTitle());
        reportOptions.setRecordName(recordName);

        Map fieldMap =
                db().listAllMap(String.class, "name", new ReportableFieldQuery()
                        .reportableId(reportableDefinition.getId()).parameterOnly(false).installed(Boolean.TRUE));
        boolean isSelectAll = priorityPropertyList == null;
        if (!isSelectAll) {
            for (String property : priorityPropertyList) {
                if (property != null) {
                    ReportableField reportableField = fieldMap.remove(property);
                    if (reportableField != null) {
                        reportOptions.addColumnOptions(createReportColumnOptions(reportableField, true));
                    }
                }
            }
        }

        for (ReportableField reportableField : fieldMap.values()) {
            // Add what's left
            reportOptions.addColumnOptions(createReportColumnOptions(reportableField, isSelectAll));
        }

        return reportOptions;
    }

    @Override
    public void generateDynamicReport(ReportOptions reportOptions, OutputStream outputStream) throws UnifyException {
        Report.Builder rb = Report.newBuilder();
        rb.code(reportOptions.getReportName());
        rb.title(reportOptions.getTitle());
        rb.dataSource(reportOptions.getDataSource());
        rb.dynamicDataSource(reportOptions.isDynamicDataSource());
        rb.printColumnNames(reportOptions.isPrintColumnNames());
        rb.underlineRows(reportOptions.isUnderlineRows());
        rb.shadeOddRows(reportOptions.isShadeOddRows());
        rb.landscape(reportOptions.isLandscape());
        rb.format(ReportFormat.fromName(reportOptions.getReportFormat()));
        if (reportOptions.isColumnarLayout()) {
            rb.layout(ReportLayout.COLUMNAR);
        }

        List reportColumnOptionsList =
                new ArrayList(reportOptions.getColumnOptionsList());
        DataUtils.sort(reportColumnOptionsList, ReportColumnOptions.class, "group", false);

        List sortReportColumnOptionsList = new ArrayList();
        for (ReportColumnOptions reportColumnOptions : reportColumnOptionsList) {
            if (reportColumnOptions.isIncluded()) {
                if (reportColumnOptions.isGroup() || reportColumnOptions.getOrder() != null) {
                    sortReportColumnOptionsList.add(reportColumnOptions);
                }

                rb.addColumn(reportColumnOptions.getDescription(), reportColumnOptions.getTableName(),
                        reportColumnOptions.getColumnName(), reportColumnOptions.getType(),
                        reportColumnOptions.getFormatter(), OrderType.fromName(reportColumnOptions.getOrder()),
                        reportColumnOptions.getHorizontalAlignment(), reportColumnOptions.getWidth(),
                        reportColumnOptions.isGroup(), reportColumnOptions.isSum());
            }
        }

        if (reportOptions.isBeanCollection()) {
            Class dataClass = ReflectUtils.getClassForName(reportOptions.getRecordName());
            List content = reportOptions.getContent();
            for (int i = sortReportColumnOptionsList.size() - 1; i >= 0; i--) {
                ReportColumnOptions reportColumnOptions = sortReportColumnOptionsList.get(i);
                DataUtils.sort(content, dataClass, reportColumnOptions.getColumnName(),
                        OrderType.ASCENDING.code().equals(reportColumnOptions.getOrder()));
            }
            rb.beanCollection(content);
        } else {
            rb.query(reportOptions.getQuery());
            rb.table(reportOptions.getTableName());

            if (reportOptions.isJoinOptions()) {
                for (ReportJoinOptions rjo : reportOptions.getJoinOptionsList()) {
                    rb.addJoin(rjo.getTableA(), rjo.getColumnA(), rjo.getTableB(), rjo.getColumnB());
                }
            }

            if (reportOptions.isFilterOptions()) {
                for (ReportFilterOptions rfo : reportOptions.getFilterOptionsList()) {
                    rb.addFilter(rfo.getOp(), rfo.getTableName(), rfo.getColumnName(), rfo.getParam1(),
                            rfo.getParam2());
                }
            }
        }

        Report report = rb.build();
        setCommonReportParameters(report);
        getCommonReportServer().generateReport(report, outputStream);
    }

    @Override
    public boolean isReportable(String recordName) throws UnifyException {
        return db().find(new ReportableDefinitionQuery().name(recordName)) != null;
    }

    @Override
    public void installFeatures(List moduleConfigList) throws UnifyException {
        // Uninstall old records
        db().updateAll(new ReportableDefinitionQuery().installed(Boolean.TRUE),
                new Update().add("installed", Boolean.FALSE));

        // Install new and update old
        ReportableDefinition reportableDefinition = new ReportableDefinition();
        for (ModuleConfig moduleConfig : moduleConfigList) {
            Long moduleId = systemService.getModuleId(moduleConfig.getName());
            if (moduleConfig.getReports() != null) {
                logDebug("Installing report definitions for module [{0}]...",
                        resolveApplicationMessage(moduleConfig.getDescription()));
                ReportableDefinitionQuery rdQuery = new ReportableDefinitionQuery();
                for (ReportConfig reportConfig : moduleConfig.getReports().getReportList()) {
                    rdQuery.clear();
                    String reportName = reportConfig.getName();
                    String description = resolveApplicationMessage(reportConfig.getDescription());
                    String title = reportConfig.getTitle();
                    if (title == null) {
                        title = description;
                    }

                    ReportableDefinition oldReportableDefinition = db().find(rdQuery.name(reportName));
                    Long reportableId = null;
                    if (oldReportableDefinition == null) {
                        reportableDefinition = new ReportableDefinition();
                        reportableDefinition.setModuleId(moduleId);
                        reportableDefinition.setName(reportName);
                        reportableDefinition.setRecordName(reportConfig.getReportable());
                        reportableDefinition.setTitle(title);
                        reportableDefinition.setDescription(description);
                        reportableDefinition.setTemplate(reportConfig.getTemplate());
                        reportableDefinition.setProcessor(reportConfig.getProcessor());
                        reportableDefinition.setDynamic(reportConfig.isDynamic());
                        reportableId = (Long) db().create(reportableDefinition);
                    } else {
                        // Update old definition
                        oldReportableDefinition.setRecordName(reportConfig.getReportable());
                        oldReportableDefinition.setTitle(title);
                        oldReportableDefinition.setDescription(description);
                        oldReportableDefinition.setTemplate(reportConfig.getTemplate());
                        oldReportableDefinition.setProcessor(reportConfig.getProcessor());
                        oldReportableDefinition.setDynamic(reportConfig.isDynamic());
                        oldReportableDefinition.setInstalled(Boolean.TRUE);
                        db().updateByIdVersion(oldReportableDefinition);
                        reportableId = oldReportableDefinition.getId();

                        // Delete old fields
                        db().deleteAll(new ReportableFieldQuery().reportableId(reportableId));
                    }

                    // Re-create/Create report fields
                    if (reportConfig.isManaged()) {
                        ManagedConfig managedConfig =
                                JacklynUtils.getManagedConfig(moduleConfig, reportConfig.getReportable());
                        ReportableField reportableField = new ReportableField();
                        reportableField.setReportableId(reportableId);
                        for (FieldConfig rfd : managedConfig.getFieldList()) {
                            if (rfd.isReportable()) {
                                reportableField.setDescription(rfd.getDescription());
                                reportableField.setFormatter(rfd.getFormatter());
                                reportableField.setHorizontalAlign(rfd.gethAlign());
                                reportableField.setName(rfd.getName());
                                reportableField.setParameterOnly(rfd.isParameterOnly());
                                reportableField.setType(rfd.getType());
                                reportableField.setWidth(rfd.getWidth());
                                db().create(reportableField);
                            }
                        }
                    }

                    // Re-create/Create report parameters
                    if (reportConfig.getParameters() != null) {
                        List parameterDefinitionList = new ArrayList();
                        for (ParameterConfig rpd : reportConfig.getParameters().getParameterList()) {
                            ParameterDef parameterDef = new ParameterDef();
                            parameterDef.setName(rpd.getName());
                            parameterDef.setDescription(rpd.getDescription());
                            parameterDef.setEditor(rpd.getEditor());
                            parameterDef.setType(rpd.getType());
                            parameterDef.setMandatory(rpd.isMandatory());
                            parameterDefinitionList.add(parameterDef);
                        }

                        getParameterService().defineParameters(reportName, parameterDefinitionList);
                    }
                }
            }
        }
    }

    private ReportServer getCommonReportServer() throws UnifyException {
        return (ReportServer) getApplicationAttribute(JacklynApplicationAttributeConstants.COMMON_REPORT_SERVER);
    }

    private ReportColumnOptions createReportColumnOptions(ReportableField reportableField, boolean included) {
        return new ReportColumnOptions(reportableField.getName(), reportableField.getDescription(),
                reportableField.getType(), reportableField.getFormatter(),
                HAlignType.fromName(reportableField.getHorizontalAlign()), reportableField.getWidth(), included);
    }

    private void setCommonReportParameters(Report report) throws UnifyException {
        report.setParameter(ReportParameterConstants.APPLICATION_TITLE, getUnifyComponentContext().getInstanceName());
        report.setParameter(ReportParameterConstants.CLIENT_TITLE,
                systemService.getSysParameterValue(String.class, SystemModuleSysParamConstants.SYSPARAM_CLIENT_TITLE));
        report.setParameter(ReportParameterConstants.REPORT_TITLE, report.getTitle());

        String imagePath =
                WebUtils.expandThemeTag(systemService.getSysParameterValue(String.class,
                        ReportModuleSysParamConstants.REPORT_CLIENT_LOGO));
        byte[] clientLogo = IOUtils.readFileResourceInputStream(imagePath, getUnifyComponentContext().getWorkingPath());
        report.setParameter(ReportParameterConstants.CLIENT_LOGO, clientLogo);

        String templatePath =
                systemService.getSysParameterValue(String.class, ReportModuleSysParamConstants.REPORT_TEMPLATE_PATH);
        String template = report.getTemplate();
        if (template == null) {
            String templateParameter = ReportModuleSysParamConstants.DYNAMIC_REPORT_PORTRAIT_TEMPLATE;
            if (report.isLandscape()) {
                templateParameter = ReportModuleSysParamConstants.DYNAMIC_REPORT_LANDSCAPE_TEMPLATE;
            }
            template = systemService.getSysParameterValue(String.class, templateParameter);
        }
        report.setTemplate(IOUtils.buildFilename(templatePath, template));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy