blob: 29a1ebffb35c6fd56925ba81228e63588e3488be [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<!-- $PAGETITLE -->
<TITLE>OpenEJB - EJB 2.1 Compatibility Example</TITLE>
<LINK href="http://openejb.apache.org/all.css" rel="stylesheet" type="text/css">
<!--[if IE]><link rel="stylesheet" type="text/css" media="screen, projection" href="openejb.apache.org/ie.css"><![endif]-->
<LINK rel="SHORTCUT ICON" href="http://openejb.apache.org/images/favicon.ico">
<META http-equiv="Content-Type" content="text/html;charset=UTF-8">
</HEAD>
<BODY>
<!-- Delay the loading of the external javascript file needed for labels (as it takes too long to load and visibly holds loading of the page body) -->
<!-- To do this without javascript errors over undefined functions, we need to declare stubs here (that are overrided later by the proper implementations) -->
<SCRIPT language="JavaScript" type="text/javascript">
function doAddLabel(hideTextfieldAfterAddParam)
{
// stub
}
function onAddLabel()
{
// stub
}
function showLabelsInput()
{
// stub
}
</SCRIPT>
<A name="top"></A>
<TABLE class="frameTable" cellpadding="0" cellspacing="0" border="0">
<TR class="Row1">
<TD class="Col1"><IMG alt="" src="http://openejb.apache.org/images/dotTrans.gif"></TD>
<TD class="Col2"><IMG alt="" src="http://openejb.apache.org/images/dotTrans.gif"></TD>
<TD class="Col3"><IMG alt="" src="http://openejb.apache.org/images/dotTrans.gif"></TD>
<TD class="Col4"><IMG alt="" src="http://openejb.apache.org/images/dotTrans.gif"></TD>
<TD class="Col5"><IMG alt="" src="http://openejb.apache.org/images/dotTrans.gif"></TD>
</TR>
<TR class="Row2">
<TD class="Col1"><IMG alt="" src="http://openejb.apache.org/images/dotTrans.gif"></TD>
<TD class="Col2">&nbsp;</TD>
<TD class="Col3" id="breadcrumbs">
<!-- $TOP_NAV_BAR -->
<A href="../OPENEJB/index.html" title="Index">Home</A> | <A href="../OPENEJB/download.html" title="Download">Download</A> | <A href="../OPENEJB/mailing-lists.html" title="Mailing Lists">Lists</A> | <A href="http://issues.apache.org/jira/browse/OPENEJB" class="external-link" rel="nofollow">Issues</A>
</TD>
<TD class="Col4"><IMG alt="" src="http://openejb.apache.org/images/dotTrans.gif"></TD>
<TD class="Col5">&nbsp;</TD>
</TR>
<TR class="Row3">
<TD class="Col1"><IMG alt="" class="Row3Img" id="thinLine" src="http://openejb.apache.org/images/line_sm.gif"></TD>
<TD class="Col2"><IMG alt="" class="Row3Img" src="http://openejb.apache.org/images/dotTrans.gif"></TD>
<TD class="Col3"><IMG alt="" class="Row3Img" src="http://openejb.apache.org/images/dotTrans.gif"></TD>
<TD class="Col4"><IMG alt="" src="http://openejb.apache.org/images/dotTrans.gif"></TD>
<TD class="Col5"><IMG alt="" class="Row3Img" src="http://openejb.apache.org/images/dotTrans.gif"></TD>
</TR>
<TR class="Row4">
<TD class="Col1">
<SPAN id="Navigation">
<H3><A name="Navigation-Overview"></A>Overview</H3>
<UL class="alternate" type="square">
<LI><A href="../OPENEJB/index.html" title="Index">Home</A></LI>
<LI><A href="../OPENEJB/news.html" title="News">News</A></LI>
<LI><A href="../OPENEJB/faq.html" title="FAQ">FAQ</A></LI>
<LI><A href="../OPENEJB/download.html" title="Download">Download</A></LI>
<LI><A href="index.html" title="Index">Documentation</A></LI>
<LI><A href="../OPENEJB/examples.html" title="Examples">Examples</A></LI>
<LI><A href="http://cwiki.apache.org/confluence/display/OPENEJB/Lightening%20Demos" class="external-link" rel="nofollow">Lightning Demos</A></LI>
<LI><A href="../OPENEJB/mailing-lists.html" title="Mailing Lists">Mailing Lists</A></LI>
<LI><A href="../OPENEJB/source-code.html" title="Source Code">Source Code</A></LI>
<LI><A href="http://blogs.apache.org/openejb" class="external-link" rel="nofollow">Project Blog</A></LI>
</UL>
<H3><A name="Navigation-Servers"></A>Servers</H3>
<UL class="alternate" type="square">
<LI><A href="../OPENEJB/local-server.html" title="Local Server">Local</A></LI>
<LI><A href="../OPENEJB/remote-server.html" title="Remote Server">Remote</A></LI>
</UL>
<H3><A name="Navigation-Integrations"></A>Integrations</H3>
<UL class="alternate" type="square">
<LI><A href="tomcat.html" title="Tomcat">Tomcat</A></LI>
<LI><A href="../OPENEJB/geronimo.html" title="Geronimo">Geronimo</A></LI>
<LI><A href="../OPENEJB/webobjects.html" title="WebObjects">WebObjects</A></LI>
</UL>
<H3><A name="Navigation-Community"></A>Community</H3>
<UL class="alternate" type="square">
<LI><A href="../OPENEJB/team.html" title="Team">Team</A></LI>
<LI><A href="../OPENEJB/articles.html" title="Articles">Articles</A></LI>
<LI><A href="http://webchat.freenode.net/?channels=openejb" class="external-link" rel="nofollow">IRC</A></LI>
</UL>
<H3><A name="Navigation-RelatedProjects"></A>Related Projects</H3>
<UL class="alternate" type="square">
<LI><A href="http://activemq.apache.org/" class="external-link" rel="nofollow">ActiveMQ</A></LI>
<LI><A href="http://openjpa.apache.org/" class="external-link" rel="nofollow">OpenJPA</A></LI>
<LI><A href="http://cxf.apache.org/" class="external-link" rel="nofollow">CXF</A></LI>
</UL>
<H3><A name="Navigation-Index"></A>Index</H3>
<UL class="alternate" type="square">
<LI><A href="../OPENEJB/space-index.html" title="Space Index">Site Index</A></LI>
<LI><A href="space-index.html" title="Space Index">Doc Index</A></LI>
</UL>
<H3>
<A name="Navigation-Feeds"></A>
Feeds
</H3>
<UL class="feeds">
<LI>
<A href="http://cwiki.apache.org/confluence/spaces/rss.action?key=OPENEJB&newPages=false">
<IMG src="http://openejb.apache.org/images/rss.gif"></A>
<A class="feedsText" href="http://cwiki.apache.org/confluence/spaces/rss.action?key=OPENEJB&newPages=false">Site</A>
</LI>
<LI><A href="http://cwiki.apache.org/confluence/spaces/blogrss.action?key=OPENEJB">
<IMG src="http://openejb.apache.org/images/rss.gif"></A>
<A class="feedsText" href="http://cwiki.apache.org/confluence/spaces/blogrss.action?key=OPENEJB">News</A>
</LI>
</UL>
</SPAN>
</TD>
<TD class="Col2">&nbsp;</TD>
<TD class="Col3">
<TABLE id="PageHeader" border="0" width="100%">
<TR>
<TD>
<A href="http://openejb.org/">
<IMG hspace="0" src="http://openejb.apache.org/images/logo_openejb.gif" vspace="0">
</A>
</TD>
<TD align="right">
<A href="http://www.apache.org/">
<IMG src="http://www.apache.org/images/asf-logo.gif" width="258" height="66">
</A>
</TD>
</TR>
<TR>
<TD id="page_title">
<!-- $TITLE -->
EJB 2.1 Compatibility Example
</TD>
<TD align="right">
<BR><BR>
<!-- Google CSE Search Box Begins -->
<FORM id="searchbox_010475492895890475512:_t4iqjrgx90" action="http://www.google.com/cse">
<INPUT type="hidden" name="cx" value="010475492895890475512:_t4iqjrgx90">
<INPUT type="hidden" name="cof" value="FORID:0">
<INPUT name="q" type="text" size="25">
<INPUT type="submit" name="sa" value="Search">
</FORM>
<SCRIPT type="text/javascript" src="http://www.google.com/coop/cse/brand?form=searchbox_010475492895890475512:_t4iqjrgx90"></SCRIPT>
<!-- Google CSE Search Box Ends -->
</TD>
</TR>
</TABLE>
<P>
<!-- $BODY -->
<DIV id="PageContent">
<H1><A name="EJB2.1CompatibilityExample-Overview"></A>Overview</H1>
<P>In EJB 3.0, your bean's interfaces are not required to extend any specific set of interfaces and generally have no requirements on them at all. These are referred to in EJB spec lingo as <B>Business Interfaces</B>.</P>
<P>In EJB 2.1 and prior, however, there were some pretty strict requirements on interfaces. Namely, you had to have a &quot;home&quot; interface that extended javax.ejb.EJBHome or javax.ejb.EJBLocalHome. This interface served as a sort of factory to create your bean's interface which itself had to extend either javax.ejb.EJBObject or javax.ejb.EJBLocalObject. These legacy styles of interfaces in EJB spec lingo are referred to as <B>Component Interfaces</B>.</P>
<P>In this example we see how one can support both business interfaces and component interfaces on the same bean. You may choose to do this for backwards compatibility with older clients or to maintain an older EJB 2.x API still being used. The advantage is that you can turn EJB 2.1 beans into EJB 3.0 beans without having to update any code consuming that EJB.</P>
<P><EM>The source for this example is in the &quot;component-interfaces&quot; directory located in the <A href="../OPENEJB/download.html" title="Download">openejb-examples.zip</A> available on the download page.</EM></P>
<H1><A name="EJB2.1CompatibilityExample-TheCode"></A>The Code</H1>
<H2><A name="EJB2.1CompatibilityExample-AnnotatedBeanClass"></A>Annotated Bean Class</H2>
<DIV class="code panel" style="border-width: 1px;"><DIV class="codeContent panelContent">
<PRE class="code-java"><SPAN class="code-comment">// EJB 3.0 Style business interfaces
</SPAN><SPAN class="code-comment">// Each of these interfaces are already annotated in the classes
</SPAN><SPAN class="code-comment">// themselves with @Remote and @Local, so annotating them here
</SPAN><SPAN class="code-comment">// in the bean class again is not really required.
</SPAN>@Remote({FriendlyPersonRemote.class})
@Local({FriendlyPersonLocal.class})
<SPAN class="code-comment">// EJB 2.1 Style component interfaces
</SPAN><SPAN class="code-comment">// These interfaces, however, must be annotated here in the bean class.
</SPAN><SPAN class="code-comment">// Use of @RemoteHome in the FriendlyPersonEjbHome class itself is not allowed.
</SPAN><SPAN class="code-comment">// Use of @LocalHome in the FriendlyPersonEjbLocalHome class itself is also not allowed.
</SPAN>@RemoteHome(FriendlyPersonEjbHome.class)
@LocalHome(FriendlyPersonEjbLocalHome.class)
@Stateful(name=<SPAN class="code-quote">&quot;FriendlyPerson&quot;</SPAN>)
<SPAN class="code-keyword">public</SPAN> class FriendlyPersonImpl <SPAN class="code-keyword">implements</SPAN> FriendlyPersonLocal, FriendlyPersonRemote {
<SPAN class="code-keyword">private</SPAN> <SPAN class="code-keyword">final</SPAN> HashMap&lt;<SPAN class="code-object">String</SPAN>, MessageFormat&gt; greetings;
<SPAN class="code-keyword">private</SPAN> <SPAN class="code-keyword">final</SPAN> Properties languagePreferences;
<SPAN class="code-keyword">private</SPAN> <SPAN class="code-object">String</SPAN> defaultLanguage;
<SPAN class="code-keyword">public</SPAN> FriendlyPersonImpl() {
greetings = <SPAN class="code-keyword">new</SPAN> HashMap();
languagePreferences = <SPAN class="code-keyword">new</SPAN> Properties();
defaultLanguage = Locale.getDefault().getLanguage();
addGreeting(<SPAN class="code-quote">&quot;en&quot;</SPAN>, <SPAN class="code-quote">&quot;Hello {0}!&quot;</SPAN>);
addGreeting(<SPAN class="code-quote">&quot;es&quot;</SPAN>, <SPAN class="code-quote">&quot;Hola {0}!&quot;</SPAN>);
addGreeting(<SPAN class="code-quote">&quot;fr&quot;</SPAN>, <SPAN class="code-quote">&quot;Bonjour {0}!&quot;</SPAN>);
addGreeting(<SPAN class="code-quote">&quot;pl&quot;</SPAN>, <SPAN class="code-quote">&quot;Witaj {0}!&quot;</SPAN>);
}
/**
* This method corresponds to the FriendlyPersonEjbHome.create() method
* and the FriendlyPersonEjbLocalHome.create()
*
* If you <SPAN class="code-keyword">do</SPAN> not have an EJBHome or EJBLocalHome <SPAN class="code-keyword">interface</SPAN>, <SPAN class="code-keyword">this</SPAN> method
* can be deleted.
*/
@Init
<SPAN class="code-keyword">public</SPAN> void create(){}
/**
* This method corresponds to the following methods:
* - EJBObject.remove()
* - EJBHome.remove(ejbObject)
* - EJBLocalObject.remove()
* - EJBLocalHome.remove(ejbObject)
*
* If you <SPAN class="code-keyword">do</SPAN> not have an EJBHome or EJBLocalHome <SPAN class="code-keyword">interface</SPAN>, <SPAN class="code-keyword">this</SPAN> method
* can be deleted.
*/
@Remove
<SPAN class="code-keyword">public</SPAN> void remove(){}
<SPAN class="code-keyword">public</SPAN> <SPAN class="code-object">String</SPAN> greet(<SPAN class="code-object">String</SPAN> friend) {
<SPAN class="code-object">String</SPAN> language = languagePreferences.getProperty(friend, defaultLanguage);
<SPAN class="code-keyword">return</SPAN> greet(language, friend);
}
<SPAN class="code-keyword">public</SPAN> <SPAN class="code-object">String</SPAN> greet(<SPAN class="code-object">String</SPAN> language, <SPAN class="code-object">String</SPAN> friend) {
MessageFormat greeting = greetings.get(language);
<SPAN class="code-keyword">if</SPAN> (greeting == <SPAN class="code-keyword">null</SPAN>) {
Locale locale = <SPAN class="code-keyword">new</SPAN> Locale(language);
<SPAN class="code-keyword">return</SPAN> <SPAN class="code-quote">&quot;Sorry, I don't speak &quot;</SPAN> + locale.getDisplayLanguage() + <SPAN class="code-quote">&quot;.&quot;</SPAN>;
}
<SPAN class="code-keyword">return</SPAN> greeting.format(<SPAN class="code-keyword">new</SPAN> <SPAN class="code-object">Object</SPAN>[]{friend});
}
<SPAN class="code-keyword">public</SPAN> void addGreeting(<SPAN class="code-object">String</SPAN> language, <SPAN class="code-object">String</SPAN> message) {
greetings.put(language, <SPAN class="code-keyword">new</SPAN> MessageFormat(message));
}
<SPAN class="code-keyword">public</SPAN> void setLanguagePreferences(<SPAN class="code-object">String</SPAN> friend, <SPAN class="code-object">String</SPAN> language) {
languagePreferences.put(friend, language);
}
<SPAN class="code-keyword">public</SPAN> <SPAN class="code-object">String</SPAN> getDefaultLanguage() {
<SPAN class="code-keyword">return</SPAN> defaultLanguage;
}
<SPAN class="code-keyword">public</SPAN> void setDefaultLanguage(<SPAN class="code-object">String</SPAN> defaultLanguage) {
<SPAN class="code-keyword">this</SPAN>.defaultLanguage = defaultLanguage;
}
}
</PRE>
</DIV></DIV>
<H2><A name="EJB2.1CompatibilityExample-EJB2.1HomeAndRemoteviews"></A>EJB 2.1 Home And Remote views</H2>
<DIV class="code panel" style="border-width: 1px;"><DIV class="codeContent panelContent">
<PRE class="code-java"><SPAN class="code-keyword">import</SPAN> javax.ejb.CreateException;
<SPAN class="code-keyword">import</SPAN> javax.ejb.EJBHome;
<SPAN class="code-keyword">import</SPAN> java.rmi.RemoteException;
<SPAN class="code-keyword">public</SPAN> <SPAN class="code-keyword">interface</SPAN> FriendlyPersonEjbHome <SPAN class="code-keyword">extends</SPAN> EJBHome {
FriendlyPersonEjbObject create() <SPAN class="code-keyword">throws</SPAN> CreateException, RemoteException;
}
</PRE>
</DIV></DIV>
<DIV class="code panel" style="border-width: 1px;"><DIV class="codeContent panelContent">
<PRE class="code-java"><SPAN class="code-keyword">import</SPAN> javax.ejb.EJBObject;
<SPAN class="code-keyword">import</SPAN> java.rmi.RemoteException;
<SPAN class="code-keyword">public</SPAN> <SPAN class="code-keyword">interface</SPAN> FriendlyPersonEjbObject <SPAN class="code-keyword">extends</SPAN> EJBObject {
<SPAN class="code-object">String</SPAN> greet(<SPAN class="code-object">String</SPAN> friend) <SPAN class="code-keyword">throws</SPAN> RemoteException;
<SPAN class="code-object">String</SPAN> greet(<SPAN class="code-object">String</SPAN> language, <SPAN class="code-object">String</SPAN> friend) <SPAN class="code-keyword">throws</SPAN> RemoteException;
void addGreeting(<SPAN class="code-object">String</SPAN> language, <SPAN class="code-object">String</SPAN> message) <SPAN class="code-keyword">throws</SPAN> RemoteException;
void setLanguagePreferences(<SPAN class="code-object">String</SPAN> friend, <SPAN class="code-object">String</SPAN> language) <SPAN class="code-keyword">throws</SPAN> RemoteException;
<SPAN class="code-object">String</SPAN> getDefaultLanguage() <SPAN class="code-keyword">throws</SPAN> RemoteException;
void setDefaultLanguage(<SPAN class="code-object">String</SPAN> defaultLanguage) <SPAN class="code-keyword">throws</SPAN> RemoteException;
}
</PRE>
</DIV></DIV>
<H1><A name="EJB2.1CompatibilityExample-TestCase"></A>Test Case</H1>
<DIV class="code panel" style="border-width: 1px;"><DIV class="codeContent panelContent">
<PRE class="code-java"><SPAN class="code-keyword">public</SPAN> void testEjbHomeAndEjbObject() <SPAN class="code-keyword">throws</SPAN> Exception {
<SPAN class="code-object">Object</SPAN> object = initialContext.lookup(<SPAN class="code-quote">&quot;FriendlyPersonRemoteHome&quot;</SPAN>);
FriendlyPersonEjbHome home = (FriendlyPersonEjbHome) object;
FriendlyPersonEjbObject friendlyPerson = home.create();
friendlyPerson.setDefaultLanguage(<SPAN class="code-quote">&quot;en&quot;</SPAN>);
assertEquals(<SPAN class="code-quote">&quot;Hello David!&quot;</SPAN>, friendlyPerson.greet(<SPAN class="code-quote">&quot;David&quot;</SPAN>));
assertEquals(<SPAN class="code-quote">&quot;Hello Amelia!&quot;</SPAN>, friendlyPerson.greet(<SPAN class="code-quote">&quot;Amelia&quot;</SPAN>));
friendlyPerson.setLanguagePreferences(<SPAN class="code-quote">&quot;Amelia&quot;</SPAN>, <SPAN class="code-quote">&quot;es&quot;</SPAN>);
assertEquals(<SPAN class="code-quote">&quot;Hello David!&quot;</SPAN>, friendlyPerson.greet(<SPAN class="code-quote">&quot;David&quot;</SPAN>));
assertEquals(<SPAN class="code-quote">&quot;Hola Amelia!&quot;</SPAN>, friendlyPerson.greet(<SPAN class="code-quote">&quot;Amelia&quot;</SPAN>));
<SPAN class="code-comment">// Amelia took some French, let's see <SPAN class="code-keyword">if</SPAN> she remembers
</SPAN> assertEquals(<SPAN class="code-quote">&quot;Bonjour Amelia!&quot;</SPAN>, friendlyPerson.greet(<SPAN class="code-quote">&quot;fr&quot;</SPAN>, <SPAN class="code-quote">&quot;Amelia&quot;</SPAN>));
<SPAN class="code-comment">// Dave should take some Polish and <SPAN class="code-keyword">if</SPAN> he had, he could say Hi in Polish
</SPAN> assertEquals(<SPAN class="code-quote">&quot;Witaj Dave!&quot;</SPAN>, friendlyPerson.greet(<SPAN class="code-quote">&quot;pl&quot;</SPAN>, <SPAN class="code-quote">&quot;Dave&quot;</SPAN>));
<SPAN class="code-comment">// Let's see <SPAN class="code-keyword">if</SPAN> I speak Portuguese
</SPAN> assertEquals(<SPAN class="code-quote">&quot;Sorry, I don't speak &quot;</SPAN> + <SPAN class="code-keyword">new</SPAN> Locale(<SPAN class="code-quote">&quot;pt&quot;</SPAN>).getDisplayLanguage() + <SPAN class="code-quote">&quot;.&quot;</SPAN>, friendlyPerson.greet(<SPAN class="code-quote">&quot;pt&quot;</SPAN>, <SPAN class="code-quote">&quot;David&quot;</SPAN>));
<SPAN class="code-comment">// Ok, well I've been meaning to learn, so...
</SPAN> friendlyPerson.addGreeting(<SPAN class="code-quote">&quot;pt&quot;</SPAN>, <SPAN class="code-quote">&quot;Ola {0}!&quot;</SPAN>);
assertEquals(<SPAN class="code-quote">&quot;Ola David!&quot;</SPAN>, friendlyPerson.greet(<SPAN class="code-quote">&quot;pt&quot;</SPAN>, <SPAN class="code-quote">&quot;David&quot;</SPAN>));
}
</PRE>
</DIV></DIV>
<H1><A name="EJB2.1CompatibilityExample-Runningit"></A>Running it</H1>
<P>Running the example is fairly simple. In the &quot;component-interfaces&quot; directory of the <A href="../OPENEJB/download.html" title="Download">examples zip</A>, just run:</P>
<BLOCKQUOTE>
<P>$ mvn clean install</P></BLOCKQUOTE>
<P>Which should create output like the following.</P>
<DIV class="preformatted panel" style="border-width: 1px;"><DIV class="preformattedContent panelContent">
<PRE>-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.superbiz.FriendlyPersonTest
Apache OpenEJB 3.0 build: 20080408-04:13
http://openejb.apache.org/
INFO - openejb.home = /Users/dblevins/work/openejb-3.0/examples/component-interfaces
INFO - openejb.base = /Users/dblevins/work/openejb-3.0/examples/component-interfaces
INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
INFO - Configuring Service(id=Default JDK 1.3 ProxyFactory, type=ProxyFactory, provider-id=Default JDK 1.3 ProxyFactory)
INFO - Found EjbModule in classpath: /Users/dblevins/work/openejb-3.0/examples/component-interfaces/target/classes
INFO - Configuring app: /Users/dblevins/work/openejb-3.0/examples/component-interfaces/target/classes
INFO - Configuring Service(id=Default Stateful Container, type=Container, provider-id=Default Stateful Container)
INFO - Auto-creating a container for bean FriendlyPerson: Container(type=STATEFUL, id=Default Stateful Container)
INFO - Loaded Module: /Users/dblevins/work/openejb-3.0/examples/component-interfaces/target/classes
INFO - Assembling app: /Users/dblevins/work/openejb-3.0/examples/component-interfaces/target/classes
INFO - Jndi(name=FriendlyPersonRemoteHome) --&gt; Ejb(deployment-id=FriendlyPerson)
INFO - Jndi(name=FriendlyPersonLocalHome) --&gt; Ejb(deployment-id=FriendlyPerson)
INFO - Jndi(name=FriendlyPersonLocal) --&gt; Ejb(deployment-id=FriendlyPerson)
INFO - Jndi(name=FriendlyPersonRemote) --&gt; Ejb(deployment-id=FriendlyPerson)
INFO - Created Ejb(deployment-id=FriendlyPerson, ejb-name=FriendlyPerson, container=Default Stateful Container)
INFO - Deployed Application(path=/Users/dblevins/work/openejb-3.0/examples/component-interfaces/target/classes)
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.741 sec
Results :
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0
</PRE>
</DIV></DIV>
</DIV>
</P>
</TD>
<TD class="Col4"><IMG src="http://openejb.apache.org/images/dotTrans.gif"></TD>
<TD class="Col5">
</TD>
</TR>
<TR class="Row5">
<TD class="Col1">&nbsp;</TD>
<TD class="Col2">&nbsp;</TD>
<TD class="Col3">
<BR>
<BR>
<IMG width="100%" height="1" src="http://openejb.apache.org/images/line_light.gif">
<TABLE width="100%">
<TR>
<TD>
<SPAN class="bodyGrey">
<SMALL>
<NOTICE><!-- $FOOTER -->
Apache OpenEJB is an project of The Apache Software Foundation (ASF)
</NOTICE>
<BR>
Site Powered by
<A href="http://atlassian.com/">Atlassian</A>
<A href="http://atlassian.com/confluence/">Confluence</A>
.
</SMALL>
</SPAN>
</TD>
<TD align="right">
<A style="color:#999;font-size:small;font-weight:normal;" href="https://cwiki.apache.org/confluence/pages/editpage.action?spaceKey=OPENEJBx30&title=EJB%202.1%20Compatibility%20Example">[ edit ]</A>
</TD>
</TR>
</TABLE>
<BR>
</TD>
<TD class="Col4"><IMG src="http://openejb.apache.org/images/dotTrans.gif"></TD>
<TD class="Col5">&nbsp;</TD>
</TR>
</TABLE>
<!-- Needed for composition plugin -->
<!-- delay the loading of large javascript files to the end so that they don't interfere with the loading of page content -->
<SPAN style="display: none">
<SCRIPT type="text/javascript" language="JavaScript" src="http://cwiki.apache.org/confluence/labels-javascript"></SCRIPT>
<SCRIPT src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</SCRIPT>
<SCRIPT type="text/javascript">
_uacct = "UA-2717626-1";
urchinTracker();
</SCRIPT>
</SPAN>
</BODY>
</HTML>