<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}/* TiddlyWiki 2.6.0: http://trac.tiddlywiki.org/ticket/1126 */

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity=60)';}/* TiddlyWiki 2.5.1: http://trac.tiddlywiki.org/ticket/960 */
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}/* TiddlyWiki 2.5.1: http://trac.tiddlywiki.org/ticket/960 */
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see AdvancedOptions
<<importTiddlers>>
<html>
<iframe title="AdSense" width="122" height="242" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" src="adsense_120x240.html"></iframe>
</html>
!Description
This plugin is a hook for the administration application.
Contrary to the other plugin types, there is no notion of priority here, but of a unique identifier: the actionID.
!Included plugins
to be written... in the meantime, check package {{{clime.messadmin.admin}}}
!Extra plugins (not included in {{{MessAdmin-Core.jar}}})
* {{{MessAdmin-ScriptExecutor.jar}}} ({{{clime.messadmin.scripting.ScriptExecutor}}})
**	See ScriptExecutor
Depending on your container servlet version (see the [[FAQ|FAQ]] to know what your servlet version is), you can unlock additional MessAdmin features by following those advanced installation instructions. Please note that this is entirely optional!/%
%/
!Servlet 3.0 and >
By using the {{{MessAdmin-AutoProbe.jar}}} plugin, you will get the full MessAdmin experience without a single change in your {{{web.xml}}} (as long as your {{{web.xml}}} does //not// specify {{{metadata-complete="true"}}})!
You don't even need to copy the ~JSPs {{{MessAdmin}}} folder since it is included in {{{MessAdmin-Core.jar}}}!/%
%/
!Servlet 2.4/2.5
In addition to the {{{MessAdmin-AutoProbe.jar}}} plugin, adding the following Servlet Filter to your monitored applications' {{{WEB-INF/web.xml}}} will bring you those features:
* message sending
* outgoing network bandwith usage (HTTP response length)
* uncaught errors reporting
* HTTP response status codes (200, 404, 500, etc.)
{{{
<filter>
	<filter-name>MessAdminFilter</filter-name>
	<filter-class>clime.messadmin.filter.MessAdminFilter</filter-class>
</filter>

<filter-mapping>
	<filter-name>MessAdminFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
}}}
//Tip:// if using [[Tomcat|http://tomcat.apache.org/]], you can simply patch Tomcat's own {{{$CATALINA_HOME/conf/web.xml}}} instead of your applications'. This modification will be available to all applications deployed in this Tomcat instance!/%
%/
!Servlet 2.3
While we don't officially support Servlet 2.3-compliant containers, ~MessAdmin-Core is still compatible with this specification version.
You won't be able to use the AutoProbe plugin (make sure {{{MessAdmin-AutoProbe.jar}}} is //not// installed!), and will need to declare the MessAdmin Servlet Listener and Filter in your {{{web.xml}}}:
{{{
<filter>
	<filter-name>MessAdminFilter</filter-name>
	<filter-class>clime.messadmin.filter.MessAdminFilter</filter-class>
</filter>

<filter-mapping>
	<filter-name>MessAdminFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
	<listener-class>clime.messadmin.core.MessAdminListener</listener-class>
</listener>
}}}

Maybe now would be a good time to upgrade that application server&hellip; :-)
!Description
This plugin is a hook for exposing application-specific HTML data in the administration servlet. Should you want to expose tabular data, you can extend the abstract base class {{{clime.messadmin.providers.spi.BaseTabularApplicationDataProvider}}}.
All plugins of this type are run.
!Included plugins
* {{{clime.messadmin.providers.userdata.ServletContextInitParametersProvider}}}
**	Priority: 0
**	displaying {{{web.xml}}}'s {{{<context-param>}}} elements
* {{{clime.messadmin.providers.userdata.resourcebrowser.ResourceBrowser}}}
**	Priority: 10
**	Browse the content of your ~WebApp war, and download key files (e.g. configuration files)!
* {{{clime.messadmin.providers.userdata.ClassLoaderDisplayer}}}
**	Priority: 50
**	displaying the application's [[ClassLoader|http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html]]
!Extra plugins (not included in {{{MessAdmin-Core.jar}}})
* {{{MessAdmin-ServletStats.jar}}} ({{{clime.messadmin.providers.lifecycle.ServletStatsDisplayer}}})
**	See ServletStats
* {{{MessAdmin-Log4J.jar}}} ({{{clime.messadmin.providers.lifecycle.Log4JProvider}}})
**	See Log4J
* {{{MessAdmin-Ehcache.jar}}} ({{{clime.messadmin.providers.ehcache.EhCacheStatistics}}})
**	See [[Ehcache]]
!Description
This plugin is a hook for the lifecycle of the application.
All plugins of this type are run.
Note: the invocation order of Providers is reversed in case of application destruction.
!Included plugins
* {{{clime.messadmin.providers.lifecycle.EvilSingletonsUnregisterer}}}
**	Priority: {{{Integer.MAX_VALUE}}}
**	Takes care of deregistering (some of) the evil Singletons when the app shuts down, thereby avoiding (well, trying to avoid) OOM ({{{java.lang.OutOfMemoryError}}}) on hot restart...
***	core Java: {{{java.beans.Introspector.flushCaches();}}}
***	core Java: {{{java.util.ResourceBundle.clearCache();}}}
***	core Java: {{{java.sql.DriverManager.deregisterDriver(driversLoadedByThisContextClassLoader);}}}
***    [[MySQL Connector/J|http://dev.mysql.com/doc/refman/5.1/en/connector-j.html]] <= 5.1.10: {{{com.mysql.jdbc.ConnectionImpl.cancelTimer.cancel()}}}
***	[[commons-IO|http://commons.apache.org/io/]] 1.3+: {{{org.apache.commons.io.FileCleaner.exitWhenFinished();}}} (only if commons-IO is in {{{/WEB-INF/lib/}}})
***	[[commons-logging|http://commons.apache.org/logging/]] 1.0.4-: {{{org.apache.commons.logging.LogFactory.release(Thread.currentThread().getContextClassLoader());}}}
***	[[Log4J|http://logging.apache.org/log4j/]] 1.x: {{{org.apache.log4j.LogManager.shutdown();}}}
***	[[LogBack|http://logback.qos.ch/]] 1.x: {{{ch.qos.logback.classic.selector.servlet.ContextDetachingSCL().contextDestroyed(ServletContextEvent sce);}}}
* {{{clime.messadmin.providers.jmx.JMXProvider}}}
**	Priority: n/d
**	This plugin exposes MessAdmin data via [[JMX|Install-JMX]]./%

%/
!Extra plugins (not included in {{{MessAdmin-Core.jar}}})
* {{{MessAdmin-SessionKiller.jar}}} ({{{clime.messadmin.providers.lifecycle.TomcatSessionKiller}}})
**	Priority: n/d
**	Corrects a Tomcat bug whereby some expired [[HttpSession|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSession.html]] are never invalidated, by periodically (every 20 minutes) iterating over all [[HttpSessions|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSession.html]] and manually invalidating expired ones.
As an alternative to Java EE declarative security, the MessAdmin administration servlet can optionally require a password before granting access. Simply uncomment the {{{AuthorizationPassword}}} init-parameter in {{{web.xml}}} and set your password:
{{{
<servlet>
	<!-- MessAdmin Administration Servlet -->
	<servlet-name>MessAdminServlet</servlet-name>
	<servlet-class>clime.messadmin.admin.MessAdminServlet</servlet-class>
	<init-param>
		<param-name>AuthorizationPassword</param-name>
		<param-value>[SomePassword]</param-value>
	</init-param>
</servlet>
}}}
From there, you can either add a {{{?j_password=[your password]}}} in the first url, or wait to be requested an HTTP Access Authentication (use any user name).
Since version 5.0, MessAdmin has a much simplified probe installation procedure.
Note that you will still need to declare the MessAdmin administration servlet if monitoring a single application (i.e. not a whole server).
In addition to this AutoProbe plugin, you can unlock additional features by following some [[optional steps|Advanced installation]].
MessAdmin comes with a range a plugin types for you to [[extend|CreatePlugins]]:
* User-defined data
** UserNameProvider: fetch the user name for the current session
** LocaleProvider: fetch the user locale for the current session
** SessionDataProvider: expose your own session-related data
** ApplicationDataProvider: expose your own application-related data
** ServerDataProvider: expose your own server-related data
* Events
** RequestLifeCycleProvider: hook for request-level events
** RequestExceptionProvider: hook for reporting exceptions while processing a request
** SessionLifeCycleProvider: hook for session-level events
** ApplicationLifeCycleProvider: hook for application-level events
** ServerLifeCycleProvider: hook for server-level events
* Administration
** AdminActionProvider
* Miscellaneous
** SizeOfProvider
** SerializableProvider
MessAdmin brings you a lot of benefits. Please choose you profile:
* [[IT manager|ITManager]]
* [[developer|Developer]]
* [[system administrator|SystemAdministrator]]
P1, P2, P3: priority (must, may, won't fix)
S1, S2, S3: customer severity
----
~P2S2	1.1
{{{<script>}}} is injected after {{{<head>}}} tag (or end of page).
If {{{head}}} has attributes, or is written {{{<head >}}} (or any other combination), current alg. will break (default to end of html document).
We need to improve our "head" parser to understand blanks and attributes.
This will only affect XHTML applications with a non-IE browser.
Workaround: make sure all your pages have an {{{<head>}}} or {{{<HEAD>}}} string literal.
----
~P3S2	3.0
The workaround a Sun bug where some objects' size could not be computed is not complete: there are some cases where object sizing will fail (and display {{{-1}}}). Please report any instance.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5012949
----
~P3S2	3.0
CPU time count is not accurate with BEA Weblogic 8.1 (it is sometimes counted as 0). I believe this is a ~WebLogic bug.
This MessAdmin plugin re-creates the [[ClickStream|http://www.opensymphony.com/clickstream/]] monitoring utility.
Each session will log the last 100 requests, and will need up to 30 kilo-bytes of memory.
!A note on plugin priority
Each plugin has a priority in order to computed plugin execution order.
Plugins are executed in ~ASCending priority: lower numbers first.
Depending of the plugin type, all plugins of a group are executed, or only until one can give a result.
!How to write your own plugin
Note: all plugin interfaces are in the package {{{clime.messadmin.providers.spi}}}. See AvailablePluginsTypes for a list of all available plugin types.

Plugins are packaged as standard [[Service Providers|http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html#Service%20Provider]]: you will need to write a Java class and a very simple plugin descriptor.
The plugin classes should be lightweight and quick to load. Implementations should avoid complex dependencies on other classes and on native code. The usual pattern for more complex services is to register a lightweight proxy for the heavyweight service. Plugin classes should also be thread-safe.

Should you need to load a localized message, you can conveniently do so by calling the static method {{{clime.messadmin.i18n.I18NSupport#getLocalizedMessage(String baseName, String key, Object[] args)}}} which will take care of selecting the correct [[Locale|http://docs.oracle.com/javase/7/docs/api/java/util/Locale.html]], loading the corresponding [[ResourceBundle|http://docs.oracle.com/javase/7/docs/api/java/util/ResourceBundle.html]], and [[formatting|http://docs.oracle.com/javase/7/docs/api/java/text/MessageFormat.html]] the message if necessary.

Say you want to write a plugin to fetch the user name from the [[HttpSession|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSession.html]].
!!Step 1: write your Java class
You will need to write a Java class implementing the plugin interface and a default no-arg constructor:
{{{
package mypackage.messadmin.plugin;

import javax.servlet.http.HttpSession;
import clime.messadmin.providers.spi.UserNameProvider;

public class MyUserNameFetcher implements UserNameProvider {

	public MyUserNameFetcher() {
		super();
	}

	/**
	 * @see clime.messadmin.providers.spi.BaseProvider#getPriority()
	 */
	public int getPriority() {
		return 0;
	}

	/**
	 * @see clime.messadmin.providers.spi.UserNameProvider#guessUserFromSession(javax.servlet.http.HttpSession)
	 */
	public Object guessUserFromSession(HttpSession httpSession) {
		Object user = null;
		// fetch your user name here
		return user;
	}
}
}}}
!!Step 2: write your plugin descriptor
Create a file named after the interface you are implementing in {{{META-INF/services/}}}.
In our example, this will be:
{{{META-INF/services/clime.messadmin.providers.spi.UserNameProvider}}}

Put your FQ class name in this file.
In our example:
{{{
# Providers for guessing the user name from the HttpSession
mypackage.messadmin.plugin.MyUserNameFetcher
}}}
!!Step 3: deploy!
Create a jar file of your compiled class and your plugin descriptor.
Drop this jar file (myPlugin.jar) next to {{{MessAdmin-Core.jar}}}, or in {{{WEB-INF/lib/}}} and restart your webapp.
That's all!
MessAdmin
LiveDemo
As a developer, integrating MessAdmin early to your project give you tools to detect problems early, like putting non-[[serializable|http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html]] or too many objects in the [[HttpSession|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSession.html]]. You can also monitor what's in the [[HttpSession|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSession.html]] at runtime, thereby checking what's supposed to be there is really there, and that you didn't leave any leftover when you're done.
Quick notes on the developer side of MessAdmin/%
%/
!~MOTOs
*I'm a library, thus I shouldn't have any external dependencies.
**Reasoning: I'm fed up with can't-live-without libraries depending on dozens of 3rd-party libs (yes, I'm looking at //you//, Hibernate!), causing versioning hell along the (class)path.
*As we aim production boxes, we must be as fast, error-free and memory-light as possible./%

%/
!Technical Insights
Or, "how the hell does this stuff works?"
* Track [[HttpSessions|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSession.html]] via the ~MessAdminLister ({{{<listener>}}} in {{{web.xml}}})
* Servlet Filter ~MessAdminFilter knows how to inject html code at response-time on the fly, but only for html responses (not images, pdfs, etc.)!
* "Simple" stateless ~WebApplication to administer data given by the Session Tracker, using the Filter to do the final display work/%

%/
!FAQ (developer version)
* Why couldn't I send messages when using MessAdmin 1.x and Servlet 2.3 (~J2EE 1.3)?
<<<
In this servlet version (2.3), filters are not invoked when a request is made through the [[RequestDispatcher|http://docs.oracle.com/javaee/6/api/javax/servlet/RequestDispatcher.html]] (Request Forwarding or Including) (very common for generating the response in frameworks like Struts). Invoking filters for RD requests is part of the Servlet 2.4 specification.
This means we need servlet 2.4 to manage the situation!
MessAdmin 2.0 works around the Servlet 2.3 specification shortcomings.
<<<
* Where are the [[JUnit|http://www.junit.org]] tests?
<<<
There are (almost) none! :-) If you would like to contribute some, I'll be more than grateful!
<<<
* Can I re-use your tag libraries?
<<<
While the license allows you this option, I strongly discourage you to do so. Use a full-blown JSTL implementation instead, like the Apache Jakarta one <http://tomcat.apache.org/taglibs/index.html>.
You are of course free to take the non-JSTL part!
<<<
* On measuring the size of a Java Object...
<<<
Fallacy: You can measure an object's size by serializing it into a byte stream and looking at the resulting stream length
The reason this does not work is because the serialization layout is only a remote reflection of the true in-memory layout.
One easy way to see it is by looking at how Strings get serialized: in memory every char is at least 2 bytes, but in serialized form Strings are ~UTF-8 encoded and so any ASCII content takes half as much space.
See <http://www.javaworld.com/javaqa/2003-12/02-qa-1226-sizeof_p.html>

sizeof operator is not available in Java. But, at times you may want to know size of your Java objects.
Size of an object depends on VM implementation. Number of header words in an object ("class pointer" etc.), pointer size (32/64 bit) and alignment variations make object size dependent on VM implementation.
An article by Vladimir Roubtsov explains how to measure sizeof objects.
With ~J2SE 1.5, we can get size in 2 new ways (as I know), without using profilers or native agents.
	1. We can use java.lang.instrument.Instrument.getObjectSize API.
	2. We can use jmap -histo to get object histogram. For each class, jmap prints number of objects and total size in bytes occupied by those objects. We can divide total size by number of objects to get size of an individual object.
See also [[HttpSession size]].
<<<
* Can I re-use your multi-threaded compression engine?
<<<
Sure! It lives in the {{{clime.messadmin.utils.compress}}} package. See the classes {{{GZipUtils}}} and {{{ZipUtils}}} for entry points.
<<<
/%

%/
!PACKAGES and CLASSES
*{{{clime.messadmin.admin}}}
**	Admin application
*{{{clime.messadmin.core}}}
**	This is the place of the Servlet Listener (~MessAdminListener)
*{{{clime.messadmin.filter}}}
**	This is the place of the Servlet Filter (~MessAdminFilter, + supporting files)
*{{{clime.messadmin.model}}}
**	Model classes (really!)
*{{{clime.messadmin.providers.spi}}}
**	Plugins interface
*{{{clime.messadmin.providers.*}}}
**	Default plugins implementation
*{{{clime.messadmin.taglib.*}}}
**	Modified copy of part of JSTL taglib
*{{{clime.messadmin.utils}}}
**	Some reusable utility classes (who hasn't?)
AKA the legal jumbo mumbo...

This product includes software developed by the [[Apache Software Foundation|http://www.apache.org/]].
Object sizing based on software developed by [[Vlad Roubtsov|http://www.javaworld.com/columns/jw-qna-index.shtml]].
Base64 based on software developed by [[Mikael Grev|http://migbase64.sourceforge.net/]].
This product includes parts of [[backport-util-concurrent|http://backport-jsr166.sourceforge.net/]].
Multi-threaded compression uses on a patched version of [[JZlib|http://www.jcraft.com/jzlib/]] (Java <= 6).
[[getElementsBySelector.js|http://simon.incutio.com/js/getElementsBySelector.js]] copyright &copy; 2003 Simon Willison.
[[behavior.js|http://www.ccs.neu.edu/home/dherman/javascript/behavior/]] copyright &copy; 2005 Dave Herman.
{{{RAM.js}}} based on [[RAM.js|http://webreflection.blogspot.com/2007/10/cow-web-ram-javascript-function-to.html]] copyright &copy; 2007 Andrea Giammarchi.


This software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either expressed or implied. Use at your own risk. Etc, etc, etc...
Browse your filesystem directly from within MessAdmin!
Rename, delete and compress files and folders.
Single files are [[GZip|http://www.gnu.org/software/gzip/]] compressed. Compression is multi-threaded if the file is more than 40&nbsp;MB and at minimum 2 (Java 7) / 3 (Java < 7) CPU cores are available, or with 2 CPU cores and file size > 120&nbsp;MB.
Directories are [[ZIP|http://www.pkware.com/support/zip-app-note/]] compressed. Compression is single-threaded for now.
This MessAdmin plugin displays [[Ehcache|http://www.ehcache.org]] statistics, and also enables you to clear your caches.
Requires Ehcache >= 1.4.1.
[[Disclaimer]]/%
%/
* How stable is this product? How much memory/CPU does it use?
<<<
MessAdmin is already used in production sites. Its overhead is very small (about 600 bytes per session) and it doesn't make any heavy computation (less than 0.5 millisecond per request on a battery-running Pentium M@600 ~MHz; that's right: 0.6 ~GHz. And less than 0.3 millisecond per request @1.6 ~GHz).
With its plug'n'play capabilities, there is no reason to not add it to all your running applications!
<<<
* Some session attributes are displayed with an alarming red background! What does this mean?
<<<
Those attributes are not [[Serializable|http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html]]. This is a requirement for persisting [[HttpSessions|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSession.html]] on disk (e.g. in a clustered environment).
<<<
* Some session are displayed with a light yellow background! What does this mean?
<<<
Those sessions are accessed via a secure connexion (e.g. https). Note that if your application-server is behind a web server, and if this web-server is handling https instead of your application-server, you may not know if a given session is secure or not.
<<<
* Why are some sizes {{{-1}}}?
<<<
There was an error while computing an object size. Most likely you are getting this on the "total session size" while testing with WSAD 5.1.
<<<
* Why are some sizes really big?
<<<
Computing the size of a Java Object is a very tricky business. See [[HttpSession size]] for details.
<<<
* JMX does not work!
<<<
Did you enable management for your application server?
See [[Install-JMX]] for instructions.
<<<
* I can't send messages to my users!
<<<
Your users may have a popup blocker. They will need to enable popups for your site in order to get messages.
<<<
* I can't send messages to my users (really)!
<<<
You (or the framework you are using) are calling {{{HttpServletResponse.getOutputStream()}}} to write text, instead of {{{HttpServletResponse.getWriter()}}}.
{{{getOutputStream()}}} should only be used to write binary data.
Known framework having that bad habit: [[Click|http://click.sourceforge.net/]] version < 1.1.
Credit to Sven Herschel for analysing the issue.
<<<
* Are there any known bugs?
<<<
Not really, more like shortcomings. :-) See the [[Bugs]] page.
<<<
* What's in the MessAdmin name?
<<<
Well, Session administration was a mess before... therefore this tool to Administrate the Mess! :-)
<<<
* Any links?
<<<
Other projects can monitor your web applications, even if more intrusive or less capable than MessAdmin:
* [[JavaMelody|http://code.google.com/p/javamelody/]]
* [[PSI Probe|http://code.google.com/p/psi-probe/]] (based on Lambda Probe)
* [[MuleSoft|http://www.mulesoft.com/]] Tcat Server (based on Lambda Probe)
* [[JAMon|http://jamonapi.sourceforge.net/]]
* [[JManage|http://www.jmanage.org/]]
* [[ClickStream|http://www.opensymphony.com/clickstream/]]
* [[InfraRED|http://infrared.sourceforge.net/]]
* [[Metrics|https://github.com/dropwizard/metrics]]
* [[jvmtop|https://code.google.com/p/jvmtop/]]
* [[XRebel|http://zeroturnaround.com/software/xrebel/]]
<<<
* Any developer FAQ?
<<<
Sure! See the [[Developer FAQ|DeveloperFAQ]]
<<<
* Q: How do I recognize a Servlet 2.3 {{{web.xml}}} from a Servlet 2.4 / 2.5 / 3.0 / 3.1 one?
A: a Servlet 2.3 {{{web.xml}}} start like this:
{{{
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
	"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
	"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="My_WebApp_ID">
}}}
while a Servlet 2.4 {{{web.xml}}} start like this:
{{{
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="My_WebApp_ID" version="2.4"
	xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
}}}
a Servlet 2.5 {{{web.xml}}} like this:
{{{
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5" [metadata-complete="true"]>
}}}
a Servlet 3.0 {{{web.xml}}} like this:
{{{
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0" [metadata-complete="true"]>
}}}
and finally a Servlet 3.1 {{{web.xml}}} like this:
{{{
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1" [metadata-complete="true"]>
}}}
MessAdmin brings you a lot of [[benefits|Benefits]] by providing you the followings features.

See and interact with MessAdmin via
* built-in administration servlet
* JMX (if available)

Server-related statistics and operations:
* name and version of your application server software
* JVM version and vendor
* user running the server (with home and temp directories)
* server uptime
* disk free space (requires Java 6)
* free and used memory
* system properties
* system environment variables
* list of threads
* thread dump

~WebApp-related statistics and operations:
* number of active Sessions, with memory size
* number of passive Sessions
* maximum number of concurrent Sessions (peak), with date at which this event happened
* total number of created Sessions
* total number of hits
* total Request size (incoming bandwidth)
* total Response size (outgoing bandwidth)
** @@font-size:smaller;note that this number represents what goes out of the web application. If you use a post-processing compressing filter (which is highly recommended), this will be different to end-user network usage.@@
* list of ~ServletContext (application-scope) attributes, with size and remove operation
* {{{web.xml}}} context parameters
* list the content of application {{{war}}} file
* browse the JNDI directory
* application ~ClassLoader

Session-related statistics and operations:
* remote user name
* remote user locale
* remote host IP (includes knowledge of reverse-proxies)
* last Request URL
* isSecure flag (e.g. https)
* SSL information (if secure connection): cipher suite name, algorithm bit size
* date created
* date of last access
* TTL (time to live before expiration)
* total number of hits
* total, min, max, mean: Request size
* total, min, max, mean: Response size
* last Request size and date
* last Response size and date
* list of ~HttpSession attributes, with size and remove operation
* flags non-serializable ~HttpSession attributes
* send an HTML message to all or any user of the application
* invalidate any ~HttpSession

With optional [[plugins|Plugins]]:
* list of last http requests for each user
* [[Ehcache]] statistics
* [[Hibernate]] statistics
* Log4J loggers (change log levels at runtime)
* list Quartz jobs
* servlet performance statistics
* execute [[Java Scripts|http://docs.oracle.com/javase/7/docs/technotes/guides/scripting/]] (require Java 6)
* browse local disks
* and much more ([[write your own plugins|CreatePlugins]]!)

As a bonus, MessAdmin takes care of some evil singleton cleanup at application shutdown, thereby avoiding some dreadful OOM ({{{java.lang.OutOfMemoryError}}}) on hot restart:
* JDBC drivers: {{{java.sql.DriverManager}}} - Evil Singleton (drivers should be located at application-server level)
* ~MySQL Connector/J <= 5.1.10
* {{{java.beans.Introspector}}} - Slightly less Evil singleton
* Jakarta Commons Logging <= 1.0.4
* Jakarta Commons IO >= 1.3
* ~Log4J & ~LogBack MDC's
You will still have to take care of your own [[ThreadLocals|http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html]]; there's nothing I can do for you there...
To get started with this blank TiddlyWiki <<version>>, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
This MessAdmin plugin displays [[Hibernate|http://www.hibernate.org]] statistics.
Requires Hibernate >= 3.1.3 and [[Spring Framework|http://www.springframework.org]] (any version).
Note that this plugin will only work if you have a single ~SessionFactory defined in your Spring configuration. [[Contact me|License / Contact]] should you need to display statistics from multiple simultaneous ~SessionFactory's, or if you are not using Spring.
As there is no subversion repository yet, [[contact us|mailto:cedrik_lime@users.sourceforge.net?subject=[MessAdmin i18n] ]] to get the current sources, as a set of Eclipse 3 + WTP projects.

Each of those projects have a standard Maven 2 layout, so you should be able to quickly find your way around.

Should you want to build the project outside Eclipse, simply use the Ant script provided (requires [[Ant|http://ant.apache.org]] >= 1.7.1), or use "{{{ant dist-bin}}}" for a full binary distribution archive.

To translate MessAdmin, you will need to translate some properties files; you won't have to go into the code (although you are most welcome to look around if interested!).
For that, copy all properties files into your language. For example:
{{{sessionDetail.properties}}} -> {{{sessionDetail_es.properties}}}
There are quite a few properties files per project, use your favourite IDE find command to avoid missing one.
Please stick to ~ISO-Latin-1 for properties files encoding, if possible. If not, don't forget to tell me so that I do not mess up you work! A good tool for this job is the [[ResourceBundleEditor|http://sourceforge.net/projects/eclipse-rbe/]] eclipse plugin.

I will update the documentation with your name. Please refrain from changing the documentation since this wiki system does not have easy merge.

Should you have any question and/or suggestion, please contact me and I'll do my best to give you an answer!
config.options.chkHttpReadOnly = true;
config.options.chkAnimate = true;
config.options.txtUserName = "Cédrik";
config.options.chkSaveBackups = false;
Computing a {{{HttpSession}}} memory size is a challenging task at best.

Measuring the size of a Java Object is tricky enough: you can't measure an object's size by serializing it into a byte stream and looking at the resulting stream length (the reason this does not work is because the serialization layout is only a remote reflection of the true in-memory layout; consider for example a String, which is 2 bytes/char in memory, but little more than 1 byte/char once serialized in the usual cases). Moreover, pointer size (32/64 bit) and alignment variations make object size highly dependent on VM implementation.
See [[Vladimir Roubtsov's article|http://www.javaworld.com/javaqa/2003-12/02-qa-1226-sizeof_p.html]] for more details.

Along with this difficulty, consider now the following two {{{HttpSession}}}s containing each a Struts ~ActionForm (accessors omitted):
{{{
public class MyAF1 extends ActionForm {
	String var1;
	Integer var2;
}
}}}
{{{
public class MyAF1 extends ActionForm {
	String var1;
	String var2;
}
}}}
At first glance, the size of those objects should be quite small (about 100 bytes each), shouldn't it? Well, you'd be surprised... as they can easily reach a megabyte!
Why is it so? Let's have a look at the base class, {{{ActionForm}}}:
{{{
public abstract class ActionForm implements Serializable {
	/** <p>The servlet instance to which we are attached.</p> */
	protected transient ActionServlet servlet;

	/** <p>The MultipartRequestHandler for this form, can be <code>null</code>.</p> */
	protected transient MultipartRequestHandler multipartRequestHandler;
...
}
}}}
Ah, we are onto something here! Each {{{ActionForm}}} has a pointer to its servlet and request handler, which in turn have pointers to other important structures! From them come the huge size of your Struts' {{{ActionForm}}}s. But does those big objects have an impact on your server's memory? Not really, as it turns: an {{{ActionServlet}}} is a singleton: there is only 1 instance ever in the JVM. Which means that 2 (or more) {{{ActionForm}}}s will ''share'' a single instance of their {{{ActionServlet}}}.

So... The true memory footprint of your {{{HttpSession}}} should really be: {{{sizeOf(myActionForm) - sizeOf(the ActionServlet contained inside myActionForm)}}} ({{{multipartRequestHandler}}} and others omitted).
How can we "guess" how to do that? Well, it's not that easy. One could be tempted to say
> Hey, those fields are {{{transient}}}, let's //not// count {{{transient}}} fields!
Indeed, this idea looks good, neat and clever. But do we have a warranty that each and every framework will "transient-ify" their "common" pointers? Worse, is a {{{transient}}} field really not worth counting? Let's have a look at a very commonly used data structure: a [[HashMap|http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html]].
{{{
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable {
	/**
	 * The table, resized as necessary. Length MUST Always be a power of two.
	 */
	transient Entry[] table;
...
}}}
Not a chance, //not// counting {{{transient}}} fields leads to size each and every {{{HashMap}}} to a small, fixed value, independently of the data contained inside. This behaviour is clearly unacceptable.

So here we are, back to square one. It is an unfortunate fact that computing the memory footprint of an {{{HttpSession}}} is a very difficult task, highly dependant on how your application is built.
There are two workarounds:
* create 10 or so identical sessions, look at the total {{{HttpSession}}}s size (in the Application Statistics pane of MessAdmin) and divide this by the number of sessions.
* create a few {{{HttpSession}}}s and record their total size. Next, create your target {{{HttpSession}}} and record the new total size. Your last created {{{HttpSession}}} size //should// be the difference between those two sums.
While those workarounds work in a controlled environment, they can't be used in production.
MessAdmin is part of your tool arsenal to build greater quality applications; see [[developer|Developer]].
But MessAdmin doesn't stop there. Once built, applications must run reliably. MessAdmin can help you monitor your applications and solve problems before they become a nuisance to your business. See [[system administrator|SystemAdministrator]].
To enable JMX monitoring, you need to both use Java >= 5, and enable management within your application server.
For Tomcat (version 5.x and more), you can use (//warning: highly insecure setup!//):
{{{
CATALINA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
}}}
See http://docs.oracle.com/javase/1.5.0/docs/guide/management/agent.html for more information.
Installing at the server level is done in 3 easy steps.
!1. Copy ~MessAdmin jars in your server
Copy {{{MessAdmin-Core-[version].jar}}} into your server's classpath (along with any optional [[plugins|Plugins]]). For Tomcat, this is {{{$CATALINA_HOME/lib/}}}. Please consult your friendly user manual for other application servers./%
%/
!2. Copy {{{MessAdmin-AutoProbe.jar}}} in your applications' {{{WEB-INF/lib/}}} folder
For each ~WebApp of this server you wish to monitor, install the AutoProbe plugin (along with any optional [[plugins|Plugins]]) in {{{WEB-INF/lib/}}}. (You can not simply copy {{{MessAdmin-AutoProbe.jar}}} next to {{{MessAdmin-Core.jar}}} at the server level; you really need to copy it at the ~WebApp's level.)
As an //alternative//, you can patch your server's {{{web.xml}}} (for Tomcat, it is in {{{$CATALINA_HOME/conf/}}}) for automatically monitoring all of your server's applications, and forget about changing a single bit in your applications./%
%/
!3. Deploy the administration application (not required for JMX monitoring)
Note: this step is optional. You can choose to use [[JMX administration|Install-JMX]] only.
* Deploy {{{MessAdmin.war}}} in your application server. You can rename it first should you wish to use another context name.
* <<tiddler web.xml-security>>
Administration URL will look like:
{{{
http://127.0.0.1:8080/MessAdmin/
        ^         ^       ^
        |         |       +- MessAdmin.war administration WebApp context name
        +- your server name and port
}}}
Always use the administration servlet, do not call the ~JSPs directly!
You have 2 ways of interacting with MessAdmin: with the built-in administration webapp, and/or JMX.

If you want to install MessAdmin in a war or ear file based web app, you will have to explode this web app so that you can place the MessAdmin files inside. Feel free to repackage ("implode") after you're done with the modifications.
!Graphical Résumé
{{{
/              <- copy the "MessAdmin" folder (with the jsp's inside) here
|
+-- WEB-INF/
    |
    +-- lib/    <- copy MessAdmin-Core.jar and MessAdmin-AutoProbe.jar here (along with any optional plugins)
    |
    +-- web.xml <- modify this file according to following documentation
}}}
!Detailed instructions
Before you can interact with MessAdmin, you need to install it.
* copy {{{MessAdmin-Core.jar}}} and {{{MessAdmin-AutoProbe.jar}}} in {{{WEB-INF/lib/}}} (along with any optional [[plugins|Plugins]])
* copy the {{{MessAdmin}}} folder (containing the jsp's) into your application context root (next to your other html and jsp files). (This step is not required for Servlet 3.0+ compliant servers.)
* declare the administration servlet in {{{WEB-INF/web.xml}}}:
{{{
<servlet>
	<servlet-name>MessAdminServlet</servlet-name>
	<servlet-class>clime.messadmin.admin.MessAdminServlet</servlet-class>
	<!-- Uncomment if you want to password-protect access to the administration servlet
	<init-param>
		<param-name>AuthorizationPassword</param-name>
		<param-value>[SomePassword]</param-value>
	</init-param>
	-->
	<load-on-startup>-1</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>MessAdminServlet</servlet-name>
	<url-pattern>/messadmin</url-pattern><!-- You can change this pattern! -->
</servlet-mapping>
}}}
Note: you can use whichever url-pattern you want for the MessAdmin servlet.

Administration URL will look like:
{{{
http://127.0.0.1:8080/someContext/messadmin
        ^         ^       ^           ^
        |         |       |           +- Administration servlet name as defined in web.xml
        |         |       +- your WebApp context name
        +- your server name and port
}}}
Always use the administration servlet, do not call the ~JSPs directly!/%

%/
!Optional tasks
* You can monitor your application either via the built-in MessAdmin administration webapp, and/or via JMX. Should you want to disable the administration webapp, simply delete the {{{<servlet>}}} and {{{<servlet-mapping>}}} elements from your {{{web.xml}}}.
* <<tiddler web.xml-security>>
MessAdmin is composed of a probe and an administration application.
You can choose to install MessAdmin (probe and/or admin application) either at the ~WebApplication-level, or at the Server-level (for monitoring more than 1 ~WebApp in one shot).

The probe needs to be installed in all ~WebApps you want to monitor (but there are [[shortcuts|AutoProbe]]).
The administration application can be installed either within your ~WebApp (by declaring a single Servlet in your {{{web.xml}}}), or at the server level (using the supplied {{{war}}}).

In any case, you do not need to modify the source code of your application.
Some of the installation options can be customized. Please see the detailed documentation./%

%/
!Installing for monitoring a single ~WebApp
Please refer to the [[WebApp installation documentation|Install-WebApp]] for detailed instructions.
You will have to:
* [[download|http://sourceforge.net/project/showfiles.php?group_id=147751]] the current distribution :-)
* copy {{{MessAdmin-Core.jar}}} and {{{MessAdmin-AutoProbe.jar}}} along with any optional [[Plugins]] in your application's {{{WEB-INF/lib/}}} directory
* copy the {{{MessAdmin}}} folder (containing the {{{.jsp}}} administration pages) into your document root directory
* declare the administration servlet to your {{{web.xml}}}/%

%/
!Installing for monitoring a whole Server
Please refer to the [[Server installation documentation|Install-Server]] for detailed instructions.
You will have to:
* [[download|http://sourceforge.net/project/showfiles.php?group_id=147751]] the current distribution :-)
* copy {{{MessAdmin-Core.jar}}} along with any optional [[Plugins]] in your server's classpath
* copy {{{MessAdmin-AutoProbe.jar}}} ([[AutoProbe]] plugin) along with any optional [[Plugins]] to your applications' {{{WEB-INF/lib/}}} folder
* deploy the administration application: {{{MessAdmin.war}}}/%

%/
!Using Maven
See [[here|Maven]].
This MessAdmin plugin exposes MessAdmin data via JMX.
Please see the [[installation instructions|Install-JMX]].
MessAdmin is Copyright &copy; 2005&ndash;2015, [[Cédrik LIME|mailto:cedrik_lime@users.sourceforge.net?subject=[MessAdmin]%20<your email subject here>]].

MessAdmin is licensed under the [[Simplified BSD license|http://www.opensource.org/licenses/bsd-license.php]], that gives you the freedom to use it pretty much however you want, including for commercial purposes, as long as you keep my copyright notice.
I would of course appreciate a short email should you re-use my code!

[[Disclaimer]]
Preview the next leading-edge version of MessAdmin!

Instructions:
# [[Create a few sessions|http://www.cedrik.fr/demo/]]
# [[Play with the administration application|http://www.cedrik.fr/MessAdmin/]] (use password: {{{demo}}})

Warnings:
* This live demo is based on an early snapshot of MessAdmin. It is not feature-complete, and it should not be assumed that this is representative of the final release.
* This server is my own personal computer. As such it may not be available 24/7. Please be kind with it! :-)
!Description
This plugin is responsible for obtaining the currently logged in user locale from a given [[HttpSession|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSession.html]].
Execution will stop as soon as one of the plugin returns a non-null result.
!Included plugins
* {{{clime.messadmin.providers.locale.KnownLocations}}}
**	Priority: 10
**	Search "known locations" in the [[HttpSession|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSession.html]] for a [[java.util.Locale|http://docs.oracle.com/javase/7/docs/api/java/util/Locale.html]]: { {{{"Locale"}}}, {{{"java.util.Locale"}}} }
**	This plugin has explicit support for [[Struts 1.x|http://struts.apache.org/1.x/]] and [[Spring 1.x and 2.x|http://www.springframework.org/]]
* {{{clime.messadmin.providers.locale.JSTLProvider}}}
**	Priority: 20
**	Checks eventual session-scope Locale set by JSTL
* {{{clime.messadmin.providers.locale.ReflectionTapestryProvider}}}
**	Priority: 30
**	Search for a [[Tapestry 3|http://tapestry.apache.org/tapestry3/doc/api/org/apache/tapestry/IEngine.html]] [[or 4.x Engine|http://tapestry.apache.org/tapestry4.1/apidocs/org/apache/tapestry/IEngine.html]] and invoke the {{{getLocale()}}} method on it
**	Note: this provider implementation uses reflection, to avoid linking against [[Tapestry|http://tapestry.apache.org/]] libs
* {{{clime.messadmin.providers.locale.JBossSeamProvider}}}
**	Priority: 40
**	Support for [[JBoss Seam|http://www.seamframework.org/]]
**	Note: this provider implementation uses reflection, to avoid linking against [[JBoss Seam|http://www.seamframework.org/]] libs
* {{{clime.messadmin.providers.locale.AttributesIterator}}}
**	Priority: 200
**	Search all attributes for a single {{{java.util.Locale}}}
View your application logs and change your log levels directly inside MessAdmin!

This MessAdmin plugin gives you a [[Log4J|http://logging.apache.org/log4j/]] {{{Appender}}} that will display log events in the MessAdmin administration webapp. In addition, you will be able to dynamically change your {{{Logger}}} levels at runtime.
This plugin requires [[Log4J|http://logging.apache.org/log4j/]] 1.2.9 or better./%
%/
!Installation & configuration/%
%/
To install, simply drop {{{MessAdmin-Log4J.jar}}} next to {{{MessAdmin.jar}}} or in {{{WEB-INF/lib/}}},
and use the {{{clime.messadmin.providers.log4j.Log4JAppender}}} appender in your Log4J configuration:
for {{{log4j.xml}}}:
{{{
<appender name="messadmin" class="clime.messadmin.providers.log4j.Log4JAppender">
	<param name="threshold" value="INFO"/>
	<layout class="org.apache.log4j.EnhancedPatternLayout">
		<param name="ConversionPattern" value="%d{ISO8601} [%-5p] %c %x - %m%n"/>
	</layout>
</appender>

<!-- example logger -->
<logger name="com.myapp.something">
	<level value="warn"/>
	<appender-ref ref="messadmin"/>
</logger>
}}}
for {{{log4j.properties}}}:
{{{
log4j.appender.MESSADMIN=clime.messadmin.providers.log4j.Log4JAppender
log4j.appender.MESSADMIN.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.MESSADMIN.layout.ConversionPattern=%d{ISO8601} [%-5p] %c %x - %m%n
log4j.appender.MESSADMIN.Threshold=INFO

# Example logger
log4j.logger.com.myapp.something=MESSADMIN, WARN
}}}
/%
%/
!Bonus (advanced users)/%
%/
If you use [[Log4J Extra|http://logging.apache.org/log4j/companions/extras/]] to automatically ~GZip-compress your log files, simply replace
{{{org.apache.log4j.rolling.FixedWindowRollingPolicy}}} with {{{clime.messadmin.providers.log4j.rolling.FixedWindowRollingPolicy}}},
and
{{{org.apache.log4j.rolling.TimeBasedRollingPolicy}}} with {{{clime.messadmin.providers.log4j.rolling.TimeBasedRollingPolicy}}}
to enable multi-threaded ~GZip compression.
[[Introduction|MessAdmin]]
[[Features]]
[[Benefits]]
[[Requirements]]
[[ScreenShots]]
[[Download & Install|Installation]]
[[Plugins]]
[[FAQ]]
<<tag ChangeLog>>
[[License / Contact]]

[img[SourceForge.net Logo|http://sourceforge.net/sflogo.php?group_id=147751&amp;type=1][http://sourceforge.net/projects/messadmin/]]

[img[Please support this project!|http://www.paypal.com/en_US/i/btn/x-click-but04.gif][https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=cedrik_lime%40users%2esourceforge%2enet&item_name=MessAdmin&no_shipping=1&cn=Your%20comments&tax=0&currency_code=EUR&lc=US&bn=PP%2dDonationsBF&charset=UTF%2d8]]

<<tiddler AdSense>>
<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-466295-1");
pageTracker._trackPageview();
} catch(err) {}
</script>
<div id="SearchEnginesFirstDiv" style="display: none;">MessAdmin is a notification system and Session administration for Java EE Web Applications, giving detailed statistics and informations on any Web application. It installs as a plug-in to any Java EE WebApp, and requires zero-code modification. Please visit our web site for more information.</div>
<meta http-equiv="content-language" content="en">
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'>
<link rel="schema.DC" href="http://purl.org/DC/elements/1.1/">
<meta name="DC.Title" content="MessAdmin">
<meta name="DC.Creator" content="LIME, C&eacute;drik">
<meta name="DC.Description" content="Notification system and Session administration for Java EE Web Applications">
<meta name="DC.Date.created" content="2005">
<meta name="DC.Type" content="Software">
<meta name="DC.Format" content="text/html">
<meta name="DC.Language" scheme="RFC3066" content="en">
<meta name="DC.Rights" content="copyright 2005-2015 Cedrik LIME">
<meta name="author" content="Cedrik LIME">
<meta name="copyright" content="copyright 2005-2015 Cedrik LIME">
<meta name="robots" content="index,follow,archive">
To manage jar dependencies with [[Maven|http://maven.apache.org/]], add the following in your {{{pom.xml}}}:
{{{
<dependencies>
...
	<dependency>
		<groupId>net.sourceforge.messadmin</groupId>
		<artifactId>MessAdmin-Core</artifactId>
		<version>5.4</version>
		<scope>runtime</scope>
	</dependency>
<!-- add here other MessAdmin plugins as required -->
...
</dependencies>

<repositories>
	<repository>
		<id>MessAdmin</id>
		<url>http://messadmin.sourceforge.net/maven2/</url>
	</repository>
</repositories>
}}}

You will still have to copy the administration webapp ~JSPs (or war) by hand, as I haven't created a [[war overlay|http://maven.apache.org/plugins/maven-war-plugin/overlays.html]] yet.

Note that since version 4.2, I have stopped [[uploading|http://maven.apache.org/guides/mini/guide-central-repository-upload.html]] MessAdmin to the [[Maven central repository|http://repo1.maven.org/maven2/]] since it is getting more and more [[painful|http://nexus.sonatype.org/oss-repository-hosting.html]] to do so. While I really dislike having to declare a repository location per dependency, this is really the only way to go&hellip;
MessAdmin is a light-weight and non-intrusive tool for monitoring and interacting with Java ~HttpSession. MessAdmin can be added to any Java EE application, with zero change to the monitored application!
With MessAdmin, you can:
* display statistics about any Web Application
* monitor all active ~HttpSessions (including their [[size|HttpSession size]])
* interact with and see detailed information about any session
* send html messages to any users
* and much much more, thanks to an open [[plugin|Plugins]] architecture!
MessAdmin can be added to any Java EE application. And apart from an optional minor change to your {{{web.xml}}}, you don't need to change anything at all in your web application! That's right, no coding, no application change!
Administration is done either with a built-in servlet, and/or via JMX.

MessAdmin brings you a lot of [[benefits|Benefits]], whether you are an [[IT manager|ITManager]], a [[system administrator|SystemAdministrator]] or a [[developer|Developer]].

Use the menu on the left to learn more.
Since version 3.0, MessAdmin can accept a [[range of different plugins|AvailablePluginsTypes]].
While MessAdmin comes with a default set of plugins which should be enough for the majority of people, you can now [[extend MessAdmin|CreatePlugins]] in a very easy way.

In addition to plugins in {{{MessAdmin-Core.jar}}}, the following external plugins are available:
* AutoProbe
* [[JMX]]
* DiskBrowser
* ServletStats
* ClickStream
* Log4J
* [[Hibernate]]
* [[Ehcache]]
* [[Quartz]]
* ScriptExecutor
* SessionKiller
* [[Serializable]]

To install a plugin, simply copy the plugin jar in your {{{WEB-INF/lib/}}} directory, or next to {{{MessAdmin-Core.jar}}}.
This MessAdmin plugin enables you to interact with [[Quartz|http://www.quartz-scheduler.org/]] 1.x and 2.x:
* list, pause &amp; resume {{{Scheduler}}}s
* list, pause, resume &amp; delete {{{Trigger}}}s
* list, run, interrupt &amp; delete {{{Job}}}s
* clear all Scheduler's data (useful when upgrading a cluster) (Quartz 2 only)
Requires Quartz >= 1.6.2
!Description
This plugin is a hook for reporting exceptions when processing a [[HttpRequest|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html]].
All plugins of this type are run.
!Included plugins
* {{{clime.messadmin.providers.lifecycle.KnownThreadLocalsCleaner}}}
**	Priority: {{{Integer.MAX_VALUE}}}
**	Takes care of cleaning up (some of) the [[ThreadLocals|http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html]], thereby avoiding (well, trying to avoid) OOM ({{{java.lang.OutOfMemoryError}}}) on hot restart...
***	[[Log4J|http://logging.apache.org/log4j/]] 1.x: {{{org.apache.log4j.NDC.remove();}}} and {{{org.apache.log4j.MDC.getContext().clear();}}}
***	[[LogBack|http://logback.qos.ch/]] 1.x: {{{ch.qos.logback.classic.MDC.clear();}}}
!Extra plugins (not included in {{{MessAdmin-Core.jar}}})
* {{{MessAdmin-ServletStats.jar}}} ({{{clime.messadmin.providers.lifecycle.ServletStatsGatherer}}})
**	See ServletStats
* {{{MessAdmin-ClickStream.jar}}} ({{{clime.messadmin.providers.lifecycle.ClickStreamGatherer}}})
**	See ClickStream
!Description
This plugin is a hook for the lifecycle of the [[HttpRequest|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html]].
All plugins of this type are run.
Note: be very careful with performance while writing any plugin of this type, as it will be run on every incoming request!
Note: the invocation order of Providers is reversed in case of request destruction.
!Included plugins
* {{{clime.messadmin.providers.lifecycle.KnownThreadLocalsCleaner}}}
**	Priority: {{{Integer.MAX_VALUE}}}
**	Takes care of cleaning up (some of) the [[ThreadLocals|http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html]], thereby avoiding (well, trying to avoid) OOM ({{{java.lang.OutOfMemoryError}}}) on hot restart...
***	[[Log4J|http://logging.apache.org/log4j/1.2/]] 1.x: {{{org.apache.log4j.NDC.remove();}}} and {{{org.apache.log4j.MDC.getContext().clear();}}}
***	[[LogBack|http://logback.qos.ch/]] 1.x: {{{ch.qos.logback.classic.MDC.clear();}}}
* {{{clime.messadmin.providers.user.SpringSecurity2UserName}}} / {{{clime.messadmin.providers.user.SpringSecurity3UserName}}}
**	Priority: 48/49
**	Cache the [[Spring Security|http://static.springsource.org/spring-security/]] authenticated user name for latter display by the {{{HttpRequestRemoteUser}}} UserNameProvider
* {{{clime.messadmin.providers.user.AcegiUserName}}}
**	Priority: 50
**	Cache the [[Acegi Security|http://www.acegisecurity.org/]] authenticated user name for latter display by the {{{HttpRequestRemoteUser}}} UserNameProvider
!Extra plugins (not included in {{{MessAdmin-Core.jar}}})
* {{{MessAdmin-ServletStats.jar}}} ({{{clime.messadmin.providers.lifecycle.ServletStatsGatherer}}})
**	See ServletStats
* {{{MessAdmin-ClickStream.jar}}} ({{{clime.messadmin.providers.lifecycle.ClickStreamGatherer}}})
**	See ClickStream
MessAdmin needs at least [[Java 5|http://java.sun.com/j2se/1.5.0/]], and a Java Servlet container (Servlet 2.4/~J2EE 1.4; e.g. [[Tomcat 5|http://tomcat.apache.org]], ~WebLogic 9 or ~WebSphere 6).
Some [[plugins|Plugins]] may have different requirements.

While you can continue running ~MessAdmin-Core on a Servlet 2.3 container, this is not a supported configuration (see the [[advanced installation instructions|Advanced installation]] for details)./%
Should you need a version of MessAdmin compatible with a Servlet 2.3 container, please use version [[4.3|Version 4.3 (2010-04)]] or [[get in touch with us|License / Contact]].%/

This is also the last version to support Java 1.5. Next version will require Java 6.
Note: this section is rather outdated. We are working on taking new screenshots to expose new features. In the meantime, feel free to explore our LiveDemo!

Let's first take the [[session list view|ss_list.html]]. There you can sort the information by clicking on the column headers (don't forget this is a screenshot; it won't work here!), manually expire some sessions and send messages.
Before doing any of that, Have a look at session [[0920E225E358F91C0F990BC8533471A0|ss_detail.html]]. You have a summary of interesting data for this session (including the remote IP in case you need to physically locate the user) as well as every attributes in the session (which you can remove).
Now let's come back to the previous screen and send a message to this user. Notice how you can use HTML. Once sent, notice the little 'M' in the [[resulting list|ss_list2.html]]. On his next action, the user will get a [[popup|popup.gif]] with your message.
Finally, let's finish with some statistics on the [[web application|ss_webapp.html]] itself.

Of course, all of the above operations are also available via JMX, but what's the point of taking screenshots of JConsole? ;-)
Execute [[Java Scripts|http://docs.oracle.com/javase/7/docs/technotes/guides/scripting/]] on your server! Requires Java 6.
This MessAdmin plugin computes if an object is Serializable.
The algorithm used here is more comprehensive, but slower than the default one used in ~MessAdmin-Core.
!Description
This plugin is responsible for computing if a given a Java Object is [[Serializable|http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html]].
You should rarely need to write your own.
Only the first plugin (minimum priority) will be run.
!Included plugins
* {{{clime.messadmin.providers.serializable.MaybeSerializableProvider}}}
**	Priority: 10
**	While this implementation is quick, it may not be accurate:
***		a return value of {{{true}}} does not waranty that such an object is really serializable.
***		a return value of {{{false}}} is a 100% warranty that the object is not serializable.
**	In other words, it //may// miss some non-Serializable objects.
!Extra plugins (not included in {{{MessAdmin-Core.jar}}})
* {{{MessAdmin-Serializable.jar}}} ({{{clime.messadmin.providers.serializable.FullySerializableProvider}}})
**	Priority: 0
**	This plugin is accurate, although much slower than the default plugin.
!Description
This plugin is a hook for exposing server-specific HTML data in the administration servlet. Should you want to expose tabular data, you can extend the abstract base class {{{clime.messadmin.providers.spi.BaseTabularServerDataProvider}}}.
All plugins of this type are run.
!Included plugins
* {{{clime.messadmin.providers.userdata.SystemPropertiesProvider}}}
**	Priority: 10
**	Displays the JVM's system properties
* {{{clime.messadmin.providers.userdata.SystemEnvironmentProvider}}}
**	Priority: 20
**	Displays the JVM's environment variables
**	Requires Java 5+
* {{{clime.messadmin.providers.userdata.ThreadsDumper}}}
**	Priority: 50
**	Displays current threads in the JVM
!Extra plugins (not included in {{{MessAdmin-Core.jar}}})
* {{{MessAdmin-ScriptExecutor.jar}}} ({{{clime.messadmin.scripting.ScriptExecutor}}})
**	See ScriptExecutor
!Description
This plugin is a hook for the lifecycle of the server.
All plugins of this type are run.
Note: the invocation order of Providers is reversed in case of server destruction.
!Included plugins
None. [[Write your own|CreatePlugins]]!
This MessAdmin plugin gathers statistics on an application Servlets.
Each servlet will need about 500 bytes of memory.
!Description
This plugin is a hook for exposing session-specific HTML data in the administration servlet. Should you want to expose tabular data, you can extend the abstract base class {{{clime.messadmin.providers.spi.BaseTabularSessionDataProvider}}}.
All plugins of this type are run.
!Included plugins
None. [[Write your own|CreatePlugins]]!
!Extra plugins (not included in {{{MessAdmin-Core.jar}}})
* {{{MessAdmin-ServletStats.jar}}} ({{{clime.messadmin.providers.lifecycle.ServletStatsDisplayer}}})
**	See ServletStats
* {{{MessAdmin-ClickStream.jar}}} ({{{clime.messadmin.providers.lifecycle.ClickStreamDisplayer}}})
**	See ClickStream
This MessAdmin plugin corrects a Tomcat bug whereby some expired ~HttpSession are never invalidated, by periodically (every 20 minutes) iterating over all ~HttpSessions and automatically invalidating expired ones.
!Description
This plugin is a hook for the lifecycle of the session.
All plugins of this type are run.
Note: the invocation order of Providers is reversed in case of session destruction.
!Included plugins
* {{{MessAdmin-JMX.jar}}} ({{{clime.messadmin.providers.jmx.JMXProvider}}})
**	Priority: n/d
**	This plugin exposes MessAdmin data via [[JMX|Install-JMX]].
!Extra plugins (not included in {{{MessAdmin-Core.jar}}})
None. [[Write your own|CreatePlugins]]!
<<search>><<closeAll>><<permaview>><<newTiddler>>/%<<newJournal 'DD MMM YYYY'>>%/<<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>
Notification system and Session administration for Java EE Web Applications
MessAdmin
http://messadmin.sourceforge.net/
!Description
This plugin is responsible for computing the size of a Java Object.
You should rarely need to write your own.
Execution will stop as soon as one of the plugin returns a result >= 0.
!Included plugins
* {{{clime.messadmin.providers.sizeof.ObjectProfilerProvider}}}
**	Priority: 0
**	Based on Vlad Roubtsov's 2003 article: http://www.javaworld.com/javaqa/2003-12/02-qa-1226-sizeof_p.html
/***
Place your custom CSS here
***/
/*{{{*/
.tabContents .shadow {color: #888;}  /* from TiddlyWiki 2.1: http://trac.tiddlywiki.org/ticket/37 */
/*}}}*/
Being very light weigh, MessAdmin can be integrated in all your running Java EE applications. From there, it will be very easy to answer questions like "how many users are on the system right now?", "which country do they come from?", "what was the maximum load we had for this application and when?", or "how much data is going tough our lines?", as well as "who's logged in and what are they doing?".
And should you need to perform an emergency shutdown (or any other unexpected system maintenance), at least now you can warn your users beforehand by sending them messages!
chkAnimate: true
txtUserName: Cédrik
chkSaveBackups: false
TiddlyWiki defines itself as "a reusable non-linear personal web notebook". It can be considered as a standalone wiki application. More information is available at the [[TiddlyWiki web site|http://www.tiddlywiki.com]]. Thank you, Jeremy Ruston, for writing this fine piece of software!
Help us make the next version of MessAdmin available in //your// language!
Do you have what it takes to have your name in the credits file? Then [[contact us|mailto:cedrik_lime@users.sourceforge.net?subject=[MessAdmin i18n] ]]! Knowledge of Java Properties would be a plus, but is not required.
See [[HowTo translate]] for details.
The update notification totally respects your privacy.
When using the administration webapp, your browser (//not// your Java server!) issues a simple {{{HEAD}}} HTTP request to {{{http://versioncheck.messadmin.cedrik.fr/<version>}}}, and depending on the response status, shows or hides the html text for the notification.
No information is sent except for the MessAdmin version you are currently using.
The server source is included in the source distribution.
!Description
This plugin is responsible for obtaining the currently logged in user name from a given [[HttpSession|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSession.html]].
Execution will stop as soon as one of the plugin returns a non-null result.
!Included plugins
* {{{clime.messadmin.providers.user.AcegiUserName}}}
**	Priority: n/d
**	Support for [[Acegi Security|http://www.acegisecurity.org/]]
* {{{clime.messadmin.providers.user.SpringSecurity2UserName}}} / {{{clime.messadmin.providers.user.SpringSecurity3UserName}}}
**	Priority: n/d
**	Support for [[Spring Security|http://static.springsource.org/spring-security/]]
* {{{clime.messadmin.providers.user.HttpRequestRemoteUser}}}
**	Priority: 10
**	Returns last request [[RemoteUser|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getRemoteUser()]] or [[UserPrincipal|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getUserPrincipal()]], if any
* {{{clime.messadmin.providers.user.JBossSeamProvider}}}
**	Priority: 60
**	Support for [[JBoss Seam|http://www.seamframework.org/]]
**	Note: this provider implementation uses reflection, to avoid linking against [[JBoss Seam|http://www.seamframework.org/]] libs
* {{{clime.messadmin.providers.user.KnownLocations}}}
**	Priority: 100
**	Search "known locations" in the [[HttpSession|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSession.html]] for a user name: { {{{"Login"}}}, {{{"User"}}}, {{{"userName"}}}, {{{"UserName"}}}, {{{"Utilisateur"}}} }
* {{{clime.messadmin.providers.user.AttributesIterator}}}
**	Priority: 200
**	Search all attributes for a single [[java.security.Principal|http://docs.oracle.com/javase/7/docs/api/java/security/Principal.html]] or [[javax.security.auth.Subject|http://docs.oracle.com/javase/7/docs/api/javax/security/auth/Subject.html]]
* First internal release
* JDK 5, JSTL 1.1 and Servlet 2.4 (~J2EE 1.4) only
!Additions
* Released a ~JSP-only version
!Improvements
* Fixed compatibility with JDK 1.4
* Partly fixed compatibility with Servlet 2.3 (~J2EE 1.3) (see the doc for known limitations)
!Additions
* Released a JSTL 1.0 version
!Improvements
* Fixed compatibility with JDK 1.3
First public release.
Many thanks to Christian Picard for pushing me so hard to get MessAdmin out of the door. This project would never have gone public without you, Christian.
!Improvements
* session-taglib migration (internal use, to ease future developments)
* some code and documentation clean-up
NOTE: we now require Java >= 1.4 (for object sizing). Please contact us if you need 1.3 compatibility.
!Additions
* Added Session attributes size
* Added number of hits for a Session
* Added some stats in the back-end (needs front-end and more testing):
**	number of hits (~WebApp)
**	bandwidth used (incoming/outgoing)
**	current/avrg/max (peak)/total # of sessions
**	Session sizing
!Improvements
* Bug fix: forgot to report a change in the JSTL 1.0 sessionDetail.jsp which caused the page throw an exception (missing tag attribute varName). Credit to Ajay Chaudhary for reporting the issue.
* Bug fix: {{{<script>}}} element was injected at end of page. XHTML pages can not accept {{{<script>}}} element at a wrong location.
<<<
We now parse response to inject our script after {{{<head>}}} instead. Fall back to end of doc if no {{{<head>}}} (malformed html).
So far, only IE is broken (as usual), as it digests XHTML as simple HTML (and thus, works when it shouldn't). All other browsers errored while parsing (as they should).
<<<
* First shot at a JMX API (unreleased yet)
!Additions
* Added last/total request/response length to profile used outgoing bandwidth for a given session
* Redesigned session details screen: there was too much information in there for a simple list
* Added ~WebApp-related statistics:
**	hits count
**	bandwidth used (incoming/outgoing)
**	current/peak/total-created number of active sessions
**	application-scope attributes list (with size)
!Improvements
* Bug fix: when refreshing a sorted session list, sort order (ASC or DESC) was lost
* code clean-up to clearly separate ~WebApp and Session-related data, in preparation for some JMX stuff
!Additions
* Added isSecure attribute to session information (yellow background in sessions list)
* Added Session size
* Added Session and ~ServletContext attributes Class name in session-detail and webapp view, as attribute value tool-tip (don't let toString() fool you!)
* Added ~WebApp platform name and startup time
!Additions
* JMX management! That's right, you can now bypass MessAdmin servlet to monitor your ~WebApp (requires Java 5)!
>	Don't forget to enable JMX in you application server...
* Added [[Jakarta Commons Logging|http://commons.apache.org/logging/]] cleanup to webapp shutdown-time cleanup (JCL <= 1.0.4)
* Added {{{META-INF/MANIFEST.MF}}} with package version
!Improvements
* Restored Java 1.3 compatibility
* Full Java EE 1.3 compatibility (you couldn't send messages in previous versions)
* Documented the webapp shutdown-time cleanup (this was coded since 1.0)
* Relaxed requirements for demo webapp (Java EE 1.4 -> 1.3, removed JSTL dependency for smaller download)
* Made sure the administrative message popup is on top of the browser window (it could sometimes appear below)
* Bug fix: Session list could have difficulties to be displayed under heavy load
* Bug fix: script injection did not recognize all-caps {{{<HEAD>}}} (it was looking for lower-case {{{<head>}}}).
>	Note that it still does not recognize {{{<head >}}} element with attributes (rare case).
* Bug fix: script injection could sometime mess up with the rendering of host page
* Bug fix: noJSTL ~JSPs were horribly broken. Sorry about that!
* removed JSTL 1.0 ~JSPs. Use either the JSTL 1.1 or the no-JSTL version
* shuffled the sources a bit to better conform to maven2 layout
!Improvements
* Bug fix: object sizing when testing webapps in WSAD 5 could lead to {{{java.lang.NoClassDefFoundError: org.eclipse.core.resources.IWorkspaceRoot}}}. This version has been hardened against such a possibility.
<<<
	[[JavaWorld forum thread|http://www.javaworld.com/javaforums/showflat.php?Cat=&Board=958763&Number=15235&page=0&view=collapsed&sb=5&o=]]
	Credit to Siva Prakash Papineni <psprakash@users.sourceforge.net> for reporting the issue.
<<<
!Improvements
* Really fix the WSAD bug with wasn't by version 2.0.1...
!Additions
* added Session stats:
**	last used server time (time the server spent to service this user's last request)
**	minimum / maximum time needed to service a user's request
* added ~WebApp stat: total used server time
* added request query string to lastRequestURL to capture GET parameters
* Added Ant build scripts (Maven is too much): much easier to build a release now! :)
* integrated MessAdmin with [[Improve Foundation|http://www.improve-foundations.com]] (commercial ~SOA-oriented development factory platform)
* now also count webapp hits (along with request/response size and used server time) when no ~HttpSession is created ("anonymous" browsing)
!Improvements
* replaced useless session stat "Used Time" (was: session last accessed time - session creation time) with "Total Used Server Time", which is more meaningful (total time the server spent to service that user)
* eliminated all reflection calls for even more speed
* simplified installation a bit (no distinction between ~J2EE 1.3 and 1.4 now)
* First pass at native code for object sizing, when using Java 5+
>	unreleased yet; will not speed up computations, only more accurate for 64 bits ~JVMs (hopefully)
!Additions
* major code reorganization and refactoring (including improvements to the build tools)
>	a side effect is that JMX will never be late again on the administration webapp. In fact, it's now quite the contrary!
* brand new [[plug-in|Plugins]] system for easy extension ([[write your own!|CreatePlugins]]). Some default plug-ins are included in the core distribution; please see the documentation for details.
<<<
some included plug-ins are:
*	user name and locale extraction. Some default plug-ins are included in the core distribution, with support for [[Tapestry 3.x and 4.x|http://tapestry.apache.org]], [[Struts 1.x|http://struts.apache.org/1.x/]], [[Spring 1.x and 2.x|http://www.springframework.org]] and (partially) JSTL
*	fetch application-specific information (return either raw XHTML or tabular data)
>		no default implementation: write your own!
>		Thanks to Hammed RAMDANI for expanding upon the original idea
*	optional plugin to automatically invalidate expired ~HttpSessions (seems to be a recurrent tomcat problem)
expect even more new plugins in the next versions!
<<<
* new ant-based tool to easily install required MessAdmin files and patch your {{{web.xml}}} file
>	Thanks to Pascal BELLUGUE for asking for such a tool!
* added optional "AuthorizationPassword" init parameter to password-protect the administration servlet (easier to use than ~J2EE security)
* added flag (red background) for non-serializable session attributes: important for clusters or persisting sessions
* administration webapp now asks for confirmation before invalidating sessions
* added autorefresh option on (some) administration web pages
* added HTTP request Method (displayed in front of 'lastRequestURL')
* added authentication scheme (as user name tooltip)
* added more tooltip information on administration web pages; hover over text elements to find them!/%

%/
!Improvements
* in previous MessAdmin versions, if the application server started up with serialized sessions (e.g. non-empty {{{SESSION.ser}}} in Tomcat), those sessions where invisible from MessAdmin.
>Those sessions will now be automatically discovered on their first access.
* corrected ~HttpSession size to only compute the size of its attributes (no more 3MB empty session!)
* got rid of the ~JSTL-version ~JSPs. Installation is that much easier now.
* corrected missing '?' when displaying a query string
* renamed "Inactive Time" to "Idle Time"
* Switched to TiddlyWiki for the documentation and web site. Looks better now. :-)
* Thanks to Karsten Voges and Pascal BELLUGUE for private beta testing!
This is a bug-fix release, with controlled fixes from the 4.0 branch.
Many thanks to all of you who contacted me to report bugs, suggest improvements, or simply say kind words!
!Improvements
* the administration application now works on Safari
* made the administration application work with ~IE6 when served behind an Apache Httpd 2 server. Thanks to Jason Barry for reminding me to fix this old bug!
* bug fix: injected session messages would disappear even if not displayed (e.g. request was for an image or a pdf). They are now kept in memory until successfully displayed
* workaround a Sun bug where some objects' size could not be computed (credit to François Mercier for both reporting and fixing this issue)
** http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5012949
* corrected bug in the session list where the page would not be well-formed XML in some cases (credit to Sven Herschel for reporting the issue)
* corrected problem where Resin would 3.0 complain about an abstract tag. Credit to vega65 at users.sourceforge.net for discovering the issue
Note to self: never publish a release in a hurry, or risk forgetting some fixes! :)
!Improvements
* workaround for a ~NullPointerException with BEA Weblogic 8.1.5 / Java 1.4.2_05 / XP. Credit to Fernando Boaglio for reporting the issue
* made the administration application work with Oracle's picky JSP processor (tested with Oracle ~OC4J 10.1.3)
!Additions
* ''Server monitoring!'' Why monitor a single webapp when you can watch the whole server?
* added Server information page and associated operations
* new plugin type: ServerDataProvider
* ''new plugin: ~ServletStats'', displaying statistics on application servlets
* ''new plugin: ~ClickStream'', which re-creates the [[ClickStream|www.http://opensymphony.com/clickstream/]] monitoring utility
* ''new core plugin: ~ThreadsDumper'', displaying active server threads
* new plugin type: RequestExceptionProvider, which handles exception reporting
* reworked administration pages for easier navigation and use (no more popups!)
* added SSL information (for secure connections): cipher suite name, algorithm bit size
* added servlet request processing errors (error count + last error)
* added MessAdmin version number to the administration pages
* the administration application now fully uses the "Redirect after POST" pattern. You can use the back button without fear! :)
* moved remaining text documentation into this TiddlyWiki
* //incompatible change:// plugin type ApplicationDataProvider has been split in 2: ApplicationDataProvider and SessionDataProvider. Please update your plugins!
* //incompatible change:// the ant tool syntax has slightly changed
* removed deprecated classes and methods/%

%/
!Improvements
* corrected bug where plugins would be executed in an incorrect order
* removed potential contention point which could have affected performance under heavy load on multi-processor systems
* simplified (yet again) installation instructions
* beautified bytes number formatting
* second try to get maven working the way I want. Dependency management is great, but documentation not so... It's almost there, except I couldn't manage to generate {{{META-INF/MANIFEST.MF}}} the way I want, so it is back to ant for now. (For the technically inclined: I need maven-jar-plugin 2.1, which is not the current version yet)
* completed Ant build scripts to generate a full bin+src distribution: even easier to build a release now! :)
* Thanks to Pascal BELLUGUE for private beta testing!/%

%/
!Known issues
* MessAdmin administration application does not work with BEA ~WebLogic 9.x. It has been tested, and works ok, with BEA ~WebLogic 8.1, Oracle ~OC4J 10.1.3, Tomcat 4.1 and 5.5, ~JBoss 4.0.
* Plugins must be installed at the same level as {{{MessAdmin-Core.jar}}} (i.e. you can't install at the server level and have an application-specific plugin)
!Improvements
* corrected bug where {{{MessAdmin.war}}} would not find its tag library. Doh! (Credit to Ian Rowlands and Edward Gabriel Moraru for reporting the issue.)
!Additions
* ''administration webapp is now internationalised!'' Now is a good time to set your preferred language in your favourite browser... ;-)
**	French translation by Cédrik LIME
**	[[Translators wanted!|Translators (I18N) Wanted]]
* ~WebLogic 9 users, rejoice! While the administration application is still not compatible with your application server, you can add a {{{?format=text}}} to the administration URL to access its data! Thanks to Anand Ayyagary for the incentive.
* ''new core plugin: ~ServletContextInitParametersProvider'', displaying {{{web.xml}}}'s {{{<context-param>}}} elements
* ''new core plugin: ~ClassLoaderDisplayer'', displaying the current application's [[ClassLoader|http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html]] to help you get rid of those pesky ~ClassCastExceptions
* support for [[JBoss Seam|http://www.seamframework.org/]] for displaying user name and locale. Thanks to Anand Ayyagary for the suggestion.
* support for [[Acegi Security|http://www.acegisecurity.org/]] for getting the currently authenticated user name
* data blocks displayed in administration pages are now collapsible
* all textareas are now resizeable ([[FireFox|http://www.mozilla.com/]] and [[CSS3-compatible|http://www.w3.org/TR/css3-ui/#resize]] browsers only)
* application-level message is now displayed only once every 60 seconds instead of on every request. Thanks to Ian Rowlands for the idea!
* now displays free disk space for temp and working directory, as tooltips in the Server view (requires Java 6)
* now also displays the total size of all active ~HttpSessions for a given application
* server memory is now also displayed as a graph/%

%/
!Improvements
* bug fix: plugins can now be installed at the application level (previously they needed to be at the same level as {{{MessAdmin-Core.jar}}}, i.e. you couldn't install MessAdmin at the server level and have an application-specific plugin)
* custom plugins extending {{{BaseTabularXXXDataProvider}}} can now influence the generated table look. See {{{BaseTabularDataProvider}}} for methods you can override
* JMX now exports session size
* ServletStats plugin now sorts its display by total used time, instead of number of hits
* added css to buttons. One more step toward pretty pages... :-)
* slightly simplified installation instructions
* 2 more evil singletons taken care of at application shutdown time (see core plugin [[EvilSingletonsUnregisterer|ApplicationLifeCycleProvider]])
* clean up [[Log4J|http://logging.apache.org/log4j/1.2/]] and [[LogBack|http://logback.qos.ch/]] NDC/MDC ~ThreadLocal at end of ~HttpRequest (prevents funny looking log files and ~OutOfMemoryExceptions on hot redeploy)
* if the application name is not defined in {{{web.xml}}} (no {{{<display-name>}}} tag), try to fetch it from maven-provided information (in {{{META-INF/MANIFEST.MF}}})
* corrected an object sizing bug with BEA ~JRockit 1.4. Credit to yoann35 [at] users.sourceforge.net for reporting the issue.
* corrected a bug where messages would never be displayed if the page content-type is not in lower-case
* session ~IDs are now correctly encoded in HTML links. Credit to Alan Moor for reporting the issue.
* corrected a bug where page hits would not be counted when the page triggered an exception on the server
* corrected a bug where ~WebSphere 6.0 / RAD 7 could not display the administration pages (complained about a non-existent el function). Credit to Jeremy Gaither for reporting the issue./%

%/
!Known issues
* MessAdmin administration application does not work with BEA ~WebLogic 9.x. It has been tested, and works fine, with BEA ~WebLogic 8.1, Oracle ~OC4J 10.1.3, Tomcat 4.1 to 6.0, ~JBoss 4.0, with ~JVMs from 1.3 to 6. As a workaround, append a {{{?format=text}}} parameter to the URL.
!Additions
* ~WebLogic 9 users, rejoice! The administration application is at last compatible with your application server! {{{?format=text}}} is now useless. Many thanks to Andy Turner for the patch./%

%/
!Improvements
* bug fix: password-protected administration webapp works again with [[Tomcat|http://tomcat.apache.org]] 5.5.26/6.0.16
* moved administration webapp's ~JavaScripts to bottom of page, as per [[Yahoo's Best Practices|http://developer.yahoo.com/performance/rules.html]] #6
!Additions
* [[License|License / Contact]] change: from new BSD to Simplified BSD, which removes the final "no-endorsement" clause and is thus roughly equivalent to the MIT License. MessAdmin is even more free than before!
* ''new core plugin: ~ResourceBrowser'', for browsing the content of your ~WebApp war and downloading key files (e.g. configuration files)!
* ''new plugin: DiskBrowser'', for browsing the content of your filesystem!
* ''new plugin: ScriptExecutor'', for executing Java Script live on your server!
* ''new plugin: Log4J'', for a live view of your application logs
* ''new plugin: [[Ehcache]]'', for some statistics on your caches
* MessAdmin now understands the {{{X-Forwarded-For}}} HTTP header placed by most reverse proxys and load balancers, for identifying the originating IP address of a client
* support for [[Spring Security|http://static.springsource.org/spring-security/]] 2 and 3, for getting the currently authenticated user name
* network usage now also counts request/response headers size (previously only request/response body size was reported)
* administration webapp: panels now keep their state (expanded/collapsed), for as long as you keep your browser window open
* administration webapp: display application-specific temporary folder (i.e. {{{servletContext.getAttribute("javax.servlet.context.tempdir")}}})
* administration webapp: tooltips are indicated by /%a small @@font-size:50%;font-weight:lighter;^^?^^@@%/ a @@background-color:infobackground;light background@@. Credit to Alexandre Sompheng for the idea./%

%/
!Improvements
* added a couple of missing translations
* corrected a possible runtime error while displaying administrative pages. Credit to Wolfgang javabreak [at] users.sourceforge.net and Sébastien Koechlin skc [at] users.sourceforge.net for reporting the issue.
* corrected a possible ~NullPointerException at server shutdown
* fixed a language mismatch when the browser locale is set to "en,fr". Credit to Gwyn Evans for reporting the issue.
* when the administration application is separated from the monitored applications, the monitored application name (technically: ~ServletContext name) is now known at startup for Servlet 2.5 compliant servers (e.g. Tomcat 6); no need to wait for the first hit anymore! Thanks to Giancarlo F. Berner for reminding me of this possibility.
!Servlet 2.3 / Java 1.3 end-of-life notice
MessAdmin 4.3 will be the last version to support the Servlet 2.3 specification (e.g. Tomcat 4.x) and Java 1.3. Next version will require Servlet 2.4 and Java 1.4. [[Contact us|License / Contact]] should you need to prolong support for Servlet 2.3 and/or Java 1.3.
!Additions
* [[Ehcache]] plugin can now clear (remove all elements from) a cache
* 1 more evil singleton taken care of at application shutdown time: [[MySQL JDBC driver|http://dev.mysql.com/downloads/connector/j/]] <= 5.1.10 (see core plugin [[EvilSingletonsUnregisterer|ApplicationLifeCycleProvider]])
* updated the ant-based tool to set a password on the administration webapp
* updated the administration webapp with a submenu for easier navigation/%

%/
!Improvements
* fixed the build script to restore the binary distribution compatibility with Java 1.3.
* corrected a possible runtime error when the monitored application manually closed the response output stream. Credit to Markus Reich for reporting the issue.
* correctly count HTTP response size when response is reset()
* corrected a small display issue in the Log4J plugin where one could not configure the MessAdmin appender log size once set to {{{0}}}
* worked around yet another JVM crash when computing object size. Thanks to Sébastien Koechlin skc [at] users.sf.net for reporting the issue.
* fixed incorrect disk object count display in the [[Ehcache]] plugin
* corrected a rare NPE preventing startup when a web application had no resource named "{{{/}}}"
* corrected an issue in the administration webapp when the the (file system) path of the monitored web application contained non-ascii characters, on some application servers only
!Requirements change
MessAdmin now requires Java 1.4 and a Servlet 2.4-compliant container (e.g. Tomcat 5, ~WebLogic 9 or ~WebSphere 6). While we don't officially support Servlet 2.3-compliant containers, ~MessAdmin-Core is still compatible with this specification version; see the [[advanced installation instructions|Advanced installation]] for installation details.
!Additions
* ''Major addition'': MessAdmin is now truly ''plug and play''! That's right, no more patching your {{{web.xml}}} (apart from eventually declaring the administration servlet)! See the AutoProbe plugins for details.
* removed the ant-based installation tool, since it is now mostly obsoleted by the AutoProbe plugin
* ''new core plugin: ~JNDIBrowser'', for browsing the JNDI directory
* ''new plugin: [[Hibernate]]'', displaying your [[Hibernate|http://www.hibernate.org/]]'s ~SessionFactory statistics (requires [[Spring Framework|http://www.springframework.org]])
* ''new plugin: [[Quartz]]'', displaying your currently defined [[Quartz 1.x|http://www.quartz-scheduler.org/]] Jobs
* ~WebApp page also displays [[HTTP response status codes|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html#getStatus%28%29]] statistics (only accurate with a Servlet 3 container)
* 1 more evil singleton taken care of at application shutdown time: {{{java.util.ResourceBundle}}} cache (see core plugin [[EvilSingletonsUnregisterer|ApplicationLifeCycleProvider]])/%

%/
!Improvements
* Added transparent on-the-fly compression capability to the ~WARBrowser and DiskBrowser plugins. You will now download those huge log files twice as fast!
* ScriptExecutor plugin now can also execute scripts in the application context
* [[Ehcache]] plugin can now reset cache statistics
* Since [[Ehcache]] 2.1 defaults to disabling statistics (for performance reasons), we can now enable and disable those at runtime
* [[Ehcache]] plugin now understands the new Enterprise Ehcache 2.3 off-heap store (AKA [[BigMemory|http://terracotta.org/bigmemory]])
* Log4J plugin also displays a Logger's Appenders (if any)
* Administration application menu stays on top of screen, for easier navigation
* Sessions list now also displays the remote host address
* Session detail page can now auto-refresh, just as the sessions list does
* Speed up the rendering display of administration webapp/%

%/
!Bug fixes
* Correctly track changing [[HttpSession|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSession.html]] ID (used in prevention to Session Fixation attacks)
* Trying to display a non-existant ~HttpSession detail page no longer results in a 500 server error
!Additions
* MessAdmin can now display on-demand Thread Dumps (requires Java 5). No need to have ssh access to your server to run "{{{kill -USR1 <pid>}}}" or "{{{jstack -l <pid>}}}"!/%

%/
!Improvements
* The administration application will display in Google Chrome Frame (if available), for those stuck to IE/%

%/
!Bug fixes
* Corrected a performance problem where the http response could under certain circumstances take much more time than needed. Many thanks to Julien Vroonen for his detailed report and analysis.
* Fixed a cosmetic display issue with negative times where the minus sign was after a leading 0
* Corrected an issue where the administration webapp crashes in Google ~AppEngine. Note that MessAdmin is quite useless in GAE due to how applications are started and stopped on-demand there.
!Additions
* added a ''sampling CPU profiler'' (requires Java 5)
* display the ''system load average'' if available (requires Java 6)
* automatic ''deadlocked threads'' detection (requires Java 5)
* displays aggregate ''Garbage Collectors statistics'' (requires Java 5)
* displays an [[update notification|Update notification]] if a new version is available/%

%/
!Improvements
* [[Quartz plugin|Quartz]] can now interact with {{{Scheduler}}}s (pause &amp; resume), {{{Trigger}}}s (pause, resume &amp; delete), and {{{Job}}}s (interrupt, run &amp; delete)
* [[DiskBrowser plugin|DiskBrowser]] now sorts its listings by name, and places folders at the top
* [[DiskBrowser plugin|DiskBrowser]] can now //rename//, //delete// and //compress// files and folders. Use your new powers wisely!
* [[DiskBrowser plugin|DiskBrowser]] defaults to display the current working directory ({{{${user.dir}}}}) instead of the root path ({{{/}}})
* ~JNDIBrowser plugin will now display some JNDI ~DataSource basic properties (as a tooltip)
* [[Ehcache plugin|Ehcache]] now displays <html><abbr title="Time To Live">TTL</abbr></html> and <html><abbr title="Time To Idle">TTI</abbr></html> cache configuration
* [[Ehcache plugin|Ehcache]] now displays the //number of searches by second// and the //average search time// (requires Ehcache 2.4)
* [[Log4J plugin|Log4J]] displays {{{Appender}}}s threshold (if set)
* you can now reload part of the administration webapp pages; useful for refreshing the content of a data provider without reloading the whole page
* remove support for resizing {{{textarea}}}'s in the administration webapp, now that all (but one) major browsers support that feature natively/%

%/
!Bug fixes
* correctly take into account multiple {{{X-Forwarded-For}}} headers instead of using only the first one
!Java 1.4 end-of-life notice
MessAdmin 5.3 will be the last version to support Java 1.4. Next version will require Java 5. [[Contact us|License / Contact]] should you need to prolong support for Java 1.4.
!Additions
* Display server name in the "Server information" page (duh!)/%

%/
!Improvements
* Object sizing is now an optional separate plugin ({{{MessAdmin-SizeOf}}}), as computing the size of an object can be expensive. Note that this only affects the administration webapp (no object sizing is done during monitoring operations).
* DiskBrowser plugin can now mass-delete, mass-compress, and mass-download files and directories
* Tweaked the CPU profiler to not exclude by default threads reading / writing to a socket/%

%/
!Bug fixes
* Fixed a possible ~GZip compression corruption due to a JVM bug (Java &le; 6)
* [[Ehcache plugin|Ehcache]]: fixed an issue when using Ehcache 1.5 and no {{{jsr107cache.jar}}} is present in the classpath
* [[Hibernate plugin|Hibernate]]: fixed an issue displaying native SQL queries with Hibernate 3.2.6 under some circumstances
* [[DiskBrowser plugin|DiskBrowser]]: fixed an issue where one could not compress a folder if it contained a file > 4 GB
* [[DiskBrowser plugin|DiskBrowser]]: fixed a cosmetic issue where downloading a file containing a space would result in the saved file name being truncated
* [[DiskBrowser plugin|DiskBrowser]]: fixed an issue where it would display only one of several files with the same name but with differing case (e.g. {{{test}}} and {{{Test}}})
!Java 1.5 end-of-life notice
MessAdmin 5.4 will be the last version to support Java 1.5. Next version will require Java 6. [[Contact us|License / Contact]] should you need to prolong support for Java 1.5.
!Requirements change
* ''MessAdmin now requires Java 5'' and a Servlet 2.4-compliant container (e.g. Tomcat 5, ~WebLogic 9 or ~WebSphere 6)
* the [[Quartz]]1 plugin now requires Quartz 1.6.2 (up from 1.5.2) and optionally Spring 2.5.6 (up from 1.2.9)
* the [[Ehcache]] plugin now requires Ehcache 1.4.1 (up from 1.3.0)
* the [[Hibernate]] plugin now requires Hibernate 3.1.3 (up from 3.0.5) and Spring 2.5.6 (up from 1.2.9)
* [[Maven|http://maven.apache.org]] (>= 3.0.4) replaces [[Ant|http://ant.apache.org]] for building/%

%/
!Additions
* ''new plugin: [[Quartz]]2'', for managing your [[Quartz 2.x|http://www.quartz-scheduler.org/]] Jobs
* MessAdmin wil now display the list of currently executing HTTP requests
* display warnings on high CPU usage and low disk space (requires Java 6)
**	system load > 1.2 * #CPU cores
**	low filesystem disk space (tmp dirs < 1 GB or < 2% total FS size)
**	this comes in addition of existing stuck threads detection
* new debug tool: echo request HTTP headers (try {{{?action=echo}}})/%

%/
!Improvements
* increase wall clock time measurement accuracy
** NTP is prone to time correction, so use {{{System.nanoTime()}}} (which is monotonic) instead of {{{System.currentTimeMillis()}}} (which granularity is not always great anyway) to measure wall clock time
* [[Ehcache]] plugin can now enable / disable statistics and clear all caches in one operation for all caches
* ({{{P}}}){{{GZipOutputStream}}} and {{{ZipOutputStream}}} now implement {{{java.nio.channels.WritableByteChannel}}} for easier interoperability
* Multithreaded ~GZip compression: consider current system load when computing optimal # of CPU cores to use (previously used all available CPU cores)
* Log4J display Appenders' Filters (if any)/%

%/
!Removals
* removed the [[JMX]] plugin, as it has been integrated into the core
* removed support for Google Chrome Frame since it has been [[retired|http://blog.chromium.org/2013/06/retiring-chrome-frame.html]]/%

%/
!Bug fixes
* some plugins could not find their localized resources under specific installations
* (try to) fix a rare bug where the JNDI browser could not browse anything
(Optional but highly recommended) protect the administration application.
If not set, anyone knowing the correct URL can access the MessAdmin administration servlet (in a stateless way)!

You have 2 options for doing this:
* use the built-in "AuthorizationPassword" parameter of the MessAdmin administration servlet (defined in {{{web.xml}}}).
* set Java EE security on the administration servlet. Please see your friendly user manual coming with your application server for instructions. Usually, you will have to configure your server and add the following to {{{web.xml}}}:
{{{
<security-constraint>
	<web-resource-collection>
		<web-resource-name>MessAdminJSPs</web-resource-name>
		<url-pattern>/MessAdmin/*</url-pattern>
	</web-resource-collection>
	<auth-constraint>
		<role-name>administrator</role-name> 
	</auth-constraint>
	<user-data-constraint>
		<transport-guarantee>NONE</transport-guarantee><!-- NONE | INTEGRAL | CONFIDENTIAL -->
	</user-data-constraint>
</security-constraint>

<security-constraint>
	<web-resource-collection>
		<web-resource-name>MessAdminServlet</web-resource-name>
		<url-pattern>/messadmin</url-pattern>
	</web-resource-collection>
	<auth-constraint>
		<role-name>administrator</role-name> 
	</auth-constraint>
	<user-data-constraint>
		<transport-guarantee>NONE</transport-guarantee><!-- NONE | INTEGRAL | CONFIDENTIAL -->
	</user-data-constraint>
</security-constraint>

<security-role>
	<role-name>administrator</role-name>
</security-role>
}}}
Tip: if using an Apache httpd server in front of your Java EE server, you can also map the MessAdmin administration servlet to an httpd-unknown extension mapping, so that it can only be accessed from within your organization.