/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.support.factory; 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; import org.apache.log4j.Logger; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; 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); private Set<SoapUIFactoryRegistryListener> listeners = new HashSet<SoapUIFactoryRegistryListener>(); 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); for( SoapUIFactoryRegistryListener listener : listeners ) listener.factoryAdded( factoryType, factory ); } public void removeFactory(Class<?> factoryType, Object factory) { if (factories.containsKey(factoryType)) { factories.get(factoryType).remove(factory); for( SoapUIFactoryRegistryListener listener : listeners ) listener.factoryRemoved( factoryType, factory ); } } @SuppressWarnings("unchecked") public <T extends Object> List<T> getFactories(Class<T> factoryType) { List<T> result = new ArrayList<T>(); if (factories.containsKey(factoryType)) { for( Object obj : factories.get(factoryType)) result.add((T) obj); } return result; } public void addFactoryRegistryListener( SoapUIFactoryRegistryListener listener ) { listeners.add( listener ); } public void removeFactoryRegistryListener( SoapUIFactoryRegistryListener listener ) { listeners.remove( listener ); } }