Package com.eviware.soapui.impl.wsdl.actions.iface

Source Code of com.eviware.soapui.impl.wsdl.actions.iface.AddJMSEndpointAction$Destination

/*
*  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.actions.iface;

import hermes.Domain;
import hermes.Hermes;
import hermes.HermesContext;
import hermes.JAXBHermesLoader;
import hermes.config.DestinationConfig;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.naming.Context;
import javax.naming.NamingException;

import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.support.AbstractInterface;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.impl.wsdl.submit.transports.jms.JMSEndpoint;
import com.eviware.soapui.impl.wsdl.submit.transports.jms.util.HermesUtils;
import com.eviware.soapui.model.propertyexpansion.PropertyExpander;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.action.support.AbstractSoapUIAction;
import com.eviware.x.form.XForm;
import com.eviware.x.form.XFormDialog;
import com.eviware.x.form.XFormDialogBuilder;
import com.eviware.x.form.XFormFactory;
import com.eviware.x.form.XFormField;
import com.eviware.x.form.XFormFieldListener;

public class AddJMSEndpointAction extends AbstractSoapUIAction<AbstractInterface<?>>
{
  public static final String SOAPUI_ACTION_ID = "AddJMSEndpointAction";
  private static final String SESSION = "Session";
  private static final String HERMES_CONFIG = "Hermes Config";
  private static final String SEND = "Send/Publish destination";
  private static final String RECEIVE = "Receive/Subscribe destination";
  private XForm mainForm;
  List<Destination> destinationNameList;

  public AddJMSEndpointAction()
  {
    super( "Add JMS endpoint", "Wizard for creating JMS endpoint" );
  }

  public void perform( AbstractInterface<?> iface, Object param )
  {

    XFormDialog dialog = buildDialog( iface );

    initValues( iface );

    if( dialog.show() )
    {
      String session = dialog.getValue( SESSION );
      int i = dialog.getValueIndex( SEND );
      if( i == -1 )
      {
        UISupport.showErrorMessage( "Not supported endpoint" );
        return;
      }
      String send = destinationNameList.get( i ).getDestinationName();
      int j = dialog.getValueIndex( RECEIVE );
      if( j == -1 )
      {
        UISupport.showErrorMessage( "Not supported endpoint" );
        return;
      }
      String receive = destinationNameList.get( j ).getDestinationName();
      if( JMSEndpoint.JMS_EMPTY_DESTIONATION.equals( send ) && JMSEndpoint.JMS_EMPTY_DESTIONATION.equals( receive ) )
      {
        UISupport.showErrorMessage( "Not supported endpoint" );
        return;
      }

      iface.addEndpoint( createEndpointString( session, send, receive ) );
    }
  }

  private String createEndpointString( String session, String send, String receive )
  {
    StringBuilder sb = new StringBuilder( JMSEndpoint.JMS_ENDPIONT_PREFIX );
    sb.append( session + JMSEndpoint.JMS_ENDPOINT_SEPARATOR );
    sb.append( send );
    if( !JMSEndpoint.JMS_EMPTY_DESTIONATION.equals( receive ) )
      sb.append( JMSEndpoint.JMS_ENDPOINT_SEPARATOR + receive );
    return sb.toString();
  }

  private String[] getSessionOptions( AbstractInterface<?> iface, String hermesConfigPath )
  {

    List<Hermes> hermesList = new ArrayList<Hermes>();
    try
    {
      Context ctx = getHermesContext( iface, hermesConfigPath );
      JAXBHermesLoader loader = ( JAXBHermesLoader )ctx.lookup( HermesContext.LOADER );
      hermesList = loader.load();
    }
    catch( Exception e )
    {
      SoapUI.logError( e );
      SoapUI.log.warn( "no HermesJMS context!" );
    }
    List<String> hermesSessionList = new ArrayList<String>();
    for( Hermes h : hermesList )
    {
      if( !h.getSessionConfig().getId().equals( "<new>" ) )
        hermesSessionList.add( h.getSessionConfig().getId() );
    }
    return hermesSessionList.toArray( new String[hermesSessionList.size()] );
  }

  private void initValues( AbstractInterface<?> iface )
  {
    String hermesConfigPath = PropertyExpander.expandProperties( iface, iface.getProject().getHermesConfig() );
    mainForm.getComponent( HERMES_CONFIG ).setValue( hermesConfigPath );

    String[] sessionOptions = getSessionOptions( iface, hermesConfigPath );

    mainForm.setOptions( SESSION, sessionOptions );
    Context ctx = null;
    try
    {
      ctx = getHermesContext( iface, hermesConfigPath );
    }
    catch( Exception e )
    {
      SoapUI.log.info( "no hermes context" );
    }
    Hermes hermes = null;
    try
    {
      if( sessionOptions != null && sessionOptions.length > 0 )
      {
        hermes = ( Hermes )ctx.lookup( sessionOptions[0] );
      }

      if( hermes != null )
      {
        updateDestinations( hermes );
      }
    }
    catch( NamingException e )
    {
      SoapUI.logError( e );
    }

  }

  private void updateDestinations( Hermes hermes )
  {
    destinationNameList = new ArrayList<Destination>();
    destinationNameList.add( new Destination( JMSEndpoint.JMS_EMPTY_DESTIONATION, Domain.UNKNOWN ) );
    extractDestinations( hermes, destinationNameList );
    mainForm.setOptions( SEND, destinationNameList.toArray() );
    mainForm.setOptions( RECEIVE, destinationNameList.toArray() );
  }

  private Context getHermesContext( AbstractInterface<?> iface, String hermesConfigPath )
      throws MalformedURLException, NamingException, IOException
  {
    WsdlProject project = iface.getProject();
    HermesUtils.flushHermesCache();
    Context ctx = HermesUtils.hermesContext( project, hermesConfigPath );
    return ctx;

  }

  protected XFormDialog buildDialog( final AbstractInterface<?> iface )
  {
    if( iface == null )
      return null;

    XFormDialogBuilder builder = XFormFactory.createDialogBuilder( "Add JMS endpoint" );

    mainForm = builder.createForm( "Basic" );
    mainForm.addTextField( HERMES_CONFIG, "choose folder where hermes-config.xml is", XForm.FieldType.FOLDER )
        .addFormFieldListener( new XFormFieldListener()
        {
          public void valueChanged( XFormField sourceField, String newValue, String oldValue )
          {
            if( !"".equals( newValue ) )
            {
              Hermes hermes = null;
              try
              {
                Context ctx = getHermesContext( iface, newValue );
                iface.getProject().setHermesConfig( newValue );
                String[] sessions = getSessionOptions( iface, newValue );
                mainForm.setOptions( SESSION, sessions );
                if( sessions != null && sessions.length > 0 )
                {
                  hermes = ( Hermes )ctx.lookup( sessions[0] );
                }
              }
              catch( Exception e )
              {
                SoapUI.logError( e );
              }
              if( hermes != null )
              {
                updateDestinations( hermes );
              }
              else
              {
                mainForm.setOptions( SESSION, new String[] {} );
                mainForm.setOptions( SEND, new String[] {} );
                mainForm.setOptions( RECEIVE, new String[] {} );
              }
            }
          }
        } );
    mainForm.addComboBox( SESSION, new String[] {}, "Session name from HermesJMS" ).addFormFieldListener(
        new XFormFieldListener()
        {

          public void valueChanged( XFormField sourceField, String newValue, String oldValue )
          {
            String hermesConfigPath = mainForm.getComponent( HERMES_CONFIG ).getValue();

            Hermes hermes = null;
            try
            {
              Context ctx = getHermesContext( iface, hermesConfigPath );
              hermes = ( Hermes )ctx.lookup( newValue );
            }
            catch( Exception e )
            {
              SoapUI.logError( e );
            }
            if( hermes != null )
            {
              updateDestinations( hermes );
            }
            else
            {
              mainForm.setOptions( SEND, new String[] {} );
              mainForm.setOptions( RECEIVE, new String[] {} );
            }
          }

        } );
    mainForm.addComboBox( SEND, new String[] {}, "Queue/Topic  sending/publishing" );
    mainForm.addComboBox( RECEIVE, new String[] {}, "Queue/Topic  receive/subscribe" );

    return builder.buildDialog( builder.buildOkCancelActions(), "create JMS endpoint by selecting proper values",
        null );
  }

  private void extractDestinations( Hermes hermes, List<Destination> destinationList )
  {
    Iterator<?> hermesDestionations = hermes.getDestinations();
    while( hermesDestionations.hasNext() )
    {
      DestinationConfig dest = ( DestinationConfig )hermesDestionations.next();
      Destination temp = new Destination( dest.getName(), Domain.getDomain( dest.getDomain() ) );
      destinationList.add( temp );
    }
  }

  private class Destination
  {
    public Destination( String destinationName, Domain domain )
    {
      this.domain = domain;
      if( destinationName.equals( JMSEndpoint.JMS_EMPTY_DESTIONATION ) || destinationName.equals( "" ) )
      {
        this.destinationName = destinationName;
      }
      else
      {
        if( domain.equals( Domain.QUEUE ) )
        {
          this.destinationName = JMSEndpoint.QUEUE_ENDPOINT_PREFIX + destinationName;
        }
        else
        {
          this.destinationName = JMSEndpoint.TOPIC_ENDPOINT_PREFIX + destinationName;
        }
      }

    }

    private String destinationName;
    private Domain domain;

    public String getDestinationName()
    {
      return destinationName;
    }

    public Domain getDomain()
    {
      return domain;
    }

    public String toString()
    {
      return this.getDestinationName().replace( JMSEndpoint.QUEUE_ENDPOINT_PREFIX, "" )
          .replace( JMSEndpoint.TOPIC_ENDPOINT_PREFIX, "" );
    }
  }

}
TOP

Related Classes of com.eviware.soapui.impl.wsdl.actions.iface.AddJMSEndpointAction$Destination

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.