Title: AriesTrader
<a name="AriesTrader-TheAriesTraderSample"></a>
# The AriesTrader Sample


<a name="AriesTrader-Prereqs"></a>
### Prereqs 
<br>

- - -
**Note:** 

These instructions are for the 0.2-incubating release of Aries.
Instructions for older releases can be found [here](archiveinstructions.html)
. In the 0.2-incubating release the AriesTrader sample was changed such
that it is no longer required for you to install Derby independently.  The
Derby version included in the sample is fully leveraged internally in the
sample and therefore no additional Derby installation is required. 
However, there are steps required to initialize the Database from within
the sample itself (see instructions below).  
 
- - -

<a name="AriesTrader-CreatingtheOSGiplatform(equinox-test-harness)forAriesTrader"></a>
### Creating the OSGi platform (equinox-test-harness) for AriesTrader 
Download and unzip the source zip for the [latest release](aries:downloads.html)
 of Aries Samples and build the equinox-test-harness module under
ariestrader:

    cd samples-0.2-incubating/ariestrader/assemblies/equinox-test-harness
    mvn install

This procedure will pull in the binaries from the latest release and its
dependencies.

<a name="AriesTrader-AlternativebuildusingApacheAriestrunk."></a>
### Alternative build using Apache Aries trunk.
As an alternative to using the released version you can also choose to work
with the latest, unreleased code.  This will require the use of subversion
to checkout the code followed by building the entire Apache Aries project. 
Directions are provided here:  [Building Aries instructions](aries:buildingaries.html)
.


<a name="AriesTrader-StartingtheEquinoxTestHarnesstoruntheAriesTradersample"></a>
### Starting the Equinox Test Harness to run the AriesTrader sample
AriesTrader needs a test harness to run in.  For this purpose we are using
an Equinox assembly that pulls in all of the necessary dependencies.  


The first task is to start the Apache Aries modules in an OSGi framework
using the Eclipse Equinox test harness

    java -jar osgi-3.5.0.v20090520.jar -console

The OSGi console should start up, the 'ss' command should show the active
bundles but the AriesTrader application is not yet installed (with the
exception of the ariestrader derby datasource which is started with the
test harness for convenience).	

<a name="AriesTrader-InstallingAriesTraderintheEquinoxTestHarness"></a>
### Installing AriesTrader in the Equinox Test Harness
To install the AriesTrader application simply copy the eba for AriesTrader
into the target/load directory which was created when test harness
containing Aries was started.  For convenience the AriesTraders EBAs are
copied into the target directory as part of creating the OSGi Equinox test
harness. 

When using the "JDBC" only AriesTrader configuration which supports only
jdbc persistence:

    cp org.apache.aries.samples.ariestrader.jdbc-*.eba load/


When using the "All" AriesTrader configuration which supports all currently
available persistence modes:

    cp org.apache.aries.samples.ariestrader.all-*.eba load/


Now the 'ss' command should show all of the AriesTrader bundles in state
'ACTIVE'.

If you subsequently delete org.apache.aries.samples.ariestrader.jdbc-*.eba
or org.apache.aries.samples.ariestrader.all-*.eba from the target/load
directory the application will be uninstalled.


<a name="AriesTrader-AccessingandusingtheAriesTradersample"></a>
### Accessing and using the AriesTrader sample
Point your browser at [http://localhost:8080/org.apache.aries.samples.ariestrader.web/](http://localhost:8080/org.apache.aries.samples.ariestrader.web/)

Select the "Configuration" tab and the "Configure AriesTrader run-time
parameters" choice.  Then select from among the available runtime modes
(defauls to JDBC).  Be sure to click "update config" to save your
selection.

At the moment the following persistence modes are available when using the
"all" EBA:
* JDBC persistence
* JPA application managed entity manager persistence
* JPA container managed entity managers using declarative transaction
support  

By default, the sample starts with JDBC persistence.  To select another
persistence mechanism see the directions under "Accessing and using the
AriesTrader sample. 
 
After selecting the persistence mode you must create the AriesTrader
Database tables and indexs.  Select the "Configuration" tab and the
"(Re)-create AriesTrader Tables and Indexes". 

Next, you must seed the database with test content.  Once again go to the
"Configuration" tab but this time select "(Re)-populate AriesTrader
Database" from the available choices to seed the database with a default
set of users and stock quotes.	You will see a number of quotes (default is
400) and users (default is 200) created.

Select the "Trading & Portfolios" tab to use the mock trade application or
the "Primitives" tab to run some of the web primitive tests (PingJSPEL is
not currently working).  You can also run the "Test AriesTrader Scenario"
from the "Configuration" tab which will launch a new browser window and
step through a trading scenario with each reload of the page.

<a name="AriesTrader-AbouttheAriesTraderSample"></a>
### About the AriesTrader Sample

The AriesTrader sample is a modified version of the Apache Geronimo
DayTrader sample.  It has been somewhat simplified and reorganized to
support the Apache Aries programming model.  

The AriesTrader sample bundles are organized like this:

![at2](ariesTraderOverview2.png)
