Skip to content

Commit cd8bce3

Browse files
Improved error handling when processing skeleton message
NIAD-3435: Documentation improvement (#1254) * Documentation improvement * README.md improvement * README.md letter capitalization improvements * README.md letter capitalization improvements * REDACTIONS.md enhancements * getting-started-with-windows.md docs update * GPC Consumer version adjustment Improved error handling when processing skeleton message NIAD-3435: Documentation improvement (#1254) * Documentation improvement * README.md improvement * README.md letter capitalization improvements * README.md letter capitalization improvements * REDACTIONS.md enhancements * getting-started-with-windows.md docs update * GPC Consumer version adjustment
1 parent d783d06 commit cd8bce3

7 files changed

Lines changed: 183 additions & 164 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
1212

1313
### Added
1414
* Added support for mapping different EhrSupplyType (e.g. NHS prescription, OTC sale) into the Medication Statement Prescribing Agency extension
15-
* Added fallback for Condition.asserter to use the EHRComposition / author / agent field when EHRComposition / participant2 is absent
15+
* Added fallback for Condition.asserter to use the EHRComposition / author / agent field when EHRComposition / participant2 is absent.
16+
*
17+
### Fixed
18+
* Improved error handling in SkeletonProcessingService to throw a meaningful IllegalArgumentException
19+
when a payload node cannot be matched to a skeleton document ID, replacing an uninformative NullPointerException.
1620

1721
## [3.1.3] - 2025-09-19
1822

README.md

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,27 @@ National Integration Adaptor - [GP2GP Requesting Adaptor](https://digital.nhs.uk
33

44
Incumbent providers (e.g. TPP, EMIS, SystemOne) would have to make changes to their GP Connect interface implementations
55
in order to deploy GP2GP Adaptor in their infrastructure to support the losing practice scenario - i.e. whereby a
6-
different practice transfers patient data from the incumbent. In particular, they would need to implement 1.6.0 version
6+
different practice transfers patient data from the incumbent. In particular, they would need to implement the 1.6.2 version
77
that is required by the GPC Consumer and GP2GP adaptors.
88

9-
This business case is not always easy to be accepted by the incumbent providers, as they would have to invest time to
9+
This business case is not always easy for the incumbent providers to accept, as they would have to invest time to
1010
make those changes.
1111

12-
The motivation for the GP2GP FHIR Request Adaptor is to remove the dependency from incumbent providers to do that work.
12+
The motivation for the GP2GP FHIR Request Adaptor is to remove the dependency on incumbent providers to do that work.
1313
The idea is to build an adaptor that could be installed and configured in a New Market Entrant (NME) infrastructure,
14-
and could work with the incumbent’s GPC < 1.6.0.
14+
and could work with the incumbent’s GPC < 1.6.2.
1515

16-
Adaptor consists of two main components:
16+
The Adaptor consists of two main components:
1717
- GPC API Facade
1818
- GP2GP Translator
1919

20-
Both are Java Spring Boot applications, released as separate docker images.
21-
20+
Both are Java Spring Boot applications, released as separate Docker images.
2221

2322
## Table of contents
2423

2524
1. [Guidance for setting up the GP2GP adaptors in INT](/getting-started-instructions.md)
2625
1. [Guidance for operating the adaptor as a New Market Entrant](/OPERATING.md)
27-
1. [Guidance on integrating with the adaptors APIs](#endpoints)
26+
1. [Guidance on integrating with the Adaptor's APIs](#endpoints)
2827
1. [Guidance for developing the adaptor](/developer-information.md)
2928
1. [Documentation on how this adaptor maps GP2GP concepts to GPConnect concepts](https://github.com/NHSDigital/patient-switching-adaptors-mapping-documentation)
3029

@@ -34,15 +33,15 @@ The Adaptor's facade provides two main endpoints for interacting with patient re
3433

3534
### POST /Patient/$gpc.migratestructuredrecord
3635

37-
The migratestructuredrecord endpoint is the primary endpoint for the adaptor.
36+
The migratestructuredrecord endpoint is the primary endpoint for the Adaptor.
3837
This endpoint initiates the electronic health record (EHR) transfer process.
3938
To use this endpoint, you need to provide the following headers:
4039

4140
- TO-ASID : ASID identifier of the losing incumbent
4241
- FROM-ASID : ASID identifier of the winning New Market Entrant (NME)
4342
- TO-ODS : ODS identifier of the losing incumbent
4443
- FROM-ODS : ODS identifier of the winning New Market Entrant (NME)
45-
- ConversationId : A unique UUID for the request. If not provided, the adaptor will generate one and include it in the response headers.
44+
- ConversationId : A unique UUID for the request. If not provided, the Adaptor will generate one and include it in the response headers.
4645
It must be used for all further calls for the patient's NHS number.
4746

4847
If a `ConversationId` header is provided where the value is populated but does not contain a valid UUID, then the
@@ -64,7 +63,7 @@ following response will be returned:
6463
"display": "Bad request"
6564
}]
6665
},
67-
"diagnostics": "ConversationId header must be either be empty or a valid UUID"
66+
"diagnostics": "ConversationId header must either be empty or a valid UUID"
6867
}]
6968
}
7069
```
@@ -73,7 +72,7 @@ For more details on how to query the losing practice details, see the [requestin
7372

7473
[requesting site requirements]: https://nhse-dsic.atlassian.net/wiki/spaces/DCSDCS/pages/12512034968/GP2GP+Requesting+Adaptor#Registration-Process-&-EHR-Request
7574

76-
The endpoint also requires a JSON body that includes the needed patient NHS number.
75+
The endpoint also requires a JSON body that includes the patient's NHS number.
7776
Request Body Example:
7877

7978
```json
@@ -103,13 +102,13 @@ Request Body Example:
103102
Responds with one of:
104103

