blob: 66469dbedc968c1fd4fb85594e56699c7d01bd73 [file] [log] [blame]
<!doctype html>
<html class="no-js" lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>Powered By</title>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<!-- No caching headers -->
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="expires" content="-1" />
<!-- TODO: need to (re)instate CDN in the future (not using for now just so can develop off-line -->
<link href="./css/foundation/5.5.1/foundation.css" rel="stylesheet" />
<script src="./js/foundation/5.5.1/vendor/modernizr.js"></script>
<link href="./css/asciidoctor/colony.css" rel="stylesheet">
<link href="./css/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">
<link href="./css/github-fork-ribbon-css/0.1.1/gh-fork-ribbon.css" rel="stylesheet" />
<!--[if lt IE 9]>
<link href="./css/github-fork-ribbon-css/0.1.1/gh-fork-ribbon.ie.css" rel="stylesheet" />
<![endif]-->
<style type="text/css">
pre code {
background-color: inherit;
border-style: none;
}
pre code > span:first-child {
margin-left: -5px;
}
<style>
<!--
<style type="text/css">
/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
/*pre.CodeRay {background-color:#f7f7f8;}*/
.CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em}
.CodeRay span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)}
.CodeRay .line-numbers strong{color:rgba(0,0,0,.4)}
table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
table.CodeRay td{vertical-align: top;line-height:1.45}
table.CodeRay td.line-numbers{text-align:right}
table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)}
table.CodeRay td.code{padding:0 0 0 .5em}
table.CodeRay td.code>pre{padding:0}
.CodeRay .debug{color:#fff !important;background:#000080 !important}
.CodeRay .annotation{color:#007}
.CodeRay .attribute-name{color:#000080}
.CodeRay .attribute-value{color:#700}
.CodeRay .binary{color:#509}
.CodeRay .comment{color:#998;font-style:italic}
.CodeRay .char{color:#04d}
.CodeRay .char .content{color:#04d}
.CodeRay .char .delimiter{color:#039}
.CodeRay .class{color:#458;font-weight:bold}
.CodeRay .complex{color:#a08}
.CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
.CodeRay .color{color:#099}
.CodeRay .class-variable{color:#369}
.CodeRay .decorator{color:#b0b}
.CodeRay .definition{color:#099}
.CodeRay .delimiter{color:#000}
.CodeRay .doc{color:#970}
.CodeRay .doctype{color:#34b}
.CodeRay .doc-string{color:#d42}
.CodeRay .escape{color:#666}
.CodeRay .entity{color:#800}
.CodeRay .error{color:#808}
.CodeRay .exception{color:inherit}
.CodeRay .filename{color:#099}
.CodeRay .function{color:#900;font-weight:bold}
.CodeRay .global-variable{color:#008080}
.CodeRay .hex{color:#058}
.CodeRay .integer,.CodeRay .float{color:#099}
.CodeRay .include{color:#555}
.CodeRay .inline{color:#000}
.CodeRay .inline .inline{background:#ccc}
.CodeRay .inline .inline .inline{background:#bbb}
.CodeRay .inline .inline-delimiter{color:#d14}
.CodeRay .inline-delimiter{color:#d14}
.CodeRay .important{color:#555;font-weight:bold}
.CodeRay .interpreted{color:#b2b}
.CodeRay .instance-variable{color:#008080}
.CodeRay .label{color:#970}
.CodeRay .local-variable{color:#963}
.CodeRay .octal{color:#40e}
.CodeRay .predefined{color:#369}
.CodeRay .preprocessor{color:#579}
.CodeRay .pseudo-class{color:#555}
.CodeRay .directive{font-weight:bold}
.CodeRay .type{font-weight:bold}
.CodeRay .predefined-type{color:inherit}
.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
.CodeRay .key{color:#808}
.CodeRay .key .delimiter{color:#606}
.CodeRay .key .char{color:#80f}
.CodeRay .value{color:#088}
.CodeRay .regexp .delimiter{color:#808}
.CodeRay .regexp .content{color:#808}
.CodeRay .regexp .modifier{color:#808}
.CodeRay .regexp .char{color:#d14}
.CodeRay .regexp .function{color:#404;font-weight:bold}
.CodeRay .string{color:#d20}
.CodeRay .string .string .string{background:#ffd0d0}
.CodeRay .string .content{color:#d14}
.CodeRay .string .char{color:#d14}
.CodeRay .string .delimiter{color:#d14}
.CodeRay .shell{color:#d14}
.CodeRay .shell .delimiter{color:#d14}
.CodeRay .symbol{color:#990073}
.CodeRay .symbol .content{color:#a60}
.CodeRay .symbol .delimiter{color:#630}
.CodeRay .tag{color:#008080}
.CodeRay .tag-special{color:#d70}
.CodeRay .variable{color:#036}
.CodeRay .insert{background:#afa}
.CodeRay .delete{background:#faa}
.CodeRay .change{color:#aaf;background:#007}
.CodeRay .head{color:#f8f;background:#505}
.CodeRay .insert .insert{color:#080}
.CodeRay .delete .delete{color:#800}
.CodeRay .change .change{color:#66f}
.CodeRay .head .head{color:#f4f}
pre.CodeRay code {
background-color: inherit;
border-style: none;
}
pre.CodeRay code > span:first-child {
margin-left: -5px;
}
.literalblock pre,
.listingblock pre:not(.highlight),
.listingblock pre[class="highlight"],
.listingblock pre[class^="highlight "],
.listingblock pre.CodeRay,
.listingblock pre.prettyprint {
background: rgb(253, 250, 246);
}
.sidebarblock .literalblock pre,
.sidebarblock .listingblock pre:not(.highlight),
.sidebarblock .listingblock pre[class="highlight"],
.sidebarblock .listingblock pre[class^="highlight "],
.sidebarblock .listingblock pre.CodeRay,
.sidebarblock .listingblock pre.prettyprint {
background: rgb(253, 250, 246);
}
<style>
-->
<style>
.github-fork-ribbon-wrapper.right {
position: fixed;
}
.github-fork-ribbon {
background: #090;
}
.github-fork-ribbon a:hover {
background:#0D0;
color:#fff;
font-size: 1.1em;
}
</style>
<style>
@media only screen and (min-width: 40.063em) {
.top-bar {
.contain-to-grid .top-bar {
max-width: 80rem;
}
}
}
.row {
max-width: 80rem;
}
</style>
<style>
.extended-quote,
.extended-quote-first {
margin-left: 40px;
margin-right: 40px;
font-style: italic;
}
.extended-quote-attribution {
text-align: right;
margin-right: 100px;
color: #10B061;
}
.extended-quote-first:before {
content: "\201c";
float: left;
font-size: 2.75em;
font-weight: bold;
line-height: 0.6em;
margin-left: -0.6em;
color: #003b6b;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}
</style>
<style>
body {
position: relative;
}
*:not(pre) a > code {
color: #210DDC;
}
*:not(pre) > code {
background-color: inherit;
border: none;
font-weight: normal;
}
body div#toc li,
body div#toc2 li {
list-style-type: none;
}
div#doc-content {
margin-top: 30px;
}
div.documentation-page table.frame-all {
border-left: none;
border-right: none;
}
body div#toc li.active-region:before,
body div#toc2 li.active-region:before {
content: "\00BB \0020";
margin-left: -12px;
}
body div#toc li a.active,
body div#toc2 li a.active {
color: red;
}
body div#toc.toc,
body div#toc.toc2 {
position: fixed;
left: auto;
padding-top: 60px;
z-index: auto;
background-color: white;
border-left-color: #eee;
border-left-style: solid;
border-right: none;
min-height: 2000px;
}
</style>
<style>
@media only screen and (min-width: 768px) {
#toc.toc2 ul ul { margin-left: -10px; }
}
body div#toc .tocify-subheader ul {
margin-bottom: 0px;
}
body div#toc .tocify-subheader li {
font-size: 14px;
}
.tocify li.tocify-item, .tocify ul.tocify-item {
line-height: 24px;
}
body div#toc li.tocify-item.active:before,
body div#toc2 li.tocify-item.active:before {
content: "\00BB \0020";
margin-left: -12px;
}
body div#toc li.tocify-item.active a,
body div#toc2 li.tocify-item.active a {
color: red;
}
</style>
<style>
footer {
margin-top: 1000px;
}
</style>
<style>
/* overriding colony.css stylesheet */
.literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] {
/*padding: 1.25em 1.5625em 1.125em 1.5625em;*/
padding: 0.3em 0.6em 0.25em 0.6em;
}
@media only screen and (min-width: 1280px)
#toc.toc2 {
/*width: 20em;*/
width: 25em;
}
#doc-content a {
color: #210DDC;
}
.top-bar h1 {
border-bottom: inherit;
}
h2 {
margin-top: 80px;
}
h3 {
margin-top: 40px;
}
h4,h5 {
margin-top: 30px;
}
.admonitionblock.tip > table td.content {
color: #10B061;
}
.admonitionblock.note > table td.content {
color: #B509AB;
}
.admonitionblock.important > table td.content {
color: #D5810A;
}
.admonitionblock .title {
font-size: larger;
font-style: italic;
}
.imageblock img {
margin-bottom: 10px;
}
</style>
<style>
/* from http://ben.balter.com/2014/03/13/pages-anchor-links/ */
.header-link {
position: absolute;
left: -0.5em;
opacity: 0;
/*
-webkit-transition: opacity 0.2s ease-in-out 0.1s;
-moz-transition: opacity 0.2s ease-in-out 0.1s;
-ms-transition: opacity 0.2s ease-in-out 0.1s;
*/
}
h2:hover .header-link,
h3:hover .header-link,
h4:hover .header-link,
h5:hover .header-link,
h6:hover .header-link {
opacity: 1;
}
</style>
<style>
.top-bar
{
-webkit-transition-duration: .5s;
transition-duration: .5s;
-webkit-transition-timing-function: cubic-bezier( 0.215, 0.610, 0.355, 1.000 );
transition-timing-function: cubic-bezier( 0.215, 0.610, 0.355, 1.000 );
-webkit-transition-property: -webkit-transform;
transition-property: transform;
}
/*
http://osvaldas.info/auto-hide-sticky-header
MIT license
*/
.header--hidden
{
-webkit-transform: translateY( -100% );
-ms-transform: translateY( -100% );
transform: translateY( -100% );
transition-duration: .5s;
transition-timing-function: cubic-bezier( 0.215, 0.610, 0.355, 1.000 );
-webkit-transition-property: -webkit-transform;
transition-property: transform;
}
</style>
<style>
#doc-content a.guide {
color: white;
}
</style>
<style>
.tocify {
margin-top: 80px;
}
</style>
</script>
</head>
<body>
<<div class="github-fork-ribbon-wrapper right" style="position: fixed;">
<div class="github-fork-ribbon">
<a href="https://github.com/apache/isis/fork">Fork me on GitHub</a>
</div>
</div>
<div class="row">
<div class="fixed contain-to-grid header">
<nav class="top-bar" data-topbar role="navigation" style="max-width: 80rem">
<ul class="title-area">
<li class="name">
<h1>
<a href="/index.html">Apache Isis&trade;</a>
</h1>
</li>
<!-- Remove the class "menu-icon" to get rid of menu icon. Take out "Menu" to just have icon alone -->
<li class="toggle-topbar menu-icon"><a href="#"><span>Menu</span></a></li>
</ul>
<section class="top-bar-section">
<ul class="right">
<li class="has-form">
<FORM class="searchbox navbar-form navbar-right" id="searchbox_012614087480249044419:dn-q5gtwxya" action="http://www.google.com/cse">
<div class="row collapse">
<input type="hidden" name="cx" value="012614087480249044419:dn-q5gtwxya">
<INPUT type="hidden" name="cof" value="FORID:0">
<INPUT class="form-control" name="q" type="text" placeholder="Search">
</div>
</FORM>
</li>
</ul>
<!-- Left Nav Section -->
<ul class="left">
<li><a href="/documentation.html">Documentation</a></li>
<li><a href="/downloads.html">Downloads</a></li>
<li><a href="/help.html">Help</a></li>
<li><a href="/asf.html">@ASF</a></li>
</ul>
</section>
</nav>
</div>
</div>
<div class="row">
<div id="doc-content-left" class="large-9 medium-9 columns">
<div id="doc-content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p><br/><br/></p>
</div>
<div class="paragraph">
<p>Deciding whether to use a full stack framework such as Apache Isis means in large part determining to what extent the
applications you need to develop align with the strengths and philosophy of the framework.</p>
</div>
<div class="paragraph">
<p>This page catalogues a few notable applications that are powered by Apache Isis so you can help make that determination:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="#_powered-by_estatio">Estatio</a></p>
</li>
<li>
<p><a href="#_powered-by_gesconsultor-grc">GESCONSULTOR GRC</a></p>
</li>
<li>
<p><a href="#_powered-by_commapp">CommApp</a></p>
</li>
<li>
<p><a href="#_powered-by_transport-planner">TransportPlanner</a></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>If you have written an app in Apache Isis that you&#8217;d like to share, please mention it on the <a href="./support.html">mailing list</a>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_powered-by_estatio">Estatio</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Estatio is an estate management application being developed for and deployed at <a href="http://www.eurocommercialproperties.com/">Eurocommercial Properties</a>.</p>
</div>
<div class="paragraph">
<p>Eurocommercial Properties is a Dutch-listed company that owns and operates over 50 shopping centres across Italy, France and Sweden, with income from property of approx. EUR150m per year. Previously the company had used one of the leading software packages for its invoicing;
however this had proven on the one hand lacking in key features/functionality for some locales, while
overlapping/duplicating the features/capabilities of the general ledger system. It had also been found to be
extremely difficult to upgrade to new versions of the product (eg multiple regressions).</p>
</div>
<div class="paragraph">
<p>The decision was made to develop a bespoke application focused just on invoicing, providing the flexibility to support
any of the requirements that might arise in the company&#8217;s operating coutries. It would interface but not overlap in
functionality with the existing general ledger. It would also be able to expand its scope over time to support more
of the company&#8217;s operations (eg to support purchase and disposal of shopping centres).</p>
</div>
<div class="paragraph">
<p>The application developed, and deployed initially in Italy, is called Estatio:</p>
</div>
<div class="imageblock">
<div class="content">
<a class="image" href="images/powered-by/estatio/estatio-1.png"><img src="images/powered-by/estatio/estatio-1.png" alt="estatio 1" width="900px"></a>
</div>
</div>
<div class="paragraph">
<p>The development team for the original implementation consisted of just two developers (both of whom are Apache Isis committers); the first version of the application was developed over 2 years and 2 man-years effort. Since the initial release - as the scope of the application has grown - the team has expanded to take on a further part-time developer and also some interns.</p>
</div>
<div class="sect2">
<h3 id="_supporting_open_source">Supporting Open Source</h3>
<div class="paragraph">
<p>Much of Apache Isis' recent development has been driven out by the requirements of this application, so you can see for yourself how many of the features in Isis are used in real life. Many of the (non-ASF) <a href="http://isisaddons.org">Isis Addons</a> also originate from the requirements of Estatio.</p>
</div>
<div class="paragraph">
<p>Estatio itself is also open source, licensed under Apache Software License and available on <a href="https://github.com/estatio/estatio">github</a>.</p>
</div>
<div class="paragraph">
<p>The Apache Isis committers are extremely grateful for Eurocommercial&#8217;s investment in the framework in order to make Estatio a reality. Our heart-felt thanks.</p>
</div>
<div class="paragraph">
<p>And to learn a little more about the Estatio domain model itself, take a look at both the source code (of course) and also at <a href="https://github.com/estatio/estatio/blob/master/adocs/documentation/src/main/asciidoc/auditability.adoc">this documentation</a>, developed to allow Eurocommercial&#8217;s accountants to understand and audit the application.</p>
</div>
<div class="paragraph">
<p><em>Case study provided by Jeroen van der Wal, <a href="http://incode.org" class="bare">http://incode.org</a></em></p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_powered-by_gesconsultor-grc">GESCONSULTOR GRC</h2>
<div class="sectionbody">
<div class="paragraph">
<p><a href="http://http://www.gesconsultor.com">GESCONSULTOR</a> GRC (currently SandaS GRC) is an IT Governance, Risk and Compliance
platform to help companies be compliant with IT-related ISO Standards, laws, regulations and best practices. Its scope
includes:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>ISO 27001 for Information Security Management Systems,</p>
</li>
<li>
<p>ISO 22301 for Business Continuity Management Systems,</p>
</li>
<li>
<p>ISO 20000 for IT Service Management Systems,</p>
</li>
<li>
<p>PCI-DSS regulation for Information Systems accessing electronic media payment Information,</p>
</li>
<li>
<p>COBIT standard from ISACA,</p>
</li>
<li>
<p>Critical Infrastructure Protection laws,</p>
</li>
<li>
<p>Data Privacy laws of many countries.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>With thousands of customers of some of its modules, the application needed to support many business requirements
derived from previous requisite sources and also from many Authoritative Sources loaded by users.</p>
</div>
<div class="paragraph">
<p>In 2011 a major rearchitecting was begun, and Apache Isis was selected as the best solution - among all Java frameworks
and platforms evaluated - for supporting those business rules in a domain-focused way.</p>
</div>
<div class="paragraph">
<p>Following the principles of Domain-Driven Design for the domain layer, and with the infrastructure layer isolated by
the Apache Isis framework, the new system started to grow in a highly structured and maintainable way. New modules
were created really quickly, with functionality not available on competing solutions.</p>
</div>
<div class="paragraph">
<p>The application also leveraged the flexibility of the framework, replacing the provided Wicket viewer with a custom
viewer. More on this below.</p>
</div>
<div class="sect2">
<h3 id="_key_features">Key features</h3>
<div class="sect3">
<h4 id="_enterprise_architecture">Enterprise Architecture</h4>
<div class="paragraph">
<p>Allows a company to model its <em>Business</em>, <em>IT Asset</em>s and their dependencies. The custom viewer in this case exposes a
classical form-like interface:</p>
</div>
<div class="imageblock">
<div class="content">
<a class="image" href="images/powered-by/gesconsultor-grc/fig-1-custom-viewer.png"><img src="images/powered-by/gesconsultor-grc/fig-1-custom-viewer.png" alt="fig 1 custom viewer" width="800px"></a>
</div>
</div>
<div class="paragraph">
<p>Alternatively, a custom drag-n-drop visual interface can be used:</p>
</div>
<div class="imageblock">
<div class="content">
<a class="image" href="images/powered-by/gesconsultor-grc/fig-2-custom-drag-n-drop-interface.png"><img src="images/powered-by/gesconsultor-grc/fig-2-custom-drag-n-drop-interface.png" alt="fig 2 custom drag n drop interface" width="800px"></a>
</div>
</div>
<div class="paragraph">
<p>This is implemented with the Dojo javascript library, interfacing to Apache Isis-managed domain objects.</p>
</div>
</div>
<div class="sect3">
<h4 id="_risk_management">Risk Management</h4>
<div class="paragraph">
<p>Allows a company to manage <em>Risk Scenario</em>s through a <em>Risk Register</em>, and execute a full ISO 31000 compliant
<em>Risk Assessment</em>. A custom UI visualizes these risks as a heatmap:</p>
</div>
<div class="imageblock">
<div class="content">
<a class="image" href="images/powered-by/gesconsultor-grc/fig-3-custom-ui-analyzing-risk-scenarios.png"><img src="images/powered-by/gesconsultor-grc/fig-3-custom-ui-analyzing-risk-scenarios.png" alt="fig 3 custom ui analyzing risk scenarios" width="800px"></a>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_project_management">Project Management</h4>
<div class="paragraph">
<p>Allows users to visually manage their projects and tasks through a KanBan-like interface. Again, the viewer provides
drag-n-drop capabilities:</p>
</div>
<div class="imageblock">
<div class="content">
<a class="image" href="images/powered-by/gesconsultor-grc/fig-4-managing-projects.png"><img src="images/powered-by/gesconsultor-grc/fig-4-managing-projects.png" alt="fig 4 managing projects" width="px"></a>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_dashboard_and_indicators">Dashboard and Indicators</h4>
<div class="paragraph">
<p>Being a "world-first", the GRC platform&#8217;s implementation of the Information Security measurement standard (ISO 27004)
allows companies to access real-time information available in the GRC platform and External Systems, associate
<em>Decision Criteria</em> to them and create beautiful <em>Dashboard</em>s and <em>Indicator</em>s.</p>
</div>
<div class="paragraph">
<p>All the business rules are on a Domain fully implemented in Apache Isis.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_implementation_details">Implementation details</h3>
<div class="paragraph">
<p>The GRC application require a more sophisticating and customizable viewer than is provided "out-of-the-box" by
Apache Isis. We chose <a href="http://wavemaker.com">Wavemaker</a> for implementing the viewer, also leveraging and integrating with
various Wavemaker services.</p>
</div>
<div class="paragraph">
<p>Even so, while GRC does (as the figures above show) include custom views, the majority of the views exposed by GRC are
automatically generated from the underlying domain entities; the GRC viewer is a proprietary version of Isis' own
<a href="ugvw.html">Wicket viewer</a>. At the last count more than 400 domain entities, across 6 different
Bounded Contexts, are surfaced in the UI in this this way.</p>
</div>
<div class="paragraph">
<p>At the Domain level, we also extensively use the <a href="ugbtb.html#_ugbtb_decoupling_event-bus">domain events</a>
functionality available in Apache Isis, along with many of the (non-ASF) <a href="http://isisaddons.org">Isis Addons</a> (such
as <a href="http://github.com/isisaddons/isis-module-audit">audit</a>, <a href="http://github.com/isisaddons/isis-module-security">security</a>
and the <a href="http://github.com/isisaddons/isis-module-excel">excel</a> modules).</p>
</div>
<div class="paragraph">
<p>The GRC platform currently has more than 5600 automated tests, about 2000 being
<a href="ugtst.html#_ugtst_bdd-spec-support">BDD tests</a> and 3600 <a href="ugtst.html#_ugtst_integ-test-support">integration
tests</a>, all leveraging Apache Isis' extensive testing capabilities.</p>
</div>
</div>
<div class="sect2">
<h3 id="_summing_up">Summing up</h3>
<div class="paragraph">
<p>Three years after this major refactoring, the GRC platform was acquired by Telefonica to be used as its top-level
Security Governance platform; a breakthrough in the Managed Security Services sector.</p>
</div>
<div class="paragraph">
<p>The original development team currently work on Telefonica offices; the Product Management is co-directed by the
<a href="http://www.govertis.com">GOVERTIS company</a> that originally developed it, and Telefonica.</p>
</div>
<div class="paragraph">
<p>All this could not have been achieved as quickly nor as effectively without the Apache Isis platform.</p>
</div>
<div class="paragraph">
<p><em>Case study provided by Oscar Bou, GOVERTIS</em></p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_powered-by_commapp">CommApp</h2>
<div class="sectionbody">
<div class="paragraph">
<p>CommApp is an application whose domain is that of managing businesses themselves, specifically the commercial aspects
of a business. You can get a feel for it from this screenshot:</p>
</div>
<div class="imageblock">
<div class="content">
<a class="image" href="images/powered-by/commapp/screenshot-1.png"><img src="images/powered-by/commapp/screenshot-1.png" alt="screenshot 1" width="900px"></a>
</div>
</div>
<div class="paragraph">
<p>which shows how the app integrates a number of the (non-ASF) <a href="http://isisaddons.org">Isis Addons</a>
(<a href="http://github.com/isisaddons/isis-module-excel">excel</a>,
<a href="http://github.com/isisaddons/isis-module-fullcalendar2">fullcalendar2</a> and
<a href="http://github.com/isisaddons/isis-module-gmap3">gmap3</a>). The app also uses the
(non-ASF) <a href="http://github.com/isisaddons/isis-module-wickedcharts">wickedcharts</a> module to generate various charts.</p>
</div>
<div class="sect2">
<h3 id="_why_apache_isis">Why Apache Isis?</h3>
<div class="paragraph">
<p>When making our decision towards a software development framework, we evaluated some few like Spring Framework and
Oracle ADF, including a newer semantic framework. At that point we faced we needed to choose between being locked in
to a framework using many of their proprietary classes, methods and other features, or having to write a lot of code
even to get things as CURD operations, and we would be facing significant differences in the code if using relational
databases or the newer so called NonSQL databases.</p>
</div>
<div class="paragraph">
<p>So we added Apache Isis to our evaluation, and we found it to be open in many aspects, including an open architecture
and auto-generated UI viewer, as well as equally open and auto-generated REST/SOA web services, seamlessly support
both SQL and NoSQL through an open and standard <a href="http://datanucleus.org">persistence manager</a>, as well as open security
(<a href="http://shiro.apache.org">Apache Shiro</a>, LDAP) and features such as multi-tenancy.</p>
</div>
<div class="paragraph">
<p>Our main focus in the code is given to the business domain, with business logic treated as a first class citizen.
And because our code simply uses non-proprietary Java, we&#8217;ve been able to extend it the normal way. Very little code in
our application so far can be considered to be framework-specific, the few that is only because we chose to use some
of the (non-ASF) <a href="http://isisaddons.org">Isis Addons</a> that provide our applications with high value, and which are
open source also.</p>
</div>
<div class="paragraph">
<p>When creating our prototype and then subsequent application, we&#8217;ve found quite amazing support: most of the time the
Isis team provides same day high quality support, with samples and references, which has helped us find the solution
to our needs quickly. The framework is growing rapidly as well, keeping its openness and business domain driven focus.
The tutorials and documentation is quite comprehensive and very clear. We have found all this hard to find in many
other open source frameworks.</p>
</div>
<div class="paragraph">
<p><em>Case study provided by Cesar Lugo, R&amp;D Director</em></p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_powered-by_transport-planner">TransportPlanner</h2>
<div class="sectionbody">
<div class="paragraph">
<p>TransportPlanner is a demo done by <a href="http://www.sintef.no/home/MARINTEK/">Marintek AS</a> to show a possible 'solution' to a multimodal transport planning problem. It&#8217;s a small part of a bigger European funded project.</p>
</div>
<div class="paragraph">
<p>The domain is that:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>some cargo should be transported from a pickup destination to a delivery destination.</p>
</li>
<li>
<p>A 'client' creates a transport demand</p>
</li>
<li>
<p>A 'logistics service provider' plans a route from pickup to delivery using a shortest path algorithm.</p>
</li>
<li>
<p>The route&#8217;s waypoints (where cargo is loaded from one providere to another) may be shown on a map.</p>
</li>
<li>
<p>The costs associated with each leg may be shown as a pie chart</p>
</li>
<li>
<p>The resource usage, i.e. costs and time for each leg, may be shown as a bar chart.</p>
</li>
<li>
<p>An event may be generated (e.g. some customs papers are missing, therefore transport execution stops and a replan
is necessary).</p>
</li>
</ul>
</div>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><div><div class="paragraph">
<p>TransportPlanner allows schedules of journeys to be planned. It uses the (non-ASF) <a href="http://github.com/isisaddons/isis-wicket-gmap3">Isis addons' gmap3</a> wicket extension to provide the map.</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div><div class="imageblock">
<div class="content">
<a class="image" href="https://www.assembla.com/code/transportplanner/git/node/blob/screenshots/TransportDemand.png?raw=1&rev=a9d5184ecb05c3d95dafec587c84cfcbc7a25b8b"><img src="https://www.assembla.com/code/transportplanner/git/node/blob/screenshots/TransportDemand.png?raw=1&rev=a9d5184ecb05c3d95dafec587c84cfcbc7a25b8b" alt="TransportDemand" width="530px"></a>
</div>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div><div class="paragraph">
<p>TransportPlanner uses (non-ASF) <a href="http://github.com/isisaddons/isis-wicket-wickedcharts">Isis addons' wickedcharts</a> wicket extension to provide custom graphs</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div><div class="imageblock">
<div class="content">
<a class="image" href="https://www.assembla.com/code/transportplanner/git/node/blob/screenshots/TPM_CostPie.png?raw=1&rev=a9d5184ecb05c3d95dafec587c84cfcbc7a25b8b"><img src="https://www.assembla.com/code/transportplanner/git/node/blob/screenshots/TPM_CostPie.png?raw=1&rev=a9d5184ecb05c3d95dafec587c84cfcbc7a25b8b" alt="TPM CostPie" width="530px"></a>
</div>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div><div class="paragraph">
<p>Another example of TransportPlanner&#8217;s use of (non-ASF) <a href="http://github.com/isisaddons/isis-wicket-wickedcharts">wickedcharts</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div><div class="imageblock">
<div class="content">
<a class="image" href="https://www.assembla.com/code/transportplanner/git/node/blob/screenshots/Tpm_ResourceUsage.png?raw=1&rev=a9d5184ecb05c3d95dafec587c84cfcbc7a25b8b"><img src="https://www.assembla.com/code/transportplanner/git/node/blob/screenshots/Tpm_ResourceUsage.png?raw=1&rev=a9d5184ecb05c3d95dafec587c84cfcbc7a25b8b" alt="Tpm ResourceUsage" width="530px"></a>
</div>
</div></div></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The author, Christian Steinebach, wrote this demo part-time over the course of a few weeks. He commented:</p>
</div>
<div class="paragraph">
<p><div class="extended-quote"><p>
I did not have too much time to get 'something done' &#8230;&#8203; But although I had a hard time in the beginning with Isis I don&#8217;t think I would have made it in time using 'conventional' development with database, GUI etc.
using Apache Isis.
</p></div></p>
</div>
<div class="paragraph">
<p>Because this is a demo, there is a lot of room for improvement, but it does show how a relatively simple domain model can be brought 'alive'. The source code is available <a href="https://www.assembla.com/code/transportplanner/git/nodes">here</a> (note: it was written against a snapshot version of Apache Isis).</p>
</div>
<div class="paragraph">
<p><em>Case study provided by Christian Steinebach, Marintech</em></p>
</div>
</div>
</div>
</div>
<footer>
<hr>
<p class="small">
Copyright &copy; 2010~2016 The Apache&nbsp;Software&nbsp;Foundation, licensed under the Apache&nbsp;License,&nbsp;v2.0.
<br/>
Apache, the Apache feather logo, Apache&nbsp;Isis, and the Apache&nbsp;Isis project logo are all trademarks of The&nbsp;Apache&nbsp;Software&nbsp;Foundation.
</p>
</footer>
</div>
<div id="doc-content-right" class="large-3 medium-3 xcolumns">
<div id="toc" class="toc2">
<div class="fallback-toc">
<ul class="sectlevel1">
<li><a href="#_powered-by_estatio">Estatio</a>
<ul class="sectlevel2">
<li><a href="#_supporting_open_source">Supporting Open Source</a></li>
</ul>
</li>
<li><a href="#_powered-by_gesconsultor-grc">GESCONSULTOR GRC</a>
<ul class="sectlevel2">
<li><a href="#_key_features">Key features</a>
<ul class="sectlevel3">
<li><a href="#_enterprise_architecture">Enterprise Architecture</a></li>
<li><a href="#_risk_management">Risk Management</a></li>
<li><a href="#_project_management">Project Management</a></li>
<li><a href="#_dashboard_and_indicators">Dashboard and Indicators</a></li>
</ul>
</li>
<li><a href="#_implementation_details">Implementation details</a></li>
<li><a href="#_summing_up">Summing up</a></li>
</ul>
</li>
<li><a href="#_powered-by_commapp">CommApp</a>
<ul class="sectlevel2">
<li><a href="#_why_apache_isis">Why Apache Isis?</a></li>
</ul>
</li>
<li><a href="#_powered-by_transport-planner">TransportPlanner</a></li>
</ul>
</div>
</div>
</div>
</div>
<script src="./js/foundation/5.5.1/vendor/jquery.js"></script>
<script src="./js/foundation/5.5.1/foundation.min.js"></script>
<link href="./css/jquery.tocify/1.9.0/jquery.tocify.css" rel="stylesheet">
<script src="./js/jqueryui/1.11.4/jquery-ui.min.js"></script>
<script src="./js/jquery.tocify/1.9.0/jquery.tocify.js"></script>
<script type="text/javascript">
$(function () {
$("#toc").tocify({
scrollTo: 50,
extendPage: true,
context: "#doc-content",
highlightOnScroll: true,
hashGenerator: "pretty",
hideEffect: "slideUp",
selectors: "h2,h3,h4,h5"
});
$(".fallback-toc").hide();
});
</script>
<script type="text/javascript">
/****
$(document).foundation();
$(document).ready(function(){
// Cache selectors
var lastId,
topMenu = $("div#toc ul"),
topMenuHeight = 100,
menuItems = topMenu.find("a"),
menuItemsHrefs = menuItems.map(function(){
var item = $($(this).attr("href"));
if (item.length) { return item; }
});
// Bind click handler to menu items to scroll animation
menuItems.click(function(e){
var href = $(this).attr("href"),
offsetTop = href === "#" ? 0 : $(href).offset().top-topMenuHeight+1;
$('html, body').stop().animate({
scrollTop: offsetTop
}, 300);
e.preventDefault();
});
// Bind to scroll of window
$( window ).scroll(function(){
// Get container scroll position
var fromTop = $(this).scrollTop()+topMenuHeight;
var cur = menuItemsHrefs.map(function(){
if ($(this).offset().top < fromTop)
return this;
});
// Get the id of the current element
cur = cur[cur.length-1];
var id = cur && cur.length ? cur[0].id : "";
if (lastId !== id && id) {
scrollTo(id);
}
window.history.pushState({}, "", window.location.origin + window.location.pathname + "#" + id);
});
scrollTo = function(id) {
lastId = id;
menuItems
.removeClass("active");
menuItems
.parents()
.removeClass("active-region");
menuItems
.parents("ul").hide();
menuItems
.filter("[href=#"+id+"]")
.addClass("active");
menuItems
.filter("[href=#"+id+"]")
.parents("ul").show();
menuItems
.filter("[href=#"+id+"]")
.parent().children("ul").show();
menuItems
.filter("[href=#"+id+"]")
.parents("li").addClass("active-region");
}
menuItems
.removeClass("active");
menuItems
.parents()
.removeClass("active-region");
var syncMenuItem;
if(window.location.hash!=="") {
var menuItemFor = $.grep(menuItems, function(e) {
return e.hash === window.location.hash;
});
console.log(menuItemFor);
if(menuItemFor.length === 1) {
syncMenuItem = menuItemFor[0];
}
}
if(!syncMenuItem){
syncMenuItem = menuItems[0];
}
$(syncMenuItem).click();
});
***/
</script>
<script type="text/javascript">
$(document).ready(function(){
if("Documentation" === "Powered By") {
console.log( "processing 'Documentation'" );
$("#doc-content-left").removeClass("large-9").removeClass("medium-9").addClass("large-12").addClass("medium-12");
$("#doc-content-right").removeClass("large-3").removeClass("medium-3").hide();
}
});
</script>
<script>
$( document ).ready(function() {
(function() {
$(function() {
return $("#doc-content h2, #doc-content h3, #doc-content h4, #doc-content h5, #doc-content h6").each(function(i, el) {
var $el, icon, id;
$el = $(el);
id = $el.attr('id');
icon = '<i class="fa fa-link"></i>';
if (id) {
return $el.prepend($("<a />").addClass("header-link").attr("href", "#" + id).html(icon));
}
});
});
}).call(this);
/*
http://osvaldas.info/auto-hide-sticky-header
MIT license
*/
;( function( $, window, document, undefined )
{
'use strict';
var elSelector = '.header',
elClassHidden = 'header--hidden',
throttleTimeout = 500,
$element = $( elSelector );
if( !$element.length ) return true;
var $window = $( window ),
wHeight = 0,
wScrollCurrent = 0,
wScrollBefore = 0,
wScrollDiff = 0,
$document = $( document ),
dHeight = 0,
throttle = function( delay, fn )
{
var last, deferTimer;
return function()
{
var context = this, args = arguments, now = +new Date;
if( last && now < last + delay )
{
clearTimeout( deferTimer );
deferTimer = setTimeout( function(){ last = now; fn.apply( context, args ); }, delay );
}
else
{
last = now;
fn.apply( context, args );
}
};
};
$window.on( 'scroll', throttle( throttleTimeout, function()
{
dHeight = $document.height();
wHeight = $window.height();
wScrollCurrent = $window.scrollTop();
wScrollDiff = wScrollBefore - wScrollCurrent;
if( wScrollCurrent <= 0 ) // scrolled to the very top; element sticks to the top
$element.removeClass( elClassHidden );
else if( wScrollDiff > 0 && $element.hasClass( elClassHidden ) ) // scrolled up; element slides in
$element.removeClass( elClassHidden );
else if( wScrollDiff < 0 ) // scrolled down
{
if( wScrollCurrent + wHeight >= dHeight && $element.hasClass( elClassHidden ) ) // scrolled to the very bottom; element slides in
$element.removeClass( elClassHidden );
else // scrolled down; element slides out
$element.addClass( elClassHidden );
}
wScrollBefore = wScrollCurrent;
}));
})( jQuery, window, document );
});
</script>
</body>
</html>