/*
* Copyright 2004-2014 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.model.propertyexpansion;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.support.AbstractHttpRequest;
import com.eviware.soapui.impl.support.AbstractHttpRequestInterface;
import com.eviware.soapui.impl.wsdl.MutableTestPropertyHolder;
import com.eviware.soapui.impl.wsdl.WsdlInterface;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.impl.wsdl.WsdlTestSuite;
import com.eviware.soapui.impl.wsdl.mock.WsdlMockOperation;
import com.eviware.soapui.impl.wsdl.mock.WsdlMockResponse;
import com.eviware.soapui.impl.wsdl.mock.WsdlMockService;
import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestStep;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.TestPropertyHolder;
import com.eviware.soapui.model.mock.MockOperation;
import com.eviware.soapui.model.mock.MockResponse;
import com.eviware.soapui.model.mock.MockService;
import com.eviware.soapui.model.project.Project;
import com.eviware.soapui.model.support.SettingsTestPropertyHolder;
import com.eviware.soapui.model.testsuite.RenameableTestProperty;
import com.eviware.soapui.model.testsuite.TestCase;
import com.eviware.soapui.model.testsuite.TestProperty;
import com.eviware.soapui.model.testsuite.TestStep;
import com.eviware.soapui.model.testsuite.TestSuite;
import com.eviware.soapui.security.SecurityTest;
import com.eviware.soapui.settings.GlobalPropertySettings;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.types.StringToObjectMap;
public class PropertyExpansionUtils {
public final static Logger log = Logger.getLogger(PropertyExpansionUtils.class);
private static SettingsTestPropertyHolder globalTestPropertyHolder;
public static String getGlobalProperty(String propertyName) {
if (globalTestPropertyHolder == null) {
initGlobalProperties();
}
return globalTestPropertyHolder.getPropertyValue(propertyName);
}
private synchronized static void initGlobalProperties() {
globalTestPropertyHolder = new SettingsTestPropertyHolder(SoapUI.getSettings(), null,
GlobalPropertySettings.PROPERTIES);
String propFile = System.getProperty("soapui.properties");
if (StringUtils.hasContent(propFile)) {
globalTestPropertyHolder.addPropertiesFromFile(propFile);
}
}
public static void saveGlobalProperties() {
if (globalTestPropertyHolder != null) {
globalTestPropertyHolder.saveTo(SoapUI.getSettings());
}
}
public static String shortenXPathForPropertyExpansion(String xpath, String value) {
if (xpath.length() > 0) {
StringBuffer buf = new StringBuffer();
for (int c = 0; c < xpath.length(); c++) {
char ch = xpath.charAt(c);
switch (ch) {
case '\n':
buf.append(' ');
break;
default:
buf.append(ch);
}
}
xpath = buf.toString();
}
return xpath;
}
/**
* @deprecated Use {@link PropertyExpander#expandProperties(String)} instead
*/
public static String expandProperties(String content) {
return PropertyExpander.expandProperties(content);
}
/**
* @deprecated Use
* {@link PropertyExpander#expandProperties(PropertyExpansionContext, String)}
* instead
*/
public static String expandProperties(PropertyExpansionContext context, String content) {
return PropertyExpander.expandProperties(context, content);
}
/**
* @deprecated Use
* {@link PropertyExpander#expandProperties(PropertyExpansionContext, String, boolean)}
* instead
*/
public static String expandProperties(PropertyExpansionContext context, String content, boolean entitize) {
return PropertyExpander.expandProperties(context, content, entitize);
}
/**
* Checks if a property can be transferred to another specified property via
* a property-transfer
*/
public static boolean canTransferToProperty(TestProperty source, TestProperty target) {
return false;
}
/**
* Checks if a modelItem can acces a specified property via
* property-expansion
*/
public static boolean canExpandProperty(ModelItem contextModelItem, TestProperty property) {
ModelItem propertyModelItem = property.getModelItem();
// global / anonymous reference?
if (propertyModelItem == null || propertyModelItem instanceof Project) {
return true;
}
if (contextModelItem instanceof TestSuite) {
return propertyModelItem == contextModelItem;
}
if (contextModelItem instanceof TestCase) {
return propertyModelItem == contextModelItem
|| (propertyModelItem instanceof TestSuite && ((TestCase) contextModelItem).getTestSuite() == propertyModelItem);
}
if (contextModelItem instanceof TestStep) {
TestStep testStep = ((TestStep) contextModelItem);
return propertyModelItem == contextModelItem
|| (propertyModelItem instanceof TestSuite && testStep.getTestCase().getTestSuite() == propertyModelItem)
|| (propertyModelItem instanceof TestCase && testStep.getTestCase() == propertyModelItem)
|| (propertyModelItem instanceof TestStep && testStep.getTestCase() == ((TestStep) propertyModelItem)
.getTestCase());
}
if (contextModelItem instanceof MockService) {
return propertyModelItem == contextModelItem;
}
if (contextModelItem instanceof MockOperation) {
return propertyModelItem == contextModelItem
|| (propertyModelItem instanceof MockService && ((MockOperation) contextModelItem).getMockService() == propertyModelItem);
}
if (contextModelItem instanceof MockResponse) {
MockResponse testStep = ((MockResponse) contextModelItem);
return propertyModelItem == contextModelItem
|| (propertyModelItem instanceof MockService && testStep.getMockOperation().getMockService() == propertyModelItem)
|| (propertyModelItem instanceof MockOperation && testStep.getMockOperation() == propertyModelItem)
|| (propertyModelItem instanceof MockResponse && testStep.getMockOperation() == ((MockResponse) propertyModelItem)
.getMockOperation());
}
if (contextModelItem instanceof SecurityTest) {
SecurityTest securityTest = ((SecurityTest) contextModelItem);
return propertyModelItem == contextModelItem
|| (propertyModelItem instanceof TestSuite && securityTest.getTestCase().getTestSuite() == propertyModelItem)
|| (propertyModelItem instanceof TestCase && securityTest.getTestCase() == propertyModelItem)
|| (propertyModelItem instanceof SecurityTest && securityTest.getTestCase() == ((SecurityTest) propertyModelItem)
.getTestCase());
}
System.out
.println("property " + property.getName() + " can not be transferred to " + contextModelItem.getName());
return false;
}
public static MutableTestPropertyHolder getGlobalProperties() {
if (globalTestPropertyHolder == null) {
initGlobalProperties();
}
return globalTestPropertyHolder;
}
public static MutablePropertyExpansion[] renameProperty(RenameableTestProperty property, String newName,
ModelItem root) {
UISupport.setHourglassCursor();
try {
List<MutablePropertyExpansion> result = new ArrayList<MutablePropertyExpansion>();
List<MutablePropertyExpansion> properties = new ArrayList<MutablePropertyExpansion>();
PropertyExpansion[] propertyExpansions = getPropertyExpansions(root, true, true);
for (PropertyExpansion pe : propertyExpansions) {
MutablePropertyExpansion mpe = (MutablePropertyExpansion) pe;
if (mpe.getProperty().equals(property)) {
mpe.setProperty(property);
properties.add(mpe);
}
}
property.setName(newName);
for (MutablePropertyExpansion mpe : properties) {
try {
mpe.update();
result.add(mpe);
} catch (Exception e) {
e.printStackTrace();
}
}
return result.toArray(new MutablePropertyExpansion[result.size()]);
} finally {
UISupport.resetCursor();
}
}
public static PropertyExpansion[] getPropertyExpansions(ModelItem modelItem, boolean mutableOnly, boolean deep) {
List<PropertyExpansion> result = new ArrayList<PropertyExpansion>();
if (modelItem instanceof PropertyExpansionContainer) {
PropertyExpansion[] pes = ((PropertyExpansionContainer) modelItem).getPropertyExpansions();
if (pes != null && pes.length > 0) {
for (PropertyExpansion pe : pes) {
if (mutableOnly && !(pe instanceof MutablePropertyExpansion)) {
continue;
}
result.add(pe);
}
}
}
if (deep) {
List<? extends ModelItem> children = modelItem.getChildren();
if (children != null && children.size() > 0) {
for (ModelItem child : children) {
result.addAll(Arrays.asList(getPropertyExpansions(child, mutableOnly, deep)));
}
}
}
return result.toArray(new PropertyExpansion[result.size()]);
}
public static Collection<? extends PropertyExpansion> extractPropertyExpansions(ModelItem modelItem, Object target,
String propertyName) {
List<PropertyExpansion> result = new ArrayList<PropertyExpansion>();
Set<String> expansions = new HashSet<String>();
try {
Object property = PropertyUtils.getProperty(target, propertyName);
if (property instanceof String && PropertyUtils.isWriteable(target, propertyName)) {
String str = property.toString();
if (!StringUtils.isNullOrEmpty(str)) {
int ix = str.indexOf("${");
while (ix != -1) {
// TODO handle nested property-expansions..
int ix2 = str.indexOf('}', ix + 2);
if (ix2 == -1) {
break;
}
String expansion = str.substring(ix + 2, ix2);
if (!expansions.contains(expansion)) {
MutablePropertyExpansion tp = createMutablePropertyExpansion(expansion, modelItem, target,
propertyName);
if (tp != null) {
result.add(tp);
expansions.add(expansion);
}
}
str = str.substring(ix2);
ix = str.indexOf("${");
}
}
}
} catch (Exception e) {
SoapUI.logError(e);
}
return result;
}
public static MutablePropertyExpansionImpl createMutablePropertyExpansion(String pe, ModelItem modelItem,
Object target, String propertyName) {
WsdlTestStep testStep = null;
WsdlTestCase testCase = null;
WsdlTestSuite testSuite = null;
WsdlProject project = null;
WsdlMockService mockService = null;
WsdlMockResponse mockResponse = null;
TestPropertyHolder holder = null;
SecurityTest securityTest = null;
if (modelItem instanceof WsdlTestStep) {
testStep = (WsdlTestStep) modelItem;
testCase = testStep.getTestCase();
testSuite = testCase.getTestSuite();
project = testSuite.getProject();
} else if (modelItem instanceof WsdlTestCase) {
testCase = (WsdlTestCase) modelItem;
testSuite = testCase.getTestSuite();
project = testSuite.getProject();
} else if (modelItem instanceof WsdlTestSuite) {
testSuite = (WsdlTestSuite) modelItem;
project = testSuite.getProject();
} else if (modelItem instanceof WsdlInterface) {
project = ((WsdlInterface) modelItem).getProject();
} else if (modelItem instanceof WsdlProject) {
project = (WsdlProject) modelItem;
} else if (modelItem instanceof WsdlMockService) {
mockService = (WsdlMockService) modelItem;
project = mockService.getProject();
} else if (modelItem instanceof AbstractHttpRequestInterface<?>) {
project = ((AbstractHttpRequest<?>) modelItem).getOperation().getInterface().getProject();
} else if (modelItem instanceof WsdlMockOperation) {
mockService = ((WsdlMockOperation) modelItem).getMockService();
project = mockService.getProject();
} else if (modelItem instanceof WsdlMockResponse) {
mockResponse = (WsdlMockResponse) modelItem;
mockService = mockResponse.getMockOperation().getMockService();
project = mockService.getProject();
} else if (modelItem instanceof SecurityTest) {
securityTest = (SecurityTest) modelItem;
testCase = securityTest.getTestCase();
testSuite = testCase.getTestSuite();
project = testSuite.getProject();
}
// explicit item reference?
if (pe.startsWith(PropertyExpansion.PROJECT_REFERENCE)) {
holder = project;
pe = pe.substring(PropertyExpansion.PROJECT_REFERENCE.length());
} else if (pe.startsWith(PropertyExpansion.TESTSUITE_REFERENCE)) {
holder = testSuite;
pe = pe.substring(PropertyExpansion.TESTSUITE_REFERENCE.length());
} else if (pe.startsWith(PropertyExpansion.TESTCASE_REFERENCE)) {
holder = testCase;
pe = pe.substring(PropertyExpansion.TESTCASE_REFERENCE.length());
} else if (pe.startsWith(PropertyExpansion.SECURITYTEST_REFERENCE)) {
holder = testCase;
pe = pe.substring(PropertyExpansion.SECURITYTEST_REFERENCE.length());
} else if (pe.startsWith(PropertyExpansion.MOCKSERVICE_REFERENCE)) {
holder = mockService;
pe = pe.substring(PropertyExpansion.MOCKSERVICE_REFERENCE.length());
} else if (pe.startsWith(PropertyExpansion.MOCKRESPONSE_REFERENCE)) {
holder = mockResponse;
pe = pe.substring(PropertyExpansion.MOCKRESPONSE_REFERENCE.length());
} else if (testCase != null) {
int sepIx = pe.indexOf(PropertyExpansion.PROPERTY_SEPARATOR);
if (sepIx > 0) {
holder = testCase.getTestStepByName(pe.substring(0, sepIx));
if (holder != null) {
pe = pe.substring(sepIx + 1);
}
}
}
int sepIx = pe.indexOf(PropertyExpansion.XPATH_SEPARATOR);
String xpath = null;
if (sepIx > 0) {
xpath = pe.substring(sepIx + 1);
pe = pe.substring(0, sepIx);
}
if (holder == null) {
holder = getGlobalProperties();
}
TestProperty tp = holder.getProperty(pe);
return tp == null ? null : new MutablePropertyExpansionImpl(tp, xpath, target, propertyName);
}
/**
* @deprecated Use
* {@link PropertyExpander#expandProperties(ModelItem, String)}
* instead
*/
public static String expandProperties(ModelItem contextModelItem, String content) {
return PropertyExpander.expandProperties(contextModelItem, content);
}
public static class GlobalPropertyExpansionContext implements PropertyExpansionContext {
public Object getProperty(String name) {
return getGlobalProperties().getProperty(name);
}
public void setProperty(String name, Object value) {
getGlobalProperties().setPropertyValue(name, String.valueOf(value));
}
public boolean hasProperty(String name) {
return getGlobalProperties().hasProperty(name);
}
public Object removeProperty(String name) {
return getGlobalProperties().removeProperty(name);
}
public String[] getPropertyNames() {
return getGlobalProperties().getPropertyNames();
}
public ModelItem getModelItem() {
return null;
}
public String expand(String content) {
return PropertyExpander.expandProperties(this, content);
}
public StringToObjectMap getProperties() {
StringToObjectMap result = new StringToObjectMap();
Map<String, TestProperty> props = getGlobalProperties().getProperties();
for (Map.Entry<String, TestProperty> entry : props.entrySet()) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
}
public static boolean containsPropertyExpansion(String str) {
return str != null && str.indexOf("${") >= 0 && str.indexOf('}') > 2;
}
}