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: EJB sample application (page edited)
Date Wed, 27 Feb 2008 20:57: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/EJB+sample+application">EJB sample application</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/GMOxDOC21/EJB+sample+application">EJB sample application</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~hcunico">Hernan Cunico</a>
            <span class="smallfont">(Feb 27, 2008)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=77973&originalVersion=0&revisedVersion=1">(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 width='33%' class='ScrollbarPrevName'>&nbsp;</td><td width='33%' class='ScrollbarParent'><sup><a href="/confluence/display/GMOxDOC21/Sample+applications"><img border='0' align='middle' src='/confluence/images/icons/up_16.gif' width='8' height='8'></a></sup><a href="/confluence/display/GMOxDOC21/Sample+applications">Sample applications</a></td><td width='33%' class='ScrollbarNextName'>&nbsp;</td></tr></table></div>
<p><a name="EJBsampleapplication-top"></a><br/>
Enterprise Java Beans has been one of the corner stones of the J2EE specification. As a J2EE 1.5 certified application server, Apache Geronimo supports EJB's extensively with the help of OpenEJB EJB Container. Although it is possible to use standard Java objects to contain your business logic and business data, using EJBs addresses many of the issues of using simple Java objects, such as scalability, lifecycle management and state management. In this article, you will see how an initial database application is extended and used for both local and remotely referred application clients for an Enterprise Java Beans back end. The application uses the built-in Apache Derby as its database. Use this article to learn how to simplify your enterprise application development process.</p>

<p>Banking application has two types of application clients namely "Banking Remote Application" and "Banking Web Application". Each of these clients demonstrate how to refer Enterprise Java Beans in remote and local interfaces respectively. Both these clients are referring a common business layer which has been implemented with the help of Session and Entity Beans. Stateless Session Beans are acting as the business service interface between business entities and application clients. All the business entities of the application layer are implemented with Entity Beans.</p>

<p>After reading this article you should be able get the best out of EJB features of Geronimo, such as defining Enterprise Java Beans, managing relations between them and refer EJB's via differents kind of clients.</p>

<p>This article is organized in to following sections.</p>
<ul>
	<li><a href="#EJBsampleapplication-overview" title="overview on EJB sample application">Overview of EJB Features</a></li>
	<li><a href="#EJBsampleapplication-application" title="application on EJB sample application">Application Overview</a></li>
	<li><a href="#EJBsampleapplication-configure" title="configure on EJB sample application">Configuring, Building and Deploying the Sample Application</a></li>
	<li><a href="#EJBsampleapplication-testing" title="testing on EJB sample application">Testing of the Sample Application</a></li>
	<li><a href="#EJBsampleapplication-summary" title="summary on EJB sample application">Summary</a></li>
</ul>


<h1><a name="EJBsampleapplication-OverviewofEJBFeatures"></a>Overview of EJB Features <a name="EJBsampleapplication-overview"></a></h1>

<p>EJB implementation may vary from one vendor to another.The following are the main list of features Apache Geronimo supports as a J2EE container.</p>
<ul>
	<li>Stateful and stateless Session Beans</li>
	<li>Entity Beans</li>
	<li>Message driven beans (MDBs)</li>
	<li>Interoperability using RMI-IIOP or JAXRPC</li>
	<li>Ability to expose stateless session beans and MDBs as Web Services</li>
	<li>Support for sending and receiving messages via Web Services</li>
	<li>Easy provisioning and hot deployment of EJB and JMX-based Web Services</li>
	<li>Access to EJBs from external CORBA objects</li>
</ul>


<h1><a name="EJBsampleapplication-ApplicationOverview"></a>Application Overview <a name="EJBsampleapplication-application"></a></h1>

<p>As mentioned above the Banking application supports two types of business application clients.The overview of each client is given below.</p>
<ol>
	<li>Banking Remote Application<br/>
A small swing application client which has more super user capabilities in the banking environment. Only a limited number of banking staff have access to this application. It allows viewing and updating of balance of bank accounts.</li>
	<li>Banking Web Application<br/>
