certinia/apex-mdapi

IO exception error when setting field security settings

RandyTrigg opened this issue · 3 comments

Hi there,

I'm a total newbie to the MetadataService class, and excited by its possibilities. After downloading the class from github into a sandbox, I wrote a method to make fields editable following the advice in https://developer.salesforce.com/forums/ForumsMain?id=906F0000000AVifIAG

I get this error: System.CalloutException: IO Exception: Read timed out

I'm betting there's some bit of setup that I haven't done. Here's my code. Anyone see anything obviously wrong (I've tried changing the p.custom setting to true and leaving it out altogether to no avail)?

public static void makeFieldsEditable (String[] profileNames, String[] fieldNames) {
    MetadataService.MetadataPort service = createService();
    List<MetadataService.Profile> profiles = new List<MetadataService.Profile>();
    for (String pName : profileNames) {
        MetadataService.Profile p = new MetadataService.Profile();
        p.fullName = pName;
        p.custom = false;
        p.fieldPermissions = new List<MetadataService.ProfileFieldLevelSecurity>();
        for (String fName : fieldNames) {
            MetadataService.ProfileFieldLevelSecurity fSec = new MetadataService.ProfileFieldLevelSecurity();
            fSec.field = fName;
            fSec.editable = true;
            p.fieldPermissions.add(fSec);
        }
        profiles.add(p);
    }
    List<MetadataService.SaveResult> results = service.updateMetadata(profiles);
    handleSaveResults(results[0]);
}

Thanks!

  • Randy Trigg

Oops - I should have researched that error before submitting an issue. I see now that I needed to increase the timeout value for the webservices callout that MetadataService makes to compute results. And it's easy to do that using the handy timeout__x field of the MetadataPort class. I modified createService like so, and all is well:

    public static MetadataService.MetadataPort createService()
    { 
        MetadataService.MetadataPort service = new MetadataService.MetadataPort();
        service.SessionHeader = new MetadataService.SessionHeader_element();
        service.SessionHeader.sessionId = UserInfo.getSessionId();
        service.timeout_x = 40000;
        return service;     
    }    

Awesome work, i've referenced this as a known issue and resolution in the readme!

Thanks so much @RandyTrigg This was all I needed to past the blocker