Package com.eviware.soapui.impl.wsdl.support.wsrm

Source Code of com.eviware.soapui.impl.wsdl.support.wsrm.WsrmUtils

/*
*  soapUI, copyright (C) 2004-2011 eviware.com
*
*  soapUI is free software; you can redistribute it and/or modify it under the
*  terms of version 2.1 of the GNU Lesser General Public License as published by
*  the Free Software Foundation.
*
*  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
*  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*  See the GNU Lesser General Public License for more details at gnu.org.
*/

package com.eviware.soapui.impl.wsdl.support.wsrm;

import java.util.UUID;

import org.apache.log4j.Logger;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

import com.eviware.soapui.SoapUI;
import com.eviware.soapui.config.HttpRequestConfig;
import com.eviware.soapui.config.WsaConfigConfig;
import com.eviware.soapui.config.WsrmConfigConfig;
import com.eviware.soapui.config.WsrmVersionTypeConfig;
import com.eviware.soapui.impl.support.wsa.WsaRequest;
import com.eviware.soapui.impl.wsdl.WsdlOperation;
import com.eviware.soapui.impl.wsdl.WsdlRequest;
import com.eviware.soapui.impl.wsdl.WsdlSubmit;
import com.eviware.soapui.impl.wsdl.WsdlSubmitContext;
import com.eviware.soapui.impl.wsdl.submit.transports.http.ExtendedHttpMethod;
import com.eviware.soapui.impl.wsdl.support.soap.SoapMessageBuilder;
import com.eviware.soapui.impl.wsdl.support.soap.SoapUtils;
import com.eviware.soapui.impl.wsdl.support.soap.SoapVersion;
import com.eviware.soapui.impl.wsdl.support.wsa.WsaConfig;
import com.eviware.soapui.impl.wsdl.support.wsa.WsaContainer;
import com.eviware.soapui.impl.wsdl.support.wsa.WsaContainerImpl;
import com.eviware.soapui.impl.wsdl.support.wsa.WsaUtils;
import com.eviware.soapui.model.iface.Request.SubmitException;
import com.eviware.soapui.model.iface.Response;
import com.eviware.soapui.model.iface.Submit.Status;
import com.eviware.soapui.model.propertyexpansion.DefaultPropertyExpansionContext;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext;
import com.eviware.soapui.support.xml.XmlUtils;

public class WsrmUtils
{
  private static final String WSRM_CREATE_SEQUENCE = "CreateSequence";
  private static final String WSRM_REQUEST_ACK = "AckRequested";
  private static final String WSRM_EXPIRES = "Expires";
  private static final String WSRM_ACKNOWLEDGMENTS_TO = "AcksTo";
  private static final String WSRM_CLOSE_SEQUENCE = "CloseSequence";
  private static final String WSRM_IDENTIFIER = "Identifier";
  private static final String WSRM_LAST_MSG = "LastMsgNumber";
  private static final String WSRM_CREATE_SEQUENCE_ACTION = "/CreateSequence";
  private static final String WSRM_CLOSE_SEQUENCE_ACTION = "/CloseSequence";
  private static final String WSRM_TERMINATE_SEQUENCE_ACTION = "/TerminateSequence";
  private static final String WSRM_REQUEST_ACK_ACTION = "/AckRequested";

  public final static String WSRM_NS_1_0 = "http://schemas.xmlsoap.org/ws/2005/02/rm";
  public final static String WSRM_NS_1_1 = "http://docs.oasis-open.org/ws-rx/wsrm/200702";
  public final static String WSRM_NS_1_2 = "http://docs.oasis-open.org/ws-rx/wsrm/200702";

  private SoapVersion soapVersion;
  private XmlObject xmlContentObject;
  private String content;

  public WsrmUtils( SoapVersion soapVersion )
  {
    this.soapVersion = soapVersion;
  }

  public WsrmUtils( String content, SoapVersion soapVersion, PropertyExpansionContext context )
  {
    this.soapVersion = soapVersion;
    this.content = content;

    try
    {
      // xmlContentObject = XmlObject.Factory.parse( content );
      xmlContentObject = XmlUtils.createXmlObject( content );
    }
    catch( Exception e )
    {
      SoapUI.logError( e );
    }
  }

