diff options
Diffstat (limited to 'org.eclipse.osbp.report/src/org/eclipse/osbp/report/ReportProvider.java')
-rw-r--r-- | org.eclipse.osbp.report/src/org/eclipse/osbp/report/ReportProvider.java | 166 |
1 files changed, 109 insertions, 57 deletions
diff --git a/org.eclipse.osbp.report/src/org/eclipse/osbp/report/ReportProvider.java b/org.eclipse.osbp.report/src/org/eclipse/osbp/report/ReportProvider.java index 3363e0f..05ff25e 100644 --- a/org.eclipse.osbp.report/src/org/eclipse/osbp/report/ReportProvider.java +++ b/org.eclipse.osbp.report/src/org/eclipse/osbp/report/ReportProvider.java @@ -3,9 +3,11 @@ * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) * * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 + * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 * * Contributors: * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation @@ -18,8 +20,9 @@ import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.logging.Level; import org.eclipse.birt.core.exception.BirtException; import org.eclipse.birt.core.framework.IPlatformContext; @@ -36,19 +39,26 @@ import org.eclipse.birt.report.engine.api.IRunAndRenderTask; import org.eclipse.birt.report.engine.api.PDFRenderOption; import org.eclipse.birt.report.model.api.ReportDesignHandle; import org.eclipse.birt.report.model.api.command.CustomMsgException; +import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.osbp.report.pdfservice.PDFService; -import org.eclipse.osbp.ui.api.customfields.IBlobService; import org.eclipse.osbp.ui.api.datamart.DatamartFilter; import org.eclipse.osbp.ui.api.datamart.DatamartFilter.FilterType; import org.eclipse.osbp.ui.api.datamart.IDataMart; import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService; import org.eclipse.osbp.ui.api.report.IReportProvider; -import org.eclipse.osbp.ui.api.themes.IThemeResourceService; import org.eclipse.osbp.ui.api.user.IUser; import org.eclipse.osbp.xtext.datamartdsl.DatamartDSLPackage; import org.eclipse.osbp.xtext.datamartdsl.DatamartDefinition; +import org.eclipse.osbp.xtext.reportdsl.Container; +import org.eclipse.osbp.xtext.reportdsl.DatamartTable; +import org.eclipse.osbp.xtext.reportdsl.Element; +import org.eclipse.osbp.xtext.reportdsl.GridCell; +import org.eclipse.osbp.xtext.reportdsl.GridRow; import org.eclipse.osbp.xtext.reportdsl.Report; import org.eclipse.osbp.xtext.reportdsl.ReportDSLPackage; +import org.eclipse.osbp.xtext.reportdsl.ReportDesignTemplate; +import org.eclipse.osbp.xtext.reportdsl.SomeGrid; +import org.eclipse.osbp.xtext.reportdsl.jvmmodel.Utilities; import org.osgi.service.component.annotations.Component; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -104,7 +114,7 @@ public class ReportProvider implements IReportProvider { } private final Logger LOGGER = LoggerFactory.getLogger(ReportProvider.class); - private static java.util.logging.Logger BIRT_LOGGER = java.util.logging.Logger.getLogger(ReportProvider.class.getName()); +// private static java.util.logging.Logger BIRT_LOGGER = java.util.logging.Logger.getLogger(ReportProvider.class.getName()); private IReportEngineFactory reportFactory = (IReportEngineFactory) Platform .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY); @@ -134,21 +144,21 @@ public class ReportProvider implements IReportProvider { } } - public void printReportAsPdf(String reportId, IUser user, IDSLMetadataService dslMetadataService, IBlobService blobService, Map<String, String> filters) { - PDFService.printReportAsPdf(get(reportId, user, dslMetadataService, blobService, filters), user.getPrintService()); + public void printReportAsPdf(String reportId, IEclipseContext eclipseContext, Map<String, String> filters) { + PDFService.printReportAsPdf(get(reportId, eclipseContext, filters), eclipseContext.get(IUser.class).getPrintService()); } - public ByteArrayInputStream get(String reportId, IUser user, IDSLMetadataService dslMetadataService, IBlobService blobService, Map<String, String> filters) { - return get(reportId, user, dslMetadataService, filters, IReportProvider.Rendering.PDF_PRINT_STREAM, null, blobService, null); + public ByteArrayInputStream get(String reportId, IEclipseContext eclipseContext, Map<String, String> filters) { + return get(reportId, eclipseContext, filters, IReportProvider.Rendering.PDF_PRINT_STREAM, null); } @SuppressWarnings("unchecked") - public ByteArrayInputStream get(String reportId, IUser user, - IDSLMetadataService dslMetadataService, Map<String, String> filters, + public ByteArrayInputStream get(String reportId, IEclipseContext eclipseContext, + Map<String, String> filters, IReportProvider.Rendering renderer, - IThemeResourceService themeResourceService, - IBlobService blobService, String outputPath) { + IDSLMetadataService dslMetadataService = eclipseContext.get(IDSLMetadataService.class); + IUser user = eclipseContext.get(IUser.class); if (reportEngine == null) { LOGGER.error("report engine not initialized"); return null; @@ -159,42 +169,20 @@ public class ReportProvider implements IReportProvider { LOGGER.error("report with id "+reportId+" not found"); return null; } + List<DatamartFilter> datamartFilters = new ArrayList<>(); + Map<String, IDataMart> datamarts = new HashMap<>(); String datamartId = dslMetadataService.getFullyQualifiedName(report.getDatamartRef()); - DatamartDefinition datamart = (DatamartDefinition) dslMetadataService.getMetadata(datamartId, DatamartDSLPackage.Literals.DATAMART_DEFINITION); - if(datamart == null) { - LOGGER.error("datamart with id "+datamartId+" not found"); - return null; - } - IDataMart datamartInstance = (IDataMart) dslMetadataService.getClassInstance(datamart, "datamart"); - if(datamartInstance == null) { - LOGGER.error("report with id "+reportId+" has invalid datamart "+datamartId); - return null; - } - datamartInstance.setUser(user); - // transform filter - ArrayList<DatamartFilter> datamartFilters = datamartInstance.getFilters(); - for(String inFilter:filters.keySet()) { - boolean found = false; - for(DatamartFilter outFilter:datamartFilters) { - if(outFilter.getName().equals(inFilter)) { - found = true; - if(outFilter.getType() == FilterType.BY_ID) { - StringBuilder builder = new StringBuilder(); - builder.append("'"); - builder.append(filters.get(inFilter)); - builder.append("'"); - outFilter.setSql(builder.toString()); - } else { - outFilter.addSelectedItem(filters.get(inFilter)); - } - } - } - if(!found) { - // append remaining filters - should be of type id - datamartFilters.add(new DatamartFilter(FilterType.BY_ID, inFilter, filters.get(inFilter))); + + IDataMart datamartInstance = instantiateDatamart(reportId, user, dslMetadataService, datamartId); + if(datamartInstance != null) { + datamarts.put(Utilities.getDataSetName(null, report.getDatamartRef()), datamartInstance); + datamartFilters.addAll(computeFilters(user, dslMetadataService, filters, datamartInstance)); + + if(report.getDesign() instanceof ReportDesignTemplate) { + iterateReportForDatamarts(reportId, user, dslMetadataService, filters, ((ReportDesignTemplate)report.getDesign()).getDetail(), datamartFilters, datamarts); } } - datamartInstance.computeConditions(); + // create report ByteArrayInputStream bis = null; IRunAndRenderTask task = null; @@ -211,18 +199,11 @@ public class ReportProvider implements IReportProvider { } task = reportEngine.createRunAndRenderTask(design); task.getAppContext().put( - IReportProvider.APPCONTEXT_THEMERESOURCESERVICE, - themeResourceService); - task.getAppContext().put( - IReportProvider.APPCONTEXT_DSLMETADATASERVICE, - dslMetadataService); - task.getAppContext().put( - IReportProvider.APPCONTEXT_BLOBSERVICE, - blobService); - task.getAppContext().put(IReportProvider.APPCONTEXT_USER, user); + IReportProvider.APPCONTEXT_ECLIPSECONTEXT, + eclipseContext); task.getAppContext().put( IReportProvider.APPCONTEXT_DATAMARTINSTANCE, - datamartInstance); + datamarts); task.getAppContext().put( IReportProvider.APPCONTEXT_FILTERMAP, datamartFilters); @@ -281,6 +262,77 @@ public class ReportProvider implements IReportProvider { return bis; } + private void iterateReportForDatamarts(String reportId, IUser user, IDSLMetadataService dslMetadataService, + Map<String, String> filters, Container container, List<DatamartFilter> datamartFilters, + Map<String, IDataMart> datamarts) { + for(Element element : container.getElements()) { + if (element instanceof DatamartTable){ + String alias = ((DatamartTable)element).getName(); + if(((DatamartTable)element).getDatamartRef() != null) { + String datamartSubId = dslMetadataService.getFullyQualifiedName(((DatamartTable)element).getDatamartRef()); + IDataMart datamartSubInstance = instantiateDatamart(reportId, user, dslMetadataService, datamartSubId); + if(datamartSubInstance != null) { + datamarts.put(Utilities.getDataSetName(alias, ((DatamartTable)element).getDatamartRef()), datamartSubInstance); + datamartFilters.addAll(computeFilters(user, dslMetadataService, filters, datamartSubInstance)); + } + } + } else if (element instanceof Container) { + iterateReportForDatamarts(reportId, user, dslMetadataService, filters, (Container)element, datamartFilters, datamarts); + } else if (element instanceof SomeGrid) { + for(GridRow row : ((SomeGrid)element).getRows()) { + for (GridCell cell : row.getCells()) { + iterateReportForDatamarts(reportId, user, dslMetadataService, filters, cell, datamartFilters, datamarts); + } + } + } + } + } + + private ArrayList<DatamartFilter> computeFilters(IUser user, IDSLMetadataService dslMetadataService, + Map<String, String> filters, IDataMart datamartInstance) { + // transform filter + ArrayList<DatamartFilter> datamartFilters = datamartInstance.getFilters(); + for(String inFilter:filters.keySet()) { + boolean found = false; + for(DatamartFilter outFilter:datamartFilters) { + if(outFilter.getName().equals(inFilter)) { + found = true; + if(outFilter.getType() == FilterType.BY_ID) { + StringBuilder builder = new StringBuilder(); + builder.append("'"); + builder.append(filters.get(inFilter)); + builder.append("'"); + outFilter.setSql(builder.toString()); + } else { + outFilter.addSelectedItem(filters.get(inFilter)); + } + } + } + if(!found) { + // append remaining filters - should be of type id + datamartFilters.add(new DatamartFilter(dslMetadataService, user, FilterType.BY_ID, inFilter, filters.get(inFilter))); + } + } + datamartInstance.computeConditions(); + return datamartFilters; + } + + private IDataMart instantiateDatamart(String reportId, IUser user, IDSLMetadataService dslMetadataService, + String datamartId) { + DatamartDefinition datamart = (DatamartDefinition) dslMetadataService.getMetadata(datamartId, DatamartDSLPackage.Literals.DATAMART_DEFINITION); + if(datamart == null) { + LOGGER.error("datamart with id {} not found", datamartId); + return null; + } + IDataMart datamartInstance = (IDataMart) dslMetadataService.getClassInstance(datamart, "datamart"); + if(datamartInstance == null) { + LOGGER.error("report with id {} has invalid datamart {}", reportId, datamartId); + return null; + } + datamartInstance.setUser(user); + return datamartInstance; + } + private void addTranslations(ReportDesignHandle reportDesignHandle, IDSLMetadataService dslMetadataService) { for (String locale : dslMetadataService.getTranslations().keySet()) { |