Author: danhaywood
Date: Fri Dec 21 10:40:03 2012
New Revision: 1424855
URL: http://svn.apache.org/viewvc?rev=1424855&view=rev
Log:
isis site - articles; recreating an archetype
Added:
isis/site/trunk/content/learning-more/articles/
isis/site/trunk/content/learning-more/articles/about.md
isis/site/trunk/content/learning-more/articles/understanding-isis-infoq-2010.md
Modified:
isis/site/trunk/content/contributors/recreating-an-archetype.md
isis/site/trunk/content/learning-more/articles.md
Modified: isis/site/trunk/content/contributors/recreating-an-archetype.md
URL:
http://svn.apache.org/viewvc/isis/site/trunk/content/contributors/recreating-an-archetype.md?rev=1424855&r1=1424854&r2=1424855&view=diff
==============================================================================
--- isis/site/trunk/content/contributors/recreating-an-archetype.md (original)
+++ isis/site/trunk/content/contributors/recreating-an-archetype.md Fri Dec 21
10:40:03 2012
@@ -21,7 +21,12 @@ Finally, double check that the app is ru
Before we generate the archetype, we clear out all non source code artifacts.
-To view the files/directories that needs removing, use:
+Start by doing the regular `mvn clean`:
+<pre>
+mvn clean
+</pre>
+
+To view the remaining files/directories that needs removing, use:
<pre>
for a in .project .classpath .settings bin target-ide; do find . -name $a
-print; done
find . -name "*.log" -print
@@ -36,10 +41,11 @@ find . -name "*.log" -exec rm {} \;
Now we can create the archetype:
<pre>
-mvn clean archetype:create-from-project
-groovy ../../../scripts/updateGeneratedArchetypeSources.groovy
+mvn archetype:create-from-project
+groovy ../../../scripts/updateGeneratedArchetypeSources.groovy -v 1.2.3
</pre>
+where `1.2.3` is the version of isis core that is to be the parent of the
generated archetype.
### Test the archetype
@@ -112,7 +118,7 @@ If this a new archetype, then add a refe
Finally, commit the changes:
<pre>
-git commit -m "ISIS-nnn: updating archetype"
+git commit -am "ISIS-nnn: updating archetype"
</pre>
### Setting up Eclipse IDE
Modified: isis/site/trunk/content/learning-more/articles.md
URL:
http://svn.apache.org/viewvc/isis/site/trunk/content/learning-more/articles.md?rev=1424855&r1=1424854&r2=1424855&view=diff
==============================================================================
--- isis/site/trunk/content/learning-more/articles.md (original)
+++ isis/site/trunk/content/learning-more/articles.md Fri Dec 21 10:40:03 2012
@@ -1,9 +1,5 @@
Title: Articles
-{stub
-This page is a stub.
-}
+Some articles relating to either Apache Isis or its predecessor, the Naked
Objects framework:
-Isis graduated from the Apache incubator in October 2012; we are currently
setting ourselves up as a top-level project.
-
-In the meantime you can access our original incubator website
[here](http://incubator.apache.org/isis "Apache Isis (incubator website)").
+* [Understanding Apache Isis (InfoQ
2010)](articles/understanding-isis-infoq-2010.html)
\ No newline at end of file
Added: isis/site/trunk/content/learning-more/articles/about.md
URL:
http://svn.apache.org/viewvc/isis/site/trunk/content/learning-more/articles/about.md?rev=1424855&view=auto
==============================================================================
--- isis/site/trunk/content/learning-more/articles/about.md (added)
+++ isis/site/trunk/content/learning-more/articles/about.md Fri Dec 21 10:40:03
2012
@@ -0,0 +1,3 @@
+Title: Articles
+
+* [Understanding Apache Isis (InfoQ 2010)](understanding-isis-infoq-2010.html)
Added:
isis/site/trunk/content/learning-more/articles/understanding-isis-infoq-2010.md
URL:
http://svn.apache.org/viewvc/isis/site/trunk/content/learning-more/articles/understanding-isis-infoq-2010.md?rev=1424855&view=auto
==============================================================================
---
isis/site/trunk/content/learning-more/articles/understanding-isis-infoq-2010.md
(added)
+++
isis/site/trunk/content/learning-more/articles/understanding-isis-infoq-2010.md
Fri Dec 21 10:40:03 2012
@@ -0,0 +1,116 @@
+Title: Understanding Apache Isis (InfoQ Interview 2010)
+
+*The headline feature that distinguishes Apache Isis from other frameworks is
its support for the naked objects pattern - the ability to generate a user
interface (at runtime) directly from the domain model. However, there's much
more to Apache Isis than this.*
+
+*This chapter introduces the Apache Isis and the naked objects pattern by way
of a series of questions and answers. It is adapted from an interview
originally published on InfoQ in 2010*
+
+###Apache Isis implements the naked objects pattern... but what is that,
exactly?
+
+Naked objects is an architectural pattern where the idea is to automatically
expose a domain model objects directly within a object-oriented user
interface... not just their state (properties and collections) but also their
behaviour (what we call actions). You can think of it as analogous to an ORM
such as Hibernate; but whereas an ORM reflects the domain model into the
persistence layer, naked objects reflects the domain model into the
presentation layer.
+
+Naked Objects (capitals) was a Java framework that implemented the naked
objects (lower case) pattern. Since then, we've taken the original framework,
along with a number of sister projects developed by the community, into the
Apache Incubator. So, what was originally "Naked Objects" is now Apache Isis.
+
+###What type of applications are best suited to Isis?
+
+The naked objects pattern requires that your primary consideration is in
building an object-oriented domain model, so it's most suitable for enterprise
applications that have complex business rules where there's a desire to
represented them within such a domain model. The idea - at least during the
initial stages - is to build up a domain model quickly, and to get feedback
from the domain experts by exploiting the framework's ability to expose that
directly domain model within the user interface. A picture tells a thousand
words.
+
+Apache Isis "sweet spot" are those applications that are used internally
within the organization, by experienced users who are comfortable with the
entities within the domain model, and just need an application that imposes as
few constraints as possible on how it is used. These are sometimes called
sovereign applications. If you're a developer then your IDE is probably the
sovereign application you use the most, and how often did you use any of its
wizards? And if you use telephone banking then you'll also know how frustrating
a sovereign application can be that is too invasive in dictating the
workflow... that poor person on the other end asks making apologies while she
goes exits from one screen and then goes into another to check some detail on a
bank account. The generic OO UIs generated by naked objects impose no such
restrictions, and so are ideal for this sort of application.
+
+###And are there applications where the OO UIs generated by Isis are less
suitable?
+
+The opposite of a sovereign application (above) is sometimes called a
transient application. These are ones used only occasionally or by
inexperienced users, typically outside the organization (ie your customers),
who don't know or care to know the domain model, and just want to be led
through the system to accomplish some well-defined goal. A good example here is
a check-in kiosk at an airport... you just want to get on the plane, and be
given the opportunity to choose your seat. But you likely won't care which
plane, or even plane type, nor who the pilot is; these are unimportant details.
+
+For this sort of application a generic OO UI that exposes lots of the domain
is clearly not appropriate. Instead, we want an application that exposes view
models rather than entities, and where the UI can be customized. The view model
object is responsible for managing the workflow for the user story, exposing
just the subset of the domain that is relevant, and hiding the rest of the
domain. We find that these view models can be layered on top of the entities
once those entities are understood.
+
+Using view model objects is necessary but probably not sufficient for
transient applications; we also usually need to customize the UI. Apache Isis
has two viewers that allow the UI to be customized, one that provides a set of
taglibs, and one that provides a set of Apache Wicket components.
+
+Putting both of these techniques together (custom view models and views) means
that Apache Isis is suitable for transient applications as well as sovereign
applications. However, the former will necessarily take more work as opposed to
the latter.
+
+###What is the typical development process life cycle for applications built
with Isis, and how does it compare to traditional application development
process?
+
+The main difference you're likely to encounter is the emphasis on developing
the domain model at the same time as identifying and prioritizing user stories,
what those practicing domain driven design call a "ubiquitous language" for the
team.
+
+So, rather than let the developers in the team "discover" the domain model as
part of story implementation, we'd expect that the domain experts/business
analysts have already identified some of the main domain concepts through
prototyping or spikes, and these can be used to help communicate the stories to
the developers during the planning game. Not every business analyst is going to
feel comfortable working with an IDE, but it works well to pair with a
developer. Because an Apache Isis application can be runs just from domain
classes, it's possible to develop the app very very quickly. We've found a good
technique is to run workshops with the business analyst facilitating the
meeting with the domain experts, and the developer acting as "code monkey" to
rapidly convert the ideas into an app. Obviously the code isn't production
quality, but it allows the team as a whole to go very quickly and experiment
with different representations of the model.
+
+Another alternative is to go a little more slowly, and have the analyst and
developer pairing to write production code. The analyst still focuses on
identifying and naming the domain concepts and their relationships, while the
developer's role (as well as learning about the domain) is to ensure that
there's enough rigour and tests around the code that's been written while this
is being done. Of course, both approaches to pairing can be used, sometimes
spiking ideas, sometimes going straight to writing tested code.
+
+Of course, while the naked objects pattern means that no UI code needs to be
written in order to elicit feedback, there do still need to be objects in the
app for the domain expert to view. Apache Isis has a pluggable
runtime/persistence layer, and for prototyping and most of development we
recommend using the in-memory object store. To populate this object store for
each run we use fixtures, which we usually arrange into a composite pattern to
setup data needed for the particular scenario we might be working on. Using
Isis in this way means that we spend our time alternating between defining
domain classes and writing fixture data. This can be a great benefit because it
helps the domain experts - who after all aren't necessarily technical -
distinguish between what are classes and what are instances of classes. For
example, if I'm writing a library system and we identify there are loanable
books and reference books, we need to know whether "loanable book" and
"reference boo
k" are different subclasses of a book superclass, or merely different
instances of a book class with, say, a loanable property set to true or false.
Seeing a running application makes it much easier for the domain expert to make
the call.
+
+In terms of writing tests, there are several options. First, because the
domain objects you write are basically pojos that follow some naming
conventions, they are very easy to test using standard TDD tools such as JUnit
and JMock. And if you wanted to, you could test the UI generated by Isis using
Selenium and similar; indeed we'd recommend that if you've customized the UI.
+
+In addition, though, Isis provides a couple of additional BDD/testing
framework integrations. One of these is an integration with FitNesse, and a
newer one we've worked on is an integration with Concordion. In both cases the
integrations provide the glue code so you can exercise your domain objects
directly. For example, your spec might say "the place order action cannot be
invoked if the product is out of stock". All the developer needs to do is to
wire the spec to these pre-canned integrations, specifying that the
placeOrder() action should be called on a Product.
+
+Isis also provides a JUnit runner that works by bootstrapping the Isis runtime
for each test, and proxying the domain objects with a bit of cglib so that they
are interacted with "as if" through the UI. For example, let's go back to that
placeOrder() action. To prevent this from being called for a Product that's out
of stock, the developer would write a corresponding validatePlaceOrder()
method. Isis automatically calls this validate method prior to the placeOrder()
method, and uses the return value ("that product is out of stock") as the
reason why the action can't be invoked. In the UI, this business rule is
represented by greying out the OK button of the action. In the JUnit runner,
this rule is represented by having the cglib proxy throw a validation exception
if the test calls placeOrder() with an out of stock Product.
+
+In terms of deployment, there's several steps involved, probably the most
significant being to select the runtime and object store. As noted above, Isis
has a pluggable persistence layer; you can use the in-memory object store for
developing, but will want to switch to a "real" object store for deployment.
The amount of work required here depends on the object store selected; in the
case of JPA/Hibernate support, for example, it amounts to annotating your
domain entities with annotations, and writing implementations of some of the
repositories to make the relevant SQL calls.
+
+###What are the limitations of Apache Isis framework?
+
+It's certainly true that naked objects pattern implemented by Apache Isis is
opinionated, so if you don't agree with all of its opinions then you're going
to find it limiting in one way or another.
+
+The first of these is that everything that the user wants to interact with has
to be an object of some sort. As already explained, for sovereign applications,
these are likely to be the persisted domain entities, but for a transient
application, the object may be a view model to be support a particular
workflow, and which may or may not be persisted. Such an approach probably
wouldn't be considered much of a limitation, but it's worth contrasting with
architectures (eg Spring Web Flow or Struts) where put the responsibility for
tracking workflow lives not in an object but instead within some sort of
declarative XML markup (or even just in the interplay between controllers and
views).
+
+A slightly more subtle consequence of the above is that integration of
different technologies happens through the domain objects, rather than in front
of them through application-layer or UI layer mashups. For example, supposing
that we wanted to have an SMS sent out to confirm a checkout. If you were
writing the UI and application service layer yourself, you might choose to have
the application layer make the call to the SMS service, judging it to be a
coordination responsibility. With Isis, though, you don't get the chance to
write any application layer code, and so this would be done by having the
domain object call out to the SMS service. The SMS service would be defined by
an interface, and the implementation would be injected into the domain object
by the framework. For some reason not everyone is necessarily comfortable about
injecting domain services into entities; but it works well for us and we're
sticking with it.
+
+Another area where Isis is going to feel different - and perhaps limiting to
some - is that it pushes some responsibilities onto the domain objects that
otherwise might sit in other layers. For example, above we discussed that a
placeOrder() action on a Customer can have a supporting validatePlaceOrder()
method. It's also possible to have disablePlaceOrder() method, which if
returning non-null will cause the action to be greyed out the action in the UI.
For example, a blacklisted Customer might not allow any orders to be placed,
and would indicate this through the disable method. Some might consider this as
a misplaced presentation concern. However, the Customer isn't greying out the
UI itself; the disable method is merely a convention by which the presentation
layer can interrogate the entity.
+
+Something else we hear sometimes about naked objects-style systems is that
they are really only suitable for CRUD style applications. It has to be said
that it's a criticism that does irk; because although its true that naked
objects frameworks automatically expose object state, they also expose object's
behaviour. That is, every public method that is not a property or a collection
is taken to be an action and will rendered by the UI as a button or a link.
Indeed, we sometimes like to talk of behaviourally complete domain objects;
it's the very antithesis of the anaemic domain model anti-pattern.
+
+All the above notwithstanding, probably the biggest impediment to going out
and using Isis right now is that it's a small community and as such the
codebase is still relatively new. But if that is a turn-off, note that you can
still use Apache Isis to prototype your domain model, because they are just
pojos after all. Indeed, embedding Isis' metamodel for a deployment hosted on
some other framework is the objective of the embedded runtime component of Isis
+
+How extensive is the application security support provided by Isis?
+
+Apache Isis exposes a pluggable authentication API and an authorization API,
with default implementations of both.
+
+The job of the authentication API is to authenticate the user credentials and
return the user Id and a set of roles for that user. This information is then
used in one of two ways. The authorization API uses it to implement declarative
class-based security, that is, associating access to features based on the
roles of the user. In addition, though, a domain object instance can also
access the user credentials, and so can implement imperative instance-based
checks if required.
+
+For example, we might say that only a user with HR role can award pay rises to
an Employee. This is a class-based check and would be implemented through the
authorization API. But, we might also say that a user is allowed to view
(though not modify) their own salary of their Employee object, but no-one
else's. This would be an instance-based check, and would be implemented in the
object itself.
+
+In terms of how naked objects restricts access, this is done either by making
an object member (property, collection or action) invisible, or, if it is
visible, then making it unusable (greyed out).
+
+How does an Isis applications manage the custom logic in terms of business
rules, workflow and other business logic that developers have to manually
implement outside the generated code?
+
+"Business rules" is one of those amorphous terms that means different things
to different people. A consequence is that the team can struggle to nail down
exactly where such rules should reside, so that these rules can start to leach
out of the domain layer and the application layer, or even worse, the
presentation layer. As noted already, one of the principles of naked objects is
that domain objects are behaviourally complete. What that means is that
business rules and "other business logic" are the responsibility of domain
objects. For workflow, again as noted earlier, we suggest that you introduce a
view model object and have that manage the user's interaction.
+
+However, saying that business rules are an object's responsibility doesn't
necessarily mean that the implementation has to be in Java. We already said
that domain objects can delegate work out to domain services that are injected
into them. So if you want to put your business rules into a rules engine,
that's fine. Wrap the interface to the rules engine within a domain service,
and have the domain object call out to the domain service in order to fulfil
its responsibility.
+
+In practical terms, you're going to see business rules both in the small-scale
and the large. Small-scale business rules tend to be implemented in terms of
the supporting methods (disable, validate and so on) that encode the
preconditions for interactions. These ensure that the object or the providing
arguments is are valid and will veto the interaction otherwise (blacklisted
customers, out-of-stock products). The larger-scale business rules are
represented as actions on an object that can perform arbitrary business logic,
such as modifying its own state, or related objects, and/or delegating out to
domain services.
+
+###How does Isis support SOA-based applications, eg where an enterprise
service component is consumed by several different applications and other
clients?
+
+We can actually answer this both in terms of an Isis application consuming
SOA[1] services, and in it providing services.
+
+For consuming SOA services, the answer is easy enough: wrap the SOA service in
a domain service interface, and then register the implementation with the
framework so that the service is injected into each domain object. That
interaction can be either synchronous or asynchronous; there's nothing to
prevent the domain object publishing an event to be picked up by some other
component out there on your enterprise service bus.
+
+As to providing SOA services, Isis' JSON viewer exposes the domain objects as
a set of RESTful resources. We map objects and object members to the standard
HTTP verbs, eg so that a GET on an object returns an object representation, a
PUT on an object's property will modify the state, or a POST on an object's
actions will invoke the action. As its name suggests, the JSON viewer produces
a JSON representation, making it easy to consume (eg in HTML5 or RIA
applications).
+
+###Most enterprise applications need to reuse the domain and service layer
classes between several different applications. How does Apache Isis address
this?
+
+One way to think of reuse in terms of strategic domain-driven design, which
couches the discussion in terms of identifying bounded contexts and
understanding the relationship between these contexts - context maps.
+
+You can think of a bounded context as both the user population that
understands a particular ubiquitous language as well as the actual system that
they use. For example, the term "Customer" is going to mean one thing to the
marketing department, but a potentially different thing to those in shipping.
Those two user populations therefore have incompatible languages, and so any
integration of systems that support both sets of users will need to explicitly
map their meanings of those terms.
+
+Simplifying somewhat, an Isis (naked objects) application can be thought of in
three parts: the domain model objects themselves, the viewer that provides a
channel to interact with the domain model, and the domain services that are
used by the domain model objects. The domain model objects encode a ubiquitous
language for a particular bounded context, so it only makes sense to reuse them
by users who have the same understanding of that language. We can if we want
use view model objects to provide projections of the domain entities to
different subsets of that user population, but all must agree with what a
Customer is, even if they use different parts of said Customer.
+
+Viewers are channels by which the domain model is accessed. Apache Isis has
viewers that expose the domain model as either a desktop app or as a webapp,
and also has a RESTful viewer (producing JSON) which allow the view model
objects/domain objects to be surfaced as RESTful resources. In DDD terms the
RESTful viewers are examples of an "open host service" context mapping from
some client bounded context up to our model's context.
+
+With respect to domain services, these are not reusable per se, rather they
allow the domain objects to be the client of some other service within the
enterprise. That said, one common type of domain service is to provide an
interface to an enterprise service bus, in which case the domain objects can
publish events onto that bus. In DDD terms this would be an example of a
"published language" context mapping; the downstream systems consuming the
events of the publishing domain objects.
+
+Naked objects also allows a somewhat finer-grained level of reuse; indeed its
support for "don't repeat yourself" is one of the reasons that some people are
attracted to the pattern. For example, if we declare a property or an action
parameter to be a date, then the viewers will automatically provide a date
chooser widget for that property or parameter unless indicated otherwise. Or,
if a property's type is an enum, then we'll get a drop-down box. It's the
conventions of the naked objects programming model - establishing a protocol of
interaction between the presentation layer and the domain model - that enable
this sort of reuse.
+
+Some of Isis' more recent viewers also allow mashups within the UI. For
example, the viewer that we've implemented using Apache Wicket uses the chain
of responsibility pattern to build the UI. If we have an entity can provide its
Location (eg, it implements Locatable), then a GoogleMapsWidget will render the
entity in a map. Or, if an entity has a date, then a CalendarWidget might
render the entity on a calendar. This stuff is extensible so you're free to
write your own components and reuse (or indeed invent your own) domain
semantics as you see fit.
+
+###What is the future road map of the project?
+
+*This answer is now out of date; Isis entered the incubator in Sept 2010, and
graduated as a top-level project in Oct 2012.*
+
+Our proposal to join the incubator is online, and that captured the thoughts
we had at that point in time [1]. A general theme is in the ongoing development
of the various viewers, such as the Wicket viewer, improving JSON support
within the RESTful viewers, and ongoing development of the taglib-based viewer,
Scimpi. Contributors who have expressed interest in developing similar viewers
using JSF/Facelets, Tapestry, on Android and in JavaFX/Visage.
+
+Isis has a pluggable architecture with about five major APIs (and numerous
more fine-grained APIs) that can be developed. Probably the most significant of
these is the runtime/persistence API. One piece of work is to develop an
ORM-based object store from Hibernate (which is not compatible with Apache's)
to a compatible JPA implementation, We've also had a suggestion [2] to
re-implement using JDO 3.0/DataNucleus, which would allow us to cover a lot of
persistence technologies in one fell swoop
+
+Another objective during incubation is to make Isis more easily bootstrappable
and embeddable, and for that JSR-299 (Contexts and Dependency Injection) looks
promising. For example, it should be easy to take just the Isis metamodel
component and use it within your own applications, eg to drive the rendering of
domain objects within custom UI code.
+
+One other area we might see work is in support for other JVM languages. Isis
already supports Groovy as well as Java, and the way that Isis builds up its
metamodel means that supporting other languages (Scala, Fantom, Go) ought to be
pretty straightforward.
+
+Ultimately, though, Apache Isis' roadmap depends on where its community wants
to take it; so any of the above might change as we progress through to
graduation.
+