  public String createNewWSReliableMessagingRequest( WsdlRequest wsrmContainer, ExtendedHttpMethod httpMethod,
      String identifier, long msgNumber, String endpoint )
  {

    try
    {
      Element header = getHeader( wsrmContainer );

      header.setAttribute( "xmlns:" + "wsrm", wsrmContainer.getWsrmConfig().getVersionNameSpace() );

      Element sequence = header.getOwnerDocument().createElementNS(
          wsrmContainer.getWsrmConfig().getVersionNameSpace(), "Sequence" );

      Element identifierElement = sequence.getOwnerDocument().createElementNS(
          wsrmContainer.getWsrmConfig().getVersionNameSpace(), "Identifier" );
      Text txtElm = identifierElement.getOwnerDocument().createTextNode( identifier );
      identifierElement.appendChild( txtElm );
      sequence.appendChild( identifierElement );

      Element messageId = sequence.getOwnerDocument().createElementNS(
          wsrmContainer.getWsrmConfig().getVersionNameSpace(), "MessageNumber" );
      Text txtElm2 = identifierElement.getOwnerDocument().createTextNode( String.valueOf( msgNumber ) );
      messageId.appendChild( txtElm2 );
      sequence.appendChild( messageId );

      header.appendChild( sequence );

      content = xmlContentObject.xmlText();

      wsrmContainer.getWsaConfig().setWsaEnabled( true );
      if( wsrmContainer.getWsaConfig().getAction() == null )
        wsrmContainer.getWsaConfig().setAddDefaultAction( true );

      wsrmContainer.getWsaConfig().setTo( endpoint );
      wsrmContainer.getWsaConfig().setGenerateMessageId( true );

      WsaUtils wsaUtils = new WsaUtils( content, wsrmContainer.getOperation().getInterface().getSoapVersion(), null,
          new DefaultPropertyExpansionContext( wsrmContainer ) );
      content = wsaUtils.addWSAddressingRequest( wsrmContainer );

    }
    catch( Exception e )
    {
      SoapUI.logError( e );
    }

    return content;
  }

  private Element getHeader( WsrmContainer wsrmContainer ) throws XmlException
  {

    String wsrmNameSpace = wsrmContainer.getWsrmConfig().getVersionNameSpace();

    Element header = ( Element )SoapUtils.getHeaderElement( xmlContentObject, soapVersion, true ).getDomNode();
    return header;
  }

