Skip to content

Commit 8d23147

Browse files
authored
Merge pull request #460 from david-gibbs-ig/fix-orchestra-with-updated-project-structure
Fix orchestra with updated project structure
2 parents e612ee6 + b9d0557 commit 8d23147

File tree

257 files changed

+22626
-3153
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

257 files changed

+22626
-3153
lines changed

.github/workflows/codeql-analysis.yml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ jobs:
2626
analyze:
2727
name: Analyze
2828
runs-on: ubuntu-latest
29+
env:
30+
MAVEN_OPTS: "-Xms3g -Xmx6g -Djdk.xml.xpathExprGrpLimit=500 -Djdk.xml.xpathExprOpLimit=500"
2931

3032
strategy:
3133
fail-fast: false
@@ -51,19 +53,18 @@ jobs:
5153

5254
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
5355
# If this step fails, then you should remove it and run the build manually (see below)
54-
- name: Autobuild
55-
uses: github/codeql-action/autobuild@v2
56+
#- name: Autobuild
57+
# env:
58+
# uses: github/codeql-action/autobuild@v2
5659

5760
# ℹ️ Command-line programs to run using the OS shell.
5861
# 📚 https://git.io/JvXDl
5962

6063
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
6164
# and modify them (or add more) to build your code if your project
6265
# uses a compiled language
63-
64-
#- run: |
65-
# make bootstrap
66-
# make release
66+
- run: |
67+
mvn clean package -B -V -e -Pminimal-fix-latest -Dmaven.javadoc.skip=true -Dfindbugs.skip -Dcheckstyle.skip -Dpmd.skip=true -Dspotbugs.skip -Denforcer.skip -DskipTests -Dmaven.test.skip.exec -Dlicense.skip=true -Drat.skip=true -Dspotless.check.skip=true -D"java.util.logging.config.file"="logging.properties" -D"http.keepAlive"="false" -D"maven.wagon.http.pool"="false" -D"maven.wagon.httpconnectionManager.ttlSeconds"="120"
6768
6869
- name: Perform CodeQL Analysis
6970
uses: github/codeql-action/analyze@v2

.github/workflows/maven.yml

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
runs-on: ${{ matrix.os }}
1414
strategy:
1515
matrix:
16-
os: [ubuntu-latest, macOS-latest, windows-latest]
16+
os: [ubuntu-latest, macOS-latest]
1717
java: [8, 11, 17]
1818
fail-fast: false
1919
max-parallel: 4
@@ -26,7 +26,36 @@ jobs:
2626
with:
2727
distribution: 'temurin'
2828
java-version: ${{ matrix.java }}
29+
cache: 'maven'
2930
- name: Test with Maven
3031
env:
31-
MAVEN_OPTS: "-Xms3g -Xmx3g"
32-
run: mvn test -B -V -D"java.util.logging.config.file"="logging.properties" -D"http.keepAlive"="false" -D"maven.wagon.http.pool"="false" -D"maven.wagon.httpconnectionManager.ttlSeconds"="120"
32+
MAVEN_OPTS: "-Xms3g -Xmx5g -Djdk.xml.xpathExprGrpLimit=500 -Djdk.xml.xpathExprOpLimit=500"
33+
run: mvn install -B -V -Pminimal-fix-latest -D"java.util.logging.config.file"="logging.properties" -D"http.keepAlive"="false" -D"maven.wagon.http.pool"="false" -D"maven.wagon.httpconnectionManager.ttlSeconds"="120"
34+
35+
test-windows:
36+
runs-on: ${{ matrix.os }}
37+
strategy:
38+
matrix:
39+
os: [windows-latest]
40+
java: [8, 11, 17]
41+
fail-fast: false
42+
max-parallel: 3
43+
name: Test JDK ${{ matrix.java }}, ${{ matrix.os }}
44+
45+
steps:
46+
- uses: actions/checkout@v3
47+
- name: Configure pagefile
48+
uses: al-cheb/[email protected]
49+
with:
50+
minimum-size: 8GB
51+
maximum-size: 16GB
52+
- name: Set up Windows JDK
53+
uses: actions/setup-java@v3
54+
with:
55+
distribution: 'temurin'
56+
java-version: ${{ matrix.java }}
57+
cache: 'maven'
58+
- name: Test with Maven on Windows
59+
env:
60+
MAVEN_OPTS: "-Xms3g -Xmx5g -Djdk.xml.xpathExprGrpLimit=500 -Djdk.xml.xpathExprOpLimit=500"
61+
run: mvn install -B -V -D"maven.javadoc.skip"="true" -P"skipBundlePlugin,minimal-fix-latest" -D"java.util.logging.config.file"="logging.properties" -D"http.keepAlive"="false" -D"maven.wagon.http.pool"="false" -D"maven.wagon.httpconnectionManager.ttlSeconds"="120"

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,6 @@ target/
1111
*.iws
1212
# ignore NetBeans configuration
1313
nb-configuration.xml
14+
*.bak
15+
.mvn/
16+
mvn*

