From ef2beb387f91ba068cf3f4ac3ff46af8b7d25d1e Mon Sep 17 00:00:00 2001 From: Wim Velzeboer Date: Thu, 8 Jul 2021 11:00:22 +0100 Subject: [PATCH] Add method reference for fflib_Sharing mode Includes an example on how to configure and use this with selector classes --- docs/README.asciidoc | 2 +- docs/fflib_SharingMode.asciidoc | 158 ++++++++++++++++++++++++++++++++ 2 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 docs/fflib_SharingMode.asciidoc diff --git a/docs/README.asciidoc b/docs/README.asciidoc index 0fa7630..a18705a 100644 --- a/docs/README.asciidoc +++ b/docs/README.asciidoc @@ -39,7 +39,7 @@ ** link:fflib_DynamicDomainFactory.asciidoc[fflib_DynamicDomainFactory] ** fflib_DynamicSelectorFactory ** fflib_DynamicServiceFactory -** fflib_SharingMode +** link:fflib_SharingMode.asciidoc[fflib_SharingMode] === Primitive Domains - Dates diff --git a/docs/fflib_SharingMode.asciidoc b/docs/fflib_SharingMode.asciidoc new file mode 100644 index 0000000..b7b7e6c --- /dev/null +++ b/docs/fflib_SharingMode.asciidoc @@ -0,0 +1,158 @@ += fflib_SharingMode Enum +:Author: Wilhelmus G.J. Velzeboer +:Email: wim@velzeboer.nl +:Date: 2021 +:Revision: version 1 + +link:README.asciidoc[<- _Back to main overview_] + +Enum with the Application Binding Sharing Modes. + + +== Enum values + +- WithSharing +- WithoutSharing +- InheritedSharing +- None + + +These values can be set in the +link:fflib_AppBinding.asciidoc[AppBindings] to define which kind of access modifier +the implementation class is using. + +The Dynamic Domain Factory is using this sharing mode in the process of resolving the bindings, +to return the implementation class with the correct sharing mode. + +=== Example +Lets assume we have the following bindings configured in the +link:fflib_AppBindingResolver.asciidoc[fflib_AppBindingResolver] + +|=== +| Binding Type | Sharing mode | Implementation + +| Account._SObjectType_ +| WithSharing +| AccountsSelector.WithSharing._class_ + +| Account._SObjectType_ +| WithoutSharing +| AccountsSelector.WithoutSharing._class_ + + +|=== + +The application is configured to use the Dynamic Domain Factory. +As you can see the `Selector` property doesn't define a sharing mode, so the default sharing "WithSharing" is used. + +```java +public class Application +{ + private static fflib_IAppBindingResolver bindingResolver = + new fflib_AppBindingResolver(); + + public static final fflib_ISelectorFactory Selector = + new fflib_DynamicSelectorFactory(bindingResolver); + + public static final fflib_ISelectorFactory WithoutSharingSelector = + new fflib_DynamicSelectorFactory( + bindingResolver.bySharingMode(fflib_SharingMode.WithoutSharing) + ); +} +``` + +The selector is setup with three access modifiers +```java +public virtual inherited sharing class AccountsSelector + extends fflib_SObjectSelector + implements IAccountsSelector +{ + public static IAccountsSelector newInstance() + { + return (IAccountsSelector) Application.Selector.newInstance(Schema.Account.SObjectType); + } + + public static IAccountsSelector newWithoutSharingInstance() + { + return (IAccountsSelector) Application.WithoutSharingSelector + .newInstance(Schema.Account.SObjectType); + } + + public AccountsSelector() + { + super(); + } + + public AccountsSelector(Boolean includeFieldSetFields, Boolean enforceCRUD, Boolean enforceFLS) + { + super(includeFieldSetFields, enforceCRUD, enforceFLS); + } + + public List getSObjectFieldList() + { + return new List + { + Account.Id, + Account.Name, + Account.Rating + }; + } + + public Schema.SObjectType getSObjectType() + { + return Account.SObjectType; + } + + public virtual List selectById(Set idSet) + { + return (List) selectSObjectsById(idSet); + } + + public virtual List selectByRating(Set rating) + { + return (List) + Database.query( + newQueryFactory() + .setCondition('Rating IN :rating') + .toSOQL() + ); + } + + public with sharing class WithSharing extends AccountsSelector + { + public WithSharing() + { + super(true, true, true); + } + + public override List selectById(Set idSet) + { + return super.selectById(idSet); + } + + public override List selectByRating(Set rating) + { + return super.selectByRating(rating); + } + } + + public without sharing class WithoutSharing extends AccountsSelector + { + public WithoutSharing() + { + super(true, false, false); + } + + public override List selectById(Set idSet) + { + return super.selectById(idSet); + } + + public override List selectByRating(Set rating) + { + return super.selectByRating(leadSources); + } + } +} + +```