Кто-нибудь использовал ESAPI?
Кто-нибудь использовал [url=https://code.google.com/p/force-dot-com-esapi/]ESAPI[/url]?
Использовал, потом отказался. Если нужно могу скинуть пару методов, которые заменяют очень много кода из этого пакета.
[quote="Gres"]Кто-нибудь использовал [url=https://code.google.com/p/force-dot-com-esapi/]ESAPI[/url]?[/quote] Использовал, потом отказался. Если нужно могу скинуть пару методов, которые заменяют очень много кода из этого пакета.
[quote="wilder"]Использовал, потом отказался. Если нужно могу скинуть пару методов, которые заменяют очень много кода из этого пакета.[/quote] Скинь, если не сложно.
Код рабочий, но сыроват. Я в итоге отказался от него. Просто генерю 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);
}
}
[quote="Gres"][quote="wilder"]Использовал, потом отказался. Если нужно могу скинуть пару методов, которые заменяют очень много кода из этого пакета.[/quote] Скинь, если не сложно.[/quote] Код рабочий, но сыроват. Я в итоге отказался от него. Просто генерю exception если что-то пошло не так. [code] 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); } } [/code]