Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java166
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()) {

Back to the top