Title: AriesTrader

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


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

- - -
**Note:** 

These instructions are for the 1.0.0 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-1.0.0-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

    cd samples-1.0.0-incubating/ariestrader/assemblies/equinox-test-harness/target
    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, you will need to create this directory first.  
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/ariestrader/](http://localhost:8080/ariestrader/)

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)