105104
1. Initial request: If you successfully configure the endpoint described above and call it, you should receive a 202-accepted response. This means the adaptor has received the request and is making the relevant requests.
106-
2. Polling the request: after receiving a 202 response, we recommend polling the endpoint at regular intervals using an
105+
2. Polling the request: After receiving a 202 response, we recommend polling the endpoint at regular intervals using an
107106
increasing call gap strategy until you get a 200 response.
108107
Each poll can return one of the following responses:
109108
- 204 No content: this response indicates that we are still processing the requests / waiting for the EHR message response.
110109
- 200 Success: this response indicates we have successfully received and converted the EHR to JSON; you will also receive the FHIR bundle in the response's body.
111110
An example of this response can be found within [expectedBundle.json](gp2gp-translator/src/integrationTest/resources/json/expectedBundle.json).
112-
- 400,404,500,501: The endpoint can return all these possible error codes. These will all provide a detailed error with an operationOutcome JSON model response in the body. This looks like...
111+
- 400,404,500,501: The endpoint can return all these possible error codes. These will all provide a detailed error with an OperationOutcome JSON response in the body. This looks like...
113112

114113
```json
115114
{
@@ -145,7 +144,7 @@ Responds with one of:
145144
### POST /$gpc.ack
146145

147146
This endpoint finalizes the EHR transfer process.
148-
If you do not call this endpoint after receiving an EHR from the migratestructuredrecord enpoint, then you risk the losing practise triggering off the manual postal transfer.
147+
If you do not call this endpoint after receiving an EHR from the migratestructuredrecord endpoint, then you risk the losing practice triggering the manual postal transfer.
149148

150149
To use this endpoint, you need to provide the following headers:
151150

@@ -159,21 +158,21 @@ Endpoint calling:
159158
This endpoint is a fire-and-forget endpoint.
160159
- If your request is successful, you will get a 200: Success response.
161160
- If your request is unsuccessful, you will get a 500: Server error response.
162-
- If you receive a 500 response, you can retry again at any point, however, it should be noted that you must receive a 200: Success response from the migratestructuredrecord for the given conversation ID to receive a 200: Success from this endpoint.
161+
- If you receive a 500 response, you can retry at any point, however, it should be noted that you must receive a 200: Success response from the migratestructuredrecord for the given conversation ID to receive a 200: Success from this endpoint.
163162

164163
## Licensing
165-
This code is dual licensed under the MIT license and the OGL (Open Government License).
164+
This code is dual-licensed under the MIT license and the OGL (Open Government License).
166165
Any new work added to this repository must conform to the conditions of these licenses.
167-
In particular this means that this project may not depend on GPL-licensed or AGPL-licensed libraries,
166+
In particular, this means that this project may not depend on GPL-licensed or AGPL-licensed libraries,
168167
as these would violate the terms of those libraries' licenses.
169168

170-
The contents of this repository are protected by Crown Copyright (C).
169+
The contents of this repository are protected by Crown Copyright ©.
171170

172171
## Performance
173172

174173
Case 1: Performance Testing with JMeter
175174

176-
We conducted a performance test of the Adaptor using the JMeter tool.
175+
A performance test of the Adaptor was conducted using the JMeter tool.
177176
The use case focused on simulating a patient transfer request,
178177
where Electronic Health Record (EHR) requests were sent to the Adaptor, expecting a bundle in return.
179178
This test involved two text attachments with sizes of 2.44 MB and 0.7 MB, respectively.
@@ -202,7 +201,7 @@ indicating sufficient capacity for additional load.
202201
Case 2: Performance Testing via TPP/EMIS and Medicus
203202

204203
In a separate series of tests, up to 10 concurrent patient transfers were completed,
205-
involving varying attachment types (100, 500, 1000) and file sizes (1 KB, 100 KB, 500 KB, 3.5 MB, 5 MB).
204+
involving varying attachment counts (100, 500, 1000) and file sizes (1 KB, 100 KB, 500 KB, 3.5 MB, 5 MB).
206205
These tests were conducted with TPP/EMIS as the sending systems and Medicus as the receiving system.
207206

208207
Resource Allocation:
@@ -219,18 +218,18 @@ Message Queue:
219218
Results:
220219

221220
A single patient record of 10 MB was processed in approximately 20 seconds.
222-
On average, the transfer of up to 10 patients was completed within 1 to 1 minute and 40 seconds.
221+
On average, the transfer of up to 10 patients was completed within 1 minute to 1 minute and 40 seconds.
223222

224223

225-
![report1.jpg](test-suite%2Fnon-functional-tests%2Ftest-scenario%2Fperf_report%2Freport1.jpg)
224+
![report1.jpg](test-suite/non-functional-tests/test-scenario/perf_report/report1.jpg)
226225

227226
Overall performance statistics:
228-
![report2.png](test-suite%2Fnon-functional-tests%2Ftest-scenario%2Fperf_report%2Freport2.png)
227+
![report2.png](test-suite/non-functional-tests/test-scenario/perf_report/report2.png)
229228

230-
Active transfers per one iteration was 400:
231-
![report4.png](test-suite%2Fnon-functional-tests%2Ftest-scenario%2Fperf_report%2Freport4.png)
229+
Active transfers per iteration were 400:
230+
![report4.png](test-suite/non-functional-tests/test-scenario/perf_report/report4.png)
232231

233232
Response time:
234-
![report5.png](test-suite%2Fnon-functional-tests%2Ftest-scenario%2Fperf_report%2Freport5.png)
233+
![report5.png](test-suite/non-functional-tests/test-scenario/perf_report/report5.png)
235234

236-
Results can be seen in using graphs by importing results8.jtl into Jmeter.
235+
Results can be visualised by importing results8.jtl into JMeter.

0 commit comments

Comments
 (0)