anchor.diff:  The Apache Isis viewer is implemented using http://wicket.apache.org[Apache Wicket], 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:
   
  -image::https://raw.githubusercontent.com/apache/isis/master/antora/toc/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/070-pluggable-views.png[link="https://raw.githubusercontent.com/apache/isis/master/antora/toc/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/070-pluggable-views.png"]
  +image::https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/070-pluggable-views.png[link="https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/070-pluggable-views.png"]
   
   The (non-ASF) link:https://platform.incode.org/modules/wkt/gmap3/wkt-gmap3.html[gmap3 component] will render any domain entity (such as `ToDoItem`) that implements its `Locatable` interface:
   
  -image::https://raw.githubusercontent.com/apache/isis/master/antora/toc/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/080-gmap3-view.png[link="https://raw.githubusercontent.com/apache/isis/master/antora/toc/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/080-gmap3-view.png"]
  +image::https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/080-gmap3-view.png[link="https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/080-gmap3-view.png"]
   
   Similarly the (non-ASF) link:https://platform.incode.org/modules/wkt/fullcalendar2/wkt-fullcalendar2.html[fullcalendar2 component] will render any domain entity (such as `ToDoItem`) that implements its `Calendarable` interface:
   
  -image::https://raw.githubusercontent.com/apache/isis/master/antora/toc/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/090-fullcalendar2-view.png[link="https://raw.githubusercontent.com/apache/isis/master/antora/toc/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/090-fullcalendar2-view.png"]
  +image::https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/090-fullcalendar2-view.png[link="https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/090-fullcalendar2-view.png"]
   
   
   Yet another "view" (though this one is rather simpler) is that provided by the (non-ASF) link:https://platform.incode.org/modules/wkt/excel/wkt-excel.html[excel component].
   This provides a download button to the table as a spreadsheet:
   
  -image::https://raw.githubusercontent.com/apache/isis/master/antora/toc/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/100-excel-view-and-docx.png[link="https://raw.githubusercontent.com/apache/isis/master/antora/toc/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/100-excel-view-and-docx.png"]
  +image::https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/100-excel-view-and-docx.png[link="https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/100-excel-view-and-docx.png"]
   
   The screenshot above also shows an "export to Word" action.
   This is _not_ a view but instead is a (contributed) action that uses the (non-ASF) link:https://platform.incode.org/modules/lib/docx/lib-docx.html[docx library] module to perform a "mail-merge":
   
  -image::https://raw.githubusercontent.com/apache/isis/master/antora/toc/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/110-docx.png[link="https://raw.githubusercontent.com/apache/isis/master/antora/toc/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/110-docx.png"]
  +image::https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/110-docx.png[link="https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/110-docx.png"]
   
   
   
  
positive.code: 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:
  
  image::https://raw.githubusercontent.com/apache/isis/master/antora/toc/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/060-invoke-action.png[link="https://raw.githubusercontent.com/apache/isis/master/antora/toc/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/060-invoke-action.png"]
  
  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.
  
negative.code: These same fixture scripts can be reused within integration tests.
  For example, the code snippet below shows how the `FixtureScripts` service injected into an integration test can then be used to set up data:
  
  image::https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/210-fixture-scripts.png[link="https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/210-fixture-scripts.png"]
  
  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:
  
  image::https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/220-testing-happy-case.png[link="https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/220-testing-happy-case.png"]
  
  
  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 `ToDoItem` class itself) that a completed item cannot have the "completed" action invoked upon it.
  The wrapper simulates this by throwing an appropriate exception:
  
  image::https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/230-testing-wrapper-factory.png[link="https://raw.githubusercontent.com/apache/isis/master/antora/components/docs/modules/ROOT/images/what-is-apache-isis/isis-in-pictures/230-testing-wrapper-factory.png"]
  
  
  
  