/*
* 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.model.propertyexpansion.resolvers;
import com.eviware.soapui.impl.rest.OAuth2Profile;
import com.eviware.soapui.impl.rest.RestResource;
import com.eviware.soapui.impl.support.AbstractHttpRequest;
import com.eviware.soapui.impl.support.AbstractHttpRequestInterface;
import com.eviware.soapui.impl.support.AbstractMockResponse;
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.loadtest.WsdlLoadTest;
import com.eviware.soapui.impl.wsdl.mock.WsdlMockOperation;
import com.eviware.soapui.impl.wsdl.mock.WsdlMockService;
import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
import com.eviware.soapui.impl.wsdl.teststeps.TestRequest;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestMockService;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestStep;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.mock.MockService;
import com.eviware.soapui.model.project.Project;
import com.eviware.soapui.model.propertyexpansion.PropertyExpander;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansion;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext;
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;
public class ModelItemPropertyResolver implements PropertyResolver {
public String resolveProperty(PropertyExpansionContext context, String pe, boolean globalOverride) {
if (pe.charAt(0) == PropertyExpansion.SCOPE_PREFIX) {
return getScopedProperty(context, pe, globalOverride);
}
ModelItem modelItem = context.getModelItem();
if (modelItem instanceof WsdlLoadTest) {
modelItem = ((WsdlLoadTest) modelItem).getTestCase();
} else if (modelItem instanceof TestRequest) {
modelItem = ((TestRequest) modelItem).getTestStep();
} else if (modelItem instanceof AbstractMockResponse
&& ((AbstractMockResponse) modelItem).getMockOperation().getMockService() instanceof WsdlTestMockService) {
modelItem = ((WsdlTestMockService) ((AbstractMockResponse) modelItem).getMockOperation().getMockService())
.getMockResponseStep();
}
if (modelItem instanceof SecurityTest) {
modelItem = ((SecurityTest) modelItem).getTestCase();
}
if (modelItem instanceof WsdlTestStep || modelItem instanceof WsdlTestCase) {
WsdlTestStep testStep = (WsdlTestStep) (modelItem instanceof WsdlTestStep ? modelItem : null);
WsdlTestCase testCase = (WsdlTestCase) (testStep == null ? modelItem : testStep.getTestCase());
int sepIx = pe.indexOf(PropertyExpansion.PROPERTY_SEPARATOR);
Object property = null;
if (sepIx > 0) {
String step = pe.substring(0, sepIx);
String name = pe.substring(sepIx + 1);
String xpath = null;
sepIx = name.indexOf(PropertyExpansion.PROPERTY_SEPARATOR);
WsdlTestStep ts = testCase.getTestStepByName(step);
if (sepIx != -1) {
xpath = name.substring(sepIx + 1);
name = name.substring(0, sepIx);
}
if (step != null) {
if (ts != null) {
TestProperty p = ts.getProperty(name);
if (p != null) {
property = p.getValue();
}
}
} else {
property = context.getProperty(name);
}
if (property != null && xpath != null) {
property = ResolverUtils.extractXPathPropertyValue(property,
PropertyExpander.expandProperties(context, xpath));
}
}
if (property != null) {
return property.toString();
}
}
return null;
}
private String getScopedProperty(PropertyExpansionContext context, String pe, boolean globalOverride) {
ModelItem modelItem = context.getModelItem();
TestStep testStep = null;
TestCase testCase = null;
TestSuite testSuite = null;
Project project = null;
MockService mockService = null;
AbstractMockResponse mockResponse = 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 WsdlLoadTest) {
testCase = ((WsdlLoadTest) modelItem).getTestCase();
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 TestRequest) {
testStep = ((TestRequest) modelItem).getTestStep();
testCase = testStep.getTestCase();
testSuite = testCase.getTestSuite();
project = testSuite.getProject();
} else if (modelItem instanceof AbstractHttpRequestInterface<?>) {
project = ((AbstractHttpRequest<?>) modelItem).getOperation().getInterface().getProject();
} else if (modelItem instanceof RestResource) {
project = modelItem.getProject();
} else if (modelItem instanceof WsdlMockOperation) {
mockService = ((WsdlMockOperation) modelItem).getMockService();
project = mockService.getProject();
} else if (modelItem instanceof AbstractMockResponse) {
mockResponse = (AbstractMockResponse) modelItem;
mockService = mockResponse.getMockOperation().getMockService();
project = mockService.getProject();
} else if (modelItem instanceof SecurityTest) {
securityTest = (SecurityTest) modelItem;
testCase = ((SecurityTest) modelItem).getTestCase();
testSuite = testCase.getTestSuite();
project = testSuite.getProject();
} else if (modelItem instanceof OAuth2Profile) {
project = ((WsdlProject) modelItem.getParent());
}
// no project -> nothing
if (project == null) {
return null;
}
// explicit item reference?
String result = ResolverUtils.checkForExplicitReference(pe, PropertyExpansion.PROJECT_REFERENCE, project,
context, globalOverride);
if (result != null) {
return result;
}
result = ResolverUtils.checkForExplicitReference(pe, PropertyExpansion.TESTSUITE_REFERENCE, testSuite, context,
globalOverride);
if (result != null) {
return result;
}
result = ResolverUtils.checkForExplicitReference(pe, PropertyExpansion.TESTCASE_REFERENCE, testCase, context,
globalOverride);
if (result != null) {
return result;
}
result = ResolverUtils.checkForExplicitReference(pe, PropertyExpansion.MOCKSERVICE_REFERENCE, mockService,
context, globalOverride);
if (result != null) {
return result;
}
result = ResolverUtils.checkForExplicitReference(pe, PropertyExpansion.MOCKRESPONSE_REFERENCE, mockResponse,
context, globalOverride);
if (result != null) {
return result;
}
result = ResolverUtils.checkForExplicitReference(pe, PropertyExpansion.SECURITYTEST_REFERENCE, securityTest,
context, globalOverride);
if (result != null) {
return result;
}
return null;
}
}