KBEC-00097 - Using JavaScript property expansion to iterate through available properties

Article ID:360032831572
2 minute readKnowledge base

Summary

Occasionally, you may need to list all available properties in a property sheet or associated with an intrinsic (/my…​).

A couple of use cases for this:

  • You do not know the name of a property and do not have access to XPath

  • You are retrieving the values of properties stored in a property sheet in a previous step.

Solution

Use a JavaScript expansion and a 'for' loop to get the properties.

$[/javascript
for (var propName in ) {
    // do something
}
]

Example 1 - list all properties on an object

The following JavaScript will echo all of the properties of the /myWorkspace property sheet in a command shell.

$[/javascript
var props = "echo all props:";
for (var propName in myWorkspace) {
    var props = props + "\necho " + propName + " = " + myWorkspace[propName];
}
props;
]

Example 2 - list all properties on a property sheet

The following JavaScript will echo all of the properties on a property sheet in a command shell.

$[/javascript
var props = ""; // Initialize output variable
for (var propName in myProject.anyPropertysheet.properties) {
    var props = props + "echo " + propName + " = " + myProject.anyPropertysheet.properties[propName].value + "\n";
} // Populate variable with list of echo commands
props; // Printout list of commands
]

Example 3 - recursively list all custom properties on a property sheet

The following JavaScript will show an entire hierarchy of properties and property sheets.

$[/javascript
// Define a recursive function that will show an entire hierarchy of
//   properties and property sheets
// To start, you can pass any object or property sheet
//
// It only displays properties from the "custom property sheet" of
//   an object, not its intrinsic properties

 function showProperties(ecObject)
  {
      var retVal = '';

      // Use "properties" to get a list of all properties in an object
      for (var propertyName in ecObject.properties) {

            // Get the property (which may be a property sheet)
            var currentProperty = ecObject.properties[propertyName];

            // If the property has .value defined, it's a value.
            if (typeof (currentProperty.value) != 'undefined') {
                retVal += propertyName + ' - ' + currentProperty.value + '\n';
            } else {
                // It is a nested sheet - Display the sheet via recursive call
                retVal += '*** Property Sheet ' + propertyName + ' ***\n';
                retVal += showProperties(currentProperty);
                retVal += '*** End of ' + propertyName + ' ***\n';
            }
      }
      return (retVal);
  }


  // Sample calls
  var str = '';
  startingObjectOrSheet = server.settings;
  str += showProperties(startingObjectOrSheet)
  var startingObjectOrSheet = projects['Electric Cloud'].schedules.SentryMonitor;
  str += showProperties(startingObjectOrSheet)
  str;
]
This article is part of our Knowledge Base and is provided for guidance-based purposes only. The solutions or workarounds described here are not officially supported by CloudBees and may not be applicable in all environments. Use at your own discretion, and test changes in a safe environment before applying them to production systems.