geronimo-scm mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Geronimo v2.1: Plugin infrastructure (page edited)
Date Tue, 26 Feb 2008 21:04:00 GMT
<html>
<head>
    <base href="http://cwiki.apache.org/confluence" />
    <style type="text/css">
    <!--
    body, p, td, table, tr, .bodytext, .stepfield {
	font-family: Verdana, arial, sans-serif;
	font-size: 11px;
	line-height: 16px;
	color: #000000;
	font-weight: normal;
}
#PageContent {
	text-align: left;
	background-color: #fff;
	padding: 0px;
	margin: 0px;
    padding-bottom:20px;
}
/*
** when this stylesheet is used for the Tiny MCE Wysiwyg editor's edit area, we can't
** use an id=PageContent or class=wiki-content, so we must
** set the body style to that used for PageContent, and p to that used for wiki-content.
*/

body {
	margin: 0px;
	padding: 0px;
	text-align: center;
    background-color: #f0f0f0;
}

@media print {

body {
    background-color: #fff;
}

}

.monospaceInput {
    font:12px monospace
}

.wiki-content p, .commentblock p {
    margin: 16px 0px 16px 0px;
    padding: 0px;
}

.wiki-content-preview {
    padding: 5px;
    border-left: 1px solid #3c78b5;
    border-right: 1px solid #3c78b5;
}

ul, ol {
    margin-top: 2px;
    margin-bottom: 2px;
    padding-top: 0px;
    padding-bottom: 0px;
}

pre {
    padding: 0px;
    margin-top: 5px;
    margin-left: 15px;
    margin-bottom: 5px;
    margin-right: 5px;
    text-align: left;
}

.helpheading {
    font-weight: bold;
    background-color: #D0D9BD;
        border-bottom: 1px solid #3c78b5;
        padding: 4px 4px 4px 4px;
        margin: 0px;
        margin-top: 10px;
}
.helpcontent {
        padding: 4px 4px 20px 4px;
    background-color: #f5f7f1;
}

.code {
 	border: 1px dashed #3c78b5;
    font-size: 11px;
	font-family: Courier;
    margin: 10px;
	line-height: 13px;
}

.focusedComment {
    background: #ffffce;
}

.commentBox, .focusedComment {
    padding: 10px;
    margin: 5px 0 5px 0;
    border: 1px #bbb solid;
}

.codeHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.codeContent {
    text-align: left;
    background-color: #f0f0f0;
    padding: 3px;
}

.preformatted {
 	border: 1px dashed #3c78b5;
    font-size: 11px;
	font-family: Courier;
    margin: 10px;
	line-height: 13px;
}

.preformattedHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.preformattedContent {
    background-color: #f0f0f0;
    padding: 3px;
}

.panel {
 	border: 1px dashed #3c78b5;
    margin: 10px;
    margin-top: 0px;
}

.panelHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.panelContent {
    background-color: #f0f0f0;
    padding: 5px;
}

.anonymousAlert {
    background-color: #f0f0f0;
 	border: 1px dashed red;
    font-size: 11px;
    padding: 10px 5px 10px 5px;
    margin: 4px;
	line-height: 13px;
}

.lockAlert {
    background-color: #f0f0f0;
    width: 50%;
 	border: 1px dashed red;
    font-size: 11px;
    padding: 10px 5px 10px 5px;
    margin: 4px;
	line-height: 13px;
}


.code-keyword {
  color: #000091;
  background-color: inherit;
}

.code-object {
  color: #910091;
  background-color: inherit;
}

.code-quote {
  color: #009100;
  background-color: inherit;
}

.code-comment {
  color: #808080;
  background-color: inherit;
}


.code-xml .code-keyword {
  color: inherit;
  font-weight: bold;
}

.code-tag {
  color: #000091;
  background-color: inherit;
}

.breadcrumbs {
    background-color: #f0f0f0;
 	border-color: #3c78b5;
	border-width: 1px 0px 1px 0px;
	border-style: solid;
    font-size: 11px;
    padding: 3px 0px 3px 0px;
}

.navmenu {
    border: 1px solid #ccc;
}

.menuheading {
    font-weight: bold;
    background-color: #f0f0f0;
 	border-bottom: 1px solid #3c78b5;
	padding: 4px 4px 2px 4px;
}

.menuitems {
	padding: 4px 4px 20px 4px;
}

.rightpanel {
    border-left: 1px solid #ccc;
    border-bottom: 1px solid #ccc;
}

#helpheading {
    text-align: left;
    font-weight: bold;
    background-color: #D0D9BD;
 	border-bottom: 1px solid #3c78b5;
	padding: 4px 4px 4px 4px;
	margin: 0px;
}
#helpcontent {
	padding: 4px 4px 4px 4px;
    background-color: #f5f7f1;
}
.helptab-unselected {
    font-weight: bold;
	padding: 5px;
    background-color: #f5f7f1;
}
.helptab-selected {
    font-weight: bold;
    background-color: #D0D9BD;
	padding: 5px;
}
.helptabs {
    margin: 0px;
    background-color: #f5f7f1;
	padding: 5px;
}
.infopanel-heading {
    font-weight: bold;
	padding: 4px 0px 2px 0px;
}

.pagebody {
}

.pageheader {
	padding: 5px 5px 5px 0px;
 	border-bottom: 1px solid #3c78b5;
}

.pagetitle {
	font-size: 22px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
}

.newpagetitle {
    color: #ccc !important;
}

.steptitle {
	font-size: 18px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
	margin-bottom: 7px;
}

.substeptitle {
    font-size: 12px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
    margin: 2px 4px 4px 4px;
    padding: 2px 4px 1px 4px;
}

.stepdesc {
    font-family: Verdana, arial, sans-serif;
	font-size: 11px;
	line-height: 16px;
	font-weight: normal;
    color: #666666;
    margin-top: 7px;
    margin-bottom: 7px;
}

.steplabel {
    font-weight: bold;
    margin-right: 4px;
    color: black;
    float: left;
    width: 15%;
    text-align: right;
}

.stepfield {
    background: #f0f0f0;
    padding: 5px;
}

.submitButtons{
    margin-top:5px;
    text-align:right;
}

.formtitle {
	font-size: 12px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
}

.sectionbottom {
    border-bottom: 1px solid #3c78b5;
}

.topRow {
    border-top: 2px solid #3c78b5;
}

.tabletitle {
	font-size: 14px;
	font-weight: bold;
	font-family: Arial, sans-serif;
    padding: 3px 0px 2px 0px;
    margin: 8px 4px 2px 0px;
	color: #003366;
	border-bottom: 2px solid #3c78b5;
}
.pagesubheading {
    color: #666666;
    font-size: 10px;
    padding: 0px 0px 5px 0px;
}

HR {
	color: 3c78b5;
	height: 1;
}

A:link, A:visited, A:active, A:hover {
	color: #003366;
}

h1 A:link, h1 A:visited, h1 A:active {
	text-decoration: none;
}

h1 A:hover {
    border-bottom: 1px dotted #003366;
}

.wiki-content > :first-child, .commentblock > :first-child {
    margin-top: 3px;
}

.logocell {
    padding: 10px;
}

input {
	font-family: verdana, geneva, arial, sans-serif;
	font-size: 11px;
	color: #000000;
}

textarea, textarea.editor {
	font-family: verdana, geneva, arial, sans-serif;
	font-size: 11px;
	color: #333333;
}

/* use logoSpaceLink instead.
.spacenametitle {
	font: 21px/31px Impact, Arial, Helvetica;
    font-weight: 100;
    color: #999999;
	margin: 0px;
}
.spacenametitle img {
  margin: 0 0 -4px 0;
}
.spacenametitle a {
    text-decoration: none;
    color: #999999;
}
.spacenametitle a:visited {
    text-decoration: none;
    color: #999999;
}*/

.spacenametitle-printable {
	font: 20px/25px Impact, Arial, Helvetica;
    font-weight: 100;
    color: #999999;
	margin: 0px;
}
.spacenametitle-printable a {
    text-decoration: none;
    color: #999999;
}
.spacenametitle-printable a:visited {
    text-decoration: none;
    color: #999999;
}

.blogDate {
	font-weight: bold;
	text-decoration: none;
	color: black;
}

