package org.greengin.sciencetoolkit.common.model.serialize; import java.io.File; import java.util.Hashtable; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.greengin.sciencetoolkit.common.model.Model; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import android.content.Context; public class ModelSerializer { public static void model2xml(ModelVersionManager versionManager, Hashtable<String, Model> models, Context applicationContext, String file) { try { TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); Document doc = model2xml(versionManager, models); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File(applicationContext.getFilesDir(), file)); transformer.transform(source, result); } catch (Exception e) { e.printStackTrace(); } } private static Document model2xml(ModelVersionManager versionManager, Hashtable<String, Model> models) throws ParserConfigurationException { DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); Document doc = docBuilder.newDocument(); Element rootElement = doc.createElement("root"); Attr versionAttr = doc.createAttribute("version"); versionAttr.setValue(String.valueOf(versionManager.getCurrentVersion())); rootElement.setAttributeNode(versionAttr); doc.appendChild(rootElement); for (Map.Entry<String, Model> item : models.entrySet()) { Element modelElement = model2xml(item.getValue(), doc, rootElement); Attr modelIdAttr = doc.createAttribute("id"); modelIdAttr.setValue(item.getKey()); modelElement.setAttributeNode(modelIdAttr); } return doc; } private static Element model2xml(Model model, Document doc, Element containerElement) { Element modelElement = doc.createElement("item"); containerElement.appendChild(modelElement); for (Map.Entry<String, Object> entry : model.entries().entrySet()) { Element entryElement = doc.createElement("entry"); modelElement.appendChild(entryElement); Attr entryId = doc.createAttribute("id"); entryId.setValue(entry.getKey()); entryElement.setAttributeNode(entryId); Object obj = entry.getValue(); Attr entryType = doc.createAttribute("type"); boolean isModel = false; if (obj instanceof Integer) { entryType.setValue("int"); } else if (obj instanceof Double) { entryType.setValue("double"); } else if (obj instanceof Boolean) { entryType.setValue("bool"); } else if (obj instanceof String) { entryType.setValue("string"); } else if (obj instanceof Long) { entryType.setValue("long"); } else if (obj instanceof Model) { entryType.setValue("model"); isModel = true; } else { entryType.setValue("unknown"); } entryElement.setAttributeNode(entryType); if (isModel) { model2xml((Model)obj, doc, entryElement); } else { entryElement.appendChild(doc.createTextNode(obj.toString())); } } return modelElement; } }