This is a Web application open to the Customers. It enables them to view their bank account information. Additionally, users of this application can view the exchange rates given by the bank. For the sake of simplicity, security features of each application will be ignored even though it can be achieved very easily in the context of Geronimo.</li>
</ol>


<p>Both of these clients use a common business service layer. Behind that business service layer, there are three common business entities that appear in the banking application domain Account, Customer and ExchangeRate. Each Customer can have more than one Account while an Account can only be owned by one Customer. ExchangeRate represents a rate value given by the bank relative to the USD for a particular currency.</p>

<h2><a name="EJBsampleapplication-Applicationcontents"></a>Application contents</h2>

<p>The Banking application consists of the following list of packages and classes.</p>
<ul>
	<li>org.apache.geronimo.samples.bank.ejb
	<ul>
		<li>Account - Entity Bean, represent account entity related data in the DB.</li>
		<li>BankManagerFacadeBean - Stateless Session Bean, acting as a service class for different application clients.</li>
		<li>Customer - Entity Bean, represents customer entity related data.</li>
		<li>ExchangeRate - Entity Bean, represents exchange rate relative to a USD.</li>
	</ul>
	</li>
	<li>org.apache.geronimo.samples.bank.web
	<ul>
		<li>CustomerServiceServlet - Dispatches web requests of Customer Account Balance Viewer to the service layer.</li>
		<li>CommonServiceServlet - Dispatches web requests of Exchange Rate viewing scenario.</li>
	</ul>
	</li>
</ul>


<p>Finally, the banking application will be deployed as an EAR to the application server. The overview of the structural content of the EAR file is given in the following example.</p>
<div class="preformatted" style="border-style: solid; "><div class="preformattedContent">
<pre>|-Bank.ear
   |-BankEJB.jar
	|-META-INF
	    |- persistence.xml
	    |- openejb-jar.xml
   |-BankWeb.war
	|-jsp
            |- customer_info.jsp
	    |- customer_main.jsp
	    |- error.jsp
	    |- exchange_rates.jsp
	    |- index.jsp
	|-WEB-INF
	    |- web.xml
	    |- geronimo-web.xml
	    |- classes
   |-META-INF
        |- application.xml
        |- geronimo-application.xml
</pre>
</div></div>
<p>First, we will look at how the business service layer of the application has been implemented with the help of EJBs.</p>

<p>Corresponding <b>openejb-jar.xml</b> defines Geronimo specific features of EJBs. Since we will deploy the database pool along with the application, there is no need to provide a dependency to an existing database pool.</p>
<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>openejb-jar.xml</b></div><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>
<span class="code-tag">&lt;openejb-jar xmlns=<span class="code-quote">"http://www.openejb.org/xml/ns/openejb-jar-2.1"</span>&gt;</span>
	<span class="code-tag">&lt;dep:environment <span class="code-keyword">xmlns:dep</span>=<span class="code-quote">"http://geronimo.apache.org/xml/ns/deployment-1.2"</span>&gt;</span>
		<span class="code-tag">&lt;dep:moduleId&gt;</span>
			<span class="code-tag">&lt;dep:groupId&gt;</span>${pom.groupId}<span class="code-tag">&lt;/dep:groupId&gt;</span>
			<span class="code-tag">&lt;dep:artifactId&gt;</span>${pom.artifactId}<span class="code-tag">&lt;/dep:artifactId&gt;</span>
			<span class="code-tag">&lt;dep:version&gt;</span>${version}<span class="code-tag">&lt;/dep:version&gt;</span>
			<span class="code-tag">&lt;dep:type&gt;</span>jar<span class="code-tag">&lt;/dep:type&gt;</span>
		<span class="code-tag">&lt;/dep:moduleId&gt;</span>
		<span class="code-tag">&lt;dep:dependencies&gt;</span>
			<span class="code-tag">&lt;dep:dependency&gt;</span>
				<span class="code-tag">&lt;dep:groupId&gt;</span>org.apache.geronimo.configs<span class="code-tag">&lt;/dep:groupId&gt;</span>
				<span class="code-tag">&lt;dep:artifactId&gt;</span>openjpa<span class="code-tag">&lt;/dep:artifactId&gt;</span>
				<span class="code-tag">&lt;dep:type&gt;</span>car<span class="code-tag">&lt;/dep:type&gt;</span>
			<span class="code-tag">&lt;/dep:dependency&gt;</span>
		<span class="code-tag">&lt;/dep:dependencies&gt;</span>
		<span class="code-tag">&lt;dep:hidden-classes/&gt;</span>
		<span class="code-tag">&lt;dep:non-overridable-classes/&gt;</span>
	<span class="code-tag">&lt;/dep:environment&gt;</span>
