1 /*******************************************************************************
\r
2 * Copyright (c) 2016 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * Semantum Oy - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.export.core.pdf;
\r
14 import java.util.Collection;
\r
15 import java.util.Collections;
\r
16 import java.util.HashMap;
\r
17 import java.util.Map;
\r
18 import java.util.function.Consumer;
\r
20 import org.osgi.framework.BundleContext;
\r
21 import org.osgi.framework.InvalidSyntaxException;
\r
22 import org.osgi.framework.ServiceReference;
\r
23 import org.simantics.export.core.internal.Activator;
\r
24 import org.slf4j.Logger;
\r
25 import org.slf4j.LoggerFactory;
\r
27 import com.lowagie.text.Document;
\r
28 import com.lowagie.text.Paragraph;
\r
29 import com.lowagie.text.Rectangle;
\r
30 import com.lowagie.text.pdf.PdfPageEventHelper;
\r
31 import com.lowagie.text.pdf.PdfWriter;
\r
34 * @author Tuukka Lehtonen
\r
37 public class ServiceBasedPdfExportPageEvent extends PdfPageEventHelper {
\r
38 private static final Logger LOGGER = LoggerFactory.getLogger(ServiceBasedPdfExportPageEvent.class);
\r
40 Map<String, PdfExportPageEvent> events;
\r
42 public ServiceBasedPdfExportPageEvent() {
\r
43 // Read all page event contributions from the OSGi service
\r
44 events = collectEvents();
\r
47 private static Map<String, PdfExportPageEvent> collectEvents() {
\r
48 BundleContext context = Activator.getContext();
\r
49 Collection<ServiceReference<PdfExportPageEvent>> serviceReferences;
\r
51 serviceReferences = context.getServiceReferences(PdfExportPageEvent.class, null);
\r
52 } catch (InvalidSyntaxException e) {
\r
53 e.printStackTrace();
\r
54 serviceReferences = Collections.emptyList();
\r
56 Map<String, PdfExportPageEvent> events = new HashMap<>(serviceReferences.size());
\r
57 for (ServiceReference<PdfExportPageEvent> reference : serviceReferences) {
\r
58 PdfExportPageEvent event = context.getService(reference);
\r
59 String eventName = event.toString();
\r
60 events.put(eventName, event);
\r
65 private void safeInvoke(String eventName, PdfExportPageEvent event, Consumer<PdfExportPageEvent> r) {
\r
68 } catch (Exception e) {
\r
69 LOGGER.error("Failed to invoke PdfExportPageEvent::" + eventName + " for " + event.toString(), e);
\r
74 public void onChapter(PdfWriter writer, Document document, float paragraphPosition, Paragraph title) {
\r
75 events.values().forEach(e -> safeInvoke("onChapter", e, ee -> ee.onChapter(writer, document, paragraphPosition, title)));
\r
79 public void onChapterEnd(PdfWriter writer, Document document, float position) {
\r
80 events.values().forEach(e -> safeInvoke("onChapterEnd", e, ee -> ee.onChapterEnd(writer, document, position)));
\r
84 public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
\r
85 events.values().forEach(e -> safeInvoke("onGenericTag", e, ee -> ee.onGenericTag(writer, document, rect, text)));
\r
89 public void onOpenDocument(PdfWriter writer, Document document) {
\r
90 events.values().forEach(e -> safeInvoke("onOpenDocument", e, ee -> ee.onOpenDocument(writer, document)));
\r
94 public void onCloseDocument(PdfWriter writer, Document document) {
\r
95 events.values().forEach(e -> safeInvoke("onCloseDocument", e, ee -> ee.onCloseDocument(writer, document)));
\r
99 public void onParagraph(PdfWriter writer, Document document, float paragraphPosition) {
\r
100 events.values().forEach(e -> safeInvoke("onParagraph", e, ee -> ee.onParagraph(writer, document, paragraphPosition)));
\r
104 public void onParagraphEnd(PdfWriter writer, Document document, float paragraphPosition) {
\r
105 events.values().forEach(e -> safeInvoke("onParagraphEnd", e, ee -> ee.onParagraphEnd(writer, document, paragraphPosition)));
\r
109 public void onSection(PdfWriter writer, Document document, float paragraphPosition, int depth, Paragraph title) {
\r
110 events.values().forEach(e -> safeInvoke("onSection", e, ee -> ee.onSection(writer, document, paragraphPosition, depth, title)));
\r
114 public void onSectionEnd(PdfWriter writer, Document document, float position) {
\r
115 events.values().forEach(e -> safeInvoke("onSectionEnd", e, ee -> ee.onSectionEnd(writer, document, position)));
\r
119 public void onStartPage(PdfWriter writer, Document document) {
\r
120 events.values().forEach(e -> safeInvoke("onStartPage", e, ee -> ee.onStartPage(writer, document)));
\r
124 public void onEndPage(PdfWriter writer, Document document) {
\r
125 events.values().forEach(e -> safeInvoke("onEndPage", e, ee -> ee.onEndPage(writer, document)));
\r