Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ Import-Package: jakarta.inject;version="1.0.0",
org.eclipse.set.basis.viewgroups,
org.eclipse.set.core.services.configurationservice,
org.eclipse.set.core.services.dialog,
org.eclipse.set.core.services.enumtranslation,
org.eclipse.set.core.services.export,
org.eclipse.set.core.services.font,
org.eclipse.set.core.services.part,
Expand All @@ -93,6 +94,8 @@ Import-Package: jakarta.inject;version="1.0.0",
org.eclipse.set.utils.events,
org.eclipse.set.utils.excel,
org.eclipse.set.utils.exception,
org.eclipse.set.utils.export.xsl,
org.eclipse.set.utils.export.xsl.siteplan,
org.eclipse.set.utils.table,
org.eclipse.set.utils.table.transform,
org.eclipse.set.utils.viewgroups,
Expand All @@ -107,6 +110,7 @@ Service-Component: OSGI-INF/org.eclipse.set.feature.export.descriptions.ExportIn
OSGI-INF/org.eclipse.set.feature.export.exportservice.ExportServiceImpl.xml,
OSGI-INF/org.eclipse.set.feature.export.fop.FopServiceImpl.xml,
OSGI-INF/org.eclipse.set.feature.export.pdf.FopPdfExportBuilder.xml,
OSGI-INF/org.eclipse.set.feature.export.pdf.SiteplanPdfExportBuilder.xml,
OSGI-INF/org.eclipse.set.feature.export.tablediff.CustomTableDiffService.xml,
OSGI-INF/org.eclipse.set.feature.export.tm.TableModelExport.xml,
OSGI-INF/org.eclipse.set.feature.export.xlsx.ExcelExportBuilder.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
*/
package org.eclipse.set.feature.export.exportservice;

import java.awt.image.BufferedImage;
import java.nio.file.Path;
import java.util.LinkedList;
import java.util.List;
Expand Down Expand Up @@ -132,6 +133,23 @@ public void exportTitleboxPdf(final Titlebox titlebox, final Path pdfPath,
}
}

@Override
public void exportSiteplanPdf(final List<BufferedImage> imagesData,
final Titlebox titleBox, final FreeFieldInfo freeFieldInfo,
final String outputDir, final ToolboxPaths toolboxPaths,
final TableType tableType,
final OverwriteHandling overwriteHandling,
final Consumer<Exception> errorHandler) {
for (final TableExport builder : builders) {
try {
builder.exportSiteplanPdf(imagesData, titleBox, freeFieldInfo,
outputDir, toolboxPaths, tableType, overwriteHandling);
} catch (final Exception e) {
errorHandler.accept(e);
}
}
}