<span class="code-tag">&lt;/openejb-jar&gt;</span></pre>
</div></div>
<p><b>persistence.xml</b> defines a persistence unit which is used by an EntityManagerFactory in order to talk to BankDB through the BankPool configuration. The name that is given to this &lt;persistent-unit&gt; will be used when trying to reference it via an annotation in the EJB. By setting the <b>SynchronizeMappings</b> property it will not overwrite what is already in the database. So this is important to have when you do not want your data to be deleted. The jta-data-source and non-jta-data-source should point to the same thing.</p>
<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>persistence.xml</b></div><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;persistence 	xmlns=<span class="code-quote">"http://java.sun.com/xml/ns/persistence"</span>
		<span class="code-keyword">xmlns:xsi</span>=<span class="code-quote">"http://www.w3.org/2001/XMLSchema-instance"</span> version=<span class="code-quote">"1.0"</span>
		xsi:schemaLocation=<span class="code-quote">"http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"</span>&gt;
	<span class="code-tag">&lt;persistence-unit name=<span class="code-quote">"BankPU"</span>&gt;</span>
		<span class="code-tag">&lt;description&gt;</span>Entity Beans for Bank<span class="code-tag">&lt;/description&gt;</span>
		<span class="code-tag">&lt;provider&gt;</span>org.apache.openjpa.persistence.PersistenceProviderImpl<span class="code-tag">&lt;/provider&gt;</span>
		<span class="code-tag">&lt;class&gt;</span>org.apache.geronimo.samples.bank.ejb.Account<span class="code-tag">&lt;/class&gt;</span>
		<span class="code-tag">&lt;class&gt;</span>org.apache.geronimo.samples.bank.ejb.Customer<span class="code-tag">&lt;/class&gt;</span>
		<span class="code-tag">&lt;class&gt;</span>org.apache.geronimo.samples.bank.ejb.ExchangeRate<span class="code-tag">&lt;/class&gt;</span>
		<span class="code-tag">&lt;properties&gt;</span>
			<span class="code-tag">&lt;property name=<span class="code-quote">"openjpa.jdbc.SynchronizeMappings"</span> value=<span class="code-quote">"false"</span> /&gt;</span>
		<span class="code-tag">&lt;/properties&gt;</span>
		<span class="code-tag">&lt;jta-data-source&gt;</span>BankPool<span class="code-tag">&lt;/jta-data-source&gt;</span>
		<span class="code-tag">&lt;non-jta-data-source&gt;</span>BankPool<span class="code-tag">&lt;/non-jta-data-source&gt;</span>
	<span class="code-tag">&lt;/persistence-unit&gt;</span>
