Additional Blogs by Members
cancel
Showing results for 
Search instead for 
Did you mean: 
Former Member
0 Kudos

There are some cases, when working with Master Data Management, where it’s necessary to export a hierarchy structure. This blog show you a solution how you can do this with the MDM JavaAPI.  

 

Mainly I would post for you the code how to do this. The code is quite simple and uses just the ‘RetrieveLimitedHierTreeCommand’ to retrieve the whole hierarchy out of a defined mdm-table and JDOM (an open source Java-based document object model for XML) to build the xml file.

 

 

Prerequisites to execute the code: 

 

I hope you enjoy the code and the especially the result, feel free to improve it.

 

 

 Code:

 

 

 

package com.sap.mdm.examples;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;

import com.sap.mdm.commands.CommandException;
import com.sap.mdm.data.HierNode;
import com.sap.mdm.data.ResultDefinition;
import com.sap.mdm.data.commands.RetrieveLimitedHierTreeCommand;
import com.sap.mdm.ids.FieldId;
import com.sap.mdm.net.ConnectionException;

public class GenerateHierarchy {

public Repository repository;

public static void main(String[] args) throws ConnectionException, CommandException {

String filePath = "c:/";
String fileName = "hierarchy.xml";

// Create new repository instance and initialize with default values
Repository repository = new Repository();
repository.initialize();

// Create the result definition for the search table
ResultDefinition rd = new ResultDefinition(repository.getTableId("Categories"));
rd.addSelectField(repository.getFieldId("Categories", "Name"));

// Instantiate command
RetrieveLimitedHierTreeCommand retrieveLimitedHierTreeCommand;

try {

retrieveLimitedHierTreeCommand = new RetrieveLimitedHierTreeCommand(repository.getConnection());
retrieveLimitedHierTreeCommand.setSession(repository.getAuthenticatedUserSession().getSession());
retrieveLimitedHierTreeCommand.setResultDefinition(rd);

retrieveLimitedHierTreeCommand.execute();

} catch (CommandException e1) {
System.out.println("Exception executing the hiererchy-command");
e1.printStackTrace();
return;
}

// retrieve the tree
HierNode rootNode = retrieveLimitedHierTreeCommand.getTree();

// Instantiate the xml document and the root element
Document doc = new Document();
Element xmlStructure = new Element("NODES");

// Instantiate the generation class
GenerateHierarchy app = new GenerateHierarchy(repository);

// build the xml structure recursively
xmlStructure = app.buildTree(rootNode, xmlStructure);

doc.setRootElement(xmlStructure);

XMLOutputter outputter = new XMLOutputter();

// specify the file path
File file = new File(filePath, fileName);

try {
// creates the file
file.createNewFile();
FileWriter out = new FileWriter(file);
outputter.output(doc, out);
out.close();

} catch (IOException e) {
e.printStackTrace();
System.out.println("Error writing file");
}

}

public GenerateHierarchy(Repository repository) {

this.repository = repository;

}

/**
* Saves the mdm-node data in a corresponding xmlnode The methods works from
* the root-node to all children nodes
*
* @param node
* actual node in the mdm tree
* @param xmlNode
* actual node in the xml structure
* @return the xmlNode currently working on
* @throws ConnectionException
* @throws CommandException
*/
private Element buildTree(HierNode node, Element xmlNode) throws ConnectionException, CommandException {

// Do this just with the child-nodes
if (!node.isRoot()) {

// print the record ID
xmlNode.setAttribute("ID", node.getId().toString());

// get the field ID
FieldId fieldId = repository.getFieldId("Categories", "Name");

// check that its not null
if (node.getFieldValue(fieldId) != null) {
// print the name-attribute
xmlNode.setAttribute("Name", node.getFieldValue(fieldId).toString());

}
}

// Process the child nodes
HierNode[] children = node.getChildren();

if (children != null) {

for (int i = 0; i<children.length; i++) {
// work on the children recursively
xmlNode.addContent(buildTree(children[i], new Element("Node")));

}

}

return xmlNode;

}

}