README.md

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,17 @@ Pull requests are always welcome! Best is if you added a unit test to show that
4242

4343
Fastest: clone the repo and issue the following command.
4444
```
45-
$ mvn clean package -Dmaven.javadoc.skip=true -DskipTests -PskipBundlePlugin
45+
$ mvn clean package -Dmaven.javadoc.skip=true -DskipTests -PskipBundlePlugin,minimal-fix-latest -Djdk.xml.xpathExprGrpLimit=500 -Djdk.xml.xpathExprOpLimit=500
4646
```
4747

4848
Slower: if you only want to skip the acceptance test suite:
4949
```
50-
$ mvn clean package -Dmaven.javadoc.skip=true -DskipAT=true -PskipBundlePlugin
50+
$ mvn clean package -Dmaven.javadoc.skip=true -DskipAT=true -PskipBundlePlugin,minimal-fix-latest -Djdk.xml.xpathExprGrpLimit=500 -Djdk.xml.xpathExprOpLimit=500
5151
```
5252

5353
Slow: if you want to run all tests:
5454
```
55-
$ mvn clean package -Dmaven.javadoc.skip=true -PskipBundlePlugin
55+
$ mvn clean package -Dmaven.javadoc.skip=true -PskipBundlePlugin,minimal-fix-latest -Djdk.xml.xpathExprGrpLimit=500 -Djdk.xml.xpathExprOpLimit=500
5656
```
5757
NB: If you want to use the resulting JARs in an OSGi environment you'll have to omit the `-PskipBundlePlugin` option.
5858

@@ -62,7 +62,7 @@ When the project is first created, it will not have the generated message classe
6262

6363
If the IDE reports some errors after the compilation with `mvn clean package`, try to use `mvn clean install`, like:
6464
```
65-
$ mvn clean install -Dmaven.javadoc.skip=true -DskipTests -PskipBundlePlugin
65+
$ mvn clean install -Dmaven.javadoc.skip=true -DskipTests -PskipBundlePlugin,minimal-fix-latest -Djdk.xml.xpathExprGrpLimit=500 -Djdk.xml.xpathExprOpLimit=500
6666
```
6767

