package org.molgenis.omx;
import java.io.Closeable;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.molgenis.observ.ObservableFeature;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class EMeasureFeatureWriter implements Closeable
{
private Writer writer;
public EMeasureFeatureWriter(OutputStream os)
{
if (os == null) throw new IllegalArgumentException("writer is null");
this.writer = new OutputStreamWriter(os, Charset.forName("UTF-8"));
}
public void writeFeatures(List<ObservableFeature> features) throws IOException
{
StringBuilder strBuilder = new StringBuilder();
strBuilder
.append("<QualityMeasureDocument xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"REPC_MT000100UV01.Organizer\" xsi:schemaLocation=\"urn:hl7-org:v3 multicacheschemas/REPC_MT000100UV01.xsd\" classCode=\"CONTAINER\" moodCode=\"DEF\" xmlns=\"urn:hl7-org:v3\">");
if (features != null)
{
for (ObservableFeature feature : features)
{
appendFeature(feature, strBuilder);
}
}
strBuilder.append("</QualityMeasureDocument>");
String xmlFormatted = this.format(strBuilder.toString());
writer.write(xmlFormatted);
}
private StringBuilder appendFeature(ObservableFeature m, StringBuilder strBuilder)
{
strBuilder.append("\t<subjectOf>\n" + "\t\t<measureAttribute>");
String code = m.getName();
String codeSystem = "TBD"; // FIXME hardcoded reference
String displayName = m.getDescription();
String datatype = m.getDataType();
String codeDatatype = "dunno"; // FIXME hardcoded reference
String codeSystemDatatype = "TBD"; // FIXME hardcoded reference
String displayNameDatatype = "This should be the mappingsname"; // FIXME
// hardcoded
// reference
strBuilder.append("<code code=\"").append(code).append("\" codeSystem=\"").append(codeSystem).append("\"")
.append(" displayName=\"").append(displayName).append("\" />");
strBuilder.append("<value xsi:type=\"").append(datatype).append("\" code=\"").append(codeDatatype)
.append("\" codeSystem=\"").append(codeSystemDatatype).append("\"").append(" displayName=\"")
.append(displayNameDatatype).append("\" />");
strBuilder.append("\t\t</measureAttribute>\n" + "\t</subjectOf>");
return strBuilder;
}
private String format(String unformattedXml) throws IOException
{
final Document document = parseXmlFile(unformattedXml);
OutputFormat format = new OutputFormat(document);
format.setLineWidth(65);
format.setIndenting(true);
format.setIndent(2);
Writer out = new StringWriter();
XMLSerializer serializer = new XMLSerializer(out, format);
serializer.serialize(document);
return out.toString();
}
private Document parseXmlFile(String in) throws IOException
{
try
{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource(new StringReader(in));
return db.parse(is);
}
catch (ParserConfigurationException e)
{
throw new RuntimeException(e);
}
catch (SAXException e)
{
throw new RuntimeException(e);
}
}
@Override
public void close() throws IOException
{
this.writer.close();
}
}