package org.molgenis.omx.hl7; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.molgenis.framework.db.Database; import org.molgenis.framework.db.Database.DatabaseAction; import org.molgenis.framework.db.DatabaseException; import org.molgenis.framework.db.QueryRule; import org.molgenis.framework.db.QueryRule.Operator; import org.molgenis.observ.ObservableFeature; import org.molgenis.observ.Protocol; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import app.DatabaseFactory; public class XMLReader { Node node = null; Database db = null; public static void main(String args[]) { XMLReader test = new XMLReader(); try { test.run(); } catch (DatabaseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public Node nodeFunction(String xmlCode, String molgenisCode) { if (node.getNodeName().equals(xmlCode)) { if (!xmlCode.equals("")) { System.out.println(molgenisCode + "" + node.getAttributes().getNamedItem(xmlCode).getNodeValue()); } return node; } return node; } public void run() throws DatabaseException { try { // Get a fresh new database object this.db = DatabaseFactory.create(); // Begin transaction if anything goes wrong, can always roll back // and the database won`t be screwed up db.beginTx(); // Load the XML file in the memory String path = "/Users/pc_iverson/Desktop/Input/"; File file = new File(path + "StageCatalog.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = dbf.newDocumentBuilder(); Document doc = documentBuilder.parse(file); doc.getDocumentElement().normalize(); // Loop through the "organizer" to collect information on the // protocolName and // ObservableFeatureName and its fields! NodeList nodeLst = doc.getElementsByTagName("organizer"); for (int i = 0; i < nodeLst.getLength(); i++) { // Get each "organizer" entity Node eachNode = nodeLst.item(i); // Probably the List size is 1 cos there is only one code entity // in the direct child of the organizer entity List<String> protocolNameNode = getAttributeFromEntity(eachNode, "code", "code", 1); List<Node> measurementNode = getChildNodes(eachNode, "observation", 2); transformToObservableFeature(protocolNameNode.get(0), measurementNode); } // commit all the changes in the database db.commitTx(); } catch (Exception e) { // if anything goes wrong, roll back to the previous state db.rollbackTx(); e.printStackTrace(); } } /** * This method is to create the Protocol and its corresponding * ObservableFeatures and add them to the db. * * @param protocolName * @param measurementNode * @throws DatabaseException */ private void transformToObservableFeature(String protocolName, List<Node> measurementNode) throws DatabaseException { List<String> listOfObservableFeatureName = new ArrayList<String>(); Protocol p = new Protocol(); p.setName(protocolName); // p.setInvestigation(inv); // TODO can we delete this? List<ObservableFeature> listOfObservableFeatures = new ArrayList<ObservableFeature>(); for (Node eachNode : measurementNode) { List<String> nameOfObservableFeature = getAttributeFromEntity(eachNode, "code", "code", 1); List<String> description = getAttributeFromEntity(eachNode, "originalText", "", 2); List<String> dataType = getAttributeFromEntity(eachNode, "value", "xsi:type", 1); ObservableFeature m = new ObservableFeature(); m.setName(nameOfObservableFeature.get(0)); m.setDescription(description.get(0)); if (dataType.get(0).equals("INT")) { m.setDataType("int"); } else if (dataType.get(0).equals("ST")) { m.setDataType("string"); } else if (dataType.get(0).equals("TS")) { m.setDataType("datetime"); } System.out.println(dataType.get(0)); // m.setInvestigation(inv); // TODO can we delete this? listOfObservableFeatures.add(m); listOfObservableFeatureName.add(m.getName()); } db.update(listOfObservableFeatures, DatabaseAction.ADD_IGNORE_EXISTING, ObservableFeature.NAME); listOfObservableFeatures = db.find(ObservableFeature.class, new QueryRule(ObservableFeature.NAME, Operator.IN, listOfObservableFeatureName)); List<Integer> listOfObservableFeatureId = new ArrayList<Integer>(); for (ObservableFeature m : listOfObservableFeatures) { listOfObservableFeatureId.add(m.getId()); } p.setFeatures_Id(listOfObservableFeatureId); if (db.find(Protocol.class, new QueryRule(Protocol.NAME, Operator.EQUALS, protocolName)).size() == 0) { db.add(p); } else { db.update(p); } } /** * This method is to get the specified entities inside the current node. We * can specify how many levels down we want to go to. * * @param currentEntity * @param subNodeName * @param level * @return */ public List<Node> getChildNodes(Node currentEntity, String subNodeName, int level) { List<Node> listOfSubNodes = new ArrayList<Node>(); for (int x = 0; x < currentEntity.getChildNodes().getLength(); x++) { Node subNode = currentEntity.getChildNodes().item(x); if (level == 1) { if (subNode.getNodeName().equals(subNodeName)) { listOfSubNodes.add(subNode); // System.out.println(subNode.getAttributes().getNamedItem(attributeName).getNodeValue()); // System.out.println(subNode.getTextContent()); } } else { int nextLevel = level - 1; List<Node> temp = getChildNodes(subNode, subNodeName, nextLevel); listOfSubNodes.addAll(temp); } } return listOfSubNodes; } /** * This method is to get the specified attribute from the specified * entities. We can specify how many levels down we want to go to. * * @param currentEntity * @param subNodeName * @param attributeName * @param level * @return */ public List<String> getAttributeFromEntity(Node currentEntity, String subNodeName, String attributeName, int level) { List<String> listOfSubNodes = new ArrayList<String>(); for (int x = 0; x < currentEntity.getChildNodes().getLength(); x++) { Node subNode = currentEntity.getChildNodes().item(x); if (level == 1) { if (subNode.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) subNode; if (element.getNodeName().equals(subNodeName)) { if (attributeName.equals("")) { listOfSubNodes.add(element.getTextContent()); } else if (element.hasAttribute(attributeName)) { listOfSubNodes.add(element.getAttribute(attributeName)); // System.out.println("The attribute is " + // element.getAttribute(attributeName)); } } } } else { int nextLevel = level - 1; List<String> temp = getAttributeFromEntity(subNode, subNodeName, attributeName, nextLevel); listOfSubNodes.addAll(temp); } } return listOfSubNodes; } }