- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-01-2023 03:39 AM
Hi All,
I have a requirement to generate an XML file with specific format and place it in MID Server. Requirement is as follows:
1. Query sys_user table to get those records where Active=false and Updated_on=Today.
2. Based on the result set, get the employee number of each record and create the XML string in below format:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<Import>
<Pers id="12345" operation="update">
<Status>Disabled</Status>
<Card id="1" operation="delete"/>
<Card id="2" operation="delete"/>
<Card id="3" operation="delete"/>
<Card id="4" operation="delete"/>
<Card id="5" operation="delete"/>
</Pers>
<Pers id="23456" operation="update">
<Status>Disabled</Status>
<Card id="1" operation="delete"/>
<Card id="2" operation="delete"/>
<Card id="3" operation="delete"/>
<Card id="4" operation="delete"/>
<Card id="5" operation="delete"/>
</Pers>
<Pers id="34567" operation="update">
<Status>Disabled</Status>
<Card id="1" operation="delete"/>
<Card id="2" operation="delete"/>
<Card id="3" operation="delete"/>
<Card id="4" operation="delete"/>
<Card id="5" operation="delete"/>
</Pers>
3. Upon generation of XML string, write it to file(.xml extension) and then push it to a specified location(file path) in MID Server.
Note : I can make use of Export Set however, i cannot export the data in the format that is mentioned above.
Any pointers on the best possible way to achieve this requirement would be really helpful.
Thanks in advance!!
~Kumar.
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-07-2023 03:17 PM - edited 05-18-2023 11:45 PM
Note: The following example will place the file in next to the start.bat / start.sh of your mid server installation.
You can put use any filepath, but you need to make sure, that your mid server user has access to the file.
Also note that you might want to change the mid server (checkout the line where eccGr.agent = "mid.server.<name of the mid server record>"
var doc = new XMLDocument2();
var importNode = doc.createElement('Import');
createPers(doc, importNode, '12345', 'update', 'Disabled', [{ id: '1', operation: 'delete' }, { id: '2', operation: 'delete' }, { id: '2', operation: 'delete' }]);
createPers(doc, importNode, '23456', 'update', 'Disabled', [{ id: '1', operation: 'delete' }, { id: '2', operation: 'delete' }, { id: '2', operation: 'delete' }]);
createPers(doc, importNode, '34567', 'update', 'Disabled', [{ id: '1', operation: 'delete' }, { id: '2', operation: 'delete' }, { id: '2', operation: 'delete' }]);
var midServerName = 'test';
sendToMid(midServerName, 'helloWorld.xml', doc.toString());
function sendToMid(midServerName, fileName, fileContent) {
var saveScript = function () {
var fileWriter = new Packages.java.io.FileWriter(probe.getParameter("file_name"));
try {
fileWriter.write(probe.getParameter("file_content"));
} catch (e) {
return e.message;
} finally {
fileWriter.close();
}
};
var params = { 'skip_sensor': true, 'file_name': fileName, 'file_content': fileContent, 'script': '(' + saveScript.toString() + ')();' };
var payload = new XMLDocument2();
payload.createElement("parameters");
for (var param in params) {
var el = payload.createElement("parameter");
el.setAttribute("name", param);
el.setAttribute("value", params[param]);
}
var eccGr = new GlideRecord("ecc_queue");
eccGr.newRecord();
eccGr.topic = "JavascriptProbe";
eccGr.queue = "output";
eccGr.state = "ready";
eccGr.name = "SaveXMLOnMID";
eccGr.source = "";
eccGr.agent = "mid.server." + midServerName;
eccGr.payload = payload.toString();
return eccGr.insert();
}
function createPers(doc, root, id, operation, status, cards) {
doc.setCurrentElement(root);
var pers = doc.createElement('Pers');
pers.setAttribute('id', id);
pers.setAttribute('operation', operation);
doc.setCurrentElement(pers);
doc.createElementWithTextValue('Status', status);
cards.forEach(function (card) {
createCard(doc, pers, card.id, card.operation);
});
}
function createCard(doc, pers, id, op) {
doc.setCurrentElement(pers);
var node = doc.createElement('Card');
node.setAttribute('id', id);
node.setAttribute('operation', op);
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-07-2023 03:17 PM - edited 05-18-2023 11:45 PM
Note: The following example will place the file in next to the start.bat / start.sh of your mid server installation.
You can put use any filepath, but you need to make sure, that your mid server user has access to the file.
Also note that you might want to change the mid server (checkout the line where eccGr.agent = "mid.server.<name of the mid server record>"
var doc = new XMLDocument2();
var importNode = doc.createElement('Import');
createPers(doc, importNode, '12345', 'update', 'Disabled', [{ id: '1', operation: 'delete' }, { id: '2', operation: 'delete' }, { id: '2', operation: 'delete' }]);
createPers(doc, importNode, '23456', 'update', 'Disabled', [{ id: '1', operation: 'delete' }, { id: '2', operation: 'delete' }, { id: '2', operation: 'delete' }]);
createPers(doc, importNode, '34567', 'update', 'Disabled', [{ id: '1', operation: 'delete' }, { id: '2', operation: 'delete' }, { id: '2', operation: 'delete' }]);
var midServerName = 'test';
sendToMid(midServerName, 'helloWorld.xml', doc.toString());
function sendToMid(midServerName, fileName, fileContent) {
var saveScript = function () {
var fileWriter = new Packages.java.io.FileWriter(probe.getParameter("file_name"));
try {
fileWriter.write(probe.getParameter("file_content"));
} catch (e) {
return e.message;
} finally {
fileWriter.close();
}
};
var params = { 'skip_sensor': true, 'file_name': fileName, 'file_content': fileContent, 'script': '(' + saveScript.toString() + ')();' };
var payload = new XMLDocument2();
payload.createElement("parameters");
for (var param in params) {
var el = payload.createElement("parameter");
el.setAttribute("name", param);
el.setAttribute("value", params[param]);
}
var eccGr = new GlideRecord("ecc_queue");
eccGr.newRecord();
eccGr.topic = "JavascriptProbe";
eccGr.queue = "output";
eccGr.state = "ready";
eccGr.name = "SaveXMLOnMID";
eccGr.source = "";
eccGr.agent = "mid.server." + midServerName;
eccGr.payload = payload.toString();
return eccGr.insert();
}
function createPers(doc, root, id, operation, status, cards) {
doc.setCurrentElement(root);
var pers = doc.createElement('Pers');
pers.setAttribute('id', id);
pers.setAttribute('operation', operation);
doc.setCurrentElement(pers);
doc.createElementWithTextValue('Status', status);
cards.forEach(function (card) {
createCard(doc, pers, card.id, card.operation);
});
}
function createCard(doc, pers, id, op) {
doc.setCurrentElement(pers);
var node = doc.createElement('Card');
node.setAttribute('id', id);
node.setAttribute('operation', op);
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-18-2023 02:52 PM - edited 05-18-2023 02:54 PM
@Markus Kraus Thanks a lot for your response.
Your inputs helped me in getting close to the requirement. Only issue i am observing is that the XML file is not getting generated and placed in MID Server. Below is my entire code:
Please take a look and help me in finding what am i missing!!
function empID(){
var emp = [];
var gr = new GlideRecord('sys_user');
gr.addEncodedQuery('u_hr_status=false^u_hr_status_updatedONToday@javascript:gs.beginningOfToday()@javascript:gs.endOfToday()');
gr.query();
while(gr.next()){
emp.push(gr.getValue('employee_number'));
}
return emp;
}
var test = empID();
var doc = new XMLDocument2();
var importNode = doc.createElement('Import');
for (var i in test){ createPers(doc, importNode, test[i], 'update', 'Disabled', [{ id: '1', operation: 'delete' }, { id: '2', operation: 'delete' }, { id: '3', operation: 'delete' }, { id: '4', operation: 'delete' }, { id: '5', operation: 'delete' }]);
}
sendToMid('badgingtest.xml',doc.toString());
function sendToMid(fileName, fileContent) {
var saveScript = '(function () {'
+ ' try {'
+ ' var fileName = probe.getParameter("file_name");'
+ ' var file = new Packages.java.io.File(fileName);'
+ ' if (!file.canWrite()) {'
+ ' return "Cannot write " + fileName;'
+ ' }'
+ ' var os = new Packages.java.io.FileOutputStream(file);\n'
+ ' try {\n'
+ ' var buffer = new Packages.java.lang.String(probe.getParameter("file_content") || "").getBytes();\n'
+ ' os.write(buffer);\n'
+ ' } catch (e) {'
+ ' return e.message;'
+ ' } finally {'
+ ' os.close();'
+ ' }'
+ ' } catch (e) { return e.message; }'
+ '})();';
var params = { 'skip_sensor': true, 'file_name': fileName, 'file_content': fileContent, 'script': saveScript };
var payload = new XMLDocument2();
payload.createElement("parameters");
for (var param in params) {
var el = payload.createElement("parameter");
el.setAttribute("name", param);
el.setAttribute("value", params[param]);
}
var eccGr = new GlideRecord("ecc_queue");
eccGr.newRecord();
eccGr.topic = "JavascriptProbe";
eccGr.queue = "output";
eccGr.state = "ready";
eccGr.name = "SaveXMLOnMID";
eccGr.source = "";
eccGr.agent = "mid.server.test";
eccGr.payload = payload.toString();
return eccGr.insert();
}
function createPers(doc, root, id, operation, status, cards) {
doc.setCurrentElement(root);
var pers = doc.createElement('Pers');
pers.setAttribute('id', id);
pers.setAttribute('operation', operation);
doc.setCurrentElement(pers);
doc.createElementWithTextValue('Status', status);
cards.forEach(function (card) {
createCard(doc, pers, card.id, card.operation);
});
}
function createCard(doc, pers, id, op) {
doc.setCurrentElement(pers);
var node = doc.createElement('Card');
node.setAttribute('id', id);
node.setAttribute('operation', op);
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-18-2023 11:50 PM
Hello @V S Jithendra K
I saw that this script is not working sometimes on windows mid servers. I've updated my previous answer which contains a script that works on linux + windows mid servers.
The relevant code change is the following:
function sendToMid(/*...*/) {
var saveScript = function () {
var fileWriter = new Packages.java.io.FileWriter(probe.getParameter("file_name"));
try {
fileWriter.write(probe.getParameter("file_content"));
} catch (e) {
return e.message;
} finally {
fileWriter.close();
}
};
var params = { 'skip_sensor': true, 'file_name': fileName, 'file_content': fileContent, 'script': '(' + saveScript.toString() + ')();' };
/*...*/
)
If that works for you, I'd appreciate if you mark my previous answer as the solution so this thread gets marked as "solved".
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-19-2023 12:40 AM
Hi @Markus Kraus ,
Thanks for your quick response!!
Your updated script worked and i am able to generate the file. Could you also help on how and where to mention the file path? For example i want the files to be placed in "export" folder.
Regards,
Jithendra.