Package com.eviware.soapui.support.factory

Source Code of com.eviware.soapui.support.factory.SoapUIFactoryRegistry

/*
*  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.support.factory;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import com.eviware.soapui.DefaultSoapUICore;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.config.SoapUIFactoriesConfig;
import com.eviware.soapui.config.SoapUIFactoryConfig;
import com.eviware.soapui.config.SoapuiFactoriesDocumentConfig;

public class SoapUIFactoryRegistry
{
  private Map<Class<?>, List<Object>> factories = new HashMap<Class<?>, List<Object>>();
  private Map<Class<?>, SoapUIFactoryConfig> factoryConfigs = new HashMap<Class<?>, SoapUIFactoryConfig>();
  private final static Logger log = Logger.getLogger( SoapUIFactoryRegistry.class );

  public SoapUIFactoryRegistry( InputStream config )
  {
    if( config != null )
      addConfig( config, getClass().getClassLoader() );
  }

  public void addConfig( InputStream config, ClassLoader classLoader )
  {
    try
    {
      SoapuiFactoriesDocumentConfig configDocument = SoapuiFactoriesDocumentConfig.Factory.parse( config );
      SoapUIFactoriesConfig soapuiListeners = configDocument.getSoapuiFactories();

      for( SoapUIFactoryConfig factoryConfig : soapuiListeners.getFactoryList() )
      {
        try
        {
          String factoryTypeName = factoryConfig.getFactoryType();
          String factoryClassName = factoryConfig.getFactoryClass();

          Class<?> factoryType = Class.forName( factoryTypeName, true, classLoader );
          Class<?> factoryClass = Class.forName( factoryClassName, true, classLoader );

          if( !factoryType.isAssignableFrom( factoryClass ) )
          {
            throw new RuntimeException( "Factory class: " + factoryClassName + " must be of type: "
                + factoryTypeName );
          }
          // make sure the class can be instantiated even if factory
          // will instantiate interfaces only on demand
          Object obj = factoryClass.newInstance();
          if( obj instanceof InitializableFactory )
          {
            ( ( InitializableFactory )obj ).init( factoryConfig );
          }

          getLog().info( "Adding factory [" + factoryClass + "]" );
          addFactory( factoryType, obj );
        }
        catch( Exception e )
        {
          System.err.println( "Error initializing Listener: " + e );
        }
      }
    }
    catch( Exception e )
    {
      SoapUI.logError( e );
    }
    finally
    {
      try
      {
        config.close();
      }
      catch( IOException e )
      {
        SoapUI.logError( e );
      }
    }
  }

  private Logger getLog()
  {
    return DefaultSoapUICore.log == null ? log : DefaultSoapUICore.log;
  }

  public void addFactory( Class<?> factoryType, Object factory )
  {
    if( !factories.containsKey( factoryType ) )
      factories.put( factoryType, new ArrayList<Object>() );

    factories.get( factoryType ).add( factory );
  }

  public void removeFactory( Class<?> factoryType, Object factory )
  {
    if( factories.containsKey( factoryType ) )
      factories.get( factoryType ).remove( factory );
  }

  @SuppressWarnings( "unchecked" )
  public <T extends Object> List<T> getFactories( Class<T> factoryType )
  {
    List<T> result = new ArrayList<T>();

    if( factories.containsKey( factoryType ) )
      result.addAll( ( Collection<? extends T> )factories.get( factoryType ) );

    return result;
  }
}
TOP

Related Classes of com.eviware.soapui.support.factory.SoapUIFactoryRegistry

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.