[Project] Changed index page for the website

This commit is contained in:
Robert von Burg 2018-10-25 10:13:22 +02:00
parent c6b7a957a6
commit d7f090ed9e
3 changed files with 351 additions and 171 deletions

View File

@ -60,7 +60,9 @@
<p>Transactions handle the following:</p>
<ul>
<li>Opening and closing database connections</li>
<li>Releasing locks to strolch elements, if <code>tx.lock(StrolchRootElement)</code> was called</li>
<li>Releasing locks to strolch elements, if <code>tx.lock(StrolchRootElement)</code> or <code>tx.lock(Locator)</code>
was called
</li>
<li>Performing Commands by executing them in the added order, and validating them first.</li>
<li>Exception handling</li>
<li>Auditing</li>
@ -100,8 +102,11 @@
<pre>
try (StrolchTransaction tx = openTx(...)) {
// find a car by locator
// read lock our object
Locator ferrariLoc = Resource.locatorFor("Car", "ferrari");
tx.lock(ferrariLoc);
// find a car by locator
Resource ferrari = tx.findElement(ferrariLoc);
// get a car by ID
@ -121,13 +126,13 @@ try (StrolchTransaction tx = openTx(...)) {
// check resource exists
if (tx.hasResource("Car", "audi")) {
Resource audi = tx.getResourceBy("Car", "audi", true);
Resource audi = tx.getResourceBy("Car", "audi", true);
// assert has privilege to remove a car
tx.assertHasPrivilege(Operation.REMOVE, audi);
// assert has privilege to remove a car
tx.assertHasPrivilege(Operation.REMOVE, audi);
// remove the car
tx.remove(audi);
// remove the car
tx.remove(audi);
}
// iterate all cars
@ -137,7 +142,7 @@ try (StrolchTransaction tx = openTx(...)) {
// commit if TX was changed
if (tx.needsCommit())
tx.commitOnClose();
tx.commitOnClose();
}</pre>

View File

@ -0,0 +1,264 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="google-site-verification" content="CPhbjooaiTdROm7Vs4E7kuHZvBfkeLUtonGgcVUbTL8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<link rel="shortcut icon" href="ico/favicon.ico">
<title>Strolch: Overview</title>
<!-- Bootstrap core CSS -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- Custom styles for this template -->
<link href="css/custom.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --><!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script><![endif]-->
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="index.html">Strolch</a>
</div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="index.html">Overview</a></li>
<li><a href="api.html">API</a></li>
<li><a href="documentation.html">Documentation</a></li>
<li><a href="tutorial.html">Tutorial</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="development.html">Development</a></li>
<li><a href="blog.html">Blog</a></li>
</ul>
</div>
<!--/.nav-collapse -->
</div>
</div>
<div class="container">
<div class="page-header">
<h1 class="page-title">Strolch Overview</h1>
<p class="lead page-description">This page describes the Strolch software agent and the motivation behind its
development.</p>
</div>
<div class="content">
<h2>Overview</h2>
<p>Strolch is an open source component based software agent written in Java and can be compared, in a light
sense, with the Java EE stack: Strolch takes care of persistence, implements Services for use cases, Commands
as re-usable algorithms and has a parameterized data model.</p>
<p>Strolch has an intrinsic understanding for mandates, which are called realms so that a single agent can be
used to implement applications with multiple users/customers for instance in SaaS environments.</p>
<p>The parameterized data model consists of three top level objects, Resources, Orders and Activities. These
objects can have any number of ParameterBags which in turn can have any number of Parameters on them. This
allows for a very dynamic modelling of data structures including modification at run time. Multiple ready to
use Parameter types are already implemented which handle the primitive types in Java including ListParameters
for collections of these primitive types.</p>
<p>One of the main features of the Strolch agent, is that persistence is handled transparently and the user must
not be worried about databases and the likes. Currently there are two implementations for persisting the
Strolch model, a PostgreSQL and an XML file persistence. Currently both persistence layers persist the data
by converting to XML and storing it into the database. The XML file persistence stores each object in its own
file.</p>
<p>The agent itself has a small memory footprint and requires very few components to start. For the agent to be
useful it needs additional functionality which is implemented in StrolchComponents. Each component is
registered via its Java interface on the agent and is bound to the life cycle of the agent. When the agent is
started, these components can be retrieved and used to perform any number of functionalities. This is the
preferred way to extend the Strolch agent. There are a number of components already implemented, e.g. the
ServiceHandler which executes Services in a controlled fashion and can validate authorized access to these
services.</p>
<p>No software product is complete without a system for authentication and authorization. Strolch implements
this by using the Privilege framework which has been written by Robert von Burg. The standard ServiceHandler
detects the existence of the PrivilegeHandler and then validates that the user has authorization to perform
the service. This framework is implemented as its own Strolch component, thus can be retrieved at any time
during execution to perform fine grained and special authorization validation.</p>
<h2>Motivation</h2>
<p>A question often asked is why create Strolch. What are its benefits in contrast to using Java SE with an
OR-Mapper like Hibernate, or using Java EE on JBoss or Glassfish? Especially since many of the features
existing in those stacks needed to be re-created in Strolch.</p>
<p>The first answer to this question is that those systems are often overly complicated and bloated. Java SE
with Hibernate certainly is a viable option when it comes to being light-weightier but Hibernate, even though
it is supposed to, often fails to truly help remove the need to really understand an RDBMS. Often enough
Hibernate will just get in the way of the most important part of development: writing the business code.
Being an OR-Mapper which is supposed to implement all the nitty-gritty details of an RDBMS system, Hibernate,
and JPA for that matter, still often has the developer go back to understanding these details.</p>
<p>Strolch tries a different approach to persistence. Instead of writing pojos/entities, Strolch's model has the
concept that each element's attributes are part of a composition pattern: each attribute is its own object
and thus can be dynamically changed at runtime, but also makes persistence of such an element generic.
Instead of having fixed attributes for a concrete class, these parameters are stored in a map and are
accessed through the parameter's ID.</p>
<p>Assigning an ID to an attribute for accessing of course brings its own downsides, i.e. the parameter might
simply not be there, when being accessed. This is certainly an issue that the developer must handle, when
implementing a project using Strolch, but allows the developer to not need to worry about persistence, as
this is generically handled.</p>
<p>Since the persistence is generically handled, and Strolch stays lightweight on its requirements at runtime,
the developer can quickly get down to what is important for business value: Writing the business logic and
the presentation layer. Here too Strolch tries to help the developer by bringing in concepts which are easy
to follow: Use cases are implemented as Services, and re-usable business logic is put into Commands.</p>
<p>There will be reasons against using Strolch, as there will be against using the Java EE stack, or an
OR-Mapper or even the Java ecosystem for that fact. Important is to note, that the concepts behind Strolch
are nothing new, but have been implemented in at least two previous proprietary products. Since those
products are not accessible to the public, it was decided that a re-implementation might be of use to the
programming community at large.</p>
<p>Currently there is at least one company using Strolch in a commercial project which helps drive Strolch's
development and further motivates its existence.</p>
<p>Strolch is an open source project and licensed under the Apache License 2.0.</p>
<h2>Technologoy</h2>
<p>Strolch is written in Java and is programmed against the JDK 8. Strolch runs on any JRE 8 compliant
environment. Strolch is tested on the Oracle JRE 8.</p>
<h3>Dependencies</h3>
<p>Strolch strives to use as few external dependencies as possible, so that the Strolch runtime is not bloated
unnecessarily. The following list of Strolch dependencies is a summary and was created using mvn
dependency:tree on the strolch_minimal project for release 1.6.47.</p>
<p>Logging</p>
<ul>
<li>org.slf4j:slf4j-api:jar:1.7.25</li>
<li>ch.qos.logback:logback-classic:jar:1.2.3</li>
<li>ch.qos.logback:logback-core:jar:1.2.3</li>
</ul>
<p>Utils</p>
<ul>
<li>javax.mail:javax.mail-api:jar:1.6.0</li>
<li>com.sun.mail:javax.mail:jar:1.6.0</li>
<li>javax.activation:activation:jar:1.1</li>
</ul>
<p>Testing</p>
<ul>
<li>junit:junit:jar:4.12</li>
<li>org.hamcrest:hamcrest-core:jar:1.3</li>
<li>org.hamcrest:hamcrest-library:jar:1.3</li>
<li>org.mockito:mockito-core:jar:2.0.8-beta</li>
<li>org.objenesis:objenesis:jar:2.1</li>
</ul>
<p>Model</p>
<ul>
<li>com.google.code.gson:gson:jar:2.8.2</li>
</ul>
<p>SOQL</p>
<ul>
<li>org.abego.treelayout:org.abego.treelayout.core:jar:1.0.3</li>
<li>org.antlr:antlr-runtime:jar:3.5.2</li>
<li>org.antlr:antlr4-runtime:jar:4.7</li>
<li>org.antlr:antlr4:jar:4.7</li>
<li>org.antlr:ST4:jar:4.0.8</li>
<li>org.glassfish:javax.json:jar:1.0.4</li>
<li>com.ibm.icu:icu4j:jar:58.2</li>
</ul>
<p>PostgreSQL</p>
<ul>
<li>com.zaxxer:HikariCP:jar:2.7.1</li>
<li>org.postgresql:postgresql:jar:42.1.4</li>
</ul>
<p>REST</p>
<ul>
<li>javax.annotation:javax.annotation-api:jar:1.3.1</li>
<li>javax.servlet:javax.servlet-api:jar:3.1.0</li>
<li>javax.ws.rs:javax.ws.rs-api:jar:2.1</li>
</ul>
<p>REST testing</p>
<ul>
<li>javax.validation:validation-api:jar:1.1.0.Final</li>
<li>org.glassfish.grizzly:grizzly-framework:jar:2.3.28</li>
<li>org.glassfish.grizzly:grizzly-http-server:jar:2.3.28</li>
<li>org.glassfish.grizzly:grizzly-http-servlet:jar:2.3.28</li>
<li>org.glassfish.grizzly:grizzly-http:jar:2.3.28</li>
<li>org.glassfish.hk2:hk2-api:jar:2.5.0-b32</li>
<li>org.glassfish.hk2:hk2-locator:jar:2.5.0-b32</li>
<li>org.glassfish.hk2:hk2-utils:jar:2.5.0-b32</li>
<li>org.glassfish.hk2:osgi-resource-locator:jar:1.0.1</li>
<li>org.glassfish.hk2.external:aopalliance-repackaged:jar:2.5.0-b32</li>
<li>org.glassfish.hk2.external:javax.inject:jar:2.5.0-b32</li>
<li>org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.25.1</li>
<li>org.glassfish.jersey.containers:jersey-container-grizzly2-http:jar:2.25.1</li>
<li>org.glassfish.jersey.containers:jersey-container-grizzly2-servlet:jar:2.25.1</li>
<li>org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.25.1</li>
<li>org.glassfish.jersey.containers:jersey-container-servlet:jar:2.25.1</li>
<li>org.glassfish.jersey.core:jersey-client:jar:2.25.1</li>
<li>org.glassfish.jersey.core:jersey-common:jar:2.25.1</li>
<li>org.glassfish.jersey.core:jersey-server:jar:2.25.1</li>
<li>org.glassfish.jersey.media:jersey-media-jaxb:jar:2.25.1</li>
<li>org.glassfish.jersey.test-framework:jersey-test-framework-core:jar:2.25.1</li>
<li>org.javassist:javassist:jar:3.20.0-GA</li>
</ul>
<h4>API</h4>
<p>Check out the <a href="api.html">API page</a> to see how to use Strolch.</p>
</div>
<!-- /.content -->
<div id="footer">
<div class="container">
<p class="text-muted">&copy; Strolch / <a href="mailto:eitch@eitchnet.ch">Robert von Burg</a> / Hosting by
<a href="http://www.eitchnet.ch">eitchnet.ch</a></p>
</div>
</div>
</div>
<!-- /.container -->
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual xsd as needed -->
<script src="js/bootstrap.min.js"></script>
<!-- Piwik -->
<script type="text/javascript">
var _paq = _paq || [];
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function () {
var u = (("https:" == document.location.protocol) ? "https" : "http") + "://piwik.eitchnet.ch/";
_paq.push(['setTrackerUrl', u + 'piwik.php']);
_paq.push(['setSiteId', 2]);
var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0];
g.type = 'text/javascript';
g.defer = true;
g.async = true;
g.src = u + 'piwik.js';
s.parentNode.insertBefore(g, s);
})();
</script>
<noscript><p><img src="http://piwik.eitchnet.ch/piwik.php?idsite=2" style="border:0;" alt="" /></p></noscript>
<!-- End Piwik Code -->
</body>
</html>