<span class="code-tag">&lt;/persistence&gt;</span></pre>
</div></div>
<p><b>web.xml</b> does not do anything special here. It just enumerates the servlets present in the web-app and maps the url-pattern for each of them.</p>
<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>web.xml</b></div><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;web-app xmlns=<span class="code-quote">"http://java.sun.com/xml/ns/j2ee"</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://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd"</span>
		version=<span class="code-quote">"2.5"</span>&gt;

	<span class="code-tag">&lt;welcome-file-list&gt;</span>
		<span class="code-tag">&lt;welcome-file&gt;</span>/index.html<span class="code-tag">&lt;/welcome-file&gt;</span>
	<span class="code-tag">&lt;/welcome-file-list&gt;</span>

	<span class="code-tag">&lt;servlet&gt;</span>
		<span class="code-tag">&lt;display-name&gt;</span>CustomerServiceServlet<span class="code-tag">&lt;/display-name&gt;</span>
		<span class="code-tag">&lt;servlet-name&gt;</span>CustomerServiceServlet<span class="code-tag">&lt;/servlet-name&gt;</span>
		<span class="code-tag">&lt;servlet-class&gt;</span>org.apache.geronimo.samples.bank.web.CustomerServiceServlet<span class="code-tag">&lt;/servlet-class&gt;</span>
	<span class="code-tag">&lt;/servlet&gt;</span>

	<span class="code-tag">&lt;servlet&gt;</span>
		<span class="code-tag">&lt;display-name&gt;</span>CommonServiceServlet<span class="code-tag">&lt;/display-name&gt;</span>
		<span class="code-tag">&lt;servlet-name&gt;</span>CommonServiceServlet<span class="code-tag">&lt;/servlet-name&gt;</span>
		<span class="code-tag">&lt;servlet-class&gt;</span>org.apache.geronimo.samples.bank.web.CommonServiceServlet<span class="code-tag">&lt;/servlet-class&gt;</span>
	<span class="code-tag">&lt;/servlet&gt;</span>

	<span class="code-tag">&lt;servlet-mapping&gt;</span>
		<span class="code-tag">&lt;servlet-name&gt;</span>CustomerServiceServlet<span class="code-tag">&lt;/servlet-name&gt;</span>
		<span class="code-tag">&lt;url-pattern&gt;</span>/customer_info<span class="code-tag">&lt;/url-pattern&gt;</span>
	<span class="code-tag">&lt;/servlet-mapping&gt;</span>

	<span class="code-tag">&lt;servlet-mapping&gt;</span>
		<span class="code-tag">&lt;servlet-name&gt;</span>CommonServiceServlet<span class="code-tag">&lt;/servlet-name&gt;</span>
		<span class="code-tag">&lt;url-pattern&gt;</span>/exchange_rates<span class="code-tag">&lt;/url-pattern&gt;</span>
	<span class="code-tag">&lt;/servlet-mapping&gt;</span>
<span class="code-tag">&lt;/web-app&gt;</span></pre>
</div></div>
<p><b>geronimo-web.xml</b> is the Geronimo specific deployment plan. As usual, it specifies the module's information and context-root. So in order to visit the web-app the root url will be <span class="nobr"><a href="http://localhost:8080/Bank" title="Visit page outside Confluence" rel="nofollow">http://localhost:8080/Bank<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>.</p>
<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>geronimo-web.xml</b></div><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;web-app xmlns=<span class="code-quote">"http://geronimo.apache.org/xml/ns/j2ee/web-1.1"</span> <span class="code-keyword">xmlns:naming</span>=<span class="code-quote">"http://geronimo.apache.org/xml/ns/naming-1.1"</span>&gt;</span>
	<span class="code-tag">&lt;dep:environment <span class="code-keyword">xmlns:dep</span>=<span class="code-quote">"http://geronimo.apache.org/xml/ns/deployment-1.1"</span>&gt;</span>
		<span class="code-tag">&lt;dep:moduleId&gt;</span>
			<span class="code-tag">&lt;dep:groupId&gt;</span>${pom.groupId}<span class="code-tag">&lt;/dep:groupId&gt;</span>
			<span class="code-tag">&lt;dep:artifactId&gt;</span>${pom.artifactId}<span class="code-tag">&lt;/dep:artifactId&gt;</span>
			<span class="code-tag">&lt;dep:version&gt;</span>${version}<span class="code-tag">&lt;/dep:version&gt;</span>
			<span class="code-tag">&lt;dep:type&gt;</span>war<span class="code-tag">&lt;/dep:type&gt;</span>
		<span class="code-tag">&lt;/dep:moduleId&gt;</span>
		<span class="code-tag">&lt;dep:dependencies/&gt;</span>
		<span class="code-tag">&lt;dep:hidden-classes/&gt;</span>
		<span class="code-tag">&lt;dep:non-overridable-classes/&gt;</span>
	<span class="code-tag">&lt;/dep:environment&gt;</span>

	<span class="code-tag">&lt;context-root&gt;</span>/Bank<span class="code-tag">&lt;/context-root&gt;</span>
