/* * 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.action; import com.eviware.soapui.SoapUI; import com.eviware.soapui.config.ActionMappingPositionTypeConfig; import com.eviware.soapui.config.SoapUIActionConfig; import com.eviware.soapui.config.SoapUIActionGroupConfig; import com.eviware.soapui.config.SoapUIActionMappingConfig; import com.eviware.soapui.config.SoapUIActionsConfig; import com.eviware.soapui.config.SoapuiActionsDocumentConfig; import com.eviware.soapui.model.ModelItem; import com.eviware.soapui.support.action.support.AbstractSoapUIAction; import com.eviware.soapui.support.action.support.DefaultActionMapping; import com.eviware.soapui.support.action.support.DefaultSoapUIActionGroup; import com.eviware.soapui.support.action.support.StandaloneActionMapping; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Global SoapUIAction Registry * * @author ole.matzura */ @SuppressWarnings("unchecked") public class SoapUIActionRegistry { private Map<String, SoapUIAction> actions = new HashMap<String, SoapUIAction>(); private Map<String, SoapUIActionGroup> actionGroups = new HashMap<String, SoapUIActionGroup>(); public void addAction(String soapuiActionID, SoapUIAction action) { actions.put(soapuiActionID, action); } public SoapUIActionGroup findGroupWithClass(Class<? extends SoapUIActionGroup> aClass) { for (SoapUIActionGroup soapUIActionGroup : actionGroups.values()) { if (soapUIActionGroup.getClass().equals(aClass)) { return soapUIActionGroup; } } throw new IllegalArgumentException("Action group not found for class " + aClass); } public void removeAction(String soapuiActionID) { actions.remove(soapuiActionID); } public static class SeperatorAction extends AbstractSoapUIAction { public static final String SOAPUI_ACTION_ID = "SeperatorAction"; public static SeperatorAction INSTANCE = new SeperatorAction(); private static SoapUIActionMapping defaultMapping = new DefaultActionMapping(SeperatorAction.SOAPUI_ACTION_ID, null, null, false, null); public SeperatorAction() { super(null, null); } public void perform(ModelItem target, Object param) { } public static SoapUIActionMapping getDefaultMapping() { return defaultMapping; } } public static class SoapUIActionGroupAction<T extends ModelItem> extends AbstractSoapUIAction<T> { private SoapUIActionGroup actionGroup; private final String actionGroupId; private boolean insert; public SoapUIActionGroupAction(String name, String description, String actionGroupId) { super(name, description); this.actionGroupId = actionGroupId; } public SoapUIActionGroup getActionGroup() { if (actionGroup == null) { actionGroup = SoapUI.getActionRegistry().getActionGroup(actionGroupId); } return actionGroup; } public void perform(T target, Object param) { SoapUIActionGroup group = getActionGroup(); List<SoapUIActionMapping<T>> mappings = group.getActionMappings(target); for (SoapUIActionMapping<T> mapping : mappings) { if (mapping.isDefault()) { mapping.getAction().perform(target, param); } } } public void setInsert(boolean insert) { this.insert = insert; } public boolean isInsert() { return insert; } } public SoapUIAction getAction(String soapUIActionId) { SoapUIAction soapUIAction = actions.get(soapUIActionId); if (soapUIAction == null) { System.err.println("Missing action [" + soapUIActionId + "]"); } return soapUIAction; } public SoapUIActionRegistry(InputStream config) { // default actions addAction(SeperatorAction.SOAPUI_ACTION_ID, SeperatorAction.INSTANCE); if (config != null) { addConfig(config, SoapUI.class.getClassLoader()); } } public void addConfig(InputStream config, ClassLoader classLoader) { try { SoapuiActionsDocumentConfig configDocument = SoapuiActionsDocumentConfig.Factory.parse(config); SoapUIActionsConfig soapuiActions = configDocument.getSoapuiActions(); for (SoapUIActionConfig action : soapuiActions.getActionList()) { try { String id = action.getId(); Class<?> actionClass = Class.forName(action.getActionClass(), true, classLoader); addAction(id, (SoapUIAction) actionClass.newInstance()); } catch (Exception e) { SoapUI.logError(e); e.printStackTrace(); } } for (SoapUIActionGroupConfig group : soapuiActions.getActionGroupList()) { SoapUIActionGroup actionGroup; // modify existing? String groupId = group.getId(); if (actionGroups.containsKey(groupId)) { actionGroup = actionGroups.get(groupId); if (group.isSetClass1()) { actionGroup = createActionGroupClassFromConfig(group); addActionGroup(actionGroup, groupId); } addMappings(actionGroup, group); } else { if (group.isSetClass1()) { actionGroup = createActionGroupClassFromConfig(group); } else { actionGroup = new DefaultSoapUIActionGroup(groupId, group.getName()); } addMappings(actionGroup, group); addActionGroup(actionGroup, groupId); } } } catch (Exception e) { SoapUI.logError(e); } finally { try { config.close(); } catch (IOException e) { SoapUI.logError(e); } } } // package protected to facilitate unit testing SoapUIActionGroup addActionGroup(SoapUIActionGroup actionGroup, String groupId) { return actionGroups.put(groupId, actionGroup); } private SoapUIActionGroup createActionGroupClassFromConfig(SoapUIActionGroupConfig group) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { SoapUIActionGroup actionGroup; Class<SoapUIActionGroup> actionGroupClass = (Class<SoapUIActionGroup>) Class.forName(group.getClass1()); Constructor<SoapUIActionGroup> constructor = actionGroupClass.getConstructor(new Class[]{String.class, String.class}); if (constructor != null) { actionGroup = constructor.newInstance(group.getId(), group.getName()); } else { actionGroup = actionGroupClass.newInstance(); } return actionGroup; } private void addMappings(SoapUIActionGroup actionGroup, SoapUIActionGroupConfig groupConfig) { for (SoapUIActionMappingConfig mapping : groupConfig.getActionMappingList()) { try { int insertIndex = -1; if (mapping.isSetPosition() && mapping.isSetPositionRef()) { insertIndex = actionGroup.getMappingIndex(mapping.getPositionRef()); if (mapping.getPosition() == ActionMappingPositionTypeConfig.AFTER) { insertIndex++; } } if (mapping.isSetGroupId()) { SoapUIActionGroupAction actionListAction = new SoapUIActionGroupAction(mapping.getName(), mapping.getDescription(), mapping.getGroupId()); StandaloneActionMapping actionMapping = new StandaloneActionMapping(actionListAction); actionGroup.addMapping(mapping.getGroupId(), insertIndex, actionMapping); if (mapping.isSetName()) { actionMapping.setName(mapping.getName()); } if (mapping.isSetDescription()) { actionMapping.setDescription(mapping.getDescription()); } } else if (mapping.getActionId().equals(SeperatorAction.SOAPUI_ACTION_ID)) { actionGroup.addMapping(SeperatorAction.SOAPUI_ACTION_ID, insertIndex, SeperatorAction.getDefaultMapping()); } else { DefaultActionMapping actionMapping = new DefaultActionMapping(mapping.getActionId(), mapping.getKeyStroke(), mapping.getIconPath(), mapping.getActionId().equals( groupConfig.getDefault()), mapping.getParam()); actionGroup.addMapping(mapping.getActionId(), insertIndex, actionMapping); if (mapping.isSetName()) { actionMapping.setName(mapping.getName()); } if (mapping.isSetDescription()) { actionMapping.setDescription(mapping.getDescription()); } } } catch (Exception e) { System.err.println("Error initializing ActionMapping: " + e); SoapUI.logError(e); } } } public <T extends ModelItem> SoapUIActionGroup<T> getActionGroup(String groupId) { return actionGroups.get(groupId); } public void performAction(String soapUIActionId, ModelItem modelItem, Object param) { SoapUIAction<ModelItem> action = getAction(soapUIActionId); if (action != null) { action.perform(modelItem, param); } } public SoapUIActionGroup addActionGroup(SoapUIActionGroup actionGroup) { return addActionGroup(actionGroup, actionGroup.getId()); } }