Sunteți pe pagina 1din 26

2/10/2018 apex-mdapi/MetadataServiceExamples.

cls at master · financialforcedev/apex-mdapi · GitHub

financialforcedev / apex-mdapi

Branch: master apex-mdapi / apex-mdapi / src / classes / MetadataServiceExamples.cls Find file Copy path

Andrew Fawcett Added new sample on updating a Dashboard 323bc72 on Dec 5, 2016

3 contributors

1714 lines (1548 sloc) 77.3 KB

1 /**
2 * Copyright (c) 2012, FinancialForce.com, inc
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * - Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * - Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * - Neither the name of the FinancialForce.com, inc nor the names of its contributors
14 * may be used to endorse or promote products derived from this software without
15 * specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
20 * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 **/
26
27 /**
28 * This file demonstrates how to call the Salesforce Metadata API from Apex
29 * for warnings, limits and further todos of this approach please review the readme
30 * at https://github.com/financialforcedev/apex-mdapi for more information
31 **/
32
33 public with sharing class MetadataServiceExamples
34 {
35 public static void createObject()
36 {
37 MetadataService.MetadataPort service = createService();
38 MetadataService.CustomObject customObject = new MetadataService.CustomObject();
39 customObject.fullName = 'Test__c';
40 customObject.label = 'Test';
41 customObject.pluralLabel = 'Tests';
42 customObject.nameField = new MetadataService.CustomField();
43 customObject.nameField.type_x = 'Text';
44 customObject.nameField.label = 'Test Record';
45 customObject.deploymentStatus = 'Deployed';
46 customObject.sharingModel = 'ReadWrite';
47 List<MetadataService.SaveResult> results =
48 service.createMetadata(
49 new MetadataService.Metadata[] { customObject });
50 handleSaveResults(results[0]);
51 }
52
53 public static void upsertObject()
54 {

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 1/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
55 MetadataService.MetadataPort service = createService();
56 MetadataService.CustomObject customObject = new MetadataService.CustomObject();
57 customObject.fullName = 'Test__c';
58 customObject.label = 'Test';
59 customObject.pluralLabel = 'Tests Upsert';
60 customObject.nameField = new MetadataService.CustomField();
61 customObject.nameField.type_x = 'Text';
62 customObject.nameField.label = 'Test Record Upsert';
63 customObject.deploymentStatus = 'Deployed';
64 customObject.sharingModel = 'ReadWrite';
65 List<MetadataService.UpsertResult> results =
66 service.upsertMetadata(
67 new MetadataService.Metadata[] { customObject });
68 handleUpsertResults(results[0]);
69 }
70
71 public static void createLookupField()
72 {
73 MetadataService.MetadataPort service = createService();
74 MetadataService.CustomField customField = new MetadataService.CustomField();
75 customField.fullName = 'Test__c.LookupField__c';
76 customField.label = 'Lookup Field';
77 customField.type_x = 'Lookup';
78 customField.relationshipLabel = 'Tests';
79 customField.relationshipName = 'Tests';
80 customField.referenceTo = 'Test__c';
81 List<MetadataService.SaveResult> results =
82 service.createMetadata(
83 new MetadataService.Metadata[] { customField });
84 handleSaveResults(results[0]);
85 }
86
87 public static void createExternalField()
88 {
89 MetadataService.MetadataPort service = createService();
90 MetadataService.CustomField customField = new MetadataService.CustomField();
91 customField.fullName = 'Test__c.ExternalField__c';
92 customField.label = 'External Field';
93 customField.type_x = 'Text';
94 customField.length = 42;
95 customField.externalId = true;
96 List<MetadataService.SaveResult> results =
97 service.createMetadata(
98 new MetadataService.Metadata[] { customField });
99 handleSaveResults(results[0]);
100 }
101
102 public static void createLongTextAreaField()
103 {
104 MetadataService.MetadataPort service = createService();
105 MetadataService.CustomField customField = new MetadataService.CustomField();
106 customField.fullName = 'Test__c.LongTextAreaField__c';
107 customField.label = 'Long Text Area Field';
108 customField.type_x = 'LongTextArea';
109 customField.length = 32000;
110 customField.visibleLines = 3;
111 List<MetadataService.SaveResult> results =
112 service.createMetadata(
113 new MetadataService.Metadata[] { customField });
114 handleSaveResults(results[0]);
115 }
116
117 public static void createField()
118 {
119 MetadataService.MetadataPort service = createService();
120 MetadataService.CustomField customField = new MetadataService.CustomField();
121 customField.fullName = 'Test__c.TestField__c';

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 2/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
122 customField.label = 'Test Field';
123 customField.type_x = 'Text';
124 customField.length = 42;
125 List<MetadataService.SaveResult> results =
126 service.createMetadata(
127 new MetadataService.Metadata[] { customField });
128 handleSaveResults(results[0]);
129 }
130
131 public static void deleteField()
132 {
133 MetadataService.MetadataPort service = createService();
134 List<MetadataService.DeleteResult> results =
135 service.deleteMetadata(
136 'CustomField', new String[] { 'Test__c.TestField__c' });
137 handleDeleteResults(results[0]);
138 }
139
140 public static void updateField()
141 {
142 MetadataService.MetadataPort service = createService();
143 MetadataService.CustomField customField = new MetadataService.CustomField();
144 customField.fullName = 'Test__c.TestField__c';
145 customField.label='New Test Field Label';
146 customField.type_x = 'Text';
147 customField.length = 52;
148 List<MetadataService.SaveResult> results =
149 service.updateMetadata(
150 new MetadataService.Metadata[] { customField });
151 handleSaveResults(results[0]);
152 }
153
154 /**
155 * NOTE: Consider using Permission Sets, these can also be created and assignd with DML in Apex
156 **/
157 public static void updateFieldLevelSecurity()
158 {
159 MetadataService.MetadataPort service = createService();
160 MetadataService.Profile admin = new MetadataService.Profile();
161 admin.fullName = 'Admin';
162 admin.custom = false;
163 MetadataService.ProfileFieldLevelSecurity fieldSec = new MetadataService.ProfileFieldLevelSecurity();
164 fieldSec.field='Test__c.TestField__c';
165 fieldSec.editable=true;
166 admin.fieldPermissions = new MetadataService.ProfileFieldLevelSecurity[] {fieldSec} ;
167 List<MetadataService.SaveResult> results =
168 service.updateMetadata(
169 new MetadataService.Metadata[] { admin });
170 handleSaveResults(results[0]);
171 }
172
173 public static void updateTabVisibility()
174 {
175 MetadataService.MetadataPort service = createService();
176 MetadataService.Profile admin = (MetadataService.Profile) service.readMetadata('Profile', new String[] { 'Admin' }).getRecords()[0]
177 MetadataService.ProfileTabVisibility tabVis = new MetadataService.ProfileTabVisibility();
178 tabVis.tab = 'Test_Tab__c';
179 tabVis.visibility = 'Hidden';
180 admin.tabVisibilities = new MetadataService.ProfileTabVisibility[] {tabVis};
181 List<MetadataService.SaveResult> results =
182 service.updateMetadata(
183 new MetadataService.Metadata[] { admin });
184 handleSaveResults(results[0]);
185 }
186
187 public static void updateCustomApplication()
188 {

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 3/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
189 MetadataService.MetadataPort service = createService();
190 MetadataService.CustomApplication customApp = (MetadataService.CustomApplication) service.readMetadata('CustomApplication', new Str
191 customApp.defaultLandingTab = 'Test_Tab__c';
192 List<MetadataService.SaveResult> results =
193 service.updateMetadata(
194 new MetadataService.Metadata[] { customApp });
195
196 handleSaveResults(results[0]);
197 }
198
199 public static void createPage()
200 {
201 MetadataService.MetadataPort service = createService();
202 MetadataService.ApexPage apexPage = new MetadataService.ApexPage();
203 apexPage.apiVersion = 25;
204 apexPage.fullName = 'test';
205 apexPage.label = 'Test Page';
206 apexPage.content = EncodingUtil.base64Encode(Blob.valueOf('<apex:page/>'));
207 List<MetadataService.SaveResult> results =
208 service.createMetadata(
209 new MetadataService.Metadata[] { apexPage });
210 handleSaveResults(results[0]);
211 }
212
213 public static void createStaticResource()
214 {
215 MetadataService.MetadataPort service = createService();
216 MetadataService.StaticResource staticResource = new MetadataService.StaticResource();
217 staticResource.fullName = 'test';
218 staticResource.contentType = 'text';
219 staticResource.cacheControl = 'public';
220 staticResource.content = EncodingUtil.base64Encode(Blob.valueOf('Static stuff'));
221 List<MetadataService.SaveResult> results =
222 service.createMetadata(
223 new MetadataService.Metadata[] { staticResource });
224 handleSaveResults(results[0]);
225 }
226
227 public static void updateStaticResource()
228 {
229 MetadataService.MetadataPort service = createService();
230 MetadataService.StaticResource staticResource = new MetadataService.StaticResource();
231 staticResource.fullName = 'test';
232 staticResource.contentType = 'text';
233 staticResource.cacheControl = 'public';
234 staticResource.content = EncodingUtil.base64Encode(Blob.valueOf('Static stuff Changed'));
235 List<MetadataService.SaveResult> results =
236 service.updateMetadata(
237 new MetadataService.Metadata[] { staticResource });
238 handleSaveResults(results[0]);
239 }
240
241 public static void deleteStaticResource()
242 {
243 MetadataService.MetadataPort service = createService();
244 List<MetadataService.DeleteResult> results =
245 service.deleteMetadata(
246 'StaticResource', new String[] { 'test' });
247 handleDeleteResults(results[0]);
248 }
249
250 public static void createWebLink()
251 {
252 MetadataService.MetadataPort service = createService();
253 MetadataService.WebLink webLink = new MetadataService.WebLink();
254 webLink.fullName = 'Test__c.googleButton';
255 webLink.availability = 'online';

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 4/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
256 webLink.displayType = 'link';
257 webLink.encodingKey = 'UTF-8';
258 webLink.hasMenubar = false;
259 webLink.hasScrollbars = true;
260 webLink.hasToolbar = false;
261 webLink.height = 600;
262 webLink.isResizable = true;
263 webLink.linkType = 'url';
264 webLink.masterLabel = 'google';
265 webLink.openType = 'newWindow';
266 webLink.position = 'none';
267 webLink.protected_x = false;
268 webLink.showsLocation = false;
269 webLink.showsStatus = false;
270 webLink.url = 'http://www.google.com';
271 webLink.width = 600;
272 List<MetadataService.SaveResult> results =
273 service.createMetadata(
274 new MetadataService.Metadata[] { webLink });
275 handleSaveResults(results[0]);
276 }
277
278 public static void listMetadata()
279 {
280 MetadataService.MetadataPort service = createService();
281 List<MetadataService.ListMetadataQuery> queries = new List<MetadataService.ListMetadataQuery>();
282 MetadataService.ListMetadataQuery queryWorkflow = new MetadataService.ListMetadataQuery();
283 queryWorkflow.type_x = 'Workflow';
284 queries.add(queryWorkflow);
285 MetadataService.ListMetadataQuery queryValidationRule = new MetadataService.ListMetadataQuery();
286 queryValidationRule.type_x = 'ValidationRule';
287 queries.add(queryValidationRule);
288 MetadataService.ListMetadataQuery queryCustomField = new MetadataService.ListMetadataQuery();
289 queryCustomField.type_x = 'CustomField';
290 queries.add(queryCustomField);
291 MetadataService.FileProperties[] fileProperties = service.listMetadata(queries, 25);
292 for(MetadataService.FileProperties fileProperty : fileProperties)
293 System.debug(fileProperty.fullName);
294 }
295
296 public static void createPicklistField()
297 {
298 MetadataService.MetadataPort service = createService();
299 MetadataService.CustomField customField = new MetadataService.CustomField();
300 customField.fullName = 'Lead.picklist__c';
301 customField.label = 'picklist';
302 customField.type_x = 'Picklist';
303 metadataservice.Picklist pt = new metadataservice.Picklist();
304 pt.sorted= false;
305 metadataservice.PicklistValue one = new metadataservice.PicklistValue();
306 one.fullName= 'first';
307 one.default_x=false ;
308 pt.picklistValues = new List<MetadataService.PicklistValue>{one};
309 customField.picklist = pt ;
310 List<MetadataService.SaveResult> results =
311 service.createMetadata(
312 new MetadataService.Metadata[] { customField });
313 handleSaveResults(results[0]);
314 }
315
316 public static void updatePicklistField()
317 {
318 MetadataService.MetadataPort service = createService();
319 MetadataService.CustomField customField = new MetadataService.CustomField();
320 customField.fullName = 'Lead.picklist__c';
321 customField.label = 'picklist';
322 customField.type_x = 'Picklist';

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 5/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
323 metadataservice.Picklist pt = new metadataservice.Picklist();
324 pt.sorted= false;
325 metadataservice.PicklistValue two = new metadataservice.PicklistValue();
326 two.fullName= 'second';
327 two.default_x=false ;
328 metadataservice.PicklistValue three = new metadataservice.PicklistValue();
329 three.fullName= 'third';
330 three.default_x=false ;
331 pt.picklistValues = new list<metadataservice.PicklistValue>{two,three};
332 customField.picklist = pt ;
333 List<MetadataService.SaveResult> results =
334 service.updateMetadata(
335 new MetadataService.Metadata[] { customField });
336 handleSaveResults(results[0]);
337 }
338
339 /**
340 * Example of how to retrieve dependent picklist values
341 * when you are NOT using record types on the object.
342 * If using record types, please see other example getDependentPicklistValuesByRecordType().
343 *
344 * Setup:
345 * 1. In a dev org, create a field dependency on the Account object with Active__c picklist controlling values in CustomerPriority__c
346 * 1a. When Active__c = Yes then let CustomerPriority__c include High
347 * 1b. When Active__c = No then let CustomerPriority__c include Low
348 * 2. Verify intended behavior by creating a new account record via browser. When Active__c = Yes then CustomerPriority__c should all
349 * 3. Run the below example snippet to see that the same filtered picklist values come back
350 *
351 * https://github.com/financialforcedev/apex-mdapi/issues/93
352 * https://help.salesforce.com/HTViewHelpDoc?id=fields_defining_field_dependencies.htm
353 */
354 public static void getDependentPicklistValues()
355 {
356 // Create service
357 MetadataService.MetadataPort service = createService();
358
359 // Read Custom Field (dependent picklist)
360 MetadataService.CustomField customField = (MetadataService.CustomField) service.readMetadata(
361 'CustomField', new String[] { 'Account.CustomerPriority__c' }
362 ).getRecords()[0];
363
364 // At the end of this example, this list will contain only those picklist values
365 // that satisfy the picklist dependency of the controlling field's value.
366 // The controlling field is the 'Active__c' picklist field.
367 List<MetadataService.PicklistValue> filteredDependentValues = new List<MetadataService.PicklistValue>();
368
369 for ( MetadataService.PicklistValue picklistValue : customField.picklist.picklistValues ) {
370 // In this example the controlling field, Account.Active__c, has selected value of 'Yes'
371 // so if the PicklistValue entry we're iterating over right now is controlled by that value
372 // then we'll add it to our filtered list, otherwise we must ignore it.
373 // The controlling field value could come from other user input, hard code, etc...
374 String controllingFieldValue = 'Yes';
375 if ( ( picklistValue.controllingFieldValues == null ) || new Set<String>( picklistValue.controllingFieldValues ).contains( cont
376 filteredDependentValues.add( picklistValue );
377 }
378 }
379
380 System.debug( 'Filtered, Dependent Values = ' + filteredDependentValues );
381
382 }
383
384 /**
385 * Example of how to retrieve the dependent picklist values that are both:
386 * 1. Assigned to the record type, and
387 * 2. Have a dependency upon the specified value from the controlling field
388 *
389 * Setup:

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 6/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
390 * 1. In a dev org, create a field dependency on the Account object with Active__c picklist controlling values in CustomerPriority__c
391 * 1a. When Active__c = Yes then let CustomerPriority__c include High
392 * 1b. When Active__c = No then let CustomerPriority__c include Low
393 * 2. Create an Account record type called Record_Type_A and allow all values for Active__c be available but only allow CustomerPrior
394 * 3. Verify intended behavior by creating a new account record via browser. When Active__c = Yes then CustomerPriority__c should all
395 * 4. Run the below example snippet to see that the same filtered picklist values come back
396 *
397 * https://github.com/financialforcedev/apex-mdapi/issues/93
398 * https://help.salesforce.com/HTViewHelpDoc?id=fields_defining_field_dependencies.htm
399 */
400 public static void getDependentPicklistValuesByRecordType()
401 {
402 // Create service
403 MetadataService.MetadataPort service = createService();
404
405 // Read Custom Field (dependent picklist)
406 MetadataService.CustomField customField = (MetadataService.CustomField) service.readMetadata(
407 'CustomField', new String[] { 'Account.CustomerPriority__c' }
408 ).getRecords()[0];
409
410 // Print each picklist value
411 // At this point we will see every value assigned to this field
412 // regardless of record type or controlling field value
413 for ( MetadataService.PicklistValue pk : customField.picklist.picklistValues ) {
414 System.debug( pk );
415 }
416
417 // Read Record Type
418 MetadataService.RecordType recordType = (MetadataService.RecordType) service.readMetadata(
419 'RecordType', new String[] { 'Account.Record_Type_A' }
420 ).getRecords()[0];
421
422 System.debug( recordType );
423
424 // Build map of all picklist values by name configured for the field.
425 // This is necessary because only these references have the 'controllingFieldValues' property defined.
426 // When picklist values are retrieved via RecordType then this property is null, unfortunately.
427 Map<String, MetadataService.PicklistValue> picklistValuesMap = new Map<String, MetadataService.PicklistValue>();
428 for ( MetadataService.PicklistValue pk : customField.picklist.picklistValues ) {
429 picklistValuesMap.put( pk.fullName, pk );
430 }
431
432 System.debug( picklistValuesMap );
433
434 // At the end of this example, this list will contain only those picklist values
435 // that are both assigned to the RecordType and satisfy the
436 // picklist dependency of the controlling field's value.
437 // The controlling field is the 'Active__c' picklist field.
438 List<MetadataService.PicklistValue> filteredDependentValues = new List<MetadataService.PicklistValue>();
439
440 // Of all the picklist values setup for the Account.CustomerPriority__c field,
441 // iterate over the values explicitly assigned to the Account.Record_Type_A record type.
442 for ( MetadataService.RecordTypePicklistValue rpk : recordType.picklistValues ) {
443 if ( 'CustomerPriority__c' == rpk.picklist ) {
444 for ( MetadataService.PicklistValue pk : rpk.values ) {
445
446 // Since the Metadata API does not provide the 'controllingFieldValues' property
447 // on the PicklistValues of the RecordType metadata response, we must now look that data up
448 // from the map we built earlier of the PicklistValues of the CustomField metadata response
449 MetadataService.PicklistValue picklistValue = picklistValuesMap.get( pk.fullName );
450
451 // In this example the controlling field, Account.Active__c, has selected value of 'Yes'
452 // so if the PicklistValue entry we're iterating over right now is controlled by that value
453 // then we'll add it to our filtered list, otherwise we must ignore it.
454 // The controlling field value could come from other user input, hard code, etc...
455 String controllingFieldValue = 'Yes';
456 if ( ( picklistValue.controllingFieldValues == null ) || new Set<String>( picklistValue.controllingFieldValues ).contai

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 7/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
457 filteredDependentValues.add( picklistValue );
458 }
459
460 }
461 }
462 }
463
464 System.debug( 'Filtered, Dependent Values = ' + filteredDependentValues );
465
466 }
467
468 public static void createAddressSettings()
469 {
470 MetadataService.MetadataPort service = createService();
471 MetadataService.AddressSettings addressSettings = new MetadataService.AddressSettings();
472 addressSettings.fullName = 'Address';
473 addressSettings.countriesAndStates = new MetadataService.CountriesAndStates();
474 MetadataService.Country us = new MetadataService.Country();
475 us.active = true;
476 us.integrationValue = 'United States';
477 us.isoCode = 'US';
478 us.label = 'United States';
479 MetadataService.State stateAL = new MetadataService.State();
480 stateAL.active = true;
481 stateAL.integrationValue = 'Alabama';
482 stateAL.isoCode = 'AL';
483 stateAL.label = 'Alabama';
484 MetadataService.State stateAK = new MetadataService.State();
485 stateAK.active = true;
486 stateAK.integrationValue = 'Alaska';
487 stateAK.isoCode = 'AK';
488 stateAK.label = 'Alaska';
489 us.states = new List<MetadataService.State> { stateAL, stateAK };
490 addressSettings.countriesAndStates.countries = new List<MetadataService.Country> { us };
491 List<MetadataService.SaveResult> results =
492 service.createMetadata(
493 new MetadataService.Metadata[] { addressSettings });
494 handleSaveResults(results[0]);
495 }
496
497 public static void updateCaseSettings()
498 {
499 MetadataService.MetadataPort service = createService();
500 MetadataService.CaseSettings caseSettings = new MetadataService.CaseSettings();
501 caseSettings.fullName = 'Case';
502 caseSettings.notifyOwnerOnCaseComment = true;
503 List<MetadataService.SaveResult> results =
504 service.updateMetadata(
505 new MetadataService.Metadata[] { caseSettings });
506 handleSaveResults(results[0]);
507 }
508
509 public static void dynamicCreation(String objectName)
510 {
511 // Define Metadata item to create a Custom Object
512 MetadataService.CustomObject customObject = new MetadataService.CustomObject();
513 customObject.fullName = objectName + '__c';
514 customObject.label = objectName;
515 customObject.pluralLabel = objectName+'s';
516 customObject.nameField = new MetadataService.CustomField();
517 customObject.nameField.type_x = 'Text';
518 customObject.nameField.label = 'Test Record';
519 customObject.deploymentStatus = 'Deployed';
520 customObject.sharingModel = 'ReadWrite';
521
522 // Define Metadata item to create a Custom Field on the above object
523 MetadataService.CustomField customField1 = new MetadataService.CustomField();

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 8/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
524 customField1.fullName = objectName+'__c.TestField1__c';
525 customField1.label = 'Test Field 1';
526 customField1.type_x = 'Text';
527 customField1.length = 42;
528
529 // Define Metadata item to create a Custom Field on the above object
530 MetadataService.CustomField customField2 = new MetadataService.CustomField();
531 customField2.fullName = objectName+'__c.TestField2__c';
532 customField2.label = 'Test Field 2';
533 customField2.type_x = 'Text';
534 customField2.length = 42;
535
536 // Define Metadata item to create a Visualforce page to display the above field
537 MetadataService.ApexPage apexPage = new MetadataService.ApexPage();
538 apexPage.apiVersion = 25;
539 apexPage.fullName = objectName.toLowercase();
540 apexPage.label = objectName + ' Page';
541 apexPage.content = EncodingUtil.base64Encode(Blob.valueOf(
542 '<apex:page standardController=\''+objectName+'__c\'>'+
543 '{!' + objectName + '__c.TestField1__c}' +
544 '{!' + objectName + '__c.TestField2__c}' +
545 '</apex:page>'));
546
547 // Create components in the correct order
548 MetadataService.MetadataPort service = createService();
549 List<MetadataService.SaveResult> results =
550 service.createMetadata(
551 new MetadataService.Metadata[] { customObject });
552 handleSaveResults(results[0]);
553 results =
554 service.createMetadata(
555 new MetadataService.Metadata[] { customField1, customField2 });
556 handleSaveResults(results[0]);
557 handleSaveResults(results[1]);
558 results =
559 service.createMetadata(
560 new MetadataService.Metadata[] { apexPage });
561 handleSaveResults(results[0]);
562 }
563
564 public static void createRecordType()
565 {
566 MetadataService.RecordType recordType = new MetadataService.RecordType();
567 recordType.active = true;
568 recordType.fullName = 'Test__c.RecordTypeA';
569 recordType.label = 'Record Type A';
570 recordType.businessProcess = null;
571 recordType.description = 'My new record type';
572
573 MetadataService.MetadataPort service = createService();
574 List<MetadataService.SaveResult> results =
575 service.createMetadata(
576 new MetadataService.Metadata[] { recordType });
577 handleSaveResults(results[0]);
578 }
579
580 public static void deleteRecordType()
581 {
582 // Salesforce bug? The follow results in 'Cannot delete record type through API'
583 // yet the docs say otherwise, http://www.salesforce.com/us/developer/docs/api_meta/Content/meta_recordtype.htm
584 // 'For more information, see “Record Types Overview” in the Salesforce online help.
585 // Use this metadata type to create, update, or delete record type definitions for a custom object.'
586 MetadataService.RecordType recordType = new MetadataService.RecordType();
587 recordType.active = true;
588 recordType.fullName = 'Test__c.RecordTypeA';
589 MetadataService.MetadataPort service = createService();
590 List<MetadataService.DeleteResult> results =

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 9/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
591 service.deleteMetadata(
592 'RecordType', new String[] { 'Test__c.RecordTypeA' });
593 handleDeleteResults(results[0]);
594 }
595
596 public static void installPackages()
597 {
598 // Install packageA, then pacakgeB
599 MetadataService.InstalledPackage installedPackageA = new MetadataService.InstalledPackage();
600 installedPackageA.password = 'fred1234';
601 installedPackageA.versionNumber = '1.0';
602 installedPackageA.fullName = 'packagea';
603 MetadataService.InstalledPackage installedPackageB = new MetadataService.InstalledPackage();
604 installedPackageB.versionNumber = '1.0';
605 installedPackageB.fullName = 'packageb';
606
607 // Install the packages
608 MetadataService.MetadataPort service = createService();
609 List<MetadataService.SaveResult> results =
610 service.createMetadata(
611 new MetadataService.Metadata[] { installedPackageA, installedPackageB });
612 handleSaveResults(results[0]);
613 handleSaveResults(results[1]);
614 }
615
616 public static void uninstallPackages()
617 {
618 // Uninstall packages
619 MetadataService.MetadataPort service = createService();
620 List<MetadataService.DeleteResult> results =
621 service.deleteMetadata(
622 'InstalledPackage', new String[] { 'packagea', 'packageb' });
623 handleDeleteResults(results[0]);
624 handleDeleteResults(results[1]);
625 }
626
627 public static void createCustomSite()
628 {
629 MetadataService.CustomSite customSite = new MetadataService.CustomSite();
630 customSite.fullName = 'MyCustomSite';
631 customSite.active = true;
632 customSite.allowHomePage = true;
633 customSite.allowStandardIdeasPages = true;
634 customSite.active = true;
635 customSite.allowHomePage = true;
636 customSite.allowStandardIdeasPages = true;
637 customSite.allowStandardLookups = true;
638 customSite.allowStandardSearch = true;
639 customSite.authorizationRequiredPage = 'Unauthorized';
640 customSite.bandwidthExceededPage = 'BandwidthExceeded';
641 customSite.changePasswordPage = 'ChangePassword';
642 customSite.chatterAnswersForgotPasswordConfirmPage = null;
643 customSite.chatterAnswersForgotPasswordPage = null;
644 customSite.chatterAnswersHelpPage = null;
645 customSite.chatterAnswersLoginPage = null;
646 customSite.chatterAnswersRegistrationPage = null;
647 customSite.favoriteIcon = null;
648 customSite.fileNotFoundPage = 'FileNotFound';
649 customSite.genericErrorPage = 'Exception';
650 customSite.inMaintenancePage = 'InMaintenance';
651 customSite.serverIsDown = null;
652 customSite.indexPage = 'UnderConstruction';
653 customSite.masterLabel = 'customSite';
654 customSite.portal = null;
655 customSite.requireInsecurePortalAccess = false;
656 customSite.siteAdmin = 'admin@mysiteorg.com';
657 customSite.siteTemplate = 'SiteTemplate';

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 10/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
658 customSite.siteType = 'Visualforce';
659 customSite.clickjackProtectionLevel = 'AllowAllFraming';
660 customSite.requireHttps = true;
661 MetadataService.MetadataPort service = createService();
662 List<MetadataService.SaveResult> results =
663 service.createMetadata(
664 new MetadataService.Metadata[] { customSite });
665 handleSaveResults(results[0]);
666 }
667
668 public static void createDetailObject()
669 {
670 // Define Metadata item to create a Custom Object
671 MetadataService.CustomObject customObject = new MetadataService.CustomObject();
672 customObject.fullName = 'TestDetail__c';
673 customObject.label = 'Test Detail';
674 customObject.pluralLabel = 'Test Details';
675 customObject.nameField = new MetadataService.CustomField();
676 customObject.nameField.type_x = 'Text';
677 customObject.nameField.label = 'Test Detail Record';
678 customObject.deploymentStatus = 'Deployed';
679 customObject.sharingModel = 'ReadWrite';
680
681 // Define Metadata item to create a Custom Formula Field on the above object
682 MetadataService.CustomField customField1 = new MetadataService.CustomField();
683 customField1.fullName = 'TestDetail__c.FormulaField__c';
684 customField1.externalId = false;
685 customField1.formula = '42';
686 customField1.formulaTreatBlanksAs = 'BlankAsZero';
687 customField1.label = 'Formula Field';
688 customField1.precision = 18;
689 customField1.required = false;
690 customField1.scale = 2;
691 customField1.type_x = 'Number';
692 customField1.unique = false;
693
694 // Define Metadata item to create a Custom Field on the above object
695 MetadataService.CustomField customField2 = new MetadataService.CustomField();
696 customField2.fullName = 'TestDetail__c.Test__c';
697 customField2.externalId = false;
698 customField2.label = 'Test';
699 customField2.referenceTo = 'Test__c';
700 customField2.relationshipLabel = 'Test Children';
701 customField2.relationshipName = 'Test_Children';
702 customField2.relationshipOrder = 0;
703 customField2.type_x = 'MasterDetail';
704 customField2.writeRequiresMasterRead = false;
705
706 // Create components in the correct order
707 MetadataService.MetadataPort service = createService();
708 List<MetadataService.SaveResult> results =
709 service.createMetadata(
710 new MetadataService.Metadata[] { customObject });
711 handleSaveResults(results[0]);
712 results =
713 service.createMetadata(
714 new MetadataService.Metadata[] { customField1, customField2 });
715 handleSaveResults(results[0]);
716 handleSaveResults(results[1]);
717 }
718
719 public static void createFieldSet()
720 {
721 MetadataService.MetadataPort service = createService();
722
723 // FieldSet
724 MetadataService.FieldSet fieldSet = new MetadataService.FieldSet();

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 11/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
725 fieldSet.fullName = 'Test__c.MyFieldSet';
726 fieldSet.label = 'My FieldSet';
727 fieldSet.description = 'Used by my VF page';
728 MetadataService.FieldSetItem myAvailableField = new MetadataService.FieldSetItem();
729 myAvailableField.field = 'TestField__c';
730 myAvailableField.isFieldManaged = true;
731 myAvailableField.isRequired = true;
732 fieldSet.availableFields = new List<MetadataService.FieldSetItem>();
733 fieldSet.availableFields.add(myAvailableField);
734
735 // Create
736 List<MetadataService.SaveResult> results =
737 service.createMetadata(
738 new MetadataService.Metadata[] { fieldSet });
739 handleSaveResults(results[0]);
740 }
741
742 public static void updateFieldSet()
743 {
744 MetadataService.MetadataPort service = createService();
745
746 // FieldSet
747 MetadataService.FieldSet fieldSet = new MetadataService.FieldSet();
748 fieldSet.fullName = 'Test__c.MyFieldSet';
749 fieldSet.label = 'My FieldSet';
750 fieldSet.description = 'Used by my VF page';
751 MetadataService.FieldSetItem myAvailableField = new MetadataService.FieldSetItem();
752 myAvailableField.field = 'TestField__c';
753 myAvailableField.isFieldManaged = true;
754 myAvailableField.isRequired = true;
755 MetadataService.FieldSetItem myAvailableFieldNew = new MetadataService.FieldSetItem();
756 myAvailableFieldNew.field = 'ExternalField__c';
757 myAvailableFieldNew.isFieldManaged = true;
758 myAvailableFieldNew.isRequired = true;
759 fieldSet.availableFields = new List<MetadataService.FieldSetItem>();
760 fieldSet.availableFields.add(myAvailableField);
761 fieldSet.availableFields.add(myAvailableFieldNew);
762
763 // Update
764 List<MetadataService.SaveResult> results =
765 service.updateMetadata(
766 new MetadataService.Metadata[] { fieldSet });
767 handleSaveResults(results[0]);
768 }
769
770 public static void addActionOverride()
771 {
772 MetadataService.MetadataPort service = createService();
773 MetadataService.CustomObject customObject = new MetadataService.CustomObject();
774 customObject.fullName = 'Test__c';
775 customObject.label = 'Test';
776 customObject.pluralLabel = 'Tests';
777 customObject.nameField = new MetadataService.CustomField();
778 customObject.nameField.type_x = 'Text';
779 customObject.nameField.label = 'Test Record';
780 customObject.deploymentStatus = 'Deployed';
781 customObject.sharingModel = 'ReadWrite';
782 customObject.actionOverrides = new List<MetadataService.ActionOverride>();
783 customObject.actionOverrides.add(new MetadataService.ActionOverride());
784 customObject.actionOverrides[0].actionName = 'Edit';
785 customObject.actionOverrides[0].content = 'TestPage';
786 customObject.actionOverrides[0].type_x = 'visualforce';
787 customObject.actionOverrides[0].skipRecordTypeSelect = false;
788 customObject.actionOverrides[0].comment = 'A comment for edit action';
789 List<MetadataService.SaveResult> results =
790 service.updateMetadata(
791 new MetadataService.Metadata[] { customObject });

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 12/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
792 handleSaveResults(results[0]);
793 }
794
795 public static void createListView()
796 {
797 MetadataService.MetadataPort service = createService();
798 MetadataService.ListView listView = new MetadataService.ListView();
799 listView.fullName = 'Test__c.MyListView';
800 listView.label = 'My List View';
801 listView.filterScope = 'Everything';
802 listView.columns = new List<String> { 'NAME' };
803 List<MetadataService.SaveResult> results =
804 service.createMetadata(
805 new MetadataService.Metadata[] { listView });
806 handleSaveResults(results[0]);
807 }
808
809 public static void deleteListView()
810 {
811 MetadataService.MetadataPort service = createService();
812 List<MetadataService.DeleteResult> results =
813 service.deleteMetadata(
814 'ListView', new String[] { 'Test__c.MyListView' });
815 handleDeleteResults(results[0]);
816 }
817
818 public static void listListViews()
819 {
820 MetadataService.MetadataPort service = createService();
821 List<MetadataService.ListMetadataQuery> queries = new List<MetadataService.ListMetadataQuery>();
822 MetadataService.ListMetadataQuery listView = new MetadataService.ListMetadataQuery();
823 listView.type_x = 'ListView';
824 queries.add(listView);
825 MetadataService.FileProperties[] fileProperties = service.listMetadata(queries, 25);
826 for(MetadataService.FileProperties fileProperty : fileProperties)
827 System.debug(fileProperty.fullName);
828 }
829
830 public static void readListView()
831 {
832 MetadataService.MetadataPort service = createService();
833
834 // Read List View definition
835 MetadataService.ListView listView =
836 (MetadataService.ListView) service.readMetadata('ListView',
837 new String[] { 'Test__c.MyListView' }).getRecords()[0];
838 if(listView.columns!=null)
839 for(String column : listView.columns)
840 System.debug('Column ' + column);
841 if(listView.filters!=null)
842 for(MetadataService.ListViewFilter filter : listView.filters)
843 System.debug('Filter ' + filter.field + ' ' + filter.operation + ' ' + filter.value);
844 }
845
846 public static void createApprovalProcess()
847 {
848 MetadataService.MetadataPort service = createService();
849 MetadataService.ApprovalProcess approvalProcess = new MetadataService.ApprovalProcess();
850 approvalProcess.fullName = 'Test__c.TestApproval';
851 approvalProcess.label = 'Test Approval';
852 approvalProcess.active = false;
853 approvalProcess.allowRecall = false;
854 approvalProcess.showApprovalHistory = true;
855 approvalProcess.recordEditability = 'AdminOnly';
856 approvalProcess.finalApprovalRecordLock = false;
857 approvalProcess.finalRejectionRecordLock = false;
858 approvalProcess.showApprovalHistory = false;

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 13/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
859 MetadataService.ApprovalSubmitter submitter = new MetadataService.ApprovalSubmitter();
860 submitter.type_x = 'user';
861 submitter.submitter = UserInfo.getUserName();
862 approvalProcess.allowedSubmitters = new List<MetadataService.ApprovalSubmitter> { submitter };
863 List<MetadataService.SaveResult> results =
864 service.createMetadata(
865 new MetadataService.Metadata[] { approvalProcess });
866 handleSaveResults(results[0]);
867 }
868
869 public static void readAndUpdateLayout()
870 {
871 MetadataService.MetadataPort service = createService();
872
873 // Create Button
874 MetadataService.WebLink webLink = new MetadataService.WebLink();
875 webLink.fullName = 'Test__c.googleButton';
876 webLink.availability = 'online';
877 webLink.displayType = 'button';
878 webLink.encodingKey = 'UTF-8';
879 webLink.hasMenubar = false;
880 webLink.hasScrollbars = true;
881 webLink.hasToolbar = false;
882 webLink.height = 600;
883 webLink.isResizable = true;
884 webLink.linkType = 'url';
885 webLink.masterLabel = 'google';
886 webLink.openType = 'newWindow';
887 webLink.position = 'none';
888 webLink.protected_x = false;
889 webLink.showsLocation = false;
890 webLink.showsStatus = false;
891 webLink.url = 'http://www.google.com';
892 webLink.width = 600;
893 handleSaveResults(
894 service.createMetadata(
895 new List<MetadataService.Metadata> { webLink })[0]);
896
897 // Read the Layout
898 MetadataService.Layout layout =
899 (MetadataService.Layout) service.readMetadata('Layout',
900 new String[] { 'Test__c-Test Layout' }).getRecords()[0];
901
902 // Add the Custom Button to the Layout
903 if(layout.customButtons==null)
904 layout.customButtons = new List<String>();
905 layout.customButtons.add('googleButton');
906
907 // Update the Layout
908 handleSaveResults(
909 service.updateMetadata(
910 new MetadataService.Metadata[] { layout })[0]);
911 }
912
913
914 public static void addFieldToLayout()
915 {
916 MetadataService.MetadataPort service = createService();
917
918 // Read the Layout
919 MetadataService.Layout layout =
920 (MetadataService.Layout) service.readMetadata('Layout',
921 new String[] { 'Test__c-Test Layout' }).getRecords()[0];
922
923 // Add Layout section, layout, item and field
924 if(layout.layoutSections==null)
925 layout.layoutSections = new List<MetadataService.LayoutSection>();

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 14/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
926 MetadataService.LayoutSection newLayoutSection = new MetadataService.LayoutSection();
927 newLayoutSection.style = 'OneColumn';
928 MetadataService.LayoutColumn newLayoutColumn = new MetadataService.LayoutColumn();
929 MetadataService.LayoutItem newLayoutItem = new MetadataService.LayoutItem();
930 newLayoutItem.field = 'TestField__c';
931 newLayoutColumn.layoutItems = new List<MetadataService.LayoutItem> { newLayoutItem };
932 newLayoutSection.layoutColumns = new List<MetadataService.LayoutColumn> { newLayoutColumn };
933 layout.layoutSections.add(newLayoutSection);
934
935 // Update the Layout
936 handleSaveResults(
937 service.updateMetadata(
938 new MetadataService.Metadata[] { layout })[0]);
939 }
940
941 public static void updatePicklist()
942 {
943 MetadataService.MetadataPort service = createService();
944
945 // Read Custom Field
946 MetadataService.CustomField customField =
947 (MetadataService.CustomField) service.readMetadata('CustomField',
948 new String[] { 'Lead.picklist__c' }).getRecords()[0];
949
950 // Add pick list values
951 metadataservice.PicklistValue two = new metadataservice.PicklistValue();
952 two.fullName= 'second';
953 two.default_x=false;
954 metadataservice.PicklistValue three = new metadataservice.PicklistValue();
955 three.fullName= 'third';
956 three.default_x=false;
957 customField.picklist.picklistValues.add(two);
958 customField.picklist.picklistValues.add(three);
959
960 // Update Custom Field
961 handleSaveResults(
962 service.updateMetadata(
963 new MetadataService.Metadata[] { customField })[0]);
964 }
965
966 public static void copyLayoutSection()
967 {
968 MetadataService.MetadataPort service = createService();
969
970 // Read the source Layout
971 MetadataService.Layout sourceLayout =
972 (MetadataService.Layout) service.readMetadata('Layout',
973 new String[] { 'Test__c-Test Template Layout' }).getRecords()[0];
974
975 // Read the target Layout
976 MetadataService.Layout targetLayout =
977 (MetadataService.Layout) service.readMetadata('Layout',
978 new String[] { 'Test__c-Test Layout' }).getRecords()[0];
979
980 // Add section from source Layout to target Layout
981 targetLayout.layoutSections.add(
982 sourceLayout.layoutSections[0]);
983
984 // Update target Layout
985 handleSaveResults(
986 service.updateMetadata(
987 new MetadataService.Metadata[] { targetLayout })[0]);
988 }
989
990 public static void readWorkflowAlert()
991 {
992 MetadataService.MetadataPort service = createService();

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 15/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
993
994 // Read Workflow Alert
995 MetadataService.WorkflowAlert wfa =
996 (MetadataService.WorkflowAlert) service.readMetadata('WorkflowAlert',
997 new String[] { 'Test__c.Test' }).getRecords()[0];
998 System.debug('Description ' + wfa.description);
999 System.debug('Sender Address ' + wfa.senderAddress);
1000 }
1001
1002 public static void readCustomObject()
1003 {
1004 MetadataService.MetadataPort service = createService();
1005
1006 MetadataService.CustomObject customObject =
1007 (MetadataService.CustomObject) service.readMetadata('CustomObject',
1008 new String[] { 'Test__c' }).getRecords()[0];
1009 for(MetadataService.CustomField field : customObject.fields)
1010 System.debug(field.fullName);
1011 }
1012
1013 public static void addComponentsToHomePageLayout()
1014 {
1015 // Retrieve Home Page Layout
1016 MetadataService.MetadataPort service = createService();
1017 MetadataService.HomePageLayout homePageLayout =
1018 (MetadataService.HomePageLayout) service.readMetadata('HomePageLayout',
1019 new String[] { 'DE Default' }).getRecords()[0];
1020
1021 // Create Home Page Component
1022 MetadataService.HomePageComponent homePageComponent =
1023 new MetadataService.HomePageComponent();
1024 homePageComponent.width = 'wide';
1025 homePageComponent.pageComponentType = 'htmlArea';
1026 homePageComponent.fullName = 'helloworld';
1027 homePageComponent.body = '<p>Hello World</p>';
1028 handleSaveResults(
1029 service.createMetadata(
1030 new MetadataService.Metadata[] { homePageComponent })[0]);
1031
1032 // Add component to Home Page Layout and Update
1033 if(homePageLayout.wideComponents==null)
1034 homePageLayout.wideComponents = new List<String>();
1035 homePageLayout.wideComponents.add('helloworld');
1036 handleSaveResults(
1037 service.updateMetadata(
1038 new MetadataService.Metadata[] { homePageLayout })[0]);
1039 }
1040
1041 public static void readFolder()
1042 {
1043 // Retrieve Folder
1044 MetadataService.MetadataPort service = createService();
1045 MetadataService.ReportFolder folder =
1046 (MetadataService.ReportFolder) service.readMetadata('ReportFolder',
1047 new String[] { 'MyFolder' }).getRecords()[0];
1048 System.debug('name ' + folder.name);
1049 System.debug('fullName ' + folder.fullName);
1050 System.debug('allInternalUsers ' + folder.sharedTo.allInternalUsers);
1051 }
1052
1053 public static void readReport()
1054 {
1055 MetadataService.MetadataPort service = createService();
1056 MetadataService.Report report =
1057 (MetadataService.Report) service.readMetadata('Report',
1058 new String[] { 'MyFolder/MyReport' }).getRecords()[0];
1059 System.debug(report.description);

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 16/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
1060 }
1061
1062 public static void readPermissionSet()
1063 {
1064 MetadataService.MetadataPort service = createService();
1065 MetadataService.PermissionSet ps =
1066 (MetadataService.PermissionSet) service.readMetadata('PermissionSet',
1067 new String[] { 'Test' }).getRecords()[0];
1068
1069 }
1070
1071 public static void createLayout()
1072 {
1073 MetadataService.MetadataPort service = createService();
1074 MetadataService.Layout layout = new MetadataService.Layout();
1075 layout.fullName = 'Test__c-My Layout';
1076 layout.layoutSections = new List<MetadataService.LayoutSection>();
1077 MetadataService.LayoutSection layoutSection = new MetadataService.LayoutSection();
1078 layoutSection.editHeading = true;
1079 layoutSection.label = 'System Information';
1080 layoutSection.style = 'TwoColumnsTopToBottom';
1081 layoutSection.layoutColumns = new List<MetadataService.LayoutColumn>();
1082 MetadataService.LayoutColumn layoutColumn = new MetadataService.LayoutColumn();
1083 layoutColumn.layoutItems = new List<MetadataService.LayoutItem>();
1084 MetadataService.LayoutItem layoutItem1 = new MetadataService.LayoutItem();
1085 layoutItem1.behavior = 'Readonly';
1086 layoutItem1.field = 'CreatedById';
1087 layoutColumn.layoutItems.add(layoutItem1);
1088 MetadataService.LayoutItem layoutItem2 = new MetadataService.LayoutItem();
1089 layoutItem2.behavior = 'Required';
1090 layoutItem2.field = 'Name';
1091 layoutColumn.layoutItems.add(layoutItem2);
1092 layoutSection.layoutColumns.add(layoutColumn);
1093 layout.layoutSections.add(layoutSection);
1094 layout.summaryLayout = new MetadataService.SummaryLayout();
1095 layout.summaryLayout.masterLabel = 'Great name';
1096 layout.summaryLayout.sizeX = 4;
1097 layout.summaryLayout.sizeY = 2;
1098 layout.summaryLayout.summaryLayoutStyle = 'Default';
1099 layout.summaryLayout.summaryLayoutItems = new List<MetadataService.SummaryLayoutItem>();
1100 MetadataService.SummaryLayoutItem summaryLayoutItem = new MetadataService.SummaryLayoutItem();
1101 summaryLayoutItem.posX = 0;
1102 summaryLayoutItem.posY = 0;
1103 summaryLayoutItem.field = 'Name';
1104 layout.summaryLayout.summaryLayoutItems.add(summaryLayoutItem);
1105 List<MetadataService.SaveResult> results =
1106 service.createMetadata(
1107 new MetadataService.Metadata[] { layout });
1108 handleSaveResults(results[0]);
1109 }
1110
1111 public static void readLightningComponent()
1112 {
1113 MetadataService.MetadataPort service = createService();
1114 MetadataService.AuraDefinitionBundle auraBundle =
1115 (MetadataService.AuraDefinitionBundle) service.readMetadata('AuraDefinitionBundle',
1116 new String[] { 'HelloWorld' }).getRecords()[0];
1117 System.debug(EncodingUtil.base64Decode(auraBundle.markup).toString());
1118 }
1119
1120 public static void createLightningComponent()
1121 {
1122 MetadataService.MetadataPort service = createService();
1123 MetadataService.AuraDefinitionBundle auraBundle = new MetadataService.AuraDefinitionBundle();
1124 auraBundle.fullName = 'HelloWorld';
1125 auraBundle.type_x = 'Component';
1126 auraBundle.markup = EncodingUtil.base64Encode(Blob.valueOf(

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 17/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
1127 '<aura:component>' +
1128 '<aura:attribute name="val1" type="String" default="Value"/>' +
1129 '<aura:attribute name="val2" type="String" />' +
1130 '<aura:handler name="init" value="{!this}" action="{!c.myAction}"/>' +
1131 '<ui:outputText value="Hello world!"/>' +
1132 '<ui:outputText value="{!v.val1}"/>' +
1133 '<ui:outputText value="{!v.val2}"/>' +
1134 '</aura:component>'));
1135 auraBundle.controllerContent = EncodingUtil.base64Encode(Blob.valueOf(
1136 '({' +
1137 'myAction : function(component) {' +
1138 'component.set(\'v.val1\',\'Value1\');' +
1139 'component.set(\'v.val2\',\'Value2\');' +
1140 '}' +
1141 '})'));
1142 List<MetadataService.SaveResult> results =
1143 service.createMetadata(
1144 new MetadataService.Metadata[] { auraBundle });
1145 handleSaveResults(results[0]);
1146 }
1147
1148 public static void createFormulaField()
1149 {
1150 MetadataService.MetadataPort service = createService();
1151 MetadataService.CustomField customField = new MetadataService.CustomField();
1152 customField.fullName = 'Test__c.TestFormulaField__c';
1153 customField.label = 'Test Formula Field';
1154 customField.type_x = 'Date';
1155 customField.formula = 'TODAY()';
1156 List<MetadataService.SaveResult> results =
1157 service.createMetadata(
1158 new MetadataService.Metadata[] { customField });
1159 handleSaveResults(results[0]);
1160 }
1161
1162 public static void createLayoutManaged()
1163 {
1164 MetadataService.MetadataPort service = createService();
1165 MetadataService.Layout layout = new MetadataService.Layout();
1166 layout.fullName = 'packageb__Sales_Invoice__c-Test';
1167 layout.layoutSections = new List<MetadataService.LayoutSection>();
1168 MetadataService.LayoutSection layoutSection = new MetadataService.LayoutSection();
1169 layoutSection.editHeading = true;
1170 layoutSection.label = 'System Information';
1171 layoutSection.style = 'TwoColumnsTopToBottom';
1172 layoutSection.layoutColumns = new List<MetadataService.LayoutColumn>();
1173 MetadataService.LayoutColumn layoutColumn = new MetadataService.LayoutColumn();
1174 layoutColumn.layoutItems = new List<MetadataService.LayoutItem>();
1175 MetadataService.LayoutItem layoutItem1 = new MetadataService.LayoutItem();
1176 layoutItem1.behavior = 'Readonly';
1177 layoutItem1.field = 'CreatedById';
1178 layoutColumn.layoutItems.add(layoutItem1);
1179 MetadataService.LayoutItem layoutItem2 = new MetadataService.LayoutItem();
1180 layoutItem2.behavior = 'Required';
1181 layoutItem2.field = 'Name';
1182 layoutColumn.layoutItems.add(layoutItem2);
1183 layoutSection.layoutColumns.add(layoutColumn);
1184 layout.layoutSections.add(layoutSection);
1185 List<MetadataService.UpsertResult> results =
1186 service.upsertMetadata(
1187 new MetadataService.Metadata[] { layout });
1188 handleUpsertResults(results[0]);
1189 }
1190
1191 public static void createSharingRule()
1192 {
1193 // Create Sharing Rule

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 18/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
1194 MetadataService.MetadataPort service = createService();
1195 MetadataService.SharingRules testSharingRule = new MetadataService.SharingRules();
1196 testSharingRule.fullName = 'Test__c';
1197 testSharingRule.sharingCriteriaRules = new List<MetadataService.SharingCriteriaRule>();
1198 MetadataService.SharingCriteriaRule sharingCriteriaRule = new MetadataService.SharingCriteriaRule();
1199 sharingCriteriaRule.fullName = 'TestCriteria';
1200 sharingCriteriaRule.accessLevel = 'Read';
1201 sharingCriteriaRule.label = 'Test';
1202 sharingCriteriaRule.sharedTo = new MetadataService.SharedTo();
1203 sharingCriteriaRule.sharedTo.allPartnerUsers = '';
1204 sharingCriteriaRule.criteriaItems = new List<MetadataService.FilterItem>();
1205 MetadataService.FilterItem cirteriaFilterItem = new MetadataService.FilterItem();
1206 cirteriaFilterItem.field = 'RecordTypeId';
1207 cirteriaFilterItem.operation = 'equals';
1208 cirteriaFilterItem.value = 'Record Type A';
1209 sharingCriteriaRule.criteriaItems.add(cirteriaFilterItem);
1210 testSharingRule.sharingCriteriaRules.add(sharingCriteriaRule);
1211 testSharingRule.sharingOwnerRules = new List<MetadataService.SharingOwnerRule>();
1212 MetadataService.SharingOwnerRule sharingOwnerRule = new MetadataService.SharingOwnerRule();
1213 sharingOwnerRule.fullName = 'TestOwner';
1214 sharingOwnerRule.accessLevel = 'Read';
1215 sharingOwnerRule.label = 'Test';
1216 sharingOwnerRule.sharedTo = new MetadataService.SharedTo();
1217 sharingOwnerRule.sharedTo.allPartnerUsers = '';
1218 sharingOwnerRule.sharedFrom = new MetadataService.SharedTo();
1219 sharingOwnerRule.sharedFrom.allInternalUsers = '';
1220 testSharingRule.sharingOwnerRules.add(sharingOwnerRule);
1221 List<MetadataService.SaveResult> results =
1222 service.createMetadata(
1223 new MetadataService.Metadata[] { testSharingRule });
1224 handleSaveResults(results[0]);
1225 }
1226
1227 public static void readSharingRule()
1228 {
1229 // Read Sharing Rule
1230 MetadataService.MetadataPort service = createService();
1231 MetadataService.SharingRules sharingRules =
1232 (MetadataService.SharingRules) service.readMetadata('SharingRules',
1233 new String[] { 'Test__c' }).getRecords()[0];
1234 System.debug(sharingRules.sharingOwnerRules[0].fullName);
1235 }
1236
1237 public static void deleteSharingRule()
1238 {
1239 // Delete Sharing Rule
1240 MetadataService.MetadataPort service = createService();
1241 List<MetadataService.DeleteResult> results =
1242 service.deleteMetadata(
1243 'SharingRules', new String[] { 'Test__c' });
1244 handleDeleteResults(results[0]);
1245 }
1246
1247 public static void readTranslation()
1248 {
1249 // Read Translation
1250 MetadataService.MetadataPort service = createService();
1251 MetadataService.Translations translations =
1252 (MetadataService.Translations) service.readMetadata('Translations',
1253 new String[] { 'nl_NL' }).getRecords()[0];
1254 for(MetadataService.CustomLabelTranslation customLabelTranslation : translations.customLabels)
1255 System.debug(customLabelTranslation.label);
1256 }
1257
1258 public static void readApprovalProcess()
1259 {
1260 // Read Translation

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 19/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
1261 MetadataService.MetadataPort service = createService();
1262 MetadataService.ApprovalProcess approvalProcess =
1263 (MetadataService.ApprovalProcess) service.readMetadata('ApprovalProcess',
1264 new String[] { 'Test__c.TestApproval' }).getRecords()[0];
1265 }
1266
1267 public static void createCustomPageWeblink()
1268 {
1269 MetadataService.MetadataPort service = createService();
1270
1271 MetadataService.CustomPageWebLink customPageWeblink = new MetadataService.CustomPageWebLink();
1272
1273 //no object name here, no spaces, single "_" allowed
1274 customPageWeblink.fullName = 'CustomPageWeblink_Name';
1275 customPageWeblink.availability = 'online';
1276 customPageWeblink.displayType = 'link';
1277 customPageWeblink.encodingKey = 'UTF-8';
1278 customPageWeblink.hasMenubar = false;
1279 customPageWeblink.hasScrollbars = false;
1280 customPageWeblink.hasToolbar = false;
1281 customPageWeblink.height = 600;
1282 customPageWeblink.isResizable = false;
1283 customPageWeblink.linkType = 'url';
1284 //friendly name that is displayed on SFDc pages
1285 customPageWeblink.masterLabel = 'Label';
1286 customPageWeblink.openType = 'newWindow';
1287 customPageWeblink.position = 'none';
1288 customPageWeblink.protected_x = false;
1289 customPageWeblink.showsLocation = false;
1290 customPageWeblink.showsStatus = false;
1291 customPageWeblink.url = 'http://www.google.com';
1292
1293 List<MetadataService.SaveResult> results =
1294 service.createMetadata(
1295 new MetadataService.Metadata[] { customPageWeblink });
1296
1297 handleSaveResults(results[0]);
1298 }
1299
1300 /**
1301 * If you have subscribed to the paid feature add-on "Field Audit Trail" then you can define the
1302 * History Retention Policy using the Metadata API.
1303 *
1304 * https://developer.salesforce.com/docs/atlas.en-us.field_history_retention.meta/field_history_retention/
1305 * https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_historyretentionpolicy.htm
1306 */
1307 public static void updateHistoryRetentionPolicy() {
1308
1309 // Create service
1310 MetadataService.MetadataPort service = createService();
1311
1312 // Retrieve the custom object metadata
1313 MetadataService.CustomObject customObject = (MetadataService.CustomObject) service.readMetadata(
1314 'CustomObject', new String[] { 'Account' }
1315 ).getRecords()[0];
1316
1317 // Print the existing policy, if any defined
1318 System.debug( customObject.historyRetentionPolicy );
1319
1320 // Define the retention policy
1321 MetadataService.HistoryRetentionPolicy policy = new MetadataService.HistoryRetentionPolicy();
1322 policy.archiveAfterMonths = 3;
1323 policy.archiveRetentionYears = 5;
1324 policy.gracePeriodDays = 0;
1325
1326 // Assign policy to the custom object
1327 customObject.historyRetentionPolicy = policy;

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 20/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
1328
1329 // Update the metadata using API
1330 List<MetadataService.SaveResult> saveResults = service.updateMetadata(
1331 new MetadataService.Metadata[] {
1332 customObject
1333 }
1334 );
1335
1336 // Inspect the save result for any errors
1337 for ( MetadataService.SaveResult saveResult : saveResults ) {
1338 if ( !saveResult.success ) {
1339 System.debug( 'failure' );
1340 for ( MetadataService.Error err : saveResult.errors ) {
1341 System.debug( System.LoggingLevel.ERROR, err.statusCode + ': ' + err.message );
1342 }
1343 }
1344 System.debug( 'success' );
1345 }
1346
1347 }
1348
1349 public static void createFlow() {
1350
1351 MetadataService.MetadataPort service = createService();
1352
1353 // Create Flow
1354 MetadataService.Flow flow = new MetadataService.Flow();
1355 flow.fullName = 'NewFlow-1';
1356 flow.description = 'New Flow';
1357 flow.label = 'New Flow';
1358 flow.processType = 'Flow';
1359 MetadataService.FlowRecordCreate recordCreate = new MetadataService.FlowRecordCreate();
1360 recordCreate.name = 'RecordCreate';
1361 recordCreate.label = 'Record Create';
1362 recordCreate.object_x = 'Account';
1363 recordCreate.locationX = 10;
1364 recordCreate.locationY = 10;
1365 recordCreate.inputAssignments = new List<MetadataService.FlowInputFieldAssignment>();
1366 recordCreate.inputAssignments.add(new MetadataService.FlowInputFieldAssignment());
1367 recordCreate.inputAssignments[0].field = 'AccountNumber';
1368 recordCreate.inputAssignments[0].value = new MetadataService.FlowElementReferenceOrValue();
1369 recordCreate.inputAssignments[0].value.stringValue = '1234';
1370 flow.recordCreates = new List<MetadataService.FlowRecordCreate> { recordCreate };
1371 flow.startElementReference = 'RecordCreate';
1372 handleSaveResults(service.createMetadata(new List<MetadataService.Metadata> { flow })[0]);
1373 }
1374
1375 public static void readFlow()
1376 {
1377 MetadataService.MetadataPort service = createService();
1378
1379 // Read Flow
1380 MetadataService.Flow flow =
1381 (MetadataService.Flow) service.readMetadata('Flow',
1382 new String[] { 'NewFlow-1' }).getRecords()[0];
1383 System.debug('Description ' + flow.description);
1384 System.debug('Name ' + flow.RecordCreates[0].name);
1385 System.debug('Location X ' + flow.RecordCreates[0].locationX);
1386 System.debug('Location Y ' + flow.RecordCreates[0].locationY);
1387 }
1388
1389 public static void updateFlow() {
1390
1391 MetadataService.MetadataPort service = createService();
1392
1393 // Read Flow
1394 MetadataService.Flow flow =

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 21/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
1395 (MetadataService.Flow) service.readMetadata('Flow',
1396 new String[] { 'NewFlow-1' }).getRecords()[0];
1397
1398 // Add a new step
1399 MetadataService.FlowScreen flowScreen = new MetadataService.FlowScreen();
1400 flowScreen.name = 'NewScreen';
1401 flowScreen.label = 'New Screen';
1402 flowScreen.locationX = 100;
1403 flowScreen.locationY = 100;
1404 flowScreen.allowBack = true;
1405 flowScreen.allowFinish = true;
1406 flowScreen.fields = new List<MetadataService.FlowScreenField>();
1407 flowScreen.fields.add(new MetadataService.FlowScreenField());
1408 flowScreen.fields[0].name = 'Test_Box';
1409 flowScreen.fields[0].dataType = 'String';
1410 flowScreen.fields[0].fieldText = 'Test Box';
1411 flowScreen.fields[0].fieldType = 'InputField';
1412 flowScreen.fields[0].isRequired = true;
1413 flow.screens = new List<MetadataService.FlowScreen> { flowScreen };
1414
1415 // Link it with the previous one
1416 flow.recordCreates[0].connector = new MetadataService.FlowConnector();
1417 flow.recordCreates[0].connector.targetReference = 'NewScreen';
1418
1419 // Update
1420 handleSaveResults(service.updateMetadata(new List<MetadataService.Metadata> { flow })[0]);
1421 }
1422
1423 public static void deleteFlow() {
1424
1425 MetadataService.MetadataPort service = createService();
1426
1427 // Delete Flow
1428 handleDeleteResults(
1429 service.deleteMetadata('Flow', new String[] { 'NewFlow-1' })[0]);
1430 }
1431
1432
1433 public static void createFlowAdvanced() {
1434
1435 MetadataService.MetadataPort service = createService();
1436
1437 // Create Flow
1438 MetadataService.Flow flow = new MetadataService.Flow();
1439 flow.fullName = 'NewFlow-1';
1440 flow.description = 'New Flow';
1441 flow.label = 'New Flow';
1442 flow.processType = 'Flow';
1443 flow.startElementReference = 'NewScreen';
1444
1445 // Add a new step
1446 MetadataService.FlowScreen flowScreen = new MetadataService.FlowScreen();
1447 flowScreen.name = 'NewScreen';
1448 flowScreen.label = 'New Screen';
1449 flowScreen.locationX = 100;
1450 flowScreen.locationY = 100;
1451 flowScreen.allowBack = true;
1452 flowScreen.allowFinish = true;
1453 addFields(flowScreen,
1454 new List<SObjectField> {
1455 Account.AccountNumber,
1456 Account.Description,
1457 Account.Fax,
1458 Account.AnnualRevenue });
1459 flow.screens = new List<MetadataService.FlowScreen> { flowScreen };
1460
1461 // Create

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 22/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
1462 handleSaveResults(service.createMetadata(new List<MetadataService.Metadata> { flow })[0]);
1463 }
1464
1465 public static final Map<DisplayType, String> FLOWTYPEBYDISPLAYTYPE =
1466 new Map<DisplayType, String>{
1467 DisplayType.anytype => 'String',
1468 DisplayType.base64 => 'String',
1469 DisplayType.Boolean => 'Boolean',
1470 DisplayType.Combobox => 'String',
1471 DisplayType.Currency => 'Currency',
1472 DisplayType.Date => 'Date',
1473 DisplayType.DateTime => 'DateTime',
1474 DisplayType.Double => 'Number',
1475 DisplayType.Email => 'String',
1476 DisplayType.EncryptedString => 'String',
1477 DisplayType.Id => 'String',
1478 DisplayType.Integer => 'Number',
1479 DisplayType.MultiPicklist => 'Multipicklist',
1480 DisplayType.Percent => 'Number',
1481 DisplayType.Phone => 'String',
1482 DisplayType.Picklist => 'Picklist',
1483 DisplayType.Reference => 'Reference',
1484 DisplayType.String => 'String',
1485 DisplayType.TextArea => 'String',
1486 DisplayType.Time => 'String',
1487 DisplayType.URL => 'String'};
1488
1489 /**
1490 * This is for demo purposes only, it requires more work and testing to refine
1491 **/
1492 public static void addFields(MetadataService.FlowScreen flowScreen, List<SObjectField> fieldsToAdd) {
1493 for(SObjectField field : fieldsToAdd) {
1494 // Construct a FlowScreenField based on the SObjectField metadata
1495 DescribeFieldResult fieldDescribe = field.getDescribe();
1496 // https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_visual_workflow.htm#FlowScreenField
1497 MetadataService.FlowScreenField flowScreenField = new MetadataService.FlowScreenField();
1498 flowScreenField.name = fieldDescribe.getName();
1499 flowScreenField.dataType = FLOWTYPEBYDISPLAYTYPE.get(fieldDescribe.getType());
1500 flowScreenField.fieldText = fieldDescribe.getLabel();
1501 flowScreenField.fieldType = 'InputField';
1502 flowScreenField.isRequired = flowScreenField.dataType == 'Boolean' ? true : fieldDescribe.isNillable();
1503 flowScreenField.helpText = fieldDescribe.getInlineHelpText();
1504 if(flowScreenField.dataType == 'Number') {
1505 flowScreenField.scale = fieldDescribe.getScale();
1506 }
1507 // Add to Screen field list
1508 if(flowScreen.fields==null)
1509 flowScreen.fields = new List<MetadataService.FlowScreenField>();
1510 flowScreen.fields.add(flowScreenField);
1511 }
1512 }
1513
1514 public static void retrieveConnectedApp() {
1515 // This only seems to work for Connected App's created in the org, not those packaged, see Workbench only created ones get listed
1516 MetadataService.MetadataPort service = new MetadataService.MetadataPort();
1517 service.SessionHeader = new MetadataService.SessionHeader_element();
1518 service.SessionHeader.sessionId = UserInfo.getSessionId();
1519 MetadataService.ConnectedApp connectedApp =
1520 (MetadataService.ConnectedApp)service.readMetadata('ConnectedApp', new String[] {'Test' }).getRecords()[0];
1521 system.debug('connectedApp = ' + connectedApp);
1522 }
1523
1524 public static void dumpOrgSettings() {
1525 MetadataService.MetadataPort service = createService();
1526 List<MetadataService.ListMetadataQuery> queries = new List<MetadataService.ListMetadataQuery>();
1527 MetadataService.ListMetadataQuery querySettings = new MetadataService.ListMetadataQuery();
1528 querySettings.type_x = 'Settings';

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 23/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
1529 queries.add(querySettings);
1530 MetadataService.FileProperties[] fileProperties = service.listMetadata(queries, 37);
1531 for(MetadataService.FileProperties fileProperty : fileProperties)
1532 System.debug(fileProperty.fullName);
1533 }
1534
1535
1536 /**
1537 * Method cloneReport(String sFolderApiName, String sReportApiName, String tFolderApiName, String tReportApiName)
1538 * @param sFolderApiName: api name of the (source) folder of the report to clone
1539 * @param sReportApiName: api name of the (source) report to clone
1540 * @param tFolderApiName: api name of the (target) folder to create the cloned report in
1541 * @param tReportApiName: api name of the (target) cloned report
1542 */
1543 public static void cloneReport(String sFolderApiName, String sReportApiName, String tFolderApiName, String tReportApiName) {
1544 MetadataService.MetadataPort service = new MetadataService.MetadataPort();
1545 service.SessionHeader = new MetadataService.SessionHeader_element();
1546 service.SessionHeader.sessionId = UserInfo.getSessionId();
1547
1548 // Get the report to clone
1549 MetadataService.Report reportToClone = (MetadataService.Report) service.readMetadata('Report', new String[] { sFolderApiName+'/
1550
1551 // Instanciate a new one to attribute the same metadata from the report to clone
1552 MetadataService.Report apexReport = new MetadataService.Report();
1553 // Set the cloned report properties from parameters and the source report
1554 apexReport.name = reportToClone.name + ' Clone';
1555 apexReport.fullName = tFolderApiName + '/' + tReportApiName;
1556 apexReport.reportType = reportToClone.reportType;
1557 apexReport.description = reportToClone.description;
1558 apexReport.format = reportToClone.format;
1559 apexReport.filter = reportToClone.filter;
1560 apexReport.showDetails = reportToClone.showDetails;
1561 apexReport.sortColumn = reportToClone.sortColumn;
1562 apexReport.sortOrder = reportToClone.sortOrder;
1563 apexReport.groupingsAcross = reportToClone.groupingsAcross;
1564 apexReport.groupingsDown = reportToClone.groupingsDown;
1565 apexReport.chart = reportToClone.chart;
1566 apexReport.timeFrameFilter = reportToClone.timeFrameFilter;
1567 apexReport.columns = reportToClone.columns;
1568
1569 // Create the report clone
1570 List<MetadataService.SaveResult> results = service.createMetadata(new MetadataService.Metadata[] { apexReport });
1571
1572 // Handle results
1573 handleSaveResults(results[0]);
1574 }
1575
1576 public static void updateDashboard()
1577 {
1578 MetadataService.MetadataPort service = createService();
1579
1580 // Read Dashboard
1581 MetadataService.Dashboard dashboard =
1582 (MetadataService.Dashboard) service.readMetadata('Dashboard',
1583 new String[] { 'MyDashboards/MyDashboard' }).getRecords()[0];
1584 System.debug('Name ' + dashboard.fullName);
1585
1586 // Update Dashboard
1587 dashboard.title = 'My updated dashboard';
1588 dashboard.leftSection.components = new List<MetadataService.DashboardComponent>();
1589 MetadataService.DashboardComponent newComponent = new MetadataService.DashboardComponent();
1590 newComponent.autoselectColumnsFromReport = true;
1591 newComponent.componentType = 'Table';
1592 newComponent.displayUnits = 'Auto';
1593 newComponent.drillEnabled = false;
1594 newComponent.drillToDetailEnabled = false;
1595 newComponent.indicatorHighColor = '#54C254';

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 24/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
1596 newComponent.indicatorLowColor = '#C2C254';
1597 newComponent.indicatorMiddleColor = '#C2C254';
1598 newComponent.report = 'MyFolder/Accounts';
1599 newComponent.sortBy = 'RowLabelAscending';
1600 dashboard.leftSection.components.add(newComponent);
1601 handleSaveResults(service.updateMetadata(new List<MetadataService.Metadata> { dashboard })[0]);
1602 }
1603
1604 /**
1605 * Error occured processing component OrgPreference. create() not supported for OrgPreferenceSettings (FIELD_INTEGRITY_EXCEPTION). :-(
1606 **/
1607 /*
1608 public static void enableChatter() {
1609 MetadataService.MetadataPort service = createService();
1610 MetadataService.OrgPreferenceSettings orgSettings = new MetadataService.OrgPreferenceSettings();
1611 orgSettings.preferences = new List<MetadataService.OrganizationSettingsDetail>();
1612 MetadataService.OrganizationSettingsDetail chatterPref = new MetadataService.OrganizationSettingsDetail();
1613 chatterPref.settingName = 'ChatterEnabled';
1614 chatterPref.settingValue = true;
1615 orgSettings.preferences.add(chatterPref);
1616 List<MetadataService.SaveResult> results =
1617 service.createMetadata(
1618 new MetadataService.Metadata[] { orgSettings });
1619 handleSaveResults(results[0]);
1620
1621 }
1622 */
1623
1624 public class MetadataServiceExamplesException extends Exception { }
1625
1626 public static MetadataService.MetadataPort createService()
1627 {
1628 MetadataService.MetadataPort service = new MetadataService.MetadataPort();
1629 service.SessionHeader = new MetadataService.SessionHeader_element();
1630 service.SessionHeader.sessionId = UserInfo.getSessionId();
1631 return service;
1632 }
1633
1634 /**
1635 * Example helper method to interpret a SaveResult, throws an exception if errors are found
1636 **/
1637 public static void handleSaveResults(MetadataService.SaveResult saveResult)
1638 {
1639 // Nothing to see?
1640 if(saveResult==null || saveResult.success)
1641 return;
1642 // Construct error message and throw an exception
1643 if(saveResult.errors!=null)
1644 {
1645 List<String> messages = new List<String>();
1646 messages.add(
1647 (saveResult.errors.size()==1 ? 'Error ' : 'Errors ') +
1648 'occured processing component ' + saveResult.fullName + '.');
1649 for(MetadataService.Error error : saveResult.errors)
1650 messages.add(
1651 error.message + ' (' + error.statusCode + ').' +
1652 ( error.fields!=null && error.fields.size()>0 ?
1653 ' Fields ' + String.join(error.fields, ',') + '.' : '' ) );
1654 if(messages.size()>0)
1655 throw new MetadataServiceExamplesException(String.join(messages, ' '));
1656 }
1657 if(!saveResult.success)
1658 throw new MetadataServiceExamplesException('Request failed with no specified error.');
1659 }
1660
1661 /**
1662 * Example helper method to interpret a SaveResult, throws an exception if errors are found

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 25/26
2/10/2018 apex-mdapi/MetadataServiceExamples.cls at master · financialforcedev/apex-mdapi · GitHub
1663 **/
1664 public static void handleDeleteResults(MetadataService.DeleteResult deleteResult)
1665 {
1666 // Nothing to see?
1667 if(deleteResult==null || deleteResult.success)
1668 return;
1669 // Construct error message and throw an exception
1670 if(deleteResult.errors!=null)
1671 {
1672 List<String> messages = new List<String>();
1673 messages.add(
1674 (deleteResult.errors.size()==1 ? 'Error ' : 'Errors ') +
1675 'occured processing component ' + deleteResult.fullName + '.');
1676 for(MetadataService.Error error : deleteResult.errors)
1677 messages.add(
1678 error.message + ' (' + error.statusCode + ').' +
1679 ( error.fields!=null && error.fields.size()>0 ?
1680 ' Fields ' + String.join(error.fields, ',') + '.' : '' ) );
1681 if(messages.size()>0)
1682 throw new MetadataServiceExamplesException(String.join(messages, ' '));
1683 }
1684 if(!deleteResult.success)
1685 throw new MetadataServiceExamplesException('Request failed with no specified error.');
1686 }
1687
1688 /**
1689 * Example helper method to interpret a UpsertResult, throws an exception if errors are found
1690 **/
1691 public static void handleUpsertResults(MetadataService.UpsertResult upsertResult)
1692 {
1693 // Nothing to see?
1694 if(upsertResult==null || upsertResult.success)
1695 return;
1696 // Construct error message and throw an exception
1697 if(upsertResult.errors!=null)
1698 {
1699 List<String> messages = new List<String>();
1700 messages.add(
1701 (upsertResult.errors.size()==1 ? 'Error ' : 'Errors ') +
1702 'occured processing component ' + upsertResult.fullName + '.');
1703 for(MetadataService.Error error : upsertResult.errors)
1704 messages.add(
1705 error.message + ' (' + error.statusCode + ').' +
1706 ( error.fields!=null && error.fields.size()>0 ?
1707 ' Fields ' + String.join(error.fields, ',') + '.' : '' ) );
1708 if(messages.size()>0)
1709 throw new MetadataServiceExamplesException(String.join(messages, ' '));
1710 }
1711 if(!upsertResult.success)
1712 throw new MetadataServiceExamplesException('Request failed with no specified error.');
1713 }
1714 }

https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataServiceExamples.cls 26/26

S-ar putea să vă placă și