Skip to content

Commit 84cbc30

Browse files
committed
Added code to handle internalsubmit calls from Adaptive Forms.
1 parent 5228f0d commit 84cbc30

3 files changed

Lines changed: 70 additions & 13 deletions

File tree

spring/fluentforms-spring-boot-autoconfigure/src/main/java/com/_4point/aem/fluentforms/spring/AemProxyAfSubmission.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -488,11 +488,21 @@ public SubmitResponse processSubmission(Submission submission) {
488488
static class AfSubmitLocalProcessor implements AfSubmitProcessor {
489489
private final static Logger logger = LoggerFactory.getLogger(AfSubmitLocalProcessor.class);
490490
private static final String REMAINDER_PATH_SUFFIX = "/jcr:content/guideContainer.af.submit.jsp";
491+
492+
// Have to implement an internal interface so that Spring does not think there are two available
493+
// AfSubmitProcessors. This wraps an internal AfSubmitAemProxyProcessor that the local processor
494+
// uses to handle requests it chooses to pass on to AEM.
495+
@FunctionalInterface
496+
public interface InternalAfSubmitAemProxyProcessor {
497+
AfSubmitAemProxyProcessor get();
498+
}
491499

492500
private final List<AfSubmissionHandler> submissionHandlers;
501+
private final AfSubmitAemProxyProcessor aemProxyProcessor;
493502

494-
AfSubmitLocalProcessor(List<AfSubmissionHandler> submissionHandlers) {
503+
AfSubmitLocalProcessor(List<AfSubmissionHandler> submissionHandlers, InternalAfSubmitAemProxyProcessor aemProxyProcessor) {
495504
this.submissionHandlers = submissionHandlers;
505+
this.aemProxyProcessor = aemProxyProcessor.get();
496506
logger.atInfo().addArgument(submissionHandlers.size()).log("Found {} available AfSubmissionHandlers.");
497507
if(logger.isDebugEnabled()) {
498508
submissionHandlers.forEach(sh->logger.atDebug().addArgument(sh.getClass().getName()).log(" Found AfSubmissionHandler named '{}'."));
@@ -501,6 +511,10 @@ static class AfSubmitLocalProcessor implements AfSubmitProcessor {
501511

502512
@Override
503513
public Response processRequest(FormDataMultiPart inFormData, HttpHeaders headers, String remainder) {
514+
if (!remainder.endsWith(REMAINDER_PATH_SUFFIX)) {
515+
// If the submission does not end with the expected submission suffix, then just proxy it AEM.
516+
return aemProxyProcessor.processRequest(inFormData, headers, remainder);
517+
}
504518
String formName = determineFormName(remainder);
505519
Optional<AfSubmissionHandler> firstHandler = submissionHandlers.stream()
506520
.filter(sh->canHandle(sh, formName))
@@ -516,11 +530,6 @@ private Response processSubmission(AfSubmissionHandler handler, FormDataMultiPar
516530
}
517531

518532
private String determineFormName(String guideContainerPath) {
519-
if (!guideContainerPath.endsWith(REMAINDER_PATH_SUFFIX)) {
520-
logger.atWarn().addArgument(REMAINDER_PATH_SUFFIX)
521-
.addArgument(guideContainerPath)
522-
.log("Expected guideContainerPath to end with {}, but it didn't. ({})");
523-
}
524533
return guideContainerPath.substring(0, guideContainerPath.length() - REMAINDER_PATH_SUFFIX.length());
525534
}
526535

spring/fluentforms-spring-boot-autoconfigure/src/main/java/com/_4point/aem/fluentforms/spring/AemProxyAutoConfiguration.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@
1313
import org.springframework.context.annotation.Bean;
1414

1515
import com._4point.aem.fluentforms.spring.AemProxyAfSubmission.AfSubmissionHandler;
16-
import com._4point.aem.fluentforms.spring.AemProxyAfSubmission.AfSubmitLocalProcessor;
1716
import com._4point.aem.fluentforms.spring.AemProxyAfSubmission.AfSubmitAemProxyProcessor;
17+
import com._4point.aem.fluentforms.spring.AemProxyAfSubmission.AfSubmitLocalProcessor;
18+
import com._4point.aem.fluentforms.spring.AemProxyAfSubmission.AfSubmitLocalProcessor.InternalAfSubmitAemProxyProcessor;
1819
import com._4point.aem.fluentforms.spring.AemProxyAfSubmission.AfSubmitProcessor;
1920

2021
/**
@@ -66,8 +67,8 @@ public ResourceConfigCustomizer afProxyConfigurer(AemConfiguration aemConfig, Ae
6667
@ConditionalOnMissingBean(AfSubmitProcessor.class)
6768
@ConditionalOnBean(AfSubmissionHandler.class)
6869
@Bean
69-
public AfSubmitProcessor localSubmitProcessor(List<AfSubmissionHandler> submissionHandlers) {
70-
return new AfSubmitLocalProcessor(submissionHandlers);
70+
public AfSubmitProcessor localSubmitProcessor(List<AfSubmissionHandler> submissionHandlers, InternalAfSubmitAemProxyProcessor aemProxyProcessor) {
71+
return new AfSubmitLocalProcessor(submissionHandlers, aemProxyProcessor);
7172
}
7273

7374
/**
@@ -83,8 +84,28 @@ public AfSubmitProcessor localSubmitProcessor(List<AfSubmissionHandler> submissi
8384
* Processor that forwards all submissions on to AEM.
8485
*/
8586
@ConditionalOnMissingBean({AfSubmitProcessor.class, AfSubmissionHandler.class})
86-
@Bean
87+
@Bean()
8788
public AfSubmitProcessor aemSubmitProcessor(AemConfiguration aemConfig) {
8889
return new AfSubmitAemProxyProcessor(aemConfig);
8990
}
91+
92+
/**
93+
* Supply a AfSubmitAemProxyProcessor for use by the localSubmitProcessor.
94+
*
95+
* This is the a processor that will forward all submissions on to the configured AEM
96+
* instance. It is used by the localSubmitProcessor to proxy any requests that aren't
97+
* true submissions (e.g. an internalsubmit).
98+
*
99+
* @param aemConfig
100+
* AEM configuration typically configured using application.properties files. This is
101+
* typically injected by the Spring Framework.
102+
* @return
103+
* Processor that forwards all submissions on to AEM.
104+
*/
105+
@ConditionalOnMissingBean(InternalAfSubmitAemProxyProcessor.class)
106+
@ConditionalOnBean(AfSubmissionHandler.class)
107+
@Bean
108+
public InternalAfSubmitAemProxyProcessor aemProxyProcessor(AemConfiguration aemConfig) {
109+
return ()->new AfSubmitAemProxyProcessor(aemConfig);
110+
}
90111
}

spring/fluentforms-spring-boot-autoconfigure/src/test/java/com/_4point/aem/fluentforms/spring/AemProxyAfSubmissionTest.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.junit.jupiter.params.ParameterizedTest;
2424
import org.junit.jupiter.params.provider.CsvSource;
2525
import org.junit.jupiter.params.provider.EnumSource;
26+
import org.mockito.Mockito;
2627
import org.slf4j.Logger;
2728
import org.slf4j.LoggerFactory;
2829
import org.springframework.boot.SpringApplication;
@@ -31,13 +32,17 @@
3132
import org.springframework.boot.test.context.SpringBootTest;
3233
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
3334
import org.springframework.boot.test.web.server.LocalServerPort;
35+
import org.springframework.context.annotation.Bean;
36+
import org.springframework.context.annotation.Configuration;
3437
import org.springframework.stereotype.Component;
3538

3639
import com._4point.aem.fluentforms.spring.AemProxyAfSubmission.AfSubmitAemProxyProcessor;
3740
import com._4point.aem.fluentforms.spring.AemProxyAfSubmission.AfSubmitLocalProcessor;
3841
import com._4point.aem.fluentforms.spring.AemProxyAfSubmission.AfSubmissionHandler;
3942
import com._4point.aem.fluentforms.spring.AemProxyAfSubmission.AfSubmitProcessor;
4043
import com._4point.aem.fluentforms.spring.AemProxyAfSubmission.AfSubmissionHandler.SubmitResponse;
44+
import com._4point.aem.fluentforms.spring.AemProxyAfSubmission.AfSubmitLocalProcessor.InternalAfSubmitAemProxyProcessor;
45+
import com._4point.aem.fluentforms.spring.AemProxyAfSubmissionTest.AemProxyAfSubmissionTestWithLocalAfSubmitProcessorTest.MockAemProxy;
4146
import com.github.tomakehurst.wiremock.client.WireMock;
4247
import com.github.tomakehurst.wiremock.junit5.WireMockTest;
4348

@@ -119,13 +124,13 @@ public static class JerseyConfig extends ResourceConfig {
119124
* Tests the AemAfSubmitProcessor
120125
*
121126
*/
122-
@WireMockTest(httpPort = 4502)
127+
@WireMockTest(httpPort = 8502)
123128
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT,
124129
classes = {TestApplication.class, JerseyConfig.class, AfSubmitAemProxyProcessor.class},
125130
properties = {
126131
// "debug",
127132
"fluentforms.aem.servername=" + "localhost",
128-
"fluentforms.aem.port=" + "4502",
133+
"fluentforms.aem.port=" + "8502",
129134
"fluentforms.aem.user=admin",
130135
"fluentforms.aem.password=admin",
131136
}
@@ -170,7 +175,7 @@ void test() {
170175
*
171176
*/
172177
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT,
173-
classes = {TestApplication.class, JerseyConfig.class, AfSubmitLocalProcessor.class,
178+
classes = {TestApplication.class, JerseyConfig.class, AfSubmitLocalProcessor.class, MockAemProxy.class,
174179
AemProxyAfSubmissionTestWithLocalAfSubmitProcessorTest.MockSubmissionProcessor.class,
175180
AemProxyAfSubmissionTestWithLocalAfSubmitProcessorTest.MockSubmissionProcessor2.class}
176181
,properties={
@@ -220,6 +225,19 @@ void testRedirect() {
220225
assertThat(response, allOf(isStatus(Response.Status.TEMPORARY_REDIRECT), doesNotHaveEntity()));
221226
}
222227

228+
@Test
229+
void testProxy() {
230+
final FormDataMultiPart getPdfForm = mockFormData("foo2", "bar");
231+
232+
Response response = jrc.target
233+
.path(SUBMIT_ADAPTIVE_FORM_SERVICE_PATH+"anythingElse")
234+
.request()
235+
.accept(MediaType.TEXT_PLAIN_TYPE)
236+
.post(Entity.entity(getPdfForm, getPdfForm.getMediaType()));
237+
238+
assertThat(response, allOf(isStatus(Response.Status.OK), doesNotHaveEntity()));
239+
}
240+
223241
@Component
224242
public static class MockSubmissionProcessor implements AfSubmissionHandler {
225243

@@ -267,6 +285,15 @@ public SubmitResponse processSubmission(Submission submission) {
267285
}
268286
}
269287

288+
@Configuration
289+
public static class MockAemProxy {
290+
@Bean()
291+
public InternalAfSubmitAemProxyProcessor aemProxyProcessor() {
292+
AfSubmitAemProxyProcessor mock = Mockito.mock(AfSubmitAemProxyProcessor.class);
293+
Mockito.when(mock.processRequest(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(Response.ok().build());
294+
return ()->mock;
295+
}
296+
}
270297
}
271298

272299
/**

0 commit comments

Comments
 (0)