During script debugging, for example, when developing a Virtual Business Component, it is useful to be able to print out the contents of a property set. This blog introduce an eScript code that can be added to a business service to print out the contents of a property set.
The eScript code will handle multiple level property sets. It is not limited to one or two layers of child property sets; rather, it is recursive and handles any depth of child property sets.
The listing also shows the child depth so you can see at a glance how deep in the hierarchy you are. The indent amount is configurable, so for property sets with several children you can choose a smaller indent.
The script provided writes out to a text file, but all the printed output is written through the LogMe() routine so it is easy to redirect it if required.
To add the code to a Business Service, follow these steps:
- After the new functions appear, there will be a few lines of script code remaining in the General Declarations Section. You can make the following optional changes:
- Modify the output filename assigned to OutPutFileName if you wish to write to a different file. Remember that in eScript a backslash must be escaped, so a path name like C:\TEMP\LOGS\output.txt becomes C:\\TEMP\\LOGS\\output.txt.
- Change the indent level. It is two spaces by default.
- Now when you want to print out the values in a property set, simply call it like this:
DumpPropSet(MyPropertySet);
eScript Code
// Add to General Declarations section
// Change this to the file and pathname you want the report to appear in.
var OutPutFileName = ‘C:\\PropertySet_Dump.txt’;
var IndentAmount = 2; // Indent child prop sets listing this many spaces
// to the right for each level down.
var PSDepth = 0; // How deep in the property set tree, what level
// Add to General Declarations section
function LogMe(LogThis)
{
// Writes a line out to a text file. All printed output is routed
// through this routine, so add HTML or popup writes here to redirect
// the printed output.
var MyFile = Clib.fopen(OutPutFileName, ‘at’);
var sTime = Clib.ctime(Clib.time());
sTime = sTime.replace(‘\n’,’ ‘); // Remove trailing Newline.
Clib.fputs(sTime + ‘: ‘ + LogThis + ‘\n’, MyFile);
Clib.fclose(MyFile);
}
function DumpPropSet(Inputs)
{
// Print out the contents of a property set.
PSDepth++; // We have just dived down a level
var InpValue;
var InpType;
var InpChildCount;
var inprop;
var inpropval;
var inpropcnt;
var BlankLine = ‘ ‘;
// Build a string to indent the Listing.
var IndentSpaces = ”; // Number of spaces to indent to
for (var SpaceCount = 0; SpaceCount < IndentAmount * PSDepth; SpaceCount++)
{
IndentSpaces = IndentSpaces + ‘ ‘;
}
var IndentLevel = ToString(PSDepth);
if (PSDepth < 10)
{IndentLevel = ‘0’ + IndentLevel;}
// Indent by a number of indents, then level number as nn, then two spaces
var Indent = IndentSpaces + IndentLevel + ‘ ‘;
LogMe(BlankLine);
LogMe(BlankLine);
LogMe(Indent + ‘—- Starting a new property set —-‘);
LogMe(BlankLine);
// Now do main value and type
InpValue = Inputs.GetValue();
InpType = Inputs.GetType();
InpChildCount = Inputs.GetChildCount();
LogMe(Indent + ‘Value is …….. : “‘ + InpValue + ‘”‘);
LogMe(Indent + ‘Type is …….. : “‘ + InpType + ‘”‘);
LogMe(Indent + ‘Child count ….. : ‘ + ToString(InpChildCount));
// Dump the properties of this property set
var PropCounter = 0;
inprop = Inputs.GetFirstProperty();
while (inprop != “”)
{
PropCounter++;
inpropval = Inputs.GetProperty(inprop);
LogMe(BlankLine);
var PropCountStr = ToString(PropCounter);
if (PropCounter < 10)
{ PropCountStr = ‘0’ + PropCountStr; }
LogMe(Indent + ‘Property ‘ + PropCountStr + ‘ name : “‘ + inprop + ‘”‘);
LogMe(Indent + ‘Property ‘ + PropCountStr + ‘ value : “‘ + inpropval + ‘”‘);
inprop = Inputs.GetNextProperty();
}
// Dump the children of this PropertySet
if (InpChildCount == 0)
{
LogMe(BlankLine);
LogMe(Indent + ‘(No children exist below this property set.)’);
}
else
{
for (var ChildNumber = 0; ChildNumber < InpChildCount; ChildNumber++)
{
LogMe(BlankLine);
LogMe(Indent + ‘Child Property Set ‘ + ToNumber(ChildNumber + 1) + ‘ of ‘ + ToNumber(InpChildCount) + ‘ follows below.’);
LogMe(Indent + ‘This child is on level ‘ + ToNumber(PSDepth));
// Recursive call for children, grandchildren, etc.
DumpPropSet(Inputs.GetChild(ChildNumber));
}
}
PSDepth–; // We are about to pop up a level
}