public without sharing class SObjectHelper {
|
|
/**
|
* Copy every field values from from_sobj to to_sobj, if the field is in to_sobj and the value is not null
|
*/
|
public static void MergeValue(Sobject to_sobj,Sobject from_sobj)
|
{
|
CopyTo(to_sobj,from_sobj,true);
|
}
|
|
/**
|
* Copy every field values from from_sobj to to_sobj
|
*/
|
public static void OverwriteValue(Sobject to_sobj,Sobject from_sobj)
|
{
|
CopyTo(to_sobj,from_sobj,false);
|
}
|
|
static void CopyTo(Sobject to_sobj,Sobject from_sobj, Boolean skip_from_null)
|
{
|
Map<String, Schema.SObjectField> to_sobj_map = GetFields(to_sobj.getSObjectType().getDescribe().getName());
|
Map<String, Schema.SObjectField> from_sobj_map = GetFields(from_sobj.getSObjectType().getDescribe().getName());
|
for (string field : from_sobj_map.keySet()) {
|
|
object obj = from_sobj.get(field);
|
object obj1 = to_sobj.get(field);
|
|
if (obj != obj1 && to_sobj_map.containsKey(field) && to_sobj_map.get(field).getDescribe().isUpdateable()) {
|
|
if (obj != null || !skip_from_null) {
|
System.debug('obj='+obj);
|
System.debug('obj1='+obj1);
|
to_sobj.put(field, obj);
|
}
|
}
|
}
|
}
|
|
|
|
|
private static Map<string,Map<String, Schema.SObjectField>> sobject_field_map = new Map<string,Map<String, Schema.SObjectField>>();
|
|
public static Map<String, Schema.SObjectField> GetFieldMap(string obj_name)
|
{
|
Map<String, Schema.SObjectField> fm = null;
|
if(string.isBlank(obj_name))return fm;
|
|
if(sobject_field_map.containsKey(obj_name))
|
{
|
fm = sobject_field_map.get(obj_name);
|
}
|
else
|
{
|
fm = GetFields(obj_name);
|
if (fm != null) {
|
sobject_field_map.put(obj_name, fm);
|
}
|
}
|
return fm;
|
}
|
/*
|
private static Map<string,Set<string>> sobject_common_fields = new Map<string,Set<string>>();
|
|
// get sobject fields that not be assigned in FieldPermission, they were stardard fields
|
public static Set<string> GetCommonFields(string obj_name)
|
{
|
Set<string> fields = null;
|
if(string.isBlank(obj_name))return fields;
|
|
if(sobject_common_fields.containsKey(obj_name))
|
{
|
fields = sobject_common_fields.get(obj_name);
|
}
|
else
|
{
|
Map<String, Schema.SObjectField> all_fields = GetFieldMap(obj_name);
|
Id profile_id = UserUtility.GetSysAdminProfileId();
|
List<FieldPermissions> lfp = [SELECT Id, ParentId, SobjectType, Field, PermissionsEdit, PermissionsRead, SystemModstamp FROM FieldPermissions
|
where parentId in (select id from permissionset where PermissionSet.Profile.Id = :profile_id) and sobjecttype = :obj_name ];
|
Set<string> admin_s = new Set<string>();
|
|
for(FieldPermissions fp : lfp)
|
{
|
if(fp.PermissionsRead)
|
{
|
admin_s.add(fp.Field.replace(fp.SobjectType+'.',''));
|
}
|
}
|
|
// if a field not in admin's permission, the field is a common(standard) field
|
for (string f : all_fields.keySet()) {
|
if (!admin_s.contains(f) && !f.endsWith('__c')) {
|
if (fields == null) {
|
fields = new Set<string>();
|
}
|
fields.add(f);
|
}
|
}
|
|
if (fields != null) {
|
sobject_common_fields.put(obj_name, fields);
|
}
|
}
|
return fields;
|
}
|
|
public static Set<string> GetCurrentProfileAccessableFields(string obj_name)
|
{
|
return GetProfileAccessableFields(UserInfo.getProfileId(), obj_name);
|
}
|
|
private static Map<Id,Map<string,List<FieldPermissions>>> profile_field_permission_buffer = new Map<Id,Map<string,List<FieldPermissions>>>();
|
|
public static Set<string> GetProfileAccessableFields(Id profile_id, string obj_name)
|
{
|
List<FieldPermissions> lfp = null;
|
if(!profile_field_permission_buffer.containsKey(profile_id) || !profile_field_permission_buffer.get(profile_id).containsKey(obj_name)){
|
lfp = [SELECT Id, ParentId, SobjectType, Field, PermissionsEdit, PermissionsRead, SystemModstamp FROM FieldPermissions
|
where parentId in (select id from permissionset where PermissionSet.Profile.Id = :profile_id) and sobjecttype = :obj_name ];
|
system.debug(string.format('profile {0} object {1} updated ', new object[]{profile_id,obj_name,lfp.size()}));
|
|
Map<string,List<FieldPermissions>> temp = null;
|
if(profile_field_permission_buffer.containsKey(profile_id))
|
{
|
temp = profile_field_permission_buffer.get(profile_id);
|
}
|
else{
|
temp = new Map<string,List<FieldPermissions>>();
|
profile_field_permission_buffer.put(profile_id,temp);
|
}
|
|
temp.put(obj_name,lfp);
|
}
|
else{
|
lfp = profile_field_permission_buffer.get(profile_id).get(obj_name);
|
}
|
Set<string> ls = new Set<string>();
|
for(FieldPermissions fp : lfp)
|
{
|
if(fp.PermissionsRead)
|
{
|
ls.add(fp.Field.replace(fp.SobjectType+'.',''));
|
}
|
}
|
|
Set<string> css = GetCommonFields(obj_name);
|
if (css != null) {
|
ls.addAll(css);
|
}
|
|
return ls;
|
}*/
|
|
public static Map<string,FieldInfo> GetFieldInfos(string obj_name)
|
{
|
Map<string,Schema.SObjectField> fields_map = SObjecthelper.GetFieldMap(obj_name);
|
if(fields_map == null)
|
{
|
return null;
|
}
|
Map<string,FieldInfo> res = new Map<string,FieldInfo>();
|
Map<string,FieldInfo> result = new Map<string,FieldInfo>();
|
FieldInfo temp = null;
|
for(string s : fields_map.keySet())
|
{
|
|
Schema.DescribeFieldResult dfr = fields_map.get(s).getDescribe();
|
temp = new FieldInfo();
|
temp.Name = dfr.getName();
|
temp.Label = dfr.getLabel();
|
|
// resolve 'Business Phone' bug
|
if(obj_name.toLowerCase() == 'contact' && temp.Name =='Phone' && temp.Label =='Business Phone'){
|
temp.Label = 'Phone';
|
}
|
|
Schema.DisplayType dt = dfr.getType();
|
temp.TypeEnumName = dt.name();
|
|
|
//temp.DisplayType = dt;
|
if((dt == schema.DisplayType.MULTIPICKLIST) || (dt == schema.DisplayType.PICKLIST) )
|
{
|
temp.Options = new List<Option>();
|
List<Schema.PicklistEntry> pick_list_values = dfr.getPickListValues();
|
for (Schema.PicklistEntry a : pick_list_values) {
|
if (!a.isActive()) {
|
continue;
|
}
|
|
Option lv = new Option();
|
lv.label = a.getLabel();
|
lv.value = a.getValue();
|
temp.Options.add(lv);
|
}
|
}
|
|
if(dt == schema.DisplayType.REFERENCE )
|
{
|
temp.References = new List<Option>();
|
for(Schema.SObjectType reference : dfr.getReferenceTo()) {
|
System.debug('Lookup reference object name: ' + reference.getDescribe().getName());
|
System.debug('Lookup reference object label: ' + reference.getDescribe().getLabel());
|
Option lv = new Option();
|
lv.label = reference.getDescribe().getLabel();
|
lv.value = reference.getDescribe().getName();
|
temp.References.add(lv);
|
}
|
List<Schema.PicklistEntry> pick_list_values = dfr.getPickListValues();
|
for (Schema.PicklistEntry a : pick_list_values) {
|
if (!a.isActive()) {
|
continue;
|
}
|
|
|
}
|
}
|
|
res.put(s,temp);
|
}
|
|
return res;
|
}
|
|
public static Map<String, Schema.SObjectField> GetFields(Sobject sobj ){
|
return GetFields(sobj.getSObjectType().getDescribe().getName());
|
}
|
|
public static Map<String, Schema.SObjectField> GetFields(string obj_name )
|
{
|
Map<String, Schema.SObjectType> mss = Schema.getGlobalDescribe();
|
if(mss.containsKey(obj_name)){
|
return Transform(mss.get(obj_name).getDescribe().fields.getMap());
|
}
|
else{
|
return null;
|
}
|
}
|
|
public static Map<String, Schema.FieldSet> GetFieldSets(string obj_name )
|
{
|
Map<String, Schema.SObjectType> mss = Schema.getGlobalDescribe();
|
if(!mss.containsKey(obj_name))return null;
|
Map<String, Schema.FieldSet> mssfs = mss.get(obj_name).getDescribe().fieldSets.getMap();
|
return mssfs;
|
}
|
|
public static Map<String, Schema.FieldSetMember> GetFieldSet(string obj_name,string field_set_name )
|
{
|
Map<String, Schema.FieldSet> mssfs = GetFieldSets(obj_name);
|
if(!mssfs.containsKey(field_set_name))return null;
|
Map<String, Schema.FieldSetMember> result = new Map<String, Schema.FieldSetMember>();
|
for(Schema.FieldSetMember member : mssfs.get(field_set_name).getFields()){
|
Schema.SObjectField ssf = member.getSObjectField();
|
result.put(ssf.getDescribe().getName(),member);
|
}
|
return result;
|
}
|
|
static Map<String, Schema.SObjectField> Transform(Map<String, Schema.SObjectField> mssof){
|
if(mssof == null)return null;
|
Map<String, Schema.SObjectField> result = new Map<String, Schema.SObjectField>();
|
for(string key : mssof.keySet()){
|
result.put(mssof.get(key).getDescribe().getName(),mssof.get(key));
|
}
|
return result;
|
}
|
/*
|
static Map<String, Schema.FieldSet> Transform(Map<String, Schema.FieldSet> mssfs){
|
if(mssfs == null)return null;
|
Map<String, Schema.FieldSet> result = new Map<String, Schema.FieldSet>();
|
for(string key : mssfs.keySet()){
|
result.put(mssfs.get(key).getName(),mssfs.get(key));
|
}
|
return result;
|
}*/
|
|
public static Map<string,string> GetPicklistLabelValueMap(string objectName, string fieldName){
|
|
List<Schema.PicklistEntry> temp = GetPicklistEntryList(objectName,fieldName);
|
if(temp == null)return null;
|
|
Map<string,string> res = new Map<string,string>();
|
|
for(Schema.PicklistEntry pe : temp){
|
res.put(pe.getLabel(),pe.getValue());
|
}
|
return res;
|
}
|
|
public static Map<string,string> GetPicklistValueLabelMap(string objectName, string fieldName){
|
|
List<Schema.PicklistEntry> temp = GetPicklistEntryList(objectName,fieldName);
|
if(temp == null)return null;
|
|
Map<string,string> res = new Map<string,string>();
|
|
for(Schema.PicklistEntry pe : temp){
|
res.put(pe.getValue(),pe.getLabel());
|
}
|
return res;
|
}
|
|
public static List<Schema.PicklistEntry> GetPicklistEntryList(string objectName, string fieldName){
|
|
Map<String,String> picklistMap = new Map<String,String>();
|
Schema.SObjectType targetSobjectType = Schema.getGlobalDescribe().get(objectName);
|
Schema.DescribeSObjectResult objectDescribe = targetSobjectType.getDescribe();
|
Map<String, Schema.SObjectField> fieldMap = objectDescribe.fields.getMap();
|
if(!fieldMap.containsKey(fieldName))return null;
|
List<Schema.PicklistEntry> picklistEntries = fieldMap.get(fieldName).getDescribe().getPickListValues();
|
return picklistEntries;
|
}
|
|
|
|
|
|
|
public static string GetFieldDescription(string object_name, string field_name){
|
|
if(string.isBlank(object_name) || String.isBlank(field_name))return null;
|
|
// List<FieldDefinition> fd = [Select Label, QualifiedApiName, Description from FieldDefinition Where EntityDefinition.QualifiedApiName=:object_name and QualifiedApiName=:field_name];
|
List<FieldDefinition> fds = GetFieldDefinitions(object_name);
|
for(FieldDefinition fd : fds)
|
{
|
if(fd.QualifiedApiName == field_name){
|
return fd.Description;
|
}
|
}
|
return null;
|
}
|
|
public static List<FieldDefinition> GetFieldDefinitions(string object_name){
|
return [Select Label, QualifiedApiName, Description from FieldDefinition Where EntityDefinition.QualifiedApiName=:object_name];
|
}
|
|
/*
|
public static Schema.FieldSet GetFieldSet(string obj_name,string fieldset_name )
|
{
|
Map<String, Schema.FieldSet> msf = GetFieldSets(obj_name);
|
if(msf.containsKey(fieldset_name))return msf.get(fieldset_name);
|
return null;
|
}
|
|
public static Schema.FieldSet GetFieldSetByName(string obj_name,string fieldset_name )
|
{
|
Map<String, Schema.FieldSet> msf = GetFieldSets(obj_name);
|
for(string key : msf.keyset())
|
{
|
if(msf.get(key).getName() == fieldset_name )
|
{
|
return msf.get(key);
|
}
|
}
|
return null;
|
}*/
|
|
|
/**
|
* get sobject field value, support forign field if it was queried
|
* e.g. GetSObjectField(lead_obj,'Owner.Name')
|
*/
|
public static object GetSObjectField(object o,string f_str){
|
return GetSObjectField((sobject)o,f_str);
|
}
|
|
/**
|
* get sobject field value, support forign field if it was queried
|
* e.g. GetSObjectField(lead_obj,'Owner.Name')
|
*/
|
public static object GetSObjectField(sobject o,string f_str){
|
List<string> fields = f_str.split('\\.');
|
//system.debug('fields = ' + fields);
|
sobject temp = o;
|
Object result = null;
|
for(integer i =0; i < fields.size();i++){
|
|
if(temp == null) return null;
|
|
if(i==fields.size()-1){
|
result = temp.get(fields[i]);
|
}
|
else{
|
temp = temp.getSObject(fields[i]);
|
}
|
|
/*
|
if(result instanceof SObject){
|
temp = (SObject)result;
|
continue;
|
}
|
break;*/
|
}
|
|
return result;
|
}
|
|
/*
|
public static Schema.FieldSet GetFieldSetByLabel(string obj_name,string fieldset_lable )
|
{
|
Map<String, Schema.FieldSet> msf = GetFieldSets(obj_name);
|
for(string key : msf.keyset())
|
{
|
if(msf.get(key).getLabel() == fieldset_lable )
|
{
|
return msf.get(key);
|
}
|
}
|
return null;
|
}*/
|
|
public static List<string> GetMultiPickListOptions(string val){
|
return GetOptions(val);
|
}
|
|
public static List<string> GetOptions(string val){
|
if(val == null)return new List<string>();
|
return ValidMultiPickListValue(val).split(';');
|
}
|
|
public static string AppendValueToMultiPickList(string old_val,string val){
|
return ValidMultiPickListValue(old_val+';'+val);
|
}
|
|
public static string ValidMultiPickListValue( string val ){
|
if(string.isBlank(val))return val;
|
return ValidMultiPickListValue(val.split(';'));
|
}
|
|
public static string ValidMultiPickListValue( List<string> vals ){
|
if(vals == null ) vals = new List<string>();
|
Set<string> ss = new Set<string>(vals);
|
List<string> ls = new List<string>();
|
for(string s : ss){
|
if(string.isBlank(s)){
|
continue;
|
}
|
ls.add(s);
|
}
|
return string.join(ls, ';');
|
}
|
}
|