<span class="code-tag">&lt;/web-app&gt;</span></pre>
</div></div>
<p><b>BankPool.xml</b> provides the connection information for a database on Geronimo. In this case we are using Geronimo's built-in Derby database. The dependency for it should actually be org.apache.geronimo.configs/system-database//car. It has caused me problems when trying to use anything different. The following database pool plan is generated from the console. The only change I made to it was the dependency to make it point to the system-database where the derby engine is running. This db pool will be deployed with the EAR application.</p>
<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>BankPool.xml</b></div><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;connector xmlns=<span class="code-quote">"http://geronimo.apache.org/xml/ns/j2ee/connector-1.1"</span>&gt;</span>
	<span class="code-tag">&lt;dep:environment <span class="code-keyword">xmlns:dep</span>=<span class="code-quote">"http://geronimo.apache.org/xml/ns/deployment-1.1"</span>&gt;</span>
		<span class="code-tag">&lt;dep:moduleId&gt;</span>
			<span class="code-tag">&lt;dep:groupId&gt;</span>console.dbpool<span class="code-tag">&lt;/dep:groupId&gt;</span>
			<span class="code-tag">&lt;dep:artifactId&gt;</span>BankPool<span class="code-tag">&lt;/dep:artifactId&gt;</span>
			<span class="code-tag">&lt;dep:version&gt;</span>1.0<span class="code-tag">&lt;/dep:version&gt;</span>
			<span class="code-tag">&lt;dep:type&gt;</span>rar<span class="code-tag">&lt;/dep:type&gt;</span>
		<span class="code-tag">&lt;/dep:moduleId&gt;</span>
		<span class="code-tag">&lt;dep:dependencies&gt;</span>
			<span class="code-tag">&lt;dep:dependency&gt;</span>
				<span class="code-tag">&lt;dep:groupId&gt;</span>org.apache.geronimo.configs<span class="code-tag">&lt;/dep:groupId&gt;</span>
				<span class="code-tag">&lt;dep:artifactId&gt;</span>system-database<span class="code-tag">&lt;/dep:artifactId&gt;</span>
				<span class="code-tag">&lt;dep:type&gt;</span>car<span class="code-tag">&lt;/dep:type&gt;</span>
			<span class="code-tag">&lt;/dep:dependency&gt;</span>
		<span class="code-tag">&lt;/dep:dependencies&gt;</span>
	<span class="code-tag">&lt;/dep:environment&gt;</span>
	<span class="code-tag">&lt;resourceadapter&gt;</span>
		<span class="code-tag">&lt;outbound-resourceadapter&gt;</span>
			<span class="code-tag">&lt;connection-definition&gt;</span>
				<span class="code-tag">&lt;connectionfactory-interface&gt;</span>javax.sql.DataSource<span class="code-tag">&lt;/connectionfactory-interface&gt;</span>
				<span class="code-tag">&lt;connectiondefinition-instance&gt;</span>
					<span class="code-tag">&lt;name&gt;</span>BankPool<span class="code-tag">&lt;/name&gt;</span>
					<span class="code-tag">&lt;config-property-setting name=<span class="code-quote">"Driver"</span>&gt;</span>org.apache.derby.jdbc.EmbeddedDriver<span class="code-tag">&lt;/config-property-setting&gt;</span>
					<span class="code-tag">&lt;config-property-setting name=<span class="code-quote">"UserName"</span>&gt;</span>app<span class="code-tag">&lt;/config-property-setting&gt;</span>
					<span class="code-tag">&lt;config-property-setting name=<span class="code-quote">"ConnectionURL"</span>&gt;</span>jdbc:derby:BankDB<span class="code-tag">&lt;/config-property-setting&gt;</span>
					<span class="code-tag">&lt;connectionmanager&gt;</span>
						<span class="code-tag">&lt;local-transaction/&gt;</span>
						<span class="code-tag">&lt;single-pool&gt;</span>
							<span class="code-tag">&lt;max-size&gt;</span>10<span class="code-tag">&lt;/max-size&gt;</span>
							<span class="code-tag">&lt;min-size&gt;</span>0<span class="code-tag">&lt;/min-size&gt;</span>
							<span class="code-tag">&lt;match-one/&gt;</span>
						<span class="code-tag">&lt;/single-pool&gt;</span>
					<span class="code-tag">&lt;/connectionmanager&gt;</span>
				<span class="code-tag">&lt;/connectiondefinition-instance&gt;</span>
			<span class="code-tag">&lt;/connection-definition&gt;</span>
		<span class="code-tag">&lt;/outbound-resourceadapter&gt;</span>
	<span class="code-tag">&lt;/resourceadapter&gt;</span>
