package org.oliot.epcis.serde.mongodb; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.log4j.Level; import org.bson.BsonArray; import org.bson.BsonDocument; import org.bson.BsonType; import org.bson.BsonValue; import org.oliot.epcis.configuration.Configuration; import org.oliot.model.epcis.AggregationEventExtension2Type; import org.oliot.model.epcis.BusinessLocationExtensionType; import org.oliot.model.epcis.EPCISEventExtensionType; import org.oliot.model.epcis.ILMDExtensionType; import org.oliot.model.epcis.ILMDType; import org.oliot.model.epcis.ObjectEventExtension2Type; import org.oliot.model.epcis.QuantityEventExtensionType; import org.oliot.model.epcis.ReadPointExtensionType; import org.oliot.model.epcis.SensorEventExtensionType; import org.oliot.model.epcis.TransactionEventExtension2Type; import org.oliot.model.epcis.TransformationEventExtensionType; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * Copyright (C) 2015 Jaewook Byun * * This project is part of Oliot (oliot.org), pursuing the implementation of Electronic Product Code Information Service(EPCIS) v1.1 specification in EPCglobal. * [http://www.gs1.org/gsmp/kc/epcglobal/epcis/epcis_1_1-standard-20140520.pdf] * * * @author Jaewook Byun, Ph.D student * * Korea Advanced Institute of Science and Technology (KAIST) * * Real-time Embedded System Laboratory(RESL) * * bjw0829@kaist.ac.kr, bjw0829@gmail.com */ public class MongoReaderUtil { static List<Object> putAny(BsonDocument anyObject) { try { // Get Namespaces Iterator<String> anyKeysIterN = anyObject.keySet().iterator(); Map<String, String> nsMap = new HashMap<String, String>(); while (anyKeysIterN.hasNext()) { String anyKeyN = anyKeysIterN.next(); if (anyObject.containsKey(anyKeyN) && anyObject.get(anyKeyN).getBsonType().equals(BsonType.STRING) && anyKeyN.startsWith("@")) { nsMap.put(anyKeyN.substring(1, anyKeyN.length()), anyObject.getString(anyKeyN).getValue()); } } Iterator<String> anyKeysIter = anyObject.keySet().iterator(); List<Object> elementList = new ArrayList<Object>(); while (anyKeysIter.hasNext()) { // If namespace, continue to next iteration String anyKey = anyKeysIter.next(); if (anyKey.startsWith("@")) continue; // Convert bson value to a more readable String (List are // handled differently) BsonValue bsonValue = anyObject.get(anyKey); boolean isBsonArray = (bsonValue.getBsonType() == BsonType.ARRAY); boolean isBsonDocument = (bsonValue.getBsonType() == BsonType.DOCUMENT); String value = convertBsonValueToString(bsonValue); // Get Namespace String[] anyKeyCheck = anyKey.split(":"); String namespace = null; String namespaceURI = null; if (anyKeyCheck.length == 2) { namespace = anyKeyCheck[0]; namespaceURI = nsMap.get(namespace).toString(); } if (anyKey != null && (value != null || isBsonArray || isBsonDocument)) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.newDocument(); if (isBsonArray) { Element parentElement = convertBsonValueToArrayElement(bsonValue, anyKey, doc, namespace, namespaceURI); elementList.add(parentElement); } else if (isBsonDocument) { Element parentElement = doc.createElement(anyKey); if (namespace != null) { parentElement.setAttribute("xmlns:" + namespace, namespaceURI); } for(Element child : convertBsonValueToDocumentElements(bsonValue, doc, namespace, namespaceURI)) { parentElement.appendChild(child); } elementList.add(parentElement); } else { Element element = doc.createElement(anyKey); if (namespace != null) { element.setAttribute("xmlns:" + namespace, namespaceURI); } element.setTextContent(value); elementList.add(element); } } } return elementList; } catch (ParserConfigurationException e) { Configuration.logger.log(Level.ERROR, e.toString()); } return null; } private static String convertBsonValueToString(BsonValue bsonValue) { BsonType type = bsonValue.getBsonType(); String value = null; if (type == BsonType.STRING) { value = bsonValue.asString().getValue(); } else if (type == BsonType.INT32) { value = String.valueOf(bsonValue.asInt32().getValue()); } else if (type == BsonType.INT64) { value = String.valueOf(bsonValue.asInt64().getValue()); } else if (type == BsonType.DOUBLE) { value = String.valueOf(bsonValue.asDouble().getValue()); } else if (type == BsonType.BOOLEAN) { value = String.valueOf(bsonValue.asBoolean().getValue()); } return value; } private static Element convertBsonValueToArrayElement(BsonValue bsonValue, String anyKey, Document doc, String namespace, String namespaceURI) { String listSuffix = "List"; String parentTagName = anyKey.endsWith(listSuffix) ? anyKey : anyKey + listSuffix; String childTagName = anyKey.endsWith(listSuffix) ? anyKey.substring(0, anyKey.length() - listSuffix.length()) : anyKey; Element parentElement = doc.createElement(parentTagName); if (namespace != null) { parentElement.setAttribute("xmlns:" + namespace, namespaceURI); } BsonArray arr = bsonValue.asArray(); Iterator<BsonValue> it = arr.iterator(); while (it.hasNext()) { bsonValue = it.next(); Element element = doc.createElement(childTagName); if (namespace != null) { parentElement.setAttribute("xmlns:" + namespace, namespaceURI); } if (bsonValue.isArray()) { element.appendChild(convertBsonValueToArrayElement(bsonValue, anyKey, doc, namespace, namespaceURI)); } else if (bsonValue.isDocument()) { for(Element child : convertBsonValueToDocumentElements(bsonValue, doc, namespace, namespaceURI)) { element.appendChild(child); } } else { String value = convertBsonValueToString(bsonValue); element.setTextContent(value); } parentElement.appendChild(element); } return parentElement; } private static List<Element> convertBsonValueToDocumentElements(BsonValue bsonValue, Document doc, String namespace, String namespaceURI) { List<Element> elements = new LinkedList<>(); BsonDocument document = bsonValue.asDocument(); for (String key : document.keySet()) { bsonValue = document.get(key); Element element; if (bsonValue.isArray()) { element = convertBsonValueToArrayElement(bsonValue, key, doc, namespace, namespaceURI); } else if (bsonValue.isDocument()) { element = doc.createElement(key); for(Element child : convertBsonValueToDocumentElements(bsonValue, doc, namespace, namespaceURI)) { element.appendChild(child); } } else { element = doc.createElement(key); String value = convertBsonValueToString(bsonValue); element.setTextContent(value); } elements.add(element); } return elements; } static ILMDType putILMD(ILMDType ilmd, BsonDocument anyObject) { try { ILMDExtensionType ilmdExtension = new ILMDExtensionType(); // Get Namespaces Iterator<String> anyKeysIterN = anyObject.keySet().iterator(); Map<String, String> nsMap = new HashMap<String, String>(); while (anyKeysIterN.hasNext()) { String anyKeyN = anyKeysIterN.next(); String valueN = anyObject.getString(anyKeyN).getValue(); if (anyKeyN.startsWith("@")) { nsMap.put(anyKeyN.substring(1, anyKeyN.length()), valueN); } } Iterator<String> anyKeysIter = anyObject.keySet().iterator(); List<Object> elementList = new ArrayList<Object>(); while (anyKeysIter.hasNext()) { String anyKey = anyKeysIter.next(); if (anyKey.startsWith("@")) continue; String value = anyObject.getString(anyKey).getValue(); // Get Namespace String[] anyKeyCheck = anyKey.split(":"); String namespace = null; String namespaceURI = null; if (anyKeyCheck.length == 2) { namespace = anyKeyCheck[0]; namespaceURI = nsMap.get(namespace).toString(); } if (anyKey != null && value != null) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.newDocument(); Node node = doc.createElement("value"); node.setTextContent(value); Element element = doc.createElement(anyKey); if (namespace != null) { element.setAttribute("xmlns:" + namespace, namespaceURI); } element.appendChild(node); elementList.add(element); } } ilmdExtension.setAny(elementList); ilmd.setExtension(ilmdExtension); } catch (ParserConfigurationException e) { Configuration.logger.log(Level.ERROR, e.toString()); } return ilmd; } static BusinessLocationExtensionType putBusinessLocationExtension(BusinessLocationExtensionType object, BsonDocument extension) { try { if (extension.get("any") != null) { BsonDocument anyObject = extension.getDocument("any"); // Get Namespaces Iterator<String> anyKeysIterN = anyObject.keySet().iterator(); Map<String, String> nsMap = new HashMap<String, String>(); while (anyKeysIterN.hasNext()) { String anyKeyN = anyKeysIterN.next(); String valueN = anyObject.getString(anyKeyN).getValue(); if (anyKeyN.startsWith("@")) { nsMap.put(anyKeyN.substring(1, anyKeyN.length()), valueN); } } // Process Any Iterator<String> anyKeysIter = anyObject.keySet().iterator(); List<Object> elementList = new ArrayList<Object>(); while (anyKeysIter.hasNext()) { String anyKey = anyKeysIter.next(); if (anyKey.startsWith("@")) continue; String value = anyObject.getString(anyKey).getValue(); // Get Namespace String[] anyKeyCheck = anyKey.split(":"); String namespace = null; String namespaceURI = null; if (anyKeyCheck.length == 2) { namespace = anyKeyCheck[0]; namespaceURI = nsMap.get(namespace).toString(); } if (anyKey != null && value != null) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.newDocument(); Node node = doc.createElement("value"); node.setTextContent(value); Element element = doc.createElement(anyKey); if (namespace != null) { element.setAttribute("xmlns:" + namespace, namespaceURI); } element.appendChild(node); elementList.add(element); } } object.setAny(elementList); } if (extension.get("otherAttributes") != null) { Map<QName, String> otherAttributes = new HashMap<QName, String>(); BsonDocument otherAttributeObject = extension.getDocument("otherAttributes"); Iterator<String> otherKeysIter = otherAttributeObject.keySet().iterator(); while (otherKeysIter.hasNext()) { String anyKey = otherKeysIter.next(); String value = otherAttributeObject.get(anyKey).toString(); otherAttributes.put(new QName("", anyKey), value); } object.setOtherAttributes(otherAttributes); } } catch (ParserConfigurationException e) { Configuration.logger.log(Level.ERROR, e.toString()); } return object; } static ReadPointExtensionType putReadPointExtension(ReadPointExtensionType object, BsonDocument extension) { try { if (extension.get("any") != null) { BsonDocument anyObject = extension.getDocument("any"); // Get Namespaces Iterator<String> anyKeysIterN = anyObject.keySet().iterator(); Map<String, String> nsMap = new HashMap<String, String>(); while (anyKeysIterN.hasNext()) { String anyKeyN = anyKeysIterN.next(); String valueN = anyObject.getString(anyKeyN).getValue(); if (anyKeyN.startsWith("@")) { nsMap.put(anyKeyN.substring(1, anyKeyN.length()), valueN); } } // Process Any Iterator<String> anyKeysIter = anyObject.keySet().iterator(); List<Object> elementList = new ArrayList<Object>(); while (anyKeysIter.hasNext()) { String anyKey = anyKeysIter.next(); if (anyKey.startsWith("@")) continue; String value = anyObject.getString(anyKey).getValue(); // Get Namespace String[] anyKeyCheck = anyKey.split(":"); String namespace = null; String namespaceURI = null; if (anyKeyCheck.length == 2) { namespace = anyKeyCheck[0]; namespaceURI = nsMap.get(namespace).toString(); } if (anyKey != null && value != null) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.newDocument(); Node node = doc.createElement("value"); node.setTextContent(value); Element element = doc.createElement(anyKey); if (namespace != null) { element.setAttribute("xmlns:" + namespace, namespaceURI); } element.appendChild(node); elementList.add(element); } } object.setAny(elementList); } if (extension.get("otherAttributes") != null) { Map<QName, String> otherAttributes = new HashMap<QName, String>(); BsonDocument otherAttributeObject = extension.getDocument("otherAttributes"); Iterator<String> otherKeysIter = otherAttributeObject.keySet().iterator(); while (otherKeysIter.hasNext()) { String anyKey = otherKeysIter.next(); String value = otherAttributeObject.getString(anyKey).getValue(); otherAttributes.put(new QName("", anyKey), value); } object.setOtherAttributes(otherAttributes); } } catch (ParserConfigurationException e) { Configuration.logger.log(Level.ERROR, e.toString()); } return object; } static AggregationEventExtension2Type putAggregationExtension(AggregationEventExtension2Type object, BsonDocument extension) { try { if (extension.get("any") != null) { BsonDocument anyObject = extension.getDocument("any"); // Get Namespaces Iterator<String> anyKeysIterN = anyObject.keySet().iterator(); Map<String, String> nsMap = new HashMap<String, String>(); while (anyKeysIterN.hasNext()) { String anyKeyN = anyKeysIterN.next(); String valueN = anyObject.getString(anyKeyN).getValue(); if (anyKeyN.startsWith("@")) { nsMap.put(anyKeyN.substring(1, anyKeyN.length()), valueN); } } // Process Any Iterator<String> anyKeysIter = anyObject.keySet().iterator(); List<Object> elementList = new ArrayList<Object>(); while (anyKeysIter.hasNext()) { String anyKey = anyKeysIter.next(); if (anyKey.startsWith("@")) continue; String value = anyObject.getString(anyKey).getValue(); // Get Namespace String[] anyKeyCheck = anyKey.split(":"); String namespace = null; String namespaceURI = null; if (anyKeyCheck.length == 2) { namespace = anyKeyCheck[0]; namespaceURI = nsMap.get(namespace).toString(); } if (anyKey != null && value != null) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.newDocument(); Node node = doc.createElement("value"); node.setTextContent(value); Element element = doc.createElement(anyKey); if (namespace != null) { element.setAttribute("xmlns:" + namespace, namespaceURI); } element.appendChild(node); elementList.add(element); } } object.setAny(elementList); } if (extension.get("otherAttributes") != null) { Map<QName, String> otherAttributes = new HashMap<QName, String>(); BsonDocument otherAttributeObject = extension.getDocument("otherAttributes"); Iterator<String> otherKeysIter = otherAttributeObject.keySet().iterator(); while (otherKeysIter.hasNext()) { String anyKey = otherKeysIter.next(); String value = otherAttributeObject.getString(anyKey).getValue(); otherAttributes.put(new QName("", anyKey), value); } object.setOtherAttributes(otherAttributes); } } catch (ParserConfigurationException e) { Configuration.logger.log(Level.ERROR, e.toString()); } return object; } static EPCISEventExtensionType putEPCISExtension(EPCISEventExtensionType object, BsonDocument extension) { try { if (extension.get("any") != null) { BsonDocument anyObject = extension.getDocument("any"); // Get Namespaces Iterator<String> anyKeysIterN = anyObject.keySet().iterator(); Map<String, String> nsMap = new HashMap<String, String>(); while (anyKeysIterN.hasNext()) { String anyKeyN = anyKeysIterN.next(); String valueN = anyObject.getString(anyKeyN).getValue(); if (anyKeyN.startsWith("@")) { nsMap.put(anyKeyN.substring(1, anyKeyN.length()), valueN); } } // Process Any Iterator<String> anyKeysIter = anyObject.keySet().iterator(); List<Object> elementList = new ArrayList<Object>(); while (anyKeysIter.hasNext()) { String anyKey = anyKeysIter.next(); if (anyKey.startsWith("@")) continue; String value = anyObject.get(anyKey).toString(); // Get Namespace String[] anyKeyCheck = anyKey.split(":"); String namespace = null; String namespaceURI = null; if (anyKeyCheck.length == 2) { namespace = anyKeyCheck[0]; namespaceURI = nsMap.get(namespace).toString(); } if (anyKey != null && value != null) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.newDocument(); Node node = doc.createElement("value"); node.setTextContent(value); Element element = doc.createElement(anyKey); if (namespace != null) { element.setAttribute("xmlns:" + namespace, namespaceURI); } element.appendChild(node); elementList.add(element); } } object.setAny(elementList); } if (extension.get("otherAttributes") != null) { Map<QName, String> otherAttributes = new HashMap<QName, String>(); BsonDocument otherAttributeObject = extension.getDocument("otherAttributes"); Iterator<String> otherKeysIter = otherAttributeObject.keySet().iterator(); while (otherKeysIter.hasNext()) { String anyKey = otherKeysIter.next(); String value = otherAttributeObject.getString(anyKey).getValue(); otherAttributes.put(new QName("", anyKey), value); } object.setOtherAttributes(otherAttributes); } } catch (ParserConfigurationException e) { Configuration.logger.log(Level.ERROR, e.toString()); } return object; } static ObjectEventExtension2Type putObjectExtension(ObjectEventExtension2Type oee2t, BsonDocument extension) { try { if (extension.get("any") != null) { BsonDocument anyObject = extension.getDocument("any"); // Get Namespaces Iterator<String> anyKeysIterN = anyObject.keySet().iterator(); Map<String, String> nsMap = new HashMap<String, String>(); while (anyKeysIterN.hasNext()) { String anyKeyN = anyKeysIterN.next(); String valueN = anyObject.get(anyKeyN).toString(); if (anyKeyN.startsWith("@")) { nsMap.put(anyKeyN.substring(1, anyKeyN.length()), valueN); } } // Process Any Iterator<String> anyKeysIter = anyObject.keySet().iterator(); List<Object> elementList = new ArrayList<Object>(); while (anyKeysIter.hasNext()) { String anyKey = anyKeysIter.next(); if (anyKey.startsWith("@")) continue; String value = anyObject.get(anyKey).toString(); // Get Namespace String[] anyKeyCheck = anyKey.split(":"); String namespace = null; String namespaceURI = null; if (anyKeyCheck.length == 2) { namespace = anyKeyCheck[0]; namespaceURI = nsMap.get(namespace).toString(); } if (anyKey != null && value != null) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.newDocument(); Node node = doc.createElement("value"); node.setTextContent(value); Element element = doc.createElement(anyKey); if (namespace != null) { element.setAttribute("xmlns:" + namespace, namespaceURI); } element.appendChild(node); elementList.add(element); } } oee2t.setAny(elementList); } if (extension.get("otherAttributes") != null) { Map<QName, String> otherAttributes = new HashMap<QName, String>(); BsonDocument otherAttributeObject = extension.getDocument("otherAttributes"); Iterator<String> otherKeysIter = otherAttributeObject.keySet().iterator(); while (otherKeysIter.hasNext()) { String anyKey = otherKeysIter.next(); String value = otherAttributeObject.get(anyKey).toString(); otherAttributes.put(new QName("", anyKey), value); } oee2t.setOtherAttributes(otherAttributes); } } catch (ParserConfigurationException e) { Configuration.logger.log(Level.ERROR, e.toString()); } return oee2t; } static QuantityEventExtensionType putQuantityExtension(QuantityEventExtensionType object, BsonDocument extension) { try { if (extension.get("any") != null) { BsonDocument anyObject = extension.getDocument("any"); // Get Namespaces Iterator<String> anyKeysIterN = anyObject.keySet().iterator(); Map<String, String> nsMap = new HashMap<String, String>(); while (anyKeysIterN.hasNext()) { String anyKeyN = anyKeysIterN.next(); String valueN = anyObject.get(anyKeyN).toString(); if (anyKeyN.startsWith("@")) { nsMap.put(anyKeyN.substring(1, anyKeyN.length()), valueN); } } // Process Any Iterator<String> anyKeysIter = anyObject.keySet().iterator(); List<Object> elementList = new ArrayList<Object>(); while (anyKeysIter.hasNext()) { String anyKey = anyKeysIter.next(); if (anyKey.startsWith("@")) continue; String value = anyObject.get(anyKey).toString(); // Get Namespace String[] anyKeyCheck = anyKey.split(":"); String namespace = null; String namespaceURI = null; if (anyKeyCheck.length == 2) { namespace = anyKeyCheck[0]; namespaceURI = nsMap.get(namespace).toString(); } if (anyKey != null && value != null) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.newDocument(); Node node = doc.createElement("value"); node.setTextContent(value); Element element = doc.createElement(anyKey); if (namespace != null) { element.setAttribute("xmlns:" + namespace, namespaceURI); } element.appendChild(node); elementList.add(element); } } object.setAny(elementList); } if (extension.get("otherAttributes") != null) { Map<QName, String> otherAttributes = new HashMap<QName, String>(); BsonDocument otherAttributeObject = extension.getDocument("otherAttributes"); Iterator<String> otherKeysIter = otherAttributeObject.keySet().iterator(); while (otherKeysIter.hasNext()) { String anyKey = otherKeysIter.next(); String value = otherAttributeObject.get(anyKey).toString(); otherAttributes.put(new QName("", anyKey), value); } object.setOtherAttributes(otherAttributes); } } catch (ParserConfigurationException e) { Configuration.logger.log(Level.ERROR, e.toString()); } return object; } static SensorEventExtensionType putSensorExtension(SensorEventExtensionType object, BsonDocument extension) { try { if (extension.get("any") != null) { BsonDocument anyObject = extension.getDocument("any"); // Get Namespaces Iterator<String> anyKeysIterN = anyObject.keySet().iterator(); Map<String, String> nsMap = new HashMap<String, String>(); while (anyKeysIterN.hasNext()) { String anyKeyN = anyKeysIterN.next(); String valueN = anyObject.get(anyKeyN).toString(); if (anyKeyN.startsWith("@")) { nsMap.put(anyKeyN.substring(1, anyKeyN.length()), valueN); } } // Process Any Iterator<String> anyKeysIter = anyObject.keySet().iterator(); List<Object> elementList = new ArrayList<Object>(); while (anyKeysIter.hasNext()) { String anyKey = anyKeysIter.next(); if (anyKey.startsWith("@")) continue; String value = anyObject.get(anyKey).toString(); // Get Namespace String[] anyKeyCheck = anyKey.split(":"); String namespace = null; String namespaceURI = null; if (anyKeyCheck.length == 2) { namespace = anyKeyCheck[0]; namespaceURI = nsMap.get(namespace).toString(); } if (anyKey != null && value != null) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.newDocument(); Node node = doc.createElement("value"); node.setTextContent(value); Element element = doc.createElement(anyKey); if (namespace != null) { element.setAttribute("xmlns:" + namespace, namespaceURI); } element.appendChild(node); elementList.add(element); } } object.setAny(elementList); } if (extension.get("otherAttributes") != null) { Map<QName, String> otherAttributes = new HashMap<QName, String>(); BsonDocument otherAttributeObject = extension.getDocument("otherAttributes"); Iterator<String> otherKeysIter = otherAttributeObject.keySet().iterator(); while (otherKeysIter.hasNext()) { String anyKey = otherKeysIter.next(); String value = otherAttributeObject.get(anyKey).toString(); otherAttributes.put(new QName("", anyKey), value); } object.setOtherAttributes(otherAttributes); } } catch (ParserConfigurationException e) { Configuration.logger.log(Level.ERROR, e.toString()); } return object; } static TransactionEventExtension2Type putTransactionExtension(TransactionEventExtension2Type object, BsonDocument extension) { try { if (extension.get("any") != null) { BsonDocument anyObject = extension.getDocument("any"); // Get Namespaces Iterator<String> anyKeysIterN = anyObject.keySet().iterator(); Map<String, String> nsMap = new HashMap<String, String>(); while (anyKeysIterN.hasNext()) { String anyKeyN = anyKeysIterN.next(); String valueN = anyObject.get(anyKeyN).toString(); if (anyKeyN.startsWith("@")) { nsMap.put(anyKeyN.substring(1, anyKeyN.length()), valueN); } } // Process Any Iterator<String> anyKeysIter = anyObject.keySet().iterator(); List<Object> elementList = new ArrayList<Object>(); while (anyKeysIter.hasNext()) { String anyKey = anyKeysIter.next(); if (anyKey.startsWith("@")) continue; String value = anyObject.get(anyKey).toString(); // Get Namespace String[] anyKeyCheck = anyKey.split(":"); String namespace = null; String namespaceURI = null; if (anyKeyCheck.length == 2) { namespace = anyKeyCheck[0]; namespaceURI = nsMap.get(namespace).toString(); } if (anyKey != null && value != null) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.newDocument(); Node node = doc.createElement("value"); node.setTextContent(value); Element element = doc.createElement(anyKey); if (namespace != null) { element.setAttribute("xmlns:" + namespace, namespaceURI); } element.appendChild(node); elementList.add(element); } } object.setAny(elementList); } if (extension.get("otherAttributes") != null) { Map<QName, String> otherAttributes = new HashMap<QName, String>(); BsonDocument otherAttributeObject = extension.getDocument("otherAttributes"); Iterator<String> otherKeysIter = otherAttributeObject.keySet().iterator(); while (otherKeysIter.hasNext()) { String anyKey = otherKeysIter.next(); String value = otherAttributeObject.get(anyKey).toString(); otherAttributes.put(new QName("", anyKey), value); } object.setOtherAttributes(otherAttributes); } } catch (ParserConfigurationException e) { Configuration.logger.log(Level.ERROR, e.toString()); } return object; } static TransformationEventExtensionType putTransformationExtension(TransformationEventExtensionType object, BsonDocument extension) { try { if (extension.get("any") != null) { BsonDocument anyObject = extension.getDocument("any"); // Get Namespaces Iterator<String> anyKeysIterN = anyObject.keySet().iterator(); Map<String, String> nsMap = new HashMap<String, String>(); while (anyKeysIterN.hasNext()) { String anyKeyN = anyKeysIterN.next(); String valueN = anyObject.get(anyKeyN).toString(); if (anyKeyN.startsWith("@")) { nsMap.put(anyKeyN.substring(1, anyKeyN.length()), valueN); } } // Process Any Iterator<String> anyKeysIter = anyObject.keySet().iterator(); List<Object> elementList = new ArrayList<Object>(); while (anyKeysIter.hasNext()) { String anyKey = anyKeysIter.next(); if (anyKey.startsWith("@")) continue; String value = anyObject.get(anyKey).toString(); // Get Namespace String[] anyKeyCheck = anyKey.split(":"); String namespace = null; String namespaceURI = null; if (anyKeyCheck.length == 2) { namespace = anyKeyCheck[0]; namespaceURI = nsMap.get(namespace).toString(); } if (anyKey != null && value != null) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.newDocument(); Node node = doc.createElement("value"); node.setTextContent(value); Element element = doc.createElement(anyKey); if (namespace != null) { element.setAttribute("xmlns:" + namespace, namespaceURI); } element.appendChild(node); elementList.add(element); } } object.setAny(elementList); } if (extension.get("otherAttributes") != null) { Map<QName, String> otherAttributes = new HashMap<QName, String>(); BsonDocument otherAttributeObject = extension.getDocument("otherAttributes"); Iterator<String> otherKeysIter = otherAttributeObject.keySet().iterator(); while (otherKeysIter.hasNext()) { String anyKey = otherKeysIter.next(); String value = otherAttributeObject.get(anyKey).toString(); otherAttributes.put(new QName("", anyKey), value); } object.setOtherAttributes(otherAttributes); } } catch (ParserConfigurationException e) { Configuration.logger.log(Level.ERROR, e.toString()); } return object; } }