2 Commits
Author SHA1 Message Date
github-actions 05e1514be0 Update package version to 0.12.0.NEXT
Create Release / release (push) Canceled after 0s
2026-09-28 09:30:49 +00:00
4a734ee822 Fix styling (#93)
* Fix styling

* Fix dependency with apex-common,

A method that exists in apex-extensions, is now added to the apex-commons.

IMPORTANT: this is introducing a breaking change, as the second paramter of the method is flipped in meaning. From `omitNulls` to `includeNulls`.

* New package version 0.11.0-1-code-reformat created

* New package version 0.11.0-2-code-reformat created

* New package version 0.11.0-3-code-reformat created

---------

Co-authored-by: WimVelzeboer <wvelzeb1@its.jnj.com>
Co-authored-by: github-actions <github-actions@github.com>
2026-09-28 10:30:22 +01:00
18 changed files with 121 additions and 103 deletions
+7 -2
View File
@@ -10,10 +10,10 @@ This extension package is dependent on the following packages:
The package is available as an Unlocked Managed Package (2GP) with package ID `0HoJ8000000KyjfKAC`.
Either clone the repository and import the package manually, use the [Package Installation URL](https://login.salesforce.com/packaging/installPackage.apexp?p0=04tJ9000000YW1CIAW)
Either clone the repository and import the package manually, use the [Package Installation URL](https://login.salesforce.com/packaging/installPackage.apexp?p0=04tQy000000ZbKrIAK)
or execute the following SFDX CLI command in your terminal:
```bash
sf package install --package 04tJ9000000YW1CIAW --wait=10 --target-org $YOUR_ORG_ALIAS
sf package install --package 04tQy000000ZbKrIAK --wait=10 --target-org $YOUR_ORG_ALIAS
```
_Replace `$YOUR_ORG_ALIAS` with the alias of your target org_
@@ -60,6 +60,10 @@ You can also have a look at the open items in the [project(s)](./projects), feel
# Change Log
Some of the changes that have major impact are listed here;
### Updated September 2026
- **fflib_SObjects2** <br/>
_getIdFieldValues_ **IMPORTANT BRACKING CHANGE** The method overload `Set<Id> getIdFieldValues(Schema.SObjectField field, Boolean omitNulls)` is now added to the fflib-apex-commons (and removed from the extensions), with the second parameter is flipped from `omitNulls` to `includeNulls`. So, when upgrading make sure to modify the `true` to `false` in your project!!!!
### Updates January 2026
- **fflib_ArrayUtils** <br/>
_copyFields_,<br/>Add method that copies field values in bulk from one domain to another related domain<br/>
@@ -128,3 +132,4 @@ Thank you for your donations!
| 0.8.0.1 | 04tJ8000000kaL4IAI | Created on 31/03/2026 11:51:16 |
| 0.9.0.1 | 04tJ8000000kaPHIAY | Created on 05/08/2026 08:36:21 |
| 0.10.0.1 | 04tJ9000000YW1CIAW | Created on 13/08/2026 11:06:34 |
| 0.11.0.3 | 04tQy000000ZbKrIAK | Created on 28/09/2026 09:30:49 |
+6 -3
View File
@@ -1,8 +1,8 @@
{
"packageDirectories": [
{
"versionName": "ver 0.11",
"versionNumber": "0.11.0.NEXT",
"versionName": "ver 0.12",
"versionNumber": "0.12.0.NEXT",
"path": "sfdx-source",
"default": true,
"package": "fflibApexExtensions",
@@ -18,6 +18,9 @@
"fflibApexExtensions@0.7.0-1": "04tJ8000000kaKzIAI",
"fflibApexExtensions@0.8.0-1-apiUpgrade": "04tJ8000000kaL4IAI",
"fflibApexExtensions@0.9.0-1-feature/genericSelector": "04tJ8000000kaPHIAY",
"fflibApexExtensions@0.10.0-1-api-upgrade-67": "04tJ9000000YW1CIAW"
"fflibApexExtensions@0.10.0-1-api-upgrade-67": "04tJ9000000YW1CIAW",
"fflibApexExtensions@0.11.0-1-code-reformat": "04tQy000000ZbBBIA0",
"fflibApexExtensions@0.11.0-2-code-reformat": "04tQy000000ZbEPIA0",
"fflibApexExtensions@0.11.0-3-code-reformat": "04tQy000000ZbKrIAK"
}
}
@@ -1,6 +1,5 @@
/**
* File Name: fflib_ClassicDomainFactory
* @description Domain Factory for creating instances of Domain classes
* Domain Factory for creating instances of Domain classes
* using a static map for linking the SObjectType to its Domain Constructor implementation class
*
* @author architect ir. Wilhelmus G.J. Velzeboer
@@ -38,7 +37,7 @@ public virtual class fflib_ClassicDomainFactory
/**
* Constructs a Domain factory
**/
public fflib_ClassicDomainFactory() {}
public fflib_ClassicDomainFactory(){ }
/**
* Constructs a Domain factory, based on a map linking the ObjectType to the
@@ -46,7 +45,7 @@ public virtual class fflib_ClassicDomainFactory
* Note: this will not check if the Apex classes actually implements the
* interfaces since this is not possible in the Apex runtime at present
*
* @param selectorFactory, A reference to the Selector Factory instance, an instance of fflib_ISelectorFactory
* @param selectorFactory A reference to the Selector Factory instance, an instance of fflib_ISelectorFactory
* @param constructorTypeByObject Map of Domain classes by Object Type
**/
public fflib_ClassicDomainFactory(
@@ -84,7 +83,8 @@ public virtual class fflib_ClassicDomainFactory
* @param recordIds A list of Id's of the same type
*
* @return Instance of a Domain containing the queried records
* @exception Throws an exception via the Selector Factory if the Ids are not all of the same SObjectType
*
* @throws DeveloperException If the Ids are not all of the same SObjectType
**/
public virtual override fflib_IDomain newInstance(Set<Id> recordIds)
{
@@ -100,12 +100,13 @@ public virtual class fflib_ClassicDomainFactory
* @param sObjectType The SObjectType of the given record Ids
*
* @return Instance of a Domain containing the queried records
* @exception Throws an exception via the Selector Factory if the Ids are not all of the same SObjectType
*
* @throws DeveloperException If the Ids are not all of the same SObjectType
**/
public virtual fflib_IDomain newInstance(Set<Id> recordIds, Schema.SObjectType sObjectType)
{
// Avoid unexpected exceptions when the recordIds contains incorrect data
if (recordIds.isEmpty() || new List<Id>(recordIds).get(0) == null )
if (recordIds.isEmpty() || new List<Id>(recordIds).get(0) == null)
return newInstance(new List<SObject>(), sObjectType);
return newInstance(selectorFactory.selectById(recordIds));
@@ -1,7 +1,4 @@
/**
* File Name: fflib_ClassicSelectorFactory
* @description
*
* @author architect ir. Wilhelmus G.J. Velzeboer
*
* Copyright (c), W.G.J. Velzeboer,
@@ -1,7 +1,4 @@
/**
* File Name: fflib_ClassicServiceFactory
* @description
*
* @author architect ir. Wilhelmus G.J. Velzeboer
*
* Copyright (c), W.G.J. Velzeboer,
@@ -35,7 +32,9 @@ public virtual class fflib_ClassicServiceFactory
/**
* Constructs a simple Service Factory
**/
public fflib_ClassicServiceFactory() {}
public fflib_ClassicServiceFactory()
{
}
/**
* Constructs a simple Service Factory,
@@ -1,7 +1,4 @@
/**
* File Name: fflib_ClassicUnitOfWorkFactory
* @description
*
* @author architect ir. Wilhelmus G.J. Velzeboer
*
* Copyright (c), W.G.J. Velzeboer,
@@ -867,26 +867,6 @@ public virtual class fflib_SObjects2
return result;
}
/**
* Gets the Id values, but with the option to omit null values
*
* @param field The Schema.SObjectField to get their Id values
* @param omitNulls If set to TRUE, null values will be removed from the result
*
* @return The Id values of the given sObjectField, null values are omitted
*/
@TestVisible
protected Set<Id> getIdFieldValues(Schema.SObjectField field, Boolean omitNulls)
{
Set<Id> result = getIdFieldValues(field);
if (omitNulls)
{
result.remove(null);
}
return result;
}
/**
* @param sObjectField The Schema.SObjectField to get their Id values
* @param criteria The criteria condition that must be met to include the value in the return
@@ -37,9 +37,8 @@ public abstract with sharing class fflib_ALogAppenderFilter implements fflib_ILo
protected System.LoggingLevel minLogLevel = DEFAULT_LEVEL;
/**
* setLoggingLevel
* Change the current minimum logging level
*
* @description Change the current minimum logging level
* @param logLevel
*/
public void setLoggingLevel(System.LoggingLevel logLevel)
@@ -48,9 +47,8 @@ public abstract with sharing class fflib_ALogAppenderFilter implements fflib_ILo
}
/**
* isValidLogLevel
* Compares the Organisation, User and Apex logging level settings
*
* @description Compares the Organisation, User and Apex logging level settings
* @param logLevel
*
* @return Returns true if one of the settings is equal or higher than the given loglevel
@@ -59,33 +57,31 @@ public abstract with sharing class fflib_ALogAppenderFilter implements fflib_ILo
{
return (
isValidOrganisationLogLevel(logLevel) ||
isValidUserLogLevel(logLevel) ||
isValidApexClassLogLevel(logLevel)
isValidUserLogLevel(logLevel) ||
isValidApexClassLogLevel(logLevel)
);
}
/**
* isValidLogLevel
* Compares the given log level valueToCompare against the compareTo
*
* @description Compares the given log level valueToCompare against the compareTo
* @param compareTo The log level to compare against
* @param valueToCompare The log level to compare
*
* @return Returns true if the valueToCompare is equal of higher then the compareTo
*/
private Boolean isValidLogLevel(System.LoggingLevel compareTo, System.LoggingLevel valueToCompare)
private static Boolean isValidLogLevel(System.LoggingLevel compareTo, System.LoggingLevel valueToCompare)
{
return compareTo != System.LoggingLevel.NONE
&&
&&
valueToCompare != System.LoggingLevel.NONE
&&
&&
valueToCompare.ordinal() >= compareTo.ordinal();
}
/**
* isValidApexClassLogLevel
* Compare the given loglevel against the current Apex setting stored in this.minLogLevel
*
* @description Compare the given loglevel against the current Apex setting stored in this.minLogLevel
* @param logLevel The log level to compare
*
* @return Returns true if the given log level is equal of higher then the Apex setting
@@ -96,9 +92,8 @@ public abstract with sharing class fflib_ALogAppenderFilter implements fflib_ILo
}
/**
* isValidOrganisationLogLevel
* Compare the given loglevel against the Organisation setting stored in a Custom Setting
*
* @description Compare the given loglevel against the Organisation setting stored in a Custom Setting
* @param logLevel The log level to compare
*
* @return Returns true if the given log level is equal of higher then the Organisation setting
@@ -112,9 +107,8 @@ public abstract with sharing class fflib_ALogAppenderFilter implements fflib_ILo
}
/**
* isValidUserLogLevel
* Compare the given loglevel against the User setting stored in a Custom Setting
*
* @description Compare the given loglevel against the User setting stored in a Custom Setting
* @param logLevel The log level to compare
*
* @return Returns true if the given log level is equal of higher then the User setting
@@ -158,20 +152,19 @@ public abstract with sharing class fflib_ALogAppenderFilter implements fflib_ILo
}
/**
* hasSettingsValue
* Validates if the Custom Setting has a value stored in the given field
*
* @description Validates if the Custom Setting has a value stored in the given field
* @param setting The Custom Setting to validate
* @param sObjectField The field to check
*
* @return Returns true is the given field is set in the Custom Setting
*/
private Boolean hasSettingsValue(fflib_LogLevelFilter__c setting, SObjectField sObjectField)
private static Boolean hasSettingsValue(fflib_LogLevelFilter__c setting, SObjectField sObjectField)
{
return (
null != setting
&&
setting.getPopulatedFieldsAsMap().containsKey(sObjectField.getDescribe().getName())
setting.getPopulatedFieldsAsMap().containsKey(sObjectField.getDescribe().getName())
);
}
@@ -48,9 +48,8 @@ public virtual without sharing class fflib_LogEventAppender extends fflib_ALogAp
}
/**
* publishEvents
* Publish the given fflib_LogEvent__e events and report if there are any errors
*
* @description Publish the given fflib_LogEvent__e events and report if there are any errors
* @param events The Platform events to publish
*/
protected virtual void publishEvents(List<fflib_LogEvent__e> events)
@@ -61,9 +60,8 @@ public virtual without sharing class fflib_LogEventAppender extends fflib_ALogAp
/**
* checkAndReportErrors
* Iterate over the given Database.SaveResults and report any errors
*
* @description Iterate over the given Database.SaveResults and report any errors
* @param saveResults
*/
protected void checkAndReportErrors(List<Database.SaveResult> saveResults)
@@ -79,9 +77,8 @@ public virtual without sharing class fflib_LogEventAppender extends fflib_ALogAp
}
/**
* reportError
* Construct the error message for the failing Database.SaveResult and throws an exception
*
* @description Construct the error message for the failing Database.SaveResult and throws an exception
* @param saveResult
*
* @throws fflib_LogEventAppender.fflib_LogEventAppenderException
@@ -35,6 +35,8 @@ public abstract with sharing class fflib_LogEventDomain extends fflib_PlatformEv
/**
* Class constructor
*
* @param records
*/
public fflib_LogEventDomain(List<SObject> records)
{
@@ -32,6 +32,8 @@ public with sharing class fflib_LogEventStoreListener extends fflib_LogEventDoma
{
/**
* Class constructor
*
* @param records
*/
public fflib_LogEventStoreListener(List<SObject> records)
{
@@ -206,7 +206,7 @@ public with sharing class fflib_Logger implements fflib_ILogger
{
public void append(fflib_LogEntry logEntry)
{
System.debug(logEntry.className + ' #' + logEntry.lineNumber + ' @'+ logEntry.methodName + ' ' + logEntry.message);
System.debug(logEntry.className + ' #' + logEntry.lineNumber + ' @' + logEntry.methodName + ' ' + logEntry.message);
}
}
@@ -2,7 +2,8 @@
* File Name: sflib_LogEventTrigger
* Description: Tigger to store Log events into a custom object
* Copyright (c) 2019 Johnson & Johnson
* @author: architect ir. Wilhelmus G.J. Velzeboer | wvelzebo@its.jnj.com
*
* @author architect ir. Wilhelmus G.J. Velzeboer | wvelzebo@its.jnj.com
*/
trigger fflib_LogEventTrigger on fflib_LogEvent__e (after insert)
{
@@ -68,8 +68,8 @@ public virtual inherited sharing class fflib_TriggerActionConfig
// Get SObjectType
String ObjectTypeApiName =
String.isNotBlank(triggerAction.ObjectType__c)
? triggerAction.ObjectType__r?.QualifiedApiName?.toLowerCase().trim()
: triggerAction.ObjectTypeAlternate__c.toLowerCase().trim();
? triggerAction.ObjectType__r?.QualifiedApiName?.toLowerCase().trim()
: triggerAction.ObjectTypeAlternate__c.toLowerCase().trim();
this.sObjectType = Schema.describeSObjects(new List<String> {ObjectTypeApiName}).get(0).getSObjectType();
}
@@ -78,15 +78,15 @@ public virtual without sharing class fflib_TriggerActionConfigSelector
}
)
/* Please replace the above String.format method call for that below,
when the following issue in fflib-apex-commons is resolved:
https://github.com/apex-enterprise-patterns/fflib-apex-common/issues/208
/* Please replace the above String.format method call for that below,
when the following issue in fflib-apex-commons is resolved:
https://github.com/apex-enterprise-patterns/fflib-apex-common/issues/208
newQueryFactory()
.selectField('ObjectType__r.QualifiedApiName')
.toSOQL()
newQueryFactory()
.selectField('ObjectType__r.QualifiedApiName')
.toSOQL()
*/
*/
);
}
}
@@ -52,7 +52,8 @@ public virtual inherited sharing class fflib_TriggerContext
* Provides access to the Trigger.new and allowing it to be mocked in unit-tests
*/
@TestVisible
protected List<SObject> records {
protected List<SObject> records
{
get
{
if (records == null)
@@ -88,8 +89,10 @@ public virtual inherited sharing class fflib_TriggerContext
}
/**
* Provides access to the data represented by this Trigger Context
**/
* Provides access to the data represented by this Trigger Context
*
* @return
**/
public System.TriggerOperation getTriggerOperation()
{
return triggerOperation;
@@ -131,18 +134,26 @@ public virtual inherited sharing class fflib_TriggerContext
}
/**
* Detects whether any values in context records have changed for given field as string
* Returns list of SObject records that have changes in the specified fields
**/
* Detects whether any values in context records have changed for given field as string
* Returns list of SObject records that have changes in the specified fields
*
* @param fieldName
*
* @return
**/
public List<SObject> getChangedRecords(String fieldName)
{
return getChangedRecords(new Set<String> {fieldName});
}
/**
* Detects whether any values in context records have changed for given fields as strings
* Returns list of SObject records that have changes in the specified fields
**/
* Detects whether any values in context records have changed for given fields as strings
* Returns list of SObject records that have changes in the specified fields
*
* @param fieldNames
*
* @return
**/
public List<SObject> getChangedRecords(Set<String> fieldNames)
{
List<SObject> changedRecords = new List<SObject>();
@@ -167,6 +178,10 @@ public virtual inherited sharing class fflib_TriggerContext
/**
* Detects whether any values in context records have changed for given field as token
* Returns list of SObject records that have changes in the specified fields
*
* @param fieldToken
*
* @return
**/
public List<SObject> getChangedRecords(Schema.SObjectField fieldToken)
{
@@ -176,6 +191,10 @@ public virtual inherited sharing class fflib_TriggerContext
/**
* Detects whether any values in context records have changed for given fields as tokens
* Returns list of SObject records that have changes in the specified fields
*
* @param fieldTokens
*
* @return
**/
public List<SObject> getChangedRecords(Set<Schema.SObjectField> fieldTokens)
{
@@ -200,6 +219,8 @@ public virtual inherited sharing class fflib_TriggerContext
/**
* Provides access to Trigger.oldMap or the mock when configured in a unit-test
*
* @return
**/
public Map<Id, SObject> getExistingRecords()
{
@@ -34,7 +34,7 @@ public virtual with sharing class fflib_TriggerHandler
/**
* Retains the trigger tracking configuration used for each domain
**/
**/
private static Map<Type, fflib_SObjectDomain.TriggerEvent> triggerEventByClass;
private static Boolean disabled = false;
@@ -90,7 +90,7 @@ public virtual with sharing class fflib_TriggerHandler
public static fflib_SObjectDomain.TriggerEvent getTriggerEvent(Type triggerActionClass)
{
if(!triggerEventByClass.containsKey(triggerActionClass))
if (!triggerEventByClass.containsKey(triggerActionClass))
{
triggerEventByClass.put(triggerActionClass, new fflib_SObjectDomain.TriggerEvent());
}
@@ -191,7 +191,7 @@ public virtual with sharing class fflib_TriggerHandler
for (fflib_TriggerAction__mdt action : selector.selectAllActive())
{
configs.add( new fflib_TriggerActionConfig(action));
configs.add(new fflib_TriggerActionConfig(action));
}
}
@@ -30,31 +30,49 @@
public interface fflib_ITriggerContext
{
/**
* Detects whether any values in context records have changed for given field as string
* Returns list of SObject records that have changes in the specified fields
**/
* Detects whether any values in context records have changed for given field as string
* Returns list of SObject records that have changes in the specified fields
*
* @param fieldName
*
* @return
**/
List<SObject> getChangedRecords(String fieldName);
/**
* Detects whether any values in context records have changed for given fields as strings
* Returns list of SObject records that have changes in the specified fields
**/
* Detects whether any values in context records have changed for given fields as strings
* Returns list of SObject records that have changes in the specified fields
*
* @param fieldNames
*
* @return
**/
List<SObject> getChangedRecords(Set<String> fieldNames);
/**
* Detects whether any values in context records have changed for given field as token
* Returns list of SObject records that have changes in the specified fields
*
* @param fieldToken
*
* @return
**/
List<SObject> getChangedRecords(Schema.SObjectField fieldToken);
List<SObject> getChangedRecords(Schema.SObjectField fieldToken);
/**
* Detects whether any values in context records have changed for given fields as tokens
* Detects whether any values in context records have changed for given fields as tokens
* Returns list of SObject records that have changes in the specified fields
*
* @param fieldTokens
*
* @return
**/
List<SObject> getChangedRecords(Set<Schema.SObjectField> fieldTokens);
/**
* Provides access to Trigger.oldMap or the mock when configured in a unit-test
*
* @return
**/
Map<Id, SObject> getExistingRecords();
@@ -64,8 +82,10 @@ public interface fflib_ITriggerContext
System.TriggerOperation getTriggerOperation();
/**
* Provides access to the data represented by this Trigger Context
**/
* Provides access to the data represented by this Trigger Context
*
* @return
**/
List<SObject> getRecords();
/**