You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by bu...@apache.org on 2011/07/12 20:06:36 UTC
svn commit: r792601 [15/49] - /websites/staging/openejb/trunk/content/
Modified: websites/staging/openejb/trunk/content/failover.html
==============================================================================
--- websites/staging/openejb/trunk/content/failover.html (original)
+++ websites/staging/openejb/trunk/content/failover.html Tue Jul 12 18:06:32 2011
@@ -152,12 +152,12 @@
<P>
<!-- $BODY -->
<DIV id="PageContent">
- <p><a name="Failover-Overview"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+ <p><a name="Failover-Overview"></a></p>
<h1>Overview</h1>
<p>OpenEJB supports stateless failover. Specifically, the ability for an EJB
-client to failover from one server to the ne<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t if a request cannot be
+client to failover from one server to the next if a request cannot be
completed. No application state information is communicated between the
servers, so this functionality should be used only with applications that
are inherently stateless. A common term for this sort of setup is a server
@@ -166,12 +166,12 @@ farm.</p>
<p>The basic design assumption is that all servers in the same group have the
same applications deployed and are capable of doing the same job. Servers
can be brought online and offline while clients are running. As members
-join<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">leave this information is sent to the client as part of normal EJB
-request<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">response communication so active clients always have the most
+join/leave this information is sent to the client as part of normal EJB
+request/response communication so active clients always have the most
current information on servers that can process their request should
communication with a particular server fail.</p>
-<p><a name="Failover-Failover"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="Failover-Failover"></a></p>
<h2>Failover</h2>
@@ -183,32 +183,32 @@ list. This is an important distinction
and forth on every request, only on change. If the membership of the
cluster is stable there is essentially no clustering overhead to the
protocol -- 8 byte overhead to each request and 1 byte on each response --
-so you will <em>not</em> see an e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ponential slowdown in response times the more
+so you will <em>not</em> see an exponential slowdown in response times the more
members are added to the cluster. This new list takes affect for all
-pro<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ies that share the same connection.</p>
+proxies that share the same connection.</p>
-<p>When a server shuts down, more connections are refused, e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">isting
+<p>When a server shuts down, more connections are refused, existing
connections not in mid-request are closed, any remaining connections are
closed immediately after completion of the request in progress and clients
-can failover gracefully to the ne<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t server in the list. If a server
-crashes requests are retried on the ne<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t server in the list (or depending
+can failover gracefully to the next server in the list. If a server
+crashes requests are retried on the next server in the list (or depending
on the ConnectionStrategy). This failover pattern is followed until there
are no more servers in the list at which point the client attempts a final
multicast search (if it was created with a multicast PROVIDER_URL) before
-abandoning the request and throwing an e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ception to the caller.</p>
+abandoning the request and throwing an exception to the caller.</p>
<p>By default, the failover is ordered but random selection is supported. The
multicast discovery aspect of the client adds a nice randomness to the
selection of the first server.</p>
-<p><a name="Failover-Discovery"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="Failover-Discovery"></a></p>
<h2>Discovery</h2>
<p>Each discoverable service has a URI which is broadcast as a heartbeat to
other servers in the cluster. This URI advertises the service's type, its
cluster group, and its location in the format of 'group:type:location'.
-Say for e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ample "cluster1:ejb:ejbd:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">thehost:4201". The URI is sent out
+Say for example "cluster1:ejb:ejbd://thehost:4201". The URI is sent out
repeatedly in a pulse and its presence on the network indicates its
availability and its absence indicates the service is no longer available.</p>
@@ -218,15 +218,15 @@ section. The rate at which the heartbea
specified via the 'heart_rate' property. The default is 500 milliseconds.
This rate is also used when listening for services on the network. If a
service goes missing for the duration of 'heart_rate' multiplied by
-'ma<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0"><em>missed</em>heartbeats', then the service is considered dead.</p>
+'max_missed_heartbeats', then the service is considered dead.</p>
-<p>The 'group' property, cluster1 in the e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ample, is used to dissect the
+<p>The 'group' property, cluster1 in the example, is used to dissect the
servers on the network into smaller logical clusters. A given server will
-broadcast all it's services with the group prefi<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ed in the URI, as well it
+broadcast all it's services with the group prefixed in the URI, as well it
will ignore any services it sees broadcast if they do not share the same
group name.</p>
-<p><a name="Failover-Multicast(UDP)"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="Failover-Multicast(UDP)"></a></p>
<h1>Multicast (UDP)</h1>
@@ -241,15 +241,15 @@ Complicated libraries that ride atop UDP
(retransmission) and ordering on UDP can be avoided. As well the
advantages UDP has over TCP are retained as there are no java layers
attempting to force UDP communication to be more TCP-like. The simple
-design means UDP<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">Multicast is only used for discovery and from there on out
-critical information is transmitted over TCP<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">IP which is obviously going to
+design means UDP/Multicast is only used for discovery and from there on out
+critical information is transmitted over TCP/IP which is obviously going to
do a better job at ensuring reliability and ordering.</p>
-<p><a name="Failover-ServerConfiguration"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="Failover-ServerConfiguration"></a></p>
<h2>Server Configuration</h2>
-<p>When you boot the server there should be a conf<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">multicast.properties file
+<p>When you boot the server there should be a conf/multicast.properties file
containing:</p>
<pre><code>server = org.apache.openejb.server.discovery.MulticastDiscoveryAgent
@@ -260,29 +260,29 @@ group = default
</code></pre>
<p>Just need to enable that by setting 'disabled=false'. All of the above
-settings e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">cept <em>server</em> can be changed. The <em>port</em> and <em>bind</em> must
-be valid for general multicast<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">udp network communication.</p>
+settings except <em>server</em> can be changed. The <em>port</em> and <em>bind</em> must
+be valid for general multicast/udp network communication.</p>
<p>The <em>group</em> setting can be changed to further group servers that may use
the same multicast channel. As shown below the client also has a <em>group</em>
setting which can be used to select an appropriate server from the
multicast channel.</p>
-<p><a name="Failover-MulticastClient"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="Failover-MulticastClient"></a></p>
<h2>Multicast Client</h2>
<p>The multicast functionality is not just for servers to find each other in a
cluster, it can also be used for EJB clients to discover a server. A
-special "multicast:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">" URL can be used in the InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t properties to
+special "multicast://" URL can be used in the InitialContext properties to
signify that multicast should be used to seed the connection process. Such
as:</p>
<pre><code>Properties p = new Properties();
-p.put(Conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.INITIAL_CONTEXT_FACTORY,
-"org.apache.openejb.client.RemoteInitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tFactory");
-p.put(Conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.PROVIDER_URL, "multicast:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">239.255.2.3:6142?group=default");
-InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t remoteConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t = new InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t(p);
+p.put(Context.INITIAL_CONTEXT_FACTORY,
+"org.apache.openejb.client.RemoteInitialContextFactory");
+p.put(Context.PROVIDER_URL, "multicast://239.255.2.3:6142?group=default");
+InitialContext remoteContext = new InitialContext(p);
</code></pre>
<p>The URL has optional query parameters such as "schemes" and "group" and
@@ -305,15 +305,15 @@ Servers can use multicast to discover ea
free to connect to servers in the network using the server's TCP address.</p>
<pre><code>Properties p = new Properties();
-p.put(Conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tFactory");
-p.put(Conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.PROVIDER_URL, "ejbd:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">192.168.1.30:4201");
-InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t remoteConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t = new InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t(p);
+p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
+p.put(Context.PROVIDER_URL, "ejbd://192.168.1.30:4201");
+InitialContext remoteContext = new InitialContext(p);
</code></pre>
<p>When the client connects, the server will send the URLs of all the servers
in the group and failover will take place normally.</p>
-<p><a name="Failover-Multipoint(TCP)"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="Failover-Multipoint(TCP)"></a></p>
<h1>Multipoint (TCP)</h1>
@@ -323,7 +323,7 @@ connection to each other server in the n
<p>To join the network, the server must be configured to know the address of
at least one server in the network and connect to it. When it does both
-servers will e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">change the full list of all the other servers each knows
+servers will exchange the full list of all the other servers each knows
about. Each server will then connect to any new servers they've just
learned about and repeat the processes with those new servers. The end
result is that everyone has a direct connection to everyone 100% of the
@@ -336,19 +336,19 @@ least one server in the network and be a
it will get the full (and dynamically maintained) list of every server in
the network. The client doesn't connect to each of those servers
immediately, but rather consults the list in the event of a failover, using
-it to decide who to connect to ne<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.</p>
+it to decide who to connect to next.</p>
<p>The entire process is essentially the art of using a statically maintained
list to bootstrap getting the more valuable dynamically maintained list.</p>
<p>{div:style=clear:both;}{div}</p>
-<p><a name="Failover-ServerConfiguration"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="Failover-ServerConfiguration"></a></p>
<h2>Server Configuration</h2>
<p>In the server this list can be specified via the
-<code>conf<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">multipoint.properties</code> file like so:</p>
+<code>conf/multipoint.properties</code> file like so:</p>
<pre><code>server = org.apache.openejb.server.discovery.MultipointDiscoveryAgent
bind = 127.0.0.1
@@ -364,19 +364,19 @@ servers on the network. Only one of the
running when this server starts up -- it is not required to list all
servers in the network.</p>
-<p><a name="Failover-ClientConfiguration"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="Failover-ClientConfiguration"></a></p>
<h2>Client Configuration</h2>
<p>Configuration in the client is similar, but note that EJB clients do not
participate directly in multipoint communication and do <em>not</em> connect to
the multipoint port. The server list is simply a list of the regular
-"ejbd:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">" urls that a client normally uses to connect to a server.</p>
+"ejbd://" urls that a client normally uses to connect to a server.</p>
<pre><code>Properties p = new Properties();
-p.put(Conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tFactory");
-p.put(Conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.PROVIDER_URL, "failover:ejbd:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">192.168.1.20:4201,ejbd:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">192.168.1.30:4201");
-InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t remoteConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t = new InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t(p);
+p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
+p.put(Context.PROVIDER_URL, "failover:ejbd://192.168.1.20:4201,ejbd://192.168.1.30:4201");
+InitialContext remoteContext = new InitialContext(p);
</code></pre>
<h2>Considerations</h2>
@@ -385,7 +385,7 @@ InitialConte<IMG class="emoticon" src
<p>The general disadvantage of this topology is the number of connections
required. The number of connections for the network of servers is equal to
-"(n * n - n) <IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"> 2 ", where n is the number of servers. For e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ample, with 5
+"(n * n - n) / 2 ", where n is the number of servers. For example, with 5
servers you need 10 connections, with 10 servers you need 45 connections,
and with 50 servers you need 1225 connections. This is of course the
number of connections across the entire network, each individual server
@@ -393,7 +393,7 @@ only needs "n - 1" connections.</p>
<p>The handling of these sockets is all asynchronous Java NIO code which
allows the server to handle many connections (all of them) with one thread.
- From a pure threading perspective, the option is e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tremely efficient with
+ From a pure threading perspective, the option is extremely efficient with
just one thread to listen and broadcast to many peers. </p>
<h3>Double connect</h3>
@@ -401,7 +401,7 @@ just one thread to listen and broadcast
<p>It is possible in this process that two servers learn of each other at the
same time and each attempts to connect to the other simultaneously,
resulting in two connections between the same two servers. When this
-happens both servers will detect the e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tra connection and one of the
+happens both servers will detect the extra connection and one of the
connections will be dropped and one will be kept. In practice this race
condition rarely happens and can be avoided almost entirely by fanning out
server startup by as little as 100 milliseconds.</p>
@@ -414,9 +414,9 @@ establish direct connections with each o
of failure.</p>
<p>However to ensure that the bootstrapping process can occur successfully,
-the {{initialServers}} property of the {{conf<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">multipoint.properties}} file
+the {{initialServers}} property of the {{conf/multipoint.properties}} file
must be set carefully and with a specific server start order in mind. Each
-server consults its {{initialServers}} list e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">actly once in the
+server consults its {{initialServers}} list exactly once in the
bootstrapping phase at startup, after that time connections are made
dynamically.</p>
@@ -426,7 +426,7 @@ become introduced and connected to all t
<h2>Failed scenario (background)</h2>
-<p>As an e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ample of a failed scenario, imagine there are three servers;
+<p>As an example of a failed scenario, imagine there are three servers;
server1, server2, server3. They are setup only to point to the server in
front of them making a chain:</p>
@@ -437,7 +437,7 @@ front of them making a chain:</p>
</ul>
<p>Which is essentially server1 -> server2 -> server3. This scenario could
-work, but they servers would have to be started in e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">actly the opposite
+work, but they servers would have to be started in exactly the opposite
order:</p>
<p># server3 starts
@@ -471,7 +471,7 @@ could bring a fourth server online tempo
servers. Once it makes the introductions and all servers learn of each
other, you could shut it down again.</p>
-<p>The above setup is easily fi<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">able via better configuration. If server3
+<p>The above setup is easily fixable via better configuration. If server3
listed both server1 and server2 in its initialServers list, rather than
listing nothing at all, then all servers would fully discover each other
regardless of startup order; assuming all three servers did eventually
@@ -483,11 +483,11 @@ start.</p>
list all three servers. </p>
<ul>
-<li>server1<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">conf<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">multipoint.properties
+<li>server1/conf/multipoint.properties
** initialServers = server1, server2, server3</li>
-<li>server2<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">conf<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">multipoint.properties
+<li>server2/conf/multipoint.properties
** initialServers = server1, server2, server3</li>
-<li>server3<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">conf<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">multipoint.properties
+<li>server3/conf/multipoint.properties
** initialServers = server1, server2, server3</li>
</ul>
@@ -502,9 +502,9 @@ focus on always keeping at least one of
as "root" servers for simplicity sake.</p>
<ul>
-<li>server1<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">conf<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">multipoint.properties
+<li>server1/conf/multipoint.properties
** initialServers = server2</li>
-<li>server2<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">conf<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">multipoint.properties
+<li>server2/conf/multipoint.properties
** initialServers = server1</li>
</ul>
@@ -517,11 +517,11 @@ server2, and vice versa.</p>
their initialServers list.</p>
<ul>
-<li>server3<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">conf<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">multipoint.properties
+<li>server3/conf/multipoint.properties
** initialServers = server1, server2</li>
-<li>server4<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">conf<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">multipoint.properties
+<li>server4/conf/multipoint.properties
** initialServers = server1, server2</li>
-<li>serverN<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">conf<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">multipoint.properties
+<li>serverN/conf/multipoint.properties
** initialServers = server1, server2</li>
</ul>
@@ -539,18 +539,18 @@ convenience.</p>
<h2>Command line overrides</h2>
-<p>Always remember that any property in a conf<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><server-service>.properties
+<p>Always remember that any property in a conf/<server-service>.properties
file can be overridden on the command line or via system properties. So it
is possible easily set the initialServers list in startup scripts.</p>
-<p>A bash e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ample might look something like:</p>
+<p>A bash example might look something like:</p>
-<pre><code>!<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">bin<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">bash
+<pre><code>!/bin/bash
-OPENEJB_HOME=<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">opt<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">openejb-3.1.3
-INITIAL_LIST=$(cat <IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">some<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">shared<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">directory<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">our_initial_servers.t<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t)
+OPENEJB_HOME=/opt/openejb-3.1.3
+INITIAL_LIST=$(cat /some/shared/directory/our_initial_servers.txt)
-$OPENEJB_HOME<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">bin<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">openejb start -Dmultipoint.initialServers=$INITIAL_LIST
+$OPENEJB_HOME/bin/openejb start -Dmultipoint.initialServers=$INITIAL_LIST
</code></pre>
</DIV>
Modified: websites/staging/openejb/trunk/content/faq.html
==============================================================================
--- websites/staging/openejb/trunk/content/faq.html (original)
+++ websites/staging/openejb/trunk/content/faq.html Tue Jul 12 18:06:32 2011
@@ -152,20 +152,20 @@
<P>
<!-- $BODY -->
<DIV id="PageContent">
- <p><a name="FAQ- General"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+ <p><a name="FAQ- General"></a></p>
<h2> General</h2>
<p> </p>
-<p><a name="FAQ-WhatspecversiondoesOpenEJBsupport?"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="FAQ-WhatspecversiondoesOpenEJBsupport?"></a></p>
<h3>What spec version does OpenEJB support?</h3>
<p>OpenEJB supports the Enterprise JavaBeans 3.0 specification and previous
versions 2.1, 2.0 and 1.1.</p>
-<p><a name="FAQ-Idon'tplantouseEJBs,sowhywouldIembedOpenEJBintoTomcat."><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="FAQ-Idon'tplantouseEJBs,sowhywouldIembedOpenEJBintoTomcat."></a></p>
<h3>I don't plan to use EJBs, so why would I embed OpenEJB into Tomcat.</h3>
@@ -178,23 +178,23 @@ as Dates, Classes, URI, URL, List, Map,
case of Tomcat 5.5 which doesn't support dependency injection at all, even
more is gained.</p>
-<p><a name="FAQ-CanIrunOpenEJBwithaJVMforanyvendor?"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="FAQ-CanIrunOpenEJBwithaJVMforanyvendor?"></a></p>
<h3>Can I run OpenEJB with a JVM for any vendor?</h3>
<p>The Sun, Mac, and IBM vms are regularly tested, however any vm should work.</p>
-<p><a name="FAQ-WhichversionofJavaisrequiredtorunOpenEJB?"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="FAQ-WhichversionofJavaisrequiredtorunOpenEJB?"></a></p>
<h3>Which version of Java is required to run OpenEJB?</h3>
<p>Java versions 5 or 6, aka Java 1.5 or 1.6.</p>
-<p><a name="FAQ-DoIneedApacheMaventoworkwithOpenEJB?"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="FAQ-DoIneedApacheMaventoworkwithOpenEJB?"></a></p>
<h3>Do I need Apache Maven to work with OpenEJB?</h3>
-<p>Definitely not. Most of the e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">amples include both Maven and Ant build
+<p>Definitely not. Most of the examples include both Maven and Ant build
files. OpenEJB is usable as a plain library, much like an embedded
database like Derby, so it is usable in any application regardless if that
application is run via Maven, Ant, Intellij, Eclipse, NetBeans, JUnit,
@@ -205,57 +205,57 @@ TestNG, etc.</p>
<p>supported by OpenEJB?</p>
<p>The short answer is yes. The basic approach for all embedding scenarios is
-to 1) add OpenEJB to your classpath, and 2) construct your InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t
-using org.apache.openejb.client.LocalInitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tFactory. The
-LocalInitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tFactory will boot OpenEJB in your vm and all ejb
+to 1) add OpenEJB to your classpath, and 2) construct your InitialContext
+using org.apache.openejb.client.LocalInitialContextFactory. The
+LocalInitialContextFactory will boot OpenEJB in your vm and all ejb
applications visible in the classpath will be deployed. See
-http:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">openejb.apache.org<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">embedding-openejb.html for details on how to
-embed openejb in your application and IDE. See [Application discovery via the classpath](openejb<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">30:application-discovery-via-the-classpath.html)
+http://openejb.apache.org/embedding-openejb.html for details on how to
+embed openejb in your application and IDE. See <a href="openejbx30:application-discovery-via-the-classpath.html">Application discovery via the classpath</a>
for various ways to have your applications discovered. </p>
-<h3>During embedded testing, how can I e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ternalize all my DataSource</h3>
+<h3>During embedded testing, how can I externalize all my DataSource</h3>
<p>configuration? </p>
-<p>Create an openejb.<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ml file in any directory that gets added to your test
+<p>Create an openejb.xml file in any directory that gets added to your test
classpath. For maven, something that winds up directly under
-"target<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">classes<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">" or "target<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">test-classes<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">" will work just fine. Then in
+"target/classes/" or "target/test-classes/" will work just fine. Then in
your test case do this:</p>
-<pre><code> protected void setUp() throws E<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ception {
+<pre><code> protected void setUp() throws Exception {
Properties properties = new Properties();
- properties.setProperty(Conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.INITIAL_CONTEXT_FACTORY,
+ properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,
</code></pre>
-<p>"org.apache.openejb.client.LocalInitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tFactory");</p>
+<p>"org.apache.openejb.client.LocalInitialContextFactory");</p>
<pre><code> URL config =
</code></pre>
-<p>this.getClass().getClassLoader().getResource("openejb.<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ml");
+<p>this.getClass().getClassLoader().getResource("openejb.xml");
properties.setProperty("openejb.configuration",
-config.toE<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ternalForm());</p>
+config.toExternalForm());</p>
-<pre><code> initialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t = new InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t(properties);
+<pre><code> initialContext = new InitialContext(properties);
}
</code></pre>
-<p>The file itself doesn't have to be called "openejb.<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ml", you could have a
+<p>The file itself doesn't have to be called "openejb.xml", you could have a
few different files like that for different testing scenarios each with a
name that describes the basic setup.</p>
-<p><a name="FAQ-Container-ManagedPersistence"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="FAQ-Container-ManagedPersistence"></a></p>
<h2>Container-Managed Persistence</h2>
-<p><a name="FAQ-WhatenginedoesOpenEJBuseforCMP?"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="FAQ-WhatenginedoesOpenEJBuseforCMP?"></a></p>
<h3>What engine does OpenEJB use for CMP?</h3>
<p>The CMP engine is written as a layer over JPA with OpenJPA doing the
persistence work.</p>
-<p><a name="FAQ-WhatistheformatfortheCMPmappingfiles?"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="FAQ-WhatistheformatfortheCMPmappingfiles?"></a></p>
<h3>What is the format for the CMP mapping files?</h3>
Modified: websites/staging/openejb/trunk/content/functional-testing-with-openejb,-jetty-and-selenium.html
==============================================================================
--- websites/staging/openejb/trunk/content/functional-testing-with-openejb,-jetty-and-selenium.html (original)
+++ websites/staging/openejb/trunk/content/functional-testing-with-openejb,-jetty-and-selenium.html Tue Jul 12 18:06:32 2011
@@ -155,16 +155,16 @@
<p>Obviously, OpenEJB is great for unit testing EJBs, but I wondered whether I
might also be able to use this embedded functionality to functionally test
my application. You can use tools like Selenium, or HtmlUnit to run
-functional tests as if the user were sat at their browser typing te<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t, and
+functional tests as if the user were sat at their browser typing text, and
clicking links and buttons. This however means you have to have your app
running on your app server, and you need to have consistent test data -
otherwise a test might pass on one developers machine, but fail on another.
Here's one approach that you could take to completely deploy your webapp
within a test, and functionally test it with a tool like Selenium. There's
-also some sample code demonstrating this, available [here](http:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">people.apache.org<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">~jgallimore<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">PersonApp.zip)
+also some sample code demonstrating this, available <a href="http://people.apache.org/~jgallimore/PersonApp.zip">here</a>
.</p>
-<p><a name="FunctionaltestingwithOpenEJB,JettyandSelenium-Creatinganembeddedserver"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="FunctionaltestingwithOpenEJB,JettyandSelenium-Creatinganembeddedserver"></a></p>
<h3>Creating an embedded server</h3>
@@ -177,62 +177,62 @@ configure them to see the EJB and WAR mo
private EmbeddedServer() {
try {
- <IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"> initialize OpenEJB & add some test data
+ // initialize OpenEJB & add some test data
Properties properties = new Properties();
- properties.put(Conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.INITIAL_CONTEXT_FACTORY,
+ properties.put(Context.INITIAL_CONTEXT_FACTORY,
</code></pre>
-<p>"org.apache.openejb.client.LocalInitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tFactory");
- InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t ic = new InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t(properties);
+<p>"org.apache.openejb.client.LocalInitialContextFactory");
+ InitialContext ic = new InitialContext(properties);
PeopleFacade facade = (PeopleFacade)
ic.lookup("PeopleFacadeEJBRemote");
- new TestFi<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ture(facade).addTestData();</p>
+ new TestFixture(facade).addTestData();</p>
-<pre><code> <IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"> setup web app
- WebAppConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t = new WebAppConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t();
- conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.setWar(computeWarPath());
- InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t initialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t = setupJndi(conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t);
+<pre><code> // setup web app
+ WebAppContext context = new WebAppContext();
+ context.setWar(computeWarPath());
+ InitialContext initialContext = setupJndi(context);
- <IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"> start the server
- conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.setServletHandler(new
+ // start the server
+ context.setServletHandler(new
</code></pre>
-<p>EmbeddedServerServletHandler(initialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t));
- conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.setConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tPath("<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">");
+<p>EmbeddedServerServletHandler(initialContext));
+ context.setContextPath("/");
server = new Server(9091);
- server.addHandler(conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t);</p>
+ server.addHandler(context);</p>
<pre><code> server.start();
- } catch (E<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ception e) {
+ } catch (Exception e) {
e.printStackTrace();
}
}
- private InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t setupJndi(WebAppConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t) throws
+ private InitialContext setupJndi(WebAppContext context) throws
</code></pre>
-<p>NamingE<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ception {
- <IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"> setup local JNDI
- InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t initialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t = new InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t();
- WebApp webApp = getWebApp(conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t);
+<p>NamingException {
+ // setup local JNDI
+ InitialContext initialContext = new InitialContext();
+ WebApp webApp = getWebApp(context);
Collection<EjbRef> refs = webApp.getEjbRef();
for (EjbRef ref : refs) {
String ejbLink = ref.getEjbLink();</p>
-<pre><code> <IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"> get enterprise bean info
+<pre><code> // get enterprise bean info
EnterpriseBeanInfo beanInfo = new
</code></pre>
<p>EJBHelper().getEJBInfo(ejbLink);
if (beanInfo.jndiNames != null && beanInfo.jndiNames.size() >
0) {
- String jndiName = "java:openejb<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">ejb<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">" +
+ String jndiName = "java:openejb/ejb/" +
beanInfo.jndiNames.get(0);
- initialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.bind("java:comp<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">env<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">" + ref.getEjbRefName(),
+ initialContext.bind("java:comp/env/" + ref.getEjbRefName(),
new LinkRef(jndiName));
}
}
- return initialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t;
+ return initialContext;
}</p>
<pre><code> private String computeWarPath() {
@@ -242,11 +242,11 @@ new LinkRef(jndiName));
String[]
</code></pre>
-<p>pathParts = currentPath.split("(\\|<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">)+");</p>
+<p>pathParts = currentPath.split("(\\|/)+");</p>
-<pre><code> int webPart = Arrays.asList(pathParts).inde<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">Of("PersonWEB");
+<pre><code> int webPart = Arrays.asList(pathParts).indexOf("PersonWEB");
if (webPart == -1) {
- warPath = "PersonWEB<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">src<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">main<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">webapp";
+ warPath = "PersonWEB/src/main/webapp";
} else {
StringBuffer buffer = new StringBuffer();
@@ -258,7 +258,7 @@ new LinkRef(jndiName));
buffer.append(File.separator);
}</p>
-<pre><code> buffer.append("PersonWEB<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">src<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">main<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">webapp");
+<pre><code> buffer.append("PersonWEB/src/main/webapp");
warPath = buffer.toString();
}
return warPath;
@@ -278,21 +278,21 @@ new LinkRef(jndiName));
<p>args) {
try {
EmbeddedServer.getInstance().getServer().join();
- } catch (E<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ception e) {
+ } catch (Exception e) {
e.printStackTrace();
}
}</p>
-<pre><code> private WebApp getWebApp(WebAppConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t) {
+<pre><code> private WebApp getWebApp(WebAppContext context) {
WebApp webApp = null;
try {
FileInputStream is = new FileInputStream(new
</code></pre>
-<p>File(conte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.getWar() + "<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">WEB-INF<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">web.<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ml").getAbsolutePath());
- webApp = (WebApp) Ja<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">bJavaee.unmarshal(WebApp.class, is);
- } catch (E<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ception e) {
+<p>File(context.getWar() + "/WEB-INF/web.xml").getAbsolutePath());
+ webApp = (WebApp) JaxbJavaee.unmarshal(WebApp.class, is);
+ } catch (Exception e) {
e.printStackTrace();
}
return webApp;
@@ -301,13 +301,13 @@ new LinkRef(jndiName));
<p>This class sets up an embedded instance of Jetty, running on port 9091.
You'll notice the setupJndi() method. This looks through the ejb-ref
-entries in web.<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ml (which we deserialize using the openejb-jee library),
+entries in web.xml (which we deserialize using the openejb-jee library),
and adds relevant LinkRefs to the JNDI tree, so you can lookup beans using
-the java:comp<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">env<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">bean format. I've added a main() method here for
+the java:comp/env/bean format. I've added a main() method here for
convenience, so you can run this straight from an IDE, and record tests
-using tools like the Selenium Firefo<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0"> plugin.</p>
+using tools like the Selenium Firefox plugin.</p>
-<p><a name="FunctionaltestingwithOpenEJB,JettyandSelenium-Supporting@EJBDependencyinjection"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="FunctionaltestingwithOpenEJB,JettyandSelenium-Supporting@EJBDependencyinjection"></a></p>
<h3>Supporting @EJB Dependency injection</h3>
@@ -315,15 +315,15 @@ using tools like the Selenium Firefo<IMG
this is to perform dependency injection. The custom ServletHandler looks
like this:</p>
-<pre><code>public class EmbeddedServerServletHandler e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tends ServletHandler {
- private InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t initialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t;
+<pre><code>public class EmbeddedServerServletHandler extends ServletHandler {
+ private InitialContext initialContext;
- public EmbeddedServerServletHandler(InitialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t initialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t) {
- this.initialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t = initialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t;
+ public EmbeddedServerServletHandler(InitialContext initialContext) {
+ this.initialContext = initialContext;
}
- public Servlet customizeServlet(Servlet servlet) throws E<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ception {
- Class<? e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tends Servlet> servletClass = servlet.getClass();
+ public Servlet customizeServlet(Servlet servlet) throws Exception {
+ Class<? extends Servlet> servletClass = servlet.getClass();
Field[]
</code></pre>
@@ -337,18 +337,18 @@ like this:</p>
<pre><code> for (Annotation annotation : annotations) {
if (EJB.class.equals(annotation.annotationType())) {
- <IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"> inject into this field
+ // inject into this field
Class<?> fieldType = declaredField.getType();
EnterpriseBeanInfo beanInfo = getBeanFor(fieldType);
if (beanInfo == null) {
continue;
}
- String jndiName = "java:openejb<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">ejb<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">" +
+ String jndiName = "java:openejb/ejb/" +
</code></pre>
<p>beanInfo.jndiNames.get(0);
- Object o = initialConte<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t.lookup(jndiName);</p>
+ Object o = initialContext.lookup(jndiName);</p>
<pre><code> declaredField.setAccessible(true);
declaredField.set(servlet, o);
@@ -368,27 +368,27 @@ like this:</p>
<p>This looks up deployed beans that match the field type, and uses reflection
to set the field.</p>
-<p><a name="FunctionaltestingwithOpenEJB,JettyandSelenium-WritingaFunctionaltest"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="FunctionaltestingwithOpenEJB,JettyandSelenium-WritingaFunctionaltest"></a></p>
<h3>Writing a Functional test</h3>
<p>We can now write a functional test. I use a base abstract class to make
sure the Embedded server is running, and start Selenium:</p>
-<pre><code>public abstract class FunctionalTestCase e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tends TestCase {
+<pre><code>public abstract class FunctionalTestCase extends TestCase {
protected DefaultSelenium selenium;
- protected void setUp() throws E<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ception {
+ protected void setUp() throws Exception {
super.setUp();
EmbeddedServer.getInstance();
- selenium = new DefaultSelenium("localhost", 4444, "*ie<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">plore",
+ selenium = new DefaultSelenium("localhost", 4444, "*iexplore",
</code></pre>
-<p>"http:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">localhost:9091<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">");
+<p>"http://localhost:9091/");
selenium.start();
}</p>
-<pre><code> protected void tearDown() throws E<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ception {
+<pre><code> protected void tearDown() throws Exception {
selenium.stop();
}
}
@@ -396,12 +396,12 @@ sure the Embedded server is running, and
<p>and I can then I write a test like this:</p>
-<pre><code>public class AddPersonTest e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tends FunctionalTestCase {
- public void testShouldAddAPerson() throws E<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ception {
- selenium.open("<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">People");
+<pre><code>public class AddPersonTest extends FunctionalTestCase {
+ public void testShouldAddAPerson() throws Exception {
+ selenium.open("/People");
selenium.type("firstname", "Jonathan");
selenium.type("lastname", "Gallimore");
- selenium.click("<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">input[@name='add' and @value='Add']
+ selenium.click("//input[@name='add' and @value='Add']
</code></pre>
<p>");
@@ -409,20 +409,20 @@ sure the Embedded server is running, and
selenium.type("filter", "gallimore");
selenium.click("submit");
selenium.waitForPageToLoad("30000");
- assertEquals(1, selenium.getXpathCount("<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">div[@id='people']
-<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">ul<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">li").intValue());
- assertEquals("Jonathan Gallimore", selenium.getTe<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t("<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">div[@id='people']
-<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">ul<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">li[1]"));</p>
+ assertEquals(1, selenium.getXpathCount("//div[@id='people']
+/ul/li").intValue());
+ assertEquals("Jonathan Gallimore", selenium.getText("//div[@id='people']
+/ul/li[1]"));</p>
<pre><code> }
}
</code></pre>
-<p><a name="FunctionaltestingwithOpenEJB,JettyandSelenium-Samplecode"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+<p><a name="FunctionaltestingwithOpenEJB,JettyandSelenium-Samplecode"></a></p>
<h3>Sample code</h3>
-<p>I've made a sample project which demonstrates this, source is available [here](http:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">people.apache.org<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">~jgallimore<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">PersonApp.zip)
+<p>I've made a sample project which demonstrates this, source is available <a href="http://people.apache.org/~jgallimore/PersonApp.zip">here</a>
. You'll need Maven to build it, and you can build it and run the tests by
running 'mvn clean install'. If want to run the tests from your IDE, you'll
need to have a Selenium server running, which you can do by running 'mvn
Modified: websites/staging/openejb/trunk/content/generating-ejb-3-annotations.html
==============================================================================
--- websites/staging/openejb/trunk/content/generating-ejb-3-annotations.html (original)
+++ websites/staging/openejb/trunk/content/generating-ejb-3-annotations.html Tue Jul 12 18:06:32 2011
@@ -152,12 +152,12 @@
<P>
<!-- $BODY -->
<DIV id="PageContent">
- <p><a name="GeneratingEJB3annotations-GeneratingEJB3annotations"><<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">a></p>
+ <p><a name="GeneratingEJB3annotations-GeneratingEJB3annotations"></a></p>
<h1>Generating EJB 3 annotations</h1>
<p>The OpenEJB Eclipse plugin is able to provide some assistance in helping
-you migrate EJB 2.<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0"> projects to EJB 3.0, by analyzing your ejb-jar.<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ml
+you migrate EJB 2.x projects to EJB 3.0, by analyzing your ejb-jar.xml
file, and adding EJB annotations to your source code. This page will show
you how to use this functionality.</p>
@@ -169,44 +169,44 @@ afterwards)</p>
<pre><code> <dependencies>
...
<dependency>
- <groupId>org.apache.openejb<<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">groupId>
- <artifactId>javaee-api<<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">artifactId>
- <version>5.0-1<<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">version>
- <scope>provided<<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">scope>
- <<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">dependency>
- <<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">dependencies>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>javaee-api</artifactId>
+ <version>5.0-1</version>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
</code></pre>
<p>Alternatively, import the API jars into your project, and add them to your
build path.</p>
-<p>Ne<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t, click the 'OpenEJB' menu on the menubar, and select 'Generate
+<p>Next, click the 'OpenEJB' menu on the menubar, and select 'Generate
Annotations'.</p>
-<p>!http:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">www.jrg.me.uk<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">openejb<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">annotations_step_1.jpg!</p>
+<p>!http://www.jrg.me.uk/openejb/annotations_step_1.jpg!</p>
<p>Select the project you would like to work with, if it isn't already
-selected. Click 'Ne<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t'.</p>
+selected. Click 'Next'.</p>
-<p>!http:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">www.jrg.me.uk<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">openejb<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">annotations_step_2.jpg!</p>
+<p>!http://www.jrg.me.uk/openejb/annotations_step_2.jpg!</p>
-<p>Select your ejb-jar.<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ml and (optionally) your openejb-jar.<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">ml files. Select
-or deselect the other options as appropriate, and select 'Ne<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">t'.</p>
+<p>Select your ejb-jar.xml and (optionally) your openejb-jar.xml files. Select
+or deselect the other options as appropriate, and select 'Next'.</p>
<p>Options:</p>
<pre><code>* Alter SessionBean interfaces - This option makes your session beans
</code></pre>
-<p>implement your remote <IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"> local interfaces as opposed to
-java<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">.ejb.SessionBean, and stops your remote <IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"> local interfaces e<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">tending
-java<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0">.ejb.EJBObject.
+<p>implement your remote / local interfaces as opposed to
+javax.ejb.SessionBean, and stops your remote / local interfaces extending
+javax.ejb.EJBObject.
* Add @Remote and @RemoteHome annotations - This adds @Remote and
@RemoteHome annotations appropriately
* Convert entity beans to POJOs - This options converts abstract CMP
classes to POJOs generating simple getters and setters.</p>
-<p>!http:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">www.jrg.me.uk<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">openejb<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">annotations_step_3.jpg!</p>
+<p>!http://www.jrg.me.uk/openejb/annotations_step_3.jpg!</p>
<p>Review the changes that the plugin will make to your source code. Uncheck
any changes you don't want to apply, and click 'Finish'.</p>
Modified: websites/staging/openejb/trunk/content/geronimo.html
==============================================================================
--- websites/staging/openejb/trunk/content/geronimo.html (original)
+++ websites/staging/openejb/trunk/content/geronimo.html Tue Jul 12 18:06:32 2011
@@ -152,13 +152,13 @@
<P>
<!-- $BODY -->
<DIV id="PageContent">
- <p>OpenEJB is the EJB Container implementation for [Apache Geronimo](http:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">geronimo.apache.org)
+ <p>OpenEJB is the EJB Container implementation for <a href="http://geronimo.apache.org">Apache Geronimo</a>
. That integration is quite a bit different than what OpenEJB users are
familiar with. The best source of documentation on Geronimo and it's usage
of OpenEJB is here: </p>
<ul>
-<li>[http:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">geronimo.apache.org<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">documentation.html](http:<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"><IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0">geronimo.apache.org<IMG class="emoticon" src="https://cwiki.apache.org/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle
" alt="" border="0">documentation.html)</li>
+<li><a href="http://geronimo.apache.org/documentation.html">http://geronimo.apache.org/documentation.html</a></li>
</ul>
</DIV>