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