public class CustomFieldCreator {
// Create a single custom field
public static void createCustomField(String objectName, String fieldName, String label, String type, Integer length, String description) {
MetadataService.MetadataPort service = createMetadataService();
MetadataService.CustomField customField = new MetadataService.CustomField();
customField.fullName = objectName + '.' + fieldName;
customField.label = label;
customField.type_x = type;
customField.length = length;
customField.description = description;
if (type == 'Picklist') {
customField.valueSet = new MetadataService.ValueSet();
customField.valueSet.valueSetDefinition = new MetadataService.ValueSetValuesDefinition();
customField.valueSet.valueSetDefinition.value = new List<MetadataService.CustomValue>();
}
List<MetadataService.SaveResult> results = service.createMetadata(new List<MetadataService.Metadata> { customField });
handleSaveResults(results);
}
// Add field permissions
public static void addFieldPermission(String profileName, String objectName, String fieldName, Boolean readable, Boolean editable) {
MetadataService.MetadataPort service = createMetadataService();
MetadataService.Profile profile = (MetadataService.Profile) service.readMetadata('Profile', new String[] { profileName }).getRecords()[0];
MetadataService.ProfileFieldLevelSecurity fieldPermission = new MetadataService.ProfileFieldLevelSecurity();
fieldPermission.field = objectName + '.' + fieldName;
fieldPermission.readable = readable;
fieldPermission.editable = editable;
if (profile.fieldPermissions == null) {
profile.fieldPermissions = new List<MetadataService.ProfileFieldLevelSecurity>();
}
profile.fieldPermissions.add(fieldPermission);
List<MetadataService.SaveResult> results = service.updateMetadata(new List<MetadataService.Metadata> { profile });
handleSaveResults(results);
}
// Add validation rule
public static void addValidationRule(String objectName, String ruleName, String errorCondition, String errorMessage, String errorLocation) {
MetadataService.MetadataPort service = createMetadataService();
MetadataService.CustomObject customObject = (MetadataService.CustomObject) service.readMetadata('CustomObject', new String[] { objectName }).getRecords()[0];
MetadataService.ValidationRule validationRule = new MetadataService.ValidationRule();
validationRule.fullName = objectName + '.' + ruleName;
validationRule.active = true;
validationRule.errorConditionFormula = errorCondition;
validationRule.errorMessage = errorMessage;
validationRule.errorDisplayField = errorLocation;
if (customObject.validationRules == null) {
customObject.validationRules = new List<MetadataService.ValidationRule>();
}
customObject.validationRules.add(validationRule);
List<MetadataService.SaveResult> results = service.updateMetadata(new List<MetadataService.Metadata> { customObject });
handleSaveResults(results);
}
// Helper method to create MetadataService instance
private static MetadataService.MetadataPort createMetadataService() {
MetadataService.MetadataPort service = new MetadataService.MetadataPort();
service.SessionHeader = new MetadataService.SessionHeader_element();
service.SessionHeader.sessionId = UserInfo.getSessionId();
return service;
}
// Helper method to handle save results
private static void handleSaveResults(List<MetadataService.SaveResult> results) {
for (MetadataService.SaveResult result : results) {
if (result.success) {
System.debug('Operation successful: ' + result.fullName);
} else {
for (MetadataService.Error error : result.errors) {
System.debug('Error: ' + error.message);
}
}
}
}
}