Кто-нибудь использовал ESAPI?
Использовал, потом отказался. Если нужно могу скинуть пару методов, которые заменяют очень много кода из этого пакета.
Код рабочий, но сыроват. Я в итоге отказался от него. Просто генерю exception если что-то пошло не так.
public static map<string,Schema.SObjectField> CheckFls(sObject sObj) {
map<string,Schema.SObjectField> UsedField = new map<string,Schema.SObjectField>();
if (sObj == null) return UsedField;
map<string,Schema.SObjectField> FieldsList = sObj.getSObjectType().getDescribe().fields.getMap();
JSONParser parser = JSON.createParser(JSON.serialize(sObj));
parser.nextToken(); parser.nextToken(); parser.nextToken(); parser.nextToken(); while (parser.nextToken() != null) {
if (parser.getCurrentToken() == JSONToken.FIELD_NAME) {
String fieldName = parser.getCurrentName().toLowerCase();
if (FieldsList.get(fieldName)!=null) UsedField.put(fieldName,FieldsList.get(fieldName));
parser.nextToken();
}
}
return UsedField;
}
public boolean isDML(sObject sObj,string Action) {
boolean Res=true;
if (sObj ==null) return Res;
if (Action == 'del') return sObj.getsObjectType().getDescribe().isDeletable();
map<string,Schema.SObjectField> UsedField = CheckFls(sObj);
for (string Key:UsedField.keyset()) {
Debug = Key + ' '+UsedField.get(Key);
Schema.DescribeFieldResult DescRes = UsedField.get(Key).getDescribe();
boolean Result = (Action == 'ins')
? DescRes.isCreateable()
: (Action == 'upd')
? DescRes.isUpdateable()
: (Action == 'ups') // не работает для sObject
? DescRes.isCreateable() && DescRes.isUpdateable()
: DescRes.isAccessible();
if ((Action == 'upd' || Action == 'ups' )&& DescRes.isDefaultedOnCreate()) Result = true;
if (!Result) {
Res=false;
Debug = 'FLS: '+Key;
break;
}
}
return Res;
}
public void DML(sObject sObj,string Action, Boolean DelFromRecycle) {
if (!isDML(sObj, Action) || Util.isEmpty(Action)) {
throw new CoreException(null,Core.ExceptionType.FIELD_ACCESS_VIOLATION,LogEx);
}
try {
if (Action == 'ins') insert sObj;
else if (Action == 'upd') update sObj;
else if (Action == 'ups') upsert sObj;
else if (Action == 'del') {
delete sObj;
if (DelFromRecycle) Database.emptyRecycleBin(new Id[]{sObj.Id});
}
else {
Debug = 'DML: Unknown DML operation ['+Action+']';
}
Debug = 'DML: '+Action+' '+sObj.Id;
} catch (Exception E) {
throw new CoreException(E,Core.ExceptionType.GENERIC,LogEx);
}
}
public void DML(sObject[] sObj,string Action, Boolean DelFromRecycle) {
if (!isDML(sObj[0], Action) || Util.isEmpty(Action))
throw new CoreException(null,Core.ExceptionType.FIELD_ACCESS_VIOLATION,LogEx);
try {
if (Action == 'ins') insert sObj;
else if (Action == 'upd') update sObj;
else if (Action == 'ups') upsert sObj; // не работает вообще, нужно передавать тип объекта
else if (Action == 'del') {
sObject[] Tmp = new sObject[]{};
Id[] RecycleId = new Id[]{};
for (sObject s: sObj){
// Thanks SALESFORCE !!! with 10 sObject;
RecycleId.add(S.Id);
if (Tmp.size()==10) {
delete Tmp;
Tmp = new sObject[]{};
} else {
Tmp.add(s);
}
}
delete Tmp;
if (DelFromRecycle) Database.emptyRecycleBin(RecycleId);
} else {
Debug = 'DML: Unknown DML operation ['+Action+']';
}
Debug = 'DML: '+Action+' '+Util.CreateSetId(sObj,'id');
} catch (Exception E) {
throw new CoreException(E,Core.ExceptionType.GENERIC,LogEx);
}
}