2023-03-16 15:31:32 +01:00
<!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 = "Robert von Burg" > < link rel = icon href = /favicon.ico type = image/ico > < title > Services and Commands - Strolch< / title > < link href = /css/nucleus.css?1678977092 rel = stylesheet > < link href = /css/fontawesome-all.min.css?1678977092 rel = stylesheet > < link href = /css/hybrid.css?1678977092 rel = stylesheet > < link href = /css/featherlight.min.css?1678977092 rel = stylesheet > < link href = /css/perfect-scrollbar.min.css?1678977092 rel = stylesheet > < link href = /css/auto-complete.css?1678977092 rel = stylesheet > < link href = /css/atom-one-dark-reasonable.css?1678977092 rel = stylesheet > < link href = /css/theme.css?1678977092 rel = stylesheet > < link href = /css/hugo-theme.css?1678977092 rel = stylesheet > < link href = /css/theme-green.css?1678977092 rel = stylesheet > < script src = /js/jquery-3.3.1.min.js?1678977092 > < / script > < style > : root # header + # content > # left > # rlblock_left { display : none !important } < / style > < / head > < body data-url = /documentation/services-and-commands/ > < 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?1678977092 > < / script > < script type = text/javascript src = /js/auto-complete.js?1678977092 > < / script > < script type = text/javascript > var baseurl = "https:\/\/strolch.li\/" ; < / script > < script type = text/javascript src = /js/search.js?1678977092 > < / 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 = /documentation/ title = Documentation class = "dd-item
2022-11-11 08:35:56 +01:00
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 > < a href = /documentation/components/ > Components< / a > < / li > < li data-nav-id = /documentation/services-and-commands/ title = "Services and Commands" class = "dd-item active" > < 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 > < ul > < li data-nav-id = /development/prerequisites/ title = Prerequisites class = dd-item > < a href = /development/prerequisites/ > Prerequisites< / a > < / li > < li data-nav-id = /development/building/ title = "Building Strolch" class = dd-item > < a href = /development/building/ > Building Strolch< / a > < / li > < li data-nav-id = /development/maven-archetypes/ title = "Maven Archetypes" class = dd-item > < a href = /development/maven-archetypes/ > Maven Archetypes< / a > < / li > < li data-nav-id = /development/web-app/ title = "Web App" class = dd-item > < a href = /development/web-app/ > Web App< / a > < / li > < li data-nav-id = /development/main-class-app/ title = "Main Class App" class = dd-item > < a href = /development/main-class-app/ > Main Class App< / a > < / li > < li data-nav-id = /development/converting-existing/ title = "Converting Existing App" class = dd-item > < a href = /development/converting-existing/ > Converting Existing App< / a > < / li > < / ul > < / li > < li data-nav-id = /blog/ title = Blog class = dd-item > < a href = /blog/ > Blog< / a > < ul > < li data-nav-id = /blog/post-00018/ title = "Strolch PLC 1.2.3 released" class = dd-item > < a href = /blog/post-00018/ > Strolch PLC 1.2.3 released< / a > < / li > < li data-nav-id = /blog/post-0001
2021-07-11 20:37:40 +02:00
implement re-usable parts of a use-case. The use-case can be abstract
e.g., < code > AddResourceService< / code > or very specific e.g. < code > CreatePatientService< / code > .< / p > < p > Should the use-case be re-usable in different scenarios, then commands should
implement the logic, and the services should then execute the commands. E.g.
The < code > CreatePatientService< / code > would use a < code > CreatePatientResourceCommand< / code > and then
use an < code > AddResourceCommand< / code > in a single transaction, so that the task of
creating the actual Patient Resource can be re-used somewhere else.< / p > < p > Services extend the abstract class < code > AbstractService< / code > and then implement the
method < code > internalDoService(ServiceArgument)< / code > . AbstractService defines generic
template arguments with which the concrete service can define a specific
input ServiceArgument class and output ServiceResult class.< / p > < p > The AbstractService class has multiple helper methods:< / p > < ul > < li > < code > openTx():StrolchTransaction< / code > - to open a transaction< / li > < li > < code > runPrivileged()< / code > - to perform a < code > SystemUserAction< / code > < / li > < li > < code > getComponent():V< / code > - to retrieve a specific StrolchComponent< / li > < / ul > < p > there are more - check the JavaDocs.< / p > < p > Commands extend the < code > Command< / code > class and then implement the method < code > doCommand()< / code > .
Commands have helper methods:< / p > < ul > < li > < code > tx()< / code > - to get the current transaction< / li > < li > < code > getPolicy()< / code > - to retrieve a < code > StrolchPolicy< / code > instance< / li > < li > < code > runPrivileged()< / code > - to perform a < code > SystemUserAction< / code > < / li > < / ul > < p > there are more - check the JavaDocs.< / p > < p > The following code snippets shows how a Service and Command are used to
perform the task of adding a new Order. Note how:< / p > < ul > < li > the Service opens the transaction< / li > < li > adds the command to the TX< / li > < li > calls < code > tx.commitOnClose()< / code > < / li > < li > the command validates its input< / li > < li > locks the object< / li > < li > performs the work< / li > < li > and implements an undo< / li > < / ul > < p > AddOrderService:< / 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 > AddOrderService< / span > < span style = color:#66d9ef > extends< / span > AbstractService< span style = color:#f92672 > < < / span > AddOrderService< span style = color:#f92672 > .< / span > < span style = color:#a6e22e > AddOrderArg< / span > < span style = color:#f92672 > ,< / span > ServiceResult< span style = color:#f92672 > > < / span > < span style = color:#f92672 > {< / span >
< span style = color:#a6e22e > @Override< / span >
< span style = color:#66d9ef > protected< / span > ServiceResult < span style = color:#a6e22e > getResultInstance< / span > < span style = color:#f92672 > ()< / span > < span style = color:#f92672 > {< / span >
< span style = color:#66d9ef > return< / span > < span style = color:#66d9ef > new< / span > ServiceResult< span style = color:#f92672 > ();< / span >
< span style = color:#f92672 > }< / span >
< span style = color:#a6e22e > @Override< / span >
< span style = color:#66d9ef > protected< / span > ServiceResult < span style = color:#a6e22e > internalDoService< / span > < span style = color:#f92672 > (< / span > AddOrderArg arg< span style = color:#f92672 > )< / span > < span style = color:#f92672 > {< / span >
< span style = color:#66d9ef > try< / span > < span style = color:#f92672 > (< / span > StrolchTransaction tx < span style = color:#f92672 > =< / span > openTx< span style = color:#f92672 > (< / span > arg< span style = color:#f92672 > .< / span > < span style = color:#a6e22e > realm< / span > < span style = color:#f92672 > ))< / span > < span style = color:#f92672 > {< / span >
AddOrderCommand command < span style = color:#f92672 > =< / span > < span style = color:#66d9ef > new< / span > AddOrderCommand< span style = color:#f92672 > (< / span > getContainer< span style = color:#f92672 > (),< / span > tx< span style = color:#f92672 > );< / span >
command< span style = color:#f92672 > .< / span > < span style = color:#a6e22e > setOrder< / span > < span style = color:#f92672 > (< / span > arg< span style = color:#f92672 > .< / span > < span style = color:#a6e22e > order< / span > < span style = color:#f92672 > );< / span >
tx< span style = color:#f92672 > .< / span > < span style = color:#a6e22e > addCommand< / span > < span style = color:#f92672 > (< / span > command< span style = color:#f92672 > );< / span >
tx< span style = color:#f92672 > .< / span > < span style = color:#a6e22e > commitOnClose< / span > < span style = color:#f92672 > ();< / span >
< span style = color:#f92672 > }< / span >
< span style = color:#66d9ef > return< / span > ServiceResult< span style = color:#f92672 > .< / span > < span style = color:#a6e22e > success< / span > < span style = color:#f92672 > ();< / span >
< span style = color:#f92672 > }< / span >
< span style = color:#66d9ef > public< / span > < span style = color:#66d9ef > static< / span > < span style = color:#66d9ef > class< / span > < span style = color:#a6e22e > AddOrderArg< / span > < span style = color:#66d9ef > extends< / span > ServiceArgument < span style = color:#f92672 > {< / span >
< span style = color:#66d9ef > public< / span > Order order< span style = color:#f92672 > ;< / span >
< span style = color:#f92672 > }< / span >
< span style = color:#f92672 > }< / span >
< / code > < / pre > < / div > < p > AddOrderCommand:< / 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 > AddOrderCommand< / span > < span style = color:#66d9ef > extends< / span > Command < span style = color:#f92672 > {< / span >
< span style = color:#66d9ef > private< / span > Order order< span style = color:#f92672 > ;< / span >
< span style = color:#66d9ef > public< / span > < span style = color:#a6e22e > AddOrderCommand< / span > < span style = color:#f92672 > (< / span > ComponentContainer container< span style = color:#f92672 > ,< / span > StrolchTransaction tx< 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 > tx< span style = color:#f92672 > );< / span >
< span style = color:#f92672 > }< / span >
< span style = color:#66d9ef > public< / span > < span style = color:#66d9ef > void< / span > < span style = color:#a6e22e > setOrder< / span > < span style = color:#f92672 > (< / span > Order order< span style = color:#f92672 > )< / span > < span style = color:#f92672 > {< / span >
< span style = color:#66d9ef > this< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > order< / span > < span style = color:#f92672 > =< / span > order< 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 > validate< / span > < span style = color:#f92672 > ()< / span > < span style = color:#f92672 > {< / span >
DBC< span style = color:#f92672 > .< / span > < span style = color:#a6e22e > PRE< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > assertNotNull< / span > < span style = color:#f92672 > (< / span > < span style = color:#e6db74 > " Order may not be null!" < / span > < span style = color:#f92672 > ,< / span > < span style = color:#66d9ef > this< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > order< / span > < 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 > doCommand< / span > < span style = color:#f92672 > ()< / span > < span style = color:#f92672 > {< / span >
tx< span style = color:#f92672 > ().< / span > < span style = color:#a6e22e > lock< / span > < span style = color:#f92672 > (< / span > < span style = color:#66d9ef > this< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > order< / span > < span style = color:#f92672 > );< / span >
OrderMap orderMap < span style = color:#f92672 > =< / span > tx< span style = color:#f92672 > ().< / span > < span style = color:#a6e22e > getOrderMap< / span > < span style = color:#f92672 > ();< / span >
< span style = color:#66d9ef > if< / span > < span style = color:#f92672 > (< / span > orderMap< span style = color:#f92672 > .< / span > < span style = color:#a6e22e > hasElement< / span > < span style = color:#f92672 > (< / span > tx< span style = color:#f92672 > (),< / span > < span style = color:#66d9ef > this< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > order< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > getType< / span > < span style = color:#f92672 > (),< / span > < span style = color:#66d9ef > this< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > order< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > getId< / span > < span style = color:#f92672 > ()))< / span > < span style = color:#f92672 > {< / span >
String msg < span style = color:#f92672 > =< / span > MessageFormat< span style = color:#f92672 > .< / span > < span style = color:#a6e22e > format< / span > < span style = color:#f92672 > (< / span > < span style = color:#e6db74 > " The Order {0} already exists!" < / span > < span style = color:#f92672 > ,< / span > < span style = color:#66d9ef > this< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > order< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > getLocator< / span > < span style = color:#f92672 > ());< / span >
< span style = color:#66d9ef > throw< / span > < span style = color:#66d9ef > new< / span > StrolchException< span style = color:#f92672 > (< / span > msg< span style = color:#f92672 > );< / span >
< span style = color:#f92672 > }< / span >
orderMap< span style = color:#f92672 > .< / span > < span style = color:#a6e22e > add< / span > < span style = color:#f92672 > (< / span > tx< span style = color:#f92672 > (),< / span > < span style = color:#66d9ef > this< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > order< / span > < 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 > undo< / span > < span style = color:#f92672 > ()< / span > < span style = color:#f92672 > {< / span >
< span style = color:#66d9ef > if< / span > < span style = color:#f92672 > (< / span > < span style = color:#66d9ef > this< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > order< / span > < span style = color:#f92672 > !=< / span > < span style = color:#66d9ef > null< / span > < span style = color:#f92672 > & & < / span > tx< span style = color:#f92672 > ().< / span > < span style = color:#a6e22e > isRollingBack< / span > < span style = color:#f92672 > ())< / span > < span style = color:#f92672 > {< / span >
OrderMap orderMap < span style = color:#f92672 > =< / span > tx< span style = color:#f92672 > ().< / span > < span style = color:#a6e22e > getOrderMap< / span > < span style = color:#f92672 > ();< / span >
< span style = color:#66d9ef > if< / span > < span style = color:#f92672 > (< / span > orderMap< span style = color:#f92672 > .< / span > < span style = color:#a6e22e > hasElement< / span > < span style = color:#f92672 > (< / span > tx< span style = color:#f92672 > (),< / span > < span style = color:#66d9ef > this< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > order< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > getType< / span > < span style = color:#f92672 > (),< / span > < span style = color:#66d9ef > this< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > order< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > getId< / span > < span style = color:#f92672 > ()))< / span >
orderMap< span style = color:#f92672 > .< / span > < span style = color:#a6e22e > remove< / span > < span style = color:#f92672 > (< / span > tx< span style = color:#f92672 > (),< / span > < span style = color:#66d9ef > this< / span > < span style = color:#f92672 > .< / span > < span style = color:#a6e22e > order< / span > < span style = color:#f92672 > );< / span >
< span style = color:#f92672 > }< / span >
< span style = color:#f92672 > }< / span >
< span style = color:#f92672 > }< / span >
2023-03-16 15:31:32 +01:00
< / code > < / pre > < / div > < footer class = footline > < / footer > < / div > < / div > < div id = navigation > < a class = "nav nav-prev" href = /documentation/components/ title = Components > < i class = "fa fa-chevron-left" > < / i > < / a > < a class = "nav nav-next" href = /documentation/searches/ title = Searches 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?1678977092 > < / script > < script src = /js/perfect-scrollbar.min.js?1678977092 > < / script > < script src = /js/perfect-scrollbar.jquery.min.js?1678977092 > < / script > < script src = /js/jquery.sticky.js?1678977092 > < / script > < script src = /js/featherlight.min.js?1678977092 > < / script > < script src = /js/highlight.pack.js?1678977092 > < / script > < script > hljs . initHighlightingOnLoad ( ) ; < / script > < script src = /js/modernizr.custom-3.6.0.js?1678977092 > < / script > < script src = /js/learn.js?1678977092 > < / script > < script src = /js/hugo-learn.js?1678977092 > < / script > < script src = /mermaid/mermaid.js?1678977092 > < / script > < script > mermaid . initialize ( { startOnLoad : true } ) ; < / script > < script type = text/javascript > var _paq = window . _paq = window . _paq || [ ] ; _paq . push ( [ "setDocumentTitle" , document . domain + "/" + document . title ] ) ; _paq . push ( [ "setCookieDomain" , "*.strolch.li" ] ) ; _paq . push ( [ 'trackPageView' ] ) ; _paq . push ( [ 'enableLinkTracking' ] ) ; ( function ( ) { var u = "https://piwik.eitchnet.ch/" ; _paq . push ( [ 'setTrackerUrl' , u + 'matomo.php' ] ) ; _paq . push ( [ 'setSiteId' , '2' ] ) ; var d = document , g = d . createElement ( 'script' ) , s = d . getElementsByTagName ( 'script' ) [ 0 ] ; g . type = 'text/javascript' ; g . async = true ; g . src = u + 'matomo.js' ; s . parentNode . insertBefore ( g , s ) ; } ) ( ) ; < / script > < / body > < / html >