<span class="code-tag">&lt;/connector&gt;</span></pre>
</div></div>
<p><b>geronimo-application.xml</b> tells the application that there is a database pool that needs to be deployed as well. The db pool is defined in <b>BankPool.xml</b> and the driver that is needs in order to be deployed is the <b>tranql-connector-ra-1.3.rar</b> file--these two files will reside on the top level layer of the resultant EAR file.</p>
<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>geronimo-application.xml</b></div><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>
<span class="code-tag">&lt;application xmlns=<span class="code-quote">"http://geronimo.apache.org/xml/ns/j2ee/application-1.2"</span>&gt;</span>
    <span class="code-tag">&lt;environment xmlns=<span class="code-quote">"http://geronimo.apache.org/xml/ns/deployment-1.2"</span>&gt;</span>
        <span class="code-tag">&lt;moduleId&gt;</span>
            <span class="code-tag">&lt;groupId&gt;</span>${pom.groupId}<span class="code-tag">&lt;/groupId&gt;</span>
            <span class="code-tag">&lt;artifactId&gt;</span>${pom.artifactId}<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>ear<span class="code-tag">&lt;/type&gt;</span>
        <span class="code-tag">&lt;/moduleId&gt;</span>
    <span class="code-tag">&lt;/environment&gt;</span>
    <span class="code-tag">&lt;module&gt;</span>
        <span class="code-tag">&lt;connector&gt;</span>tranql-connector-ra-1.3.rar<span class="code-tag">&lt;/connector&gt;</span>
        <span class="code-tag">&lt;alt-dd&gt;</span>BankPool.xml<span class="code-tag">&lt;/alt-dd&gt;</span>
    <span class="code-tag">&lt;/module&gt;</span>
<span class="code-tag">&lt;/application&gt;</span></pre>
</div></div>

<h3><a name="EJBsampleapplication-SampleDatabase"></a>Sample Database</h3>

<p>The sample database that is being used to demonstrate this application is inbuilt Derby database. The name of the sample database is <b>BankDB</b> and it consists of three tables, CUSTOMER ,ACCOUNT and EXCHANGE_RATE. The fields for each of these tables are described below.</p>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Table Name </th>
<th class='confluenceTh'> Fields </th>
</tr>
<tr>
<td class='confluenceTd'> CUSTOMER </td>
<td class='confluenceTd'> customerId (PRIMARY KEY)<br clear="all" />
 name </td>
</tr>
<tr>
<td class='confluenceTd'> ACCOUNT </td>
<td class='confluenceTd'> accountNumber (PRIMARY KEY)<br clear="all" />
 accountType<br clear="all" />
 balance<br clear="all" />
 customerId </td>
