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 + + + + , + + + + + + + + +
+

Authors

+

+ +

+
+ +
\ 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