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}