</tr>
<tr>
<td class='confluenceTd'> EXCHANGERATE </td>
<td class='confluenceTd'> rateId (PRIMARY KEY)<br clear="all" />
 currency<br clear="all" />
 rate </td>
</tr>
</tbody></table>
<p>The CUSTOMER table stores the data related to the customers. It stores only the identification number and and the name. ACCOUNT table has a unique account number for identification. Account type and balance are the other information stored. Account.customerId is a foriegn key to the Customer table which is the owner of the Account. EXCHANGERATE table has a primary key of rateId for an identification. Each record of EXCHANGERATE has currency name and rate paid by the bank.</p>

<h2><a name="EJBsampleapplication-Toolsused"></a>Tools used</h2>

<p>The tools used for developing and building the Banking applications are:</p>

<h3><a name="EJBsampleapplication-ApacheDerby"></a>Apache Derby</h3>

<p>Apache Derby, an Apache DB subproject, is a relational database implemented in Java. Its footprint is so small you can easily embed it in any Java-based solution. In addition to its embedded framework, Derby supports a more familiar client/server framework with the Derby Network Server.<br/>
<span class="nobr"><a href="http://db.apache.org/derby/index.html" title="Visit page outside Confluence" rel="nofollow">http://db.apache.org/derby/index.html<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></p>

<h3><a name="EJBsampleapplication-ApacheMaven2"></a>Apache Maven 2</h3>

<p>Maven is a popular open source build tool for enterprise Java projects, designed to take much of the hard work out of the build process. Maven uses a declarative approach, where the project structure and contents are described, rather than the task-based approach used in Ant or in traditional make files, for example. This helps enforce company-wide development standards and reduces the time needed to write and maintain build scripts. The declarative, lifecycle-based approach used by Maven 1 is, for many, a radical departure from more traditional build techniques, and Maven 2 goes even further in this regard. Maven 2 can be download from the following URL:<br/>
<span class="nobr"><a href="http://maven.apache.org" title="Visit page outside Confluence" rel="nofollow">http://maven.apache.org<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></p>

<p><a href="#EJBsampleapplication-top" title="top on EJB sample application">Back to Top</a></p>

<h1><a name="EJBsampleapplication-Configuring%2CBuildingandDeployingtheSampleApplication"></a>Configuring, Building and Deploying the Sample Application <a name="EJBsampleapplication-configure"></a></h1>

<p>Download the bank application from the following link:<br/>
<span class="nobr"><a href="/confluence/download/attachments/77973/bank.zip?version=1" title="bank.zip attached to EJB sample application">Bank<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></p>

<p>After decompressing the given file, the <b>bank</b> directory will be created.</p>

<h2><a name="EJBsampleapplication-SourceCode"></a>Source Code</h2>

<p>You can checkout the source code of this sample from SVN:</p>

<p>svn checkout <span class="nobr"><a href="http://svn.apache.org/repos/asf/geronimo/samples/trunk/samples/bank" title="Visit page outside Confluence" rel="nofollow">http://svn.apache.org/repos/asf/geronimo/samples/trunk/samples/bank<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></p>

<h2><a name="EJBsampleapplication-Configuring"></a>Configuring</h2>

<p>Configuration of the application consists of creating the database and defining the connection pool to access it.</p>

<h3><a name="EJBsampleapplication-CreatingandPopulatingDatabase"></a>Creating and Populating Database</h3>

<p>After starting Apache Geronimo log into the console and follow the given steps to create the <b>BankDB</b>.</p>
<div class="preformatted" style="border-style: solid; "><div class="preformattedHeader" style="border-bottom-style: solid; "><b>BankDB.sql</b></div><div class="preformattedContent">
<pre>CREATE TABLE Customer(
	customerId VARCHAR(255) PRIMARY KEY,
	name VARCHAR(255)
);

