/*
* 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.support;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.model.project.Project;
import com.eviware.soapui.model.propertyexpansion.PropertyExpander;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext;
import com.eviware.soapui.model.support.ModelSupport;
import com.eviware.soapui.model.testsuite.TestCaseRunContext;
import com.eviware.soapui.model.testsuite.TestStep;
import com.eviware.soapui.support.xml.XmlUtils;
import org.apache.xmlbeans.XmlException;
import org.w3c.dom.Node;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.DriverPropertyInfo;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GroovyUtils {
protected final PropertyExpansionContext context;
public GroovyUtils(PropertyExpansionContext context) {
this.context = context;
}
public final String getProjectPath() {
Project project = ModelSupport.getModelItemProject(context.getModelItem());
String path = project.getPath();
int ix = path.lastIndexOf(File.separatorChar);
return ix == -1 ? "" : path.substring(0, ix);
}
public final XmlHolder getXmlHolder(String xmlPropertyOrString) throws Exception {
try {
// return new XmlHolder( XmlObject.Factory.parse( xmlPropertyOrString )
// );
return new XmlHolder(XmlUtils.createXmlObject(xmlPropertyOrString));
} catch (Exception e) {
return new XmlHolder(context, xmlPropertyOrString);
}
}
public final String expand(String property) {
return PropertyExpander.expandProperties(context, property);
}
public final void setPropertyValue(String testStep, String property, String value) throws Exception {
if (!(context instanceof TestCaseRunContext)) {
return;
}
TestStep step = ((TestCaseRunContext) context).getTestCase().getTestStepByName(testStep);
if (step != null) {
step.setPropertyValue(property, value);
} else {
throw new Exception("Missing TestStep [" + testStep + "] in TestCase");
}
}
public final String getXml(Node node) throws XmlException {
// return XmlObject.Factory.parse( node ).xmlText();
return XmlUtils.createXmlObject(node).xmlText();
}
private static final ConcurrentHashMap<String, Boolean> registeredDrivers = new ConcurrentHashMap<String, Boolean>();
private static final Object[] mutex = new Object[0];
public static void registerJdbcDriver(String name) {
if (registeredDrivers.containsKey(name)) {
return;
}
try {
synchronized (mutex) {
Class driverClass = Class.forName(name, true, SoapUI.getSoapUICore().getExtensionClassLoader());
Driver d = (Driver) driverClass.newInstance();
DriverManager.registerDriver(new DriverProxy(d));
}
registeredDrivers.putIfAbsent(name, Boolean.TRUE);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* extracts error line number from groovy stact trace
*
* @return line number
*/
public static String extractErrorLineNumber(Throwable t) {
try {
Writer wresult = new StringWriter();
PrintWriter printWriter = new PrintWriter(wresult);
t.printStackTrace(printWriter);
String stackTrace = wresult.toString();
Pattern p = Pattern.compile("at Script\\d+\\.run\\(Script\\d+\\.groovy:(\\d+)\\)");
Matcher m = p.matcher(stackTrace);
m.find();
String b = m.group(1);
return b;
} catch (Exception e) {
SoapUI.logError(e, "cannot get error line number!");
return null;
}
}
static class DriverProxy implements Driver {
private Driver driver;
DriverProxy(Driver d) {
this.driver = d;
}
public boolean acceptsURL(String u) throws SQLException {
return this.driver.acceptsURL(u);
}
public Connection connect(String u, Properties p) throws SQLException {
return this.driver.connect(u, p);
}
public int getMajorVersion() {
return this.driver.getMajorVersion();
}
public int getMinorVersion() {
return this.driver.getMinorVersion();
}
public DriverPropertyInfo[] getPropertyInfo(String u, Properties p) throws SQLException {
return this.driver.getPropertyInfo(u, p);
}
public boolean jdbcCompliant() {
return this.driver.jdbcCompliant();
}
/*
* (non-Javadoc)
*
* @see java.sql.Driver#getParentLogger()
*
* Java 7 issue
*
* this method is need by java.sql.Driver interface in Java 7
*/
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
// TODO Auto-generated method stub
return null;
}
}
}