6868
## configuration options
@@ -283,3 +283,40 @@ void sendOrderCancelRequest() throws SessionNotFound {
283283
Session.sendToTarget(message, "TW", "TARGET");
284284
}
285285
```
286+
287+
## QuickFIX/J Runtime
288+
289+
This project builds artefacts for the standard published FIX specification versions from FIX 4.0 to FIX Latest.
290+
291+
* ```quickfixj-messages-fix40```
292+
* ```quickfixj-messages-fix41```
293+
* ```quickfixj-messages-fix42```
294+
* ```quickfixj-messages-fix43```
295+
* ```quickfixj-messages-fix44```
296+
* ```quickfixj-messages-fix50```
297+
* ```quickfixj-messages-fix50sp1```
298+
* ```quickfixj-messages-fix50sp2```
299+
* ```quickfixj-messages-fixlatest```
300+
* ```quickfixj-messages-fixt11```
301+
* ```quickfixj-messages-all``` - includes all of the above
302+
303+
These artefacts are <u>**test**</u> dependencies of ```quickfixj-core```. They are **not** specified as _runtime_ dependencies, this makes it easier to customise QuickFIX/J deployments.
304+
305+
If you have no need to customise a FIX integration then you can use the ```org.quickfixj``` artefacts built by this project. Simply include them as dependencies of your application.
306+
307+
Artefacts for unused FIX specification versions can be omitted from your runtime.
308+
Many integrations will not require ```quickfixj-messages-all``` and need only depend on artefacts for a subset of the FIX standard versions. Please note that FIX Protocol versions 5.0 and later depend on ```quickfixj-messages-fixt11``` which provides the implementation for the FIXT1.1 transport messages.
309+
310+
Many integrations require specialisation of the FIX Messages, Components and/or Fields. This is accomplished by building and using custom artefacts. Please see [Customising QuickFIX/J](./customising-quickfixj.md) for more detail.
311+
312+
### Application Dependencies for QuickFIX/J Messages Build
313+
314+
![image info](./src/main/puml/dependencies_fixt11_fixlatest.png)
315+
316+
![image info](./src/main/puml/dependencies_qfj_all.png)
317+
318+
### Application Dependencies for Custom Messages Build
319+
320+
![image info](./src/main/puml/custom_dependencies.png)
321+
322+
![image info](./src/main/puml/custom_dependencies_fixt11_fixlatest.png)

customising-quickfixj.md

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
2+
# Customising QuickFIX/J
3+
4+
The core QuickFIX/J module is agnostic to FIX Protocol Versions. At runtime a QuickFIX/J dictionary with supporting implementation packages is required to use type-safe classes.
5+
6+
The specification for a FIX integration is called a "Rules of Engagement". The Rules of Engagement can be customised with the mutual agreement of the respective counter-parties.
7+
8+
The message, component and field implementations can be provided by a specialised build, along with the corresponding QuickFIX/J dictionary for the custom Rules of Engagement.
9+
10+
The standard distribution of ```quickfixj-core``` can be used with custom artefacts. You need only build artefacts for versions of the Protocol that you use. These can be maintained independently from the QuickFIX/J project, while depending on the QuickFIX/J for the core functionality and tools.
11+
12+
To build custom artefacts it's helpful to understand how QuickFIX/J builds the Field, Component and Message classes from the QuickFIX/J dictionaries and from [FIX Orchestra](https://www.fixtrading.org/standards/fix-orchestra/).
13+
14+
The QuickFIX/J reference implementations for FIX versions FIX4.0 to FIX5.0sp2 and for FIXT1.1 are generated from the QuickFIX dictionaries for the specific version. The dictionaries are located in the ```src/main/resources``` directory of the respective modules of the ```quickfixj-messages``` module.
15+
Maintaining the FIX4.0 to FIX5.0sp2 builds intentionally provides consistency with the prior QuickFIX/J 2 release in order to ease migration to QuickFIX/J 3.
16+
17+
The most recent standard is defined as [FIX Latest](https://www.fixtrading.org/online-specification/). The QuickFIX/J reference implementation for FIX Latest is generated from a [FIX Orchestra](https://www.fixtrading.org/standards/fix-orchestra/) repository file.
18+
An implementation or customisation of the FIX Standars derived from the FIX Orchestra repository is known as an "_orchestration_".
19+
The standard FIX Orchestra repository requires some modification to work well with QuickFIX/J.
20+
This is done by the ```quickfixj-orchestration``` module.
21+
The ```quickfixj-orchestration``` module publishes a modified Orchestra artefact which can then be the basis of a custom FIX Latest build using QuickFIX/J .
22+
23+
The complete reference FIX Latest specification results in a very large distribution.
24+
To use FIX Latest, customisation of the [FIX Orchestra](https://www.fixtrading.org/standards/fix-orchestra/) repository is advisable.
25+
Please see [QuickFIX/J Orchestration](./quickfixj-orchestration/readme.md) for details.
26+
27+
## Customisation Scenarios
28+
29+
### **Enable the use of ```BigDecimal``` for FIX Decimal Data Types**
30+
31+
This behaviour is controlled by the ```${generator.decimal}``` build property. It is "false" by default to avoid surprising side effects of incompatible data types.
32+
33+
To enable the use of ```BigDecimal``` in code generation, set the ```${generator.decimal}``` property to "true" in [quickfixj-messages](./quickfixj-messages/readme.md) and build the message artefacts.
34+
35+
```
36+
<properties>
37+
<generator.decimal>true</generator.decimal>
38+
</properties>
39+
```
40+
See [QuickFIX/J Messages](./quickfixj-messages/readme.md) for details of the build and recommendation for **how to implement custom builds.**
41+
42+
### **Incompatible Data Types**
43+
44+
Some incompatible changes have occurred in the evolution of the FIX protocol. For example see below changes to the type of **OrderQty (38)** :
45+
46+
|FIX Version|Field Name|FIX Datatype|Base Type|QuickFIX/J Datatype|
47+
|---|---|---|---|---|
48+
|4.0|OrderQty|int|int|```int```|
49+
|4.2|OrderQty|Qty|float|```Double``` or ```BigDecimal```|
50+
51+
Only one ```quickfix.Field``` class with the same name may be loaded by the Java classloader so only one version of this Field should be in the classpath. QuickFix/J also verifies the data type using the supplied QuickFIX "Dictionary".
52+
53+
Code generation using ```BigDecimal``` is incompatible at runtime with ```int``` for **OrderQty**. In this case, ```double``` is compatible with ```int``` at run time due to [widening primitive conversion](http://titanium.cs.berkeley.edu/doc/java-langspec-1.0/5.doc.html).
54+
55+
Runtime incompatibilities can be resolved by:
56+
* Amending the QuickFIX Dictionary to coerce the code generation and/or validation
57+
* Changing the ordering of code generation and/or overwrite behaviour of code generation
58+
* Omitting incompatible versions from your customised build
59+
* Building artefacts independently for the conflicting versions and ensuring they are not used them in the same runtime
60+
61+
See [QuickFIX/J Messages](./quickfixj-messages/readme.md) for details of the build and recommendation for **how to implement custom builds.**
62+
63+
### **Customising the FIX Protocol for specialised Rules of Engagement**
64+
65+
A Rules of Engagement can include customisation Messages, Components and Fields, including User Defined elements.
66+
67+
It is not necessary to maintain a fork of the entire QuickFIX/J project to provide customised QuickFIX Dictionaries and to
68+
generate type-safe libraries that are interoperable with QuickFIX/J.
69+
70+
[FIX Orchestra](https://www.fixtrading.org/standards/fix-orchestra/) is intended for customisation to produce machine-readable Rules of Engagement.
71+
72+
Consider creating a new project (or projects) to build the Messages, Components and Fields as needed for your specific Rules of Engagement.
73+
74+
Edit the QuickFIX Dictionary or FIX Orchestra Repository (Orchestration) as required and
75+
build the Messages, Components and Fields packages using the tools provided by the QuickFIX/J projects.
76+
77+
QuickFIX/J Dictionaries, FIX Orchestra Orchestrations and/or documents can also be generated.
78+
79+
See [QuickFIX/J Messages](./quickfixj-messages/readme.md) for details of the build and recommendation for **how to implement custom builds.**
80+
81+
### **Managing incompatibility with Prior Versions of QuickFIX/J**
82+
83+
From QuickFIX/J 3.0.0 the code generation for ```quickfix.Field``` prefers the FIX Orchestra Standard. This results in incompatible changes to the names of constants.
84+
85+
For example : ```SettlType.REGULAR_FX_SPOT_SETTLEMENT``` becomes ```SettlType.REGULAR```.
86+
87+
The required code changes may be trivial in most cases, but changes are elective.
88+
The following describes how to use ```quickfixj-core``` from QuickFIX/J 3 without needing to implement code changes:
89+
* build the required Message artefacts without the FIX Latest code generation. The Fields will then be generated only from legacy FIX Protocol Versions as they were prior to QuickFIX/J 3.0.0 - **or**
90+
* if you want to use Messages, Components and/or Fields from FIX Latest while preferring legacy constants,
91+
manipulate the order of code generation and/or the over-write behaviour of code behaviour to prefer earlier versions of FIX.
92+
For example, generate FIX Latest first and overwrite the generated Field classes by subsequently running code generation for an earlier version.
93+
94+
See [QuickFIX/J Messages](./quickfixj-messages/readme.md) for details of the build and recommendation for **how to implement custom builds.**

0 commit comments

Comments
 (0)