How to generate an XML file with specific format and place it in MID Server

V S Jithendra K
Tera Contributor

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.

1 ACCEPTED SOLUTION

Markus Kraus
Kilo Sage

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);
}

 

 

 

View solution in original post

5 REPLIES 5

Markus Kraus
Kilo Sage

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);
}

 

 

 

@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&colon;gs.beginningOfToday()@javascript&colon;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);
}

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".

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.