CREATE TABLE Account(
	accountNumber VARCHAR(255) PRIMARY KEY,
	accountType VARCHAR(255),
	balance DOUBLE,
	customerId VARCHAR(255),
	FOREIGN KEY (customerId) REFERENCES customer
);

CREATE TABLE ExchangeRate(
	rateId VARCHAR(255) PRIMARY KEY,
	currency VARCHAR(255),
	rate DOUBLE
);

INSERT INTO Customer(customerId, name) VALUES('12345','John Doe');
INSERT INTO Account(accountNumber, accountType, balance, customerId) VALUES('1234567890','Savings',1005.35,'12345');
INSERT INTO Account(accountNumber, accountType, balance, customerId) VALUES('2345678901','Current',999.95,'12345');

INSERT INTO ExchangeRate(rateId,currency,rate) VALUES('001','EURO',0.812);
INSERT INTO ExchangeRate(rateId,currency,rate) VALUES('002','YEN',111.15);
INSERT INTO ExchangeRate(rateId,currency,rate) VALUES('003','SLR',99.18);
</pre>
</div></div>
<ol>
	<li>Select <b>DB Manager</b> link from the <b>Console Navigation</b> in the left.</li>
	<li>Give the database name as <b>BankDB</b> and click <b>Create</b> button.</li>
	<li>Select <b>BankDB</b> to the <b>Use DB</b> field.</li>
	<li>Open <b>BankDB.sql</b> in the <b>bank</b> directory from a text editor.</li>
	<li>Paste the content <b>BankDB.sql</b> to the <b>SQL Commands</b> text area and press <b>Run SQL</b> button.</li>
</ol>


<h2><a name="EJBsampleapplication-Building"></a>Building</h2>

<p>Use a command prompt to navigate into the <b>bank</b> directory and just give <b>mvn install site</b> command to build. It will create the <b>bank-ear-2.0-SNAPSHOT.ear</b> under the <b>bank</b> folder. Now, you are ready to deploy bank application in the Geronimo Application server.</p>

<h2><a name="EJBsampleapplication-DeployingtheApplication"></a>Deploying the Application</h2>

<p>Deploying sample application is pretty straight forward as we are going to use the Geronimo Console.</p>
<ol>
	<li>Scroll down to <b>Deploy New</b> from the <b>Console Navigation</b> panel.</li>
	<li>Load <b>bank-ear-2.0-SNAPSHOT.ear</b> from <b>bank</b> folder in to the <b>Archive</b> input box.</li>
	<li>Press <b>Install</b> button to deploy application in the server.</li>
</ol>


<p><a href="#EJBsampleapplication-top" title="top on EJB sample application">Back to Top</a></p>

<h2><a name="EJBsampleapplication-BankingWebApplication"></a>Banking Web Application</h2>

<p>To test the sample web application open a browser and type <span class="nobr"><a href="http://localhost:8080/Bank" title="Visit page outside Confluence" rel="nofollow">http://localhost:8080/Bank<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>. It will forward you to the index page of banking application which has direct links to the view customer and exchange rate information. To view the list of account information of each customer, provide a relavant customer id in the DB. Exchange rate page will display list of all currencies in the exchange rate table. (Note that 'Bank' is case-sensitive)<br/>
<div align="center"><img src="/confluence/download/attachments/77973/bank.bmp" border="0" /></div></p>

<h1><a name="EJBsampleapplication-Summary"></a>Summary <a name="EJBsampleapplication-summary"></a></h1>

<p>This article has shown you how to use the EJB features of the Apache Geronimo. It has provided step-by-step instructions to build an application, deploy and run it to elaborate those features.</p>

<p>Following are some of the highlights of the article.</p>
<ul>
	<li>Apache Geronimo is a J2EE 1.5 Certified application server and it provides all the necessary features to Enterprise applications.</li>
	<li>Create and configure Session and Entity Beans.</li>
	<li>Access defined enterprise level services by different sorts of clients.</li>
</ul>
</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