package gov.nist.hl7.ws.messagevalidation;


import gov.nist.hl7.ws.messagevalidation.xsd.GetValidationServiceStatusResponse;
import net.ihe.gazelle.evs.hl7.inria.action.GenerateValidationServiceStatus;
import net.ihe.gazelle.evs.hl7.inria.action.MessageTestAction;
import net.ihe.gazelle.evs.hl7.inria.model.MessageTest;

import org.jboss.seam.Component;

import javax.annotation.Resource;
import javax.ejb.Stateless;

import javax.jws.Oneway;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.servlet.http.HttpServletRequest;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPMessageContext;


//@Stateless(name="Hl7GazelleMessageValidation")
//@WebService(name = "Hl7GazelleMessageValidation", serviceName = "Hl7GazelleMessageValidation",targetNamespace = "http://messagevalidation.ws.hl7.nist.gov", portName = "Hl7GazelleMessageValidationSOAP12port_http")
//@SOAPBinding
public class Hl7GazelleMessageValidationImpl implements gov.nist.hl7.ws.messagevalidation.Hl7GazelleMessageValidationPortType
{

   // (style=SOAPBinding.Style.DOCUMENT,use = SOAPBinding.Use.LITERAL,
   // parameterStyle = SOAPBinding.ParameterStyle.BARE)
  
   //@Resource
   WebServiceContext wsCtx;

   /**
    * This method is used to validate a message
    * 
    * @param oid : The OID set to the message to process
    * @param xmlReferencedStandard : an XML String which contains all the
    *           referenced standard
    * @param xmlValidationContext : an XML String to set a validation context
    * @param xmlMessageMetaData : an XML String to set the message Meta data
    * @param messagefile : the message to validate
    * @return : An XML String where the overview result is set
    */
   
  /* @WebMethod(action = "urn:validateMessage")
   @WebResult(targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd")
   @RequestWrapper(localName = "validateMessage", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd", className = "gov.nist.hl7.ws.messagevalidation.xsd.ValidateMessage")
   @ResponseWrapper(localName = "validateMessageResponse", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd", className = "gov.nist.hl7.ws.messagevalidation.xsd.ValidateMessageResponse")
*/   public String validateMessage(
       @WebParam(name = "objectOID", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd")
       String objectOID,
       @WebParam(name = "xmlReferencedStandard", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd")
       String xmlReferencedStandard,
       @WebParam(name = "xmlValidationContext", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd")
       String xmlValidationContext,
       @WebParam(name = "xmlMessageMetaData", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd")
       String xmlMessageMetaData,
       @WebParam(name = "xmlMessage", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd")
       String xmlMessage)
   {
      SOAPMessageContext jaxwsContext = (SOAPMessageContext) wsCtx.getMessageContext();
      HttpServletRequest hRequest = (HttpServletRequest) jaxwsContext.get(MessageContext.SERVLET_REQUEST);
       try{
      MessageTestAction test = (MessageTestAction) Component.getInstance(MessageTestAction.class, true);
      MessageTest currentTest = test.validation(objectOID, xmlReferencedStandard, xmlValidationContext, xmlMessageMetaData, xmlMessage, hRequest.getRemoteAddr());

      return currentTest.getSummaryResults();
       }catch(Exception e){return null;}
   }

   /**
    * To clear the web service result Cache NOT YET IMPLEMENTED
    */
  /* @WebMethod(action = "urn:clearResultsCache")
   @Oneway
   @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)*/
   public void clearResultsCache()
   {
      MessageTest test = (MessageTest) Component.getInstance(MessageTest.class, true);
      test.setActive(false);
   }

   /**
    * To get the detailed result of an validation process
    * 
    * @param objectOID
    * @return
    */
 /*  @WebMethod(action = "urn:getDetailedResults")
   @WebResult(targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd")
   @RequestWrapper(localName = "getDetailedResults", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd", className = "gov.nist.hl7.ws.messagevalidation.xsd.GetDetailedResults")
   @ResponseWrapper(localName = "getDetailedResultsResponse", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd", className = "gov.nist.hl7.ws.messagevalidation.xsd.GetDetailedResultsResponse")*/
   public String getDetailedResults(
       @WebParam(name = "objectOID", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd")
       String objectOID)
   {
      try
      {
      MessageTestAction test = (MessageTestAction) Component.getInstance(MessageTestAction.class, true);
      return test.getMessageDetaileResults(objectOID);
      }catch (Exception e){return null;}
    
   }

   /**
    * To get the summary result of an validation process
    * 
    * @param oid : the message proceed OID
    * @return
    */
 /*  @WebMethod(action = "urn:getSummaryResults")
   @WebResult(targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd")
   @RequestWrapper(localName = "getSummaryResults", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd", className = "gov.nist.hl7.ws.messagevalidation.xsd.GetSummaryResults")
   @ResponseWrapper(localName = "getSummaryResultsResponse", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd", className = "gov.nist.hl7.ws.messagevalidation.xsd.GetSummaryResultsResponse")*/
   public String getSummaryResults(
       @WebParam(name = "objectOID", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd")
       String objectOID)
   {
      try
      {
      MessageTestAction test = (MessageTestAction) Component.getInstance(MessageTestAction.class, true);
   
      return test.getMessageSummaryResults(objectOID);
      }catch(Exception e){return null;}
   }

   /**
    * To return the status of the external validation web service
    * 
    * @return OK if running
    *  @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    *   @WebResult(name = "getValidationServiceStatusResponse", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd", partName = "part1")
    */
  /*  @WebMethod(action = "urn:getValidationServiceStatus")
    @WebResult(targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd")
    @RequestWrapper(localName = "getValidationServiceStatus", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd", className = "gov.nist.hl7.ws.messagevalidation.xsd.GetValidationServiceStatus")
    @ResponseWrapper(localName = "getValidationServiceStatusResponse", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd", className = "gov.nist.hl7.ws.messagevalidation.xsd.GetValidationServiceStatusResponse")*/
    public String getValidationServiceStatus()
   {
      GenerateValidationServiceStatus status = (GenerateValidationServiceStatus) Component.getInstance(GenerateValidationServiceStatus.class, true);
      GetValidationServiceStatusResponse response = new GetValidationServiceStatusResponse();
      response.setReturn(status.viewValidationStatus());
      return response.getReturn();
   }

 /*  @WebMethod(action = "urn:getXmlTransformedMessage")
   @WebResult(targetNamespace ="http://messagevalidation.ws.hl7.nist.gov/xsd")
   @RequestWrapper(localName = "getXmlTransformedMessage", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd", className = "gov.nist.hl7.ws.messagevalidation.xsd.GetXmlTransformedMessage")
   @ResponseWrapper(localName = "getXmlTransformedMessageResponse", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd", className = "gov.nist.hl7.ws.messagevalidation.xsd.GetXmlTransformedMessageResponse")*/
   public String getXmlTransformedMessage(@WebParam(name = "objectOID", targetNamespace = "http://messagevalidation.ws.hl7.nist.gov/xsd")
   String objectOID)
   {
      try
      {
      MessageTestAction test = (MessageTestAction) Component.getInstance(MessageTestAction.class, true);

      return test.getXMLTransformedMessage(objectOID);
      }catch(Exception e){return null;}
   }

}
