/* * 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.listener; import com.eviware.soapui.DefaultSoapUICore; import com.eviware.soapui.SoapUI; import com.eviware.soapui.config.SoapUIListenerConfig; import com.eviware.soapui.config.SoapUIListenersConfig; import com.eviware.soapui.config.SoapuiListenersDocumentConfig; import org.apache.log4j.Logger; 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; public class SoapUIListenerRegistry implements ListenerRegistry { private Map<Class<?>, List<Class<?>>> listeners = new HashMap<Class<?>, List<Class<?>>>(); private Map<Class<?>, List<Object>> singletonListeners = new HashMap<Class<?>, List<Object>>(); private Map<Class<?>, SoapUIListenerConfig> listenerConfigs = new HashMap<Class<?>, SoapUIListenerConfig>(); private final static Logger log = Logger.getLogger(SoapUIListenerRegistry.class); public void addListener(Class<?> listenerInterface, Class<?> listenerClass, SoapUIListenerConfig config) { List<Class<?>> classes = null; if (listeners.containsKey(listenerInterface)) { classes = listeners.get(listenerInterface); } if (classes == null) { classes = new ArrayList<Class<?>>(); } classes.add(listenerClass); listeners.put(listenerInterface, classes); if (config != null) { listenerConfigs.put(listenerClass, config); } } public void removeListener(Class<?> listenerInterface, Class<?> listenerClass) { List<Class<?>> classes = null; if (listeners.containsKey(listenerInterface)) { classes = listeners.get(listenerInterface); } if (classes != null) { classes.remove(listenerClass); } if (classes == null || classes.size() == 0) { listeners.remove(listenerInterface); } listenerConfigs.remove(listenerClass); } public SoapUIListenerRegistry(InputStream config) { if (config != null) { addConfig(config, getClass().getClassLoader()); } } public void addConfig(InputStream config, ClassLoader classLoader) { try { SoapuiListenersDocumentConfig configDocument = SoapuiListenersDocumentConfig.Factory.parse(config); SoapUIListenersConfig soapuiListeners = configDocument.getSoapuiListeners(); for (SoapUIListenerConfig listenerConfig : soapuiListeners.getListenerList()) { try { String listenerInterfaceName = listenerConfig.getListenerInterface(); String listenerClassName = listenerConfig.getListenerClass(); Class<?> listenerInterface = Class.forName(listenerInterfaceName, true, classLoader); Class<?> listenerClass = Class.forName(listenerClassName, true, classLoader); if (!listenerInterface.isInterface()) { throw new RuntimeException("Listener interface: " + listenerInterfaceName + " must be an interface"); } if (!listenerInterface.isAssignableFrom(listenerClass)) { throw new RuntimeException("Listener class: " + listenerClassName + " must implement interface: " + listenerInterfaceName); } // make sure the class can be instantiated even if factory // will instantiate interfaces only on demand Object obj = listenerClass.newInstance(); if (listenerConfig.getSingleton()) { if (obj instanceof InitializableListener) { ((InitializableListener) obj).init(listenerConfig); } getLog().info("Adding singleton listener [" + listenerClass + "]"); addSingletonListener(listenerInterface, obj); } else { // class can be instantiated, register it getLog().info("Adding listener [" + listenerClass + "]"); addListener(listenerInterface, listenerClass, listenerConfig); } } 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 addSingletonListener(Class<?> listenerInterface, Object listener) { if (!singletonListeners.containsKey(listenerInterface)) { singletonListeners.put(listenerInterface, new ArrayList<Object>()); } singletonListeners.get(listenerInterface).add(listener); } public void removeSingletonListener(Class<?> listenerInterface, Object listener) { if (singletonListeners.containsKey(listenerInterface)) { singletonListeners.get(listenerInterface).remove(listener); } } @SuppressWarnings("unchecked") public <T extends Object> List<T> getListeners(Class<T> listenerType) { List<T> result = new ArrayList<T>(); if (listeners.containsKey(listenerType)) { List<Class<?>> list = listeners.get(listenerType); for (Class<?> listenerClass : list) { try { T listener = (T) listenerClass.newInstance(); if (listenerConfigs.containsKey(listenerClass) && listener instanceof InitializableListener) { ((InitializableListener) listener).init(listenerConfigs.get(listenerClass)); } result.add(listener); } catch (Exception e) { SoapUI.logError(e); } } } if (singletonListeners.containsKey(listenerType)) { result.addAll((Collection<? extends T>) singletonListeners.get(listenerType)); } return result; } @SuppressWarnings("unchecked") public <T extends Object> List<T> joinListeners(Class<T> listenerType, Collection<T> existing) { List<T> result = new ArrayList<T>(); if (listeners.containsKey(listenerType)) { List<Class<?>> list = listeners.get(listenerType); for (Class<?> listenerClass : list) { try { T listener = (T) listenerClass.newInstance(); if (listenerConfigs.containsKey(listenerClass) && listener instanceof InitializableListener) { ((InitializableListener) listener).init(listenerConfigs.get(listenerClass)); } result.add(listener); } catch (Exception e) { SoapUI.logError(e); } } } if (singletonListeners.containsKey(listenerType)) { result.addAll((Collection<? extends T>) singletonListeners.get(listenerType)); } result.addAll(existing); return result; } }