View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2007 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.impl.wsdl.actions.iface.tools.support;
14  
15  import java.awt.event.ActionEvent;
16  import java.io.File;
17  import java.io.FilenameFilter;
18  
19  import javax.swing.AbstractAction;
20  import javax.swing.Action;
21  
22  import org.apache.log4j.Logger;
23  
24  import com.eviware.soapui.SoapUI;
25  import com.eviware.soapui.actions.SoapUIPreferencesAction;
26  import com.eviware.soapui.impl.wsdl.actions.support.ShowOnlineHelpAction;
27  import com.eviware.soapui.impl.wsdl.support.wsdl.CachedWsdlLoader;
28  import com.eviware.soapui.model.ModelItem;
29  import com.eviware.soapui.model.iface.Interface;
30  import com.eviware.soapui.settings.ProjectSettings;
31  import com.eviware.soapui.support.Tools;
32  import com.eviware.soapui.support.UISupport;
33  import com.eviware.soapui.support.action.support.AbstractSoapUIAction;
34  import com.eviware.soapui.support.action.swing.ActionList;
35  import com.eviware.soapui.support.action.swing.DefaultActionList;
36  import com.eviware.soapui.support.types.StringToStringMap;
37  import com.eviware.x.form.XForm;
38  import com.eviware.x.form.XFormDialog;
39  import com.eviware.x.form.XFormDialogBuilder;
40  import com.eviware.x.form.XFormField;
41  import com.eviware.x.form.XFormTextField;
42  
43  /***
44   * Abstract base class for Tool Actions
45   * 
46   * @author Ole.Matzura
47   */
48  
49  public abstract class AbstractToolsAction<T extends ModelItem> extends AbstractSoapUIAction<T>
50  {
51     @SuppressWarnings("unused")
52  	private static final Logger log = Logger.getLogger(AbstractToolsAction.class);
53     
54  	protected static final String WSDL = "WSDL";
55  	protected static final String CACHED_WSDL = "Use cached WSDL";
56  	protected static final String JAVA_ARGS = "Java Args";
57  	protected static final String TOOL_ARGS = "Tool Args";
58  
59  	protected XFormDialog dialog;
60  	protected String valuesSettingID;
61  	private XFormField useCached;
62  	private T modelItem;
63  
64  	// Configure behavior of this action:
65  	private boolean fixedWSDL = false;
66  	private Action toolsSettingsAction = new ShowIntegratedToolsSettingsAction();;
67  
68  	public AbstractToolsAction( String name, String description)
69  	{
70  		super(name, description);
71  	}
72  
73  	public String getValuesSettingID()
74  	{
75  		return valuesSettingID;
76  	}
77  
78  	public void setValuesSettingID(String valuesSettingID)
79  	{
80  		this.valuesSettingID = valuesSettingID;
81  	}
82  
83  	/***
84  	 * Set this to true to not let the user edit the WSDL.
85  	 * 
86  	 * @param b
87  	 */
88  	public void setFixedWSDL(boolean b)
89  	{
90  		this.fixedWSDL = b;
91  	}
92  	
93  	public T getModelItem()
94  	{
95  		return modelItem;
96  	}
97  
98  	public void perform( T target, Object param )
99  	{
100 		this.valuesSettingID = this.getClass().getName() + "@values";
101 		if (target == null)
102 			this.valuesSettingID += "-global";
103 		else
104 			this.valuesSettingID += "-local";
105 		
106 		modelItem = target;
107 		
108 		// Could reuse the dialog in Swing, but not in Eclipse.
109 		// if( dialog == null )
110 		dialog = buildDialog( ( T ) target );
111 
112 		if (dialog == null)
113 		{
114 			try
115 			{
116 				generate(initValues( ( T ) target, param ), UISupport.getToolHost(), ( T ) target );
117 			}
118 			catch (Exception e1)
119 			{
120 				UISupport.showErrorMessage(e1);
121 			}
122 		}
123 		else
124 		{
125 			StringToStringMap values = initValues( ( T ) target, param );
126 
127 			dialog.setValues(values);
128 			dialog.setVisible(true);
129 		}
130 	}
131 
132 	protected StringToStringMap initValues( T modelItem, Object param )
133 	{
134 		String settingValues = modelItem == null ? SoapUI.getSettings().getString(valuesSettingID, null) : modelItem
135 				.getSettings().getString(valuesSettingID, null);
136 
137 		StringToStringMap result = settingValues == null ? new StringToStringMap() : StringToStringMap
138 				.fromXml(settingValues);
139 
140 		if (modelItem instanceof Interface)
141 		{
142 			initWSDL(result, (Interface) modelItem);
143 		}
144 
145 		if (dialog != null && modelItem != null)
146 		{
147 			String projectRoot = modelItem.getSettings().getString( ProjectSettings.PROJECT_ROOT, null);
148 			if( projectRoot != null ) 
149 				dialog.setFormFieldProperty(ProjectSettings.PROJECT_ROOT, projectRoot);
150 		}
151 
152 		return result;
153 	}
154 
155 	protected XFormDialog buildDialog( T modelItem )
156 	{
157 		return null;
158 	}
159 
160 	protected void addWSDLFields(XForm mainForm, T modelItem )
161 	{
162 		if (!fixedWSDL)
163 		{
164 			XFormTextField tf = mainForm.addTextField(WSDL, "url to wsdl", XForm.FieldType.URL);
165 
166 			if (modelItem instanceof Interface)
167 			{
168 				useCached = mainForm.addCheckBox(CACHED_WSDL, null);
169 				useCached.addComponentEnabler(tf, "false");
170 			}
171 		}
172 		else
173 		{
174 			if (modelItem instanceof Interface)
175 			{
176 				useCached = mainForm.addCheckBox(CACHED_WSDL, null);
177 			}
178 		}
179 	}
180 
181 	protected void initWSDL(StringToStringMap values, Interface iface)
182 	{
183 		boolean cached = iface.isCached();
184       if (useCached != null)
185 			useCached.setEnabled(cached);
186 
187 		if (!values.containsKey(CACHED_WSDL))
188 			values.put(CACHED_WSDL, Boolean.toString(cached));
189 
190 		if (values.getBoolean(CACHED_WSDL) || !values.hasValue(WSDL))
191 			values.put(WSDL, iface.getDefinition());
192 	}
193 
194 	protected abstract void generate(StringToStringMap values, ToolHost toolHost, T modelItem ) throws Exception;
195 
196 	public void run(ToolHost toolHost, T modelItem, Object param) throws Exception
197 	{
198 		generate(initValues( modelItem, param ), toolHost, modelItem );
199 	}
200 
201 	/***
202 	 * To be overridden..
203 	 */
204 
205 	public void onClose( T modelItem )
206 	{
207 		if (dialog == null)
208 			return;
209 
210 		if (modelItem == null)
211 		{
212 			SoapUI.getSettings().setString(valuesSettingID, dialog.getValues().toXml());
213 		}
214 		else
215 		{
216 			modelItem.getSettings().setString(valuesSettingID, dialog.getValues().toXml());
217 		}
218 	}
219 
220 	protected String getWsdlUrl(StringToStringMap values, T modelItem)
221 	{
222 		String wsdl = values.get(WSDL);
223 		boolean useCached = values.getBoolean(CACHED_WSDL);
224 
225 		if (wsdl == null && !useCached && modelItem instanceof Interface)
226 			return ((Interface) modelItem).getDefinition();
227 
228 		Interface iface = (Interface) modelItem;
229 		if (useCached && iface.isCached())
230 		{
231 			try
232 			{
233 				File tempFile = File.createTempFile("tempdir", null);
234 				String path = tempFile.getAbsolutePath();
235 				tempFile.delete();
236 				CachedWsdlLoader loader = (CachedWsdlLoader) iface.createWsdlLoader();
237 				wsdl = loader.saveDefinition(path);
238 			}
239 			catch (Exception e)
240 			{
241 				SoapUI.logError( e );
242 			}
243 		}
244 
245 		return wsdl;
246 	}
247 
248 	protected String buildClasspath(File jarDir)
249 	{
250 		String[] jars = jarDir.list(new FilenameFilter()
251 		{
252 
253 			public boolean accept(File dir, String name)
254 			{
255 				return name.endsWith(".jar");
256 			}
257 		});
258 
259 		StringBuilder classpath = new StringBuilder();
260 
261 		for (int c = 0; c < jars.length; c++)
262 		{
263 			if (c > 0)
264 				classpath.append(File.pathSeparatorChar);
265 
266 			classpath.append(jars[c]);
267 		}
268 		return classpath.toString();
269 	}
270 
271 	protected ActionList buildDefaultActions(String helpUrl, T modelItem )
272 	{
273 		ActionList actions = new DefaultActionList("Actions");
274 
275 		if (helpUrl != null)
276 		{
277 			actions.addAction(new ShowOnlineHelpAction(helpUrl));
278 			actions.addSeparator();
279 		}
280 
281 		Action runAction = createRunOption( modelItem );
282 		actions.addAction(runAction);
283 		actions.setDefaultAction( runAction );
284 		actions.addAction(new CloseAction( modelItem ));
285 		
286 		if( toolsSettingsAction != null)
287 			actions.addAction(toolsSettingsAction);
288 
289 		return actions;
290 	}
291 	
292 	public Action getToolsSettingsAction()
293 	{
294 		return toolsSettingsAction;
295 	}
296 
297 	public void setToolsSettingsAction(Action toolsSettingsAction)
298 	{
299 		this.toolsSettingsAction = toolsSettingsAction;
300 	}
301 
302 	protected Action createRunOption( T modelItem )
303 	{
304 		return new GenerateAction( modelItem );
305 	}
306 
307 	protected String getDefinition( T modelItem )
308 	{
309 		if (modelItem == null)
310 			return "";
311 
312 		String definition = ((Interface) modelItem).getDefinition();
313 		if (definition.startsWith("file:"))
314 			definition = definition.substring(5);
315 
316 		return definition;
317 	}
318 
319 	protected void addJavaArgs(StringToStringMap values, ArgumentBuilder builder)
320 	{
321 		String[] javaArgs = Tools.tokenizeArgs(values.get(JAVA_ARGS));
322 		if (javaArgs != null)
323 			builder.addArgs(javaArgs);
324 	}
325 
326 	protected void addToolArgs(StringToStringMap values, ArgumentBuilder builder)
327 	{
328 		String[] toolArgs = Tools.tokenizeArgs(values.get(TOOL_ARGS));
329 		if (toolArgs != null)
330 			builder.addArgs(toolArgs);
331 	}
332 
333 	protected XForm buildArgsForm(XFormDialogBuilder builder, boolean addJavaArgs, String toolName)
334 	{
335 		XForm argsForm = builder.createForm("Custom Args");
336 		if (addJavaArgs)
337 			argsForm.addTextField(JAVA_ARGS, "additional arguments to java", XForm.FieldType.TEXT);
338 
339 		argsForm.addTextField(TOOL_ARGS, "additional arguments to " + toolName, XForm.FieldType.TEXT);
340 		return argsForm;
341 	}
342 
343 	public static final class ShowIntegratedToolsSettingsAction extends AbstractAction
344 	{
345 		public ShowIntegratedToolsSettingsAction()
346 		{
347 			super("Tools");
348 		}
349 
350 		public void actionPerformed(ActionEvent e)
351 		{
352 			SoapUIPreferencesAction.getInstance().show(SoapUIPreferencesAction.INTEGRATED_TOOLS);
353 		}
354 	}
355 
356 	protected final class CloseAction extends AbstractAction
357 	{
358 		private final T modelItem;
359 
360 		public CloseAction( T modelItem )
361 		{
362 			super("Close");
363 			this.modelItem = modelItem;
364 		}
365 
366 		public void actionPerformed(ActionEvent e)
367 		{
368 			closeDialog( modelItem );
369 		}
370 	}
371 
372 	public void closeDialog( T modelItem )
373 	{
374 		onClose( modelItem );
375 		if (dialog != null)
376 			dialog.setVisible(false);
377 	}
378 
379 	protected final class GenerateAction extends AbstractAction
380 	{
381 		private final T modelItem;
382 
383 		public GenerateAction(T modelItem)
384 		{
385 			super("Generate");
386 			this.modelItem = modelItem;
387 		}
388 
389 		public void actionPerformed(ActionEvent e)
390 		{
391 			try
392 			{
393 				if (dialog.validate())
394 				{
395 					generate(dialog.getValues(), UISupport.getToolHost(), modelItem );
396 				}
397 			}
398 			catch (Exception e1)
399 			{
400 				UISupport.showErrorMessage(e1);
401 			}
402 		}
403 	}
404 }