/**
* -----------------------------------------------------------------------------------
* (c) 2010-2014 OpenInfobutton Project, Biomedical Informatics, University of Utah
* Contact: {@code <andrew.iskander@utah.edu>}
* Biomedical Informatics
* 421 Wakara Way, Ste 140
* Salt Lake City, UT 84108-3514
* Day Phone: 1-801-581-4080
* -----------------------------------------------------------------------------------
*
* @author Andrew Iskander {@code <andrew.iskander@utah.edu>}
* @version Jun 13, 2014
*/
package org.openinfobutton.service.fixture;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.io.StringWriter;
import java.net.URI;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.hl7.v3.AggregateKnowledgeResponse;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.w3c.dom.Document;
@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( locations = { "/core-data-annotation-context.xml", "/core-data-datasource-context.xml",
"/core-profile-datasource-context.xml" } )
public abstract class OibServiceTestFixture
{
@SuppressWarnings( "deprecation" )
@Autowired
@Qualifier( "simpleJdbcTemplate" )
protected SimpleJdbcTemplate jdbcTemplate;
/**
* Builds test request object
*
* @return request
*/
@SuppressWarnings( "boxing" )
public static Map<String, String[]> cystitisICD9Request()
{
final Map<String, String[]> requestParameters = new HashMap<String, String[]>();
requestParameters.put( "representedOrganization.id.root", new String[] { "1.3.6.1.4.1.5884" } );
requestParameters.put( "patientPerson.administrativeGenderCode.c", new String[] { "F" } );
requestParameters.put( "age.v.v", new String[] { "47" } );
requestParameters.put( "age.v.u", new String[] { "a" } );
requestParameters.put( "taskContext.c.c", new String[] { "PROBLISTREV" } );
requestParameters.put( "mainSearchCriteria.v.c", new String[] { "595.9" } );
requestParameters.put( "mainSearchCriteria.v.cs", new String[] { "2.16.840.1.113883.6.103" } );
requestParameters.put( "mainSearchCriteria.v.dn", new String[] { "Cystitis" } );
requestParameters.put( "performer", new String[] { "PROV" } );
requestParameters.put( "informationRecipient", new String[] { "PROV" } );
requestParameters.put( "knowledgeResponseType", new String[] { "text/xml" } );
return requestParameters;
}
/**
* Builds test request object
*
* @return request
*/
@SuppressWarnings( "boxing" )
public static Map<String, String[]> decedentAgeRangeTest()
{
final Map<String, String[]> requestParameters = new HashMap<String, String[]>();
requestParameters.put( "representedOrganization.id.root", new String[] { "1.3.6.1.4.1.5884" } );
requestParameters.put( "patientPerson.administrativeGenderCode.c", new String[] { "F" } );
requestParameters.put( "age.v.v", new String[] { "15" } );
requestParameters.put( "age.v.u", new String[] { "a" } );
requestParameters.put( "taskContext.c.c", new String[] { "PROBLISTREV" } );
requestParameters.put( "mainSearchCriteria.v.c", new String[] { "237.79" } );
requestParameters.put( "mainSearchCriteria.v.cs", new String[] { "2.16.840.1.113883.6.103" } );
requestParameters.put( "mainSearchCriteria.v.dn", new String[] { "Other neurofibromatosis PAR " } );
requestParameters.put( "performer", new String[] { "PROV" } );
requestParameters.put( "informationRecipient", new String[] { "PROV" } );
requestParameters.put( "knowledgeResponseType", new String[] { "text/xml" } );
return requestParameters;
}
/**
* Builds test request object
*
* @return request
*/
@SuppressWarnings( "boxing" )
public static Map<String, String[]> cystitisUMLSRequest()
{
final Map<String, String[]> requestParameters = new HashMap<String, String[]>();
requestParameters.put( "representedOrganization.id.root", new String[] { "1.3.6.1.4.1.5884" } );
requestParameters.put( "patientPerson.administrativeGenderCode.c", new String[] { "F" } );
requestParameters.put( "age.v.v", new String[] { "47" } );
requestParameters.put( "age.v.u", new String[] { "a" } );
requestParameters.put( "taskContext.c.c", new String[] { "PROBLISTREV" } );
requestParameters.put( "mainSearchCriteria.v.dn", new String[] { "acute+cystitis" } );
requestParameters.put( "performer", new String[] { "PROV" } );
requestParameters.put( "informationRecipient", new String[] { "PROV" } );
requestParameters.put( "knowledgeResponseType", new String[] { "text/xml" } );
return requestParameters;
}
/**
* Builds test request object
*
* @return request
*/
@SuppressWarnings( "boxing" )
public static Map<String, String[]> subsetRequest()
{
final Map<String, String[]> requestParameters = new HashMap<String, String[]>();
requestParameters.put( "representedOrganization.id.root", new String[] { "1.3.6.1.4.1.3768" } );
requestParameters.put( "taskContext.c.c", new String[] { "PROBLISTREV" } );
requestParameters.put( "mainSearchCriteria.v.c", new String[] { "109769000" } );
requestParameters.put( "mainSearchCriteria.v.cs", new String[] { "2.16.840.1.113883.6.96" } );
requestParameters.put( "mainSearchCriteria.v.dn", new String[] { "Necrotizing+sialometaplasia" } );
requestParameters.put( "knowledgeResponseType", new String[] { "text/xml" } );
return requestParameters;
}
/**
* Builds test request object
*
* @return request
*/
@SuppressWarnings( "boxing" )
public static Map<String, String[]> clopidogrelRxNormRequest()
{
final Map<String, String[]> requestParameters = new HashMap<String, String[]>();
requestParameters.put( "representedOrganization.id.root", new String[] { "1.3.6.1.4.1.5884" } );
requestParameters.put( "patientPerson.administrativeGenderCode.c", new String[] { "F" } );
requestParameters.put( "age.v.v", new String[] { "47" } );
requestParameters.put( "age.v.u", new String[] { "a" } );
requestParameters.put( "taskContext.c.c", new String[] { "MEDOE" } );
requestParameters.put( "mainSearchCriteria.v.dn", new String[] { "Clopidogrel+75mg+oral+tablet" } );
requestParameters.put( "performer", new String[] { "PROV" } );
requestParameters.put( "informationRecipient", new String[] { "PROV" } );
requestParameters.put( "knowledgeResponseType", new String[] { "text/xml" } );
return requestParameters;
}
/**
* Builds test request object
*
* @return request
*/
@SuppressWarnings( "boxing" )
public static Map<String, String[]> neurofibromatosisSubsetRequest()
{
final Map<String, String[]> requestParameters = new HashMap<String, String[]>();
requestParameters.put( "representedOrganization.id.root", new String[] { "1.3.6.1.4.1.5884" } );
requestParameters.put( "patientPerson.administrativeGenderCode.c", new String[] { "F" } );
requestParameters.put( "age.v.v", new String[] { "5" } );
requestParameters.put( "age.v.u", new String[] { "a" } );
requestParameters.put( "taskContext.c.c", new String[] { "PROBLISTREV" } );
requestParameters.put( "mainSearchCriteria.v.c", new String[] { "237.7" } );
requestParameters.put( "mainSearchCriteria.v.cs", new String[] { "2.16.840.1.113883.6.103" } );
requestParameters.put( "mainSearchCriteria.v.dn", new String[] { "Neurofibromatosis" } );
requestParameters.put( "performer", new String[] { "PROV" } );
requestParameters.put( "informationRecipient", new String[] { "PROV" } );
requestParameters.put( "knowledgeResponseType", new String[] { "text/xml" } );
return requestParameters;
}
@Test
public void assertNumberProfiles()
{
assertEquals( countRowsInTable( "resource_profiles" ), 22 );
}
@SuppressWarnings( "deprecation" )
protected final int countRowsInTable( final String tableName )
{
return jdbcTemplate.queryForInt( "SELECT COUNT(0) from " + tableName );
}
protected final String loadResponseXML( URI path, Charset encoding )
throws IOException
{
final byte[] encoded = Files.readAllBytes( Paths.get( path ) );
return encoding.decode( ByteBuffer.wrap( encoded ) ).toString();
}
/**
* Marshalls response object to XML for comparison
*
* @param response
* @return xml
*/
@SuppressWarnings( "boxing" )
protected final String marshallXML( AggregateKnowledgeResponse response )
{
StringWriter xml = new StringWriter();
try
{
final JAXBContext ctx = JAXBContext.newInstance( AggregateKnowledgeResponse.class );
final Marshaller m = ctx.createMarshaller();
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware( true );
final DocumentBuilder db = dbf.newDocumentBuilder();
final Document doc = db.newDocument();
m.marshal( new JAXBElement<AggregateKnowledgeResponse>( new QName( "aggregateKnowledgeResponse" ),
AggregateKnowledgeResponse.class, response ), doc );
final Source source = new DOMSource( doc );
xml = new StringWriter();
final Result result = new StreamResult( xml );
final TransformerFactory tfactory = TransformerFactory.newInstance();
final Transformer transformer = tfactory.newTransformer();
transformer.transform( source, result );
}
catch ( final JAXBException e )
{
e.printStackTrace();
}
catch ( final TransformerConfigurationException e )
{
e.printStackTrace();
}
catch ( final TransformerException e )
{
e.printStackTrace();
}
catch ( final ParserConfigurationException e )
{
e.printStackTrace();
}
return xml.getBuffer().toString();
}
}