/**
* @param builder
* the builder to be removed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,10 @@ public void activate()
throws IOException, SAXException, ConfigurationException {
final FopFactoryBuilder fopFactoryBuilder = new FopFactoryBuilder(
new File(".").toURI(), proxyResourceResolver); //$NON-NLS-1$

fopFactory = fopFactoryBuilder.build();
fopFactory.getRendererFactory().addDocumentHandlerMaker(
new FopPDFDocumentHandlerMaker(fontService));
fopFactory.getRendererFactory()
.addDocumentHandlerMaker(
new FopPDFDocumentHandlerMaker(fontService));
transformerFactory = TransformerFactory.newInstance();
}

Expand Down Expand Up @@ -149,11 +149,11 @@ public void fop(final OutputFormat outputFormat, final Source stylesheet,
this.resourceResolver = userResourceResolver;
}
if (stylesheet == null) {
transformerFactory.newTransformer().transform(xmlData,
saxResult);
transformerFactory.newTransformer()
.transform(xmlData, saxResult);
} else {
transformerFactory.newTransformer(stylesheet).transform(xmlData,
saxResult);
transformerFactory.newTransformer(stylesheet)
.transform(xmlData, saxResult);
}
// Restore resource resolver to default
this.resourceResolver = defaultResourceResolver;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
package org.eclipse.set.feature.export.pdf;

import static java.nio.charset.StandardCharsets.UTF_8;
import static org.eclipse.set.utils.export.xsl.TransformTable.toStreamSource;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
Expand Down Expand Up @@ -40,14 +42,16 @@
import org.eclipse.set.basis.constants.TableType;
import org.eclipse.set.basis.exceptions.FileExportException;
import org.eclipse.set.basis.extensions.PathExtensions;
import org.eclipse.set.core.services.enumtranslation.EnumTranslationService;
import org.eclipse.set.model.tablemodel.Table;
import org.eclipse.set.model.titlebox.Titlebox;
import org.eclipse.set.ppmodel.extensions.EObjectExtensions;
import org.eclipse.set.services.export.TableExport;
import org.eclipse.set.services.fop.FopService;
import org.eclipse.set.services.fop.FopService.OutputFormat;
import org.eclipse.set.services.fop.FopService.PdfAMode;
import org.eclipse.set.utils.ToolboxConfiguration;
import org.eclipse.set.utils.table.transform.TransformTable;
import org.eclipse.set.utils.export.xsl.TransformTable;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
Expand All @@ -67,6 +71,9 @@
@Component(immediate = true)
public class FopPdfExportBuilder implements TableExport {

@Reference
EnumTranslationService enumTranslationService;

protected static final Logger logger = LoggerFactory
.getLogger(FopPdfExportBuilder.class);

Expand Down Expand Up @@ -136,15 +143,17 @@ protected static Table getTableToBeExported(
if (invTable != null) {
return invTable;
}
// if we do not have a final table we export the table of the single
// if we do not have a final table we export the table of the
// single
// container of a state
return tables.get(TableType.SINGLE);
case PLANNING_RECORDS: {
final Table planTable = tables.get(TableType.DIFF);
if (planTable != null) {
return planTable;
}
// if we do not have a diff table we export the table of the single
// if we do not have a diff table we export the table of the
// single
// container of a state
return tables.get(TableType.SINGLE);
}
Expand Down Expand Up @@ -225,9 +234,9 @@ private void createTablePdf(final Document xslDoc,
tableDocumentText.getBytes(UTF_8));
final StreamSource tableDocumentSource = new StreamSource(
tableDocumentStream);
fopService.fop(OutputFormat.PDF,
TransformTable.toStreamSource(xslDoc), tableDocumentSource,
outputPath, pdfAMode, overwriteHandling, null);
fopService.fop(OutputFormat.PDF, toStreamSource(xslDoc),
tableDocumentSource, outputPath, pdfAMode,
overwriteHandling, null);
} else {
logger.error("Cant export table: " + shortcut); //$NON-NLS-1$
}
Expand Down Expand Up @@ -276,6 +285,15 @@ public void exportTitleboxPdf(final Titlebox titlebox, final Path pdfPath,
}
}

@Override
public void exportSiteplanPdf(final List<BufferedImage> imagesData,
final Titlebox titleBox, final FreeFieldInfo freeFieldInfo,
final String outputDir, final ToolboxPaths toolboxPaths,
final TableType tableType,
final OverwriteHandling overwriteHandling) {
// do nothing
}

/**
* @return the template directory
*/
Expand Down Expand Up @@ -340,20 +358,11 @@ private Path getTemplateFilename(final String shortcut) {
return Paths.get(getTemplateDir(), shortcut + "_vorlage.xsl"); //$NON-NLS-1$
}

