@@ -26,6 +26,7 @@ import org.orbeon.oxf.fr.FormRunnerPersistence.*
26
26
import org .orbeon .oxf .fr .permission .*
27
27
import org .orbeon .oxf .fr .permission .PermissionsAuthorization .findCurrentCredentialsFromSession
28
28
import org .orbeon .oxf .fr .persistence .PersistenceMetadataSupport
29
+ import org .orbeon .oxf .fr .persistence .api .PersistenceApi
29
30
import org .orbeon .oxf .fr .persistence .proxy .PersistenceProxyPermissions .ResponseHeaders
30
31
import org .orbeon .oxf .fr .persistence .relational .form .FormProxyLogic
31
32
import org .orbeon .oxf .fr .persistence .relational .index .status .Backend
@@ -576,11 +577,19 @@ private[persistence] object PersistenceProxy extends FormProxyLogic {
576
577
bodyContentOpt
577
578
}
578
579
580
+ val passSingletonHeader = isDataXmlRequest && request.getMethod == HttpMethod .PUT
581
+ val singletonHeaderOpt = passSingletonHeader.flatOption(getSingletonHeader(appForm, effectiveFormDefinitionVersionOpt))
582
+ val allHeaders =
583
+ outgoingPersistenceHeaders ++
584
+ outgoingVersionHeaderOpt ++
585
+ singletonHeaderOpt ++
586
+ existingFormOrDataHeaders
587
+
579
588
proxyEstablishConnection(
580
589
OutgoingRequest (request),
581
590
outgoingRequestContent,
582
591
serviceUri,
583
- outgoingPersistenceHeaders ++ outgoingVersionHeaderOpt ++ existingFormOrDataHeaders
592
+ allHeaders
584
593
)
585
594
}
586
595
@@ -625,6 +634,25 @@ private[persistence] object PersistenceProxy extends FormProxyLogic {
625
634
)
626
635
}
627
636
637
+ private def getSingletonHeader (
638
+ appForm : AppForm ,
639
+ formDefinitionVersionOpt : Option [Int ]
640
+ )(implicit
641
+ indentedLogger : IndentedLogger
642
+ ): Option [(String , String )] = {
643
+ // Only attempt to check singleton status when we have a form version
644
+ formDefinitionVersionOpt.flatMap { version =>
645
+ implicit val coreCrossPlatformSupport : CoreCrossPlatformSupport .type = CoreCrossPlatformSupport
646
+ // Read the full form definition as `singleton` isn't in the extracted form metadata
647
+ val formDefinitionTry = PersistenceApi .readPublishedFormDefinition(appForm.app, appForm.form, FormDefinitionVersion .Specific (version))
648
+ formDefinitionTry.toOption.flatMap { case ((_, formDefinitionDoc), _) =>
649
+ val docContext = new InDocFormRunnerDocContext (formDefinitionDoc)
650
+ val isSingleton = docContext.metadataRootElemOpt.flatMap(_.firstChildOpt(" singleton" )).exists(_.stringValue == " true" )
651
+ isSingleton.option(Headers .OrbeonSingleton -> " true" )
652
+ }
653
+ }
654
+ }
655
+
628
656
private def attachmentsProviderCxr (
629
657
isAttachment : Boolean ,
630
658
request : Request ,
0 commit comments