You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by bu...@apache.org on 2012/08/10 18:23:58 UTC

svn commit: r828573 [2/8] - in /websites/staging/deltaspike/trunk/content: ./ deltaspike/ deltaspike/resources/ deltaspike/resources/css/ deltaspike/resources/images/ deltaspike/resources/js/

Added: websites/staging/deltaspike/trunk/content/deltaspike/drafts.html
==============================================================================
--- websites/staging/deltaspike/trunk/content/deltaspike/drafts.html (added)
+++ websites/staging/deltaspike/trunk/content/deltaspike/drafts.html Fri Aug 10 16:23:56 2012
@@ -0,0 +1,1419 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta name="description" content="deltaspike-generate-pages">
+    <meta name="author" content="chm">
+
+    <title>Apache DeltaSpike - Draft</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 &quot;License&quot;); 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 &quot;AS IS&quot; 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. -->
+
+    <!-- Le styles -->
+    <link href="resources/css/bootstrap.css" rel="stylesheet">
+    <style type="text/css">
+      body {
+        padding-top: 60px;
+        padding-bottom: 40px;
+      }
+    </style>
+    <link href="http://twitter.github.com/bootstrap/assets/css/bootstrap-responsive.css" rel="stylesheet">
+</head>
+
+<body>
+
+<div class="navbar navbar-fixed-top">
+    <div class="navbar-inner">
+        <div class="container">
+            <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </a>
+            <a class="brand" href="home.html"><img src="resources/images/deltaspike-logo-medium.png"/></a>
+            <div class="nav-collapse">
+                <ul class="nav">
+                    <li class="active"><a href="home.html">Home</a></li>
+                    <li><a href="documentation.html">Documentation</a></li>
+                    <li><a href="dwonload.html">Download</a></li>
+                    <li><a href="community.html">Community</a></li>
+                    <li><a href="support.html">Support</a></li>
+                </ul>
+            </div><!--/.nav-collapse -->
+        </div>
+    </div>
+</div>
+
+    <div class="container">
+      <div class="row">
+          <div class="span12">
+              <h2>Draft</h2>
+              <p><h1 id="exception-control-draft">Exception Control Draft</h1>
+<h1 id="agreed-api">Agreed API</h1>
+<div class="codehilite"><pre><span class="nv">@Retention</span><span class="p">(</span><span class="n">RetentionPolicy</span><span class="o">.</span><span class="n">RUNTIME</span><span class="p">)</span>
+<span class="nv">@Target</span><span class="p">(</span><span class="n">ElementType</span><span class="o">.</span><span class="n">PARAMETER</span><span class="p">)</span>
+<span class="nv">@Documented</span>
+<span class="n">public</span> <span class="nv">@interface</span> <span class="n">BeforeHandles</span>
+<span class="p">{</span>
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Precedence</span> <span class="n">relative</span> <span class="n">to</span> <span class="n">callbacks</span> <span class="k">for</span> <span class="n">the</span> <span class="n">same</span> <span class="n">type</span>
+     <span class="o">*/</span>
+    <span class="nb">int</span> <span class="n">ordinal</span><span class="p">()</span> <span class="n">default</span> <span class="mi">0</span><span class="p">;</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>b</p>
+<div class="codehilite"><pre><span class="nv">@Retention</span><span class="p">(</span><span class="n">RetentionPolicy</span><span class="o">.</span><span class="n">RUNTIME</span><span class="p">)</span>
+<span class="nv">@Target</span><span class="p">(</span><span class="n">ElementType</span><span class="o">.</span><span class="n">PARAMETER</span><span class="p">)</span>
+<span class="nv">@Documented</span>
+<span class="n">public</span> <span class="nv">@interface</span> <span class="n">Handles</span>
+<span class="p">{</span>
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Precedence</span> <span class="n">relative</span> <span class="n">to</span> <span class="n">handlers</span> <span class="k">for</span> <span class="n">the</span> <span class="n">same</span> <span class="n">type</span>
+     <span class="o">*/</span>
+    <span class="nb">int</span> <span class="n">ordinal</span><span class="p">()</span> <span class="n">default</span> <span class="mi">0</span><span class="p">;</span> <span class="sr">//</span><span class="n">TODO</span> <span class="n">discuss</span> <span class="n">Precedence</span>
+<span class="p">}</span>
+
+<span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Marker</span> <span class="k">for</span> <span class="n">types</span> <span class="n">containing</span> <span class="n">Exception</span> <span class="n">Handler</span> <span class="n">methods</span><span class="o">.</span>
+ <span class="o">*/</span>
+<span class="nv">@Retention</span><span class="p">(</span><span class="n">RetentionPolicy</span><span class="o">.</span><span class="n">RUNTIME</span><span class="p">)</span>
+<span class="nv">@Target</span><span class="p">(</span><span class="n">ElementType</span><span class="o">.</span><span class="n">TYPE</span><span class="p">)</span>
+<span class="nv">@Documented</span>
+<span class="n">public</span> <span class="nv">@interface</span> <span class="n">ExceptionHandler</span>
+<span class="p">{</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>b</p>
+<div class="codehilite"><pre><span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Payload</span> <span class="k">for</span> <span class="n">an</span> <span class="n">exception</span> <span class="n">to</span> <span class="n">be</span> <span class="n">handled</span><span class="o">.</span>  <span class="n">Implementations</span> <span class="n">of</span> <span class="n">this</span> <span class="n">interface</span> <span class="n">should</span> <span class="ow">not</span> <span class="n">expose</span> <span class="n">internals</span> <span class="ow">and</span> <span class="n">remain</span>
+ <span class="o">*</span> <span class="n">immutable</span> <span class="k">for</span> <span class="n">this</span> <span class="n">contract</span><span class="o">.</span>
+ <span class="o">*</span>
+ <span class="o">*</span> <span class="nv">@param</span> <span class="sr">&lt;T&gt;</span> <span class="n">Exception</span> <span class="n">type</span> <span class="n">this</span> <span class="n">event</span> <span class="n">represents</span>
+ <span class="o">*/</span>
+<span class="n">public</span> <span class="n">interface</span> <span class="n">ExceptionEvent</span><span class="o">&lt;</span><span class="n">T</span> <span class="n">extends</span> <span class="n">Throwable</span><span class="o">&gt;</span>
+<span class="p">{</span>
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">The</span> <span class="n">exception</span> <span class="n">causing</span> <span class="n">this</span> <span class="n">event</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">T</span> <span class="n">getException</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Instructs</span> <span class="n">the</span> <span class="n">dispatcher</span> <span class="n">to</span> <span class="n">abort</span> <span class="n">further</span> <span class="n">processing</span> <span class="n">of</span> <span class="n">handlers</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">void</span> <span class="n">abort</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Instructs</span> <span class="n">the</span> <span class="n">dispatcher</span> <span class="n">to</span> <span class="n">throw</span> <span class="n">the</span> <span class="n">original</span> <span class="n">exception</span> <span class="n">after</span> <span class="n">handler</span> <span class="n">processing</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">void</span> <span class="n">throwOriginal</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Instructs</span> <span class="n">the</span> <span class="n">dispatcher</span> <span class="n">to</span> <span class="n">terminate</span> <span class="n">additional</span> <span class="n">handler</span> <span class="n">processing</span> <span class="ow">and</span> <span class="n">mark</span> <span class="n">the</span> <span class="n">event</span> <span class="n">as</span> <span class="n">handled</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">void</span> <span class="n">handled</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Default</span> <span class="n">instruction</span> <span class="n">to</span> <span class="n">dispatcher</span><span class="p">,</span> <span class="n">continues</span> <span class="n">handler</span> <span class="n">processing</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">void</span> <span class="n">handledAndContinue</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Similar</span> <span class="n">to</span> <span class="p">{</span><span class="nv">@link</span> <span class="n">ExceptionEvent</span><span class="c1">#handledAndContinue()},</span>
+     <span class="o">*</span> <span class="n">but</span> <span class="n">instructs</span> <span class="n">the</span> <span class="n">dispatcher</span> <span class="n">to</span> <span class="n">markHandled</span> <span class="n">to</span> <span class="n">the</span> <span class="k">next</span> <span class="n">element</span>
+     <span class="o">*</span> <span class="n">in</span> <span class="n">the</span> <span class="n">cause</span> <span class="n">chain</span> <span class="n">without</span> <span class="n">processing</span> <span class="n">additional</span> <span class="n">handlers</span> <span class="k">for</span> <span class="n">this</span> <span class="n">cause</span> <span class="n">chain</span> <span class="n">element</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">void</span> <span class="n">skipCause</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Instructs</span> <span class="n">the</span> <span class="n">dispatcher</span> <span class="n">to</span> <span class="n">allow</span> <span class="n">this</span> <span class="n">handler</span> <span class="n">to</span> <span class="n">be</span> <span class="n">invoked</span> <span class="n">again</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">void</span> <span class="n">unmute</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Rethrow</span> <span class="n">the</span> <span class="n">exception</span><span class="p">,</span> <span class="n">but</span> <span class="k">use</span> <span class="n">the</span> <span class="n">given</span> <span class="n">exception</span> <span class="n">instead</span> <span class="n">of</span> <span class="n">the</span> <span class="n">original</span><span class="o">.</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">t</span> <span class="n">Exception</span> <span class="n">to</span> <span class="n">be</span> <span class="n">thrown</span> <span class="n">in</span> <span class="n">place</span> <span class="n">of</span> <span class="n">the</span> <span class="n">original</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">void</span> <span class="n">rethrow</span><span class="p">(</span><span class="n">Throwable</span> <span class="n">t</span><span class="p">);</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Check</span> <span class="n">to</span> <span class="n">see</span> <span class="k">if</span> <span class="n">this</span> <span class="n">exception</span> <span class="n">has</span> <span class="n">been</span> <span class="n">handled</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">boolean</span> <span class="n">isMarkedHandled</span><span class="p">();</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>b</p>
+<div class="codehilite"><pre><span class="sr">//</span><span class="n">TODO</span> <span class="n">discuss</span> <span class="n">the</span> <span class="n">introduction</span> <span class="n">of</span> <span class="n">an</span> <span class="n">interface</span>
+<span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Information</span> <span class="n">about</span> <span class="n">the</span> <span class="n">current</span> <span class="n">exception</span> <span class="ow">and</span> <span class="n">exception</span> <span class="n">cause</span> <span class="n">container</span><span class="o">.</span>  <span class="n">This</span> <span class="n">object</span> <span class="n">is</span> <span class="ow">not</span> <span class="n">immutable</span><span class="o">.</span>
+ <span class="o">*/</span>
+<span class="nv">@Typed</span><span class="p">()</span>
+<span class="n">public</span> <span class="n">class</span> <span class="n">ExceptionStackEvent</span> <span class="n">implements</span> <span class="n">Serializable</span>
+<span class="p">{</span>
+    <span class="n">private</span> <span class="n">static</span> <span class="n">final</span> <span class="n">long</span> <span class="n">serialVersionUID</span> <span class="o">=</span> <span class="o">-</span><span class="mi">6069790756478700680</span><span class="n">L</span><span class="p">;</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Builds</span> <span class="n">the</span> <span class="n">stack</span> <span class="n">from</span> <span class="n">the</span> <span class="n">given</span> <span class="n">exception</span><span class="o">.</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">exception</span> <span class="n">Caught</span> <span class="n">exception</span>
+     <span class="o">*/</span>
+    <span class="n">public</span> <span class="n">ExceptionStackEvent</span><span class="p">(</span><span class="n">final</span> <span class="n">Throwable</span> <span class="n">exception</span><span class="p">)</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="n">public</span> <span class="n">Collection</span><span class="sr">&lt;Throwable&gt;</span> <span class="n">getCauseElements</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Test</span> <span class="k">if</span> <span class="n">iteration</span> <span class="n">is</span> <span class="n">finished</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">finished</span> <span class="n">with</span> <span class="n">iteration</span>
+     <span class="o">*/</span>
+    <span class="n">public</span> <span class="n">boolean</span> <span class="n">isLast</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="n">public</span> <span class="n">Throwable</span> <span class="n">getNext</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="n">public</span> <span class="n">Collection</span><span class="sr">&lt;Throwable&gt;</span> <span class="n">getRemaining</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Tests</span> <span class="k">if</span> <span class="n">the</span> <span class="n">current</span> <span class="n">exception</span> <span class="n">is</span> <span class="n">the</span> <span class="n">root</span> <span class="n">exception</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">Returns</span> <span class="n">true</span> <span class="k">if</span> <span class="n">iteration</span> <span class="n">is</span> <span class="n">at</span> <span class="n">the</span> <span class="n">root</span> <span class="n">exception</span> <span class="p">(</span><span class="n">top</span> <span class="n">of</span> <span class="n">the</span> <span class="n">inverted</span> <span class="n">stack</span><span class="p">)</span>
+     <span class="o">*/</span>
+    <span class="n">public</span> <span class="n">boolean</span> <span class="n">isRoot</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Current</span> <span class="n">exception</span> <span class="n">in</span> <span class="n">the</span> <span class="n">iteration</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">current</span> <span class="n">exception</span>
+     <span class="o">*/</span>
+    <span class="n">public</span> <span class="n">Throwable</span> <span class="n">getCurrent</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Internal</span> <span class="n">only</span><span class="o">.</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">elements</span> <span class="k">new</span> <span class="n">stack</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">public</span> <span class="n">void</span> <span class="n">setCauseElements</span><span class="p">(</span><span class="n">Collection</span><span class="sr">&lt;Throwable&gt;</span> <span class="n">elements</span><span class="p">)</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>b</p>
+<div class="codehilite"><pre><span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Entry</span> <span class="n">point</span> <span class="n">event</span> <span class="n">into</span> <span class="n">the</span> <span class="n">Catch</span> <span class="nb">system</span><span class="o">.</span>  <span class="n">This</span> <span class="n">object</span> <span class="n">is</span> <span class="n">nearly</span> <span class="n">immutable</span><span class="p">,</span> <span class="n">the</span> <span class="n">only</span> <span class="n">mutable</span> <span class="n">portion</span>
+ <span class="o">*</span> <span class="n">is</span> <span class="n">the</span> <span class="n">handled</span> <span class="n">flag</span><span class="o">.</span>
+ <span class="o">*/</span>
+<span class="nv">@Typed</span><span class="p">()</span>
+<span class="n">public</span> <span class="n">class</span> <span class="n">ExceptionToCatchEvent</span> <span class="n">implements</span> <span class="n">Serializable</span>
+<span class="p">{</span>
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Constructor</span> <span class="n">that</span> <span class="n">adds</span> <span class="n">qualifiers</span> <span class="k">for</span> <span class="n">the</span> <span class="n">handler</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="n">to</span> <span class="n">run</span><span class="o">.</span>
+     <span class="o">*</span> <span class="n">Typically</span> <span class="n">only</span> <span class="n">integrators</span> <span class="n">will</span> <span class="n">be</span> <span class="n">using</span> <span class="n">this</span> <span class="n">constructor</span><span class="o">.</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">exception</span>  <span class="n">Exception</span> <span class="n">to</span> <span class="n">handle</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">qualifiers</span> <span class="n">qualifiers</span> <span class="n">to</span> <span class="k">use</span> <span class="n">to</span> <span class="n">narrow</span> <span class="n">the</span> <span class="n">handlers</span> <span class="n">called</span>
+     <span class="o">*/</span>
+    <span class="n">public</span> <span class="n">ExceptionToCatchEvent</span><span class="p">(</span><span class="n">Throwable</span> <span class="n">exception</span><span class="p">,</span> <span class="n">Annotation</span><span class="o">...</span> <span class="n">qualifiers</span><span class="p">)</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Basic</span> <span class="n">constructor</span> <span class="n">without</span> <span class="n">any</span> <span class="n">qualifiers</span> <span class="nb">defined</span><span class="o">.</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">exception</span> <span class="n">Exception</span> <span class="n">to</span> <span class="n">handle</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">public</span> <span class="n">ExceptionToCatchEvent</span><span class="p">(</span><span class="n">Throwable</span> <span class="n">exception</span><span class="p">)</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="n">public</span> <span class="n">Throwable</span> <span class="n">getException</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Internal</span> <span class="n">only</span><span class="o">.</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">handled</span> <span class="k">new</span> <span class="n">value</span>
+     <span class="o">*/</span>
+    <span class="n">public</span> <span class="n">void</span> <span class="n">setHandled</span><span class="p">(</span><span class="n">boolean</span> <span class="n">handled</span><span class="p">)</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Test</span> <span class="n">to</span> <span class="n">see</span> <span class="k">if</span> <span class="n">the</span> <span class="n">exception</span> <span class="n">has</span> <span class="n">been</span> <span class="n">handled</span> <span class="n">via</span> <span class="n">Solder</span> <span class="n">Catch</span><span class="o">.</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">test</span> <span class="k">if</span> <span class="n">the</span> <span class="n">exception</span> <span class="n">has</span> <span class="n">been</span> <span class="n">through</span> <span class="n">Solder</span> <span class="n">Catch</span> <span class="n">handling</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">public</span> <span class="n">boolean</span> <span class="n">isHandled</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Qualifiers</span> <span class="n">with</span> <span class="n">which</span> <span class="n">the</span> <span class="n">instance</span> <span class="n">was</span> <span class="n">created</span><span class="o">.</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">Qualifiers</span> <span class="n">with</span> <span class="n">which</span> <span class="n">the</span> <span class="n">instance</span> <span class="n">was</span> <span class="n">created</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">public</span> <span class="n">Set</span><span class="sr">&lt;Annotation&gt;</span> <span class="n">getQualifiers</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>b</p>
+<div class="codehilite"><pre><span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Flow</span> <span class="n">control</span> <span class="n">enum</span><span class="o">.</span>  <span class="n">Used</span> <span class="n">in</span> <span class="n">the</span> <span class="n">dispatcher</span> <span class="n">to</span> <span class="n">determine</span> <span class="n">how</span> <span class="n">to</span> <span class="n">markHandled</span><span class="o">.</span>
+ <span class="o">*/</span>
+<span class="n">public</span> <span class="n">enum</span> <span class="n">ExceptionHandlingFlow</span>
+<span class="p">{</span>
+    <span class="n">HANDLED</span><span class="p">,</span>
+    <span class="n">HANDLED_AND_CONTINUE</span><span class="p">,</span>
+    <span class="n">SKIP_CAUSE</span><span class="p">,</span>
+    <span class="n">ABORT</span><span class="p">,</span>
+    <span class="n">THROW_ORIGINAL</span><span class="p">,</span>
+    <span class="n">THROW</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>b</p>
+<div class="codehilite"><pre><span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Container</span> <span class="k">for</span> <span class="n">the</span> <span class="n">exception</span> <span class="ow">and</span> <span class="n">it</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">stack</span> <span class="n">trace</span><span class="o">.</span>
+ <span class="o">*/</span>
+<span class="nv">@Typed</span><span class="p">()</span>
+<span class="n">public</span> <span class="n">final</span> <span class="n">class</span> <span class="n">ExceptionStackItem</span> <span class="n">implements</span> <span class="n">Serializable</span>
+<span class="p">{</span>
+    <span class="n">public</span> <span class="n">ExceptionStackItem</span><span class="p">(</span><span class="n">final</span> <span class="n">Throwable</span> <span class="n">cause</span><span class="p">)</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="n">public</span> <span class="n">ExceptionStackItem</span><span class="p">(</span><span class="n">Throwable</span> <span class="n">throwable</span><span class="p">,</span> <span class="n">StackTraceElement</span><span class="o">[]</span> <span class="n">stackTraceElements</span><span class="p">)</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="n">public</span> <span class="n">StackTraceElement</span><span class="o">[]</span> <span class="n">getStackTraceElements</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+
+    <span class="n">public</span> <span class="n">Throwable</span> <span class="n">getThrowable</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="sr">//</span><span class="o">...</span>
+    <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>b</p>
+<div class="codehilite"><pre><span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Meta</span> <span class="n">data</span> <span class="n">interface</span> <span class="n">about</span> <span class="n">an</span> <span class="n">exception</span> <span class="n">handler</span><span class="o">.</span> <span class="n">It</span> <span class="n">is</span> <span class="n">the</span> <span class="n">responsibility</span> <span class="n">of</span> <span class="n">the</span>
+ <span class="o">*</span> <span class="n">implementation</span> <span class="n">to</span> <span class="n">support</span> <span class="p">{</span><span class="nv">@link</span> <span class="n">javax</span><span class="o">.</span><span class="n">enterprise</span><span class="o">.</span><span class="n">inject</span><span class="o">.</span><span class="n">spi</span><span class="o">.</span><span class="n">InjectionPoint</span><span class="p">}</span><span class="n">s</span> <span class="ow">and</span> <span class="n">to</span>
+ <span class="o">*</span> <span class="n">validate</span> <span class="n">those</span> <span class="p">{</span><span class="nv">@link</span> <span class="n">javax</span><span class="o">.</span><span class="n">enterprise</span><span class="o">.</span><span class="n">inject</span><span class="o">.</span><span class="n">spi</span><span class="o">.</span><span class="n">InjectionPoint</span><span class="p">}</span><span class="n">s</span><span class="o">.</span>
+ <span class="o">*</span>
+ <span class="o">*</span> <span class="nv">@param</span> <span class="sr">&lt;T&gt;</span> <span class="n">Exception</span> <span class="k">for</span> <span class="n">which</span> <span class="n">this</span> <span class="n">handler</span> <span class="n">is</span> <span class="n">responsible</span>
+ <span class="o">*/</span>
+<span class="n">public</span> <span class="n">interface</span> <span class="n">HandlerMethod</span><span class="o">&lt;</span><span class="n">T</span> <span class="n">extends</span> <span class="n">Throwable</span><span class="o">&gt;</span>
+<span class="p">{</span>
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Obtains</span> <span class="n">the</span> <span class="n">set</span> <span class="n">of</span> <span class="n">handled</span> <span class="n">event</span> <span class="n">qualifiers</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">Set</span><span class="sr">&lt;Annotation&gt;</span> <span class="n">getQualifiers</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Obtains</span> <span class="n">the</span> <span class="n">handled</span> <span class="n">event</span> <span class="n">type</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">Type</span> <span class="n">getExceptionType</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Flag</span> <span class="n">indicating</span> <span class="n">this</span> <span class="n">handler</span> <span class="n">should</span> <span class="n">be</span> <span class="n">invoked</span> <span class="n">during</span> <span class="n">the</span> <span class="n">before</span> <span class="n">traversal</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">boolean</span> <span class="n">isBeforeHandler</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Calls</span> <span class="n">the</span> <span class="n">handler</span> <span class="n">method</span><span class="p">,</span> <span class="n">passing</span> <span class="n">the</span> <span class="n">given</span> <span class="n">event</span> <span class="n">object</span><span class="o">.</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">event</span> <span class="n">event</span> <span class="n">to</span> <span class="n">pass</span> <span class="n">to</span> <span class="n">the</span> <span class="n">handler</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="n">void</span> <span class="n">notify</span><span class="p">(</span><span class="n">ExceptionEvent</span><span class="sr">&lt;T&gt;</span> <span class="n">event</span><span class="p">);</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Obtains</span> <span class="n">the</span> <span class="n">precedence</span> <span class="n">of</span> <span class="n">the</span> <span class="n">handler</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="nb">int</span> <span class="n">getOrdinal</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">Basic</span> <span class="p">{</span><span class="nv">@link</span> <span class="n">Object</span><span class="c1">#equals(Object)} but must use all of the get methods from this interface to</span>
+     <span class="o">*</span> <span class="n">maintain</span> <span class="n">compatibility</span><span class="o">.</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">o</span> <span class="n">Object</span> <span class="n">being</span> <span class="n">compared</span> <span class="n">to</span> <span class="n">this</span><span class="o">.</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">true</span> <span class="ow">or</span> <span class="n">false</span> <span class="n">based</span> <span class="n">on</span> <span class="n">standard</span> <span class="n">equality</span><span class="o">.</span>
+     <span class="o">*/</span>
+    <span class="nv">@Override</span>
+    <span class="n">boolean</span> <span class="n">equals</span><span class="p">(</span><span class="n">Object</span> <span class="n">o</span><span class="p">);</span>
+
+    <span class="nv">@Override</span>
+    <span class="nb">int</span> <span class="n">hashCode</span><span class="p">();</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h1 id="under-discussion">Under discussion</h1>
+<ul>
+<li>Exception Handlers</li>
+<li>Entry into the Exception Handling system</li>
+</ul>
+<h2 id="apispi">API/SPI</h2>
+<h1 id="use-cases">Use-cases</h1>
+<h2 id="fire-and-observe-exceptions">Fire and observe exceptions</h2>
+<p>An exception happens either in some business logic or from the container (maybe a session timed out or something like that). Developers need a simple, easy to use way to handle exceptions in a uniform way. They also need to be able to tell, after exception handling, if the exception was actually handled (a handler was found for the particular exception type or super type) or if it needs to be bubbled up to a higher level.</p>
+<h3 id="scenario">Scenario</h3>
+<div class="codehilite"><pre><span class="n">Business</span> <span class="n">method</span> <span class="n">using</span> <span class="n">try</span> <span class="o">/</span> <span class="n">catch</span>
+<span class="n">public</span> <span class="n">void</span> <span class="n">myBusinessMethod</span><span class="p">(</span><span class="o">...</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">try</span> <span class="p">{</span>
+        <span class="o">...</span>
+    <span class="p">}</span> <span class="n">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
+        <span class="sr">//</span> <span class="n">entry</span> <span class="n">into</span> <span class="n">exception</span> <span class="n">handling</span> <span class="nb">system</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>b</p>
+<div class="codehilite"><pre><span class="n">JSF</span> <span class="n">integration</span>
+<span class="n">public</span> <span class="n">void</span> <span class="n">handle</span><span class="p">()</span> <span class="n">throws</span> <span class="n">FacesException</span> <span class="p">{</span>
+    <span class="sr">//</span> <span class="n">iterate</span> <span class="n">over</span> <span class="n">exceptions</span>
+    <span class="sr">//</span> <span class="n">entry</span> <span class="n">into</span> <span class="n">exception</span> <span class="n">handling</span> <span class="nb">system</span>
+    <span class="sr">//</span> <span class="n">exception</span> <span class="n">handling</span> <span class="n">inspection</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>b</p>
+<div class="codehilite"><pre><span class="n">JAX</span><span class="o">-</span><span class="n">RS</span> <span class="n">integration</span>
+<span class="n">public</span> <span class="n">class</span> <span class="n">MyExceptionMapper</span> <span class="n">implements</span> <span class="n">ExceptionMapper</span><span class="sr">&lt;Throwable&gt;</span> <span class="p">{</span>
+    <span class="n">public</span> <span class="n">Response</span> <span class="n">toResponse</span><span class="p">(</span><span class="n">E</span> <span class="n">exception</span><span class="p">)</span> <span class="p">{</span>
+        <span class="sr">//</span> <span class="n">entry</span> <span class="n">into</span> <span class="n">exception</span> <span class="n">handling</span> <span class="nb">system</span>
+        <span class="sr">//</span> <span class="n">exception</span> <span class="n">handling</span> <span class="n">inspection</span>
+    <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h1 id="message-module-draft">Message module draft</h1>
+<h1 id="features-to-merge">Features to merge</h1>
+<p>original list: https://issues.apache.org/jira/browse/DELTASPIKE-119</p>
+<h2 id="part-1">Part 1</h2>
+<p>|| Feature || Comments || Objections || Discussion finished
+| Basic API |  |  | (+) |
+| Serializable messages | | not compatible with type-safe messages | |
+| Transferable messages (resolve the final text for a different context (locale,…)) and context-config | | | (+) |
+| custom message types | | | |
+| creating messages via builder pattern | | | (+) |
+| numbered message arguments | | | (+) |
+| eval existing converter approach for numbered message arguments | | | |
+| message resolver to support different message-sources | | | (+) |
+| message interpolator | | | (+) |
+| locale resolver | | | (+) due to type-safe messages it changed a bit - we have to re-visit it |
+| type safe messages | | | (+) |</p>
+<h2 id="part-2">Part 2</h2>
+<p>This part depends on decissions of part 1.</p>
+<p>|| Feature || Comments || Objections || Discussion finished
+| el support (= el interpolation) | | | |
+| named message arguments | | | |
+| message payload -&gt; allows to control processing of the message (via custom impl. of different SPIs) – similar to payload in bean-validation | | | |
+| message context (config) is immutable to avoid side-effects | | | |
+| clone a message context to use the same config but it’s possible to change it before the new context gets created (and is immutable) | | | |
+| formatter to allow to format argument-values for the final message text (similar to a converter -&gt; we can think about merging the concepts) | | | |
+| tooling for devs to generate their own type-safe messages | | | |
+| messages within a database, or any other possible back end | | | |
+| inline translated type safe messages | | | |
+| pluralizer system for message i18n | | | |
+| static helpers for simple messages | | | |</p>
+<h2 id="part-3">Part 3</h2>
+<p>This part depends on the planned integration with other technologies like JSF, BV,...</p>
+<p>|| Feature || Comments || Objections || Discussion finished
+| add message to the "current" context | | | |
+| factories to customize the default behaviour | | | |
+| allows multi-tenant support | | | |
+| message targets (ie. a message for a specific component) | | | |
+| application and client locale | | | |
+| application and client timezone | | | |
+| support jsr310 dates | | | |
+| transaction phase for message, ie. only produce a message when a transaction is committed (usually used in conjunction with observers) | | | |
+| integrate type safe messages with bean validation | | | |
+| ability to hook Bean Validation messages into same infrastructure | needs clarification - reason: ConstraintViolation#getMessage returns a string | | |
+| ability to hook JSF validation messages into same infrastructure | see "current" context | | |
+| messages surviving multiple http redirects | | | |</p>
+<h2 id="part-4">Part 4</h2>
+<p>This part contains features for integrating 3rd party libraries.</p>
+<p>|| Feature || Comments || Objections || Discussion finished
+| support joda-time dates | | | |</p>
+<h1 id="agreed-api_1">Agreed API</h1>
+<h2 id="basic-api">Basic API</h2>
+<div class="codehilite"><pre><span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Basic</span> <span class="n">interface</span> <span class="k">for</span> <span class="n">all</span> <span class="n">message</span><span class="o">-</span><span class="n">types</span>
+ <span class="o">*/</span>
+<span class="n">public</span> <span class="n">interface</span> <span class="n">Message</span> <span class="n">extends</span> <span class="n">Localizable</span><span class="p">,</span> <span class="n">Serializable</span>
+<span class="p">{</span>
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">message</span> <span class="n">key</span> <span class="p">(</span><span class="ow">or</span> <span class="n">inline</span><span class="o">-</span><span class="n">text</span><span class="p">)</span> <span class="n">of</span> <span class="n">the</span> <span class="n">current</span> <span class="n">message</span>
+     <span class="o">*/</span>
+    <span class="n">String</span> <span class="n">getDescriptor</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">all</span> <span class="n">named</span> <span class="ow">and</span> <span class="n">numbered</span> <span class="n">arguments</span>
+     <span class="o">*/</span>
+    <span class="n">Serializable</span><span class="o">[]</span> <span class="n">getArguments</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">arguments</span> <span class="mi">1</span><span class="o">-</span><span class="n">n</span> <span class="k">new</span> <span class="n">arguments</span> <span class="k">for</span> <span class="n">the</span> <span class="n">current</span> <span class="n">message</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">current</span> <span class="n">instance</span>
+     <span class="o">*/</span>
+    <span class="n">Message</span> <span class="n">addArgument</span><span class="p">(</span><span class="n">Serializable</span><span class="o">...</span> <span class="n">arguments</span><span class="p">);</span>
+
+    <span class="o">/*</span>
+     <span class="o">*</span> <span class="n">TBD</span>
+     <span class="o">*/</span>
+    <span class="n">String</span> <span class="n">toText</span><span class="p">();</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>b</p>
+<div class="codehilite"><pre><span class="nv">@MessageBundle</span>
+<span class="n">public</span> <span class="n">interface</span> <span class="n">CustomMessageBundle</span>
+<span class="p">{</span>
+    <span class="nv">@Message</span><span class="p">(</span><span class="s">&quot;Hello %s&quot;</span><span class="p">)</span>
+    <span class="n">Message</span> <span class="n">sayHello</span><span class="p">(</span><span class="n">String</span> <span class="n">cause</span><span class="p">);</span>
+<span class="p">}</span>
+
+<span class="sr">//</span><span class="o">...</span>
+
+<span class="nv">@Inject</span>
+<span class="n">private</span> <span class="n">CustomMessageBundle</span> <span class="n">messages</span><span class="p">;</span>
+
+<span class="sr">//</span><span class="o">...</span>
+
+<span class="n">String</span> <span class="n">messageText</span><span class="p">;</span>
+<span class="n">messageText</span> <span class="o">=</span> <span class="n">messages</span><span class="o">.</span><span class="n">sayHello</span><span class="p">(</span><span class="s">&quot;DeltaSpike&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">toText</span><span class="p">();</span>
+<span class="sr">//o</span><span class="n">r</span>
+<span class="n">messageText</span> <span class="o">=</span> <span class="n">messages</span><span class="o">.</span><span class="n">sayHello</span><span class="p">(</span><span class="s">&quot;DeltaSpike&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">toString</span><span class="p">();</span>
+<span class="sr">//o</span><span class="n">r</span>
+<span class="n">Message</span> <span class="n">message</span> <span class="o">=</span> <span class="n">messages</span><span class="o">.</span><span class="n">sayHello</span><span class="p">(</span><span class="s">&quot;DeltaSpike&quot;</span><span class="p">);</span>
+</pre></div>
+
+
+<h1 id="api-under-discussion-part-1">API under discussion - Part 1</h1>
+<h2 id="message-interface">Message Interface</h2>
+<div class="codehilite"><pre><span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Basic</span> <span class="n">interface</span> <span class="k">for</span> <span class="n">all</span> <span class="n">message</span><span class="o">-</span><span class="n">types</span>
+ <span class="o">*/</span>
+<span class="n">public</span> <span class="n">interface</span> <span class="n">Message</span> <span class="n">extends</span> <span class="n">Localizable</span><span class="p">,</span> <span class="n">Serializable</span>
+<span class="p">{</span>
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">message</span> <span class="n">key</span> <span class="p">(</span><span class="ow">or</span> <span class="n">inline</span><span class="o">-</span><span class="n">text</span><span class="p">)</span> <span class="n">of</span> <span class="n">the</span> <span class="n">current</span> <span class="n">message</span>
+     <span class="o">*/</span>
+    <span class="n">String</span> <span class="n">getDescriptor</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">all</span> <span class="n">named</span> <span class="ow">and</span> <span class="n">numbered</span> <span class="n">arguments</span>
+     <span class="o">*/</span>
+    <span class="n">Serializable</span><span class="o">[]</span> <span class="n">getArguments</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">arguments</span> <span class="mi">1</span><span class="o">-</span><span class="n">n</span> <span class="k">new</span> <span class="n">arguments</span> <span class="k">for</span> <span class="n">the</span> <span class="n">current</span> <span class="n">message</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">current</span> <span class="n">instance</span>
+     <span class="o">*/</span>
+    <span class="n">Message</span> <span class="n">addArgument</span><span class="p">(</span><span class="n">Serializable</span><span class="o">...</span> <span class="n">arguments</span><span class="p">);</span>
+
+    <span class="sr">//</span><span class="n">TODO</span> <span class="n">check</span> <span class="n">compatibility</span> <span class="n">with</span> <span class="n">type</span><span class="o">-</span><span class="n">safe</span> <span class="n">messages</span>
+    <span class="sr">//</span><span class="n">payload</span> <span class="n">postponed</span> <span class="p">(</span><span class="n">addPayload</span><span class="p">,</span> <span class="n">getPayload</span><span class="p">)</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h2 id="localizable">Localizable</h2>
+<div class="codehilite"><pre><span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Classes</span> <span class="n">which</span> <span class="n">implement</span> <span class="n">it</span> <span class="n">can</span> <span class="n">provide</span> <span class="n">the</span> <span class="n">message</span><span class="o">-</span><span class="n">text</span> <span class="n">based</span> <span class="n">on</span> <span class="n">the</span> <span class="n">given</span> <span class="p">{</span><span class="nv">@link</span> <span class="n">MessageContext</span><span class="p">}</span>
+ <span class="o">*/</span>
+<span class="n">public</span> <span class="n">interface</span> <span class="n">Localizable</span>
+<span class="p">{</span>
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">messageContext</span> <span class="n">the</span> <span class="n">current</span> <span class="n">context</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">text</span> <span class="n">which</span> <span class="n">represents</span> <span class="n">the</span> <span class="n">current</span> <span class="n">instance</span> <span class="k">for</span> <span class="n">the</span> <span class="n">given</span> <span class="n">message</span> <span class="n">context</span>
+     <span class="o">*/</span>
+    <span class="n">String</span> <span class="n">toString</span><span class="p">(</span><span class="n">MessageContext</span> <span class="n">messageContext</span><span class="p">);</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h2 id="messageinterpolator">MessageInterpolator</h2>
+<div class="codehilite"><pre><span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Implementations</span> <span class="n">are</span> <span class="n">responsible</span> <span class="n">to</span> <span class="n">replace</span> <span class="n">placeholders</span> <span class="n">in</span> <span class="n">a</span> <span class="n">message</span> <span class="n">with</span> <span class="n">the</span> <span class="n">final</span> <span class="n">value</span>
+ <span class="o">*/</span>
+<span class="n">public</span> <span class="n">interface</span> <span class="n">MessageInterpolator</span> <span class="n">extends</span> <span class="n">Serializable</span>
+<span class="p">{</span>
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">replaces</span> <span class="n">the</span> <span class="n">arguments</span> <span class="n">of</span> <span class="n">the</span> <span class="n">given</span> <span class="n">message</span> <span class="n">with</span> <span class="n">the</span> <span class="n">given</span> <span class="n">arguments</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">messageContext</span> <span class="n">the</span> <span class="n">current</span> <span class="p">{</span><span class="nv">@link</span> <span class="n">org</span><span class="o">.</span><span class="n">apache</span><span class="o">.</span><span class="n">myfaces</span><span class="o">.</span><span class="n">extensions</span><span class="o">.</span><span class="n">cdi</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">api</span><span class="o">.</span><span class="n">MessageContext</span><span class="p">}</span>
+     <span class="o">*</span> <span class="n">instead</span> <span class="n">of</span> <span class="n">a</span> <span class="n">MessageContextAware</span> <span class="n">interface</span><span class="o">.</span> <span class="n">we</span> <span class="n">need</span> <span class="n">it</span> <span class="n">to</span> <span class="n">avoid</span> <span class="n">expensive</span> <span class="n">operations</span> <span class="n">like</span> <span class="n">locking</span> <span class="ow">or</span> <span class="n">deep</span> <span class="n">cloning</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">messageText</span> <span class="n">the</span> <span class="n">message</span> <span class="n">text</span> <span class="n">which</span> <span class="n">has</span> <span class="n">to</span> <span class="n">be</span> <span class="n">interpolated</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">arguments</span> <span class="n">a</span> <span class="n">list</span> <span class="n">of</span> <span class="n">numbered</span> <span class="ow">and</span><span class="o">/</span><span class="ow">or</span> <span class="n">named</span> <span class="n">arguments</span> <span class="k">for</span> <span class="n">the</span> <span class="n">current</span> <span class="n">message</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">final</span> <span class="p">(</span><span class="n">interpolated</span><span class="p">)</span> <span class="n">message</span> <span class="n">text</span>
+     <span class="o">*</span>         <span class="k">if</span> <span class="n">it</span> <span class="n">was</span> <span class="n">possible</span> <span class="n">to</span> <span class="n">replace</span> <span class="n">the</span> <span class="n">parameters</span> <span class="n">with</span> <span class="n">the</span> <span class="n">given</span> <span class="n">arguments</span>
+     <span class="o">*</span>         <span class="n">the</span> <span class="n">unmodified</span> <span class="n">messageText</span> <span class="n">otherwise</span>
+     <span class="o">*/</span>
+    <span class="n">String</span> <span class="n">interpolate</span><span class="p">(</span><span class="n">MessageContext</span> <span class="n">messageContext</span><span class="p">,</span> <span class="n">String</span> <span class="n">messageText</span><span class="p">,</span> <span class="n">Serializable</span><span class="o">...</span> <span class="n">arguments</span><span class="p">);</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h2 id="messageresolver">MessageResolver</h2>
+<div class="codehilite"><pre><span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Implementations</span> <span class="n">have</span> <span class="n">to</span> <span class="n">resolve</span> <span class="n">the</span> <span class="n">text</span> <span class="n">stored</span> <span class="k">for</span> <span class="n">a</span> <span class="n">given</span> <span class="n">key</span> <span class="n">in</span> <span class="n">the</span> <span class="n">message</span><span class="o">-</span><span class="n">source</span> <span class="n">they</span> <span class="n">are</span> <span class="n">aware</span> <span class="n">of</span>
+ <span class="o">*/</span>
+<span class="n">public</span> <span class="n">interface</span> <span class="n">MessageResolver</span> <span class="n">extends</span> <span class="n">Serializable</span>
+<span class="p">{</span>
+    <span class="n">String</span> <span class="n">MISSING_RESOURCE_MARKER</span> <span class="o">=</span> <span class="s">&quot;???&quot;</span><span class="p">;</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">messageContext</span> <span class="n">the</span> <span class="n">current</span> <span class="p">{</span><span class="nv">@link</span> <span class="n">org</span><span class="o">.</span><span class="n">apache</span><span class="o">.</span><span class="n">myfaces</span><span class="o">.</span><span class="n">extensions</span><span class="o">.</span><span class="n">cdi</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">api</span><span class="o">.</span><span class="n">MessageContext</span><span class="p">}</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">messageDescriptor</span> <span class="n">the</span> <span class="n">message</span> <span class="n">key</span> <span class="p">(</span><span class="ow">or</span> <span class="n">in</span><span class="o">-</span><span class="n">lined</span> <span class="n">text</span><span class="p">)</span> <span class="n">of</span> <span class="n">the</span> <span class="n">current</span> <span class="n">message</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">payload</span> <span class="sr">//</span><span class="n">TBD</span> <span class="n">the</span> <span class="n">payload</span> <span class="n">of</span> <span class="n">the</span> <span class="n">message</span> <span class="n">e</span><span class="o">.</span><span class="n">g</span><span class="o">.</span> <span class="n">to</span> <span class="k">use</span> <span class="n">different</span> <span class="n">message</span> <span class="n">sources</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">final</span> <span class="n">but</span> <span class="ow">not</span> <span class="n">interpolated</span> <span class="n">message</span> <span class="n">text</span>
+     <span class="o">*/</span>
+    <span class="n">String</span> <span class="n">getMessage</span><span class="p">(</span><span class="n">MessageContext</span> <span class="n">messageContext</span><span class="p">,</span>
+                      <span class="n">String</span> <span class="n">messageDescriptor</span><span class="p">,</span>
+                      <span class="sr">/*TBD*/</span> <span class="n">Map</span><span class="o">&lt;</span><span class="n">Class</span><span class="p">,</span> <span class="n">MessagePayload</span><span class="o">&gt;</span> <span class="n">payload</span><span class="p">);</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h2 id="localeresolver">LocaleResolver</h2>
+<div class="codehilite"><pre><span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Implementations</span> <span class="n">have</span> <span class="n">to</span> <span class="n">provide</span> <span class="n">the</span> <span class="n">current</span> <span class="n">locale</span>
+ <span class="o">*/</span>
+<span class="n">public</span> <span class="n">interface</span> <span class="n">LocaleResolver</span> <span class="n">extends</span> <span class="n">Serializable</span>
+<span class="p">{</span>
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">current</span> <span class="n">locale</span>
+     <span class="o">*/</span>
+    <span class="n">Locale</span> <span class="n">getLocale</span><span class="p">();</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h2 id="messagecontext">MessageContext</h2>
+<div class="codehilite"><pre><span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Central</span> <span class="n">context</span> <span class="k">for</span> <span class="n">handling</span> <span class="n">messages</span>
+ <span class="o">*/</span>
+<span class="n">public</span> <span class="n">interface</span> <span class="n">MessageContext</span> <span class="n">extends</span> <span class="n">LocaleResolver</span><span class="p">,</span> <span class="n">MessageHandler</span><span class="p">,</span> <span class="n">Serializable</span>
+<span class="p">{</span>
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">message</span> <span class="n">builder</span> <span class="n">to</span> <span class="n">add</span> <span class="ow">and</span><span class="o">/</span><span class="ow">or</span> <span class="n">create</span> <span class="n">a</span> <span class="k">new</span> <span class="n">message</span> <span class="n">based</span> <span class="n">on</span> <span class="n">the</span> <span class="n">current</span> <span class="n">context</span> <span class="n">via</span> <span class="n">a</span> <span class="n">fluent</span> <span class="n">api</span>
+     <span class="o">*/</span>
+    <span class="n">MessageBuilder</span> <span class="n">message</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">current</span> <span class="n">config</span> <span class="n">to</span> <span class="n">change</span> <span class="n">it</span> <span class="ow">or</span> <span class="n">create</span> <span class="n">a</span> <span class="k">new</span> <span class="n">one</span> <span class="n">base</span> <span class="n">on</span> <span class="n">the</span> <span class="n">current</span> <span class="n">config</span>
+     <span class="o">*/</span>
+    <span class="n">MessageContextConfig</span> <span class="n">config</span><span class="p">();</span>
+
+    <span class="o">/*</span>
+     <span class="o">*</span> <span class="n">TBD:</span>
+     <span class="o">*/</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@param</span> <span class="n">contextType</span> <span class="n">the</span> <span class="n">type</span> <span class="n">of</span> <span class="n">the</span> <span class="n">custom</span> <span class="n">implementation</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">instance</span> <span class="n">of</span> <span class="n">the</span> <span class="n">current</span> <span class="n">message</span> <span class="n">context</span> <span class="n">to</span> <span class="k">use</span> <span class="n">the</span> <span class="n">api</span> <span class="n">of</span> <span class="n">the</span> <span class="n">concrete</span> <span class="n">implementation</span>
+     <span class="o">*/</span>
+    <span class="o">&lt;</span><span class="n">T</span> <span class="n">extends</span> <span class="n">MessageContext</span><span class="o">&gt;</span> <span class="n">T</span> <span class="n">typed</span><span class="p">(</span><span class="n">Class</span><span class="sr">&lt;T&gt;</span> <span class="n">contextType</span><span class="p">);</span>
+
+    <span class="o">/*</span>
+     <span class="o">*</span> <span class="n">convenient</span> <span class="n">methods</span>
+     <span class="o">*/</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">creates</span> <span class="n">a</span> <span class="k">new</span> <span class="n">context</span> <span class="n">based</span> <span class="n">on</span> <span class="n">the</span> <span class="n">current</span> <span class="n">one</span>
+     <span class="o">*/</span>
+    <span class="n">MessageContext</span> <span class="n">cloneContext</span><span class="p">();</span>
+
+    <span class="sr">//</span><span class="n">the</span> <span class="n">rest</span> <span class="n">will</span> <span class="n">be</span> <span class="n">discussed</span> <span class="n">later</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h2 id="messagecontextconfig">MessageContextConfig</h2>
+<div class="codehilite"><pre><span class="o">/**</span>
+ <span class="o">*</span> <span class="n">Config</span> <span class="k">for</span> <span class="n">customizing</span> <span class="n">a</span> <span class="p">{</span><span class="nv">@link</span> <span class="n">MessageContext</span><span class="p">}</span>
+ <span class="o">*/</span>
+<span class="n">public</span> <span class="n">interface</span> <span class="n">MessageContextConfig</span> <span class="n">extends</span> <span class="n">Serializable</span>
+<span class="p">{</span>
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">create</span> <span class="n">a</span> <span class="k">new</span> <span class="n">context</span> <span class="n">based</span> <span class="n">on</span> <span class="n">the</span> <span class="n">default</span> <span class="n">context</span> <span class="o">-</span> <span class="n">the</span> <span class="n">default</span> <span class="n">context</span> <span class="n">won</span><span class="err">&#39;</span><span class="n">t</span> <span class="n">get</span> <span class="n">modified</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">a</span> <span class="n">message</span> <span class="n">context</span> <span class="n">builder</span> <span class="n">based</span> <span class="n">on</span> <span class="n">the</span> <span class="n">current</span> <span class="n">config</span>
+     <span class="o">*/</span>
+    <span class="n">MessageContextBuilder</span> <span class="k">use</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="n">change</span> <span class="n">the</span> <span class="n">default</span> <span class="n">context</span>
+     <span class="o">*</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">a</span> <span class="n">message</span> <span class="n">context</span> <span class="n">builder</span> <span class="n">to</span> <span class="n">change</span> <span class="n">the</span> <span class="n">current</span> <span class="n">config</span>
+     <span class="o">*/</span>
+    <span class="n">MessageContextBuilder</span> <span class="n">change</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">current</span> <span class="n">message</span> <span class="n">interpolator</span>
+     <span class="o">*/</span>
+    <span class="n">MessageInterpolator</span> <span class="n">getMessageInterpolator</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">current</span> <span class="n">message</span> <span class="n">resolver</span>
+     <span class="o">*/</span>
+    <span class="n">MessageResolver</span> <span class="n">getMessageResolver</span><span class="p">();</span>
+
+    <span class="o">/**</span>
+     <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">current</span> <span class="n">locale</span> <span class="n">resolver</span>
+     <span class="o">*/</span>
+    <span class="n">LocaleResolver</span> <span class="n">getLocaleResolver</span><span class="p">();</span>
+
+    <span class="sr">//</span><span class="n">the</span> <span class="n">rest</span> <span class="n">will</span> <span class="n">be</span> <span class="n">discussed</span> <span class="n">later</span>
+
+    <span class="n">interface</span> <span class="n">MessageContextBuilder</span>
+    <span class="p">{</span>
+        <span class="o">/**</span>
+         <span class="o">*</span> <span class="nv">@param</span> <span class="n">messageInterpolator</span> <span class="n">a</span> <span class="k">new</span> <span class="n">message</span> <span class="n">interpolator</span>
+         <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">instance</span> <span class="n">of</span> <span class="n">the</span> <span class="n">current</span> <span class="n">message</span> <span class="n">context</span> <span class="n">builder</span>
+         <span class="o">*/</span>
+        <span class="n">MessageContextBuilder</span> <span class="n">messageInterpolator</span><span class="p">(</span><span class="n">MessageInterpolator</span> <span class="n">messageInterpolator</span><span class="p">);</span>
+
+        <span class="o">/**</span>
+         <span class="o">*</span> <span class="nv">@param</span> <span class="n">messageResolver</span> <span class="n">a</span> <span class="k">new</span> <span class="n">message</span> <span class="n">resolver</span>
+         <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">instance</span> <span class="n">of</span> <span class="n">the</span> <span class="n">current</span> <span class="n">message</span> <span class="n">context</span> <span class="n">builder</span>
+         <span class="o">*/</span>
+        <span class="n">MessageContextBuilder</span> <span class="n">messageResolver</span><span class="p">(</span><span class="n">MessageResolver</span> <span class="n">messageResolver</span><span class="p">);</span>
+
+        <span class="o">/**</span>
+         <span class="o">*</span> <span class="nv">@param</span> <span class="n">localeResolver</span> <span class="n">a</span> <span class="k">new</span> <span class="n">locale</span> <span class="n">resolver</span>
+         <span class="o">*</span> <span class="nv">@return</span> <span class="n">the</span> <span class="n">instance</span> <span class="n">of</span> <span class="n">the</span> <span class="n">current</span> <span class="n">message</span> <span class="n">context</span> <span class="n">builder</span>
+         <span class="o">*/</span>
+        <span class="n">MessageContextBuilder</span> <span class="n">localeResolver</span><span class="p">(</span><span class="n">LocaleResolver</span> <span class="n">localeResolver</span><span class="p">);</span>
+
+        <span class="o">/**</span>
+         <span class="o">*</span> <span class="nv">@return</span> <span class="n">a</span> <span class="k">new</span> <span class="n">message</span> <span class="n">context</span> <span class="n">based</span> <span class="n">on</span> <span class="n">the</span> <span class="n">current</span> <span class="n">config</span>
+         <span class="o">*/</span>
+        <span class="n">MessageContext</span> <span class="n">create</span><span class="p">();</span>
+
+        <span class="sr">//</span><span class="n">the</span> <span class="n">rest</span> <span class="n">will</span> <span class="n">be</span> <span class="n">discussed</span> <span class="n">later</span>
+    <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p># Security Module draft</p>
+<h1 id="agreed-api_2">Agreed API</h1>
+<ul>
+<li>@Secured</li>
+<li>@SecurityBindingType</li>
+<li>AccessDecisionVoter</li>
+<li>SecurityStrategy</li>
+</ul>
+<h1 id="agreed-api-and-spi-of-part-1">Agreed API and SPI of Part 1</h1>
+<p>commit: 1a2c7ffd0d0a1ad3dea34515a54958f0a6ce2932</p>
+<h2 id="api">API</h2>
+<h3 id="identity">Identity</h3>
+<p>Session scoped result of the authentication process.</p>
+<div class="codehilite"><pre><span class="n">public</span> <span class="n">interface</span> <span class="n">Identity</span> <span class="n">extends</span> <span class="n">Serializable</span>
+<span class="p">{</span>
+    <span class="n">public</span> <span class="n">enum</span> <span class="n">AuthenticationResult</span>
+    <span class="p">{</span>
+        <span class="n">SUCCESS</span><span class="p">,</span> <span class="n">FAILED</span>
+    <span class="p">}</span>
+
+    <span class="n">AuthenticationResult</span> <span class="n">login</span><span class="p">();</span>
+
+    <span class="n">void</span> <span class="n">logout</span><span class="p">();</span>
+
+    <span class="n">boolean</span> <span class="n">isLoggedIn</span><span class="p">();</span>
+
+    <span class="n">User</span> <span class="n">getUser</span><span class="p">();</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h3 id="user">User</h3>
+<p>Depending on further use-cases it can be refactored to an interface</p>
+<p>The id is an unique identifier for an user. It isn't defined if it is an internal identifier or an identifier known by the user (like the user-name).
+If users login e.g. via their e-mail address, it's possible to lookup an internal id in a custom implementation of {{LoginCredential}} or a bean which is in between (and {{LoginCredential}} doesn't get called directly in the 2nd case).</p>
+<div class="codehilite"><pre><span class="nv">@Typed</span><span class="p">()</span>
+<span class="n">public</span> <span class="n">class</span> <span class="n">User</span> <span class="n">implements</span> <span class="n">Serializable</span>
+<span class="p">{</span>
+    <span class="n">private</span> <span class="n">static</span> <span class="n">final</span> <span class="n">long</span> <span class="n">serialVersionUID</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2234530384311026364</span><span class="n">L</span><span class="p">;</span>
+
+    <span class="n">private</span> <span class="n">final</span> <span class="n">String</span> <span class="n">id</span><span class="p">;</span>
+
+    <span class="n">public</span> <span class="n">User</span><span class="p">(</span><span class="n">String</span> <span class="n">id</span><span class="p">)</span>
+    <span class="p">{</span>
+        <span class="n">this</span><span class="o">.</span><span class="n">id</span> <span class="o">=</span> <span class="n">id</span><span class="p">;</span>
+    <span class="p">}</span>
+
+    <span class="n">public</span> <span class="n">String</span> <span class="n">getId</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="k">return</span> <span class="n">id</span><span class="p">;</span>
+    <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h3 id="credential">Credential</h3>
+<p>Credential is a holder for the "secret key" like a password.</p>
+<div class="codehilite"><pre><span class="n">public</span> <span class="n">interface</span> <span class="n">Credential</span><span class="sr">&lt;T&gt;</span>
+<span class="p">{</span>
+    <span class="n">T</span> <span class="n">getValue</span><span class="p">();</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h3 id="logincredential-former-credentials">LoginCredential (former Credentials)</h3>
+<p>Request scoped holder for the authentication process.</p>
+<p>[TODO] we need a better name for it</p>
+<ul>
+<li>LoginCredentialState</li>
+<li>LoginCredentialHolder</li>
+<li>
+<p>LoginCredentialProvider</p>
+<p>public interface LoginCredential
+{
+    String getUserId();</p>
+<div class="codehilite"><pre><span class="n">void</span> <span class="n">setUserId</span><span class="p">(</span><span class="n">String</span> <span class="n">userId</span><span class="p">);</span>
+
+<span class="n">Credential</span> <span class="n">getCredential</span><span class="p">();</span>
+
+<span class="n">void</span> <span class="n">setCredential</span><span class="p">(</span><span class="n">Credential</span> <span class="n">credential</span><span class="p">);</span>
+
+<span class="n">void</span> <span class="n">invalidate</span><span class="p">();</span>
+</pre></div>
+
+
+<p>}</p>
+</li>
+</ul>
+<h3 id="events">Events</h3>
+<ul>
+<li>LoggedInEvent</li>
+<li>LoginFailedEvent</li>
+<li>AlreadyLoggedInEvent</li>
+<li>PreLoggedOutEvent</li>
+<li>PostLoggedOutEvent</li>
+<li>PreAuthenticateEvent</li>
+<li>PostAuthenticateEvent</li>
+</ul>
+<h2 id="spi">SPI</h2>
+<h3 id="authenticatorselector">AuthenticatorSelector</h3>
+<p>Request scoped bean used to find the current {{Authenticator}} for the authentication process - e.g. to provide different login-types used by the same client (e.g. a component in an UI).</p>
+<p>[TODO] discuss default (internal) Authenticator if there is no custom implementation.</p>
+<div class="codehilite"><pre><span class="x">public interface AuthenticatorSelector</span>
+<span class="x">{</span>
+<span class="x">    Class</span><span class="cp">&lt;?</span> <span class="k">extends</span> <span class="nx">Authenticator</span><span class="o">&gt;</span> <span class="nx">getAuthenticatorClass</span><span class="p">();</span>
+
+    <span class="nx">void</span> <span class="nx">setAuthenticatorClass</span><span class="p">(</span><span class="nx">Class</span><span class="o">&lt;?</span> <span class="k">extends</span> <span class="nx">Authenticator</span><span class="o">&gt;</span> <span class="nx">authenticatorClass</span><span class="p">);</span>
+
+    <span class="nx">String</span> <span class="nx">getAuthenticatorName</span><span class="p">();</span>
+
+    <span class="nx">void</span> <span class="nx">setAuthenticatorName</span><span class="p">(</span><span class="nx">String</span> <span class="nx">authenticatorName</span><span class="p">);</span>
+
+    <span class="nx">Authenticator</span> <span class="nx">getSelectedAuthenticator</span><span class="p">();</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h3 id="authenticator">Authenticator</h3>
+<p>Called by {{Identity}} and performs the final authentication based on the information in {{LoginCredential}} .</p>
+<div class="codehilite"><pre><span class="n">public</span> <span class="n">interface</span> <span class="n">Authenticator</span>
+<span class="p">{</span>
+    <span class="n">public</span> <span class="n">enum</span> <span class="n">AuthenticationStatus</span>
+    <span class="p">{</span>
+        <span class="n">SUCCESS</span><span class="p">,</span> <span class="n">FAILURE</span><span class="p">,</span> <span class="n">DEFERRED</span>
+    <span class="p">}</span>
+
+    <span class="n">void</span> <span class="n">authenticate</span><span class="p">();</span>
+
+    <span class="n">void</span> <span class="n">postAuthenticate</span><span class="p">();</span>
+
+    <span class="n">AuthenticationStatus</span> <span class="n">getStatus</span><span class="p">();</span>
+
+    <span class="n">User</span> <span class="n">getUser</span><span class="p">();</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>b</p>
+<div class="codehilite"><pre><span class="n">public</span> <span class="n">abstract</span> <span class="n">class</span> <span class="n">BaseAuthenticator</span> <span class="n">implements</span> <span class="n">Authenticator</span>
+<span class="p">{</span>
+    <span class="n">private</span> <span class="n">AuthenticationStatus</span> <span class="n">status</span><span class="p">;</span>
+
+    <span class="n">public</span> <span class="n">AuthenticationStatus</span> <span class="n">getStatus</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="k">return</span> <span class="n">status</span><span class="p">;</span>
+    <span class="p">}</span>
+
+    <span class="n">protected</span> <span class="n">void</span> <span class="n">setStatus</span><span class="p">(</span><span class="n">AuthenticationStatus</span> <span class="n">status</span><span class="p">)</span>
+    <span class="p">{</span>
+        <span class="n">this</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">status</span><span class="p">;</span>
+    <span class="p">}</span>
+
+    <span class="n">public</span> <span class="n">void</span> <span class="n">postAuthenticate</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="sr">//</span> <span class="n">No</span><span class="o">-</span><span class="n">op</span><span class="p">,</span> <span class="n">override</span> <span class="k">if</span> <span class="n">any</span> <span class="n">post</span><span class="o">-</span><span class="n">authentication</span> <span class="n">processing</span> <span class="n">is</span> <span class="n">required</span><span class="o">.</span>
+    <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h2 id="usage">Usage</h2>
+<h3 id="simple-loginlogout-by-example-java-se">Simple Login/Logout by Example (Java-SE)</h3>
+<div class="codehilite"><pre><span class="nv">@ApplicationScoped</span>
+<span class="n">public</span> <span class="n">class</span> <span class="n">LoginBean</span>
+<span class="p">{</span>
+    <span class="nv">@Inject</span>
+    <span class="n">private</span> <span class="n">LoginCredential</span> <span class="n">loginCredential</span><span class="p">;</span>
+
+    <span class="nv">@Inject</span>
+    <span class="n">private</span> <span class="n">Identity</span> <span class="n">identity</span><span class="p">;</span>
+
+    <span class="n">public</span> <span class="n">boolean</span> <span class="n">login</span><span class="p">(</span><span class="n">String</span> <span class="n">userName</span><span class="p">,</span> <span class="n">final</span> <span class="n">String</span> <span class="n">password</span><span class="p">)</span>
+    <span class="p">{</span>
+        <span class="n">this</span><span class="o">.</span><span class="n">loginCredential</span><span class="o">.</span><span class="n">setUserId</span><span class="p">(</span><span class="n">userName</span><span class="p">);</span>
+        <span class="n">this</span><span class="o">.</span><span class="n">loginCredential</span><span class="o">.</span><span class="n">setCredential</span><span class="p">(</span><span class="k">new</span> <span class="n">Credential</span><span class="sr">&lt;String&gt;</span><span class="p">()</span> <span class="p">{</span>
+            <span class="nv">@Override</span>
+            <span class="n">public</span> <span class="n">String</span> <span class="n">getValue</span><span class="p">()</span>
+            <span class="p">{</span>
+                <span class="k">return</span> <span class="n">password</span><span class="p">;</span>
+            <span class="p">}</span>
+        <span class="p">});</span>
+
+        <span class="n">this</span><span class="o">.</span><span class="n">identity</span><span class="o">.</span><span class="n">login</span><span class="p">();</span>
+        <span class="k">return</span> <span class="n">this</span><span class="o">.</span><span class="n">identity</span><span class="o">.</span><span class="n">isLoggedIn</span><span class="p">();</span>
+    <span class="p">}</span>
+
+    <span class="n">public</span> <span class="n">boolean</span> <span class="n">logout</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="n">this</span><span class="o">.</span><span class="n">identity</span><span class="o">.</span><span class="n">logout</span><span class="p">();</span>
+        <span class="k">return</span> <span class="o">!</span><span class="n">this</span><span class="o">.</span><span class="n">identity</span><span class="o">.</span><span class="n">isLoggedIn</span><span class="p">();</span>
+    <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>b</p>
+<div class="codehilite"><pre><span class="n">public</span> <span class="n">class</span> <span class="n">CustomBean</span>
+<span class="p">{</span>
+    <span class="nv">@Inject</span>
+    <span class="n">private</span> <span class="n">Identity</span> <span class="n">identity</span><span class="p">;</span>
+
+    <span class="nv">@Inject</span>
+    <span class="n">private</span> <span class="n">LoginBean</span> <span class="n">loginBean</span><span class="p">;</span>
+
+    <span class="n">public</span> <span class="n">void</span> <span class="n">execute</span><span class="p">()</span>
+    <span class="p">{</span>
+        <span class="k">if</span><span class="p">(</span><span class="n">this</span><span class="o">.</span><span class="n">loginBean</span><span class="o">.</span><span class="n">login</span><span class="p">(</span><span class="s">&quot;spike&quot;</span><span class="p">,</span> <span class="s">&quot;apache&quot;</span><span class="p">))</span>
+        <span class="p">{</span>
+            <span class="n">User</span> <span class="n">user</span> <span class="o">=</span> <span class="n">this</span><span class="o">.</span><span class="n">identity</span><span class="o">.</span><span class="n">getUser</span><span class="p">();</span>
+            <span class="sr">//</span><span class="o">...</span>
+        <span class="p">}</span>
+        <span class="k">else</span>
+        <span class="p">{</span>
+            <span class="sr">//</span><span class="o">...</span>
+        <span class="p">}</span>
+    <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h1 id="under-discussion_1">Under discussion</h1>
+<h2 id="apispi_1">API/SPI</h2>
+<h3 id="packages">Packages</h3>
+<ul>
+<li>*/authentication</li>
+<li>*/authentication/events</li>
+<li>*/authorization</li>
+<li>*/authorization/annotation</li>
+<li>*/credential or */authentication/credential</li>
+</ul>
+<h2 id="part-1_1">Part 1</h2>
+<p>|| Feature || Comments || Objections || Discussion finished ||
+| Login via Username/Password | | | (+) |
+| Logout | | | (+) |
+| Authentication API and SPI | Credentials vs Credential (one of it needs a better name) | | (+) |
+| Basic User/Identity API | | | (+) |
+| Duration of a valid authentication | ExpirationEvaluator SPI | | |</p>
+<h2 id="part-2_1">Part 2</h2>
+<p>|| Feature || Comments || Objections || Discussion finished ||
+| Object level permission | | | |
+| Grant or revoke permissions | | | |
+| Basic Roles and groups API | optional type-safe (-&gt; static) groups (and roles) | | |
+| @SecurityMethodBinding | | | |
+| Super-users | | | |
+| User/Identity management | | | |
+| Password-Hash-Service | | | |
+| Group management | optional support for typ-safe groups/group-types | | |</p>
+<h2 id="part-3_1">Part 3</h2>
+<p>|| Feature || Comments || Objections || Discussion finished ||
+| Support for deputies (see Impersonalization) | | | |
+| Privileges concept | | | |
+| UI SPI (Component based authorization) | add optional type-safe authorization; integration with JSF | | |
+| Permissions of resources | Merge with CODI view-configs,... | | |
+| Persistence SPI | integration with JPA | | |
+| Identity Store SPI | | | |
+| Query API | | | |
+| Application roles | | | |</p>
+<h2 id="part-4_1">Part 4</h2>
+<p>|| Feature || Comments || Objections || Discussion finished ||
+| Support of alternative authentication concepts | Extend the Authentication SPI | | |
+| Integration with  authentication concepts of (application-) servers | Extend the Authentication SPI | | |
+| Personalization | | | |
+| Alternatives for roles/groups | | | |
+| Permission for external applications | | | |</p>
+<h1 id="use-cases_1">Use-cases</h1>
+<h2 id="authentication">Authentication</h2>
+<h3 id="scenario_1">Scenario</h3>
+<p>The user must be able to log in by supplying a username and password</p>
+<p>Example JSF code:</p>
+<div class="codehilite"><pre><span class="n">Username:</span> <span class="o">&lt;</span><span class="n">h:inputText</span> <span class="n">value</span><span class="o">=</span><span class="s">&quot;#{credentials.username}&quot;</span><span class="o">/&gt;</span>
+<span class="n">Password:</span> <span class="o">&lt;</span><span class="n">h:inputSecret</span> <span class="n">id</span><span class="o">=</span><span class="s">&quot;password&quot;</span> <span class="n">value</span><span class="o">=</span><span class="s">&quot;#{credentials.password}&quot;</span><span class="o">/&gt;</span>
+<span class="o">&lt;</span><span class="n">h:commandButton</span> <span class="n">value</span><span class="o">=</span><span class="s">&quot;LOGIN&quot;</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;#{identity.login}&quot;</span><span class="o">/&gt;</span>
+</pre></div>
+
+
+<h3 id="scenario_2">Scenario</h3>
+<p>The user must be able to log out</p>
+<p>Example JSF codee</p>
+<div class="codehilite"><pre><span class="o">&lt;</span><span class="n">h:commandButton</span> <span class="n">value</span><span class="o">=</span><span class="s">&quot;LOGOUT&quot;</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;#{identity.logout}&quot;</span><span class="o">/&gt;</span>
+</pre></div>
+
+
+<h3 id="scenario_3">Scenario</h3>
+<p>The developer must be able to easily implement their own custom authentication logic using a provided SPI</p>
+<p>Example</p>

[... 382 lines stripped ...]