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}