Added: 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/shCore.js
URL: 
http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/shCore.js?rev=1454063&view=auto
==============================================================================
--- 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/shCore.js
 (added)
+++ 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/shCore.js
 Thu Mar  7 20:00:30 2013
@@ -0,0 +1,622 @@
+/**
+ * Code Syntax Highlighter.
+ * Version 1.3.0
+ * Copyright (C) 2004 Alex Gorbatchev.
+ * http://www.dreamprojections.com/syntaxhighlighter/
+ * 
+ * This library is free software; you can redistribute it and/or modify it 
under the terms of the GNU Lesser General 
+ * Public License as published by the Free Software Foundation; either version 
2.1 of the License, or (at your option) 
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT 
ANY WARRANTY; without even the implied 
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
GNU Lesser General Public License for more 
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License 
along with this library; if not, write to 
+ * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 
02111-1307 USA 
+ */
+
+//
+// create namespaces
+//
+var dp = {
+       sh :                                    // dp.sh
+       {
+               Utils   : {},           // dp.sh.Utils
+               Brushes : {},           // dp.sh.Brushes
+               Strings : {},
+               Version : '1.3.0'
+       }
+};
+
+dp.sh.Strings = {
+       AboutDialog : '<html><head><title>About...</title></head><body 
class="dp-about"><table cellspacing="0"><tr><td class="copy"><p 
class="title">dp.SyntaxHighlighter</div><div class="para">Version: {V}</p><p><a 
href="http://www.dreamprojections.com/syntaxhighlighter/?ref=about"; 
target="_blank">http://www.dreamprojections.com/SyntaxHighlighter</a></p>&copy;2004-2005
 Alex Gorbatchev. All right reserved.</td></tr><tr><td class="footer"><input 
type="button" class="close" value="OK" 
onClick="window.close()"/></td></tr></table></body></html>',
+       
+       // tools
+       ExpandCode : '+ expand code',
+       ViewPlain : 'view plain',
+       Print : 'print',
+       CopyToClipboard : 'copy to clipboard',
+       About : '?',
+       
+       CopiedToClipboard : 'The code is in your clipboard now.'
+};
+
+dp.SyntaxHighlighter = dp.sh;
+
+//
+// Dialog and toolbar functions
+//
+
+dp.sh.Utils.Expand = function(sender)
+{
+       var table = sender;
+       var span = sender;
+
+       // find the span in which the text label and pipe contained so we can 
hide it
+       while(span != null && span.tagName != 'SPAN')
+               span = span.parentNode;
+
+       // find the table
+       while(table != null && table.tagName != 'TABLE')
+               table = table.parentNode;
+       
+       // remove the 'expand code' button
+       span.parentNode.removeChild(span);
+       
+       table.tBodies[0].className = 'show';
+       table.parentNode.style.height = '100%'; // containing div isn't getting 
updated properly when the TBODY is shown
+}
+
+// opens a new windows and puts the original unformatted source code inside.
+dp.sh.Utils.ViewSource = function(sender)
+{
+       var code = sender.parentNode.originalCode;
+       var wnd = window.open('', '_blank', 'width=750, height=400, location=0, 
resizable=1, menubar=0, scrollbars=1');
+       
+       code = code.replace(/</g, '&lt;');
+       
+       wnd.document.write('<pre>' + code + '</pre>');
+       wnd.document.close();
+}
+
+// copies the original source code in to the clipboard (IE only)
+dp.sh.Utils.ToClipboard = function(sender)
+{
+       var code = sender.parentNode.originalCode;
+       
+       // This works only for IE. There's a way to make it work with Mozilla 
as well,
+       // but it requires security settings changed on the client, which isn't 
by
+       // default, so 99% of users won't have it working anyways.
+       if(window.clipboardData)
+       {
+               window.clipboardData.setData('text', code);
+               
+               alert(dp.sh.Strings.CopiedToClipboard);
+       }
+}
+
+// creates an invisible iframe, puts the original source code inside and 
prints it
+dp.sh.Utils.PrintSource = function(sender)
+{
+       var td          = sender.parentNode;
+       var code        = td.processedCode;
+       var iframe      = document.createElement('IFRAME');
+       var doc         = null;
+       var wnd         = 
+
+       // this hides the iframe
+       iframe.style.cssText = 'position:absolute; width:0px; height:0px; 
left:-5px; top:-5px;';
+       
+       td.appendChild(iframe);
+       
+       doc = iframe.contentWindow.document;
+       code = code.replace(/</g, '&lt;');
+       
+       doc.open();
+       doc.write('<pre>' + code + '</pre>');
+       doc.close();
+       
+       iframe.contentWindow.focus();
+       iframe.contentWindow.print();
+       
+       td.removeChild(iframe);
+}
+
+dp.sh.Utils.About = function()
+{
+       var wnd = window.open('', '_blank', 
'dialog,width=320,height=150,scrollbars=0');
+       var doc = wnd.document;
+       
+       var styles = document.getElementsByTagName('style');
+       var links = document.getElementsByTagName('link');
+       
+       doc.write(dp.sh.Strings.AboutDialog.replace('{V}', dp.sh.Version));
+       
+       // copy over ALL the styles from the parent page
+       for(var i = 0; i < styles.length; i++)
+               doc.write('<style>' + styles[i].innerHTML + '</style>');
+
+       for(var i = 0; i < links.length; i++)
+               if(links[i].rel.toLowerCase() == 'stylesheet')
+                       doc.write('<link type="text/css" rel="stylesheet" 
href="' + links[i].href + '"></link>');
+       
+       doc.close();
+       wnd.focus();
+}
+
+//
+// Match object
+//
+dp.sh.Match = function(value, index, css)
+{
+       this.value              = value;
+       this.index              = index;
+       this.length             = value.length;
+       this.css                = css;
+}
+
+//
+// Highlighter object
+//
+dp.sh.Highlighter = function()
+{
+       this.addGutter = true;
+       this.addControls = true;
+       this.collapse = false;
+       this.tabsToSpaces = true;
+}
+
+// static callback for the match sorting
+dp.sh.Highlighter.SortCallback = function(m1, m2)
+{
+       // sort matches by index first
+       if(m1.index < m2.index)
+               return -1;
+       else if(m1.index > m2.index)
+               return 1;
+       else
+       {
+               // if index is the same, sort by length
+               if(m1.length < m2.length)
+                       return -1;
+               else if(m1.length > m2.length)
+                       return 1;
+       }
+       return 0;
+}
+
+// gets a list of all matches for a given regular expression
+dp.sh.Highlighter.prototype.GetMatches = function(regex, css)
+{
+       var index = 0;
+       var match = null;
+
+       while((match = regex.exec(this.code)) != null)
+       {
+               this.matches[this.matches.length] = new dp.sh.Match(match[0], 
match.index, css);
+       }
+}
+
+dp.sh.Highlighter.prototype.AddBit = function(str, css)
+{
+       var span = document.createElement('span');
+       
+       str = str.replace(/&/g, '&amp;');
+       str = str.replace(/ /g, '&nbsp;');
+       str = str.replace(/</g, '&lt;');
+       str = str.replace(/\n/gm, '&nbsp;<br>');
+
+       // when adding a piece of code, check to see if it has line breaks in 
it 
+       // and if it does, wrap individual line breaks with span tags
+       if(css != null)
+       {
+               var regex = new RegExp('<br>', 'gi');
+               
+               if(regex.test(str))
+               {
+                       var lines = str.split('&nbsp;<br>');
+                       
+                       str = '';
+                       
+                       for(var i = 0; i < lines.length; i++)
+                       {
+                               span                    = 
document.createElement('SPAN');
+                               span.className  = css;
+                               span.innerHTML  = lines[i];
+                               
+                               this.div.appendChild(span);
+                               
+                               // don't add a <BR> for the last line
+                               if(i + 1 < lines.length)
+                                       
this.div.appendChild(document.createElement('BR'));
+                       }
+               }
+               else
+               {
+                       span.className = css;
+                       span.innerHTML = str;
+                       this.div.appendChild(span);
+               }
+       }
+       else
+       {
+               span.innerHTML = str;
+               this.div.appendChild(span);
+       }
+}
+
+// checks if one match is inside any other match
+dp.sh.Highlighter.prototype.IsInside = function(match)
+{
+       if(match == null || match.length == 0)
+               return;
+       
+       for(var i = 0; i < this.matches.length; i++)
+       {
+               var c = this.matches[i];
+               
+               if(c == null)
+                       continue;
+               
+               if((match.index > c.index) && (match.index <= c.index + 
c.length))
+                       return true;
+       }
+       
+       return false;
+}
+
+dp.sh.Highlighter.prototype.ProcessRegexList = function()
+{
+       for(var i = 0; i < this.regexList.length; i++)
+               this.GetMatches(this.regexList[i].regex, this.regexList[i].css);
+}
+
+dp.sh.Highlighter.prototype.ProcessSmartTabs = function(code)
+{
+       var lines       = code.split('\n');
+       var result      = '';
+       var tabSize     = 4;
+       var tab         = '\t';
+
+       // This function inserts specified amount of spaces in the string
+       // where a tab is while removing that given tab. 
+       function InsertSpaces(line, pos, count)
+       {
+               var left        = line.substr(0, pos);
+               var right       = line.substr(pos + 1, line.length);    // pos 
+ 1 will get rid of the tab
+               var spaces      = '';
+               
+               for(var i = 0; i < count; i++)
+                       spaces += ' ';
+               
+               return left + spaces + right;
+       }
+
+       // This function process one line for 'smart tabs'
+       function ProcessLine(line, tabSize)
+       {
+               if(line.indexOf(tab) == -1)
+                       return line;
+
+               var pos = 0;
+
+               while((pos = line.indexOf(tab)) != -1)
+               {
+                       // This is pretty much all there is to the 'smart tabs' 
logic.
+                       // Based on the position within the line and size of a 
tab, 
+                       // calculate the amount of spaces we need to insert.
+                       var spaces = tabSize - pos % tabSize;
+                       
+                       line = InsertSpaces(line, pos, spaces);
+               }
+               
+               return line;
+       }
+
+       // Go through all the lines and do the 'smart tabs' magic.
+       for(var i = 0; i < lines.length; i++)
+               result += ProcessLine(lines[i], tabSize) + '\n';
+       
+       return result;
+}
+
+dp.sh.Highlighter.prototype.SwitchToTable = function()
+{
+       // thanks to Lachlan Donald from SitePoint.com for this <br/> tag fix.
+       var html        = this.div.innerHTML.replace(/<(br)\/?>/gi, '\n');
+       var lines       = html.split('\n');
+       var row         = null;
+       var cell        = null;
+       var tBody       = null;
+       var html        = '';
+       var pipe        = ' | ';
+
+       // creates an anchor to a utility
+       function UtilHref(util, text)
+       {
+               return '<a href="#" onclick="dp.sh.Utils.' + util + '(this); 
return false;">' + text + '</a>';
+       }
+       
+       tBody = document.createElement('TBODY');        // can be created and 
all others go to tBodies collection.
+
+       this.table.appendChild(tBody);
+               
+       if(this.addGutter == true)
+       {
+               row = tBody.insertRow(-1);
+               cell = row.insertCell(-1);
+               cell.className = 'tools-corner';
+       }
+
+       if(this.addControls == true)
+       {
+               var tHead = document.createElement('THEAD');    // controls 
will be placed in here
+               this.table.appendChild(tHead);
+
+               row = tHead.insertRow(-1);
+
+               // add corner if there's a gutter
+               if(this.addGutter == true)
+               {
+                       cell = row.insertCell(-1);
+                       cell.className = 'tools-corner';
+               }
+               
+               cell = row.insertCell(-1);
+               
+               // preserve some variables for the controls
+               cell.originalCode = this.originalCode;
+               cell.processedCode = this.code;
+               cell.className = 'tools';
+               
+               if(this.collapse == true)
+               {
+                       tBody.className = 'hide';
+                       cell.innerHTML += '<span><b>' + UtilHref('Expand', 
dp.sh.Strings.ExpandCode) + '</b>' + pipe + '</span>';
+               }
+
+               cell.innerHTML += UtilHref('ViewSource', 
dp.sh.Strings.ViewPlain) + pipe + UtilHref('PrintSource', dp.sh.Strings.Print);
+               
+               // IE has this clipboard object which is easy enough to use
+               if(window.clipboardData)
+                       cell.innerHTML += pipe + UtilHref('ToClipboard', 
dp.sh.Strings.CopyToClipboard);
+               
+               cell.innerHTML += pipe + UtilHref('About', dp.sh.Strings.About);
+       }
+
+       for(var i = 0, lineIndex = this.firstLine; i < lines.length - 1; i++, 
lineIndex++)
+       {
+               row = tBody.insertRow(-1);
+               
+               if(this.addGutter == true)
+               {
+                       cell = row.insertCell(-1);
+                       cell.className = 'gutter';
+                       cell.innerHTML = lineIndex;
+               }
+
+               cell = row.insertCell(-1);
+               cell.className = 'line' + (i % 2 + 1);          // uses .line1 
and .line2 css styles for alternating lines
+               cell.innerHTML = lines[i];
+       }
+       
+       this.div.innerHTML      = '';
+}
+
+dp.sh.Highlighter.prototype.Highlight = function(code)
+{
+       function Trim(str)
+       {
+               return str.replace(/^\s*(.*?)[\s\n]*$/g, '$1');
+       }
+       
+       function Chop(str)
+       {
+               return str.replace(/\n*$/, '').replace(/^\n*/, '');
+       }
+
+       function Unindent(str)
+       {
+               var lines = str.split('\n');
+               var indents = new Array();
+               var regex = new RegExp('^\\s*', 'g');
+               var min = 1000;
+
+               // go through every line and check for common number of indents
+               for(var i = 0; i < lines.length && min > 0; i++)
+               {
+                       if(Trim(lines[i]).length == 0)
+                               continue;
+                               
+                       var matches = regex.exec(lines[i]);
+
+                       if(matches != null && matches.length > 0)
+                               min = Math.min(matches[0].length, min);
+               }
+
+               // trim minimum common number of white space from the begining 
of every line
+               if(min > 0)
+                       for(var i = 0; i < lines.length; i++)
+                               lines[i] = lines[i].substr(min);
+
+               return lines.join('\n');
+       }
+       
+       // This function returns a portions of the string from pos1 to pos2 
inclusive
+       function Copy(string, pos1, pos2)
+       {
+               return string.substr(pos1, pos2 - pos1);
+       }
+
+       var pos = 0;
+       
+       this.originalCode = code;
+       this.code = Chop(Unindent(code));
+       this.div = document.createElement('DIV');
+       this.table = document.createElement('TABLE');
+       this.matches = new Array();
+
+       if(this.CssClass != null)
+               this.table.className = this.CssClass;
+
+       // replace tabs with spaces
+       if(this.tabsToSpaces == true)
+               this.code = this.ProcessSmartTabs(this.code);
+
+       this.table.border = 0;
+       this.table.cellSpacing = 0;
+       this.table.cellPadding = 0;
+
+       this.ProcessRegexList();        
+
+       // if no matches found, add entire code as plain text
+       if(this.matches.length == 0)
+       {
+               this.AddBit(this.code, null);
+               this.SwitchToTable();
+               return;
+       }
+
+       // sort the matches
+       this.matches = this.matches.sort(dp.sh.Highlighter.SortCallback);
+
+       // The following loop checks to see if any of the matches are inside
+       // of other matches. This process would get rid of highligting strings
+       // inside comments, keywords inside strings and so on.
+       for(var i = 0; i < this.matches.length; i++)
+               if(this.IsInside(this.matches[i]))
+                       this.matches[i] = null;
+
+       // Finally, go through the final list of matches and pull the all
+       // together adding everything in between that isn't a match.
+       for(var i = 0; i < this.matches.length; i++)
+       {
+               var match = this.matches[i];
+
+               if(match == null || match.length == 0)
+                       continue;
+               
+               this.AddBit(Copy(this.code, pos, match.index), null);
+               this.AddBit(match.value, match.css);
+               
+               pos = match.index + match.length;
+       }
+       
+       this.AddBit(this.code.substr(pos), null);
+
+       this.SwitchToTable();
+}
+
+dp.sh.Highlighter.prototype.GetKeywords = function(str) 
+{
+       return '\\b' + str.replace(/ /g, '\\b|\\b') + '\\b';
+}
+
+// highlightes all elements identified by name and gets source code from 
specified property
+dp.sh.HighlightAll = function(name, showGutter /* optional */, showControls /* 
optional */, collapseAll /* optional */, firstLine /* optional */)
+{
+       function FindValue()
+       {
+               var a = arguments;
+               
+               for(var i = 0; i < a.length; i++)
+               {
+                       if(a[i] == null)
+                               continue;
+                               
+                       if(typeof(a[i]) == 'string' && a[i] != '')
+                               return a[i] + '';
+               
+                       if(typeof(a[i]) == 'object' && a[i].value != '')
+                               return a[i].value + '';
+               }
+               
+               return null;
+       }
+       
+       function IsOptionSet(value, list)
+       {
+               for(var i = 0; i < list.length; i++)
+                       if(list[i] == value)
+                               return true;
+               
+               return false;
+       }
+       
+       function GetOptionValue(name, list, defaultValue)
+       {
+               var regex = new RegExp('^' + name + '\\[(\\w+)\\]$', 'gi');
+               var matches = null;
+
+               for(var i = 0; i < list.length; i++)
+                       if((matches = regex.exec(list[i])) != null)
+                               return matches[1];
+               
+               return defaultValue;
+       }
+
+       var elements = document.getElementsByName(name);
+       var highlighter = null;
+       var registered = new Object();
+       var propertyName = 'value';
+       
+       // if no code blocks found, leave
+       if(elements == null)
+               return;
+
+       // register all brushes
+       for(var brush in dp.sh.Brushes)
+       {
+               var aliases = dp.sh.Brushes[brush].Aliases;
+               
+               if(aliases == null)
+                       continue;
+               
+               for(var i = 0; i < aliases.length; i++)
+                       registered[aliases[i]] = brush;
+       }
+
+       for(var i = 0; i < elements.length; i++)
+       {
+               var element = elements[i];
+               var options = FindValue(
+                               element.attributes['class'], element.className, 
+                               element.attributes['language'], element.language
+                               );
+               var language = '';
+               
+               if(options == null)
+                       continue;
+               
+               options = options.split(':');
+               
+               language = options[0].toLowerCase();
+               
+               if(registered[language] == null)
+                       continue;
+               
+               // instantiate a brush
+               highlighter = new dp.sh.Brushes[registered[language]]();
+               
+               // hide the original element
+               element.style.display = 'none';
+
+               highlighter.addGutter = (showGutter == null) ? 
!IsOptionSet('nogutter', options) : showGutter;
+               highlighter.addControls = (showControls == null) ? 
!IsOptionSet('nocontrols', options) : showControls;
+               highlighter.collapse = (collapseAll == null) ? 
IsOptionSet('collapse', options) : collapseAll;
+               
+               // first line idea comes from Andrew Collington, thanks!
+               highlighter.firstLine = (firstLine == null) ? 
parseInt(GetOptionValue('firstline', options, 1)) : firstLine;
+
+               highlighter.Highlight(element[propertyName]);
+
+               // place the result table inside a div
+               var div = document.createElement('DIV');
+               
+               div.className = 'dp-highlighter';
+               div.appendChild(highlighter.table);
+
+               element.parentNode.insertBefore(div, element);          
+       }       
+}

Added: 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/site.css
URL: 
http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/site.css?rev=1454063&view=auto
==============================================================================
--- 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/site.css
 (added)
+++ 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/site.css
 Thu Mar  7 20:00:30 2013
@@ -0,0 +1,25 @@
+/* @override http://felix.apache.org/site/media.data/site.css */
+
+body { background-color: #ffffff; color: #3b3b3b; font-family: Tahoma, Arial, 
sans-serif; font-size: 10pt; line-height: 140% }
+h1, h2, h3, h4, h5, h6 { font-weight: normal; color: #000000; line-height: 
100%; margin-top: 0px}
+h1 { font-size: 200% }
+h2 { font-size: 175% }
+h3 { font-size: 150% }
+h4 { font-size: 140% }
+h5 { font-size: 130% }
+h6 { font-size: 120% }
+a { color: #1980af }
+a:visited { color: #1980af }
+a:hover { color: #1faae9 }
+.title { position: absolute; left: 1px; right: 1px; top:25px; height: 81px; 
background: url(http://felix.apache.org/site/media.data/gradient.png) repeat-x; 
background-position: bottom; }
+.logo { position: absolute; width: 15em; height: 81px; text-align: center; }
+.header { text-align: right; margin-right: 20pt; margin-top: 30pt;}
+.menu { border-top: 10px solid #f9bb00; position: absolute; top: 107px; left: 
1px; width: 15em; bottom: 0px; padding: 0px; background-color: #fcfcfc }
+.menu ul { background-color: #fdf5d9; list-style: none; padding-left: 4em; 
margin-top: 0px; padding-top: 2em; padding-bottom: 2em; margin-left: 0px; 
color: #4a4a43}
+.menu a { text-decoration: none; color: #4a4a43 }
+.main { position: absolute; border-top: 10px solid #cde0ea; top: 107px; left: 
15em; right: 1px; margin-left: 2px; padding-right: 4em; padding-left: 1em; 
padding-top: 1em;}
+.code { background-color: #eeeeee; border: solid 1px black; padding: 0.5em }
+.code-keyword { color: #880000 }
+.code-quote { color: #008800 }
+.code-object { color: #0000dd }
+.code-java { margin: 0em }
\ No newline at end of file

Added: 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/superfish.js
URL: 
http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/superfish.js?rev=1454063&view=auto
==============================================================================
--- 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/superfish.js
 (added)
+++ 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/superfish.js
 Thu Mar  7 20:00:30 2013
@@ -0,0 +1,121 @@
+
+/*
+ * Superfish v1.4.8 - jQuery menu widget
+ * Copyright (c) 2008 Joel Birch
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *     http://www.opensource.org/licenses/mit-license.php
+ *     http://www.gnu.org/licenses/gpl.html
+ *
+ * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
+ */
+
+;(function($){
+       $.fn.superfish = function(op){
+
+               var sf = $.fn.superfish,
+                       c = sf.c,
+                       $arrow = $(['<span class="',c.arrowClass,'"> 
&#187;</span>'].join('')),
+                       over = function(){
+                               var $$ = $(this), menu = getMenu($$);
+                               clearTimeout(menu.sfTimer);
+                               
$$.showSuperfishUl().siblings().hideSuperfishUl();
+                       },
+                       out = function(){
+                               var $$ = $(this), menu = getMenu($$), o = sf.op;
+                               clearTimeout(menu.sfTimer);
+                               menu.sfTimer=setTimeout(function(){
+                                       
o.retainPath=($.inArray($$[0],o.$path)>-1);
+                                       $$.hideSuperfishUl();
+                                       if (o.$path.length && 
$$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
+                               },o.delay);     
+                       },
+                       getMenu = function($menu){
+                               var menu = 
$menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
+                               sf.op = sf.o[menu.serial];
+                               return menu;
+                       },
+                       addArrow = function($a){ 
$a.addClass(c.anchorClass).append($arrow.clone()); };
+                       
+               return this.each(function() {
+                       var s = this.serial = sf.o.length;
+                       var o = $.extend({},sf.defaults,op);
+                       o.$path = 
$('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
+                               
$(this).addClass([o.hoverClass,c.bcClass].join(' '))
+                                       
.filter('li:has(ul)').removeClass(o.pathClass);
+                       });
+                       sf.o[s] = sf.op = o;
+                       
+                       $('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) 
? 'hoverIntent' : 'hover'](over,out).each(function() {
+                               if (o.autoArrows) addArrow( 
$('>a:first-child',this) );
+                       })
+                       .not('.'+c.bcClass)
+                               .hideSuperfishUl();
+                       
+                       var $a = $('a',this);
+                       $a.each(function(i){
+                               var $li = $a.eq(i).parents('li');
+                               
$a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
+                       });
+                       o.onInit.call(this);
+                       
+               }).each(function() {
+                       var menuClasses = [c.menuClass];
+                       if (sf.op.dropShadows  && !($.browser.msie && 
$.browser.version < 7)) menuClasses.push(c.shadowClass);
+                       $(this).addClass(menuClasses.join(' '));
+               });
+       };
+
+       var sf = $.fn.superfish;
+       sf.o = [];
+       sf.op = {};
+       sf.IE7fix = function(){
+               var o = sf.op;
+               if ($.browser.msie && $.browser.version > 6 && o.dropShadows && 
o.animation.opacity!=undefined)
+                       this.toggleClass(sf.c.shadowClass+'-off');
+               };
+       sf.c = {
+               bcClass     : 'sf-breadcrumb',
+               menuClass   : 'sf-js-enabled',
+               anchorClass : 'sf-with-ul',
+               arrowClass  : 'sf-sub-indicator',
+               shadowClass : 'sf-shadow'
+       };
+       sf.defaults = {
+               hoverClass      : 'sfHover',
+               pathClass       : 'overideThisToUse',
+               pathLevels      : 1,
+               delay           : 800,
+               animation       : {opacity:'show'},
+               speed           : 'normal',
+               autoArrows      : true,
+               dropShadows : true,
+               disableHI       : false,                // true disables 
hoverIntent detection
+               onInit          : function(){}, // callback functions
+               onBeforeShow: function(){},
+               onShow          : function(){},
+               onHide          : function(){}
+       };
+       $.fn.extend({
+               hideSuperfishUl : function(){
+                       var o = sf.op,
+                               not = (o.retainPath===true) ? o.$path : '';
+                       o.retainPath = false;
+                       var $ul = 
$(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
+                                       
.find('>ul').hide().css('visibility','hidden');
+                       o.onHide.call($ul);
+                       return this;
+               },
+               showSuperfishUl : function(){
+                       var o = sf.op,
+                               sh = sf.c.shadowClass+'-off',
+                               $ul = this.addClass(o.hoverClass)
+                                       
.find('>ul:hidden').css('visibility','visible');
+                       sf.IE7fix.call($ul);
+                       o.onBeforeShow.call($ul);
+                       $ul.animate(o.animation,o.speed,function(){ 
sf.IE7fix.call($ul); o.onShow.call($ul); });
+                       return this;
+               }
+       });
+
+})(jQuery);

Added: 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/supersubs.js
URL: 
http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/supersubs.js?rev=1454063&view=auto
==============================================================================
--- 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/supersubs.js
 (added)
+++ 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/supersubs.js
 Thu Mar  7 20:00:30 2013
@@ -0,0 +1,90 @@
+
+/*
+ * Supersubs v0.2b - jQuery plugin
+ * Copyright (c) 2008 Joel Birch
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *     http://www.opensource.org/licenses/mit-license.php
+ *     http://www.gnu.org/licenses/gpl.html
+ *
+ *
+ * This plugin automatically adjusts submenu widths of suckerfish-style menus 
to that of
+ * their longest list item children. If you use this, please expect bugs and 
report them
+ * to the jQuery Google Group with the word 'Superfish' in the subject line.
+ *
+ */
+
+;(function($){ // $ will refer to jQuery within this closure
+
+       $.fn.supersubs = function(options){
+               var opts = $.extend({}, $.fn.supersubs.defaults, options);
+               // return original object to support chaining
+               return this.each(function() {
+                       // cache selections
+                       var $$ = $(this);
+                       // support metadata
+                       var o = $.meta ? $.extend({}, opts, $$.data()) : opts;
+                       // get the font size of menu.
+                       // .css('fontSize') returns various results 
cross-browser, so measure an em dash instead
+                       var fontsize = $('<li 
id="menu-fontsize">&#8212;</li>').css({
+                               'padding' : 0,
+                               'position' : 'absolute',
+                               'top' : '-999em',
+                               'width' : 'auto'
+                       }).appendTo($$).width(); //clientWidth is faster, but 
was incorrect here
+                       // remove em dash
+                       $('#menu-fontsize').remove();
+                       // cache all ul elements
+                       $ULs = $$.find('ul');
+                       // loop through each ul in menu
+                       $ULs.each(function(i) { 
+                               // cache this ul
+                               var $ul = $ULs.eq(i);
+                               // get all (li) children of this ul
+                               var $LIs = $ul.children();
+                               // get all anchor grand-children
+                               var $As = $LIs.children('a');
+                               // force content to one line and save current 
float property
+                               var liFloat = 
$LIs.css('white-space','nowrap').css('float');
+                               // remove width restrictions and floats so 
elements remain vertically stacked
+                               var emWidth = $ul.add($LIs).add($As).css({
+                                       'float' : 'none',
+                                       'width' : 'auto'
+                               })
+                               // this ul will now be shrink-wrapped to 
longest li due to position:absolute
+                               // so save its width as ems. Clientwidth is 2 
times faster than .width() - thanks Dan Switzer
+                               .end().end()[0].clientWidth / fontsize;
+                               // add more width to ensure lines don't turn 
over at certain sizes in various browsers
+                               emWidth += o.extraWidth;
+                               // restrict to at least minWidth and at most 
maxWidth
+                               if (emWidth > o.maxWidth)               { 
emWidth = o.maxWidth; }
+                               else if (emWidth < o.minWidth)  { emWidth = 
o.minWidth; }
+                               emWidth += 'em';
+                               // set ul to width in ems
+                               $ul.css('width',emWidth);
+                               // restore li floats to avoid IE bugs
+                               // set li width to full width of this ul
+                               // revert white-space to normal
+                               $LIs.css({
+                                       'float' : liFloat,
+                                       'width' : '100%',
+                                       'white-space' : 'normal'
+                               })
+                               // update offset position of descendant ul to 
reflect new width of parent
+                               .each(function(){
+                                       var $childUl = $('>ul',this);
+                                       var offsetDirection = 
$childUl.css('left')!==undefined ? 'left' : 'right';
+                                       $childUl.css(offsetDirection,emWidth);
+                               });
+                       });
+                       
+               });
+       };
+       // expose defaults
+       $.fn.supersubs.defaults = {
+               minWidth                : 9,            // requires em unit.
+               maxWidth                : 25,           // requires em unit.
+               extraWidth              : 0                     // extra width 
can ensure lines don't sometimes turn over due to slight browser differences in 
how they round-off values
+       };
+       
+})(jQuery); // plugin code ends

Added: 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/warning.gif
URL: 
http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/warning.gif?rev=1454063&view=auto
==============================================================================
Binary file - no diff available.

Propchange: 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/doc/white-board-pattern-handler_files/warning.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/metadata.xml
URL: 
http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/metadata.xml?rev=1454063&view=auto
==============================================================================
--- felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/metadata.xml (added)
+++ felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/metadata.xml Thu 
Mar  7 20:00:30 2013
@@ -0,0 +1,30 @@
+<!--
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+-->
+<ipojo>
+       <handler
+               
classname="org.apache.felix.ipojo.handler.wbp.WhiteBoardPatternHandler"
+               name="wbp" namespace="org.apache.felix.ipojo.whiteboard">
+       </handler>
+
+       <!-- Alternative handler for component using the @Whiteboards 
annotation -->
+       <handler
+               
classname="org.apache.felix.ipojo.handler.wbp.WhiteBoardPatternHandler"
+               name="whiteboards" 
namespace="org.apache.felix.ipojo.whiteboard">
+       </handler>
+</ipojo>
\ No newline at end of file

Added: felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/obr.xml
URL: 
http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/obr.xml?rev=1454063&view=auto
==============================================================================
--- felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/obr.xml (added)
+++ felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/obr.xml Thu Mar  7 
20:00:30 2013
@@ -0,0 +1,25 @@
+<!--
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+       
+       http://www.apache.org/licenses/LICENSE-2.0
+       
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+-->
+<obr>
+       <capability name="ipojo.handler">
+               <p n="name" v="wbp"/>
+               <p n="namespace" v="org.apache.felix.ipojo.whiteboard"/>
+               <p n="type" v="primitive"/>
+       </capability>
+</obr>
\ No newline at end of file

Added: felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/pom.xml
URL: 
http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/pom.xml?rev=1454063&view=auto
==============================================================================
--- felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/pom.xml (added)
+++ felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/pom.xml Thu Mar  7 
20:00:30 2013
@@ -0,0 +1,130 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+    <parent>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>felix-parent</artifactId>
+        <version>1.2.1</version>
+        <relativePath>../../../pom/pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <packaging>bundle</packaging>
+    <name>Apache Felix iPOJO White Board Pattern Handler</name>
+    <artifactId>org.apache.felix.ipojo.handler.whiteboard</artifactId>
+    <groupId>org.apache.felix</groupId>
+    <version>1.6.1-SNAPSHOT</version>
+
+    <description>
+        iPOJO extension to easily implement a white-board pattern (host).
+    </description>
+    <url>
+        http://felix.apache.org/site/white-board-pattern-handler.html
+    </url>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.ipojo</artifactId>
+            <version>1.6.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <version>4.0.0</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-Name>${project.name}</Bundle-Name>
+                        
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Bundle-Vendor>The Apache Software 
Foundation</Bundle-Vendor>
+                        <Bundle-Description>iPOJO White-Board Pattern Handler
+                        </Bundle-Description>
+                        <Bundle-DocURL>
+                            
http://felix.apache.org/site/white-board-pattern-handler.html
+                        </Bundle-DocURL>
+                        <Private-Package>org.apache.felix.ipojo.handler.wbp
+                        </Private-Package>
+                        <Bundle-Name>${project.name}</Bundle-Name>
+                        <Include-Resource>
+                            META-INF/LICENSE=LICENSE,
+                            META-INF/NOTICE=NOTICE,
+                            META-INF/DEPENDENCIES=DEPENDENCIES
+                        </Include-Resource>
+                    </instructions>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-ipojo-plugin</artifactId>
+                <version>1.6.0</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>ipojo-bundle</goal>
+                        </goals>
+                        <configuration>
+                            <metadata>metadata.xml</metadata>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>rat-maven-plugin</artifactId>
+                <configuration>
+                    <excludeSubProjects>false</excludeSubProjects>
+                    <useEclipseDefaultExcludes>true</useEclipseDefaultExcludes>
+                    <useMavenDefaultExcludes>true</useMavenDefaultExcludes>
+                    <excludes>
+                        <param>doc/**/*</param>
+                        <param>maven-eclipse.xml</param>
+                        <param>.checkstyle</param>
+                        <param>.externalToolBuilders/*</param>
+                        <param>LICENSE.asm</param>
+                    </excludes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-checkstyle-plugin</artifactId>
+                <configuration>
+                    <enableRulesSummary>false</enableRulesSummary>
+                    <violationSeverity>warning</violationSeverity>
+                    
<configLocation>http://felix.apache.org/ipojo/dev/checkstyle_ipojo.xml</configLocation>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <target>1.5</target>
+                    <source>1.5</source>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

Added: 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java?rev=1454063&view=auto
==============================================================================
--- 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java
 (added)
+++ 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java
 Thu Mar  7 20:00:30 2013
@@ -0,0 +1,176 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.handler.wbp;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.felix.ipojo.PrimitiveHandler;
+import org.apache.felix.ipojo.util.Callback;
+import org.apache.felix.ipojo.util.Tracker;
+import org.apache.felix.ipojo.util.TrackerCustomizer;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Manage a white board pattern.
+ * @author <a href="mailto:[email protected]";>Felix Project Team</a>
+ */
+public class WhiteBoardManager implements TrackerCustomizer {
+
+    /**
+     * The monitored filter.
+     */
+    private Filter m_filter;
+
+    /**
+     * The onArrival method.
+     */
+    private Callback m_onArrival;
+
+    /**
+     * The onDeparture method.
+     */
+    private Callback m_onDeparture;
+
+    /**
+     * The onModify method.
+     */
+    private Callback m_onModification;
+
+    /**
+     * The service tracker.
+     */
+    private Tracker m_tracker;
+
+    /**
+     * The attached handler.
+     */
+    private PrimitiveHandler m_handler;
+
+    /**
+     * Constructor.
+     * @param handler the attached handler
+     * @param filter the monitored filter
+     * @param bind the onArrival method
+     * @param unbind the onDeparture method
+     * @param modification the onModify method
+     */
+    public WhiteBoardManager(WhiteBoardPatternHandler handler, Filter filter, 
String bind, String unbind, String modification) {
+        m_handler = handler;
+        m_onArrival = new Callback(bind, new Class[] {ServiceReference.class}, 
false, m_handler.getInstanceManager());
+        m_onDeparture = new Callback(unbind, new Class[] 
{ServiceReference.class}, false, m_handler.getInstanceManager());
+        if (modification != null) {
+            m_onModification = new Callback(modification, new Class[] 
{ServiceReference.class}, false, m_handler.getInstanceManager());
+        }
+        m_filter = filter;
+        m_tracker = new Tracker(handler.getInstanceManager().getContext(), 
m_filter, this);
+    }
+
+
+
+    /**
+     * Opens the tracker.
+     */
+    public void start() {
+       // Calling several times open is no-effect.
+        m_tracker.open();
+    }
+
+    /**
+     * Closes the tracker.
+     */
+    public void stop() {
+        m_tracker.close();
+    }
+
+    /**
+     * A new service was added to the tracker.
+     * @param arg0 the service reference.
+     * @see 
org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
+     */
+    public void addedService(ServiceReference arg0) {
+        try {
+            m_onArrival.call(new Object[] {arg0});
+        } catch (NoSuchMethodException e) {
+            m_handler.error("The onArrival method " + m_onArrival.getMethod() 
+ " does not exist in the class", e);
+            m_handler.getInstanceManager().stop();
+        } catch (IllegalAccessException e) {
+            m_handler.error("The onArrival method " + m_onArrival.getMethod() 
+ " cannot be invoked", e);
+            m_handler.getInstanceManager().stop();
+        } catch (InvocationTargetException e) {
+            m_handler.error("The onArrival method " + m_onArrival.getMethod() 
+ " has thrown an exception", e.getTargetException());
+            m_handler.getInstanceManager().stop();
+        }
+    }
+
+    /**
+     * A new service is detected.
+     * @param arg0 the service reference
+     * @return {@code true} to add the service.
+     * @see 
org.apache.felix.ipojo.util.TrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
+     */
+    public boolean addingService(ServiceReference arg0) {
+        return true;
+    }
+
+    /**
+     * An existing service was modified.
+     * @param arg0 the service reference
+     * @param arg1 the service object (if already get)
+     * @see 
org.apache.felix.ipojo.util.TrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference,
 java.lang.Object)
+     */
+    public void modifiedService(ServiceReference arg0, Object arg1) {
+        if (m_onModification != null) {
+            try {
+                m_onModification.call(new Object[] {arg0});
+            } catch (NoSuchMethodException e) {
+                m_handler.error("The onModification method " + 
m_onModification.getMethod() + " does not exist in the class", e);
+                m_handler.getInstanceManager().stop();
+            } catch (IllegalAccessException e) {
+                m_handler.error("The onModification method " + 
m_onModification.getMethod() + " cannot be invoked", e);
+                m_handler.getInstanceManager().stop();
+            } catch (InvocationTargetException e) {
+                m_handler.error("The onModification method " + 
m_onModification.getMethod() + " has thrown an exception", 
e.getTargetException());
+                m_handler.getInstanceManager().stop();
+            }
+        }
+    }
+
+    /**
+     * A service disappears.
+     * @param arg0 the service reference
+     * @param arg1 the service object (if already get)
+     * @see 
org.apache.felix.ipojo.util.TrackerCustomizer#removedService(org.osgi.framework.ServiceReference,
 java.lang.Object)
+     */
+    public void removedService(ServiceReference arg0, Object arg1) {
+        try {
+            m_onDeparture.call(new Object[] {arg0});
+        } catch (NoSuchMethodException e) {
+            m_handler.error("The onDeparture method " + 
m_onDeparture.getMethod() + " does not exist in the class", e);
+            m_handler.getInstanceManager().stop();
+        } catch (IllegalAccessException e) {
+            m_handler.error("The onDeparture method " + 
m_onDeparture.getMethod() + " cannot be invoked", e);
+            m_handler.getInstanceManager().stop();
+        } catch (InvocationTargetException e) {
+            m_handler.error("The onDeparture method " + 
m_onDeparture.getMethod() + " has thrown an exception", e.getTargetException());
+            m_handler.getInstanceManager().stop();
+        }
+    }
+
+}

Added: 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java?rev=1454063&view=auto
==============================================================================
--- 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java
 (added)
+++ 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java
 Thu Mar  7 20:00:30 2013
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.handler.wbp;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.PrimitiveHandler;
+import org.apache.felix.ipojo.metadata.Element;
+import org.osgi.framework.InvalidSyntaxException;
+
+/**
+ * White board pattern handler.
+ * This handler aims to automate white board patterns by invoking callback 
when needed.
+ * @author <a href="mailto:[email protected]";>Felix Project Team</a>
+ */
+public class WhiteBoardPatternHandler extends PrimitiveHandler {
+
+    /**
+     * The handler namespace.
+     */
+    public static final String NAMESPACE = "org.apache.felix.ipojo.whiteboard";
+
+    /**
+     * The white board pattern to manage. By default just one.
+     */
+    private List m_managers = new ArrayList(1);
+
+    /**
+     * Configure method. Parses the metadata to analyze white-board-pattern 
elements.
+     * @param elem the component type description
+     * @param dict the instance description
+     * @throws ConfigurationException if the description is not valid.
+     * @see 
org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.metadata.Element,
 java.util.Dictionary)
+     */
+    public void configure(Element elem, Dictionary dict) throws 
ConfigurationException {
+
+       // There is two way to configure the handler :
+       // - the wbp elements
+       // - the whiteboards elements
+        Element[] elems = elem.getElements("wbp", NAMESPACE);
+
+        if (elems == null  || elems.length == 0) {
+               // Alternative way
+               Element[] whiteboards = elem.getElements("whiteboards", 
NAMESPACE);
+               if (whiteboards == null) {
+                       throw new ConfigurationException("Cannot configure the 
whiteboard pattern handler - no suitable configuration found");
+               } else {
+                       elems = whiteboards[0].getElements("wbp", NAMESPACE);
+               }
+        }
+
+        // Last check.
+        if (elems == null) {
+               throw new ConfigurationException("Cannot configure the 
whiteboard pattern handler - no suitable configuration found");
+        }
+
+        for (int i = 0; i < elems.length; i++) {
+            String filter = elems[i].getAttribute("filter");
+            String onArrival = elems[i].getAttribute("onArrival");
+            String onDeparture = elems[i].getAttribute("onDeparture");
+            String onModification = elems[i].getAttribute("onModification");
+
+            if (filter == null) {
+                throw new ConfigurationException("The white board pattern 
element requires a filter attribute");
+            }
+            if (onArrival == null || onDeparture == null) {
+                throw new ConfigurationException("The white board pattern 
element requires the onArrival and onDeparture attributes");
+            }
+
+            try {
+                WhiteBoardManager wbm = new WhiteBoardManager(this, 
getInstanceManager().getContext().createFilter(filter), onArrival, onDeparture, 
onModification);
+                m_managers.add(wbm);
+            } catch (InvalidSyntaxException e) {
+                throw new ConfigurationException("The filter " + filter + " is 
invalid : " + e);
+            }
+        }
+
+    }
+
+    /**
+     * Start method.
+     * @see org.apache.felix.ipojo.Handler#start()
+     */
+    public void start() {
+    }
+
+
+
+    /**
+     * Start managers if we're valid.
+     * @see org.apache.felix.ipojo.Handler#stateChanged(int)
+     */
+    public void stateChanged(int state) {
+               if (state == ComponentInstance.VALID) {
+                       for (int i = 0; i < m_managers.size(); i++) {
+                   ((WhiteBoardManager) m_managers.get(i)).start();
+               }
+               }
+       }
+
+       /**
+     * Stop method. Stops managers.
+     * @see org.apache.felix.ipojo.Handler#stop()
+     */
+    public void stop() {
+        for (int i = 0; i < m_managers.size(); i++) {
+            ((WhiteBoardManager) m_managers.get(i)).stop();
+        }
+    }
+
+}

Added: 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/src/main/resources/whiteboard-pattern.xsd
URL: 
http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/src/main/resources/whiteboard-pattern.xsd?rev=1454063&view=auto
==============================================================================
--- 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/src/main/resources/whiteboard-pattern.xsd
 (added)
+++ 
felix/trunk/ipojo/handler/whiteboard/whiteboard-handler/src/main/resources/whiteboard-pattern.xsd
 Thu Mar  7 20:00:30 2013
@@ -0,0 +1,45 @@
+<!--
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+       
+       http://www.apache.org/licenses/LICENSE-2.0
+       
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+-->
+<xs:schema targetNamespace="org.apache.felix.ipojo.whiteboard"
+       xmlns="org.apache.felix.ipojo.whiteboard"
+       xmlns:xs="http://www.w3.org/2001/XMLSchema";
+       elementFormDefault="qualified">
+       <xs:element name="wbp" type="WBPType"></xs:element>
+       <xs:complexType name="WBPType">
+        <xs:annotation>
+               <xs:documentation>Description of the white-board 
architecture.</xs:documentation>
+        </xs:annotation>
+        <xs:attribute name="onArrival" type="xs:string" use="required">
+               <xs:annotation>
+                       <xs:documentation>Declaring the method to invoke when a 
matching service arrives.</xs:documentation>
+               </xs:annotation></xs:attribute>
+               <xs:attribute name="onDeparture" type="xs:string" 
use="required">
+                       <xs:annotation>
+                               <xs:documentation>Declaring the method to 
invoke when a matching service leaves.</xs:documentation>
+                       </xs:annotation></xs:attribute>
+               <xs:attribute name="onModification" type="xs:string" 
use="optional">
+                       <xs:annotation>
+                               <xs:documentation>Method called when an 
injected service reference is modified but stills valid against the 
filter.</xs:documentation>
+                       </xs:annotation></xs:attribute>
+               <xs:attribute name="filter" type="xs:string" use="required">
+                       <xs:annotation>
+                               <xs:documentation>Filter use to discover 
matching filter.</xs:documentation>
+                       </xs:annotation></xs:attribute>
+       </xs:complexType>       
+</xs:schema>
\ No newline at end of file


Reply via email to