/**
* -----------------------------------------------------------------------------------
* (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 Jul 15, 2014
*/
package org.openinfobutton.service.web;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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 javax.xml.transform.stream.StreamSource;
import org.hl7.v3.AggregateKnowledgeResponse;
import org.hl7.v3.REDSMT010001UVKnowledgeRequestNotification;
import org.openinfobutton.schema.CodeConstants;
import org.openinfobutton.schema.KnowledgeRequest;
import org.openinfobutton.service.profile.ResourceProfileLoaderNew;
import org.openinfobutton.service.utility.WebServiceUtility;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.web.HttpRequestHandler;
import org.w3c.dom.Document;
import com.google.gson.Gson;
import edu.utah.further.subsetdb.service.LogsDao;
/**
* The Class KnowledgeRequestServlet.
*/
@Component( "knowledgeRequestServlet" )
public class KnowledgeRequestServlet
implements HttpRequestHandler
{
/** The dao. */
@Autowired
@Qualifier( "logDao" )
private LogsDao dao;
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The engine. */
@Autowired
KnowledgeRequestEngine engine;
/**
* Starting point. This is where the infobutton request enters the system
*
* @param req the req
* @param resp the resp
* @throws ServletException the servlet exception
* @throws IOException Signals that an I/O exception has occurred.
*/
@Override
public void handleRequest( HttpServletRequest req, HttpServletResponse resp )
throws ServletException, IOException
{
final Map<String, String[]> requestParameters = req.getParameterMap();
final KnowledgeRequest knowledgeRequest = WebServiceUtility.getServiceRequest( requestParameters );
ResourceProfileLoaderNew.setMode( knowledgeRequest.getExecutionMode() );
final REDSMT010001UVKnowledgeRequestNotification request = KnowledgeRequest.getJAXBElement( knowledgeRequest );
resp.setCharacterEncoding( "UTF-8" );
final PrintWriter out = resp.getWriter();
JAXBContext ctx;
DocumentBuilderFactory dbf;
DocumentBuilder db;
Document doc;
try
{
ctx = JAXBContext.newInstance( REDSMT010001UVKnowledgeRequestNotification.class );
Marshaller m = ctx.createMarshaller();
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );
dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware( true );
db = dbf.newDocumentBuilder();
doc = db.newDocument();
m.marshal( new JAXBElement<REDSMT010001UVKnowledgeRequestNotification>(
new QName("knowledgeRequestNotification" ), REDSMT010001UVKnowledgeRequestNotification.class,request ),
doc );
// Code below is for getting the large xml string from request
Source source = new DOMSource( doc );
StringWriter stringWriter = new StringWriter();
Result result = new StreamResult( stringWriter );
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer transformer;
transformer = tfactory.newTransformer();
transformer.transform( source, result );
final String orgid = knowledgeRequest.getHolder().getRepresentedOrganization().getRoot();
dao.saveRequest( stringWriter.toString(), req.getRemoteAddr(), orgid );// Log written here
final AggregateKnowledgeResponse response = engine.getResponse( knowledgeRequest );
ctx = JAXBContext.newInstance( AggregateKnowledgeResponse.class );
m = ctx.createMarshaller();
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );
dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware( true );
db = dbf.newDocumentBuilder();
doc = db.newDocument();
m.marshal( new JAXBElement<AggregateKnowledgeResponse>( new QName( "aggregateKnowledgeResponse" ),
AggregateKnowledgeResponse.class, response ), doc );
resp.setContentType( "text/html" );
source = new DOMSource( doc );
stringWriter = new StringWriter();
result = new StreamResult( stringWriter );
tfactory = TransformerFactory.newInstance();
transformer = tfactory.newTransformer();
transformer.transform( source, result );// now stringwriter has xml.
final String knowledgeResType = req.getParameter( CodeConstants.KNOWLEDGE_RESPONSE_TYPE );
if ( ( req.getParameter( "transform" ) != null ) || ( knowledgeResType != null ) )
{
if ( knowledgeResType != null )
{
if ( knowledgeResType.equals( "application/json" ) )
{
final Gson gson = new Gson();
resp.setContentType( "application/json" );
out.println( gson.toJson( response ) );
}
else if ( knowledgeResType.equals( "text/xml" ) )
{
resp.setContentType( "text/xml" );
out.println( stringWriter.getBuffer().toString() );
}
}
else
// for backward compatibility with 'transform' in URL
{
resp.setContentType( "text/xml" );
out.println( stringWriter.getBuffer().toString() );
}
}
else
{
String transformation = "Infobutton_UI";
if ( req.getParameter( "xsltTransform" ) != null )
{
transformation = req.getParameter( "xsltTransform" );
}
transformer =
tfactory.newTransformer( new StreamSource(req.getSession().
getServletContext().getResourceAsStream(
"/WEB-INF/classes/xslts/" + transformation + ".xslt")));
stringWriter = new StringWriter();
result = new StreamResult( stringWriter );
transformer.transform( source, result );
out.println( stringWriter.getBuffer().toString() );
}
}
catch ( final JAXBException e )
{
e.printStackTrace();
}
catch ( final TransformerConfigurationException e )
{
e.printStackTrace();
}
catch ( final TransformerException e )
{
e.printStackTrace();
}
catch ( final ParserConfigurationException e )
{
e.printStackTrace();
}
finally
{
out.close();
}
}
}