diff --git a/hera-core/.classpath b/hera-core/.classpath
index ab5ab66..a04d6f4 100644
--- a/hera-core/.classpath
+++ b/hera-core/.classpath
@@ -6,6 +6,10 @@
-
+
+
+
+
+
diff --git a/hera-core/src/doc/core.xml b/hera-core/src/doc/core.xml
new file mode 100644
index 0000000..73003ea
--- /dev/null
+++ b/hera-core/src/doc/core.xml
@@ -0,0 +1,256 @@
+
+
+ Core
+
+
+ Introduction
+
+ Host system provides a plugin interface providers have to implement.
+ Core system is build to hold a container of instances of this interface
+ and works with them.
+
+
+ Basic example of plugin interface and host
+
+ /**
+ * Interface contract for the providers to be implemented.
+ */
+public interface MyPluginInterface {
+
+ public void bar();
+}
+
+
+/**
+ * A host application class working with instances of the plugin
+ * interface.
+ */
+public class HostImpl implements Host {
+
+ private List<MyPluginInterface> plugins;
+
+ /**
+ * Setter to inject the plugins
+ */
+ public void setPlugins(List<MyPluginInterface> plugins) {
+ this.plugins = plugins;
+ }
+
+ /**
+ * Some business method actually working with the given plugins.
+ */
+ public void someBusinessMethod() {
+
+ for (MyPluginInterface plugin : plugins) {
+ plugin.bar();
+ }
+ }
+}
+
+
+ This is the way you would typically construct a host component in
+ general. Leveraging dependency injection via setters allows flexible usage
+ in a variety of environments. Thus you could easily provide a factory
+ class that is able to lookup
+ MyPluginInterface implementations from the
+ classpath, instantiate them and inject them into HostImpl.
+
+ Using Spring as component container you could configure something
+ like this:
+
+
+ Configuring HostImpl with Spring
+
+ <bean id="host" class="com.acme.HostImpl">
+ <property name="plugins">
+ <list>
+ <bean class="MyPluginImplementation" />
+ </list>
+ </property>
+</bean>
+
+
+ This is pretty much well known to Spring developers and let's us
+ face the wall that this is rather static. Everytime you want to add a new
+ plugin implementation instance you have to modify configuration of the
+ core. Let's see how we can get this dance a little more.
+
+
+
+ Collecting Spring beans dynamically
+
+ With the BeanListBeanFactoryPostProcessor
+ Hera provides a Spring container extension,
+ that allows to lookup beans of a given type in the current
+ ApplicationContext and register them as
+ list under a given name. Take a look at the configuration now:
+
+
+ Host and plugin configuration with Hera support
+
+ <import resource="classpath*:com/acme/**/plugins.xml" />
+
+<bean id="host" class="com.acme.HostImpl">
+ <property name="plugins" ref="plugins" />
+</bean>
+
+<bean class="org.synyx.hera.plugin.support.BeanListBeanFactoryPostProcessor">
+ <property name="lists">
+ <map>
+ <entry key="plugins" value="org.acme.MyPluginInterface" />
+ </map>
+ </property>
+</bean>
+
+ <!-- In a file called plugins.xml in the plugin project -->
+<bean class="MyPluginimplementation" />
+
+
+ You can see that we include a wildcarded configurationfile that
+ allows plugin projects to easily contribute plugin implementations by
+ declaring them as beans in configuration files matching the wildcarded
+ path. If you use Spring 2.5 component scanning you don't have to use the
+ import trick at all as Spring would detect the implementation
+ automatically as long as it is annotated with @Component,
+ @Service a.s.o.
+
+ The BeanListBeanFactoryPostProcessor in turn
+ allows registering a map of lists to be created, where the maps entry key
+ is the id under which the list will be registered and the entry's value is
+ the type to be looked up.
+
+
+ The design of the
+ BeanListBeanFactoryPostProcessor might seem a
+ little confusing at first (especially to set a map on a property named
+ lists). This is due to the posibility to register more than one list to
+ be looked up. We think about dropping this functionality for the sake of
+ simplicity in future versions.
+
+
+
+ A whole lotta XML - namespace to help!
+
+ Actually this already serves a lot of requirements we listed in
+ . Nevertheless the amount of XML to be
+ written is quite large. Furthermore it's rather not intuitive to
+ configure a bean id as key, and a type as value. We can heavily shrink
+ the XML required to a single line by providing a Spring namespace
+ boiling configuration down to this:
+
+
+ Host configuration using the plugin namespace
+
+ <import resource="classpath*:com/acme/**/plugins.xml" />
+
+<bean id="host" class="com.acme.HostImpl">
+ <property name="plugins" ref="plugins" />
+</bean>
+
+<plugin:list id="plugins" class="org.acme.MyPluginInterface" />
+
+
+ Suggested you have added the namespace XSD into Eclipse and
+ installed Spring IDE, you should get code completion on filling the
+ class attribute.
+
+
+
+
+ Plugin beans
+
+ Using plain interfaces and
+ BeanListBeanFactoryPostProcessor offers an easy way
+ to dynamically lookup beans in Spring environments. Nevertheless, very
+ often you face the situation that you want to have dedicated access to a
+ subset of all plugins, choose plugins by a given criteria or use a decent
+ default plugin or the like. Thus we need a basic infrastructure interface
+ for plugin interfaces to extend and a more sophisticated plugin
+ container.
+
+
+ Plugin
+
+ Hera's central infrastructure interfacte is
+ Plugin<S>, where S defines the
+ delimiter type you want to let implementations decide on, whether they
+ shall be invoked or not. Thus the plugin implementation have to
+ implement supports(S delimiter) to come to the
+ decision. Consider the following example:
+
+
+
+
+ public enum ProductType {
+
+ SOFTWARE, HARDWARE;
+}
+
+public interface ProductProcessor extends Plugin<ProductType> {
+
+ public void process(Product product);
+}
+
+
+ This design would allow plugin providers to implement
+ supports(ProductType productType) to decide
+ which product types they want to process and provide actual processing
+ logic in process(Product product).
+
+
+
+ PluginRegistry
+
+ Using a List as plugin container as
+ well as the Plugin interface you can now
+ select plugins supporting the given delimiter. To not reimplement the
+ lookup logic for common cases Hera provides a
+ PluginRegistry<T extends Plugin<S>,
+ S> that provides sophisticated methods to access certain
+ plugins:
+
+
+ Usage of the PluginRegistry
+
+ PluginRegistry<ProductProcessor, ProductType> registry =
+ PluginRegistry.create();
+
+// Add plugin instances
+registry.add(new FooImplementation());
+
+// Returns the first plugin supporting SOFTWARE
+registry.getPluginFor(ProductType.SOFTWARE);
+
+// Returns the first plugin supporting SOFTWARE,
+// or DefaultPlugin if none found
+registry.getPluginFor(ProductType.SOFTWARE, new DefaultPlugin());
+
+// Returns all plugins supporting HARDWARE,
+// throwing the given exception if none found
+registry.getPluginsFor(ProductType.HARDWARE, new MyException("Damn!");
+
+
+
+
+ Configuration and namespace
+
+ Similar to the
+ BeanListBeanFactoryPostProcessor described in
+ Hera provides a
+ PluginRegistryBeanFactoryPostProcessor to
+ automatically lookup beans of a dedicated type to be aggregated in a
+ PluginRegistry. Note that the type has to be
+ assignable to Plugin to let the registry
+ work as expected.
+
+ Furthermore there is also an element in the namespace to shrink
+ down configuration XML:
+
+
+ Using the XML namespace to configure a registry
+
+ <plugin:registry id="plugins" class="com.acme.MyPluginInterface" />
+
+
+
+
\ No newline at end of file
diff --git a/hera-metadata/src/doc/metadata.xml b/hera-metadata/src/doc/metadata.xml
new file mode 100644
index 0000000..57451c0
--- /dev/null
+++ b/hera-metadata/src/doc/metadata.xml
@@ -0,0 +1,6 @@
+
+
+ Metadata
+
+ TODO
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 76417a2..26afd73 100644
--- a/pom.xml
+++ b/pom.xml
@@ -64,6 +64,121 @@
+
+
+
+ com.agilejava.docbkx
+ docbkx-maven-plugin
+ 2.0.8
+
+
+
+ generate-html
+ generate-pdf
+
+ pre-site
+
+
+ false
+
+
+
+ org.docbook
+ docbook-xml
+ 4.4
+ runtime
+
+
+
+
+ ${basedir}/src/doc
+
+
+ ${basedir}/target/doc
+
+
+
+ src/doc/layout/pdf/fo-pdf.xsl
+
+
+
+ src/doc/layout/html/fo-html.xsl
+
+
+
+ resources/styles.css
+
+ true
+
+
+
+ StellaLining
+
+ normal
+
+ ${basedir}/src/doc/layout/pdf/fonts/SteLiR__.ttf
+
+
+ ${basedir}/src/doc/layout/pdf/fonts/SteLiR__.xml
+
+
+
+ StellaLining
+
+ normal
+
+ ${basedir}/src/doc/layout/pdf/fonts/SteLiI__.ttf
+
+
+ ${basedir}/src/doc/layout/pdf/fonts/SteLiI__.xml
+
+
+
+ StellaLining
+
+ bold
+
+ ${basedir}/src/doc/layout/pdf/fonts/SteLiB__.ttf
+
+
+ ${basedir}/src/doc/layout/pdf/fonts/SteLiB__.xml
+
+
+
+ StellaLining
+
+ bold
+
+ ${basedir}/src/doc/layout/pdf/fonts/SteLiBI_.ttf
+
+
+ ${basedir}/src/doc/layout/pdf/fonts/SteLiBI_.xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -107,7 +222,6 @@
* [maven-release-plugin] -
-
diff --git a/src/doc/hera-reference.xml b/src/doc/hera-reference.xml
new file mode 100644
index 0000000..fa7de77
--- /dev/null
+++ b/src/doc/hera-reference.xml
@@ -0,0 +1,168 @@
+
+
+
+]>
+
+
+
+ Hera
+
+ The smallest plugin system ever
+
+
+
+ Oliver
+
+ Gierke
+
+
+ Software Architect
+
+ Synyx GmbH & Co. KG
+
+
+ gierke@synyx.de
+
+ Karlstraße 68, 76137 Karsruhe, Germany
+
+
+
+ V0.1
+
+ 04.11.2008
+
+
+ 2008
+
+ Synyx GmbH & Co. KG
+
+
+
+
+ 04.11.2008
+
+
+ Oliver
+
+ Gierke
+
+
+ Initial draft
+
+
+
+
+
+ Preface
+
+
+ Introduction
+
+ Building extensible architectures nowadays is a core principle to
+ create maintainable applications. This is why fully fledged plugin
+ environments like OSGi are so
+ poular these days. Unfortunately the introduction of
+ OSGi introduces a lot of
+ complexity to projects.
+
+ Hera provides a more pragmatic approach to plugin development by
+ providing the core flexibility of having plugin implementations
+ extending a core system's functionality but of course not delivering
+ core OSGi features like dynamic class loading or
+ runtime installation and deployment of plugins. Although Hera thus is
+ not nearly as powerful as OSGi, it servers little man's
+ requirements to build a modular extensible application.
+
+
+
+ Context
+
+
+
+ You want to build an extensible architecture minimizing
+ overhead as much as possible
+
+
+
+ You cannot use OSGi as fully fledged plugin architecture for
+ whatever reasons
+
+
+
+ You want to express extensibility by providing dedicated
+ plugin interfaces
+
+
+
+ You want to extend the core system by simply providing an
+ implementation of the plugin interface bundled in a JAR file and
+ available in the classpath.
+
+
+
+ (You use Spring in your application)
+
+
+
+ The last point actually is not essential although Hera gains a lot
+ of momentum in collaborative use with Spring.
+
+
+
+ Technologies
+
+
+ Spring
+
+ Spring is the defacto standard application framework for Java
+ applications. Its consistent programming model, easy configuration and
+ wide support for all kinds of third party libraries makes it the first
+ class citizen of application frameworks. Hera tightly integrates into
+ Spring's component model and extends the core container with some
+ custom functionality.
+
+
+
+
+ &core;
+
+ &metadata;
+
+
+
+ O
+
+
+ OSGi
+
+
+ Open Services Gateway Initiative - a fully fledged plugin
+ runtime environment on top of the Java VM - http://en.wikipedia.org/wiki/OSGi.
+
+
+
+
+
+ X
+
+
+ XML
+
+
+ eXtensible Markup Language
+
+
+
+
+ XSD
+
+
+ Xml Schema Definition
+
+
+
+
+
\ No newline at end of file
diff --git a/src/doc/layout/html/fo-html.xsl b/src/doc/layout/html/fo-html.xsl
new file mode 100644
index 0000000..1209b7d
--- /dev/null
+++ b/src/doc/layout/html/fo-html.xsl
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+ html.css
+
+
+ 1
+ 0
+ 1
+ 0
+
+
+
+
+
+ book toc
+
+
+
+ 3
+
+
+
+
+ 1
+
+
+
+
+
+
+ 0
+
+
+ 90
+
+
+
+
+ 0
+
+
+
+
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+
+
+
+ ,
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/doc/layout/html/resources/styles.css b/src/doc/layout/html/resources/styles.css
new file mode 100644
index 0000000..072b3da
--- /dev/null
+++ b/src/doc/layout/html/resources/styles.css
@@ -0,0 +1,291 @@
+body {
+ font-family: Verdana, Arial, monospace;
+ text-align: justify;
+ width: 900px;
+ margin-right: auto;
+ margin-left: auto;
+}
+
+a,a[accesskey ^="h"],a[accesskey ^="n"],a[accesskey ^="u"],a[accesskey ^="p"]
+ {
+ font-family: Verdana, Arial, helvetica, sans-serif;
+ font-size: 12px;
+ color: #003399;
+}
+
+a:active {
+ color: #003399;
+}
+
+a:visited {
+ color: #888888;
+}
+
+p {
+ font-family: Verdana, Arial, sans-serif;
+}
+
+dt {
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 12px;
+}
+
+p,dl,dt,dd,blockquote {
+ color: #000000;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding-top: 0;
+}
+
+ol,ul,p {
+ margin-top: 6px;
+ margin-bottom: 6px;
+}
+
+p,blockquote {
+ font-size: 90%;
+}
+
+p.releaseinfo {
+ font-size: 100%;
+ font-weight: bold;
+ font-family: Verdana, Arial, helvetica, sans-serif;
+ padding-top: 10px;
+}
+
+p.pubdate {
+ font-size: 120%;
+ font-weight: bold;
+ font-family: Verdana, Arial, helvetica, sans-serif;
+}
+
+td {
+ font-size: 80%;
+}
+
+td,th,span {
+ color: #000000;
+}
+
+td[width ^="40%"] {
+ font-family: Verdana, Arial, helvetica, sans-serif;
+ font-size: 12px;
+ color: #003399;
+}
+
+table[summary ^="Navigation header"] tbody tr th[colspan ^="3"] {
+ font-family: Verdana, Arial, helvetica, sans-serif;
+}
+
+blockquote {
+ margin-right: 0;
+}
+
+h1,h2,h3,h4,h6,H6 {
+ color: #000000;
+ font-weight: 500;
+ margin-top: 0;
+ padding-top: 14px;
+ font-family: Verdana, Arial, helvetica, sans-serif;
+ margin-bottom: 0;
+}
+
+h2.title {
+ font-weight: 800;
+ margin-bottom: 8px;
+}
+
+h2.subtitle {
+ font-weight: 800;
+ margin-bottom: 20px;
+}
+
+.firstname,.surname {
+ font-size: 12px;
+ font-family: Verdana, Arial, helvetica, sans-serif;
+}
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ border: 1px black;
+ empty-cells: hide;
+ margin: 10px 0 30px 50px;
+ width: 90%;
+}
+
+div.table {
+ margin: 30px 0 30px 0;
+ border: 1px dashed gray;
+ padding: 10px;
+}
+
+div .table-contents table {
+ border: 1px solid black;
+}
+
+div.table>p.title {
+ padding-left: 10px;
+}
+
+table[summary ^="Navigation footer"] {
+ border-collapse: collapse;
+ border-spacing: 0;
+ border: 1px black;
+ empty-cells: hide;
+ margin: 0px;
+ width: 100%;
+}
+
+table[summary ^="Note"],table[summary ^="Warning"],table[summary ^="Tip"]
+ {
+ border-collapse: collapse;
+ border-spacing: 0;
+ border: 1px black;
+ empty-cells: hide;
+ margin: 10px 0px 10px -20px;
+ width: 100%;
+}
+
+td {
+ padding: 4pt;
+ font-family: Verdana, Arial, helvetica, sans-serif;
+}
+
+div.warning TD {
+ text-align: justify;
+}
+
+h1 {
+ font-size: 150%;
+}
+
+h2 {
+ font-size: 110%;
+}
+
+h3 {
+ font-size: 100%;
+ font-weight: bold;
+}
+
+h4 {
+ font-size: 90%;
+ font-weight: bold;
+}
+
+h5 {
+ font-size: 90%;
+ font-style: italic;
+}
+
+h6 {
+ font-size: 100%;
+ font-style: italic;
+}
+
+tt {
+ font-size: 110%;
+ font-family: "Courier New", Courier, monospace;
+ color: #000000;
+}
+
+.navheader,.navfooter {
+ border: none;
+}
+
+div.navfooter table {
+ background-color: #eef;
+}
+
+pre {
+ font-size: 110%;
+ padding: 5px;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #CCCCCC;
+ background-color: #eef;
+}
+
+ul,ol,li {
+ list-style: disc;
+}
+
+hr {
+ width: 100%;
+ height: 1px;
+ background-color: #CCCCCC;
+ border-width: 0;
+ padding: 0;
+}
+
+.variablelist {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ margin: 0;
+}
+
+.term {
+ font-weight: bold;
+}
+
+.mediaobject {
+ padding-top: 30px;
+ padding-bottom: 30px;
+}
+
+.legalnotice {
+ font-family: Verdana, Arial, helvetica, sans-serif;
+ font-size: 12px;
+ font-style: italic;
+}
+
+.sidebar {
+ float: right;
+ margin: 10px 0 10px 30px;
+ padding: 10px 20px 20px 20px;
+ width: 33%;
+ border: 1px solid black;
+ background-color: #F4F4F4;
+ font-size: 14px;
+}
+
+.property {
+ font-family: "Courier New", Courier, monospace;
+}
+
+a code {
+ font-family: Verdana, Arial, monospace;
+ font-size: 12px;
+}
+
+td code {
+ font-size: 110%;
+}
+
+div.note * td,div.tip * td,div.warning * td,div.calloutlist * td {
+ text-align: justify;
+ font-size: 100%;
+}
+
+.programlisting .interfacename,.programlisting .literal,.programlisting .classname
+ {
+ font-size: 95%;
+}
+
+.title .interfacename,.title .literal,.title .classname {
+ font-size: 130%;
+}
+
+/* everything in a is displayed in a coloured, comment-like font */
+.programlisting * .lineannotation,.programlisting * .lineannotation * {
+ color: green;
+}
+
+.question * p {
+ font-size: 100%;
+}
+
+.answer * p {
+ font-size: 100%;
+}
\ No newline at end of file
diff --git a/src/doc/layout/pdf/fo-pdf.xsl b/src/doc/layout/pdf/fo-pdf.xsl
new file mode 100644
index 0000000..221bd7c
--- /dev/null
+++ b/src/doc/layout/pdf/fo-pdf.xsl
@@ -0,0 +1,437 @@
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ,
+
+
+
+
+ (
+
+ ,
+
+ )
+
+
+
+ Copyright ©
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ book toc,title
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ 15mm
+ 10mm
+
+ 10mm
+ 10mm
+
+ 15mm
+ 15mm
+
+ 18mm
+ 18mm
+
+
+ 0pc
+
+
+
+
+ justify
+ true
+
+
+
+
+
+
+
+ blue
+ inherit
+
+
+
+
+ underline
+ inherit
+
+
+
+
+
+
+ StellaLining
+
+ StellaLining
+ 11
+ 9
+
+
+ 1.3
+
+
+
+
+
+
+ 0.9em
+
+
+
+
+
+ 15.4cm
+
+
+
+ 4pt
+ 4pt
+ 4pt
+ 4pt
+
+
+
+ 0.1pt
+ 0.1pt
+
+
+
+
+ 1
+
+
+
+
+
+
+
+ left
+ bold
+
+
+ pt
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.8em
+ 0.8em
+ 0.8em
+
+
+ pt
+
+ 0.1em
+ 0.1em
+ 0.1em
+
+
+ 0.6em
+ 0.6em
+ 0.6em
+
+
+ pt
+
+ 0.1em
+ 0.1em
+ 0.1em
+
+
+ 0.4em
+ 0.4em
+ 0.4em
+
+
+ pt
+
+ 0.1em
+ 0.1em
+ 0.1em
+
+
+
+
+ bold
+
+
+ pt
+
+ false
+ 0.4em
+ 0.6em
+ 0.8em
+
+
+
+
+
+
+
+
+ pt
+
+
+
+
+ always
+ 1em
+ 1em
+ 1em
+ #444444
+ solid
+ 0.1pt
+ 0.5em
+ 0.5em
+ 0.5em
+ 0.5em
+ 0.5em
+ 0.5em
+
+
+
+ 1
+
+ #F0F0F0
+
+
+
+
+
+ 0
+ 1
+
+
+ 79
+
+
+
+
+
+
+
+
+
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+
+
+
+ 1
+
+
+
+ 0.8em
+ 0.8em
+ 0.8em
+ 0.1em
+ 0.1em
+ 0.1em
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/doc/layout/pdf/fonts/SteLiBI_.ttf b/src/doc/layout/pdf/fonts/SteLiBI_.ttf
new file mode 100644
index 0000000..1423721
Binary files /dev/null and b/src/doc/layout/pdf/fonts/SteLiBI_.ttf differ
diff --git a/src/doc/layout/pdf/fonts/SteLiBI_.xml b/src/doc/layout/pdf/fonts/SteLiBI_.xml
new file mode 100644
index 0000000..66a9daa
--- /dev/null
+++ b/src/doc/layout/pdf/fonts/SteLiBI_.xml
@@ -0,0 +1 @@
+StellaLining,BoldItalic678525700-200-153-2581129946970-11TRUETYPEWinAnsiEncoding0255
\ No newline at end of file
diff --git a/src/doc/layout/pdf/fonts/SteLiB__.ttf b/src/doc/layout/pdf/fonts/SteLiB__.ttf
new file mode 100644
index 0000000..d4857e6
Binary files /dev/null and b/src/doc/layout/pdf/fonts/SteLiB__.ttf differ
diff --git a/src/doc/layout/pdf/fonts/SteLiB__.xml b/src/doc/layout/pdf/fonts/SteLiB__.xml
new file mode 100644
index 0000000..77ec256
--- /dev/null
+++ b/src/doc/layout/pdf/fonts/SteLiB__.xml
@@ -0,0 +1 @@
+StellaLining,Bold678514700-200-54-25711229223300TRUETYPEWinAnsiEncoding0255
\ No newline at end of file
diff --git a/src/doc/layout/pdf/fonts/SteLiI__.ttf b/src/doc/layout/pdf/fonts/SteLiI__.ttf
new file mode 100644
index 0000000..a4939f6
Binary files /dev/null and b/src/doc/layout/pdf/fonts/SteLiI__.ttf differ
diff --git a/src/doc/layout/pdf/fonts/SteLiI__.xml b/src/doc/layout/pdf/fonts/SteLiI__.xml
new file mode 100644
index 0000000..96d3cfe
--- /dev/null
+++ b/src/doc/layout/pdf/fonts/SteLiI__.xml
@@ -0,0 +1 @@
+StellaLining,Italic678522700-200-151-2581076907970-11TRUETYPEWinAnsiEncoding0255
\ No newline at end of file
diff --git a/src/doc/layout/pdf/fonts/SteLiR__.ttf b/src/doc/layout/pdf/fonts/SteLiR__.ttf
new file mode 100644
index 0000000..1bd0788
Binary files /dev/null and b/src/doc/layout/pdf/fonts/SteLiR__.ttf differ
diff --git a/src/doc/layout/pdf/fonts/SteLiR__.xml b/src/doc/layout/pdf/fonts/SteLiR__.xml
new file mode 100644
index 0000000..81ebb1e
--- /dev/null
+++ b/src/doc/layout/pdf/fonts/SteLiR__.xml
@@ -0,0 +1 @@
+StellaLining678504700-200-44-24510609093300TRUETYPEWinAnsiEncoding0255
\ No newline at end of file
diff --git a/src/doc/layout/pdf/highlight-fo.xsl b/src/doc/layout/pdf/highlight-fo.xsl
new file mode 100644
index 0000000..0681287
--- /dev/null
+++ b/src/doc/layout/pdf/highlight-fo.xsl
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/doc/layout/pdf/images/callouts/1.png b/src/doc/layout/pdf/images/callouts/1.png
new file mode 100644
index 0000000..7d47343
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/1.png differ
diff --git a/src/doc/layout/pdf/images/callouts/10.png b/src/doc/layout/pdf/images/callouts/10.png
new file mode 100644
index 0000000..997bbc8
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/10.png differ
diff --git a/src/doc/layout/pdf/images/callouts/11.png b/src/doc/layout/pdf/images/callouts/11.png
new file mode 100644
index 0000000..ce47dac
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/11.png differ
diff --git a/src/doc/layout/pdf/images/callouts/12.png b/src/doc/layout/pdf/images/callouts/12.png
new file mode 100644
index 0000000..31daf4e
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/12.png differ
diff --git a/src/doc/layout/pdf/images/callouts/13.png b/src/doc/layout/pdf/images/callouts/13.png
new file mode 100644
index 0000000..14021a8
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/13.png differ
diff --git a/src/doc/layout/pdf/images/callouts/14.png b/src/doc/layout/pdf/images/callouts/14.png
new file mode 100644
index 0000000..64014b7
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/14.png differ
diff --git a/src/doc/layout/pdf/images/callouts/15.png b/src/doc/layout/pdf/images/callouts/15.png
new file mode 100644
index 0000000..0d65765
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/15.png differ
diff --git a/src/doc/layout/pdf/images/callouts/2.png b/src/doc/layout/pdf/images/callouts/2.png
new file mode 100644
index 0000000..5d09341
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/2.png differ
diff --git a/src/doc/layout/pdf/images/callouts/3.png b/src/doc/layout/pdf/images/callouts/3.png
new file mode 100644
index 0000000..ef7b700
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/3.png differ
diff --git a/src/doc/layout/pdf/images/callouts/4.png b/src/doc/layout/pdf/images/callouts/4.png
new file mode 100644
index 0000000..adb8364
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/4.png differ
diff --git a/src/doc/layout/pdf/images/callouts/5.png b/src/doc/layout/pdf/images/callouts/5.png
new file mode 100644
index 0000000..4d7eb46
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/5.png differ
diff --git a/src/doc/layout/pdf/images/callouts/6.png b/src/doc/layout/pdf/images/callouts/6.png
new file mode 100644
index 0000000..0ba694a
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/6.png differ
diff --git a/src/doc/layout/pdf/images/callouts/7.png b/src/doc/layout/pdf/images/callouts/7.png
new file mode 100644
index 0000000..472e96f
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/7.png differ
diff --git a/src/doc/layout/pdf/images/callouts/8.png b/src/doc/layout/pdf/images/callouts/8.png
new file mode 100644
index 0000000..5e60973
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/8.png differ
diff --git a/src/doc/layout/pdf/images/callouts/9.png b/src/doc/layout/pdf/images/callouts/9.png
new file mode 100644
index 0000000..a0676d2
Binary files /dev/null and b/src/doc/layout/pdf/images/callouts/9.png differ
diff --git a/src/doc/layout/pdf/images/synyx-logo.tiff b/src/doc/layout/pdf/images/synyx-logo.tiff
new file mode 100644
index 0000000..11687d3
Binary files /dev/null and b/src/doc/layout/pdf/images/synyx-logo.tiff differ