/*
* 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;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.analytics.Analytics;
import com.eviware.soapui.analytics.SoapUIActions;
import com.eviware.soapui.config.InterfaceConfig;
import com.eviware.soapui.config.MockServiceConfig;
import com.eviware.soapui.config.MockServiceDocumentConfig;
import com.eviware.soapui.config.ProjectConfig;
import com.eviware.soapui.config.RESTMockServiceConfig;
import com.eviware.soapui.config.SecurityTestConfig;
import com.eviware.soapui.config.SoapuiProjectDocumentConfig;
import com.eviware.soapui.config.TestCaseConfig;
import com.eviware.soapui.config.TestStepSecurityTestConfig;
import com.eviware.soapui.config.TestSuiteConfig;
import com.eviware.soapui.config.TestSuiteDocumentConfig;
import com.eviware.soapui.config.TestSuiteRunTypesConfig;
import com.eviware.soapui.config.TestSuiteRunTypesConfig.Enum;
import com.eviware.soapui.impl.WorkspaceImpl;
import com.eviware.soapui.impl.WsdlInterfaceFactory;
import com.eviware.soapui.impl.rest.DefaultOAuth2ProfileContainer;
import com.eviware.soapui.impl.rest.OAuth1ProfileContainer;
import com.eviware.soapui.impl.rest.OAuth2ProfileContainer;
import com.eviware.soapui.impl.rest.mock.RestMockService;
import com.eviware.soapui.impl.rest.support.RestRequestConverter.RestConversionException;
import com.eviware.soapui.impl.settings.XmlBeansSettingsImpl;
import com.eviware.soapui.impl.support.AbstractInterface;
import com.eviware.soapui.impl.support.EndpointSupport;
import com.eviware.soapui.impl.wsdl.endpoint.DefaultEndpointStrategy;
import com.eviware.soapui.impl.wsdl.mock.WsdlMockService;
import com.eviware.soapui.impl.wsdl.support.ExternalDependency;
import com.eviware.soapui.impl.wsdl.support.PathUtils;
import com.eviware.soapui.impl.wsdl.support.wsdl.UrlWsdlLoader;
import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlLoader;
import com.eviware.soapui.impl.wsdl.support.wss.DefaultWssContainer;
import com.eviware.soapui.impl.wsdl.testcase.WsdlProjectRunner;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestStep;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.environment.DefaultEnvironment;
import com.eviware.soapui.model.environment.Environment;
import com.eviware.soapui.model.environment.EnvironmentListener;
import com.eviware.soapui.model.environment.Property;
import com.eviware.soapui.model.iface.Interface;
import com.eviware.soapui.model.mock.MockService;
import com.eviware.soapui.model.project.EndpointStrategy;
import com.eviware.soapui.model.project.Project;
import com.eviware.soapui.model.project.ProjectListener;
import com.eviware.soapui.model.project.SaveStatus;
import com.eviware.soapui.model.propertyexpansion.DefaultPropertyExpansionContext;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansion;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContainer;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext;
import com.eviware.soapui.model.settings.Settings;
import com.eviware.soapui.model.support.ModelSupport;
import com.eviware.soapui.model.testsuite.ProjectRunContext;
import com.eviware.soapui.model.testsuite.ProjectRunListener;
import com.eviware.soapui.model.testsuite.ProjectRunner;
import com.eviware.soapui.model.testsuite.TestCase;
import com.eviware.soapui.model.testsuite.TestRunnable;
import com.eviware.soapui.model.testsuite.TestStep;
import com.eviware.soapui.model.testsuite.TestSuite;
import com.eviware.soapui.model.testsuite.TestSuite.TestSuiteRunType;
import com.eviware.soapui.settings.ProjectSettings;
import com.eviware.soapui.settings.UISettings;
import com.eviware.soapui.settings.WsdlSettings;
import com.eviware.soapui.support.SoapUIException;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.Tools;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.resolver.ResolveContext;
import com.eviware.soapui.support.resolver.ResolveDialog;
import com.eviware.soapui.support.scripting.SoapUIScriptEngine;
import com.eviware.soapui.support.scripting.SoapUIScriptEngineRegistry;
import com.eviware.soapui.support.types.StringToObjectMap;
import com.eviware.soapui.support.xml.XmlUtils;
import org.apache.commons.ssl.OpenSSL;
import org.apache.log4j.Logger;
import org.apache.xmlbeans.XmlError;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlOptions;
import javax.swing.ImageIcon;
import javax.xml.namespace.QName;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import static com.eviware.soapui.impl.wsdl.WsdlProject.ProjectEncryptionStatus.ENCRYPTED_BAD_OR_NO_PASSWORD;
import static com.eviware.soapui.impl.wsdl.WsdlProject.ProjectEncryptionStatus.ENCRYPTED_GOOD_PASSWORD;
import static com.eviware.soapui.impl.wsdl.WsdlProject.ProjectEncryptionStatus.NOT_ENCRYPTED;
/**
* WSDL project implementation
*
* @author Ole.Matzura
*/
public class WsdlProject extends AbstractTestPropertyHolderWsdlModelItem<ProjectConfig> implements Project,
PropertyExpansionContainer, PropertyChangeListener, TestRunnable {
public final static String AFTER_LOAD_SCRIPT_PROPERTY = WsdlProject.class.getName() + "@setupScript";
public final static String BEFORE_SAVE_SCRIPT_PROPERTY = WsdlProject.class.getName() + "@tearDownScript";
public final static String RESOURCE_ROOT_PROPERTY = WsdlProject.class.getName() + "@resourceRoot";
public static final String ICON_NAME = "/project.png";
protected final static Logger log = Logger.getLogger(WsdlProject.class);
private static final String XML_FILE_TYPE = "XML Files (*.xml)";
private static final String XML_EXTENSION = ".xml";
protected String path;
protected List<AbstractInterface<?>> interfaces = new ArrayList<AbstractInterface<?>>();
protected List<WsdlTestSuite> testSuites = new ArrayList<WsdlTestSuite>();
protected List<WsdlMockService> mockServices = new ArrayList<WsdlMockService>();
protected List<RestMockService> restMockServices = new ArrayList<RestMockService>();
protected Set<ProjectListener> projectListeners = new HashSet<ProjectListener>();
protected SoapuiProjectDocumentConfig projectDocument;
protected EndpointStrategy endpointStrategy = new DefaultEndpointStrategy();
protected long lastModified;
protected DefaultWssContainer wssContainer;
protected OAuth2ProfileContainer oAuth2ProfileContainer;
protected OAuth1ProfileContainer oAuth1ProfileContainer;
protected Set<EnvironmentListener> environmentListeners = new HashSet<EnvironmentListener>();
protected ProjectEncryptionStatus encryptionStatus = ProjectEncryptionStatus.NOT_ENCRYPTED;
protected EndpointSupport endpointSupport;
private WorkspaceImpl workspace;
private ImageIcon disabledIcon;
private ImageIcon closedIcon;
private ImageIcon remoteIcon;
private ImageIcon openEncyptedIcon;
private boolean remote;
private boolean open = true;
private boolean disabled;
private SoapUIScriptEngine afterLoadScriptEngine;
private SoapUIScriptEngine beforeSaveScriptEngine;
private PropertyExpansionContext context = new DefaultPropertyExpansionContext(this);
private String projectPassword = null;
private String hermesConfig;
private boolean wrongPasswordSupplied;
private ImageIcon closedEncyptedIcon;
private SoapUIScriptEngine afterRunScriptEngine;
private SoapUIScriptEngine beforeRunScriptEngine;
private Set<ProjectRunListener> runListeners = new HashSet<ProjectRunListener>();
private Environment environment;
public WsdlProject() throws XmlException, IOException, SoapUIException {
this((WorkspaceImpl) null);
}
public WsdlProject(String path) throws XmlException, IOException, SoapUIException {
this(path, (WorkspaceImpl) null);
}
public WsdlProject(String projectFile, String projectPassword) {
this(projectFile, null, true, null, projectPassword);
}
public WsdlProject(WorkspaceImpl workspace) {
this((String) null, workspace);
}
public WsdlProject(String path, WorkspaceImpl workspace) {
this(path, workspace, true, null, null);
}
public WsdlProject(String path, WorkspaceImpl workspace, boolean open, String tempName,
String projectPassword) {
super(null, workspace, ICON_NAME);
this.workspace = workspace;
this.path = path;
this.projectPassword = projectPassword;
endpointSupport = new EndpointSupport();
addProjectListeners();
try {
if (path != null && open) {
File file = new File(path.trim());
if (file.exists()) {
try {
loadProject(file.toURI().toURL());
lastModified = file.lastModified();
} catch (MalformedURLException e) {
SoapUI.logError(e);
disabled = true;
}
} else {
try {
if (!PathUtils.isHttpPath(path)) {
SoapUI.log.info("File [" + file.getAbsolutePath() + "] does not exist, trying URL instead");
}
remote = true;
loadProject(new URL(path));
} catch (MalformedURLException e) {
SoapUI.logError(e);
disabled = true;
}
}
}
} catch (SoapUIException e) {
SoapUI.logError(e);
disabled = true;
} finally {
initProjectIcons();
if (projectDocument == null) {
createEmptyProjectConfiguration(path, tempName);
}
if (getSettings() != null) {
setProjectRoot(path);
}
finalizeProjectLoading(open);
}
}
/*
This is used for loading a project without setting its path,
which will require the user to select where to save the file upon saving.
*/
public WsdlProject(InputStream inputStream, WorkspaceImpl workspace) {
super(null, workspace, ICON_NAME);
this.workspace = workspace;
this.open = true;
this.endpointSupport = new EndpointSupport();
this.projectPassword = null;
addProjectListeners();
loadProject(inputStream);
if (projectDocument == null) {
createEmptyProjectConfiguration(null, null);
}
lastModified = System.currentTimeMillis();
initProjectIcons();
finalizeProjectLoading(open);
}
private static void normalizeLineBreak(File target, File tmpFile) throws IOException {
FileReader fr = new FileReader(tmpFile);
BufferedReader in = new BufferedReader(fr);
FileWriter fw = new FileWriter(target);
BufferedWriter out = new BufferedWriter(fw);
String line;
while ((line = in.readLine()) != null) {
out.write(line);
out.newLine();
out.flush();
}
out.close();
fw.close();
in.close();
fr.close();
}
public boolean isRemote() {
return remote;
}
public EndpointSupport getEndpointSupport() {
return endpointSupport;
}
public void loadProject(URL file) throws SoapUIException {
try {
UISupport.setHourglassCursor();
UrlWsdlLoader loader = new UrlWsdlLoader(file.toString(), this);
loader.setUseWorker(false);
InputStream inputStream = loader.load();
loadProjectFromInputStream(inputStream);
log.info("Loaded project from [" + file.toString() + "]");
} catch (Exception e) {
if (e instanceof XmlException) {
XmlException xe = (XmlException) e;
XmlError error = xe.getError();
if (error != null) {
System.err.println("Error at line " + error.getLine() + ", column " + error.getColumn());
}
}
if (e instanceof RestConversionException) {
log.error("Project file needs to be updated manually, please reload the project.");
throw new SoapUIException("Failed to load project from file [" + file.toString() + "]", e);
}
e.printStackTrace();
throw new SoapUIException("Failed to load project from file [" + file.toString() + "]", e);
} finally {
UISupport.resetCursor();
}
}
public void loadProject(InputStream inputStream) {
UISupport.setHourglassCursor();
try {
loadProjectFromInputStream(inputStream);
} catch (XmlException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (GeneralSecurityException e) {
e.printStackTrace();
} finally {
UISupport.resetCursor();
}
}
public SoapuiProjectDocumentConfig loadProjectFromInputStream(InputStream inputStream) throws XmlException, IOException, GeneralSecurityException {
projectDocument = SoapuiProjectDocumentConfig.Factory.parse(inputStream);
inputStream.close();
// see if there is encoded data
this.encryptionStatus = checkForEncodedData(projectDocument.getSoapuiProject());
setConfig(projectDocument.getSoapuiProject());
// removed cached definitions if caching is disabled
if (!getSettings().getBoolean(WsdlSettings.CACHE_WSDLS)) {
removeDefinitionCaches(projectDocument);
}
try {
int majorVersion = Integer
.parseInt(projectDocument.getSoapuiProject().getSoapuiVersion().split("\\.")[0]);
if (majorVersion > Integer.parseInt(SoapUI.SOAPUI_VERSION.split("\\.")[0])) {
log.warn("Project '" + projectDocument.getSoapuiProject().getName() + "' is from a newer version ("
+ projectDocument.getSoapuiProject().getSoapuiVersion() + ") of SoapUI than this ("
+ SoapUI.SOAPUI_VERSION + ") and parts of it may be incompatible or incorrect. "
+ "Saving this project with this version of SoapUI may cause it to function differently.");
}
} catch (Exception e) {
}
if (!getConfig().isSetProperties()) {
getConfig().addNewProperties();
}
setPropertiesConfig(getConfig().getProperties());
List<InterfaceConfig> interfaceConfigs = getConfig().getInterfaceList();
for (InterfaceConfig config : interfaceConfigs) {
AbstractInterface<?> iface = InterfaceFactoryRegistry.build(this, config);
interfaces.add(iface);
}
List<TestSuiteConfig> testSuiteConfigs = getConfig().getTestSuiteList();
for (TestSuiteConfig config : testSuiteConfigs) {
testSuites.add(buildTestSuite(config));
}
List<MockServiceConfig> mockServiceConfigs = getConfig().getMockServiceList();
for (MockServiceConfig config : mockServiceConfigs) {
addWsdlMockService(new WsdlMockService(this, config));
}
List<RESTMockServiceConfig> restMockServiceConfigs = getConfig().getRestMockServiceList();
for (RESTMockServiceConfig config : restMockServiceConfigs) {
addRestMockService(new RestMockService(this, config));
}
if (!getConfig().isSetWssContainer()) {
getConfig().addNewWssContainer();
}
wssContainer = new DefaultWssContainer(this, getConfig().getWssContainer());
if (!getConfig().isSetOAuth2ProfileContainer()) {
getConfig().addNewOAuth2ProfileContainer();
}
oAuth2ProfileContainer = new DefaultOAuth2ProfileContainer(this, getConfig().getOAuth2ProfileContainer());
if (!getConfig().isSetOAuth1ProfileContainer()) {
getConfig().addNewOAuth1ProfileContainer();
}
oAuth1ProfileContainer = new OAuth1ProfileContainer(this, getConfig().getOAuth1ProfileContainer());
endpointStrategy.init(this);
setActiveEnvironment(DefaultEnvironment.getInstance());
if (!getConfig().isSetAbortOnError()) {
getConfig().setAbortOnError(false);
}
if (!getConfig().isSetRunType()) {
getConfig().setRunType(TestSuiteRunTypesConfig.SEQUENTIAL);
}
afterLoad();
return projectDocument;
}
public Environment getActiveEnvironment() {
return environment;
}
public void setActiveEnvironment(Environment environment) {
if (!environment.equals(this.environment)) {
this.environment = environment;
getConfig().setActiveEnvironment(environment.getName());
fireEnvironmentSwitched(environment);
}
}
public boolean isEnvironmentMode() {
return false;
}
protected WsdlTestSuite buildTestSuite(TestSuiteConfig config) {
return new WsdlTestSuite(this, config);
}
public boolean isWrongPasswordSupplied() {
return wrongPasswordSupplied;
}
/**
* Decode encrypted data and restore user/pass
*
* @param soapuiProject
* @return a ProjectEncryptionStatus enum
* @throws IOException
* @throws GeneralSecurityException
* @author robert nemet
*/
protected ProjectEncryptionStatus checkForEncodedData(ProjectConfig soapuiProject) throws IOException, GeneralSecurityException {
byte[] encryptedContent = soapuiProject.getEncryptedContent();
char[] password;
// no encrypted data then go back
if (encryptedContent == null || encryptedContent.length == 0) {
return NOT_ENCRYPTED;
}
String projectPassword;
if (workspace != null) {
projectPassword = workspace.getProjectPassword(soapuiProject.getName());
} else {
projectPassword = this.projectPassword;
}
if (projectPassword == null) {
password = UISupport.promptPassword("Enter Password:", soapuiProject.getName());
} else {
password = projectPassword.toCharArray();
}
byte[] data;
// no pass go back.
if (password == null) {
return ENCRYPTED_BAD_OR_NO_PASSWORD;
}
try {
String encryptionAlgorithm = soapuiProject.getEncryptedContentAlgorithm();
data = OpenSSL.decrypt(StringUtils.isNullOrEmpty(encryptionAlgorithm) ? "des3" : encryptionAlgorithm, password, encryptedContent);
} catch (Exception e) {
SoapUI.logError(e);
return ENCRYPTED_BAD_OR_NO_PASSWORD;
}
String decryptedData = new String(data, "UTF-8");
if (data != null) {
if (decryptedData.length() > 0) {
try {
projectDocument.getSoapuiProject().set(XmlUtils.createXmlObject(decryptedData));
wrongPasswordSupplied = false;
} catch (XmlException e) {
UISupport.showErrorMessage("Wrong password. Project needs to be reloaded.");
wrongPasswordSupplied = true;
getWorkspace().clearProjectPassword(soapuiProject.getName());
return ENCRYPTED_BAD_OR_NO_PASSWORD;
}
}
} else {
UISupport.showErrorMessage("Wrong project password");
wrongPasswordSupplied = true;
getWorkspace().clearProjectPassword(soapuiProject.getName());
return ENCRYPTED_BAD_OR_NO_PASSWORD;
}
projectDocument.getSoapuiProject().setEncryptedContent(null);
return ENCRYPTED_GOOD_PASSWORD;
}
@Override
public void afterLoad() {
super.afterLoad();
try {
ProjectListener[] a = projectListeners.toArray(new ProjectListener[projectListeners.size()]);
for (ProjectListener listener : a) {
listener.afterLoad(this);
}
runAfterLoadScript();
} catch (Exception e) {
SoapUI.logError(e);
}
}
protected void setProjectRoot(String path) {
if (path != null && projectDocument != null) {
int ix = path.lastIndexOf(File.separatorChar);
if (ix > 0) {
getSettings().setString(ProjectSettings.PROJECT_ROOT, path.substring(0, ix));
}
}
}
public String getResourceRoot() {
if (!getConfig().isSetResourceRoot()) {
getConfig().setResourceRoot("");
}
return getConfig().getResourceRoot();
}
public void setResourceRoot(String resourceRoot) {
String old = getResourceRoot();
getConfig().setResourceRoot(resourceRoot);
notifyPropertyChanged(RESOURCE_ROOT_PROPERTY, old, resourceRoot);
}
private void initProjectIcons() {
closedIcon = UISupport.createImageIcon("/closed_project.png");
remoteIcon = UISupport.createImageIcon("/remote_project.png");
disabledIcon = UISupport.createImageIcon("/disabled_project.png");
openEncyptedIcon = UISupport.createImageIcon("/encrypted_project.png");
closedEncyptedIcon = UISupport.createImageIcon("/disabled_encrypted_project.png");
}
private void createEmptyProjectConfiguration(String path, String tempName) {
projectDocument = SoapuiProjectDocumentConfig.Factory.newInstance();
setConfig(projectDocument.addNewSoapuiProject());
if (tempName != null || path != null) {
getConfig().setName(StringUtils.isNullOrEmpty(tempName) ? getNameFromPath() : tempName);
}
setPropertiesConfig(getConfig().addNewProperties());
wssContainer = new DefaultWssContainer(this, getConfig().addNewWssContainer());
oAuth2ProfileContainer = new DefaultOAuth2ProfileContainer(this, getConfig().addNewOAuth2ProfileContainer());
oAuth1ProfileContainer = new OAuth1ProfileContainer(this, getConfig().addNewOAuth1ProfileContainer());
}
private void finalizeProjectLoading(boolean open) {
if (getConfig() != null) {
endpointStrategy.init(this);
}
if (getConfig() != null && this.environment == null) {
setActiveEnvironment(DefaultEnvironment.getInstance());
}
this.open = open && !disabled && (this.encryptionStatus != ENCRYPTED_BAD_OR_NO_PASSWORD);
addPropertyChangeListener(this);
}
@Override
public ImageIcon getIcon() {
if (isDisabled()) {
return disabledIcon;
} else if (getEncryptionStatus() != NOT_ENCRYPTED) {
if (isOpen()) {
return openEncyptedIcon;
} else {
return closedEncyptedIcon;
}
} else if (!isOpen()) {
return closedIcon;
} else if (isRemote()) {
return remoteIcon;
} else {
return super.getIcon();
}
}
private String getNameFromPath() {
int ix = path.lastIndexOf(isRemote() ? '/' : File.separatorChar);
return ix == -1 ? path : path.substring(ix + 1);
}
private void addProjectListeners() {
for (ProjectListener listener : SoapUI.getListenerRegistry().getListeners(ProjectListener.class)) {
addProjectListener(listener);
}
for (ProjectRunListener listener : SoapUI.getListenerRegistry().getListeners(ProjectRunListener.class)) {
addProjectRunListener(listener);
}
}
@Override
public String getDescription() {
if (isOpen()) {
return super.getDescription();
}
String name = getName();
if (isDisabled()) {
name += " - disabled [" + getPath() + "]";
} else {
name += " - closed [" + getPath() + "]";
}
return name;
}
public WorkspaceImpl getWorkspace() {
return workspace;
}
public AbstractInterface<?> getInterfaceAt(int index) {
return interfaces.get(index);
}
public AbstractInterface<?> getInterfaceByName(String interfaceName) {
return (AbstractInterface<?>) getWsdlModelItemByName(interfaces, interfaceName);
}
public AbstractInterface<?> getInterfaceByTechnicalId(String technicalId) {
for (int c = 0; c < getInterfaceCount(); c++) {
if (getInterfaceAt(c).getTechnicalId().equals(technicalId)) {
return getInterfaceAt(c);
}
}
return null;
}
public int getInterfaceCount() {
return interfaces.size();
}
public String getPath() {
return path;
}
public SaveStatus save() throws IOException {
return save(null);
}
public SaveStatus save(String folder) throws IOException {
if (!isOpen() || isDisabled() || isRemote()) {
return SaveStatus.SUCCESS;
}
File projectFile = null;
if (!hasBeenSavedBefore()) {
String tempPath = createProjectFileName();
if (folder != null) {
tempPath = folder + File.separatorChar + tempPath;
}
while (projectFile == null
|| (projectFile.exists() && !UISupport.confirm("File [" + projectFile.getName() + "] exists, overwrite?",
"Overwrite File?"))) {
projectFile = UISupport.getFileDialogs().saveAs(this, "Save project " + getName(), XML_EXTENSION, XML_FILE_TYPE,
new File(tempPath));
if (projectFile == null) {
return SaveStatus.CANCELLED;
}
}
}
if (projectFile == null) {
projectFile = createFile(path);
}
while (projectFile.exists() && !projectFile.canWrite()) {
Boolean confirm = UISupport.confirmOrCancel("Project file [" + projectFile.getAbsolutePath() + "] can not be written to, save to new file?", "Save Project");
if (confirm == null) {
return SaveStatus.CANCELLED;
} else if (!confirm) {
return SaveStatus.DONT_SAVE;
} else {
projectFile = UISupport.getFileDialogs().saveAs(this, "Save project " + getName(), XML_EXTENSION,
XML_FILE_TYPE, projectFile);
if (projectFile == null) {
return SaveStatus.CANCELLED;
}
}
}
if (projectFileModified(projectFile)) {
if (!UISupport.confirm("Project file for [" + getName() + "] has been modified externally, overwrite?",
"Save Project")) {
return SaveStatus.DONT_SAVE;
}
}
if (shouldCreateBackup(projectFile)) {
createBackup(projectFile);
}
SaveStatus saveStatus = saveIn(projectFile);
if (saveStatus == SaveStatus.SUCCESS) {
path = projectFile.getAbsolutePath();
}
return saveStatus;
}
protected boolean shouldCreateBackup(File projectFile) {
return projectFile.exists() && getSettings().getBoolean(UISettings.CREATE_BACKUP);
}
protected String createProjectFileName() {
return StringUtils.createFileName2(getName(), '-') + "-soapui-project.xml";
}
File createFile(String filePath) {
return new File(filePath);
}
protected boolean projectFileModified(File projectFile) {
return projectFile.exists() && lastModified != 0 && lastModified < projectFile.lastModified();
}
private boolean hasBeenSavedBefore() {
return path != null;
}
public SaveStatus saveBackup() throws IOException {
File projectFile;
if (hasBeenSavedBefore() || isRemote()) {
projectFile = new File(StringUtils.createFileName2(getName(), '-') + "-soapui-project.xml");
} else {
projectFile = new File(path);
}
File backupFile = getBackupFile(projectFile);
return saveIn(backupFile);
}
public SaveStatus saveIn(File projectFile) throws IOException {
long size;
beforeSave();
// work with copy because we do not want to change working project while
// working with it
// if user choose save project, save all etc.
SoapuiProjectDocumentConfig projectDocument = (SoapuiProjectDocumentConfig) this.projectDocument.copy();
// check for caching
if (!getSettings().getBoolean(WsdlSettings.CACHE_WSDLS)) {
// no caching -> create copy and remove definition cachings
removeDefinitionCaches(projectDocument);
}
removeProjectRoot(projectDocument);
if (hasBeenSuccessfullyDecrypted(projectDocument) && hasEncryptionPassword()) {
ProjectConfig encryptedProjectConfig = encrypt(projectDocument);
projectDocument.setSoapuiProject(encryptedProjectConfig);
}
XmlOptions options = new XmlOptions();
if (SoapUI.getSettings().getBoolean(WsdlSettings.PRETTY_PRINT_PROJECT_FILES)) {
options.setSavePrettyPrint();
}
projectDocument.getSoapuiProject().setSoapuiVersion(SoapUI.SOAPUI_VERSION);
try {
File tempFile = File.createTempFile("project-temp-", XML_EXTENSION, projectFile.getParentFile());
// save once to make sure it can be saved
FileOutputStream tempOut = new FileOutputStream(tempFile);
projectDocument.save(tempOut, options);
tempOut.close();
if (getSettings().getBoolean(UISettings.LINEBREAK)) {
normalizeLineBreak(projectFile, tempFile);
} else {
// now save it for real
FileOutputStream projectOut = new FileOutputStream(projectFile);
projectDocument.save(projectOut, options);
projectOut.close();
}
// delete tempFile here so we have it as backup in case second save fails
if (!tempFile.delete()) {
SoapUI.getErrorLog().warn("Failed to delete temporary project file; " + tempFile.getAbsolutePath());
tempFile.deleteOnExit();
}
size = projectFile.length();
} catch (Throwable t) {
SoapUI.logError(t);
UISupport.showErrorMessage("Failed to save project [" + getName() + "]: " + t.toString());
return SaveStatus.FAILED;
}
lastModified = projectFile.lastModified();
log.info("Saved project [" + getName() + "] to [" + projectFile.getAbsolutePath() + " - " + size + " bytes");
setProjectRoot(getPath());
return SaveStatus.SUCCESS;
}
private boolean hasEncryptionPassword() {
String passwordForEncryption = getSettings().getString(ProjectSettings.SHADOW_PASSWORD, null);
return StringUtils.hasContent(passwordForEncryption);
}
private boolean hasBeenSuccessfullyDecrypted(SoapuiProjectDocumentConfig projectDocument) {
// if it has encryptedContend that means it is not decrypted correctly( bad
// password, etc ), so do not encrypt it again.
return projectDocument.getSoapuiProject().getEncryptedContent() == null;
}
private void removeProjectRoot(SoapuiProjectDocumentConfig projectDocument) {
XmlBeansSettingsImpl tempSettings = new XmlBeansSettingsImpl(this, null, projectDocument.getSoapuiProject()
.getSettings());
tempSettings.clearSetting(ProjectSettings.PROJECT_ROOT);
}
private ProjectConfig encrypt(SoapuiProjectDocumentConfig projectDocument) throws IOException {
// check for encryption
String passwordForEncryption = getSettings().getString(ProjectSettings.SHADOW_PASSWORD, null);
if (hasEncryptionPassword()) {
// we have password so do encryption
try {
String data = getConfig().xmlText();
String encryptionAlgorithm = "des3";
byte[] encrypted = OpenSSL.encrypt(encryptionAlgorithm, passwordForEncryption.toCharArray(), data.getBytes());
ProjectConfig newProjectConfig = ProjectConfig.Factory.newInstance();
ProjectConfig soapuiProject = projectDocument.getSoapuiProject();
newProjectConfig.setName(soapuiProject.getName());
newProjectConfig.setEncryptedContent(encrypted);
newProjectConfig.setEncryptedContentAlgorithm(encryptionAlgorithm);
return newProjectConfig;
} catch (GeneralSecurityException e) {
UISupport.showErrorMessage("Encryption Error");
}
}
return projectDocument.getSoapuiProject();
}
public void beforeSave() {
try {
ProjectListener[] listeners = projectListeners.toArray(new ProjectListener[projectListeners.size()]);
for (ProjectListener listener : listeners) {
listener.beforeSave(this);
}
runBeforeSaveScript();
} catch (Exception e) {
SoapUI.logError(e);
}
// notify
for (AbstractInterface<?> iface : interfaces) {
iface.beforeSave();
}
for (WsdlTestSuite testSuite : testSuites) {
testSuite.beforeSave();
}
for (WsdlMockService mockService : mockServices) {
mockService.beforeSave();
}
for (RestMockService mockService : restMockServices) {
mockService.beforeSave();
}
endpointStrategy.onSave();
}
protected void createBackup(File projectFile) throws IOException {
File backupFile = getBackupFile(projectFile);
log.info("Backing up [" + projectFile + "] to [" + backupFile + "]");
Tools.copyFile(projectFile, backupFile, true);
}
protected File getBackupFile(File projectFile) {
String backupFolderName = getSettings().getString(UISettings.BACKUP_FOLDER, "");
File backupFolder = new File(backupFolderName);
if (!backupFolder.isAbsolute()) {
backupFolder = new File(projectFile.getParentFile(), backupFolderName);
}
if (!backupFolder.exists()) {
backupFolder.mkdirs();
}
return new File(backupFolder, projectFile.getName() + ".backup");
}
protected void removeDefinitionCaches(SoapuiProjectDocumentConfig config) {
for (InterfaceConfig ifaceConfig : config.getSoapuiProject().getInterfaceList()) {
if (ifaceConfig.isSetDefinitionCache()) {
log.info("Removing definition cache from interface [" + ifaceConfig.getName() + "]");
ifaceConfig.unsetDefinitionCache();
}
}
}
public AbstractInterface<?> addNewInterface(String name, String type) {
AbstractInterface<?> iface = InterfaceFactoryRegistry.createNew(this, type, name);
if (iface != null) {
iface.getConfig().setType(type);
interfaces.add(iface);
fireInterfaceAdded(iface);
}
return iface;
}
public void addProjectListener(ProjectListener listener) {
projectListeners.add(listener);
}
public void removeProjectListener(ProjectListener listener) {
projectListeners.remove(listener);
}
public void fireInterfaceAdded(AbstractInterface<?> iface) {
ProjectListener[] listeners = projectListeners.toArray(new ProjectListener[projectListeners.size()]);
for (ProjectListener listener : listeners) {
listener.interfaceAdded(iface);
}
}
public void fireInterfaceRemoved(AbstractInterface<?> iface) {
ProjectListener[] listeners = projectListeners.toArray(new ProjectListener[projectListeners.size()]);
for (ProjectListener listener : listeners) {
listener.interfaceRemoved(iface);
}
}
public void fireInterfaceUpdated(AbstractInterface<?> iface) {
ProjectListener[] listeners = projectListeners.toArray(new ProjectListener[projectListeners.size()]);
for (ProjectListener listener : listeners) {
listener.interfaceUpdated(iface);
}
}
public void fireTestSuiteAdded(WsdlTestSuite testSuite) {
ProjectListener[] listeners = projectListeners.toArray(new ProjectListener[projectListeners.size()]);
for (ProjectListener listener : listeners) {
listener.testSuiteAdded(testSuite);
}
}
private void fireTestSuiteMoved(WsdlTestSuite testCase, int ix, int offset) {
ProjectListener[] listeners = projectListeners.toArray(new ProjectListener[projectListeners.size()]);
for (ProjectListener listener : listeners) {
listener.testSuiteMoved(testCase, ix, offset);
}
}
public void fireTestSuiteRemoved(WsdlTestSuite testSuite) {
ProjectListener[] listeners = projectListeners.toArray(new ProjectListener[projectListeners.size()]);
for (ProjectListener listener : listeners) {
listener.testSuiteRemoved(testSuite);
}
}
public void fireMockServiceAdded(MockService mockService) {
ProjectListener[] listeners = projectListeners.toArray(new ProjectListener[projectListeners.size()]);
for (ProjectListener listener : listeners) {
listener.mockServiceAdded(mockService);
}
}
public void fireMockServiceRemoved(MockService mockService) {
ProjectListener[] listeners = projectListeners.toArray(new ProjectListener[projectListeners.size()]);
for (ProjectListener listener : listeners) {
listener.mockServiceRemoved(mockService);
}
}
public void fireEnvironmentAdded(Environment env) {
ProjectListener[] listeners = projectListeners.toArray(new ProjectListener[projectListeners.size()]);
for (ProjectListener listener : listeners) {
listener.environmentAdded(env);
}
}
private void fireEnvironmentSwitched(Environment environment) {
ProjectListener[] listeners = projectListeners.toArray(new ProjectListener[projectListeners.size()]);
for (ProjectListener listener : listeners) {
listener.environmentSwitched(environment);
}
}
public void fireEnvironmentRemoved(Environment env, int index) {
ProjectListener[] listeners = projectListeners.toArray(new ProjectListener[projectListeners.size()]);
for (ProjectListener listener : listeners) {
listener.environmentRemoved(env, index);
}
}
public void fireEnvironmentRenamed(Environment env, String oldName, String newName) {
ProjectListener[] listeners = projectListeners.toArray(new ProjectListener[projectListeners.size()]);
for (ProjectListener listener : listeners) {
listener.environmentRenamed(env, oldName, newName);
}
}
public void removeInterface(AbstractInterface<?> iface) {
int ix = interfaces.indexOf(iface);
interfaces.remove(ix);
try {
fireInterfaceRemoved(iface);
} finally {
iface.release();
getConfig().removeInterface(ix);
}
}
public void removeTestSuite(WsdlTestSuite testSuite) {
int ix = testSuites.indexOf(testSuite);
testSuites.remove(ix);
try {
fireTestSuiteRemoved(testSuite);
} finally {
testSuite.release();
getConfig().removeTestSuite(ix);
}
}
public void firePropertyValueChanged(Property property) {
EnvironmentListener[] listeners = environmentListeners.toArray(new EnvironmentListener[environmentListeners.size()]);
for (EnvironmentListener listener : listeners) {
listener.propertyValueChanged(property);
}
}
public boolean isDisabled() {
return disabled;
}
public int getTestSuiteCount() {
return testSuites.size();
}
public WsdlTestSuite getTestSuiteAt(int index) {
return testSuites.get(index);
}
public WsdlTestSuite getTestSuiteByName(String testSuiteName) {
return (WsdlTestSuite) getWsdlModelItemByName(testSuites, testSuiteName);
}
@Override
public TestSuite getTestSuiteById(UUID testSuiteId) {
return null;
}
public WsdlTestSuite addNewTestSuite(String name) {
WsdlTestSuite testSuite = buildTestSuite(getConfig().addNewTestSuite());
testSuite.setName(name);
testSuites.add(testSuite);
fireTestSuiteAdded(testSuite);
return testSuite;
}
public boolean isCacheDefinitions() {
return getSettings().getBoolean(WsdlSettings.CACHE_WSDLS);
}
public void setCacheDefinitions(boolean cacheDefinitions) {
getSettings().setBoolean(WsdlSettings.CACHE_WSDLS, cacheDefinitions);
}
public SaveStatus saveAs(String fileName) throws IOException {
if (!isOpen() || isDisabled()) {
return SaveStatus.FAILED;
}
String oldPath = path;
path = fileName;
SaveStatus result = save(); // if remote is true this won't save the file
if (result == SaveStatus.SUCCESS) {
remote = false;
} else {
path = oldPath;
}
setProjectRoot(path);
return result;
}
@Override
public void release() {
super.release();
if (isOpen()) {
endpointStrategy.release();
for (WsdlTestSuite testSuite : testSuites) {
testSuite.release();
}
for (WsdlMockService mockService : mockServices) {
mockService.release();
}
for (RestMockService mockService : restMockServices) {
mockService.release();
}
for (AbstractInterface<?> iface : interfaces) {
iface.release();
}
if (wssContainer != null) {
wssContainer.release();
wssContainer = null;
}
if (oAuth2ProfileContainer != null) {
oAuth2ProfileContainer.release();
oAuth2ProfileContainer = null;
}
}
projectListeners.clear();
environmentListeners.clear();
if (afterLoadScriptEngine != null) {
afterLoadScriptEngine.release();
}
if (beforeSaveScriptEngine != null) {
beforeSaveScriptEngine.release();
}
}
public WsdlMockService addNewMockService(String name) {
WsdlMockService mockService = new WsdlMockService(this, getConfig().addNewMockService());
mockService.setName(name);
addWsdlMockService(mockService);
fireMockServiceAdded(mockService);
Analytics.trackAction(SoapUIActions.CREATE_SOAP_MOCK.getActionName());
return mockService;
}
public void addWsdlMockService(WsdlMockService mockService) {
mockServices.add(mockService);
}
public RestMockService addNewRestMockService(String name) {
RestMockService mockService = new RestMockService(this, getConfig().addNewRestMockService());
mockService.setName(name);
addRestMockService(mockService);
fireMockServiceAdded(mockService);
Analytics.trackAction(SoapUIActions.CREATE_REST_MOCK.getActionName());
return mockService;
}
public void addRestMockService(RestMockService mockService) {
if (!mockService.getParent().equals(this)) {
throw new IllegalStateException("In Illegal state");
}
restMockServices.add(mockService);
}
public WsdlMockService getMockServiceAt(int index) {
return mockServices.get(index);
}
public WsdlMockService getMockServiceByName(String mockServiceName) {
return (WsdlMockService) getWsdlModelItemByName(mockServices, mockServiceName);
}
public int getMockServiceCount() {
return mockServices.size();
}
public RestMockService getRestMockServiceAt(int index) {
return restMockServices.get(index);
}
public RestMockService getRestMockServiceByName(String mockServiceName) {
return (RestMockService) getWsdlModelItemByName(restMockServices, mockServiceName);
}
public int getRestMockServiceCount() {
return restMockServices.size();
}
public void removeMockService(MockService mockService) {
int ix = mockServices.indexOf(mockService);
boolean isRestMockService = ix == -1;
if (isRestMockService) {
ix = restMockServices.indexOf(mockService);
}
removeMockServiceFromList(ix, isRestMockService);
try {
fireMockServiceRemoved(mockService);
} finally {
mockService.release();
removeMockServiceFromConfig(ix, isRestMockService);
}
}
private void removeMockServiceFromList(int ix, boolean isRestMockService) {
if (isRestMockService) {
restMockServices.remove(ix);
} else {
mockServices.remove(ix);
}
}
private void removeMockServiceFromConfig(int ix, boolean isRestMockService) {
if (isRestMockService) {
getConfig().removeRestMockService(ix);
} else {
getConfig().removeMockService(ix);
}
}
public List<TestSuite> getTestSuiteList() {
return new ArrayList<TestSuite>(testSuites);
}
public List<WsdlMockService> getMockServiceList() {
return new ArrayList<WsdlMockService>(mockServices);
}
public List<RestMockService> getRestMockServiceList() {
return restMockServices;
}
public List<Interface> getInterfaceList() {
return new ArrayList<Interface>(interfaces);
}
public Map<String, Interface> getInterfaces() {
Map<String, Interface> result = new HashMap<String, Interface>();
for (Interface iface : interfaces) {
result.put(iface.getName(), iface);
}
return result;
}
public Map<String, TestSuite> getTestSuites() {
Map<String, TestSuite> result = new HashMap<String, TestSuite>();
for (TestSuite iface : testSuites) {
result.put(iface.getName(), iface);
}
return result;
}
public Map<String, MockService> getMockServices() {
Map<String, MockService> result = new HashMap<String, MockService>();
for (MockService mockService : mockServices) {
result.put(mockService.getName(), mockService);
}
return result;
}
public void reload() throws SoapUIException {
reload(path);
}
public void reload(String path) throws SoapUIException {
this.path = path;
getWorkspace().reloadProject(this);
}
public boolean hasNature(String natureId) {
Settings projectSettings = getSettings();
String projectNature = projectSettings.getString(ProjectSettings.PROJECT_NATURE, null);
return natureId.equals(projectNature);
}
public AbstractInterface<?> importInterface(AbstractInterface<?> iface, boolean importEndpoints, boolean createCopy) {
iface.beforeSave();
InterfaceConfig ifaceConfig = (InterfaceConfig) iface.getConfig().copy();
ifaceConfig = (InterfaceConfig) getConfig().addNewInterface().set(ifaceConfig);
AbstractInterface<?> imported = InterfaceFactoryRegistry.build(this, ifaceConfig);
interfaces.add(imported);
if (iface.getProject() != this && importEndpoints) {
endpointStrategy.importEndpoints(iface);
}
if (createCopy) {
ModelSupport.createNewIds(imported);
}
imported.afterLoad();
fireInterfaceAdded(imported);
return imported;
}
public WsdlTestSuite importTestSuite(WsdlTestSuite testSuite, String name, int index, boolean createCopy,
String description) {
testSuite.beforeSave();
TestSuiteConfig testSuiteConfig = index == -1 ? (TestSuiteConfig) getConfig().addNewTestSuite().set(
testSuite.getConfig().copy()) : (TestSuiteConfig) getConfig().insertNewTestSuite(index).set(
testSuite.getConfig().copy());
testSuiteConfig.setName(name);
if (createCopy) {
for (TestCaseConfig testCaseConfig : testSuiteConfig.getTestCaseList()) {
testCaseConfig.setSecurityTestArray(new SecurityTestConfig[0]);
}
}
WsdlTestSuite oldTestSuite = testSuite;
testSuite = buildTestSuite(testSuiteConfig);
if (description != null) {
testSuite.setDescription(description);
}
if (index == -1) {
testSuites.add(testSuite);
} else {
testSuites.add(index, testSuite);
}
if (createCopy) {
ModelSupport.createNewIds(testSuite);
}
testSuite.afterLoad();
if (createCopy) {
testSuite.afterCopy(oldTestSuite);
}
fireTestSuiteAdded(testSuite);
resolveImportedTestSuite(testSuite);
return testSuite;
}
public WsdlMockService importMockService(WsdlMockService mockService, String name, boolean createCopy,
String description) {
mockService.beforeSave();
MockServiceConfig mockServiceConfig = (MockServiceConfig) getConfig().addNewMockService().set(
mockService.getConfig().copy());
mockServiceConfig.setName(name);
if (mockServiceConfig.isSetId() && createCopy) {
mockServiceConfig.unsetId();
}
mockService = new WsdlMockService(this, mockServiceConfig);
mockService.setDescription(description);
addWsdlMockService(mockService);
if (createCopy) {
ModelSupport.createNewIds(mockService);
}
mockService.afterLoad();
fireMockServiceAdded(mockService);
return mockService;
}
public EndpointStrategy getEndpointStrategy() {
return endpointStrategy;
}
public boolean isOpen() {
return open;
}
public List<? extends ModelItem> getChildren() {
ArrayList<ModelItem> list = new ArrayList<ModelItem>();
list.addAll(getInterfaceList());
list.addAll(getTestSuiteList());
list.addAll(getMockServiceList());
list.addAll(getRestMockServiceList());
return list;
}
public String getAfterLoadScript() {
return getConfig().isSetAfterLoadScript() ? getConfig().getAfterLoadScript().getStringValue() : null;
}
public void setAfterLoadScript(String script) {
String oldScript = getAfterLoadScript();
if (!getConfig().isSetAfterLoadScript()) {
getConfig().addNewAfterLoadScript();
}
getConfig().getAfterLoadScript().setStringValue(script);
if (afterLoadScriptEngine != null) {
afterLoadScriptEngine.setScript(script);
}
notifyPropertyChanged(AFTER_LOAD_SCRIPT_PROPERTY, oldScript, script);
}
public String getBeforeSaveScript() {
return getConfig().isSetBeforeSaveScript() ? getConfig().getBeforeSaveScript().getStringValue() : null;
}
public void setBeforeSaveScript(String script) {
String oldScript = getBeforeSaveScript();
if (!getConfig().isSetBeforeSaveScript()) {
getConfig().addNewBeforeSaveScript();
}
getConfig().getBeforeSaveScript().setStringValue(script);
if (beforeSaveScriptEngine != null) {
beforeSaveScriptEngine.setScript(script);
}
notifyPropertyChanged(BEFORE_SAVE_SCRIPT_PROPERTY, oldScript, script);
}
public Object runAfterLoadScript() throws Exception {
String script = getAfterLoadScript();
if (StringUtils.isNullOrEmpty(script)) {
return null;
}
if (afterLoadScriptEngine == null) {
afterLoadScriptEngine = SoapUIScriptEngineRegistry.create(this);
afterLoadScriptEngine.setScript(script);
}
afterLoadScriptEngine.setVariable("context", context);
afterLoadScriptEngine.setVariable("project", this);
afterLoadScriptEngine.setVariable("log", SoapUI.ensureGroovyLog());
return afterLoadScriptEngine.run();
}
public Object runBeforeSaveScript() throws Exception {
String script = getBeforeSaveScript();
if (StringUtils.isNullOrEmpty(script)) {
return null;
}
if (beforeSaveScriptEngine == null) {
beforeSaveScriptEngine = SoapUIScriptEngineRegistry.create(this);
beforeSaveScriptEngine.setScript(script);
}
beforeSaveScriptEngine.setVariable("context", context);
beforeSaveScriptEngine.setVariable("project", this);
beforeSaveScriptEngine.setVariable("log", SoapUI.ensureGroovyLog());
return beforeSaveScriptEngine.run();
}
public PropertyExpansionContext getContext() {
return context;
}
public DefaultWssContainer getWssContainer() {
return wssContainer;
}
public OAuth2ProfileContainer getOAuth2ProfileContainer() {
return oAuth2ProfileContainer;
}
public OAuth1ProfileContainer getOAuth1ProfileContainer() {
return oAuth1ProfileContainer;
}
@Override
public void resolve(ResolveContext<?> context) {
super.resolve(context);
wssContainer.resolve(context);
}
public PropertyExpansion[] getPropertyExpansions() {
List<PropertyExpansion> result = new ArrayList<PropertyExpansion>();
result.addAll(Arrays.asList(wssContainer.getPropertyExpansions()));
result.addAll(Arrays.asList(oAuth2ProfileContainer.getPropertyExpansions()));
return result.toArray(new PropertyExpansion[result.size()]);
}
@Override
protected void addExternalDependencies(List<ExternalDependency> dependencies) {
super.addExternalDependencies(dependencies);
wssContainer.addExternalDependency(dependencies);
}
public String getShadowPassword() {
projectPassword = getSettings() == null ? projectPassword : getSettings().getString(
ProjectSettings.SHADOW_PASSWORD, null);
return projectPassword;
}
public void setShadowPassword(String password) {
String oldPassword = getSettings().getString(ProjectSettings.SHADOW_PASSWORD, null);
getSettings().setString(ProjectSettings.SHADOW_PASSWORD, password);
notifyPropertyChanged("projectPassword", oldPassword, password);
}
public String getHermesConfig() {
hermesConfig = getSettings() == null ? hermesConfig : resolveHermesConfig();
return hermesConfig;
}
public void setHermesConfig(String hermesConfigPath) {
String oldHermesConfigPath = getSettings().getString(ProjectSettings.HERMES_CONFIG, null);
getSettings().setString(ProjectSettings.HERMES_CONFIG, hermesConfigPath);
notifyPropertyChanged("hermesConfig", oldHermesConfigPath, hermesConfigPath);
}
private String resolveHermesConfig() {
String hermesConfigProperty = getSettings().getString(ProjectSettings.HERMES_CONFIG, null);
if (hermesConfigProperty != null && !hermesConfigProperty.equals("")) {
return hermesConfigProperty;
} else if (System.getenv("HERMES_CONFIG") != null) {
return System.getenv("HERMES_CONFIG");
} else {
return "${#System#user.home}\\.hermes";
}
}
public void inspect() {
if (!isOpen()) {
return;
}
byte data[] = projectDocument.getSoapuiProject().getEncryptedContent();
if (data != null && data.length > 0) {
try {
reload();
} catch (SoapUIException e) {
e.printStackTrace();
}
}
}
public ProjectEncryptionStatus getEncryptionStatus() {
return this.encryptionStatus;
}
public ProjectEncryptionStatus setEncryptionStatus(ProjectEncryptionStatus status) {
return this.encryptionStatus = status;
}
public void propertyChange(PropertyChangeEvent evt) {
if ("projectPassword".equals(evt.getPropertyName())) {
if (encryptionStatus == NOT_ENCRYPTED && (evt.getOldValue() == null || ((String) evt.getOldValue()).length() == 0)) {
encryptionStatus = ENCRYPTED_GOOD_PASSWORD;
}
if (encryptionStatus == ENCRYPTED_GOOD_PASSWORD && (evt.getNewValue() == null || ((String) evt.getNewValue()).length() == 0)) {
encryptionStatus = NOT_ENCRYPTED;
}
if (SoapUI.getNavigator() != null) {
SoapUI.getNavigator().repaint();
}
}
}
public SoapuiProjectDocumentConfig getProjectDocument() {
return projectDocument;
}
public int getInterfaceCount(String type) {
int result = 0;
for (AbstractInterface<?> iface : interfaces) {
if (iface.getType().equals(type)) {
result++;
}
}
return result;
}
public List<AbstractInterface<?>> getInterfaces(String type) {
ArrayList<AbstractInterface<?>> result = new ArrayList<AbstractInterface<?>>();
for (AbstractInterface<?> iface : interfaces) {
if (iface.getType().equals(type)) {
result.add(iface);
}
}
return result;
}
public void importTestSuite(File file) {
if (!file.exists()) {
UISupport.showErrorMessage("Error loading test case ");
return;
}
TestSuiteDocumentConfig newTestSuiteConfig = null;
WsdlTestSuite oldTestSuite = null;
try {
newTestSuiteConfig = TestSuiteDocumentConfig.Factory.parse(file);
oldTestSuite = buildTestSuite(TestSuiteDocumentConfig.Factory.parse(file).getTestSuite());
} catch (Exception e) {
SoapUI.logError(e);
}
if (newTestSuiteConfig == null) {
UISupport.showErrorMessage("Not valid test case xml");
} else {
TestSuiteConfig config = (TestSuiteConfig) projectDocument.getSoapuiProject().addNewTestSuite()
.set(newTestSuiteConfig.getTestSuite());
WsdlTestSuite testSuite = buildTestSuite(config);
ModelSupport.createNewIds(testSuite);
testSuite.afterLoad();
/*
* security test keeps reference to test step by id, which gets changed
* during importing, so old values needs to be rewritten to new ones.
*
* Create tarnsition table ( old id , new id ) and use it to replace
* all old ids in new imported test case.
*
* Here needs to be done for all test cases separatly.
*/
for (int cnt2 = 0; cnt2 < config.getTestCaseList().size(); cnt2++) {
TestCaseConfig newTestCase = config.getTestCaseList().get(cnt2);
TestCaseConfig importTestCaseConfig = newTestSuiteConfig.getTestSuite().getTestCaseList().get(cnt2);
LinkedHashMap<String, String> oldNewIds = new LinkedHashMap<String, String>();
for (int cnt = 0; cnt < importTestCaseConfig.getTestStepList().size(); cnt++) {
oldNewIds.put(importTestCaseConfig.getTestStepList().get(cnt).getId(), newTestCase.getTestStepList()
.get(cnt).getId());
}
for (SecurityTestConfig scan : newTestCase.getSecurityTestList()) {
for (TestStepSecurityTestConfig secStepConfig : scan.getTestStepSecurityTestList()) {
if (oldNewIds.containsKey(secStepConfig.getTestStepId())) {
secStepConfig.setTestStepId(oldNewIds.get(secStepConfig.getTestStepId()));
}
}
}
}
List<TestCase> testCaseList = testSuite.getTestCaseList();
for (int i = 0; i < testCaseList.size(); i++) {
TestCase testCase = testCaseList.get(i);
for (int j = 0; j < testCase.getTestStepList().size(); j++) {
TestStep testStep = testCase.getTestStepAt(j);
if (testStep instanceof WsdlTestStep) {
((WsdlTestStep) testStep).afterCopy(oldTestSuite, oldTestSuite.getTestCaseAt(i));
}
}
}
testSuites.add(testSuite);
fireTestSuiteAdded(testSuite);
resolveImportedTestSuite(testSuite);
}
}
private void resolveImportedTestSuite(WsdlTestSuite testSuite) {
ResolveDialog resolver = new ResolveDialog("Validate TestSuite", "Checks TestSuite for inconsistencies", null);
resolver.setShowOkMessage(false);
resolver.resolve(testSuite);
}
/**
* @deprecated replaced by {@link WsdlInterfaceFactory#importWsdl(WsdlProject, String, boolean)}
*/
public WsdlInterface[] importWsdl(String url, boolean createRequests) throws SoapUIException {
return WsdlInterfaceFactory.importWsdl(this, url, createRequests);
}
/**
* @deprecated replaced by {@link WsdlInterfaceFactory#importWsdl(WsdlProject, String, boolean, WsdlLoader)}
*/
public WsdlInterface[] importWsdl(String url, boolean createRequests, WsdlLoader wsdlLoader)
throws SoapUIException {
return WsdlInterfaceFactory.importWsdl(this, url, createRequests, null, wsdlLoader);
}
/**
* @deprecated replaced by {@link WsdlInterfaceFactory#importWsdl(WsdlProject, String, boolean, QName, WsdlLoader)}
*/
public WsdlInterface[] importWsdl(String url, boolean createRequests, QName bindingName, WsdlLoader wsdlLoader)
throws SoapUIException {
return WsdlInterfaceFactory.importWsdl(this, url, createRequests, bindingName, wsdlLoader);
}
public String getDefaultScriptLanguage() {
if (getConfig().isSetDefaultScriptLanguage()) {
return getConfig().getDefaultScriptLanguage();
} else {
return SoapUIScriptEngineRegistry.DEFAULT_SCRIPT_ENGINE_ID;
}
}
public void setDefaultScriptLanguage(String id) {
getConfig().setDefaultScriptLanguage(id);
}
public int getIndexOfTestSuite(TestSuite testSuite) {
return testSuites.indexOf(testSuite);
}
public String getBeforeRunScript() {
return getConfig().isSetBeforeRunScript() ? getConfig().getBeforeRunScript().getStringValue() : null;
}
public void setBeforeRunScript(String script) {
String oldScript = getBeforeRunScript();
if (!getConfig().isSetBeforeRunScript()) {
getConfig().addNewBeforeRunScript();
}
getConfig().getBeforeRunScript().setStringValue(script);
if (beforeRunScriptEngine != null) {
beforeRunScriptEngine.setScript(script);
}
notifyPropertyChanged("beforeRunScript", oldScript, script);
}
public Object runBeforeRunScript(ProjectRunContext context, ProjectRunner runner) throws Exception {
String script = getBeforeRunScript();
if (StringUtils.isNullOrEmpty(script)) {
return null;
}
if (beforeRunScriptEngine == null) {
beforeRunScriptEngine = SoapUIScriptEngineRegistry.create(this);
beforeRunScriptEngine.setScript(script);
}
beforeRunScriptEngine.setVariable("runner", runner);
beforeRunScriptEngine.setVariable("context", context);
beforeRunScriptEngine.setVariable("project", this);
beforeRunScriptEngine.setVariable("log", SoapUI.ensureGroovyLog());
return beforeRunScriptEngine.run();
}
public String getAfterRunScript() {
return getConfig().isSetAfterRunScript() ? getConfig().getAfterRunScript().getStringValue() : null;
}
public void setAfterRunScript(String script) {
String oldScript = getAfterRunScript();
if (!getConfig().isSetAfterRunScript()) {
getConfig().addNewAfterRunScript();
}
getConfig().getAfterRunScript().setStringValue(script);
if (afterRunScriptEngine != null) {
afterRunScriptEngine.setScript(script);
}
notifyPropertyChanged("afterRunScript", oldScript, script);
}
public Object runAfterRunScript(ProjectRunContext context, ProjectRunner runner) throws Exception {
String script = getAfterRunScript();
if (StringUtils.isNullOrEmpty(script)) {
return null;
}
if (afterRunScriptEngine == null) {
afterRunScriptEngine = SoapUIScriptEngineRegistry.create(this);
afterRunScriptEngine.setScript(script);
}
afterRunScriptEngine.setVariable("runner", runner);
afterRunScriptEngine.setVariable("context", context);
afterRunScriptEngine.setVariable("project", this);
afterRunScriptEngine.setVariable("log", SoapUI.ensureGroovyLog());
return afterRunScriptEngine.run();
}
public void addProjectRunListener(ProjectRunListener projectRunListener) {
runListeners.add(projectRunListener);
}
public void removeProjectRunListener(ProjectRunListener projectRunListener) {
runListeners.remove(projectRunListener);
}
public WsdlProjectRunner run(StringToObjectMap context, boolean async) {
WsdlProjectRunner runner = new WsdlProjectRunner(this, context);
runner.start(async);
return runner;
}
public boolean isAbortOnError() {
return getConfig().getAbortOnError();
}
public void setAbortOnError(boolean arg0) {
getConfig().setAbortOnError(arg0);
}
public long getTimeout() {
return getConfig().getTimeout();
}
public void setTimeout(long timeout) {
getConfig().setTimeout(timeout);
}
public ProjectRunListener[] getProjectRunListeners() {
return runListeners.toArray(new ProjectRunListener[runListeners.size()]);
}
public TestSuiteRunType getRunType() {
Enum runType = getConfig().getRunType();
if (TestSuiteRunTypesConfig.PARALLELL.equals(runType)) {
return TestSuiteRunType.PARALLEL;
} else {
return TestSuiteRunType.SEQUENTIAL;
}
}
public void setRunType(TestSuiteRunType runType) {
TestSuiteRunType oldRunType = getRunType();
if (runType == TestSuiteRunType.PARALLEL && oldRunType != TestSuiteRunType.PARALLEL) {
getConfig().setRunType(TestSuiteRunTypesConfig.PARALLELL);
notifyPropertyChanged("runType", oldRunType, runType);
} else if (runType == TestSuiteRunType.SEQUENTIAL && oldRunType != TestSuiteRunType.SEQUENTIAL) {
getConfig().setRunType(TestSuiteRunTypesConfig.SEQUENTIAL);
notifyPropertyChanged("runType", oldRunType, runType);
}
}
public WsdlTestSuite moveTestSuite(int ix, int offset) {
WsdlTestSuite testSuite = testSuites.get(ix);
if (offset == 0) {
return testSuite;
}
testSuites.remove(ix);
testSuites.add(ix + offset, testSuite);
TestSuiteConfig[] configs = new TestSuiteConfig[testSuites.size()];
for (int c = 0; c < testSuites.size(); c++) {
if (offset > 0) {
if (c < ix) {
configs[c] = (TestSuiteConfig) getConfig().getTestSuiteArray(c).copy();
} else if (c < (ix + offset)) {
configs[c] = (TestSuiteConfig) getConfig().getTestSuiteArray(c + 1).copy();
} else if (c == ix + offset) {
configs[c] = (TestSuiteConfig) getConfig().getTestSuiteArray(ix).copy();
} else {
configs[c] = (TestSuiteConfig) getConfig().getTestSuiteArray(c).copy();
}
} else {
if (c < ix + offset) {
configs[c] = (TestSuiteConfig) getConfig().getTestSuiteArray(c).copy();
} else if (c == ix + offset) {
configs[c] = (TestSuiteConfig) getConfig().getTestSuiteArray(ix).copy();
} else if (c <= ix) {
configs[c] = (TestSuiteConfig) getConfig().getTestSuiteArray(c - 1).copy();
} else {
configs[c] = (TestSuiteConfig) getConfig().getTestSuiteArray(c).copy();
}
}
}
getConfig().setTestSuiteArray(configs);
for (int c = 0; c < configs.length; c++) {
testSuites.get(c).resetConfigOnMove(getConfig().getTestSuiteArray(c));
}
fireTestSuiteMoved(testSuite, ix, offset);
return testSuite;
}
public void importMockService(File file) {
if (!file.exists()) {
UISupport.showErrorMessage("Error loading test case ");
return;
}
MockServiceDocumentConfig newMockServiceConfig = null;
try {
newMockServiceConfig = MockServiceDocumentConfig.Factory.parse(file);
} catch (Exception e) {
SoapUI.logError(e);
}
if (newMockServiceConfig == null) {
UISupport.showErrorMessage("Not valid mock service xml");
} else {
MockServiceConfig config = (MockServiceConfig) projectDocument.getSoapuiProject().addNewMockService()
.set(newMockServiceConfig.getMockService());
WsdlMockService mockService = new WsdlMockService(this, config);
ModelSupport.createNewIds(mockService);
mockService.afterLoad();
addWsdlMockService(mockService);
fireMockServiceAdded(mockService);
resolveImportedMockService(mockService);
}
}
private void resolveImportedMockService(WsdlMockService mockService) {
ResolveDialog resolver = new ResolveDialog("Validate MockService", "Checks MockService for inconsistencies",
null);
resolver.setShowOkMessage(false);
resolver.resolve(mockService);
}
public void addEnvironmentListener(EnvironmentListener listener) {
environmentListeners.add(listener);
}
public void removeEnvironmentListener(EnvironmentListener listener) {
environmentListeners.remove(listener);
}
public enum ProjectEncryptionStatus {
NOT_ENCRYPTED, ENCRYPTED_BAD_OR_NO_PASSWORD, ENCRYPTED_GOOD_PASSWORD;
}
}