View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2008 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
11   */
12  
13  package com.eviware.soapui.support.action;
14  
15  import java.io.IOException;
16  import java.io.InputStream;
17  import java.lang.reflect.Constructor;
18  import java.lang.reflect.InvocationTargetException;
19  import java.util.HashMap;
20  import java.util.List;
21  import java.util.Map;
22  
23  import com.eviware.soapui.SoapUI;
24  import com.eviware.soapui.config.ActionMappingPositionTypeConfig;
25  import com.eviware.soapui.config.SoapUIActionConfig;
26  import com.eviware.soapui.config.SoapUIActionGroupConfig;
27  import com.eviware.soapui.config.SoapUIActionMappingConfig;
28  import com.eviware.soapui.config.SoapUIActionsConfig;
29  import com.eviware.soapui.config.SoapuiActionsDocumentConfig;
30  import com.eviware.soapui.model.ModelItem;
31  import com.eviware.soapui.support.action.support.AbstractSoapUIAction;
32  import com.eviware.soapui.support.action.support.DefaultActionMapping;
33  import com.eviware.soapui.support.action.support.DefaultSoapUIActionGroup;
34  import com.eviware.soapui.support.action.support.StandaloneActionMapping;
35  
36  /***
37   * Global SoapUIAction Registry
38   * 
39   * @author ole.matzura
40   */
41  
42  @SuppressWarnings( "unchecked" )
43  public class SoapUIActionRegistry
44  {
45  	private Map<String, SoapUIAction> actions = new HashMap<String, SoapUIAction>();
46  	private Map<String, SoapUIActionGroup> actionGroups = new HashMap<String, SoapUIActionGroup>();
47  
48  	public void addAction( String soapuiActionID, SoapUIAction action )
49  	{
50  		actions.put( soapuiActionID, action );
51  	}
52  
53     public void removeAction( String soapuiActionID )
54     {
55        actions.remove( soapuiActionID );
56     }
57     
58  	public static class SeperatorAction extends AbstractSoapUIAction
59  	{
60  		public static final String SOAPUI_ACTION_ID = "SeperatorAction";
61  		public static SeperatorAction INSTANCE = new SeperatorAction();
62  		private static SoapUIActionMapping defaultMapping = 
63  			new DefaultActionMapping( SeperatorAction.SOAPUI_ACTION_ID, null, null, false, null );
64  
65  		private SeperatorAction()
66  		{
67  			super( null, null );
68  		}
69  
70  		public void perform( ModelItem target, Object param )
71  		{
72  		}
73  
74  		public static SoapUIActionMapping getDefaultMapping()
75  		{
76  			return defaultMapping;
77  		}
78  	}
79  
80  	@SuppressWarnings( "unused" )
81  	public static class SoapUIActionGroupAction<T extends ModelItem> extends AbstractSoapUIAction<T>
82  	{
83  		private SoapUIActionGroup actionGroup;
84  		private final String actionGroupId; 
85  
86  		public SoapUIActionGroupAction( String name, String description, String actionGroupId )
87  		{
88  			super( name, description );
89  			this.actionGroupId = actionGroupId;
90  		}
91  
92  		public SoapUIActionGroup getActionGroup()
93  		{
94  			if( actionGroup == null )
95  				actionGroup = SoapUI.getActionRegistry().getActionGroup( actionGroupId );
96  			return actionGroup;
97  		}
98  
99  		public void perform( T target, Object param )
100 		{
101 			SoapUIActionGroup group = getActionGroup();
102 			List<SoapUIActionMapping<T>> mappings = group.getActionMappings( target );
103 			for( SoapUIActionMapping<T> mapping : mappings )
104 			{
105 				if( mapping.isDefault() )
106 				{
107 					((SoapUIAction<T>)mapping.getAction()).perform( target, param );
108 				}
109 			}
110 		}
111 	}
112 
113 	public <T extends ModelItem> SoapUIAction<T> getAction( String soapUIActionId )
114 	{
115 		SoapUIAction soapUIAction = actions.get( soapUIActionId );
116 		if( soapUIAction == null )
117 			System.err.println( "Missing action [" + soapUIActionId + "]" );
118 		return soapUIAction;
119 	}
120 	
121 	public SoapUIActionRegistry( InputStream config )
122 	{
123 		// default actions
124 		addAction( SeperatorAction.SOAPUI_ACTION_ID, SeperatorAction.INSTANCE );
125 		
126 		if( config != null )
127 			addConfig( config, SoapUI.class.getClassLoader() );
128 	}
129 
130 	public void addConfig( InputStream config, ClassLoader classLoader )
131 	{
132 		try
133 		{
134 			SoapuiActionsDocumentConfig configDocument = SoapuiActionsDocumentConfig.Factory.parse( config );
135 			SoapUIActionsConfig soapuiActions = configDocument.getSoapuiActions();
136 			
137 			for( SoapUIActionConfig action : soapuiActions.getActionList() )
138 			{
139 				try
140 				{
141 					String id = action.getId();
142 					Class<?> actionClass = Class.forName( action.getActionClass(), true, classLoader );
143 					
144 					addAction( id, ( SoapUIAction ) actionClass.newInstance());
145 				}
146 				catch( Exception e )
147 				{
148 					SoapUI.logError( e );
149 					e.printStackTrace();
150 				}
151 			}
152 			
153 			for( SoapUIActionGroupConfig group : soapuiActions.getActionGroupList() )
154 			{
155 				SoapUIActionGroup actionGroup = null;
156 				
157 				// modify existing?
158 				if( actionGroups.containsKey( group.getId() ))
159 				{
160                     actionGroup = actionGroups.get( group.getId() );
161 
162                     if( group.isSetClass1())
163                     {
164                         actionGroup = createActionGroupClassFromConfig(group);
165                         actionGroups.put( group.getId(), actionGroup );
166                     }
167 
168     				addMappings( actionGroup, group );
169 				}
170 				else
171 				{
172 					if( group.isSetClass1())
173 					{
174                         actionGroup = createActionGroupClassFromConfig(group);
175 					}
176 					else
177 					{
178 						actionGroup = new DefaultSoapUIActionGroup( group.getId(), group.getName() );
179 					}
180 					
181 					addMappings( actionGroup, group );
182 					actionGroups.put( group.getId(), actionGroup );
183 				}
184 			}
185 		}
186 		catch( Exception e )
187 		{
188 			SoapUI.logError( e );
189 		}
190 		finally
191 		{
192 			try
193 			{
194 				config.close();
195 			}
196 			catch( IOException e )
197 			{
198 				SoapUI.logError( e );
199 			}
200 		}
201 	}
202 
203     private SoapUIActionGroup createActionGroupClassFromConfig(SoapUIActionGroupConfig group) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
204         SoapUIActionGroup actionGroup;
205         Class<SoapUIActionGroup> actionGroupClass = ( Class<SoapUIActionGroup> ) Class.forName( group.getClass1() );
206 
207         Constructor<SoapUIActionGroup> constructor = actionGroupClass.getConstructor( new Class[] {String.class, String.class} );
208         if( constructor != null )
209         {
210             actionGroup = constructor.newInstance( new Object[] {group.getId(), group.getName()} );
211         }
212         else
213         {
214             actionGroup = actionGroupClass.newInstance();
215         }
216         return actionGroup;
217     }
218 
219     private void addMappings( SoapUIActionGroup actionGroup, SoapUIActionGroupConfig groupConfig )
220 	{
221 		for( SoapUIActionMappingConfig mapping : groupConfig.getActionMappingList() )
222 		{
223 			try
224 			{	
225 				int insertIndex = -1;
226 				if( mapping.isSetPosition() && mapping.isSetPositionRef() )
227 				{
228 					insertIndex = actionGroup.getMappingIndex( mapping.getPositionRef() );
229 					if( mapping.getPosition() == ActionMappingPositionTypeConfig.AFTER ) 
230 						insertIndex++;
231 				}
232 				
233 				if( mapping.isSetGroupId() )
234 				{
235 					SoapUIActionGroupAction actionListAction = new SoapUIActionGroupAction( 
236 								mapping.getName(), mapping.getDescription(), mapping.getGroupId() );
237 					StandaloneActionMapping actionMapping = new StandaloneActionMapping( actionListAction );
238 					
239 					actionGroup.addMapping( mapping.getGroupId(), insertIndex, actionMapping);
240 					
241 					if( mapping.isSetName() )
242 						actionMapping.setName( mapping.getName() );
243 
244 					if( mapping.isSetDescription() )
245 						actionMapping.setDescription( mapping.getDescription() );
246 				}
247 				else if( mapping.getActionId().equals( SeperatorAction.SOAPUI_ACTION_ID ))
248 				{
249 					actionGroup.addMapping( SeperatorAction.SOAPUI_ACTION_ID, insertIndex, 
250 								( SoapUIActionMapping ) SeperatorAction.getDefaultMapping() );
251 				}
252 				else
253 				{
254 					DefaultActionMapping actionMapping = new DefaultActionMapping( mapping.getActionId(), mapping.getKeyStroke(), 
255 																	mapping.getIconPath(), mapping.getActionId().equals( groupConfig.getDefault() ), 
256 																	mapping.getParam() );
257 					actionGroup.addMapping(  mapping.getActionId(), insertIndex, actionMapping );
258 					
259 					if( mapping.isSetName() )
260 						actionMapping.setName( mapping.getName() );
261 
262 					if( mapping.isSetDescription() )
263 						actionMapping.setDescription( mapping.getDescription() );
264 				}
265 			}
266 			catch( Exception e )
267 			{
268 				System.err.println( "Error initializing ActionMapping: " + e );
269 				SoapUI.logError( e );
270 			}
271 		}
272 	}
273 
274 	public <T extends ModelItem> SoapUIActionGroup<T> getActionGroup( String groupId )
275 	{
276 		return actionGroups.get( groupId );
277 	}
278 }