View File

@ -47,181 +47,92 @@
<div class="page-header">
<h1 class="page-title">Strolch Overview</h1>
<p class="lead page-description">This page describes the Strolch software agent and the motivation behind its
development.</p>
<p class="lead page-description">A short introduction to Strolch.</p>
</div>
<div class="content">
<h2>Overview</h2>
<h2>Strolch in short</h2>
<p>Strolch is an open source component based software agent written in Java and can be compared, in a light
sense, with the Java EE stack: Strolch takes care of persistence, implements Services for use cases, Commands
as re-usable algorithms and has a parameterized data model.</p>
<p>Strolch has an intrinsic understanding for mandates, which are called realms so that a single agent can be
used to implement applications with multiple users/customers for instance in SaaS environments.</p>
<p>The parameterized data model consists of three top level objects, Resources, Orders and Activities. These
objects can have any number of ParameterBags which in turn can have any number of Parameters on them. This
allows for a very dynamic modelling of data structures including modification at run time. Multiple ready to
use Parameter types are already implemented which handle the primitive types in Java including ListParameters
for collections of these primitive types.</p>
<p>One of the main features of the Strolch agent, is that persistence is handled transparently and the user must
not be worried about databases and the likes. Currently there are two implementations for persisting the
Strolch model, a PostgreSQL and an XML file persistence. Currently both persistence layers persist the data
by converting to XML and storing it into the database. The XML file persistence stores each object in its own
file.</p>
<p>The agent itself has a small memory footprint and requires very few components to start. For the agent to be
useful it needs additional functionality which is implemented in StrolchComponents. Each component is
registered via its Java interface on the agent and is bound to the life cycle of the agent. When the agent is
started, these components can be retrieved and used to perform any number of functionalities. This is the
preferred way to extend the Strolch agent. There are a number of components already implemented, e.g. the
ServiceHandler which executes Services in a controlled fashion and can validate authorized access to these
services.</p>
<p>No software product is complete without a system for authentication and authorization. Strolch implements
this by using the Privilege framework which has been written by Robert von Burg. The standard ServiceHandler
detects the existence of the PrivilegeHandler and then validates that the user has authorization to perform
the service. This framework is implemented as its own Strolch component, thus can be retrieved at any time
during execution to perform fine grained and special authorization validation.</p>
<h2>Motivation</h2>
<p>A question often asked is why create Strolch. What are its benefits in contrast to using Java SE with an
OR-Mapper like Hibernate, or using Java EE on JBoss or Glassfish? Especially since many of the features
existing in those stacks needed to be re-created in Strolch.</p>
<p>The first answer to this question is that those systems are often overly complicated and bloated. Java SE
with Hibernate certainly is a viable option when it comes to being light-weightier but Hibernate, even though
it is supposed to, often fails to truly help remove the need to really understand an RDBMS. Often enough
Hibernate will just get in the way of the most important part of development: writing the business code.
Being an OR-Mapper which is supposed to implement all the nitty-gritty details of an RDBMS system, Hibernate,
and JPA for that matter, still often has the developer go back to understanding these details.</p>
<p>Strolch tries a different approach to persistence. Instead of writing pojos/entities, Strolch's model has the
concept that each element's attributes are part of a composition pattern: each attribute is its own object
and thus can be dynamically changed at runtime, but also makes persistence of such an element generic.
Instead of having fixed attributes for a concrete class, these parameters are stored in a map and are
accessed through the parameter's ID.</p>
<p>Assigning an ID to an attribute for accessing of course brings its own downsides, i.e. the parameter might
simply not be there, when being accessed. This is certainly an issue that the developer must handle, when
implementing a project using Strolch, but allows the developer to not need to worry about persistence, as
this is generically handled.</p>
<p>Since the persistence is generically handled, and Strolch stays lightweight on its requirements at runtime,
the developer can quickly get down to what is important for business value: Writing the business logic and
the presentation layer. Here too Strolch tries to help the developer by bringing in concepts which are easy
to follow: Use cases are implemented as Services, and re-usable business logic is put into Commands.</p>
<p>There will be reasons against using Strolch, as there will be against using the Java EE stack, or an
OR-Mapper or even the Java ecosystem for that fact. Important is to note, that the concepts behind Strolch
are nothing new, but have been implemented in at least two previous proprietary products. Since those
products are not accessible to the public, it was decided that a re-implementation might be of use to the
programming community at large.</p>
<p>Currently there is at least one company using Strolch in a commercial project which helps drive Strolch's
development and further motivates its existence.</p>
<p>Strolch is an open source project and licensed under the Apache License 2.0.</p>
<h2>Technologoy</h2>
<p>Strolch is written in Java and is programmed against the JDK 8. Strolch runs on any JRE 8 compliant
environment. Strolch is tested on the Oracle JRE 8.</p>
<h3>Dependencies</h3>
<p>Strolch strives to use as few external dependencies as possible, so that the Strolch runtime is not bloated
unnecessarily. The following list of Strolch dependencies is a summary and was created using mvn
dependency:tree on the strolch_minimal project for release 1.6.47.</p>
<p>Logging</p>
<p>Strolch is framework for developing Software. It's main features are:</p>
<ul>
<li>org.slf4j:slf4j-api:jar:1.7.25</li>
<li>ch.qos.logback:logback-classic:jar:1.2.3</li>
<li>ch.qos.logback:logback-core:jar:1.2.3</li>
</ul>
<p>Utils</p>
<ul>
<li>javax.mail:javax.mail-api:jar:1.6.0</li>
<li>com.sun.mail:javax.mail:jar:1.6.0</li>
<li>javax.activation:activation:jar:1.1</li>
</ul>
<p>Testing</p>
<ul>
<li>junit:junit:jar:4.12</li>
<li>org.hamcrest:hamcrest-core:jar:1.3</li>
<li>org.hamcrest:hamcrest-library:jar:1.3</li>
<li>org.mockito:mockito-core:jar:2.0.8-beta</li>
<li>org.objenesis:objenesis:jar:2.1</li>
</ul>
<p>Model</p>
<ul>
<li>com.google.code.gson:gson:jar:2.8.2</li>
</ul>
<p>SOQL</p>
<ul>
<li>org.abego.treelayout:org.abego.treelayout.core:jar:1.0.3</li>
<li>org.antlr:antlr-runtime:jar:3.5.2</li>
<li>org.antlr:antlr4-runtime:jar:4.7</li>
<li>org.antlr:antlr4:jar:4.7</li>
<li>org.antlr:ST4:jar:4.0.8</li>
<li>org.glassfish:javax.json:jar:1.0.4</li>
<li>com.ibm.icu:icu4j:jar:58.2</li>
</ul>
<p>PostgreSQL</p>
<ul>
<li>com.zaxxer:HikariCP:jar:2.7.1</li>
<li>org.postgresql:postgresql:jar:42.1.4</li>
</ul>
<p>REST</p>
<ul>
<li>javax.annotation:javax.annotation-api:jar:1.3.1</li>
<li>javax.servlet:javax.servlet-api:jar:3.1.0</li>
<li>javax.ws.rs:javax.ws.rs-api:jar:2.1</li>
</ul>
<p>REST testing</p>
<ul>
<li>javax.validation:validation-api:jar:1.1.0.Final</li>
<li>org.glassfish.grizzly:grizzly-framework:jar:2.3.28</li>
<li>org.glassfish.grizzly:grizzly-http-server:jar:2.3.28</li>
<li>org.glassfish.grizzly:grizzly-http-servlet:jar:2.3.28</li>
<li>org.glassfish.grizzly:grizzly-http:jar:2.3.28</li>
<li>org.glassfish.hk2:hk2-api:jar:2.5.0-b32</li>
<li>org.glassfish.hk2:hk2-locator:jar:2.5.0-b32</li>
<li>org.glassfish.hk2:hk2-utils:jar:2.5.0-b32</li>
<li>org.glassfish.hk2:osgi-resource-locator:jar:1.0.1</li>
<li>org.glassfish.hk2.external:aopalliance-repackaged:jar:2.5.0-b32</li>
<li>org.glassfish.hk2.external:javax.inject:jar:2.5.0-b32</li>
<li>org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.25.1</li>
<li>org.glassfish.jersey.containers:jersey-container-grizzly2-http:jar:2.25.1</li>
<li>org.glassfish.jersey.containers:jersey-container-grizzly2-servlet:jar:2.25.1</li>
<li>org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.25.1</li>
<li>org.glassfish.jersey.containers:jersey-container-servlet:jar:2.25.1</li>
<li>org.glassfish.jersey.core:jersey-client:jar:2.25.1</li>
<li>org.glassfish.jersey.core:jersey-common:jar:2.25.1</li>
<li>org.glassfish.jersey.core:jersey-server:jar:2.25.1</li>
<li>org.glassfish.jersey.media:jersey-media-jaxb:jar:2.25.1</li>
<li>org.glassfish.jersey.test-framework:jersey-test-framework-core:jar:2.25.1</li>
<li>org.javassist:javassist:jar:3.20.0-GA</li>
<li>Complete persisted <a href="documentation-model.html">data model</a>:
<ul>
<li>Parameters and values by time</li>
<li>Resources, Orders with arbitrary parameter grouping</li>
<li>Activity/Action hierarchy with arbitrary depth</li>
<li>Policies for delegation</li>
<li>JSON as well as XML transformation</li>
<li>Locator API</li>
</ul>
</li>
<li><a href="documentation-transactions.html">Transactions with pessimistic locking and optional
read-locking</a></li>
<li><a href="documentation-searches.html">Search API</a></li>
<li>Component based</li>
<li><a href="documentation-privileges.html">Deeply integrated privilege handling</a></li>
<li>Fully in-memory</li>
<li>Persisted auditing, versioning, operations log</li>
<li>DAOs for file system or PostgreSQL, easily extended</li>
<li>Execution framework</li>
<li><a href="documentation-services-and-commands.html">Service / Command oriented</a></li>
<li><a href="documentation-reports.html">Reporting API configured by Resource objects</a></li>
<li>REST API for data access</li>
<li>WebComponents UI for
<ul>
<li>Inspector</li>
<li>Users</li>
<li>Roles</li>
<li>Operations Log</li>
<li>Login Screen</li>
<li>Jobs</li>
</ul>
</li>
<li>runs on plain old Java SE</li>
</ul>
<h4>API</h4>
<h2>Strolch Intro</h2>
<p>It is a different framework to Spring and other similar type of Java frameworks, as the model is defined as
an abstract model, where you always have the same three types of objects: Resources, Orders and Activities.
The fields are mapped as Parameter objects, of which the important primitives are available.</p>
<p>The nice part about this framework is, that you can be up and ready in a matter of minutes, and start
building your project immediately in that you open your favourite XML editor and start modelling your
data.</p>
<p>Once your data is defined, you write your business logic in the form of Services, Commands and Searches.
There are many predefined services and commands to manipulate the object model, so that you write your own
services when you need to enforce special business rules.</p>
<p>Through the use of Policy objects, you decouple algorithms from your object model, so that at runtime you can
change the behaviour, or easily implement different behaviour depending on your use-case. For instance you
might have a simple billing service which performs a few preparatory steps, and then calls the configured
billing policy to execute the billing depending on the customer, the warehouse, etc.</p>
<p>And of course persistence is as simple as configuring the persistence handler, pointing to your RDBMS and
then setting the mode to CACHED. For you as a developer there is no more thinking in terms of SQL etc., as
this is completely hidden from the developer. There is even a simple file persistence layer if you are
running IoT devices.</p>
<p>The runtime can be just about anything. Usually it is run inside an Apache Tomcat instance as a webapp, as a
WEB UI has been required for all current Strolch projects. You could just as well use a main class. Accessing
the Strolch Agent remotely is usually done through REST.</p>
<p>Strolch is being actively developed, and customers constantly give us reasons to improve and extend the
framework. There is a Polymer Inspector component which makes it easy to see and manipulate the actual data.
The new Search API makes it really easy to query your data.</p>
<p>Yes, Strolch is different, but the concept has come out of the planning and execution segment, and has been
refined over the years until it has become what it is today.</p>
<h2>API</h2>
<p>Check out the <a href="api.html">API page</a> to see how to use Strolch.</p>
<a href="history.html">More to motivation etc.</a>
</div>
<!-- /.content -->