  public WsrmSequence createSequence( String endpoint, SoapVersion soapVersion, String wsrmNamespace, String ackTo,
      Long expires, WsdlOperation operation, String wsaTo )
  {
    String identifier = null;

    HttpRequestConfig httpRequestConfig = ( HttpRequestConfig )( XmlObject.Factory.newInstance()
        .changeType( HttpRequestConfig.type ) );
    httpRequestConfig.setEndpoint( endpoint );
    httpRequestConfig.setMediaType( soapVersion.getContentType() );

    WsaConfigConfig wsaConfigConfig = ( WsaConfigConfig )( XmlObject.Factory.newInstance()
        .changeType( WsaConfigConfig.type ) );
    WsaContainer wsaContainer = new WsaContainerImpl();
    wsaContainer.setOperation( operation );
    WsaConfig wsaConfig = new WsaConfig( wsaConfigConfig, wsaContainer );
    wsaConfig.setTo( endpoint );

    WsrmConfigConfig wsrmConfigConfig = ( WsrmConfigConfig )( XmlObject.Factory.newInstance()
        .changeType( WsrmConfigConfig.type ) );
    WsrmConfig wsrmConfig = new WsrmConfig( wsrmConfigConfig, null );

    WsaRequest startSequenceRequest = new WsaRequest( httpRequestConfig, wsaConfig, wsrmConfig, false );
    startSequenceRequest.setOperation( operation );

    String openSequenceMessageContent = SoapMessageBuilder.buildEmptyMessage( soapVersion );

    startSequenceRequest.getWsaConfig().setWsaEnabled( true );
    startSequenceRequest.getWsaConfig().setAction( wsrmNamespace + WSRM_CREATE_SEQUENCE_ACTION );
    String uuid = UUID.randomUUID().toString();

    // if (wsaTo == null) {
    // startSequenceRequest.getWsaConfig().setTo(
    // WsaUtils.getNamespace(startSequenceRequest.getWsaConfig()
    // .getVersion())
    // + "/anonymous?id="+ uuid);
    // } else {
    // startSequenceRequest.getWsaConfig().setTo(wsaTo);
    // }
    startSequenceRequest.getWsaConfig().setReplyTo( ackTo );
    startSequenceRequest.getWsaConfig().setGenerateMessageId( true );

    try
    {
      // XmlObject object = XmlObject.Factory.parse(
      // openSequenceMessageContent );
      XmlObject object = XmlUtils.createXmlObject( openSequenceMessageContent );
      XmlCursor cursor = object.newCursor();

      cursor.toFirstContentToken();
      cursor.toFirstChild();
      cursor.toNextSibling();

      cursor.toNextToken();
      cursor.insertNamespace( "wsrm", wsrmNamespace );

      cursor.beginElement( WSRM_CREATE_SEQUENCE, wsrmNamespace );
      cursor.beginElement( "Offer", wsrmNamespace );
      cursor.beginElement( "Identifier", wsrmNamespace );
      cursor.insertChars( "urn:soapui:" + uuid );

      cursor.toParent();
      cursor.toParent();

      cursor.beginElement( WSRM_ACKNOWLEDGMENTS_TO, wsrmNamespace );
      cursor.insertNamespace( "wsa", WsaUtils.getNamespace( startSequenceRequest.getWsaConfig().getVersion() ) );
      cursor.beginElement( "Address", WsaUtils.getNamespace( startSequenceRequest.getWsaConfig().getVersion() ) );
      if( ackTo == null || ackTo.length() < 1 )
        ackTo = WsaUtils.getNamespace( startSequenceRequest.getWsaConfig().getVersion() ) + "/anonymous" + "?id="
            + uuid;
      cursor.insertChars( ackTo );
      // cursor.insertChars(request.getWsrmConfig().getAckTo());

      if( expires != 0 )
      {
        cursor.toParent();

        cursor.beginElement( WSRM_EXPIRES, wsrmNamespace );
        cursor.insertChars( expires.toString() );
      }

      cursor.dispose();

      WsaUtils wsaUtils = new WsaUtils( object.xmlText(), soapVersion, null, new DefaultPropertyExpansionContext(
          startSequenceRequest ) );
      content = wsaUtils.addWSAddressingRequest( startSequenceRequest );

      startSequenceRequest.setRequestContent( content );

    }
    catch( XmlException e )
    {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    try
    {

      WsdlSubmit wsdlSubmit = startSequenceRequest.submit( new WsdlSubmitContext( null ), true );
      Logger.getLogger( "wsrm" ).info( "StartSequence Request Sent: " + uuid );

      // startSequenceRequest.getWsaConfig().setWsaEnabled(false);
      while( wsdlSubmit.getStatus() != Status.FINISHED )
      {
        wsdlSubmit.waitUntilFinished();
      }
      Response response = wsdlSubmit.getResponse();
      String responseContent = response.getContentAsString();
      // XmlObject xml = XmlObject.Factory.parse( responseContent );
      XmlObject xml = XmlUtils.createXmlObject( responseContent );
      XmlCursor cursor = xml.newCursor();
      cursor.toFirstContentToken();
      cursor.toFirstChild();
      cursor.toNextSibling();
      cursor.toFirstChild();
      cursor.toFirstChild();
      String sequenceIdentifier = cursor.getTextValue();
      Logger.getLogger( "wsrm" ).info( "Sequence response Received, sequence ID: " + sequenceIdentifier );

      // WsmcInjection receiveInjection = new WsmcInjection(request);
      // request.setAfterRequestInjection(receiveInjection);

      WsrmSequence sequence = new WsrmSequence( sequenceIdentifier.trim(), uuid, soapVersion, wsrmNamespace,
          operation );
      return sequence;
    }
    catch( SubmitException e1 )
    {
      SoapUI.logError( e1 );
      return null;
    }
    catch( XmlException e )
    {
      SoapUI.logError( e );
      return null;
    }
  }

  public static String getWsrmVersionNamespace( WsrmVersionTypeConfig.Enum wsrmVersion )
  {
    if( wsrmVersion == WsrmVersionTypeConfig.X_1_0 )
      return WSRM_NS_1_0;
    else if( wsrmVersion == WsrmVersionTypeConfig.X_1_1 )
      return WSRM_NS_1_1;
    else
      return WSRM_NS_1_2;
  }

  public void closeSequence( String endpoint, SoapVersion soapVersion, String wsrmNamespace, String uuid,
      String identifier, long lastMsgNum, WsdlOperation operation )
  {

    HttpRequestConfig httpRequestConfig = ( HttpRequestConfig )( XmlObject.Factory.newInstance()
        .changeType( HttpRequestConfig.type ) );
    httpRequestConfig.setEndpoint( endpoint );
    httpRequestConfig.setMediaType( soapVersion.getContentType() );

    WsaConfigConfig wsaConfigConfig = ( WsaConfigConfig )( XmlObject.Factory.newInstance()
        .changeType( WsaConfigConfig.type ) );
    WsaContainer wsaContainer = new WsaContainerImpl();
    wsaContainer.setOperation( operation );
    WsaConfig wsaConfig = new WsaConfig( wsaConfigConfig, wsaContainer );

    WsrmConfigConfig wsrmConfigConfig = ( WsrmConfigConfig )( XmlObject.Factory.newInstance()
        .changeType( WsrmConfigConfig.type ) );
    WsrmConfig wsrmConfig = new WsrmConfig( wsrmConfigConfig, null );

    if( !wsrmNamespace.equals( WSRM_NS_1_0 ) )
    {
      WsaRequest closeSequenceRequest = new WsaRequest( httpRequestConfig, wsaConfig, wsrmConfig, false );
      closeSequenceRequest.setOperation( operation );

      String openSequenceMessageContent = SoapMessageBuilder.buildEmptyMessage( soapVersion );

      closeSequenceRequest.getWsaConfig().setWsaEnabled( true );
      closeSequenceRequest.getWsaConfig().setAction( wsrmNamespace + WSRM_CLOSE_SEQUENCE_ACTION );

      closeSequenceRequest.getWsaConfig().setTo( endpoint );
      closeSequenceRequest.getWsaConfig().setGenerateMessageId( true );

      try
      {
        // XmlObject object = XmlObject.Factory.parse(
        // openSequenceMessageContent );
        XmlObject object = XmlUtils.createXmlObject( openSequenceMessageContent );
        XmlCursor cursor = object.newCursor();

        cursor.toFirstContentToken();
        cursor.toFirstChild();
        cursor.toNextSibling();

        cursor.toNextToken();
        cursor.insertNamespace( "wsrm", wsrmNamespace );

        cursor.beginElement( WSRM_CLOSE_SEQUENCE, wsrmNamespace );

        cursor.beginElement( WSRM_IDENTIFIER, wsrmNamespace );
        cursor.insertChars( identifier );

        cursor.toParent();

        cursor.beginElement( WSRM_LAST_MSG, wsrmNamespace );
        cursor.insertChars( String.valueOf( lastMsgNum ) );
        cursor.dispose();

        WsaUtils wsaUtils = new WsaUtils( object.xmlText(), soapVersion, null, new DefaultPropertyExpansionContext(
            closeSequenceRequest ) );
        content = wsaUtils.addWSAddressingRequest( closeSequenceRequest );

        closeSequenceRequest.setRequestContent( content );

        Logger.getLogger( "wsrm" ).info( "CloseSequence Request Sent for Sequence: " + identifier );

      }
      catch( XmlException e )
      {
        SoapUI.logError( e );
      }

      try
      {

        WsdlSubmit wsdlSubmit = closeSequenceRequest.submit( new WsdlSubmitContext( null ), true );
        while( wsdlSubmit.getStatus() != Status.FINISHED )
        {
          wsdlSubmit.waitUntilFinished();
        }
        Response response = wsdlSubmit.getResponse();
        String responseContent = response.getContentAsString();
        // XmlObject xml = XmlObject.Factory.parse( responseContent );
        XmlObject xml = XmlUtils.createXmlObject( responseContent );

        XmlOptions options = new XmlOptions();

        String namespaceDeclaration = "declare namespace wsrm='" + wsrmNamespace + "';";
        XmlObject result[] = xml.selectPath( namespaceDeclaration + "//wsrm:AcknowledgementRange", options );

        if( result.length > 0 )
        {
          for( int i = 0; i < result.length; i++ )
          {
            String upper = result[i].selectAttribute( null, "Upper" ).getDomNode().getNodeValue();
            String lower = result[i].selectAttribute( null, "Lower" ).getDomNode().getNodeValue();

            if( lower == upper )
            {
              Logger.getLogger( "wsrm" ).info(
                  "Acknowledgment for message " + upper + " received for identifier: " + identifier );
            }
            else
            {
              Logger.getLogger( "wsrm" ).info(
                  "Acknowledgment for messages " + lower + " to " + upper + " received for identifier: "
                      + identifier );
            }
          }
        }
        else
        {
          Logger.getLogger( "wsrm" ).info( "No Acknowledgments received for identifier: " + identifier );
        }

      }
      catch( SubmitException e1 )
      {
        SoapUI.logError( e1 );

      }
      catch( XmlException e )
      {
        SoapUI.logError( e );
      }
    }

    // The Terminate Sequence Message
    WsaRequest terminateSequenceRequest = new WsaRequest( httpRequestConfig, wsaConfig, wsrmConfig, false );
    terminateSequenceRequest.setOperation( operation );

    String terminateSequenceRequestContent = SoapMessageBuilder.buildEmptyMessage( soapVersion );

    terminateSequenceRequest.getWsaConfig().setWsaEnabled( true );
    terminateSequenceRequest.getWsaConfig().setAction( wsrmNamespace + WSRM_TERMINATE_SEQUENCE_ACTION );

    terminateSequenceRequest.getWsaConfig().setTo( endpoint );
    terminateSequenceRequest.getWsaConfig().setGenerateMessageId( true );

    try
    {
      // XmlObject object = XmlObject.Factory.parse(
      // terminateSequenceRequestContent );
      XmlObject object = XmlUtils.createXmlObject( terminateSequenceRequestContent );
      XmlCursor cursor = object.newCursor();

      cursor.toFirstContentToken();
      cursor.toFirstChild();
      cursor.toNextSibling();

      cursor.toNextToken();
      cursor.insertNamespace( "wsrm", wsrmNamespace );

      cursor.beginElement( "TerminateSequence", wsrmNamespace );
      cursor.beginElement( WSRM_IDENTIFIER, wsrmNamespace );
      cursor.insertChars( identifier );

      cursor.dispose();

      // startSequenceRequest.getOperation().setAction("");
      // startSequenceRequest.setRequestContent(object.xmlText());

      WsaUtils wsaUtils = new WsaUtils( object.xmlText(), soapVersion, null, new DefaultPropertyExpansionContext(
          terminateSequenceRequest ) );
      terminateSequenceRequestContent = wsaUtils.addWSAddressingRequest( terminateSequenceRequest );

      terminateSequenceRequest.setRequestContent( terminateSequenceRequestContent );

    }
    catch( XmlException e )
    {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    try
    {
      WsdlSubmit wsdlSubmit = terminateSequenceRequest.submit( new WsdlSubmitContext( null ), true );

    }
    catch( SubmitException e1 )
    {
      SoapUI.logError( e1 );
    }
  }

  public void getAcks( String endpoint, SoapVersion soapVersion, String wsrmNamespace, String uuid, String identifier,
      WsdlOperation operation )
  {

    HttpRequestConfig httpRequestConfig = ( HttpRequestConfig )( XmlObject.Factory.newInstance()
        .changeType( HttpRequestConfig.type ) );
    httpRequestConfig.setEndpoint( endpoint );
    httpRequestConfig.setMediaType( soapVersion.getContentType() );

    WsaConfigConfig wsaConfigConfig = ( WsaConfigConfig )( XmlObject.Factory.newInstance()
        .changeType( WsaConfigConfig.type ) );
    WsaContainer wsaContainer = new WsaContainerImpl();
    wsaContainer.setOperation( operation );
    WsaConfig wsaConfig = new WsaConfig( wsaConfigConfig, wsaContainer );

    WsrmConfigConfig wsrmConfigConfig = ( WsrmConfigConfig )( XmlObject.Factory.newInstance()
        .changeType( WsrmConfigConfig.type ) );
    WsrmConfig wsrmConfig = new WsrmConfig( wsrmConfigConfig, null );

    WsaRequest startSequenceRequest = new WsaRequest( httpRequestConfig, wsaConfig, wsrmConfig, false );
    startSequenceRequest.setOperation( operation );

    String openSequenceMessageContent = SoapMessageBuilder.buildEmptyMessage( soapVersion );

    startSequenceRequest.getWsaConfig().setWsaEnabled( true );
    startSequenceRequest.getWsaConfig().setAction( wsrmNamespace + WSRM_REQUEST_ACK_ACTION );

    startSequenceRequest.getWsaConfig().setTo( endpoint );
    startSequenceRequest.getWsaConfig().setGenerateMessageId( true );

    try
    {
      // XmlObject object = XmlObject.Factory.parse(
      // openSequenceMessageContent );
      XmlObject object = XmlUtils.createXmlObject( openSequenceMessageContent );
      XmlCursor cursor = object.newCursor();

      cursor.toFirstContentToken();
      cursor.toFirstChild();
      cursor.toNextSibling();

      cursor.toNextToken();
      cursor.insertNamespace( "wsrm", wsrmNamespace );

      cursor.beginElement( WSRM_REQUEST_ACK, wsrmNamespace );

      cursor.beginElement( WSRM_IDENTIFIER, wsrmNamespace );
      cursor.insertChars( identifier );

      cursor.dispose();

      WsaUtils wsaUtils = new WsaUtils( object.xmlText(), soapVersion, null, new DefaultPropertyExpansionContext(
          startSequenceRequest ) );
      content = wsaUtils.addWSAddressingRequest( startSequenceRequest );

      startSequenceRequest.setRequestContent( content );

      // WsmcInjection wsmcInjection = new WsmcInjection(endpoint,
      // operation, soapVersion, uuid);
      // startSequenceRequest.setAfterRequestInjection(wsmcInjection);

      Logger.getLogger( "wsrm" ).info( "Acknowledgments Requested for Sequence: " + identifier );

    }
    catch( XmlException e )
    {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    try
    {

      WsdlSubmit wsdlSubmit = startSequenceRequest.submit( new WsdlSubmitContext( null ), true );

      while( wsdlSubmit.getStatus() != Status.FINISHED )
      {
        wsdlSubmit.waitUntilFinished();
      }
      Response response = wsdlSubmit.getResponse();
      String responseContent = response.getContentAsString();
      // XmlObject xml = XmlObject.Factory.parse( responseContent );
      XmlObject xml = XmlUtils.createXmlObject( responseContent );
      XmlObject result = xml.selectPath( "Envelope/Header/SequenceAcknowledgment" )[0];

      if( result != null )
      {

      }

    }
    catch( SubmitException e1 )
    {
      SoapUI.logError( e1 );

    }
    catch( XmlException e )
    {
      SoapUI.logError( e );
    }
  }
}
TOP

Related Classes of com.eviware.soapui.impl.wsdl.support.wsrm.WsrmUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.