All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scalut.xml.soap.SoapHelper.scala Maven / Gradle / Ivy

The newest version!
package scalut.xml.soap

import javax.xml.soap._

import org.w3c.dom.Document
import scalut.collections.CollectionHelper
import scalut.xml.soap.SoapFault.FaultCode
import scalut.xml.{DocHelper, XmlHelper}

import scala.xml.NamespaceBinding


object SoapHelper {

  lazy val DEFAULT_BINDINGS = Seq(XmlHelper.XSI_NS_BINDING, XmlHelper.XSD_NS_BINDING)

  /*
  lazy val XSD_NS = NamespaceBinding("xsd", XMLConstants.W3C_XML_SCHEMA_NS_URI, xml.TopScope)
  lazy val XSI_NS = NamespaceBinding("xsi", XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, XSD_NS)
  lazy val SOAP_NS = NamespaceBinding(SOAPConstants.SOAP_ENV_PREFIX, SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE, XSI_NS)
  lazy val SOAP_NS_12 = NamespaceBinding(SOAPConstants.SOAP_ENV_PREFIX, SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE, XSI_NS)

  def createXmlConverter[T](readClass: Class[T], driver: HierarchicalStreamDriver = null) = new XmlConverter[T] {
    override def write(t: T, base: NodeSeq): NodeSeq = base.collectFirst {
      case e: Elem => e.copy(child = e.child ++ XML.loadString(XStreamHelper.toXmlString[T](t, driver)))
    }.getOrElse(XML.loadString(XStreamHelper.toXmlString[T](t, driver)))

    override def read(x: NodeSeq): Option[T] = {
      x.collectFirst {
        case e: Elem => e.child.collectFirst {
          case e: Elem => XStreamHelper.fromString(e.toString(), readClass)
        }.getOrElse(null.asInstanceOf[T])
      }
    }
  }

  def toSoap[T](t: T, ns: NamespaceBinding = SOAP_NS)(implicit r: XmlWriter[T]): Elem =
    soapEnvelopeWriter[T](r).write(SoapEnvelope(t)(ns), NodeSeq.Empty)

  def fromSOAP[T](x: NodeSeq)(implicit r: XmlReader[T]): Option[T] =
    soapEnvelopeReader[T](r).read(x) match {
      case Some(SoapEnvelope(t)) => Some(t)
      case None => None
    }
*/

  /*def getFault(message: SOAPMessage): Option[SoapFault[String]] = {
    val soapBody = message.getSOAPPart.getEnvelope.getBody
    if (soapBody.hasFault) {
      val fault = soapBody.getFault
      val faultCode = FaultCode.getByName(fault.getFaultCodeAsName.getLocalName).get
      Some(SoapFault(faultCode, fault.getFaultString, fault.getFaultActor,
        (fault.hasDetail && fault.hasChildNodes)
            ? DocHelper.toString(fault.getDetail, indent = false, omitXmlDec = true)
            | null
      ))
    } else {
      None
    }
  }*/

  def createSOAPMessage(
      soapAction: String,
      bodyDocument: Document,
      soapProtocol: String = SOAPConstants.DEFAULT_SOAP_PROTOCOL,
      envelopeNS: collection.Seq[NamespaceBinding] = DEFAULT_BINDINGS
  ): SOAPMessage = {
    val messageFactory = MessageFactory.newInstance(soapProtocol)
    val soapMessage = messageFactory.createMessage
    val soapPart = soapMessage.getSOAPPart
    val envelope = soapPart.getEnvelope
    //    envelope.addNamespaceDeclaration(nsPrefix, serverURI)
    if (CollectionHelper.nonEmpty(envelopeNS)) {
      envelopeNS.foreach(ns => envelope.addNamespaceDeclaration(ns.prefix, ns.uri))
    }

    envelope.getBody.addDocument(bodyDocument)
    val headers = soapMessage.getMimeHeaders
    //    headers.addHeader("SOAPAction", serverURI + soapMethod)
    headers.addHeader("SOAPAction", soapAction)
    soapMessage.saveChanges()
    soapMessage
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy