]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.export.core/src/org/simantics/export/core/pdf/ServiceBasedPdfExportPageEvent.java
Merge commit 'ffdf837'
[simantics/platform.git] / bundles / org.simantics.export.core / src / org / simantics / export / core / pdf / ServiceBasedPdfExportPageEvent.java
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
8  *\r
9  * Contributors:\r
10  *     Semantum Oy - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.export.core.pdf;\r
13 \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
19 \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
26 \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
32 \r
33 /**\r
34  * @author Tuukka Lehtonen\r
35  * @since 1.22.2\r
36  */\r
37 public class ServiceBasedPdfExportPageEvent extends PdfPageEventHelper {\r
38     private static final Logger LOGGER = LoggerFactory.getLogger(ServiceBasedPdfExportPageEvent.class);\r
39 \r
40         Map<String, PdfExportPageEvent> events;\r
41         \r
42         public ServiceBasedPdfExportPageEvent() {\r
43                 // Read all page event contributions from the OSGi service\r
44                 events = collectEvents();\r
45         }\r
46 \r
47         private static Map<String, PdfExportPageEvent> collectEvents() {\r
48                 BundleContext context = Activator.getContext();\r
49                 Collection<ServiceReference<PdfExportPageEvent>> serviceReferences;\r
50                 try {\r
51                         serviceReferences = context.getServiceReferences(PdfExportPageEvent.class, null);\r
52                 } catch (InvalidSyntaxException e) {\r
53                         e.printStackTrace();\r
54                         serviceReferences = Collections.emptyList();\r
55                 }\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
61                 }\r
62                 return events;\r
63         }\r
64 \r
65         private void safeInvoke(String eventName, PdfExportPageEvent event, Consumer<PdfExportPageEvent> r) {\r
66                 try {\r
67                         r.accept(event);\r
68                 } catch (Exception e) {\r
69                         LOGGER.error("Failed to invoke PdfExportPageEvent::" + eventName + " for " + event.toString(), e);\r
70                 }\r
71         }\r
72 \r
73         @Override\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
76         }\r
77 \r
78         @Override\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
81         }\r
82 \r
83         @Override\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
86         }\r
87 \r
88         @Override\r
89         public void onOpenDocument(PdfWriter writer, Document document) {\r
90                 events.values().forEach(e -> safeInvoke("onOpenDocument", e, ee -> ee.onOpenDocument(writer, document)));\r
91         }\r
92 \r
93         @Override\r
94         public void onCloseDocument(PdfWriter writer, Document document) {\r
95                 events.values().forEach(e -> safeInvoke("onCloseDocument", e, ee -> ee.onCloseDocument(writer, document)));\r
96         }\r
97 \r
98         @Override\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
101         }\r
102 \r
103         @Override\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
106         }\r
107 \r
108         @Override\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
111         }\r
112 \r
113         @Override\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
116         }\r
117 \r
118         @Override\r
119         public void onStartPage(PdfWriter writer, Document document) {\r
120                 events.values().forEach(e -> safeInvoke("onStartPage", e, ee -> ee.onStartPage(writer, document)));\r
121         }\r
122 \r
123         @Override\r
124         public void onEndPage(PdfWriter writer, Document document) {\r
125                 events.values().forEach(e -> safeInvoke("onEndPage", e, ee -> ee.onEndPage(writer, document)));\r
126         }\r
127 \r
128 }\r