.blogSurtitle {
    background: #f0f0f0;
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.blogHeading {
    font-size: 20px;
    line-height: normal;
    font-weight: bold;
    padding: 0px;
    margin: 0px;
}

.blogHeading a {
   text-decoration: none;
   color: black;
}

.endsection {
	align: right;
	color: #666666;
	margin-top: 10px;
}
.endsectionleftnav {
	align: right;
	color: #666666;
	margin-top: 10px;
}

h1 {
	font-size: 24px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	color: #003366;
 	border-bottom: 1px solid #3c78b5;
	padding: 2px;
	margin: 36px 0px 4px 0px;
}

h2 {
	font-size: 18px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
 	border-bottom: 1px solid #3c78b5;
	padding: 2px;
	margin: 27px 0px 4px 0px;
}

h3 {
	font-size: 14px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 21px 0px 4px 0px;
}

h4 {
	font-size: 12px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 18px 0px 4px 0px;
}

h4.search {
	font-size: 12px;
	line-height: normal;
	font-weight: normal;
	background-color: #f0f0f0;
	padding: 4px;
	margin: 18px 0px 4px 0px;
}

h5 {
	font-size: 10px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 14px 0px 4px 0px;
}

h6 {
	font-size: 8px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 14px 0px 4px 0px;
}

.smallfont {
    font-size: 10px;
}
.descfont {
    font-size: 10px;
    color: #666666;
}
.smallerfont {
    font-size: 9px;
}
.smalltext {
    color: #666666;
    font-size: 10px;
}
.smalltext a {
    color: #666666;
}
.smalltext-blue {
    color: #3c78b5;
    font-size: 10px;
}
.surtitle {
    margin-left: 1px;
    margin-bottom: 5px;
    font-size: 14px;
    color: #666666;
}

/* css hack found here:  http://www.fo3nix.pwp.blueyonder.co.uk/tutorials/css/hacks/ */
.navItemOver { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #003366; cursor: hand; voice-family: '\'}\''; voice-family:inherit; cursor: pointer;}
.navItemOver a { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItemOver a:visited { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItemOver a:hover { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItem { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; }
.navItem a { color: #ffffff; text-decoration: none; }
.navItem a:hover { color: #ffffff; text-decoration: none; }
.navItem a:visited { color: #ffffff; text-decoration: none; }

div.padded { padding: 4px; }
div.thickPadded { padding: 10px; }
h3.macrolibrariestitle {
    margin: 0px 0px 0px 0px;
}

div.centered { text-align: center; margin: 10px; }
div.centered table {margin: 0px auto; text-align: left; }

.tableview table {
    margin: 0;
}

.tableview th {
    text-align: left;
    color: #003366;
    font-size: 12px;
    padding: 5px 0px 0px 5px;
    border-bottom: 2px solid #3c78b5;
}
.tableview td {
    text-align: left;
    border-color: #ccc;
    border-width: 0px 0px 1px 0px;
    border-style: solid;
    margin: 0;
    padding: 4px 10px 4px 5px;
}

.grid {
    margin: 2px 0px 5px 0px;
    border-collapse: collapse;
}
.grid th  {
    border: 1px solid #ccc;
    padding: 2px 4px 2px 4px;
    background: #f0f0f0;
    text-align: center;
}
.grid td  {
    border: 1px solid #ccc;
    padding: 3px 4px 3px 4px;
}
.gridHover {
	background-color: #f9f9f9;
}

td.infocell {
    background-color: #f0f0f0;
}
.label {
	font-weight: bold;
	color: #003366;
}

label {
	font-weight: bold;
	color: #003366;
}

.error {
	background-color: #fcc;
}

.errorBox {
	background-color: #fcc;
    border: 1px solid #c00;
    padding: 5px;
    margin: 5px;
}

.errorMessage {
	color: #c00;
}

.success {
	background-color: #dfd;
}

.successBox {
	background-color: #dfd;
    border: 1px solid #090;
    padding: 5px;
    margin-top:5px;
    margin-bottom:5px;
}

blockquote {
	padding-left: 10px;
	padding-right: 10px;
	margin-left: 5px;
	margin-right: 0px;
	border-left: 1px solid #3c78b5;
}

table.confluenceTable
{
    margin: 5px;
    border-collapse: collapse;
}

/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
table.confluenceTable td.confluenceTd
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
}

/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
table.confluenceTable th.confluenceTh
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
    background-color: #f0f0f0;
    text-align: center;
}

td.confluenceTd
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
}

th.confluenceTh
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
    background-color: #f0f0f0;
    text-align: center;
}

DIV.small {
	font-size: 9px;
}

H1.pagename {
	margin-top: 0px;
}

IMG.inline  {}

.loginform {
    margin: 5px;
    border: 1px solid #ccc;
}

/* The text how the "This is a preview" comment should be shown. */
.previewnote { text-align: center;
                font-size: 11px;
                    color: red; }

/* How the preview content should be shown */
.previewcontent { background: #E0E0E0; }

/* How the system messages should be shown (DisplayMessage.jsp) */
.messagecontent { background: #E0E0E0; }

/* How the "This page has been modified..." -comment should be shown. */
.conflictnote { }

.createlink {
    color: maroon;
}
a.createlink {
    color: maroon;
}
.templateparameter {
    font-size: 9px;
    color: darkblue;
}

.diffadded {
    background: #ddffdd;
    padding: 1px 1px 1px 4px;
	border-left: 4px solid darkgreen;
}
.diffdeleted {
    color: #999;
    background: #ffdddd;
    padding: 1px 1px 1px 4px;
	border-left: 4px solid darkred;
}
.diffnochange {
    padding: 1px 1px 1px 4px;
	border-left: 4px solid lightgrey;
}
.differror {
    background: brown;
}
.diff {
    font-family: lucida console, courier new, fixed-width;
	font-size: 12px;
	line-height: 14px;
}
.diffaddedchars {
    background-color:#99ff99;
    font-weight:bolder;
}
.diffremovedchars {
    background-color:#ff9999;
    text-decoration: line-through;
    font-weight:bolder;
}

.greybackground {
    background: #f0f0f0
}

.greybox {
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.borderedGreyBox {
    border: 1px solid #cccccc;
    background-color: #f0f0f0;
    padding: 10px;
}

.greyboxfilled {
 	border: 1px solid #ddd;
    background: #f0f0f0;
    padding: 3px;
	margin: 1px 1px 10px 1px;
}

.navBackgroundBox {
    padding: 5px 5px 5px 5px;
    font-size: 22px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: white;
    background: #3c78b5;
    text-decoration: none;
}

.previewBoxTop {
	background-color: #f0f0f0;
    border-width: 1px 1px 0px 1px;
    border-style: solid;
    border-color: #3c78b5;
    padding: 5px;
    margin: 5px 0px 0px 0px;
    text-align: center;
}
.previewContent {
    background-color: #fff;
 	border-color: #3c78b5;
	border-width: 0px 1px 0px 1px;
	border-style: solid;
	padding: 10px;
	margin: 0px;
}
.previewBoxBottom {
	background-color: #f0f0f0;
    border-width: 0px 1px 1px 1px;
    border-style: solid;
    border-color: #3c78b5;
    padding: 5px;
    margin: 0px 0px 5px 0px;
    text-align: center;
}

.functionbox {
    background-color: #f0f0f0;
 	border: 1px solid #3c78b5;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.functionbox-greyborder {
    background-color: #f0f0f0;
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.search-highlight {
    background-color: #ffffcc;
}

/* normal (white) background */
.rowNormal {
    background-color: #ffffff;
 }

/* alternate (pale yellow) background */
.rowAlternate {
    background-color: #f7f7f7;
}

/* used in the list attachments table */
.rowAlternateNoBottomColor {
    background-color: #f7f7f7;
}

.rowAlternateNoBottomNoColor {
}

.rowAlternateNoBottomColor td {
    border-bottom: 0px;
}

.rowAlternateNoBottomNoColor td {
    border-bottom: 0px;
}

/* row highlight (grey) background */
.rowHighlight {
    background-color: #f0f0f0;

}

TD.greenbar {FONT-SIZE: 2px; BACKGROUND: #00df00; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
TD.redbar {FONT-SIZE: 2px; BACKGROUND: #df0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
TD.darkredbar {FONT-SIZE: 2px; BACKGROUND: #af0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }

TR.testpassed {FONT-SIZE: 2px; BACKGROUND: #ddffdd; PADDING: 0px; }
TR.testfailed {FONT-SIZE: 2px; BACKGROUND: #ffdddd; PADDING: 0px; }

.toolbar  {
    margin: 0px;
    border-collapse: collapse;
}

.toolbar td  {
    border: 1px solid #ccc;
    padding: 2px 2px 2px 2px;
    color: #ccc;
}

td.noformatting {
    border-width: 0px;
    border-style: none;
    text-align: center;
	padding: 0px;
}

.commentblock {
    margin: 12px 0 12px 0;
}

/*
 * Divs displaying the license information, if necessary.
 */
.license-eval, .license-none, .license-nonprofit {
    border-top: 1px solid #bbbbbb;
    text-align: center;
    font-size: 10px;
    font-family: Verdana, Arial, Helvetica, sans-serif;
}

.license-eval, .license-none {
    background-color: #ffcccc;
}

.license-eval b, .license-none b {
    color: #990000
}

.license-nonprofit {
    background-color: #ffffff;
}

/*
 * The shadow at the bottom of the page between the main content and the
 * "powered by" section.
 */
.bottomshadow {
    height: 12px;
    background-image: url("$req.contextPath/images/border/border_bottom.gif");
    background-repeat: repeat-x;
}

/*
 * Styling of the operations box
 */
.navmenu .operations li, .navmenu .operations ul {
    list-style: none;
    margin-left: 0;
    padding-left: 0;
}

.navmenu .operations ul {
    margin-bottom: 9px;
}

.navmenu .label {
    font-weight: inherit;
}

/*
 * Styling of ops as a toolbar
 */
.toolbar div {
    display: none;
}

.toolbar .label {
    display: none;
}

.toolbar .operations {
    display: block;
}

.toolbar .operations ul {
    display: inline;
    list-style: none;
    margin-left: 10px;
    padding-left: 0;
}

.toolbar .operations li {
    list-style: none;
    display: inline;
}

/* list page navigational tabs */
#foldertab {
padding: 3px 0px 3px 8px;
margin-left: 0;
border-bottom: 1px solid #3c78b5;
font: bold 11px Verdana, sans-serif;
}

#foldertab li {
list-style: none;
margin: 0;
display: inline;
}

#foldertab li a {
padding: 3px 0.5em;
margin-left: 3px;
border: 1px solid #3c78b5;
border-bottom: none;
background: #3c78b5;
text-decoration: none;
}

#foldertab li a:link { color: #ffffff; }
#foldertab li a:visited { color: #ffffff; }

#foldertab li a:hover {
color: #ffffff;
background: #003366;
border-color: #003366;
}

#foldertab li a.current {
background: white;
border-bottom: 1px solid white;
color: black;
}

#foldertab li a.current:link { color: black; }
#foldertab li a.current:visited { color: black; }
#foldertab li a.current:hover {
background: white;
border-bottom: 1px solid white;
color: black;
}

/* alphabet list */
ul#squaretab {
margin-left: 0;
padding-left: 0;
white-space: nowrap;
font: bold 8px Verdana, sans-serif;
}

#squaretab li {
display: inline;
list-style-type: none;
}

#squaretab a {
padding: 2px 6px;
border: 1px solid #3c78b5;
}

#squaretab a:link, #squaretab a:visited {
color: #fff;
background-color: #3c78b5;
text-decoration: none;
}

#squaretab a:hover {
color: #ffffff;
background-color: #003366;
border-color: #003366;
text-decoration: none;
}

#squaretab li a#current {
background: white;
color: black;
}

.blogcalendar * {
    font-family:verdana, arial, sans-serif;
    font-size:x-small;
    font-weight:normal;
    line-height:140%;
    padding:2px;
}


table.blogcalendar {
    border: 1px solid #3c78b5;
}

.blogcalendar th.calendarhead, a.calendarhead {
    font-size:x-small;
    font-weight:bold;
    padding:2px;
    text-transform:uppercase;
    background-color: #3c78b5;
    color: #ffffff;
    letter-spacing: .3em;
    text-transform: uppercase;
}

.calendarhead:visited {color: white;}
.calendarhead:active {color: white;}
.calendarhead:hover {color: white;}

.blogcalendar th {
    font-size:x-small;
    font-weight:bold;
    padding:2px;
    background-color:#f0f0f0;
}

.blogcalendar td {
    font-size:x-small;
    font-weight:normal;
}

.searchGroup { padding: 0 0 10px 0; background: #f0f0f0; }
.searchGroupHeading { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; padding: 2px 4px 1px 4px; }
.searchItem { padding: 1px 4px 1px 4px; }
.searchItemSelected { padding: 1px 4px 1px 4px; font-weight: bold; background: #ddd; }

/* permissions page styles */
.permissionHeading {
    border-bottom: #bbb; border-width: 0 0 1px 0; border-style: solid; font-size: 16px; text-align: left;
}
.permissionTab {
    border-width: 0 0 0 1px; border-style: solid; background: #3c78b5; color: #ffffff; font-size: 10px;
}
.permissionSuperTab {
    border-width: 0 0 0 1px; border-style: solid; background: #003366; color: #ffffff;
}
.permissionCell {
    border-left: #bbb; border-width: 0 0 0 1px; border-style: solid;
}

/* warning panel */
.warningPanel { background: #FFFFCE; border:#F0C000 1px solid; padding: 8px; margin: 10px; }
/* alert panel */
.alertPanel { background: #FFCCCC; border:#C00 1px solid; padding: 8px; margin: 10px; }
/* info panel */
.infoPanel { background: #D8E4F1; border:#3c78b5 1px solid; padding: 8px; margin: 10px; }

/* side menu highlighting (e.g. space content screen) */
.optionPadded { padding: 2px; }
.optionSelected { background-color: #ffffcc; padding: 2px; border: 1px solid #ddd; margin: -1px; }
.optionSelected a { font-weight: bold; text-decoration: none; color: black; }

/* information macros */
.noteMacro { border-style: solid; border-width: 1px; border-color: #F0C000; background-color: #FFFFCE; text-align:left; margin-top: 5px; margin-bottom: 5px}
.warningMacro { border-style: solid; border-width: 1px; border-color: #c00; background-color: #fcc; text-align:left; margin-top: 5px; margin-bottom: 5px}
.infoMacro { border-style: solid; border-width: 1px; border-color: #3c78b5; background-color: #D8E4F1; text-align:left; margin-top: 5px; margin-bottom: 5px}
.tipMacro { border-style: solid; border-width: 1px; border-color: #090; background-color: #dfd; text-align:left; margin-top: 5px; margin-bottom: 5px}
.informationMacroPadding { padding: 5px 0 0 5px; }

table.infoMacro td, table.warningMacro td, table.tipMacro td, table.noteMacro td, table.sectionMacro td {
    border: none;
}

table.sectionMacroWithBorder td.columnMacro { border-style: dashed; border-width: 1px; border-color: #cccccc;}

.pagecontent
{
    padding: 10px;
    text-align: left;
}

/* styles for links in the top bar */
.topBarDiv a:link {color: #ffffff;}
.topBarDiv a:visited {color: #ffffff;}
.topBarDiv a:active {color: #ffffff;}
.topBarDiv a:hover {color: #ffffff;}
.topBarDiv {color: #ffffff;}

.topBar {
    background-color: #003366;
}


/* styles for extended operations */
.greyLinks a:link {color: #666666; text-decoration:underline;}
.greyLinks a:visited {color: #666666; text-decoration:underline;}
.greyLinks a:active {color: #666666; text-decoration:underline;}
.greyLinks a:hover {color: #666666; text-decoration:underline;}
.greyLinks {color: #666666; display:block; padding: 10px}

.logoSpaceLink {color: #999999; text-decoration: none}
.logoSpaceLink a:link {color: #999999; text-decoration: none}
.logoSpaceLink a:visited {color: #999999; text-decoration: none}
.logoSpaceLink a:active {color: #999999; text-decoration: none}
.logoSpaceLink a:hover {color: #003366; text-decoration: none}

/* basic panel (basicpanel.vmd) style */
.basicPanelContainer {border: 1px solid #3c78b5; margin-top: 2px; margin-bottom: 8px; width: 100%}
.basicPanelTitle {padding: 5px; margin: 0px; background-color: #f0f0f0; color: black; font-weight: bold;}
.basicPanelBody {padding: 5px; margin: 0px}

.separatorLinks a:link {color: white}
.separatorLinks a:visited {color: white}
.separatorLinks a:active {color: white}

.greynavbar {background-color: #f0f0f0; border-top: 1px solid #3c78b5; margin-top: 2px}

div.headerField {
    float: left;
    width: auto;
    height: 100%;
}

.headerFloat {
    margin-left: auto;
    width: 50%;
}

.headerFloatLeft {
    float: left;
    margin-right: 20px;
    margin-bottom: 10px;
}

#headerRow {
    padding: 10px;
}

div.license-personal {
   background-color: #003366;
   color: #ffffff;
}

div.license-personal a {
   color: #ffffff;
}

.greyFormBox {
    border: 1px solid #cccccc;
    padding: 5px;
}

/* IE automatically adds a margin before and after form tags. Use this style to remove that */
.marginlessForm {
    margin: 0px;
}

.openPageHighlight {
    background-color: #ffffcc;
    padding: 2px;
    border: 1px solid #ddd;
}

.editPageInsertLinks, .editPageInsertLinks a
{
    color: #666666;
    font-weight: bold;
    font-size: 10px;
}

/* Style for label heatmap. */
.top10 a {
    font-weight: bold;
    font-size: 2em;
    color: #003366;
}
.top25 a {
    font-weight: bold;
    font-size: 1.6em;
    color: #003366;
}
.top50 a {
    font-size: 1.4em;
    color: #003366;
}
.top100 a {
    font-size: 1.2em;
    color: #003366;
}

.heatmap {
    list-style:none;
    width: 95%;
    margin: 0px auto;
}

.heatmap a {
    text-decoration:none;
}

.heatmap a:hover {
    text-decoration:underline;
}

.heatmap li {
    display: inline;
}

.minitab {
padding: 3px 0px 3px 8px;
margin-left: 0;
margin-top: 1px;
margin-bottom: 0px;
border-bottom: 1px solid #3c78b5;
font: bold 9px Verdana, sans-serif;
text-decoration: none;
float:none;
}
.selectedminitab {
padding: 3px 0.5em;
margin-left: 3px;
margin-top: 1px;
border: 1px solid #3c78b5;
background: white;
border-bottom: 1px solid white;
color: #000000;
text-decoration: none;
}
.unselectedminitab {
padding: 3px 0.5em;
margin-left: 3px;
margin-top: 1px;
border: 1px solid #3c78b5;
border-bottom: none;
background: #3c78b5;
color: #ffffff;
text-decoration: none;
}

a.unselectedminitab:hover {
color: #ffffff;
background: #003366;
border-color: #003366;
}

a.unselectedminitab:link { color: white; }
a.unselectedminitab:visited { color: white; }

a.selectedminitab:link { color: black; }
a.selectedminitab:visited { color: black; }

.linkerror { background-color: #fcc;}

a.labelOperationLink:link {text-decoration: underline}
a.labelOperationLink:active {text-decoration: underline}
a.labelOperationLink:visited {text-decoration: underline}
a.labelOperationLink:hover {text-decoration: underline}

a.newLabel:link {background-color: #ddffdd}
a.newLabel:active {background-color: #ddffdd}
a.newLabel:visited {background-color: #ddffdd}
a.newLabel:hover {background-color: #ddffdd}

ul.square {list-style-type: square}

.inline-control-link {
    background: #ffc;
    font-size: 9px;
    color: #666;
    padding: 2px;
    text-transform: uppercase;
    text-decoration: none;
}


.inline-control-link a:link {text-decoration: none}
.inline-control-link a:active {text-decoration: none}
.inline-control-link a:visited {text-decoration: none}
.inline-control-link a:hover {text-decoration: none}

.inline-control-link {
    background: #ffc;
    font-size: 9px;
    color: #666;
    padding: 2px;
    text-transform: uppercase;
    text-decoration: none;
    cursor: pointer;
}

div.auto_complete {
    width: 350px;
    background: #fff;
}
div.auto_complete ul {
    border: 1px solid #888;
    margin: 0;
    padding: 0;
    width: 100%;
    list-style-type: none;
}
div.auto_complete ul li {
    margin: 0;
    padding: 3px;
}
div.auto_complete ul li.selected {
    background-color: #ffb;
}
div.auto_complete ul strong.highlight {
    color: #800;
    margin: 0;
    padding: 0;
}

/******* Edit Page Styles *******/
.toogleFormDiv{
    border:1px solid #A7A6AA;
    background-color:white;
    padding:5px;
    margin-top: 5px;
}

.toogleInfoDiv{
    border:1px solid #A7A6AA;
    background-color:white;
    display:none;
    padding:5px;
    margin-top: 10px;
}

.inputSection{
    margin-bottom:20px;
}

#editBox{
   border:1px solid lightgray;
   background-color:#F0F0F0;
}

/******* Left Navigation Theme Styles ********/
.leftnav li a {
    text-decoration:none;
    color:white;
    margin:0px;
    display:block;
    padding:2px;
    padding-left:5px;
    background-color: #3c78b5;
    border-top:1px solid #3c78b5;
}

.leftnav li a:active {color:white;}
.leftnav li a:visited {color:white;}
.leftnav li a:hover {background-color: #003366; color:white;}

/* Added by Shaun during i18n */
.replaced
{
    background-color: #33CC66;
}

.topPadding
{
    margin-top: 20px;
}

/* new form style */
.form-block {
    padding: 6px;
}
.form-error-block {
    padding: 6px;
    background: #fcc;
    border-top: #f0f0f0 1px solid;
    border-bottom: #f0f0f0 1px solid;
    margin-bottom: 6px;
    padding: 0 12px 0 12px;
}
.form-element-large {
    font-size: 16px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
}

.form-element-small {
    font-size: 12px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
}

.form-header {
    background: lightyellow;
    border-top: #f0f0f0 1px solid;
    border-bottom: #f0f0f0 1px solid;
    margin-bottom: 6px;
    padding: 0 12px 0 12px;
}
.form-header p, .form-block p, .form-error-block p {
    line-height: normal;
    margin: 12px 0 12px 0;
}
.form-example {
    color: #888;
    font-size: 11px;
}
.form-divider {
    border-bottom: #ccc 1px solid;
    margin-bottom: 6px;
}
.form-buttons {
    margin-top: 6px;
    border-top: #ccc 1px solid;
    border-bottom: #ccc 1px solid;
    background: #f0f0f0;
    padding: 10px;
    text-align: center;
}
.form-buttons input {
    width: 100px;
}
.form-block .error {
    padding: 6px;
    margin-bottom: 6px;
}
    -->
    </style>
</head>
<body>

<div id="PageContent">
<table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%"><tr>
<td valign="top" class="pagebody">

    <div class="pageheader">
        <span class="pagetitle">
            Page Edited :
            <a href="http://cwiki.apache.org/confluence/display/GMOxDOC21">GMOxDOC21</a> :
            <a href="http://cwiki.apache.org/confluence/display/GMOxDOC21/Plugin+infrastructure">Plugin infrastructure</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/GMOxDOC21/Plugin+infrastructure">Plugin infrastructure</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~hcunico">Hernan Cunico</a>
            <span class="smallfont">(Feb 26, 2008)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=75492&originalVersion=5&revisedVersion=6">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><style type='text/css'>/*<![CDATA[*/
table.ScrollbarTable  {border: none;padding: 3px;width: 100%;padding: 3px;margin: 0px;background-color: #f0f0f0}
table.ScrollbarTable td.ScrollbarPrevIcon {text-align: center;width: 16px;border: none;}
table.ScrollbarTable td.ScrollbarPrevName {text-align: left;border: none;}
table.ScrollbarTable td.ScrollbarParent {text-align: center;border: none;}
table.ScrollbarTable td.ScrollbarNextName {text-align: right;border: none;}
table.ScrollbarTable td.ScrollbarNextIcon {text-align: center;width: 16px;border: none;}

/*]]>*/</style><div class="Scrollbar"><table class='ScrollbarTable'><tr><td class='ScrollbarPrevIcon'><a href="/confluence/display/GMOxDOC21/Monitoring"><img border='0' align='middle' src='/confluence/images/icons/back_16.gif' width='16' height='16'></a></td><td width='33%' class='ScrollbarPrevName'><a href="/confluence/display/GMOxDOC21/Monitoring">Monitoring</a>&nbsp;</td><td width='33%' class='ScrollbarParent'><sup><a href="/confluence/display/GMOxDOC21/Documentation"><img border='0' align='middle' src='/confluence/images/icons/up_16.gif' width='8' height='8'></a></sup><a href="/confluence/display/GMOxDOC21/Documentation">Documentation</a></td><td width='33%' class='ScrollbarNextName'>&nbsp;<a href="/confluence/display/GMOxDOC21/Plugin+infrastructure+enhancements">Plugin infrastructure enhancements</a></td><td class='ScrollbarNextIcon'><a href="/confluence/display/GMOxDOC21/Plugin+infrastructure+enhancements"><img border='0' align='middle' src='/confluence/images/icons/forwd_16.gif' width='16' height='16'></a></td></tr></table></div>
<p>Starting with Geronimo 2.1 the servers are assembled entirely out of plugins.  </p>
<ul>
	<li>Most plugins are Geronimo modules, describing a classloader and services and possibly containing classes and resources.</li>
	<li>Plugins also contain descriptive information and include additional instructions on how the plugin fits into a server.</li>
	<li>Information about multiple plugins can be collected into a plugin catalog, often located in a maven repository</li>
	<li>A plugin repository is basically a plugin catalog together with a maven-structured repository containing plugins.</li>
	<li>Plugins can be installed from a plugin repository into an existing geronimo server using gshell commands or the admin console.</li>
	<li>Plugin metadata for an existing plugin in a geronimo server can be edited (to some extent) in the admin console.</li>
	<li>Maven can be used to assemble a new server out of plugins in a maven repository (not requiring a plugin catalog)</li>
	<li>A new server containing a specified set of plugins can be extracted from an existing server using a gshell command or the admin console.</li>
	<li>The dependency system assures that the resulting server has all needed plugins to operate.</li>
</ul>


<p>This document is organized in the following sections:</p>
<div>
<ul>
  <li><a href='#Plugininfrastructure-Pluginbasics'>Plugin basics</a>
<ul>
  <li><a href='#Plugininfrastructure-Additionalinformation'>Additional information</a></li>
  <li><a href='#Plugininfrastructure-Wheredoesthisadditionalconfigurationinformationgo%3F'>Where does this additional configuration information go?</a></li>
</ul></li>
  <li><a href='#Plugininfrastructure-Buildingaplugin.'>Building a plugin.</a></li>
  <li><a href='#Plugininfrastructure-Installingplugins'>Installing plugins</a></li>
  <li><a href='#Plugininfrastructure-Extractingaserverfromanexistingserver.'>Extracting a server from an existing server.</a></li>
  <li><a href='#Plugininfrastructure-Assemblingaserverusingmaven.'>Assembling a server using maven.</a></li>
</ul></div>

<h1><a name="Plugininfrastructure-Pluginbasics"></a>Plugin basics</h1>
<p>A Geronimo plugin is a jar-structured file that contains a META-INF/geronimo-plugin.xml descriptor following this schema:</p>

<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt;</span>
&lt;!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the <span class="code-quote">"License"</span>); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an <span class="code-quote">"AS IS"</span> BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
--&gt;

&lt;xs:schema targetNamespace=<span class="code-quote">"http://geronimo.apache.org/xml/ns/plugins-1.3"</span>  
           <span class="code-keyword">xmlns:list</span>=<span class="code-quote">"http://geronimo.apache.org/xml/ns/plugins-1.3"</span>
           <span class="code-keyword">xmlns:atts</span>=<span class="code-quote">"http://geronimo.apache.org/xml/ns/attributes-1.2"</span>
           <span class="code-keyword">xmlns:jaxb</span>=<span class="code-quote">"http://java.sun.com/xml/ns/jaxb"</span>
           <span class="code-keyword">xmlns:xjc</span>=<span class="code-quote">"http://java.sun.com/xml/ns/jaxb/xjc"</span>
           <span class="code-keyword">xmlns:xs</span>=<span class="code-quote">"http://www.w3.org/2001/XMLSchema"</span>
           elementFormDefault=<span class="code-quote">"qualified"</span>
           attributeFormDefault=<span class="code-quote">"unqualified"</span>
           jaxb:extensionBindingPrefixes=<span class="code-quote">"xjc"</span>
           jaxb:version=<span class="code-quote">"2.0"</span>&gt;

    &lt;xs:import namespace=<span class="code-quote">"http://geronimo.apache.org/xml/ns/attributes-1.2"</span>
               schemaLocation=<span class="code-quote">"attributes-1.2.xsd"</span>/&gt;

    <span class="code-tag">&lt;xs:annotation&gt;</span>
        <span class="code-tag">&lt;xs:appinfo&gt;</span>
            <span class="code-tag">&lt;jaxb:globalBindings&gt;</span>
                <span class="code-tag">&lt;xjc:serializable uid=<span class="code-quote">"12343"</span>/&gt;</span>
            <span class="code-tag">&lt;/jaxb:globalBindings&gt;</span>
        <span class="code-tag">&lt;/xs:appinfo&gt;</span>
    <span class="code-tag">&lt;/xs:annotation&gt;</span>
    <span class="code-tag">&lt;xs:annotation&gt;</span>
        <span class="code-tag">&lt;xs:documentation&gt;</span>
            Schema for a list of Geronimo plugins available at some external site
            (namely, a Maven 2 repository).
        <span class="code-tag">&lt;/xs:documentation&gt;</span>
    <span class="code-tag">&lt;/xs:annotation&gt;</span>

    <span class="code-tag"><span class="code-comment">&lt;!--   Top-level elements   --&gt;</span></span>

    <span class="code-tag">&lt;xs:element name=<span class="code-quote">"geronimo-plugin-list"</span> type=<span class="code-quote">"list:plugin-listType"</span>&gt;</span>
        <span class="code-tag">&lt;xs:annotation&gt;</span>
            <span class="code-tag">&lt;xs:documentation&gt;</span>
                The geronimo-plugin-list root element is used for the config file present
                in the root directory of a Maven repository supporting Geronimo plugin
                downloads. This will be scanned by Geronimo clients to determine what
                plugins are available on that server.
            <span class="code-tag">&lt;/xs:documentation&gt;</span>
        <span class="code-tag">&lt;/xs:annotation&gt;</span>
    <span class="code-tag">&lt;/xs:element&gt;</span>
    <span class="code-tag">&lt;xs:element name=<span class="code-quote">"geronimo-plugin"</span> type=<span class="code-quote">"list:pluginType"</span>&gt;</span>
        <span class="code-tag">&lt;xs:annotation&gt;</span>
            <span class="code-tag">&lt;xs:documentation&gt;</span>
                The geronimo-plugin root element is used as the config file submitted
                with an individual Geronimo plugin to the plugin repository. It will be
                merged into the plugin list for the repository when the submitted plugin
                is accepted.

                It is also used for the metadata packed into a plugin when a plugin archive
                is downloaded from an online repository for local installation, in which
                case it should be packed into the archive at META-INF/geronimo-plugin.xml
            <span class="code-tag">&lt;/xs:documentation&gt;</span>
        <span class="code-tag">&lt;/xs:annotation&gt;</span>
    <span class="code-tag">&lt;/xs:element&gt;</span>

    <span class="code-tag"><span class="code-comment">&lt;!--   Data types used in this schema   --&gt;</span></span>

    <span class="code-tag"><span class="code-comment">&lt;!-- Format for a list of available plugins provided by a remote repository --&gt;</span></span>
    <span class="code-tag">&lt;xs:complexType name=<span class="code-quote">"plugin-listType"</span>&gt;</span>
        <span class="code-tag">&lt;xs:sequence&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"plugin"</span> type=<span class="code-quote">"list:pluginType"</span> minOccurs=<span class="code-quote">"0"</span> maxOccurs=<span class="code-quote">"unbounded"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        The list of plugins available in the current plugin repository.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"default-repository"</span> type=<span class="code-quote">"xs:string"</span> minOccurs=<span class="code-quote">"0"</span> maxOccurs=<span class="code-quote">"unbounded"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        Each default-repository is a URL to check for any dependencies that
                        need to be downloaded. Different values can be used, for example, to
                        host Geronimo plugins at one site and common third-party JARs at
                        another site, or to maintain a plugin list at a site that is not
                        actually a repository.

                        The URL where this fill is downloaded from must list itself as the
                        first default-repository if it wants to be checked for file
                        downloads in addition to hosting the plugin list. For every
                        dnwload, each of the repositories listed here will be checked in
                        the order listed until the artifact is found. However, if a
                        plugin in the list includes its own source-repository list, those
                        repositories will be used instead of these list-level repositories
                        when downloading that plugin or its dependencies.

                        Note that while the primary repository may be protected by HTTP
                        Basic authentication, the backup repositories must either use the
                        same username and password as the primary or use no authentication.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
        <span class="code-tag">&lt;/xs:sequence&gt;</span>
    <span class="code-tag">&lt;/xs:complexType&gt;</span>

    <span class="code-tag">&lt;xs:complexType name=<span class="code-quote">"pluginType"</span>&gt;</span>
        <span class="code-tag">&lt;xs:sequence&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"name"</span> type=<span class="code-quote">"xs:string"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        A human-readable name for this plugin. This will be used to identify
                        the plugin to a user when giving them a list of plugins to select from.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"category"</span> type=<span class="code-quote">"xs:string"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        A category name for this plugin. The user interface typically groups
                        plugins by their category name, so this should match the value for other
                        plugins in the same category.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"description"</span> type=<span class="code-quote">"xs:string"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        A description of this plugin. This will be displayed when the user
                        looks for more information about this plugin. It typically includes
                        a description of what it does, what if any third-party software it's
                        based on, why it would be interesting to use it, etc.

                        Currently this should be plain text, where whitespace is not significant
                        except an entirely blank line indicates a paragraph break (like this
                        documentation, for example). This may change to a more structured format
                        in the future, if we can agree on what that ought to be.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"url"</span> type=<span class="code-quote">"xs:string"</span> minOccurs=<span class="code-quote">"0"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        The URL for a site that contains more detailed information about this
                        plugin. The plugin repository has access to the basic information
                        provided in this file, but a plugin may have a home page with more
                        detailed information, documentation, source code, etc.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"author"</span> type=<span class="code-quote">"xs:string"</span> minOccurs=<span class="code-quote">"0"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        Names the author of the plugin. This may be a person, a company, an
                        open source project, or whatever. Basically, this gives some idea who
                        submitted the plugin, perhaps where to go for support, etc.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"license"</span> type=<span class="code-quote">"list:licenseType"</span> minOccurs=<span class="code-quote">"0"</span> maxOccurs=<span class="code-quote">"unbounded"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        The name of the license that applies to this plugin, usually composed of a
                        license class (if any) followed by the name and version of a license:
                        BSD -- Apache Software License (ASL) 2.0
                        GPL -- Lesser General Public License (LGPL) 2

                        If there is more than one license listed then that means the user may choose
                        among any of the available licenses.

                        Contains a mandatory true/false attribute indicating whether this license
                        is OSI-approved (e.g. whether the plugin is open source).

                        Note that the license declared here applies only to the current component.
                        Any dependencies may be licensed separately.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"plugin-artifact"</span> type=<span class="code-quote">"list:pluginArtifactType"</span> minOccurs=<span class="code-quote">"1"</span> maxOccurs=<span class="code-quote">"unbounded"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        A version and container senstive instance of this plugin.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
        <span class="code-tag">&lt;/xs:sequence&gt;</span>
    <span class="code-tag">&lt;/xs:complexType&gt;</span>

    <span class="code-tag">&lt;xs:complexType name=<span class="code-quote">"pluginArtifactType"</span>&gt;</span>
        <span class="code-tag">&lt;xs:sequence&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"module-id"</span> type=<span class="code-quote">"list:artifactType"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        The Geronimo moduleId for this plugins, which uniquely identifies
                        it, and also is used to construct a path to download it if necessary.
                        If no module-id is provided, that means this is a plugin group, which is
                        just a list of other plugins to install. The prerequisites must still be
                        met, but then the dependencies listed for this plugin will be treated as
                        the list of actual plugins to install.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"hash"</span> type=<span class="code-quote">"list:hashType"</span> minOccurs=<span class="code-quote">"0"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        A hash value (typically MD5 or SHA-1) that applies to the plugin download
                        file. This can be used to confirm that a plugin download was complete, and
                        to ensure that the file downloaded is the same as the file originally
                        posted to the repository.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"geronimo-version"</span> type=<span class="code-quote">"xs:string"</span> minOccurs=<span class="code-quote">"0"</span> maxOccurs=<span class="code-quote">"unbounded"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        Indicates a version of the Geronimo base server that this plugin can run in.
                        If no geronimo-version is listed, that means the plugin can run in any version
                        of Geronimo so long as the prerequisites, parents, and dependencies are present.
                        If one or more geronimo-version elements are listed, then the current version of
                        Geronimo must match one of them in order for this plugin to be installable.

                        This is applied as an exact match: 1.2 does not match 1.2.1 or 1.2-SNAPSHOT
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"jvm-version"</span> type=<span class="code-quote">"xs:string"</span> minOccurs=<span class="code-quote">"0"</span> maxOccurs=<span class="code-quote">"unbounded"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        Indicates a version of the JVM that this plugin can run in. If no jvm-version
                        is listed, that means the plugin can run in any version of the JVM supported
                        by Geronimo so long as the prerequisites, parents, and dependencies are present.
                        If one or more jvm-version elements are listed, then the JVM that Geronimo is
                        currently running on must match one of them in order for this plugin to be
                        installable. (It does not stop you from restarting Geronimo on a different JVM
                        version once the components is already installed.)

                        This is not normally used, but must be for plugins that use CORBA or
                        serialized QNames, etc.

                        This is applied as a prefix match: 1.4 matches 1.4.2 or 1.4.2_10
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"prerequisite"</span> type=<span class="code-quote">"list:prerequisiteType"</span> minOccurs=<span class="code-quote">"0"</span> maxOccurs=<span class="code-quote">"unbounded"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        A dependency of this plugin that must be previously installed if this
                        plugin is to be considered to be installable. This is generally the
                        same as the dependency element (for example, it may refer to a plugin
                        by moduleId or a JAR by repository ID) except that the dependency will not
                        be downloaded on demand and must have been previously installed.

                        This is currently used for a web application to specify the web container it
                        runs in (so we don't show Tomcat downloads for a Jetty installation, etc.). It
                        may be used for similar things in the future if more distribution choices are
                        added to Geronimo.

                        It is also used by the public Geronimo plugin repository in cases where the
                        dependencies cannot be redistributed (e.g. a dependency on a commercial JDBC
                        driver JAR which must be manually acquired and installed).

                        It is also used when a user must set something up (like a database pool or
                        security realm) to point to a custom resource in their environment before the
                        plugin can be installed.

                        This is applied as an exact match, except that the version number may be
                        omitted, in which case any matching version of the dependency will work.

                        It has an optional resource-type attribute indicating to the user what type
                        of prerequisite this is (for cases where they're expected to set something up
                        as opposed to just downloading a JAR). e.g. it could be set to <span class="code-quote">"JDBC Pool"</span>.
                        Likewise there is an option description to provide more detailed guidance for
                        how to resolve the prerequisite.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"dependency"</span> type=<span class="code-quote">"list:dependencyType"</span> minOccurs=<span class="code-quote">"0"</span> maxOccurs=<span class="code-quote">"unbounded"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        The moduleId of another plugin or Geronimo module, or the repository ID of
                        a 3rd party JAR that this plugin depends on. That means that the dependency
                        must be downloaded and installed if this plugin is selected.

                        This is applied as an exact match, except that the version number may be
                        omitted, in which case any matching version of the dependency will work.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"obsoletes"</span> type=<span class="code-quote">"list:artifactType"</span> minOccurs=<span class="code-quote">"0"</span> maxOccurs=<span class="code-quote">"unbounded"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        The moduleId of another plugin or Geronimo module that this plugin replaces.
                        That can be used, for example, to replace a less functional module
                        with a more functional one, or to upgrade a component to a newer version.

                        This is applied as an exact match, except that the version number may be
                        omitted, in which case any matching version of the module or plugin will be
                        replaced. Be aware that omitting the version number may cause a
                        plugin to be downgraded, so you may choose to explicitly list all
                        lesser versions. That may not be desirable either, though. If the
                        server has foo-1.0.2 installed and you install foo-1.0.1, would you
                        rather have it downgrade or end up with both installed?

                        NOTE: currently the <span class="code-quote">"obsoletes"</span> entries are only processed on the
                        plugin(s) passed directly to the PluginInstaller (not on dependencies that
                        are brought down as a result). That means that a plugin group must list
                        obsoletes for all its components, etc.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"source-repository"</span> type=<span class="code-quote">"xs:string"</span> minOccurs=<span class="code-quote">"0"</span> maxOccurs=<span class="code-quote">"unbounded"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        The base URL for the repository that this plugin should be downloaded from.
                        The repositories listed here will be consulted in the order listed every
                        time something needs to be downloaded, and the search will stop at the
                        first repository that holds any matching plugin or JAR.

                        In a normal plugin list, the repositories are specified at the list level,
                        and do not need to be repeated at the plugin level. However, any values
                        specified at the plugin level replace the values specified at the list
                        level. This can be used to maintain a single list of plugins from multiple
                        sources.

                        This value is required if this is not a plugin list but metadata for a
                        single plugin included in a plugin file downloaded from a repository.
                        Otherwise, the installer would not know where to download any dependencies
                        from.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"copy-file"</span> type=<span class="code-quote">"list:copy-fileType"</span> minOccurs=<span class="code-quote">"0"</span> maxOccurs=<span class="code-quote">"unbounded"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        Lets a plugin include files that should be copied into the Geronimo
                        installation tree, beyond copying the plugin into the repository. For
                        example, this could be used to copy files into geronimo/bin, geronimo/lib,
                        geronimo/var/security/keystores, or other Geronimo dirs.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"config-xml-content"</span> type=<span class="code-quote">"list:config-xml-contentType"</span> minOccurs=<span class="code-quote">"0"</span> maxOccurs=<span class="code-quote">"unbounded"</span>/&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"artifact-alias"</span> type=<span class="code-quote">"list:propertyType"</span> minOccurs=<span class="code-quote">"0"</span> maxOccurs=<span class="code-quote">"unbounded"</span>/&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"config-substitution"</span> type=<span class="code-quote">"list:propertyType"</span> minOccurs=<span class="code-quote">"0"</span> maxOccurs=<span class="code-quote">"unbounded"</span>/&gt;</span>
        <span class="code-tag">&lt;/xs:sequence&gt;</span>
    <span class="code-tag">&lt;/xs:complexType&gt;</span>

    <span class="code-tag">&lt;xs:complexType name=<span class="code-quote">"config-xml-contentType"</span>&gt;</span>
        <span class="code-tag">&lt;xs:annotation&gt;</span>
            <span class="code-tag">&lt;xs:documentation&gt;</span>
                Lets a plugin declare data that should be inserted into config.xml
                when the plugin is installed. This is normally used to add ports
                and other settings that the user is likely to want to change. The
                gbean entries declared here will be written into config.xml for the
                new module when the plugin is installed.
            <span class="code-tag">&lt;/xs:documentation&gt;</span>
        <span class="code-tag">&lt;/xs:annotation&gt;</span>
        <span class="code-tag">&lt;xs:sequence&gt;</span>
            &lt;xs:element ref=<span class="code-quote">"atts:comment"</span> minOccurs=<span class="code-quote">"0"</span>
                maxOccurs=<span class="code-quote">"1"</span> /&gt;
            <span class="code-tag">&lt;xs:element ref=<span class="code-quote">"atts:gbean"</span> maxOccurs=<span class="code-quote">"unbounded"</span>/&gt;</span>
        <span class="code-tag">&lt;/xs:sequence&gt;</span>
        <span class="code-tag">&lt;xs:attribute name=<span class="code-quote">"load"</span> type=<span class="code-quote">"xs:boolean"</span> default=<span class="code-quote">"true"</span>&gt;</span>
            <span class="code-tag">&lt;xs:annotation&gt;</span>
                <span class="code-tag">&lt;xs:documentation&gt;</span>
                    Whether the module should be marked load true or false. If marked false it can still
                    be started if other started modules depend on it.
                <span class="code-tag">&lt;/xs:documentation&gt;</span>
            <span class="code-tag">&lt;/xs:annotation&gt;</span>
        <span class="code-tag">&lt;/xs:attribute&gt;</span>
        <span class="code-tag">&lt;xs:attribute name=<span class="code-quote">"condition"</span> type=<span class="code-quote">"xs:string"</span>&gt;</span>
            <span class="code-tag">&lt;xs:annotation&gt;</span>
                <span class="code-tag">&lt;xs:documentation&gt;</span>
                    Optional condition that if present is evaluated to determine whether to load the module.
                <span class="code-tag">&lt;/xs:documentation&gt;</span>
            <span class="code-tag">&lt;/xs:annotation&gt;</span>
        <span class="code-tag">&lt;/xs:attribute&gt;</span>
        <span class="code-tag">&lt;xs:attribute name=<span class="code-quote">"server"</span> type=<span class="code-quote">"xs:string"</span> default=<span class="code-quote">"default"</span>&gt;</span>
            <span class="code-tag">&lt;xs:annotation&gt;</span>
                <span class="code-tag">&lt;xs:documentation&gt;</span>
                    The <span class="code-quote">"server"</span>, i.e. the named set of configuration files, this should be added to.
                <span class="code-tag">&lt;/xs:documentation&gt;</span>
            <span class="code-tag">&lt;/xs:annotation&gt;</span>
        <span class="code-tag">&lt;/xs:attribute&gt;</span>
    <span class="code-tag">&lt;/xs:complexType&gt;</span>

    <span class="code-tag">&lt;xs:complexType name=<span class="code-quote">"propertyType"</span>&gt;</span>
        <span class="code-tag">&lt;xs:annotation&gt;</span>
            <span class="code-tag">&lt;xs:documentation&gt;</span>
                holds key-value pair. key is in 'key' attribute, value is in content
            <span class="code-tag">&lt;/xs:documentation&gt;</span>
        <span class="code-tag">&lt;/xs:annotation&gt;</span>

        <span class="code-tag">&lt;xs:simpleContent&gt;</span>
            <span class="code-tag">&lt;xs:extension base=<span class="code-quote">"xs:string"</span>&gt;</span>
                <span class="code-tag">&lt;xs:attribute name=<span class="code-quote">"key"</span> use=<span class="code-quote">"required"</span> type=<span class="code-quote">"xs:string"</span>&gt;</span>
                    <span class="code-tag">&lt;xs:annotation&gt;</span>
                        <span class="code-tag">&lt;xs:documentation&gt;</span>
                            key for key-value pair.
                        <span class="code-tag">&lt;/xs:documentation&gt;</span>
                    <span class="code-tag">&lt;/xs:annotation&gt;</span>
                <span class="code-tag">&lt;/xs:attribute&gt;</span>
                <span class="code-tag">&lt;xs:attribute name=<span class="code-quote">"server"</span> type=<span class="code-quote">"xs:string"</span> default=<span class="code-quote">"default"</span>&gt;</span>
                    <span class="code-tag">&lt;xs:annotation&gt;</span>
                        <span class="code-tag">&lt;xs:documentation&gt;</span>
                            The <span class="code-quote">"server"</span>, i.e. the named set of configuration files, this should be added to.
                        <span class="code-tag">&lt;/xs:documentation&gt;</span>
                    <span class="code-tag">&lt;/xs:annotation&gt;</span>
                <span class="code-tag">&lt;/xs:attribute&gt;</span>
            <span class="code-tag">&lt;/xs:extension&gt;</span>
        <span class="code-tag">&lt;/xs:simpleContent&gt;</span>
    <span class="code-tag">&lt;/xs:complexType&gt;</span>

    <span class="code-tag">&lt;xs:complexType name=<span class="code-quote">"licenseType"</span>&gt;</span>
        <span class="code-tag">&lt;xs:annotation&gt;</span>
            <span class="code-tag">&lt;xs:documentation&gt;</span>
                See pluginType/license above
            <span class="code-tag">&lt;/xs:documentation&gt;</span>
        <span class="code-tag">&lt;/xs:annotation&gt;</span>

        <span class="code-tag">&lt;xs:simpleContent&gt;</span>
            <span class="code-tag">&lt;xs:extension base=<span class="code-quote">"xs:string"</span>&gt;</span>
                <span class="code-tag">&lt;xs:attribute name=<span class="code-quote">"osi-approved"</span> use=<span class="code-quote">"required"</span> type=<span class="code-quote">"xs:boolean"</span>&gt;</span>
                    <span class="code-tag">&lt;xs:annotation&gt;</span>
                        <span class="code-tag">&lt;xs:documentation&gt;</span>
                            Indicates whether this license is OSI-approved, which is to say, whether
                            the plugin is open source. Typically this is true for all licenses
                            you'd expect to be open source, and false for proprietary plugins.

                            If there's some doubt, visit http://www.opensource.org/licenses/index.php
                        <span class="code-tag">&lt;/xs:documentation&gt;</span>
                    <span class="code-tag">&lt;/xs:annotation&gt;</span>
                <span class="code-tag">&lt;/xs:attribute&gt;</span>
            <span class="code-tag">&lt;/xs:extension&gt;</span>
        <span class="code-tag">&lt;/xs:simpleContent&gt;</span>
    <span class="code-tag">&lt;/xs:complexType&gt;</span>

    <span class="code-tag">&lt;xs:complexType name=<span class="code-quote">"dependencyType"</span>&gt;</span>
        <span class="code-tag">&lt;xs:annotation&gt;</span>
            <span class="code-tag">&lt;xs:documentation&gt;</span>
                See pluginType/dependency above
            <span class="code-tag">&lt;/xs:documentation&gt;</span>
        <span class="code-tag">&lt;/xs:annotation&gt;</span>

        <span class="code-tag">&lt;xs:complexContent&gt;</span>
            <span class="code-tag">&lt;xs:extension base=<span class="code-quote">"list:artifactType"</span>&gt;</span>
                <span class="code-tag">&lt;xs:attribute name=<span class="code-quote">"start"</span> use=<span class="code-quote">"optional"</span> type=<span class="code-quote">"xs:boolean"</span> default=<span class="code-quote">"true"</span>&gt;</span>
                    <span class="code-tag">&lt;xs:annotation&gt;</span>
                        <span class="code-tag">&lt;xs:documentation&gt;</span>
                            Influences whether a dependency is marked to start.  A plugin is marked to start
                            in a particular server <span class="code-quote">"instance"</span> primarily based on the load and condition settings in
                            the config-xml sections.  However the start attribute overrides this for plugins installed
                            as dependencies.
                        <span class="code-tag">&lt;/xs:documentation&gt;</span>
                    <span class="code-tag">&lt;/xs:annotation&gt;</span>
                <span class="code-tag">&lt;/xs:attribute&gt;</span>
            <span class="code-tag">&lt;/xs:extension&gt;</span>
        <span class="code-tag">&lt;/xs:complexContent&gt;</span>
    <span class="code-tag">&lt;/xs:complexType&gt;</span>

    <span class="code-tag">&lt;xs:complexType name=<span class="code-quote">"hashType"</span>&gt;</span>
        <span class="code-tag">&lt;xs:annotation&gt;</span>
            <span class="code-tag">&lt;xs:documentation&gt;</span>
                See pluginType/hash above
            <span class="code-tag">&lt;/xs:documentation&gt;</span>
        <span class="code-tag">&lt;/xs:annotation&gt;</span>

        <span class="code-tag">&lt;xs:simpleContent&gt;</span>
            <span class="code-tag">&lt;xs:extension base=<span class="code-quote">"xs:string"</span>&gt;</span>
                <span class="code-tag">&lt;xs:attribute name=<span class="code-quote">"type"</span> use=<span class="code-quote">"required"</span>&gt;</span>
                    <span class="code-tag">&lt;xs:annotation&gt;</span>
                        <span class="code-tag">&lt;xs:documentation&gt;</span>
                            Indicates the type of hash. The values presently supported are:

                            MD5
                            SHA-1

                        <span class="code-tag">&lt;/xs:documentation&gt;</span>
                    <span class="code-tag">&lt;/xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:simpleType&gt;</span>
                        <span class="code-tag">&lt;xs:restriction base=<span class="code-quote">"xs:NMTOKEN"</span>&gt;</span>
                            <span class="code-tag">&lt;xs:enumeration value=<span class="code-quote">"MD5"</span>/&gt;</span>
                            <span class="code-tag">&lt;xs:enumeration value=<span class="code-quote">"SHA-1"</span>/&gt;</span>
                        <span class="code-tag">&lt;/xs:restriction&gt;</span>
                    <span class="code-tag">&lt;/xs:simpleType&gt;</span>
                <span class="code-tag">&lt;/xs:attribute&gt;</span>
            <span class="code-tag">&lt;/xs:extension&gt;</span>
        <span class="code-tag">&lt;/xs:simpleContent&gt;</span>
    <span class="code-tag">&lt;/xs:complexType&gt;</span>

    <span class="code-tag">&lt;xs:complexType name=<span class="code-quote">"copy-fileType"</span>&gt;</span>
        <span class="code-tag">&lt;xs:annotation&gt;</span>
            <span class="code-tag">&lt;xs:documentation&gt;</span>
                The name of a file in the plugin archive that should be copied into
                the server installation tree somewhere when the plugin is installed.
                There may be a path component (relative to the root of the plugin
                archive), though that will not be used to construct the destination
                location. For example:

                <span class="code-tag">&lt;copy-file relative-to=<span class="code-quote">"server"</span> dest-dir=<span class="code-quote">"var/security/keystores"</span>&gt;</span>
                    resources/keystores/my-keystore
                <span class="code-tag">&lt;/copy-file&gt;</span>

                This will copy the file resources/keystores/my-keystore to e.g.
                var/security/keystores/my-keystore
            <span class="code-tag">&lt;/xs:documentation&gt;</span>
        <span class="code-tag">&lt;/xs:annotation&gt;</span>

        <span class="code-tag">&lt;xs:simpleContent&gt;</span>
            <span class="code-tag">&lt;xs:extension base=<span class="code-quote">"xs:string"</span>&gt;</span>
                <span class="code-tag">&lt;xs:attribute name=<span class="code-quote">"relative-to"</span> use=<span class="code-quote">"required"</span>&gt;</span>
                    <span class="code-tag">&lt;xs:annotation&gt;</span>
                        <span class="code-tag">&lt;xs:documentation&gt;</span>
                            Indicates whether the destination is relative to the Geronimo install
                            directory or the server instance directory (which are the same unless
                            the server instance is configured).  The values presently supported are:

                            geronimo
                            server

                        <span class="code-tag">&lt;/xs:documentation&gt;</span>
                    <span class="code-tag">&lt;/xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:simpleType&gt;</span>
                        <span class="code-tag">&lt;xs:restriction base=<span class="code-quote">"xs:NMTOKEN"</span>&gt;</span>
                            <span class="code-tag">&lt;xs:enumeration value=<span class="code-quote">"geronimo"</span>/&gt;</span>
                            <span class="code-tag">&lt;xs:enumeration value=<span class="code-quote">"server"</span>/&gt;</span>
                        <span class="code-tag">&lt;/xs:restriction&gt;</span>
                    <span class="code-tag">&lt;/xs:simpleType&gt;</span>
                <span class="code-tag">&lt;/xs:attribute&gt;</span>
                <span class="code-tag">&lt;xs:attribute name=<span class="code-quote">"dest-dir"</span> use=<span class="code-quote">"required"</span> type=<span class="code-quote">"xs:string"</span>&gt;</span>
                    <span class="code-tag">&lt;xs:annotation&gt;</span>
                        <span class="code-tag">&lt;xs:documentation&gt;</span>
                            The directory to copy the file to, relative to either the Geronimo
                            install dir or the server's home directory (normally the same as the
                            Geronimo install dir but may be configured to be elsewhere).
                        <span class="code-tag">&lt;/xs:documentation&gt;</span>
                    <span class="code-tag">&lt;/xs:annotation&gt;</span>
                <span class="code-tag">&lt;/xs:attribute&gt;</span>
            <span class="code-tag">&lt;/xs:extension&gt;</span>
        <span class="code-tag">&lt;/xs:simpleContent&gt;</span>
    <span class="code-tag">&lt;/xs:complexType&gt;</span>

    <span class="code-tag">&lt;xs:complexType name=<span class="code-quote">"prerequisiteType"</span>&gt;</span>
        <span class="code-tag">&lt;xs:sequence&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"id"</span> type=<span class="code-quote">"list:artifactType"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        The Module ID of the prerequisite. This is used to check whether
                        it's available on the server that you're downloading the plugin
                        into. It may omit some portions of the Module ID to be more
                        accomodating (e.g. <span class="code-quote">"*/MyDBPool/*/*"</span> to identify a database pool
                        instead of <span class="code-quote">"console/MyDBPool/1.0/car"</span>).

                        Note that the values here may take the non-standard syntax of
                        * instead of the empty string for a missing value, which will
                        hopefully make the wildcard format more user-friendly.
                        (On the theory that <span class="code-quote">"Please install */MyDBPool/*/*"</span> should make
                        more sense than <span class="code-quote">"Please install /MyDBPool//"</span> for an average user)
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"resource-type"</span> type=<span class="code-quote">"xs:string"</span> minOccurs=<span class="code-quote">"0"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        Describes the type of resource that the prerequisite is. Examples
                        include:

                        JDBC Driver
                        JDBC Pool
                        JMS Resource Group
                        JavaMail

                        This is mainly used for prerequisites where the user needs to set
                        something up and you want to indicate what. So for example, you
                        could say <span class="code-quote">"console/myapp-pool/*/jar"</span> is a prerequisite with resource
                        type <span class="code-quote">"JDBC Pool"</span> and then the user should understand that they can
                        install your plugin if they create a JDBC pool called <span class="code-quote">"myapp-pool"</span>
                        in the console, or manually deploy a pool with moduleId
                        <span class="code-quote">"console/myapp-pool/(something)/jar"</span>

                        Another option in that case would be to use a dependency on a JDBC
                        pool plugins you provide, but then it would have to use the
                        system database (and run a DDL script on the first connect) in order
                        to be installable in an arbitrary Geronimo server. That would be a
                        better approach for demonstration applications, whereas the
                        prerequisite on a user-installed pool would be a better approach for
                        production applications.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"description"</span> type=<span class="code-quote">"xs:string"</span> minOccurs=<span class="code-quote">"0"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        A description for the user about why this is a prerequisite and what
                        they should do to set it up. Here are a couple examples:

                        This plugin of SomeApp is configured for the Jetty version of
                        Geronimo. It cannot be installed on the Tomcat version of Geronimo.
                        There's a separate plugin for the Tomcat version of Geronimo.

                        SomeApp requires a database connection pool. Supported databases
                        are PostgreSQL and MySQL. Please configure a database connection
                        pool with the name <span class="code-quote">"SomeAppPool"</span> and then run the associated create
                        script from http://someapp.com/db-scripts/ before installing this
                        plugin.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
        <span class="code-tag">&lt;/xs:sequence&gt;</span>
    <span class="code-tag">&lt;/xs:complexType&gt;</span>

    <span class="code-tag">&lt;xs:complexType name=<span class="code-quote">"artifactType"</span>&gt;</span>
        <span class="code-tag">&lt;xs:annotation&gt;</span>
            <span class="code-tag">&lt;xs:documentation&gt;</span>
                &lt;![CDATA[
                Refers to either another module running in the server, or
                an entry in the server's Repository.  In either case this effectively uses a
                URI.

                When this is pointing to a repository entry, the URI must have a form
                acceptable to the repository, which is currently a URI consisting of
                Maven-style identifiers separated by slashes (groupId/artifactId/version/type,
                for example, the URI <span class="code-quote">"postgresql/postgresql-8.0-jdbc/313/jar"</span> for a file like
                <span class="code-quote">"repository/postgresql/postgresql-8.0-jdbc-313.jar"</span>).

                When this is pointing to a module, the URI should match the
                module's moduleId.  This also looks
                like a Maven-style URI discussed above.

                The artifactType element can take either a straight URI (as in the examples
                above), or maven-style identifier fragments (groupId, type, artifactId, and
                version), which it will compose into a URI by adding up the fragments with
                slashes in between.

                There is a correspondence between the xml format and a URI.  For example, the URI

                postgresql/postgresql-8.0-jdbc/313/jar

                corresponds to the xml:

                <span class="code-tag">&lt;groupId&gt;</span>postgresql<span class="code-tag">&lt;/groupId&gt;</span>
                <span class="code-tag">&lt;artifactId&gt;</span>postgresql-8.0-jdbc<span class="code-tag">&lt;/artifactId&gt;</span>
                <span class="code-tag">&lt;version&gt;</span>313<span class="code-tag">&lt;/version&gt;</span>
                <span class="code-tag">&lt;type&gt;</span>jar<span class="code-tag">&lt;/type&gt;</span>
	            ]]&gt;
            <span class="code-tag">&lt;/xs:documentation&gt;</span>
        <span class="code-tag">&lt;/xs:annotation&gt;</span>
        <span class="code-tag">&lt;xs:sequence&gt;</span>
            <span class="code-tag"><span class="code-comment">&lt;!-- TODO not sure if groupId can in fact be optional --&gt;</span></span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"groupId"</span> type=<span class="code-quote">"xs:string"</span> minOccurs=<span class="code-quote">"0"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        The name for group containing this module. By default,
                        it is considered 'default' for declaration and wild card
                        '*' for dependencies.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"artifactId"</span> type=<span class="code-quote">"xs:string"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        The name for module in a specified group. All the
                        artifactId's should be unique within a group. If no
                        articfactId is provided it will be defaulted to file
                        name of the module file.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"version"</span> type=<span class="code-quote">"xs:string"</span> minOccurs=<span class="code-quote">"0"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        The version number for the module formatted by dot
                        separated numbers. If no version is provided it will be
                        defaulted to numeric timestamp generated by
                        System.currentTimeMillis() at deploy time. In case of
                        dependencies latest available version will be used.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
            <span class="code-tag">&lt;xs:element name=<span class="code-quote">"type"</span> type=<span class="code-quote">"xs:string"</span> minOccurs=<span class="code-quote">"0"</span>&gt;</span>
                <span class="code-tag">&lt;xs:annotation&gt;</span>
                    <span class="code-tag">&lt;xs:documentation&gt;</span>
                        This element defines the type of the module. The type
                        could be 'CAR', 'JAR', EAR', 'WAR', etc. If no type is
                        provided it will be defaulted appropriately by the
                        deployer depending upon type of deployed module.
                    <span class="code-tag">&lt;/xs:documentation&gt;</span>
                <span class="code-tag">&lt;/xs:annotation&gt;</span>
            <span class="code-tag">&lt;/xs:element&gt;</span>
        <span class="code-tag">&lt;/xs:sequence&gt;</span>
    <span class="code-tag">&lt;/xs:complexType&gt;</span>

<span class="code-tag">&lt;/xs:schema&gt;</span></pre>
</div></div>

<p>Most plugins are Geronimo modules which means they include a classloader description, service configurations ("gbeans"), and possibly classes and resources.  For instance, if you deploy a javaee application on geronimo, it turns into a geronimo module containing the description of the app's classloader, gbean configurations for the javaee components (web apps, ejbs, etc), and the classes and resources from your application.  The additional information in the Geronimo plugin descriptor includes:</p>
<ul>
	<li>Category (descriptive)</li>
	<li>Description</li>
	<li>License</li>
	<li>Dependencies: these will be automatically downloaded and installed when the plugin is installed.  These are usually the same as the dependencies in the module classloader description.</li>
	<li>Prerequisites: These must be present before the plugin can be installed. This can be used to force the user to install an incompatibly licensed jar or to configure a modules such as a database pool before installing a dependent plugin.</li>
	<li>Obsoletes: These dependencies will be uninstalled before installing a plugin.</li>
	<li>Additional information about how the plugin fits into the server.</li>
</ul>


<h2><a name="Plugininfrastructure-Additionalinformation"></a>Additional information</h2>
<ul>
	<li>Content to be installed in a config.xml file to allow additional customization of gbeans, typically through properties.</li>
	<li>Default property values to be installed in a config-substitutions.properties file.</li>
	<li>Artifact aliases allowing one plugin or other artifact to replace another.</li>
	<li>Description of plugin content to be unpacked into the server.  Plugins that are not modules typically exist only to install such content.</li>
</ul>


<h2><a name="Plugininfrastructure-Wheredoesthisadditionalconfigurationinformationgo%3F"></a>Where does this additional configuration information go?</h2>
<p>A geronimo installation typically can run multiple jvms for different purposes.  For instance, there's the main JavaEE server, a command line deploy tool, and a JavaEE application client container.  Each of these requires configuration information from different files.  The set of such information sufficient to configure such a jvm is collected together in a "server instance".  In a geronimo server, these are represented by gbeans in the plugin module.  When assembling a server using maven these are represented with xml in the maven pom.  In any case, these have names, and for the plugin metadata specific to a server instance, you specify which instance you intend using the server attribute.  This defaults to "default", the JavaEE server.</p>

<h1><a name="Plugininfrastructure-Buildingaplugin."></a>Building a plugin.</h1>
<p>By far the easiest way to build a Geronimo plugin is with maven using the car-maven-plugin to build a module.  Any such module will include a geronimo-plugin.xml descriptor with at least minimal information.  When possible, such as the description and license, this information is taken from the pom itself.  Normally you will build the dependency list from the modules dependencies which are constructed from the maven dependencies plus whatever additional dependencies the deployers determine are needed.  For instance an ejb application will have the openejb plugin added as a dependency by the openejb deployer.  If necessary you can specify the dependencies for both the module and plugin descriptor explicitly in the car-maven-plugin configuration.</p>

<p>Here's an example of a car-maven-plugin configuration using maven dependencies and configuring most of the additional information possible:</p>

<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;plugin&gt;</span>
                <span class="code-tag">&lt;groupId&gt;</span>org.apache.geronimo.buildsupport<span class="code-tag">&lt;/groupId&gt;</span>
                <span class="code-tag">&lt;artifactId&gt;</span>car-maven-plugin<span class="code-tag">&lt;/artifactId&gt;</span>
                <span class="code-tag">&lt;configuration&gt;</span>
                    <span class="code-tag">&lt;useMavenDependencies&gt;</span>
                        <span class="code-tag">&lt;value&gt;</span>true<span class="code-tag">&lt;/value&gt;</span>
                        <span class="code-tag">&lt;includeVersion&gt;</span>true<span class="code-tag">&lt;/includeVersion&gt;</span>
                    <span class="code-tag">&lt;/useMavenDependencies&gt;</span>
                    <span class="code-tag">&lt;category&gt;</span>Tomcat<span class="code-tag">&lt;/category&gt;</span>
                    <span class="code-tag">&lt;instance&gt;</span>
                        <span class="code-tag">&lt;plugin-artifact&gt;</span>
                            <span class="code-tag">&lt;copy-file relative-to=<span class="code-quote">"server"</span> dest-dir=<span class="code-quote">"var/catalina"</span>&gt;</span>tomcat-base/<span class="code-tag">&lt;/copy-file&gt;</span>
                            <span class="code-tag">&lt;config-xml-content&gt;</span>
                                &lt;!-- To disable accesslogging uncomment the following lines
                                <span class="code-tag">&lt;gbean name=<span class="code-quote">"TomcatEngine"</span>&gt;</span>
                                    <span class="code-tag">&lt;reference name=<span class="code-quote">"TomcatValveChain"</span> /&gt;</span>
                                <span class="code-tag">&lt;/gbean&gt;</span>
                                <span class="code-tag">&lt;gbean name=<span class="code-quote">"AccessLogValve"</span> load=<span class="code-quote">"false"</span>&gt;</span><span class="code-tag">&lt;/gbean&gt;</span>
                                --&gt;
                                <span class="code-tag">&lt;gbean name=<span class="code-quote">"TomcatWebConnector"</span>&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"host"</span>&gt;</span>${ServerHostname}<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"port"</span>&gt;</span>${HTTPPort + PortOffset}<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"redirectPort"</span>&gt;</span>${HTTPSPort + PortOffset}<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"maxHttpHeaderSize"</span>&gt;</span>8192<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"maxThreads"</span>&gt;</span>150<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"minSpareThreads"</span>&gt;</span>25<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"maxSpareThreads"</span>&gt;</span>75<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"enableLookups"</span>&gt;</span>false<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"acceptCount"</span>&gt;</span>100<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"connectionTimeout"</span>&gt;</span>${WebConnectorConTimeout}<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"disableUploadTimeout"</span>&gt;</span>true<span class="code-tag">&lt;/attribute&gt;</span>
                                <span class="code-tag">&lt;/gbean&gt;</span>
                                <span class="code-tag">&lt;gbean name=<span class="code-quote">"TomcatAJPConnector"</span>&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"host"</span>&gt;</span>${ServerHostname}<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"port"</span>&gt;</span>${AJPPort + PortOffset}<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"redirectPort"</span>&gt;</span>${HTTPSPort + PortOffset}<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"minSpareThreads"</span>&gt;</span>25<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"maxSpareThreads"</span>&gt;</span>75<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"enableLookups"</span>&gt;</span>false<span class="code-tag">&lt;/attribute&gt;</span>
                                <span class="code-tag">&lt;/gbean&gt;</span>
                                <span class="code-tag">&lt;gbean name=<span class="code-quote">"TomcatWebSSLConnector"</span>&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"host"</span>&gt;</span>${ServerHostname}<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"port"</span>&gt;</span>${HTTPSPort + PortOffset}<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"maxHttpHeaderSize"</span>&gt;</span>8192<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"maxThreads"</span>&gt;</span>150<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"minSpareThreads"</span>&gt;</span>25<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"maxSpareThreads"</span>&gt;</span>75<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"enableLookups"</span>&gt;</span>false<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"acceptCount"</span>&gt;</span>100<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"disableUploadTimeout"</span>&gt;</span>false<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"clientAuth"</span>&gt;</span>false<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"algorithm"</span>&gt;</span>Default<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"sslProtocol"</span>&gt;</span>TLS<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"keystoreFile"</span>&gt;</span>var/security/keystores/geronimo-default<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"keystorePass"</span>&gt;</span>secret<span class="code-tag">&lt;/attribute&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"keystoreType"</span>&gt;</span>JKS<span class="code-tag">&lt;/attribute&gt;</span>
                                <span class="code-tag">&lt;/gbean&gt;</span>
                                <span class="code-tag">&lt;gbean name=<span class="code-quote">"TomcatHost"</span>&gt;</span>
                                    <span class="code-tag">&lt;attribute name=<span class="code-quote">"initParams"</span>&gt;</span>
                                        name=${ServerHostname}
                                        appBase=
                                        workDir=work
                                    <span class="code-tag">&lt;/attribute&gt;</span>
                                <span class="code-tag">&lt;/gbean&gt;</span>
                            <span class="code-tag">&lt;/config-xml-content&gt;</span>
                            <span class="code-tag">&lt;config-substitution key=<span class="code-quote">"HTTPPort"</span>&gt;</span>8080<span class="code-tag">&lt;/config-substitution&gt;</span>
                            <span class="code-tag">&lt;config-substitution key=<span class="code-quote">"AJPPort"</span>&gt;</span>8009<span class="code-tag">&lt;/config-substitution&gt;</span>
                            <span class="code-tag">&lt;config-substitution key=<span class="code-quote">"HTTPSPort"</span>&gt;</span>8443<span class="code-tag">&lt;/config-substitution&gt;</span>
                            <span class="code-tag">&lt;config-substitution key=<span class="code-quote">"ServerHostname"</span>&gt;</span>0.0.0.0<span class="code-tag">&lt;/config-substitution&gt;</span>
                            <span class="code-tag">&lt;config-substitution key=<span class="code-quote">"WebConnectorConTimeout"</span>&gt;</span>20000<span class="code-tag">&lt;/config-substitution&gt;</span>
                            <span class="code-tag">&lt;config-substitution key=<span class="code-quote">"webcontainer"</span>&gt;</span>TomcatWebContainer<span class="code-tag">&lt;/config-substitution&gt;</span>
                            <span class="code-tag">&lt;config-substitution key=<span class="code-quote">"webcontainerName"</span>&gt;</span>tomcat6<span class="code-tag">&lt;/config-substitution&gt;</span>
                        <span class="code-tag">&lt;/plugin-artifact&gt;</span>
                    <span class="code-tag">&lt;/instance&gt;</span>
                <span class="code-tag">&lt;/configuration&gt;</span>
            <span class="code-tag">&lt;/plugin&gt;</span></pre>
</div></div>

<p>As you use maven to build plugins, a geronimo-plugins.xml plugin catalog is automatically maintained in your local maven repository.  You can force this to be rebuilt by running</p>

<div class="code"><div class="codeContent">
<pre class="code-java">mvn org.apache.geronimo.buildsupport:car-maven-plugin:create-pluginlist</pre>
</div></div>

<p>This might be necessary if you prune your maven repository and remove plugins listed in the catalog.</p>

<p>Alternatively, you can construct the geronimo-plugin.xml file by hand and include it in a deployed module in a geronimo server.</p>

<p>The admin console also allows limited editing of geronimo-plugin.xml files but editing the information about how the plugin fits into the server is not yet supported.</p>

<h1><a name="Plugininfrastructure-Installingplugins"></a>Installing plugins</h1>
<p>If the appropriate admin console plugin is installed (and your geronimo server includes web app support) you can install plugins from a plugin repository. After selecting the "plugins" page from the navigation menu select the plugin repository you want, such as your local maven repository if you have been building your own plugins.  Next you see a list of available plugins from the repository.  Select multiple plugins using the checkboxes or a single plugin as a link, and on the next page you will see more information on the plugins.  On your approval the plugins will be downloaded and installed.</p>

<p>Alternatively you can use gshell to install plugins using the deploy/list-plugins command. This can be run with a command line or interactively.  Interactively you can select the plugin repository to use (if more than one is known), and then select the plugins to install.  Again, they will be downloaded and installed.  An example of command line usage will be seen in later when we discuss assembling a server.</p>

<h1><a name="Plugininfrastructure-Extractingaserverfromanexistingserver."></a>Extracting a server from an existing server.</h1>
<p>Just as with installing plugins, this can be done from the admin console or from gshell.  In the admin console you specify the groupId and artifactId of the server you want, the version, and the archive type and then select the plugins you want installed.  The server will be assembled in var/temp.</p>

<p>Similarly you can use the gshell deploy/assemble-server command specifying the same information on the command line or interactively.</p>

<table cellpadding='5' width='85%' cellspacing='8px' class='tipMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">Important Note</b><br />
<p>In order to get a working server you must include the geronimo-boilerplate-minimal plugin which includes several files used to start the server</p></td></tr></table>

<p>TODO: The groupId is not currently used but the intention is to copy the assembled server into an appropriate maven repository.</p>

<p>Here's an example of a gshell script to install the roller plugin into  the framework assembly and extract a server that only supports roller (and does not include the admin console or any deployment capabilities)</p>

<p>TODO: use something like this: snippet:url=geronimo/plugins/roller/trunk/roller-jetty-commands</p>

<p>TODO: get gshell to accept line continuations as in the following (these DO NOT WORK IN REAL LIFE):</p>

<div class="code"><div class="codeContent">
<pre class="code-java"># assembles a server containing roller-jetty from the geronimo-framework server.
# run using ./bin/gsh &lt; roller-jetty-commands
deploy/list-plugins -u system -w manager -r file:/Users/david/.m2/repository/\
 org.apache.geronimo.plugins/roller-jetty/0.0.2-SNAPSHOT/car\
 org.apache.geronimo.plugins/roller-themes/0.0.2-SNAPSHOT/car

deploy/assemble -g org.apache.geronimo.assemblies -a geronimo-roller-jetty -v 1.0-SNAPSHOT\
 org.apache.geronimo.assemblies/geronimo-boilerplate-minimal/2.1-SNAPSHOT/jar\
 org.apache.geronimo.plugins/roller-jetty/0.0.2-SNAPSHOT/car\
 org.apache.geronimo.plugins/roller-themes/0.0.2-SNAPSHOT/car</pre>
</div></div>

<h1><a name="Plugininfrastructure-Assemblingaserverusingmaven."></a>Assembling a server using maven.</h1>
<p>The easiest way to assemble a server is to use maven and the car-maven-plugin.  The dependencies from your pom will be installed in your server, and if they are plugins they will be installed as modules with all dependencies and stuff unpacked and metadata installed into  the correct files.  Here's a simple example assembling a server that supports Roller and includes the basic admin console.</p>

<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt;</span>
&lt;!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the <span class="code-quote">"License"</span>); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at
    
       http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an <span class="code-quote">"AS IS"</span> BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
--&gt;

<span class="code-tag"><span class="code-comment">&lt;!-- $Rev$ $Date$ --&gt;</span></span>

<span class="code-tag">&lt;project xmlns=<span class="code-quote">"http://maven.apache.org/POM/4.0.0"</span> <span class="code-keyword">xmlns:xsi</span>=<span class="code-quote">"http://www.w3.org/2001/XMLSchema-instance"</span> xsi:schemaLocation=<span class="code-quote">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"</span>&gt;</span>

    <span class="code-tag">&lt;modelVersion&gt;</span>4.0.0<span class="code-tag">&lt;/modelVersion&gt;</span>

    <span class="code-tag">&lt;parent&gt;</span>
        <span class="code-tag">&lt;groupId&gt;</span>org.apache.geronimo.plugins<span class="code-tag">&lt;/groupId&gt;</span>
        <span class="code-tag">&lt;artifactId&gt;</span>roller-parent<span class="code-tag">&lt;/artifactId&gt;</span>
        <span class="code-tag">&lt;version&gt;</span>1.0-SNAPSHOT<span class="code-tag">&lt;/version&gt;</span>
    <span class="code-tag">&lt;/parent&gt;</span>

    <span class="code-tag">&lt;groupId&gt;</span>org.apache.geronimo.assemblies<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>geronimo-jetty-roller<span class="code-tag">&lt;/artifactId&gt;</span>
    <span class="code-tag">&lt;name&gt;</span>Geronimo Assemblies :: Roller + Jetty6<span class="code-tag">&lt;/name&gt;</span>
    <span class="code-tag">&lt;packaging&gt;</span>application-assembly<span class="code-tag">&lt;/packaging&gt;</span>

    <span class="code-tag">&lt;description&gt;</span>
        A Geronimo server assembly for Roller using the Jetty web-container.
    <span class="code-tag">&lt;/description&gt;</span>

    <span class="code-tag">&lt;dependencies&gt;</span>
        <span class="code-tag">&lt;dependency&gt;</span>
            <span class="code-tag">&lt;groupId&gt;</span>org.apache.geronimo.assemblies<span class="code-tag">&lt;/groupId&gt;</span>
            <span class="code-tag">&lt;artifactId&gt;</span>geronimo-boilerplate-minimal<span class="code-tag">&lt;/artifactId&gt;</span>
            <span class="code-tag">&lt;version&gt;</span>${geronimoVersion}<span class="code-tag">&lt;/version&gt;</span>
            <span class="code-tag">&lt;type&gt;</span>jar<span class="code-tag">&lt;/type&gt;</span>
        <span class="code-tag">&lt;/dependency&gt;</span>

        <span class="code-tag">&lt;dependency&gt;</span>
            <span class="code-tag">&lt;groupId&gt;</span>org.apache.geronimo.plugins<span class="code-tag">&lt;/groupId&gt;</span>
            <span class="code-tag">&lt;artifactId&gt;</span>roller-jetty<span class="code-tag">&lt;/artifactId&gt;</span>
            <span class="code-tag">&lt;version&gt;</span>${version}<span class="code-tag">&lt;/version&gt;</span>
            <span class="code-tag">&lt;type&gt;</span>car<span class="code-tag">&lt;/type&gt;</span>
        <span class="code-tag">&lt;/dependency&gt;</span>
        <span class="code-tag">&lt;dependency&gt;</span>
            <span class="code-tag">&lt;groupId&gt;</span>org.apache.geronimo.plugins<span class="code-tag">&lt;/groupId&gt;</span>
            <span class="code-tag">&lt;artifactId&gt;</span>roller-themes<span class="code-tag">&lt;/artifactId&gt;</span>
            <span class="code-tag">&lt;version&gt;</span>${version}<span class="code-tag">&lt;/version&gt;</span>
            <span class="code-tag">&lt;type&gt;</span>car<span class="code-tag">&lt;/type&gt;</span>
        <span class="code-tag">&lt;/dependency&gt;</span>
        <span class="code-tag">&lt;dependency&gt;</span>
            <span class="code-tag">&lt;groupId&gt;</span>org.apache.geronimo.plugins<span class="code-tag">&lt;/groupId&gt;</span>
            <span class="code-tag">&lt;artifactId&gt;</span>console-jetty<span class="code-tag">&lt;/artifactId&gt;</span>
            <span class="code-tag">&lt;version&gt;</span>${geronimoVersion}<span class="code-tag">&lt;/version&gt;</span>
            <span class="code-tag">&lt;type&gt;</span>car<span class="code-tag">&lt;/type&gt;</span>
        <span class="code-tag">&lt;/dependency&gt;</span>
    <span class="code-tag">&lt;/dependencies&gt;</span>

    <span class="code-tag">&lt;build&gt;</span>

        <span class="code-tag">&lt;plugins&gt;</span>

            <span class="code-tag">&lt;plugin&gt;</span>
                <span class="code-tag">&lt;groupId&gt;</span>org.apache.geronimo.buildsupport<span class="code-tag">&lt;/groupId&gt;</span>
                <span class="code-tag">&lt;artifactId&gt;</span>car-maven-plugin<span class="code-tag">&lt;/artifactId&gt;</span>
                <span class="code-tag">&lt;executions&gt;</span>
                    <span class="code-tag">&lt;execution&gt;</span>
                        <span class="code-tag">&lt;id&gt;</span>install<span class="code-tag">&lt;/id&gt;</span>
                        <span class="code-tag">&lt;phase&gt;</span>compile<span class="code-tag">&lt;/phase&gt;</span>
                        <span class="code-tag">&lt;goals&gt;</span>
                            <span class="code-tag">&lt;goal&gt;</span>install-modules<span class="code-tag">&lt;/goal&gt;</span>
                        <span class="code-tag">&lt;/goals&gt;</span>
                    <span class="code-tag">&lt;/execution&gt;</span>
                    <span class="code-tag">&lt;execution&gt;</span>
                        <span class="code-tag">&lt;id&gt;</span>archive<span class="code-tag">&lt;/id&gt;</span>
                        <span class="code-tag">&lt;phase&gt;</span>package<span class="code-tag">&lt;/phase&gt;</span>
                        <span class="code-tag">&lt;goals&gt;</span>
                            <span class="code-tag">&lt;goal&gt;</span>archive<span class="code-tag">&lt;/goal&gt;</span>
                        <span class="code-tag">&lt;/goals&gt;</span>
                    <span class="code-tag">&lt;/execution&gt;</span>
                <span class="code-tag">&lt;/executions&gt;</span>
                <span class="code-tag">&lt;configuration&gt;</span>
                    <span class="code-tag">&lt;servers&gt;</span>
                        <span class="code-tag">&lt;serverInstance&gt;</span>
                            <span class="code-tag">&lt;name&gt;</span>default<span class="code-tag">&lt;/name&gt;</span>
                            <span class="code-tag">&lt;configFile&gt;</span>var/config/config.xml<span class="code-tag">&lt;/configFile&gt;</span>
                            <span class="code-tag">&lt;configSubstitutionsFile&gt;</span>var/config/config-substitutions.properties<span class="code-tag">&lt;/configSubstitutionsFile&gt;</span>
                            <span class="code-tag">&lt;configSubstitutionsPrefix&gt;</span>org.apache.geronimo.config.substitution.<span class="code-tag">&lt;/configSubstitutionsPrefix&gt;</span>
                            <span class="code-tag">&lt;artifactAliasesFile&gt;</span>var/config/artifact_aliases.properties<span class="code-tag">&lt;/artifactAliasesFile&gt;</span>
                        <span class="code-tag">&lt;/serverInstance&gt;</span>
                        <span class="code-tag">&lt;serverInstance&gt;</span>
                            <span class="code-tag">&lt;name&gt;</span>client<span class="code-tag">&lt;/name&gt;</span>
                            <span class="code-tag">&lt;attributeManagerFrom&gt;</span>default<span class="code-tag">&lt;/attributeManagerFrom&gt;</span>
                            <span class="code-tag">&lt;artifactAliasesFile&gt;</span>var/config/client_artifact_aliases.properties<span class="code-tag">&lt;/artifactAliasesFile&gt;</span>
                        <span class="code-tag">&lt;/serverInstance&gt;</span>
                        <span class="code-tag">&lt;serverInstance&gt;</span>
                            <span class="code-tag">&lt;name&gt;</span>offline<span class="code-tag">&lt;/name&gt;</span>
                            <span class="code-tag">&lt;configFile&gt;</span>var/config/offline-deployer-config.xml<span class="code-tag">&lt;/configFile&gt;</span>
                            <span class="code-tag">&lt;configSubstitutionsFile&gt;</span>var/config/config-substitutions.properties<span class="code-tag">&lt;/configSubstitutionsFile&gt;</span>
                            <span class="code-tag">&lt;configSubstitutionsPrefix&gt;</span>org.apache.geronimo.config.substitution.<span class="code-tag">&lt;/configSubstitutionsPrefix&gt;</span>
                            <span class="code-tag">&lt;artifactAliasesFile&gt;</span>var/config/artifact_aliases.properties<span class="code-tag">&lt;/artifactAliasesFile&gt;</span>
                        <span class="code-tag">&lt;/serverInstance&gt;</span>
                        <span class="code-tag">&lt;serverInstance&gt;</span>
                            <span class="code-tag">&lt;name&gt;</span>jsr88<span class="code-tag">&lt;/name&gt;</span>
                            <span class="code-tag">&lt;configFile&gt;</span>var/config/jsr88-configurer-config.xml<span class="code-tag">&lt;/configFile&gt;</span>
                            <span class="code-tag">&lt;configSubstitutionsFile&gt;</span>var/config/config-substitutions.properties<span class="code-tag">&lt;/configSubstitutionsFile&gt;</span>
                            <span class="code-tag">&lt;configSubstitutionsPrefix&gt;</span>org.apache.geronimo.config.substitution.<span class="code-tag">&lt;/configSubstitutionsPrefix&gt;</span>
                            <span class="code-tag">&lt;artifactAliasesFile&gt;</span>var/config/artifact_aliases.properties<span class="code-tag">&lt;/artifactAliasesFile&gt;</span>
                        <span class="code-tag">&lt;/serverInstance&gt;</span>
                    <span class="code-tag">&lt;/servers&gt;</span>
                <span class="code-tag">&lt;/configuration&gt;</span>
            <span class="code-tag">&lt;/plugin&gt;</span>
        <span class="code-tag">&lt;/plugins&gt;</span>
    <span class="code-tag">&lt;/build&gt;</span>

<span class="code-tag">&lt;/project&gt;</span></pre>
</div></div>
</div>


</td></tr></table></div>
<p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tr>
        <td height="12" background="http://cwiki.apache.org/confluence/images/border/border_bottom.gif"><img src="http://cwiki.apache.org/confluence/images/border/spacer.gif" width="1" height="1" border="0"/></td>
    </tr>
</table>

<div class="smalltext">
    Powered by
    <a href="http://www.atlassian.com/software/confluence/default.jsp?clicked=footer" class="smalltext">Atlassian Confluence</a>
    (Version: 2.2.9 Build:#527 Sep 07, 2006)
    -
    <a href="http://jira.atlassian.com/secure/BrowseProject.jspa?id=10470" class="smalltext">Bug/feature request</a><br/>
    <br>
    <a href="http://cwiki.apache.org/confluence/users/viewnotifications.action">Unsubscribe or edit your notifications preferences</a>

</div>

</body>
</html>


Mime
View raw message