The purpose of this document is to document how to develop and maintain the Oxalis code base
The concept of an "Oxalis home area", was introduced in version 2.0 in order to provide the users of Oxalis with these benefits:
- Maintaining your configuration when installing new releases.
- Several versions of Oxalis may be installed concurrently
The Oxalis home directory is located in the following order:
- Using the environment variable
OXALIS_HOME
- The directory
.oxalis
, located relative to the users home directory. The users home directory is determined by inspecting the Java system propertyuser.home
There is a sample configuration file located in oxalis-commons/src/main/resources/oxalis-global.properties
.
You should copy this file to your OXALIS_HOME
directory and modify it to your likings.
Testing is performed using the TestNG framework.
In order to ensure that Oxalis will compile on machines which have not been prepared with JDBC drivers, configuration files
etc., the various tests involving databases, internet connections etc. (integration tests), have been marked as part of the
test group integration
:
@Test(groups = {"integration"})
Furthermore, all such integration tests are excluded from the default maven test execution, which are executed using the surefire plugin:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>integration</excludedGroups> <!-- Excludes integration tests -->
</configuration>
</plugin>
As a consequence, only the fast running unit tests will run when Oxalis is built using this command:
mvn clean install
In order to run the integration tests from the command line:
mvn -P it-test clean install
The integration tests expects a completely installed system, with OXALIS_HOME
directory containing oxalis-global.properties
, which
references your keystore. In addition the MySQL database must be installed with the schema etc.
In the pom.xml
files, this is achieved by including the following declaration in a profile named it-test:
<profile>
<id>it-test</id>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<configuration>
<container>
<containerId>tomcat7x</containerId>
.....
Have a look at oxalis-integration-test/pom.xml
to see further details.
As of November 2013, we have started moving these functional tests requiring a running server, to the Maven module oxalis-integration-test
.
All tests are executed using the failsafe Maven plugin,
which causes tests named with a suffix of IT
to be executed in the
integration-test build phase. Furthermore the web container is started and the artifacts are deployed using the Maven Cargo plugin.
See Maven Cargo2 plugin for further reference.
The basic steps of this module are:
- Builds the module and runs any applicable unit tests.
- During the "pre-integration-test" phase; starts up the web container with the use of the "cargo" plugin and deploys our ".war" artifacts.
- The "failsafe" plugin executes all tests with a suffix of
IT
during the "integration-test" phase. - Shuts down the web container during the "post-integration-test" phase.
- Verifies the results during the "verify" phase.
Your OXALIS_HOME
directory must exist and should contain a complete configuration, which is specified in oxalis-global.properties
.
Please consult the installation instructions for further details. Looking at the oxalis-global.properties
should give you
some clues as to what you need to do :-)
Here is another trick, which should give you some information as to your build environment:
mvn help:system
All operations related to persistence of statistics are performed by an implementation of RawStatisticsRepository
. There is only
a single implementation supplied with Oxalis, namely RawStatisticsRepositoryJdbcImpl
. If you wish to use a different type of repository,
you should roll your own implementation and make it available using the META-INF/services idiom
However; since this class is used in standalone and JEE environments, it must be initialized with a javax.sql.DataSource
,
which may be obtained either via JNDI or manual creation. Oxalis comes with two DataSource implementations:
oxalis-jdbc-dbcp
- will instantiate a JDBC-driver according to the properties inOXALIS_HOME/oxalis-global.properties
and wrap that DataSource with Apache DBCP.oxalis-jdbc-jndi
- which will simply attempt to obtain a datasource fromjava:/comp/env/+<whatever_you_defined_in_oxalis-global.properties>
oxalis-sql
contains the classes which simply expect a DataSource to be available. In addition the SQL-scripts are located here.
In order to make this totally transparent to the calling application, the following pattern should be used:
// Locates an implementation of RawStatisticsRepositoryFactory using META-INF/services pattern
RawStatisticsRepostiory repository = RawStatisticsRepostioryFactoryProvider.getInstance().getInstance();
I.e. when packaing your application, assuming you are using the supplied SQL based repository,
simply choose either oxalis-jdbc-dbcp
or oxalis-jdbc-jndi
and everything
should work fine. As of version 2.0 we no longer use JNDI at all. The oxalis-jdbc-jndi
component is simply included for those requiring an implementation
which will obtain a DataSource from JNDI.
In order to handle multiple protocols, the API for sending documents have changed. This is how you do it:
// Creates and wires up an Oxalis outbound module (Guice)
OxalisOutboundModule oxalisOutboundModule = new OxalisOutboundModule();
// Get the transmission request builder
TransmissionRequestBuilder builder = oxalisOutboundModule.getTransmissionRequestBuilder();
// construct the transmission request
builder.payLoad(new FileInputStream("/some/file/to/send/sbdh.xml"));
// Builds our transmission request
TransmissionRequest transmissionRequest = builder.build();
// Gets a transmitter, which will be used to execute our transmission request
Transmitter transmitter = oxalisOutboundModule.getTransmitter();
// Transmits our transmission request
TransmissionResponse transmissionResponse = transmitter.transmit(transmissionRequest);