// IMPROVE: This translation should replace by EnumTranslationService in 2.0
// version.
protected static String translationTableType(final TableType tableType) {
if (tableType == null) {
return null;
}
switch (tableType) {
case INITIAL:
return "Startzustand"; //$NON-NLS-1$
case FINAL:
return "Zielzustand"; //$NON-NLS-1$
default:
return null;
}
protected String translationTableType(final TableType tableType) {
return EObjectExtensions
.getNullableObject(tableType, type -> enumTranslationService
.translate(type).getPresentation())
.orElse(null);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
/**
* Copyright (c) 2025 DB InfraGO AG and others
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
*/
package org.eclipse.set.feature.export.pdf;

import static java.nio.charset.StandardCharsets.UTF_8;
import static org.eclipse.set.basis.ToolboxPaths.ExportPathExtension.TABLE_PDF_EXPORT_EXTENSION;
import static org.eclipse.set.utils.export.xsl.TransformTable.toStreamSource;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.poi.UnsupportedFileFormatException;
import org.eclipse.set.basis.FreeFieldInfo;
import org.eclipse.set.basis.OverwriteHandling;
import org.eclipse.set.basis.Pair;
import org.eclipse.set.basis.ToolboxPaths;
import org.eclipse.set.basis.constants.ExportType;
import org.eclipse.set.basis.constants.TableType;
import org.eclipse.set.basis.exceptions.FileExportException;
import org.eclipse.set.model.tablemodel.Table;
import org.eclipse.set.model.titlebox.Titlebox;
import org.eclipse.set.services.export.TableExport;
import org.eclipse.set.services.fop.FopService;
import org.eclipse.set.services.fop.FopService.OutputFormat;
import org.eclipse.set.services.fop.FopService.PdfAMode;
import org.eclipse.set.utils.ToolboxConfiguration;
import org.eclipse.set.utils.export.xsl.siteplan.SiteplanXSL;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

/**
* Export site plan to PDF via FOP.
*
* @author Truong
*/
@Component(immediate = true, service = TableExport.class)
public class SiteplanPdfExportBuilder extends FopPdfExportBuilder {

private static final String SITEPLAN_EXPORT_NAME = "SI"; //$NON-NLS-1$

/**
* @param fopService
* the FOP Service
*/
@Override
@Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.STATIC, unbind = "-")
public void setFopService(final FopService fopService) {
this.fopService = fopService;
}

private static String createImageDocumentText(
final List<BufferedImage> imagesData, final Titlebox titleBox,
final FreeFieldInfo freeFieldInfo)
throws ParserConfigurationException, TransformerException {
final TableToTableDocument tableToXmlFo = TableToTableDocument
.createTransformation();
final Document document = tableToXmlFo.transformToDocument(imagesData,
titleBox, freeFieldInfo);
final Transformer documentToString = newTransformerFactory()
.newTransformer();
final DOMSource source = new DOMSource(document);
final StringWriter writer = new StringWriter();
final StreamResult result = new StreamResult(writer);
documentToString.transform(source, result);
return writer.toString();
}

@Override
public void exportTitleboxImage(final Titlebox titlebox,
final Path imagePath, final OverwriteHandling overwriteHandling)
throws Exception {
// do nothing
}

@Override
public void exportTitleboxPdf(final Titlebox titlebox, final Path pdfPath,
final OverwriteHandling overwriteHandling) throws Exception {
// do nothing
}

@Override
public void export(final Map<TableType, Table> tables,
final ExportType exportType, final Titlebox titlebox,
final FreeFieldInfo freeFieldInfo, final String shortcut,
final String outputDir, final ToolboxPaths toolboxPaths,
final TableType tableType,
final OverwriteHandling overwriteHandling)
throws FileExportException {
// do nothing
}

@Override
public void exportSiteplanPdf(final List<BufferedImage> imagesData,
final Titlebox titleBox, final FreeFieldInfo freeFieldInfo,
final String outputDir, final ToolboxPaths toolboxPaths,
final TableType tableType,
final OverwriteHandling overwriteHandling) {

try {
final String imageDocumentText = createImageDocumentText(imagesData,
titleBox, freeFieldInfo);

if (ToolboxConfiguration.isDevelopmentMode()) {
exportTableDocument(
Paths.get(outputDir,
getFilename(SITEPLAN_EXPORT_NAME, "xml")), //$NON-NLS-1$
imageDocumentText);
}
final ByteArrayInputStream tableDocumentStream = new ByteArrayInputStream(
imageDocumentText.getBytes(UTF_8));
final StreamSource imageDocumentSource = new StreamSource(
tableDocumentStream);
final Pair<String, StreamSource> xslStreamSource = getSiteplanXSLTemplate(
imagesData, tableType, outputDir);
final Path outputPath = toolboxPaths.getTableExportPath(
SITEPLAN_EXPORT_NAME + "_" + xslStreamSource.getFirst(), //$NON-NLS-1$
Paths.get(outputDir), ExportType.PLANNING_RECORDS,
TABLE_PDF_EXPORT_EXTENSION);
fopService.fop(OutputFormat.PDF, xslStreamSource.getSecond(),
imageDocumentSource, outputPath, PdfAMode.PDF_A_3a,
overwriteHandling, null);

} catch (final Exception e) {
throw new FileExportException(
Path.of(outputDir, SITEPLAN_EXPORT_NAME), e);
}
}

private Pair<String, StreamSource> getSiteplanXSLTemplate(
final List<BufferedImage> imagesData, final TableType tableType,
final String outputDir) throws ParserConfigurationException,
SAXException, IOException, NullPointerException,
TransformerException, UnsupportedFileFormatException {
final SiteplanXSL siteplanXSL = new SiteplanXSL(imagesData,
translationTableType(tableType));
final Document xslDoc = siteplanXSL.getXSLDocument();
final String pageDIN = siteplanXSL.getPageStyle()
.getPageDIN()
.toString();
if (ToolboxConfiguration.isDevelopmentMode()) {
final Transformer documentToString = newTransformerFactory()
.newTransformer();
final DOMSource source = new DOMSource(xslDoc);
final StringWriter writer = new StringWriter();
final StreamResult result = new StreamResult(writer);
documentToString.transform(source, result);
exportTableDocument(
Path.of(outputDir,
getFilename(SITEPLAN_EXPORT_NAME + "_" + pageDIN, //$NON-NLS-1$
"xsl")), //$NON-NLS-1$
writer.toString());
}
return new Pair<>(pageDIN, toStreamSource(xslDoc));
}

}
Loading
Loading