001package org.hl7.fhir.utilities; 002 003import java.io.File; 004import java.io.IOException; 005import java.util.Date; 006import java.util.HashMap; 007import java.util.HashSet; 008import java.util.Map; 009import java.util.Set; 010 011import javax.xml.parsers.DocumentBuilder; 012import javax.xml.parsers.DocumentBuilderFactory; 013import javax.xml.parsers.ParserConfigurationException; 014 015import org.hl7.fhir.utilities.TranslatorXml.TranslatedTerm; 016import org.hl7.fhir.utilities.xml.XMLUtil; 017import org.w3c.dom.Document; 018import org.w3c.dom.Element; 019import org.w3c.dom.Node; 020import org.xml.sax.SAXException; 021 022public class TranslatorXml implements TranslationServices { 023 024 025 public class TranslatedTerm { 026 private Set<String> props = new HashSet<String>(); 027 private Map<String, String> translations = new HashMap<String, String>(); 028 } 029 030 031 private Map<String, TranslatedTerm> termsById = new HashMap<String, TranslatedTerm>(); 032 private Map<String, TranslatedTerm> termsByTerm = new HashMap<String, TranslatedTerm>(); 033 034 public TranslatorXml(String filename) throws ParserConfigurationException, SAXException, IOException { 035 super(); 036 load(filename); 037 } 038 039 040 private void load(String filename) throws ParserConfigurationException, SAXException, IOException { 041 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 042 factory.setNamespaceAware(false); 043 DocumentBuilder builder = factory.newDocumentBuilder(); 044 Document xml = builder.parse(new File(filename)); 045 Element e = XMLUtil.getFirstChild(xml.getDocumentElement()); 046 while (e != null) { 047 load(e); 048 e = XMLUtil.getNextSibling(e); 049 } 050 } 051 052 private void load(Element e) { 053 TranslatedTerm t = new TranslatedTerm(); 054 for (int i = 0; i < e.getAttributes().getLength(); i++) { 055 Node a = e.getAttributes().item(i); 056 String n = a.getNodeName(); 057 if (n.equals("id")) 058 termsById.put(a.getTextContent(), t); 059 else if (a.getNodeValue().equals("true")) 060 t.props.add(n); 061 } 062 Element c = XMLUtil.getFirstChild(e); 063 while (c != null) { 064 String l = c.getAttribute("lang"); 065 String s = c.getTextContent(); 066 if (l.equals("en")) 067 termsByTerm.put(s, t); 068 t.translations.put(l, s); 069 c = XMLUtil.getNextSibling(c); 070 } 071 } 072 073 074 private Map<String, String> getTranslations(String code) { 075 TranslatedTerm t = termsById.get(code); 076 if (t == null) 077 t = termsByTerm.get(code); 078 return t == null ? null : t.translations; 079 } 080 081 082 @Override 083 public String translate(String context, String value, String targetLang) { 084 if (targetLang == null) 085 return value; 086 Map<String, String> t = getTranslations(value); 087 if (t == null) 088 return value; 089 if (t.containsKey(targetLang)) 090 return t.get(targetLang); 091 return value; 092 } 093 094 @Override 095 public String translateAndFormat(String context, String lang, String value, Object... args) { 096 value = translate(context, value, lang); 097 return value == null ? "": String.format(value, args); 098 } 099 100 @Override 101 public String translate(String context, String value) { 102 return null; 103 } 104 105 @Override 106 public String toStr(float value) { 107 // TODO Auto-generated method stub 108 return null; 109 } 110 111 @Override 112 public String toStr(Date value) { 113 // TODO Auto-generated method stub 114 return null; 115 } 116 117 118 @Override 119 public Map<String, String> translations(String value) { 120 return getTranslations(value); 121 } 122 123 124 @Override 125 public Set<String> listTranslations(String category) { 126 Set<String> res = new HashSet<String>(); 127 for (String s : termsById.keySet()) { 128 if (termsById.get(s).props.contains(category)) 129 res.add(s); 130 } 131 return res; 132 } 133 134}