Skip to content

Commit c868d7b

Browse files
committed
For #6902: proxy to pass Orbeon-Singleton header
1 parent 571ca6e commit c868d7b

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

form-runner/jvm/src/main/scala/org/orbeon/oxf/fr/persistence/proxy/PersistenceProxy.scala

+29-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import org.orbeon.oxf.fr.FormRunnerPersistence.*
2626
import org.orbeon.oxf.fr.permission.*
2727
import org.orbeon.oxf.fr.permission.PermissionsAuthorization.findCurrentCredentialsFromSession
2828
import org.orbeon.oxf.fr.persistence.PersistenceMetadataSupport
29+
import org.orbeon.oxf.fr.persistence.api.PersistenceApi
2930
import org.orbeon.oxf.fr.persistence.proxy.PersistenceProxyPermissions.ResponseHeaders
3031
import org.orbeon.oxf.fr.persistence.relational.form.FormProxyLogic
3132
import org.orbeon.oxf.fr.persistence.relational.index.status.Backend
@@ -576,11 +577,19 @@ private[persistence] object PersistenceProxy extends FormProxyLogic {
576577
bodyContentOpt
577578
}
578579

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+
579588
proxyEstablishConnection(
580589
OutgoingRequest(request),
581590
outgoingRequestContent,
582591
serviceUri,
583-
outgoingPersistenceHeaders ++ outgoingVersionHeaderOpt ++ existingFormOrDataHeaders
592+
allHeaders
584593
)
585594
}
586595

@@ -625,6 +634,25 @@ private[persistence] object PersistenceProxy extends FormProxyLogic {
625634
)
626635
}
627636

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+
628656
private def attachmentsProviderCxr(
629657
isAttachment : Boolean,
630658
request : Request,

0 commit comments

Comments
 (0)