Skip to content

Commit ef31a76

Browse files
authored
Merge pull request #61 from rmcdouga/20260228_AF_Cookie_Support
Add cookie support into Adaptive Forms rendering client code
2 parents e0de5b1 + fae4143 commit ef31a76

File tree

9 files changed

+823
-35
lines changed

9 files changed

+823
-35
lines changed

rest-services/client/src/main/java/com/_4point/aem/docservices/rest_services/client/RestClient.java

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ default Builder addStringVersion(String fieldName, List<?> fieldData) {
159159
}
160160
Builder queryParam(String name, String value);
161161
Builder addHeader(String name, String value);
162+
Builder addCookies(Cookies cookies);
162163
MultipartPayload build();
163164
}
164165
}
@@ -190,6 +191,7 @@ public interface GetRequest {
190191
public interface Builder {
191192
Builder queryParam(String name, String value);
192193
Builder addHeader(String name, String value);
194+
Builder addCookies(Cookies cookies);
193195
GetRequest build();
194196
}
195197
}
@@ -209,6 +211,11 @@ public interface Builder {
209211
*/
210212
public GetRequest.Builder getRequestBuilder(String additionalPath);
211213

214+
public interface Cookies {
215+
public boolean isEmpty();
216+
public boolean isPresent();
217+
};
218+
212219
/**
213220
* A response from the AEM Rest Service
214221
*/
@@ -235,9 +242,44 @@ public interface Response {
235242
* @return
236243
*/
237244
public Optional<String> retrieveHeader(String header);
238-
245+
246+
public HttpHeaders headers();
247+
248+
public Cookies getCookies();
239249
}
240250

251+
/**
252+
* Represents an HTTP header as a name / value pair.
253+
*
254+
* Note that there may be multiple headers with the same name, so HttpHeaders.getHeaders() returns a
255+
* List<HttpHeader> rather than a single HttpHeader.
256+
*/
257+
public record HttpHeader(String name, String value) {};
258+
259+
public interface HttpHeaders {
260+
public enum CaseHandling {
261+
PRESERVES_CASE, DOWNSHIFTS, UPSHIFTS;
262+
}
263+
264+
/**
265+
*
266+
* Indicates how this implementation handles the case of HTTP header names.
267+
* This is important to know when calling getHeaders() since HTTP header names are case-insensitive,
268+
* but the actual case used may vary based on the implementation.
269+
*
270+
* PRESERVES_CASE means that the header names are returned in the same case as they were sent by the server.
271+
* DOWNSHIFTS means that the header names are returned in all lower case.
272+
* UPSHIFTS means that the header names are returned in all upper case.
273+
*
274+
* @return How this implementation handles the case of HTTP header names.
275+
*
276+
*/
277+
public CaseHandling caseHandling();
278+
279+
280+
public List<HttpHeader> getHeaders(String headerName);
281+
}
282+
241283
@SuppressWarnings("serial")
242284
public static class RestClientException extends Exception {
243285

rest-services/client/src/main/java/com/_4point/aem/docservices/rest_services/client/af/AdaptiveFormsService.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import com._4point.aem.docservices.rest_services.client.RestClient;
1313
import com._4point.aem.docservices.rest_services.client.RestClient.ContentType;
14+
import com._4point.aem.docservices.rest_services.client.RestClient.Cookies;
1415
import com._4point.aem.docservices.rest_services.client.RestClient.GetRequest;
1516
import com._4point.aem.docservices.rest_services.client.RestClient.MultipartPayload;
1617
import com._4point.aem.docservices.rest_services.client.RestClient.Response;
@@ -106,7 +107,9 @@ public Document renderAdaptiveForm(PathOrUrl template, Document data) throws Ada
106107
builder = builder.queryParam("wcmmode", "disabled");
107108

108109
if (!data.isEmpty()) {
109-
builder = builder.queryParam(DATA_REF_PARAM, generateDataRefParam(postDataToDataCacheService(data)));
110+
DataCacheResponse response = postDataToDataCacheService(data);
111+
builder = builder.queryParam(DATA_REF_PARAM, generateDataRefParam(response.uuid()))
112+
.addCookies(response.cookies());
110113
}
111114

112115
GetRequest getRequest = builder.build();
@@ -128,12 +131,14 @@ private String generateDataRefParam(String uuid) {
128131
return "service://FFPrefillService/" + uuid;
129132
}
130133

131-
private String postDataToDataCacheService(Document data) throws AdaptiveFormsServiceException {
134+
private record DataCacheResponse(String uuid, Cookies cookies) {}
135+
136+
private DataCacheResponse postDataToDataCacheService(Document data) throws AdaptiveFormsServiceException {
132137
try (MultipartPayload payload = dataCacheRestClient.multipartPayloadBuilder()
133138
.add(DATA_SERVICE_DATA_PARAM, data, getContentType(data))
134139
.build()) {
135140
return payload.postToServer(ContentType.TEXT_PLAIN)
136-
.map(uncheck(AdaptiveFormsService::responseToString))
141+
.map(uncheck(AdaptiveFormsService::mapResponse))
137142
.orElseThrow();
138143

139144
} catch (IOException e) {
@@ -152,8 +157,8 @@ private static ContentType getContentType(Document data) {
152157
}
153158
}
154159

155-
private static String responseToString(Response result) throws IOException {
156-
return new String(result.data().readAllBytes());
160+
private static DataCacheResponse mapResponse(Response result) throws IOException {
161+
return new DataCacheResponse(new String(result.data().readAllBytes()), result.getCookies());
157162
}
158163

159164
/**

rest-services/client/src/test/java/com/_4point/aem/docservices/rest_services/client/RestClientTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.junit.jupiter.params.provider.EnumSource;
1515

1616
import com._4point.aem.docservices.rest_services.client.RestClient.ContentType;
17+
import com._4point.aem.docservices.rest_services.client.RestClient.Cookies;
1718
import com._4point.aem.docservices.rest_services.client.RestClient.MultipartPayload;
1819
import com._4point.aem.docservices.rest_services.client.RestClient.MultipartPayload.Builder;
1920
import com._4point.aem.fluentforms.api.Document;
@@ -69,6 +70,11 @@ public Builder addHeader(String name, String value) {
6970
public MultipartPayload build() {
7071
throw new UnsupportedOperationException("Not implemented");
7172
}
73+
74+
@Override
75+
public Builder addCookies(Cookies cookies) {
76+
throw new UnsupportedOperationException("Not implemented");
77+
}
7278
};
7379

7480
private final MockBuilder underTest = new MockBuilder();

rest-services/client/src/test/java/com/_4point/aem/docservices/rest_services/client/af/AdaptiveFormsServiceTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
import com._4point.aem.docservices.rest_services.client.RestClient;
3030
import com._4point.aem.docservices.rest_services.client.RestClient.ContentType;
31+
import com._4point.aem.docservices.rest_services.client.RestClient.Cookies;
3132
import com._4point.aem.docservices.rest_services.client.RestClient.GetRequest;
3233
import com._4point.aem.docservices.rest_services.client.RestClient.MultipartPayload;
3334
import com._4point.aem.docservices.rest_services.client.RestClient.Response;
@@ -62,6 +63,7 @@ class AdaptiveFormsServiceTest {
6263
@Mock(stubOnly = true) GetRequest.Builder mockGetRequestBuilder;
6364
@Mock(stubOnly = true) Response mockPostResponse;
6465
@Mock(stubOnly = true) Response mockGetResponse;
66+
@Mock(stubOnly = true) Cookies mockCookies;
6567

6668
@Captor ArgumentCaptor<AemConfig> aemConfig;
6769
@Captor ArgumentCaptor<String> servicePath;
@@ -172,6 +174,7 @@ void testRenderAdaptiveForm(HappyPath scenario) throws Exception {
172174
setupDataServiceMocks(setupMockPostResponse(DUMMY_GUID.getBytes(), ContentType.TEXT_PLAIN));
173175
when(mockPayloadBuilder.add(eq("Data"), Mockito.any(Document.class), eq(scenario.contentType))).thenReturn(mockPayloadBuilder);
174176
when(mockGetRequestBuilder.queryParam(eq("dataRef"), eq("service://FFPrefillService/" + DUMMY_GUID))).thenReturn(mockGetRequestBuilder);
177+
when(mockGetRequestBuilder.addCookies(Mockito.any(Cookies.class))).thenReturn(mockGetRequestBuilder);
175178
}
176179

177180
AdaptiveFormsService underTest = createAdapter(mockClientFactory);
@@ -210,6 +213,7 @@ private void setupFilterMocks(byte[] responseData) throws RestClientException {
210213
setupDataServiceMocks(setupMockPostResponse(DUMMY_GUID.getBytes(), ContentType.TEXT_PLAIN));
211214
when(mockPayloadBuilder.add(eq("Data"), Mockito.any(Document.class), Mockito.any(ContentType.class))).thenReturn(mockPayloadBuilder);
212215
when(mockGetRequestBuilder.queryParam(eq("dataRef"), eq("service://FFPrefillService/" + DUMMY_GUID))).thenReturn(mockGetRequestBuilder);
216+
when(mockGetRequestBuilder.addCookies(Mockito.any(Cookies.class))).thenReturn(mockGetRequestBuilder);
213217
}
214218

215219
@Test
@@ -258,6 +262,7 @@ private void setupAfServiceMocks(String form, Optional<Response> mockedResponse)
258262
private Optional<Response> setupMockPostResponse(byte[] responseData, ContentType expectedContentType) {
259263
// when(mockPostResponse.contentType()).thenReturn(expectedContentType); // ContentType is not queries.
260264
when(mockPostResponse.data()).thenReturn(new ByteArrayInputStream(responseData));
265+
when(mockPostResponse.getCookies()).thenReturn(mockCookies);
261266
return Optional.of(mockPostResponse);
262267
}
263268

rest-services/client/src/test/java/com/_4point/aem/docservices/rest_services/client/docassurance/RestServicesDocAssuranceServiceAdapterTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,11 @@ public MultipartPayload.Builder add(String fieldName, byte[] fieldData, ContentT
225225
public MultipartPayload.Builder add(String fieldName, String fieldData) {
226226
throw new UnsupportedOperationException("This version of add() should never be called.");
227227
}
228+
229+
@Override
230+
public MultipartPayload.Builder addCookies(Cookies cookies) {
231+
throw new UnsupportedOperationException("This version of add() should never be called.");
232+
}
228233
};
229234
}
230235

0 commit comments

Comments
 (0)