/* * 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.impl.wsdl.actions.iface.tools.support; import com.eviware.soapui.SoapUI; import com.eviware.soapui.actions.SoapUIPreferencesAction; import com.eviware.soapui.impl.support.AbstractInterface; import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction; import com.eviware.soapui.impl.wsdl.WsdlInterface; import com.eviware.soapui.impl.wsdl.support.PathUtils; import com.eviware.soapui.model.ModelItem; import com.eviware.soapui.model.iface.Interface; import com.eviware.soapui.settings.ProjectSettings; import com.eviware.soapui.support.StringUtils; import com.eviware.soapui.support.Tools; import com.eviware.soapui.support.UISupport; import com.eviware.soapui.support.action.support.AbstractSoapUIAction; import com.eviware.soapui.support.action.swing.ActionList; import com.eviware.soapui.support.action.swing.DefaultActionList; import com.eviware.soapui.support.types.StringToStringMap; import com.eviware.x.form.XForm; import com.eviware.x.form.XFormDialog; import com.eviware.x.form.XFormDialogBuilder; import com.eviware.x.form.XFormField; import com.eviware.x.form.XFormTextField; import org.apache.log4j.Logger; import javax.swing.AbstractAction; import javax.swing.Action; import java.awt.event.ActionEvent; import java.io.File; import java.io.FilenameFilter; /** * Abstract base class for Tool Actions * * @author Ole.Matzura */ public abstract class AbstractToolsAction<T extends ModelItem> extends AbstractSoapUIAction<T> { @SuppressWarnings("unused") private static final Logger log = Logger.getLogger(AbstractToolsAction.class); protected static final String WSDL = "WSDL"; protected static final String CACHED_WSDL = "Use cached WSDL"; protected static final String JAVA_ARGS = "Java Args"; protected static final String TOOL_ARGS = "Tool Args"; protected static final String SOAPUISETTINGSPASSWORD = "user-settings.xml Password"; private XFormDialog dialog; protected String valuesSettingID; private XFormField useCached; private T modelItem; // Configure behavior of this action: private boolean fixedWSDL = false; private Action toolsSettingsAction = new ShowIntegratedToolsSettingsAction(); ; public AbstractToolsAction(String name, String description) { super(name, description); } public XFormDialog getDialog() { return dialog; } public String getValuesSettingID() { return valuesSettingID; } public void setValuesSettingID(String valuesSettingID) { this.valuesSettingID = valuesSettingID; } /** * Set this to true to not let the user edit the WSDL. * * @param b */ public void setFixedWSDL(boolean b) { this.fixedWSDL = b; } public T getModelItem() { return modelItem; } public void perform(T target, Object param) { this.valuesSettingID = this.getClass().getName() + "@values"; if (target == null) { this.valuesSettingID += "-global"; } else { this.valuesSettingID += "-local"; } modelItem = target; // Could reuse the dialog in Swing, but not in Eclipse. // if( dialog == null ) dialog = buildDialog((T) target); if (dialog == null) { try { generate(initValues((T) target, param), UISupport.getToolHost(), (T) target); } catch (Exception e1) { UISupport.showErrorMessage(e1); } } else { StringToStringMap values = initValues((T) target, param); dialog.setValues(values); dialog.setVisible(true); } } /** * Perform an * * @param target * @param param */ public void performHeadless(T target, Object param) { this.valuesSettingID = this.getClass().getName() + "@values"; if (target == null) { this.valuesSettingID += "-global"; } else { this.valuesSettingID += "-local"; } modelItem = target; try { generate(initValues((T) target, param), UISupport.getToolHost(), (T) target); } catch (Exception e1) { UISupport.showErrorMessage(e1); } } protected StringToStringMap initValues(T modelItem, Object param) { String settingValues = modelItem == null ? SoapUI.getSettings().getString(valuesSettingID, null) : modelItem .getSettings().getString(valuesSettingID, null); StringToStringMap result = settingValues == null ? new StringToStringMap() : StringToStringMap .fromXml(settingValues); if (modelItem instanceof WsdlInterface) { initWSDL(result, (WsdlInterface) modelItem); } if (dialog != null && modelItem != null) { String projectRoot = modelItem.getSettings().getString(ProjectSettings.PROJECT_ROOT, null); if (projectRoot != null) { dialog.setFormFieldProperty(ProjectSettings.PROJECT_ROOT, projectRoot); } } return result; } protected XFormDialog buildDialog(T modelItem) { return null; } protected void addWSDLFields(XForm mainForm, T modelItem) { if (!fixedWSDL) { XFormTextField tf = mainForm.addTextField(WSDL, "url to wsdl", XForm.FieldType.URL); if (modelItem instanceof Interface) { useCached = mainForm.addCheckBox(CACHED_WSDL, null); useCached.addComponentEnabler(tf, "false"); } } else { if (modelItem instanceof Interface) { useCached = mainForm.addCheckBox(CACHED_WSDL, null); } } } protected void initWSDL(StringToStringMap values, WsdlInterface iface) { boolean cached = iface.isCached(); if (useCached != null) { useCached.setEnabled(cached); } if (!values.containsKey(CACHED_WSDL)) { values.put(CACHED_WSDL, Boolean.toString(cached)); } if (values.getBoolean(CACHED_WSDL) || !values.hasValue(WSDL)) { values.put(WSDL, PathUtils.expandPath(iface.getDefinition(), iface)); } } protected abstract void generate(StringToStringMap values, ToolHost toolHost, T modelItem) throws Exception; public void run(ToolHost toolHost, T modelItem, Object param) throws Exception { generate(initValues(modelItem, param), toolHost, modelItem); } /** * To be overridden.. */ public void onClose(T modelItem) { if (dialog == null) { return; } if (modelItem == null) { SoapUI.getSettings().setString(valuesSettingID, dialog.getValues().toXml()); } else { modelItem.getSettings().setString(valuesSettingID, dialog.getValues().toXml()); } } protected String getWsdlUrl(StringToStringMap values, T modelItem) { String wsdl = values.get(WSDL); boolean useCached = values.getBoolean(CACHED_WSDL); if (modelItem instanceof AbstractInterface) { AbstractInterface<?> iface = (AbstractInterface<?>) modelItem; boolean hasDefinition = StringUtils.hasContent(iface.getDefinition()); if (wsdl == null && !useCached && hasDefinition) { return PathUtils.expandPath(iface.getDefinition(), iface); } if (!hasDefinition || (useCached && iface.getDefinitionContext().isCached())) { try { File tempFile = File.createTempFile("tempdir", null); String path = tempFile.getAbsolutePath(); tempFile.delete(); wsdl = iface.getDefinitionContext().export(path); // CachedWsdlLoader loader = (CachedWsdlLoader) // iface.createWsdlLoader(); // wsdl = loader.saveDefinition(path); } catch (Exception e) { SoapUI.logError(e); } } } return wsdl; } protected String buildClasspath(File jarDir) { String[] jars = jarDir.list(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".jar"); } }); StringBuilder classpath = new StringBuilder(); for (int c = 0; c < jars.length; c++) { if (c > 0) { classpath.append(File.pathSeparatorChar); } classpath.append(jars[c]); } return classpath.toString(); } protected ActionList buildDefaultActions(String helpUrl, T modelItem) { ActionList actions = new DefaultActionList("Actions"); if (helpUrl != null) { actions.addAction(new ShowOnlineHelpAction(helpUrl)); actions.addSeparator(); } Action runAction = createRunOption(modelItem); actions.addAction(runAction); actions.setDefaultAction(runAction); actions.addAction(new CloseAction(modelItem)); if (toolsSettingsAction != null) { actions.addAction(toolsSettingsAction); } return actions; } public Action getToolsSettingsAction() { return toolsSettingsAction; } public void setToolsSettingsAction(Action toolsSettingsAction) { this.toolsSettingsAction = toolsSettingsAction; } protected Action createRunOption(T modelItem) { return new GenerateAction(modelItem); } protected String getDefinition(T modelItem) { if (modelItem == null) { return ""; } WsdlInterface iface = (WsdlInterface) modelItem; String definition = PathUtils.expandPath(iface.getDefinition(), iface); if (definition.startsWith("file:")) { definition = definition.substring(5); } return definition; } protected void addJavaArgs(StringToStringMap values, ArgumentBuilder builder) { String[] javaArgs = Tools.tokenizeArgs(values.get(JAVA_ARGS)); if (javaArgs != null) { builder.addArgs(javaArgs); } } protected void addToolArgs(StringToStringMap values, ArgumentBuilder builder) { String[] toolArgs = Tools.tokenizeArgs(values.get(TOOL_ARGS)); if (toolArgs != null) { builder.addArgs(toolArgs); } } protected XForm buildArgsForm(XFormDialogBuilder builder, boolean addJavaArgs, String toolName) { XForm argsForm = builder.createForm("Custom Args"); if (addJavaArgs) { argsForm.addTextField(JAVA_ARGS, "additional arguments to java", XForm.FieldType.TEXT); } argsForm.addTextField(TOOL_ARGS, "additional arguments to " + toolName, XForm.FieldType.TEXT); return argsForm; } public static final class ShowIntegratedToolsSettingsAction extends AbstractAction { public ShowIntegratedToolsSettingsAction() { super("Tools"); } public void actionPerformed(ActionEvent e) { SoapUIPreferencesAction.getInstance().show(SoapUIPreferencesAction.INTEGRATED_TOOLS); } } protected final class CloseAction extends AbstractAction { private final T modelItem; public CloseAction(T modelItem) { super("Close"); this.modelItem = modelItem; } public void actionPerformed(ActionEvent e) { closeDialog(modelItem); } } public void closeDialog(T modelItem) { onClose(modelItem); if (dialog != null) { dialog.setVisible(false); } } protected final class GenerateAction extends AbstractAction { private final T modelItem; public GenerateAction(T modelItem) { super("Generate"); this.modelItem = modelItem; } public void actionPerformed(ActionEvent e) { try { if (dialog.validate()) { generate(dialog.getValues(), UISupport.getToolHost(), modelItem); } } catch (Exception e1) { UISupport.showErrorMessage(e1); } } } }