Package com.eviware.soapui.impl.wsdl.submit.transports.jms.util

Source Code of com.eviware.soapui.impl.wsdl.submit.transports.jms.util.HermesUtils

/*
*  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.submit.transports.jms.util;

import hermes.Hermes;
import hermes.HermesInitialContextFactory;
import hermes.JAXBHermesLoader;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

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

import com.eviware.soapui.SoapUI;
import com.eviware.soapui.SoapUIExtensionClassLoader;
import com.eviware.soapui.SoapUIExtensionClassLoader.SoapUIClassLoaderState;
import com.eviware.soapui.actions.SoapUIPreferencesAction;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.model.propertyexpansion.PropertyExpander;
import com.eviware.soapui.settings.ToolsSettings;
import com.eviware.soapui.support.Tools;
import com.eviware.soapui.support.UISupport;

public class HermesUtils
{
  private static boolean hermesJarsLoaded = false;
  private static Map<String, Context> contextMap = new HashMap<String, Context>();
  public static String HERMES_CONFIG_XML = "hermes-config.xml";

  public static Context hermesContext( WsdlProject project ) throws NamingException, MalformedURLException,
      IOException
  {
    String expandedHermesConfigPath = PropertyExpander.expandProperties( project, project.getHermesConfig() );
    String key = project.getName() + expandedHermesConfigPath;
    return getHermes( key, expandedHermesConfigPath );
  }

  public static Context hermesContext( WsdlProject project, String hermesConfigPath ) throws NamingException,
      MalformedURLException, IOException
  {
    String expandedHermesConfigPath = PropertyExpander.expandProperties( project, hermesConfigPath );
    String key = project.getName() + expandedHermesConfigPath;
    return getHermes( key, expandedHermesConfigPath );
  }

  // private static URLClassLoader hermesClassLoader;

  private static Context getHermes( String key, String hermesConfigPath ) throws IOException, MalformedURLException,
      NamingException
  {
    SoapUIClassLoaderState state = SoapUIExtensionClassLoader.ensure();
    if( !hermesJarsLoaded )
    {
      addHermesJarsToClasspath();
      hermesJarsLoaded = true;
    }

    if( contextMap.containsKey( key ) )
    {
      return contextMap.get( key );
    }

    // ClassLoader cl = Thread.currentThread().getContextClassLoader();

    try
    {
      Thread.currentThread().setContextClassLoader( JAXBHermesLoader.class.getClassLoader() );
      Properties props = new Properties();
      props.put( Context.INITIAL_CONTEXT_FACTORY, HermesInitialContextFactory.class.getName() );
      props.put( Context.PROVIDER_URL, hermesConfigPath + File.separator + HERMES_CONFIG_XML );
      props.put( "hermes.loader", JAXBHermesLoader.class.getName() );
      Context ctx = new InitialContext( props );
      contextMap.put( key, ctx );
      return ctx;
    }
    finally
    {
      state.restore();
    }
  }

  private static void addHermesJarsToClasspath() throws IOException, MalformedURLException
  {
    String hermesHome = SoapUI.getSettings().getString( ToolsSettings.HERMES_JMS, defaultHermesJMSPath() );

    if( hermesHome == null || "".equals( hermesHome ) )
    {
      hermesHome = createHermesHomeSetting();
      if( hermesHome == null )
        throw new FileNotFoundException( "HermesJMS home not specified !!!" );
    }

    System.setProperty( "hermes.home", hermesHome );

    String hermesLib = hermesHome + File.separator + "lib";
    File dir = new File( hermesLib );

    File[] children = dir.listFiles();
    List<URL> urls = new ArrayList<URL>();
    for( File file : children )
    {
      // fix for users using version of hermesJMS which still has
      // cglib-2.1.3.jar in lib directory
      String filename = file.getName();
      if( !filename.endsWith( ".jar" ) || filename.equals( "cglib-2.1.3.jar" ) )
        continue;

      urls.add( file.toURI().toURL() );

      SoapUIExtensionClassLoader.addUrlToClassLoader( new File( dir, filename ).toURI().toURL(),
          JAXBHermesLoader.class.getClassLoader() );
    }

  }

  public static void flushHermesCache()
  {
    contextMap.clear();
  }

  private static String createHermesHomeSetting()
  {
    if( Tools.isEmpty( SoapUI.getSettings().getString( ToolsSettings.HERMES_JMS, defaultHermesJMSPath() ) ) )
    {
      UISupport.showErrorMessage( "HermesJMS Home must be set in global preferences" );

      if( UISupport.getMainFrame() != null )
      {
        if( SoapUIPreferencesAction.getInstance().show( SoapUIPreferencesAction.INTEGRATED_TOOLS ) )
        {
          return SoapUI.getSettings().getString( ToolsSettings.HERMES_JMS, defaultHermesJMSPath() );
        }
      }
    }
    return null;
  }

  public static String defaultHermesJMSPath()
  {
    try
    {
      String path = SoapUI.getSettings().getString( ToolsSettings.HERMES_JMS, null );
      if( path == null || "".equals( path ) )
      {
        String temp = System.getProperty( "soapui.home" ).substring( 0,
            System.getProperty( "soapui.home" ).lastIndexOf( "bin" ) - 1 );
        path = new File( temp + File.separator + "hermesJMS" ).getAbsolutePath().toString();
        SoapUI.log( "HermesJMS path: " + path );
      }
      setHermesJMSPath( path );
      return path;
    }
    catch( Exception e )
    {
      SoapUI.log( "No HermesJMS on default path %SOAPUI_HOME%/hermesJMS" );
      return null;
    }

  }

  public static void setHermesJMSPath( String path )
  {
    if( path != null )
      SoapUI.getSettings().setString( ToolsSettings.HERMES_JMS, path );
  }

  /**
   * @param project
   * @param sessionName
   *
   * @return hermes.Hermes
   *
   * @throws NamingException
   */
  public static Hermes getHermes( WsdlProject project, String sessionName ) throws NamingException
  {
    SoapUIClassLoaderState state = SoapUIExtensionClassLoader.ensure();
    try
    {
      Context ctx = hermesContext( project );

      Hermes hermes = ( Hermes )ctx.lookup( sessionName );
      return hermes;
    }
    catch( NamingException ne )
    {
      UISupport
          .showErrorMessage( "Hermes configuration is not valid. Please check that 'Hermes Config' project property is set to path of proper hermes-config.xml file" );
      throw new NamingException( "Session name '" + sessionName
          + "' does not exist in Hermes configuration or path to Hermes config ( " + project.getHermesConfig()
          + " )is not valid !!!!" );
    }
    catch( MalformedURLException mue )
    {
      SoapUI.logError( mue );
    }
    catch( IOException ioe )
    {
      SoapUI.logError( ioe );
    }
    finally
    {
      state.restore();
    }
    return null;
  }

  public static boolean isHermesJMSSupported()
  {
    return !UISupport.isIdePlugin();
  }
}
TOP

Related Classes of com.eviware.soapui.impl.wsdl.submit.transports.jms.util.HermesUtils

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.