strolch-website/docs/documentation/components/index.html

63 lines
15 KiB
HTML

<!doctype html><html lang=en class="js csstransforms3d"><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=generator content="Hugo 0.80.0"><meta name=description content="Strolch is a parameterized framework for use on servers and IoT"><meta name=author content="Strolch"><link rel=icon href=/favicon.ico type=image/ico><title>Components - Strolch</title><link href=/css/nucleus.css?1626091328 rel=stylesheet><link href=/css/fontawesome-all.min.css?1626091328 rel=stylesheet><link href=/css/hybrid.css?1626091328 rel=stylesheet><link href=/css/featherlight.min.css?1626091328 rel=stylesheet><link href=/css/perfect-scrollbar.min.css?1626091328 rel=stylesheet><link href=/css/auto-complete.css?1626091328 rel=stylesheet><link href=/css/atom-one-dark-reasonable.css?1626091328 rel=stylesheet><link href=/css/theme.css?1626091328 rel=stylesheet><link href=/css/hugo-theme.css?1626091328 rel=stylesheet><link href=/css/theme-green.css?1626091328 rel=stylesheet><script src=/js/jquery-3.3.1.min.js?1626091328></script><style>:root #header+#content>#left>#rlblock_left{display:none!important}</style></head><body data-url=/documentation/components/><nav id=sidebar><div id=header-wrapper><div id=header><a id=logo href=/><img src=/logo.png></a></div><div class=searchbox><label for=search-by><i class="fas fa-search"></i></label><input data-search-input id=search-by type=search placeholder=Search...>
<span data-search-clear><i class="fas fa-times"></i></span></div><script type=text/javascript src=/js/lunr.min.js?1626091328></script><script type=text/javascript src=/js/auto-complete.js?1626091328></script><script type=text/javascript>var baseurl="https:\/\/strolch.li\/";</script><script type=text/javascript src=/js/search.js?1626091328></script></div><section id=homelinks><ul><li><a class=padding href=/><i class="fas fa-home"></i>Home</a></li></ul></section><div class=highlightable><ul class=topics><li data-nav-id=/api/ title=API class=dd-item><a href=/api/>API</a></li><li data-nav-id=/history/ title=History class=dd-item><a href=/history/>History</a></li><li data-nav-id=/documentation/ title=Documentation class="dd-item
parent"><a href=/documentation/>Documentation</a><ul><li data-nav-id=/documentation/architecture/ title=Architecture class=dd-item><a href=/documentation/architecture/>Architecture</a></li><li data-nav-id=/documentation/model/ title=Model class=dd-item><a href=/documentation/model/>Model</a></li><li data-nav-id=/documentation/do-and-donts/ title="Do and Don't" class=dd-item><a href=/documentation/do-and-donts/>Do and Don't</a></li><li data-nav-id=/documentation/runtime-configuration/ title="Runtime Configuration" class=dd-item><a href=/documentation/runtime-configuration/>Runtime Configuration</a></li><li data-nav-id=/documentation/realms/ title=Realms class=dd-item><a href=/documentation/realms/>Realms</a></li><li data-nav-id=/documentation/components/ title=Components class="dd-item active"><a href=/documentation/components/>Components</a></li><li data-nav-id=/documentation/services-and-commands/ title="Services and Commands" class=dd-item><a href=/documentation/services-and-commands/>Services and Commands</a></li><li data-nav-id=/documentation/searches/ title=Searches class=dd-item><a href=/documentation/searches/>Searches</a></li><li data-nav-id=/documentation/queries/ title=Queries class=dd-item><a href=/documentation/queries/>Queries</a></li><li data-nav-id=/documentation/transactions/ title=Transactions class=dd-item><a href=/documentation/transactions/>Transactions</a></li><li data-nav-id=/documentation/policies/ title=Policies class=dd-item><a href=/documentation/policies/>Policies</a></li><li data-nav-id=/documentation/observers/ title=Observers class=dd-item><a href=/documentation/observers/>Observers</a></li><li data-nav-id=/documentation/versioning/ title=Versioning class=dd-item><a href=/documentation/versioning/>Versioning</a></li><li data-nav-id=/documentation/reports/ title=Reports class=dd-item><a href=/documentation/reports/>Reports</a></li><li data-nav-id=/documentation/priviles/ title=Privileges class=dd-item><a href=/documentation/priviles/>Privileges</a></li></ul></li><li data-nav-id=/plc/ title=PLC class=dd-item><a href=/plc/>PLC</a><ul><li data-nav-id=/plc/architecture/ title=Architecture class=dd-item><a href=/plc/architecture/>Architecture</a></li><li data-nav-id=/plc/example-set-up/ title="Example Set-Up" class=dd-item><a href=/plc/example-set-up/>Example Set-Up</a></li></ul></li><li data-nav-id=/tutorial/ title=Tutorial class=dd-item><a href=/tutorial/>Tutorial</a><ul><li data-nav-id=/tutorial/configuration/ title=Configuration class=dd-item><a href=/tutorial/configuration/>Configuration</a></li><li data-nav-id=/tutorial/model/ title=Model class=dd-item><a href=/tutorial/model/>Model</a></li><li data-nav-id=/tutorial/crud-book/ title="CRUD Book" class=dd-item><a href=/tutorial/crud-book/>CRUD Book</a></li></ul></li><li data-nav-id=/download/ title=Download class=dd-item><a href=/download/>Download</a></li><li data-nav-id=/development/ title=Development class=dd-item><a href=/development/>Development</a></li></ul><section id=shortcuts><h3>More</h3><ul><li><a class=padding href=https://strolch.li/tags><i class="fas fa-tags"></i>Tags</a></li><li><a class=padding href=https://github.com/strolch-li><i class="fab fa-github"></i>GitHub project</a></li></ul></section><section id=footer><p>Built with <a href=https://github.com/matcornic/hugo-theme-learn><i class="fas fa-heart"></i></a>from <a href=https://getgrav.org>Grav</a> and <a href=https://gohugo.io/>Hugo</a></p></section></div></nav><section id=body><div id=overlay></div><div class="padding highlightable"><div><div id=top-bar><div id=top-github-link><a class=github-link title="Edit this page" href=https://github.com/Pi4J/pi4j.github.io/tree/main/contentdocumentation/components.md target=blank><i class="fas fa-code-branch"></i><span id=top-github-link-text>Edit this page</span></a></div><div id=breadcrumbs itemscope itemtype=http://data-vocabulary.org/Breadcrumb><span id=sidebar-toggle-span><a href=# id=sidebar-toggle data-sidebar-toggle><i class="fas fa-bars"></i></a></span><span id=toc-menu><i class="fas fa-list-alt"></i></span><span class=links><a href=/>Strolch Overview</a> > <a href=/documentation/>Documentation</a> > Components</span></div><div class=progress><div class=wrapper><nav id=TableOfContents><ul><li><a href=#components>Components</a></li></ul></nav></div></div></div></div><div id=head-tags></div><div id=body-inner><h1>Components</h1><h2 id=components>Components</h2><p>A Strolch agent can be easily extended with arbitrary components. An agent
is basically a container for classes extending StrolchComponent with a life
cycle. These classes mostly implement an interface which describes the
operations that are supported by the component.</p><p>The following represents a list of the most used components:</p><ul><li><code>RealmHandler</code>: li.strolch.agent.impl.DefaultRealmHandler</li><li><code>PrivilegeHandler</code>: li.strolch.runtime.privilege.DefaultStrolchPrivilegeHandler</li><li><code>EnumHandler</code>: li.strolch.runtime.query.enums.DefaultEnumHandler</li><li><code>PolicyHandler</code>: li.strolch.policy.DefaultPolicyHandler</li><li><code>ServiceHandler</code>: li.strolch.service.api.DefaultServiceHandler</li><li><code>StrolchSessionHandler</code>: li.strolch.rest.DefaultStrolchSessionHandler</li><li><code>PersistenceHandler</code>: multiple implementations</li><li><code>PostInitializer</code>: project specific implementation</li><li><code>MailHandler</code>: li.strolch.handler.mail.SmtpMailHandler</li></ul><p>A component has a life-cycle, which is governed by the Agent&rsquo;s own life-cycle.
The life-cycle is as follows:</p><pre><code>setup -&gt; initialize -&gt; start &lt;-&gt; stop -&gt; destroy
</code></pre><p>The setup step is used to instantiate the component, the initialize step is
used to validate configuration parameters, and the run step is used to start
the component, i.e. start threads, etc. The stop step stops these threads and
also allows the component to be started again. The destroy step destroys the
instance and makes it unusable anymore, i.e. shutdown of the agent.</p><p>Each component has its own configuration parameters. A component is
registered in the <code>StrolchConfiguration.xml</code> file with a</p><ul><li>name</li><li>api class name</li><li>implementation class name</li><li>configuration parameters</li><li>any required dependencies</li></ul><p>The dependencies is an important feature as the dependencies of a component
are always started before the actual component.</p><p>By example of the <code>MailHandler</code> we shall show how a strolch component would
be implemented.</p><p>First define an interface:</p><div class=highlight><pre style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#66d9ef>public</span> <span style=color:#66d9ef>interface</span> <span style=color:#a6e22e>MailHandler</span> <span style=color:#f92672>{</span>
<span style=color:#66d9ef>void</span> <span style=color:#a6e22e>sendMail</span><span style=color:#f92672>(</span>String subject<span style=color:#f92672>,</span> String text<span style=color:#f92672>,</span> String recipient<span style=color:#f92672>);</span>
<span style=color:#f92672>}</span>
</code></pre></div><p>Then implement a concrete <code>MailHandler</code>:</p><div class=highlight><pre style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=color:#66d9ef>public</span> <span style=color:#66d9ef>class</span> <span style=color:#a6e22e>SmtpMailHandler</span> <span style=color:#66d9ef>extends</span> StrolchComponent <span style=color:#66d9ef>implements</span> MailHandler <span style=color:#f92672>{</span>
<span style=color:#75715e>// instance fields with configuration properties to send the mail
</span><span style=color:#75715e></span>
<span style=color:#66d9ef>public</span> <span style=color:#a6e22e>SmtpMailHandler</span><span style=color:#f92672>(</span>ComponentContainer container<span style=color:#f92672>,</span> String componentName<span style=color:#f92672>)</span> <span style=color:#f92672>{</span>
<span style=color:#66d9ef>super</span><span style=color:#f92672>(</span>container<span style=color:#f92672>,</span> componentName<span style=color:#f92672>);</span>
<span style=color:#f92672>}</span>
<span style=color:#a6e22e>@Override</span>
<span style=color:#66d9ef>public</span> <span style=color:#66d9ef>void</span> <span style=color:#a6e22e>initialize</span><span style=color:#f92672>(</span>ComponentConfiguration configuration<span style=color:#f92672>)</span> <span style=color:#66d9ef>throws</span> Exception <span style=color:#f92672>{</span>
<span style=color:#75715e>// store any properties needed from the configuration
</span><span style=color:#75715e></span>
<span style=color:#66d9ef>super</span><span style=color:#f92672>.</span><span style=color:#a6e22e>initialize</span><span style=color:#f92672>(</span>configuration<span style=color:#f92672>);</span>
<span style=color:#f92672>}</span>
<span style=color:#a6e22e>@Override</span>
<span style=color:#66d9ef>public</span> <span style=color:#66d9ef>void</span> <span style=color:#a6e22e>sendMail</span><span style=color:#f92672>(</span>String subject<span style=color:#f92672>,</span> String text<span style=color:#f92672>,</span> String recipient<span style=color:#f92672>)</span> <span style=color:#f92672>{</span>
<span style=color:#75715e>// send the e-mail using SMTP, or store in stack to send by thread
</span><span style=color:#75715e></span> <span style=color:#f92672>}</span>
<span style=color:#f92672>}</span>
</code></pre></div><p>Now that the component is written, it must be registered on the component, so
that it is loaded when the agent is started. For this the
<code>StrolchConfiguration.xml</code> file must be modified to include a component
element:</p><div class=highlight><pre style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-xml data-lang=xml><span style=color:#f92672>&lt;StrolchConfiguration&gt;</span>
<span style=color:#f92672>&lt;env</span> <span style=color:#a6e22e>id=</span><span style=color:#e6db74>&#34;dev&#34;</span><span style=color:#f92672>&gt;</span>
...
<span style=color:#f92672>&lt;Component&gt;</span>
<span style=color:#f92672>&lt;name&gt;</span>MailHandler<span style=color:#f92672>&lt;/name&gt;</span>
<span style=color:#f92672>&lt;api&gt;</span>li.strolch.handler.mail.MailHandler<span style=color:#f92672>&lt;/api&gt;</span>
<span style=color:#f92672>&lt;impl&gt;</span>li.strolch.handler.mail.SmtpMailHandler<span style=color:#f92672>&lt;/impl&gt;</span>
<span style=color:#f92672>&lt;Properties&gt;</span>
<span style=color:#f92672>&lt;username&gt;</span>test<span style=color:#f92672>&lt;/username&gt;</span>
<span style=color:#f92672>&lt;password&gt;</span>test<span style=color:#f92672>&lt;/password&gt;</span>
<span style=color:#f92672>&lt;hostName&gt;</span>localhost<span style=color:#f92672>&lt;/hostName&gt;</span>
...
<span style=color:#f92672>&lt;/Properties&gt;</span>
<span style=color:#f92672>&lt;/Component&gt;</span>
...
<span style=color:#f92672>&lt;/env&gt;</span>
<span style=color:#f92672>&lt;/StrolchConfiguration&gt;</span>
</code></pre></div><p>Now when the agent is started, the component can be retrieved and used.
E.g from inside a Service:</p><div class=highlight><pre style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java>MailHandler mailHandler <span style=color:#f92672>=</span> getComponent<span style=color:#f92672>(</span>MailHandler<span style=color:#f92672>.</span><span style=color:#a6e22e>class</span><span style=color:#f92672>);</span>
mailHandler<span style=color:#f92672>.</span><span style=color:#a6e22e>sendMail</span><span style=color:#f92672>(</span><span style=color:#e6db74>&#34;My Subject&#34;</span><span style=color:#f92672>,</span> <span style=color:#e6db74>&#34;Hello World&#34;</span><span style=color:#f92672>,</span> <span style=color:#e6db74>&#34;test@test.ch&#34;</span><span style=color:#f92672>);</span>
</code></pre></div><footer class=footline></footer></div></div><div id=navigation><a class="nav nav-prev" href=/documentation/realms/ title=Realms><i class="fa fa-chevron-left"></i></a><a class="nav nav-next" href=/documentation/services-and-commands/ title="Services and Commands" style=margin-right:0><i class="fa fa-chevron-right"></i></a></div></section><div style=left:-1000px;overflow:scroll;position:absolute;top:-1000px;border:none;box-sizing:content-box;height:200px;margin:0;padding:0;width:200px><div style=border:none;box-sizing:content-box;height:200px;margin:0;padding:0;width:200px></div></div><script src=/js/clipboard.min.js?1626091328></script><script src=/js/perfect-scrollbar.min.js?1626091328></script><script src=/js/perfect-scrollbar.jquery.min.js?1626091328></script><script src=/js/jquery.sticky.js?1626091328></script><script src=/js/featherlight.min.js?1626091328></script><script src=/js/highlight.pack.js?1626091328></script><script>hljs.initHighlightingOnLoad();</script><script src=/js/modernizr.custom-3.6.0.js?1626091328></script><script src=/js/learn.js?1626091328></script><script src=/js/hugo-learn.js?1626091328></script><script src=/mermaid/mermaid.js?1626091328></script><script>mermaid.initialize({startOnLoad:true});</script></body></html>