You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by bu...@apache.org on 2015/06/16 08:33:11 UTC
svn commit: r954994 [25/43] - in /websites/staging/isis/trunk: cgi-bin/
content/ content/css/ content/css/asciidoctor/ content/css/font-awesome/
content/css/font-awesome/4.3.0/ content/css/font-awesome/4.3.0/css/
content/css/font-awesome/4.3.0/fonts/ c...
Added: websites/staging/isis/trunk/content/introducing-apache-isis/isis-in-pictures/isis-in-pictures.html
==============================================================================
--- websites/staging/isis/trunk/content/introducing-apache-isis/isis-in-pictures/isis-in-pictures.html (added)
+++ websites/staging/isis/trunk/content/introducing-apache-isis/isis-in-pictures/isis-in-pictures.html Tue Jun 16 06:33:07 2015
@@ -0,0 +1,766 @@
+<!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>Isis in Pictures</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">
+ /* 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{font-weight: normal}
+table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
+table.CodeRay td{vertical-align: top}
+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:#00}
+.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;
+ }
+
+ 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™</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 class="admonitionblock important">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-important" title="Important"></i>
+</td>
+<td class="content">
+TODO
+</td>
+</tr>
+</table>
+</div>
+ </div>
+
+ <footer>
+ <hr>
+ <p class="small">
+ Copyright © 2010~2015 The Apache Software Foundation, licensed under the Apache License, v2.0.
+ <br/>
+ Apache, the Apache feather logo, Apache Isis, and the Apache Isis project logo are all trademarks of The Apache Software Foundation.
+ </p>
+ </footer>
+
+ </div>
+
+ <div id="doc-content-right" class="large-3 medium-3 xcolumns">
+ <div id="toc" class="toc2">
+ <div class="fallback-toc">
+
+ </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" === "Isis in Pictures") {
+ 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>
\ No newline at end of file
Added: websites/staging/isis/trunk/content/isis-in-pictures.html
==============================================================================
--- websites/staging/isis/trunk/content/isis-in-pictures.html (added)
+++ websites/staging/isis/trunk/content/isis-in-pictures.html Tue Jun 16 06:33:07 2015
@@ -0,0 +1,1136 @@
+<!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>Isis in Pictures</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">
+ /* 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{font-weight: normal}
+table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
+table.CodeRay td{vertical-align: top}
+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:#00}
+.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;
+ }
+
+ 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™</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/><br/></p>
+</div>
+<div class="paragraph">
+<p>On this page we want to show you what a modern Isis application looks like.</p>
+</div>
+<div class="paragraph">
+<p>The screenshots below are taken from the Isis Addons' <a href="http://github.com/isisaddons/isis-app-todoapp">todoapp example</a> (non ASF), which you are free to fork and use as you will. The corresponding domain classes from which this UI was built can be found <a href="https://github.com/isisaddons/isis-app-todoapp/tree/0669d6e2acc5bcad1d9978a4514a17bcf7beab1f/dom/src/main/java/todoapp/dom/module/todoitem">here</a>.</p>
+</div>
+<div class="paragraph">
+<p>The todoapp also integrates with a number of other <a href="http://www.isisaddons.org">Isis Addons</a> modules. Because we expect that most apps will end up using one or more of these addons, we’ve chosen to include screenshots of those too.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>Please note that the Isis Addons are not part of ASF, but they <em>are</em> all licensed under Apache License 2.0 and are maintained by the Isis committers.</p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_basics">Basics</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Let’s start with the basics…​</p>
+</div>
+<div class="sect2">
+<h3 id="_sign_in">Sign-in</h3>
+<div class="paragraph">
+<p>Apache Isis integrates with <a href="http://shiro.apache.org">Apache Shiro</a>. The core framework supports file-based realms, while the Isis Addons <a href="http://github.com/isisaddons/isis-module-security">security module</a> (non ASF) provides a well-features subdomain of users, roles and permissions against features derived from the Isis metamodel. The example todoapp integrates with the security module.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/010-login.png"><img src="images//isis-in-pictures/010-login.png" alt="010 login" width="600px"></a>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_install_fixtures">Install Fixtures</h3>
+<div class="paragraph">
+<p>Apache Isis has lots of features to help you prototype and then fully test your application. One such are fixture scripts, which allow pre-canned data to be installed in the running application. This is great to act as the starting point for identifying new stories; later on when the feature is being implemented, the same fixture script can be re-used within that feature’s integration tests. (More on tests later).</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/020-install-fixtures.png"><img src="images//isis-in-pictures/020-install-fixtures.png" alt="020 install fixtures" width="600px"></a>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_dashboard_and_view_models">Dashboard and View Models</h3>
+<div class="paragraph">
+<p>Most of the time the end-user interacts with representations of persistent domain entities, but Isis also supports view models which can aggregate data from multiple sources. The todoapp example uses a "dashboard" view model to list todo items not yet done vs those completed.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/030-dashboard-view-model.png"><img src="images//isis-in-pictures/030-dashboard-view-model.png" alt="030 dashboard view model" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>In general we recommend to initially focus only on domain entities; this will help drive out a good domain model. Later on view models can be introduced in support of specific use cases.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_domain_entity">Domain Entity</h3>
+<div class="paragraph">
+<p>The screenshot below is of the todoapp’s <code>ToDoItem</code> domain entity. Like all web pages, this UI is generated at runtime, directly from the domain object itself. There are no controllers or HTML to write.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/040-domain-entity.png"><img src="images//isis-in-pictures/040-domain-entity.png" alt="040 domain entity" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>In addition to the domain entity, Apache Isis allows layout metadata hints to be provided, for example to specify the grouping of properties, the positioning of those groups into columns, the association of actions (the buttons) with properties or collections, the icons on the buttons, and so on. This metadata can be specified either as annotations or in JSON form; the benefit of the latter is that it can be updated (and the UI redrawn) without restarting the app.</p>
+</div>
+<div class="paragraph">
+<p>Any production-ready app will require this metadata but (like the view models discussed above) this metadata can be added gradually on top of the core domain model.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_edit_properties">Edit properties</h3>
+<div class="paragraph">
+<p>By default properties on domain entities are editable, meaning they can be changed directly. In the todoapp example, the `ToDoItem’s description is one such editable property:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/050-edit-property.png"><img src="images//isis-in-pictures/050-edit-property.png" alt="050 edit property" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>Note that some of the properties are read-only even in edit mode; individual properties can be made non-editable. It is also possible to make all properties disabled and thus enforce changes only through actions (below).</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_actions">Actions</h3>
+<div class="paragraph">
+<p>The other way to modify an entity is to an invoke an action. In the screenshot below the `ToDoItem’s category and subcategory can be updated together using an action:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/060-invoke-action.png"><img src="images//isis-in-pictures/060-invoke-action.png" alt="060 invoke action" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>There are no limitations on what an action can do; it might just update a single object, it could update multiple objects. Or, it might not update any objects at all, but could instead perform some other activity, such as sending out email or printing a document.</p>
+</div>
+<div class="paragraph">
+<p>In general though, all actions are associated with some object, and are (at least initially) also implemented by that object: good old-fashioned encapsulation. We sometimes use the term "behaviourally complete" for such domain objects.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_contributions">Contributions</h3>
+<div class="paragraph">
+<p>As an alternative to placing actions (business logic) on a domain object, it can instead be placed on an (application-scoped, stateless) domain service. When an object is rendered by Apache Isis, it will automatically render all "contributed" behaviour; rather like traits or aspect-oriented mix-ins).</p>
+</div>
+<div class="paragraph">
+<p>In the screenshot below the highlighted "export as xml" action, the "relative priority" property (and "previous" and "next" actions) and also the "similar to" collection are all contributed:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/065-contributions.png"><img src="images//isis-in-pictures/065-contributions.png" alt="065 contributions" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>Contributions are defined by the signature of the actions on the contributing service. The code snippet below shows how this works for the "export as xml" action:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/067-contributed-action.png"><img src="images//isis-in-pictures/067-contributed-action.png" alt="067 contributed action" width="600px"></a>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_extensible_views">Extensible Views</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The Apache Isis viewer is implemented using <a href="http://wicket.apache.org">Apache Wicket</a>, and has been architected to be extensible. For example, when a collection of objects is rendered, this is just one several views, as shown in the selector drop-down:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/070-pluggable-views.png"><img src="images//isis-in-pictures/070-pluggable-views.png" alt="070 pluggable views" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>The Isis Addons' <a href="https://github.com/isisaddons/isis-wicket-gmap3">gmap3 component</a> (non ASF) will render any domain entity (such as <code>ToDoItem</code>) that implements its <code>Locatable</code> interface:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/080-gmap3-view.png"><img src="images//isis-in-pictures/080-gmap3-view.png" alt="080 gmap3 view" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>Similarly the Isis Addons' <a href="https://github.com/isisaddons/isis-wicket-fullcalendar2">fullcalendar2 component</a> (non ASF) will render any domain entity (such as <code>ToDoItem</code>) that implements its <code>Calendarable</code> interface:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/090-fullcalendar2-view.png"><img src="images//isis-in-pictures/090-fullcalendar2-view.png" alt="090 fullcalendar2 view" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>Yet another "view" (though this one is rather simpler is that provided by the Isis Addons <a href="https://github.com/isisaddons/isis-wicket-excel">excel component</a> (non ASF). This provides a download button to the table as a spreadsheet:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/100-excel-view-and-docx.png"><img src="images//isis-in-pictures/100-excel-view-and-docx.png" alt="100 excel view and docx" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>The screenshot above also shows an "export to Word" action. This is <em>not</em> a view but instead is a (contributed) action that uses the Isis Addons <a href="https://github.com/isisaddons/isis-module-docx">docx module</a> (non ASF) to perform a "mail-merge":</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/110-docx.png"><img src="images//isis-in-pictures/110-docx.png" alt="110 docx" width="600px"></a>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_security_auditing_and_more">Security, Auditing and more…​</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>As well as providing extensions to the UI, the Isis Addons provides a rich set of modules to support various cross-cutting concerns.</p>
+</div>
+<div class="paragraph">
+<p>Under the activity menu are four sets of services which provide support for <a href="https://github.com/isisaddons/isis-module-sessionlogger">user session logging/auditing</a> (non ASF), <a href="https://github.com/isisaddons/isis-module-command">command profiling</a> (non ASF), <a href="https://github.com/isisaddons/isis-module-audit">(object change) auditing</a> (shown, non-ASF) and (inter-system) <a href="https://github.com/isisaddons/isis-module-publishing">event publishing</a> (non ASF):</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/120-auditing.png"><img src="images//isis-in-pictures/120-auditing.png" alt="120 auditing" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>In the security menu is access to the rich set of functionality provided by the Isis addons <a href="https://github.com/isisaddons/isis-module-security">security module</a> (non ASF):</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/130-security.png"><img src="images//isis-in-pictures/130-security.png" alt="130 security" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>In the prototyping menu is the ability to download a GNU gettext <code>.po</code> file for translation. This file can then be translated into multiple languages so that your app can support different locales. Note that this feature is part of Apache Isis core (it is not in Isis Addons):</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/140-i18n.png"><img src="images//isis-in-pictures/140-i18n.png" alt="140 i18n" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>The Isis addons also provides a module for managing application and user <a href="https://github.com/isisaddons/isis-module-settings">settings</a> (non ASF). Most apps (the todoapp example included) won’t expose these services directly, but will usually wrap them in their own app-specific settings service that trivially delegates to the settings module’s services:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/150-appsettings.png"><img src="images//isis-in-pictures/150-appsettings.png" alt="150 appsettings" width="600px"></a>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_multi_tenancy_support">Multi-tenancy support</h3>
+<div class="paragraph">
+<p>Of the various Isis addons, the <a href="https://github.com/isisaddons/isis-module-security">security module</a> has the most features. One significant feature is the ability to associate users and objects with a "tenancy". The todoapp uses this feature so that different users' list of todo items are kept separate from one another. A user with administrator is able to switch their own "tenancy" to the tenancy of some other user, in order to access the objects in that tenancy:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/160-switch-tenancy.png"><img src="images//isis-in-pictures/160-switch-tenancy.png" alt="160 switch tenancy" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>For more details, see the <a href="https://github.com/isisaddons/isis-module-security">security module</a> README.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_me">Me</h3>
+<div class="paragraph">
+<p>Most of the <a href="https://github.com/isisaddons/isis-module-security">security module</a>'s services are on the security module, which would normally be provided only to administrators. Kept separate is the "me" action:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/170-me.png"><img src="images//isis-in-pictures/170-me.png" alt="170 me" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>Assuming they have been granted permissions, this allows a user to access an entity representing their own user account:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/180-app-user-entity.png"><img src="images//isis-in-pictures/180-app-user-entity.png" alt="180 app user entity" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>If not all of these properties are required, then they can be hidden either using security or though Isis' internal event bus (described below). Conversely, additional properties can be "grafted onto" the user using the contributed properties/collections discussed previously.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_themes">Themes</h3>
+<div class="paragraph">
+<p>Apache Isis' Wicket viewer uses <a href="http://getbootstrap.com">Twitter Bootstrap</a>, which means that it can be themed. If more than one theme has been configured for the app, then the viewer allows the end-user to switch their theme:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/190-switch-theme.png"><img src="images//isis-in-pictures/190-switch-theme.png" alt="190 switch theme" width="600px"></a>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_rest_api">REST API</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>In addition to Isis' Wicket viewer, it also provides a fully fledged REST API, as an implementation of the <a href="http://restfulobjects.org">Restful Objects</a> specification. The screenshot below shows accessing this REST API using a Chrome plugin:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/200-rest-api.png"><img src="images//isis-in-pictures/200-rest-api.png" alt="200 rest api" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>Like the Wicket viewer, the REST API is generated automatically from the domain objects (entities and view models).</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_integration_testing_support">Integration Testing Support</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Earlier on we noted that Apache Isis allows fixtures to be installed through the UI. These same fixture scripts can be reused within integration tests. For example, the code snippet below shows how the <code>FixtureScripts</code> service injected into an integration test can then be used to set up data:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/210-fixture-scripts.png"><img src="images//isis-in-pictures/210-fixture-scripts.png" alt="210 fixture scripts" width="500px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>The tests themselves are run in junit. While these are integration tests (so talking to a real database), they are no more complex than a regular unit test:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/220-testing-happy-case.png"><img src="images//isis-in-pictures/220-testing-happy-case.png" alt="220 testing happy case" width="400px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>To simulate the business rules enforced by Apache Isis, the domain object can be "wrapped" in a proxy. For example, if using the Wicket viewer then Apache Isis will enforce the rule (implemented in the <code>ToDoItem</code> class itself) that a completed item cannot have the "completed" action invoked upon it. The wrapper simulates this by throwing an appropriate exception:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/230-testing-wrapper-factory.png"><img src="images//isis-in-pictures/230-testing-wrapper-factory.png" alt="230 testing wrapper factory" width="550px"></a>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_internal_event_bus">Internal Event Bus</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Contributions, discussed earlier, are an important tool in ensuring that the packages within your Isis application are decoupled; by extracting out actions the order of dependency between packages can effectively be reversed.</p>
+</div>
+<div class="paragraph">
+<p>Another important tool to ensure your codebase remains maintainable is Isis' internal event bus. It is probably best explained by example; the code below says that the "complete" action should emit a <code>ToDoItem.Completed</code> event:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/240-domain-events.png"><img src="images//isis-in-pictures/240-domain-events.png" alt="240 domain events" width="400px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>Domain service (application-scoped, stateless) can then subscribe to this event:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/250-domain-event-subscriber.png"><img src="images//isis-in-pictures/250-domain-event-subscriber.png" alt="250 domain event subscriber" width="450px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>And this test verifies that completing an action causes the subscriber to be called:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images//isis-in-pictures/260-domain-event-test.png"><img src="images//isis-in-pictures/260-domain-event-test.png" alt="260 domain event test" width="850px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>In fact, the domain event is fired not once, but (up to) 5 times. It is called 3 times prior to execution, to check that the action is visible, enabled and that arguments are valid. It is then additionally called prior to execution, and also called after execution. What this means is that a subscriber can in either veto access to an action of some publishing object, and/or it can perform cascading updates if the action is allowed to proceed.</p>
+</div>
+<div class="paragraph">
+<p>Moreover, domain events are fired for all properties and collections, not just actions. Thus, subscribers can therefore switch on or switch off different parts of an application. Indeed, the example todoapp demonstrates this.</p>
+</div>
+</div>
+</div>
+ </div>
+
+ <footer>
+ <hr>
+ <p class="small">
+ Copyright © 2010~2015 The Apache Software Foundation, licensed under the Apache License, v2.0.
+ <br/>
+ Apache, the Apache feather logo, Apache Isis, and the Apache Isis project logo are all trademarks of The Apache Software 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="#_basics">Basics</a>
+<ul class="sectlevel2">
+<li><a href="#_sign_in">Sign-in</a></li>
+<li><a href="#_install_fixtures">Install Fixtures</a></li>
+<li><a href="#_dashboard_and_view_models">Dashboard and View Models</a></li>
+<li><a href="#_domain_entity">Domain Entity</a></li>
+<li><a href="#_edit_properties">Edit properties</a></li>
+<li><a href="#_actions">Actions</a></li>
+<li><a href="#_contributions">Contributions</a></li>
+</ul>
+</li>
+<li><a href="#_extensible_views">Extensible Views</a></li>
+<li><a href="#_security_auditing_and_more">Security, Auditing and more…​</a>
+<ul class="sectlevel2">
+<li><a href="#_multi_tenancy_support">Multi-tenancy support</a></li>
+<li><a href="#_me">Me</a></li>
+<li><a href="#_themes">Themes</a></li>
+</ul>
+</li>
+<li><a href="#_rest_api">REST API</a></li>
+<li><a href="#_integration_testing_support">Integration Testing Support</a></li>
+<li><a href="#_internal_event_bus">Internal Event Bus</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" === "Isis in Pictures") {
+ 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>
\ No newline at end of file