package com.bagri.xqj;
import static com.bagri.support.util.FileUtils.readTextFile;
import static org.junit.Assert.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import javax.xml.namespace.QName;
import javax.xml.xquery.XQCancelledException;
import javax.xml.xquery.XQConnection;
import javax.xml.xquery.XQDataSource;
import javax.xml.xquery.XQException;
import javax.xml.xquery.XQExpression;
import javax.xml.xquery.XQItem;
import javax.xml.xquery.XQItemType;
import javax.xml.xquery.XQPreparedExpression;
import javax.xml.xquery.XQResultSequence;
import javax.xml.xquery.XQSequence;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import com.bagri.core.api.BagriException;
public class BagriXQDataSourceTest {
private XQDataSource xqds;
@Before
public void setUp() throws XQException {
xqds = new BagriXQDataSource();
//xqds.setProperty(BagriXQDataSource.HOST, "127.0.0.1");
//xqds.setProperty(BagriXQDataSource.PORT, "5701");
xqds.setProperty(BagriXQDataSource.ADDRESS, "localhost:10500");
xqds.setProperty(BagriXQDataSource.SCHEMA, "default");
xqds.setProperty(BagriXQDataSource.USER, "guest");
xqds.setProperty(BagriXQDataSource.PASSWORD, "password");
//xqds.setProperty("hz.cache.mode", "client");
xqds.setProperty(BagriXQDataSource.XQ_PROCESSOR, "com.bagri.xquery.saxon.XQProcessorClient");
xqds.setProperty(BagriXQDataSource.XDM_REPOSITORY, "com.bagri.client.hazelcast.impl.SchemaRepositoryImpl");
}
@Test
public void getConnectionTest() throws XQException {
XQConnection conn = xqds.getConnection();
assertNotNull(conn);
assertFalse(conn.isClosed());
conn.close();
assertTrue(conn.isClosed());
}
@Test
@Ignore
public void getConnectionWithCredentialsTest() throws XQException {
String username = "test";
String password = "test";
XQConnection conn = xqds.getConnection(username, password);
assertNull(conn);
//assertFalse(conn.isClosed());
//conn.close();
}
@Test
@Ignore
public void testLoginTimeout() throws XQException {
xqds.setLoginTimeout(1);
XQConnection conn = xqds.getConnection();
assertNull(conn);
xqds.setLoginTimeout(5);
conn = xqds.getConnection();
assertNotNull(conn);
conn.close();
}
@Test
public void testQueryCancel() throws XQException {
XQConnection xqc = xqds.getConnection();
assertNotNull(xqc);
assertFalse(xqc.isClosed());
String query = "declare namespace s=\"http://tpox-benchmark.com/security\";\n" +
"declare variable $v external;\n" +
"for $sec in fn:collection(\"http://tpox-benchmark.com/security\")/s:Security\n" +
"where $sec/s:Symbol=$v\n" +
"return\n" +
"\t<print>The open price of the security \"{$sec/s:Name/text()}\" is {$sec/s:Price/s:PriceToday/s:Open/text()} dollars</print>\n";
final XQPreparedExpression xqpe = xqc.prepareExpression(query);
xqpe.bindString(new QName("v"), "IBM", null);
Thread th1 = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5);
xqpe.cancel();
} catch (Exception ex) {
//
}
}
});
th1.start();
try {
XQResultSequence xqs = xqpe.executeQuery();
assertFalse(xqs.next());
xqs.close();
} catch (XQCancelledException ex) {
// unticipated ex
}
xqpe.close();
xqc.close();
}
@Test
public void testQueryTimeout() throws XQException {
XQConnection xqc = xqds.getConnection();
assertNotNull(xqc);
assertFalse(xqc.isClosed());
String dName = "..\\etc\\samples\\tpox\\";
String xml;
try {
xml = readTextFile(dName + "security5621.xml");
} catch (IOException ex) {
throw new XQException(ex.getMessage());
}
String query = "declare namespace bgdb=\"http://bagridb.com/bdb\";\n" +
"declare variable $url external;\n" +
"declare variable $xml external;\n" +
"let $id := bgdb:store-document($url, $xml)\n" +
"return $id\n";
XQPreparedExpression xqpe = xqc.prepareExpression(query);
xqpe.bindString(new QName("url"), "security5621.xml", xqc.createAtomicType(XQItemType.XQBASETYPE_ANYURI));
xqpe.bindString(new QName("xml"), xml, xqc.createAtomicType(XQItemType.XQBASETYPE_STRING));
XQSequence xqs = xqpe.executeQuery();
assertTrue(xqs.next());
xqs.close();
xqpe.close();
xqc.getStaticContext().setQueryTimeout(3); // 1 sec timeout
query = "declare default element namespace \"http://tpox-benchmark.com/security\";\n" +
"declare variable $sect external;\n" +
"declare variable $pemin external;\n" +
"declare variable $pemax external;\n" +
"declare variable $yield external;\n" +
"for $sec in fn:collection(\"/{http://tpox-benchmark.com/security}Security\")/Security\n" +
"where $sec[SecurityInformation/*/Sector = $sect and PE[. >= $pemin and . < $pemax] and Yield > $yield]\n" +
"return <Security>\n" +
"\t{$sec/Symbol}\n" +
"\t{$sec/Name}\n" +
"\t{$sec/SecurityType}\n" +
"\t{$sec/SecurityInformation//Sector}\n" +
"\t{$sec/PE}\n" +
"\t{$sec/Yield}\n" +
"</Security>";
xqpe = xqc.prepareExpression(query);
xqpe.bindString(new QName("sect"), "Technology", null);
xqpe.bindFloat(new QName("pemin"), 25.0f, null);
xqpe.bindFloat(new QName("pemax"), 28.0f, null);
xqpe.bindFloat(new QName("yield"), 0.0f, null);
try {
xqs = xqpe.executeQuery();
assertFalse(xqs.next());
} catch (XQException ex) {
// must be timeout exception
assertTrue(BagriException.ecQueryTimeout == Integer.parseInt(ex.getVendorCode()));
}
xqs.close();
xqpe.close();
xqc.close();
}
@Test
public void testStoreSecurity() throws XQException {
String dName = "..\\etc\\samples\\tpox\\";
String xml;
try {
xml = readTextFile(dName + "security1500.xml");
} catch (IOException ex) {
throw new XQException(ex.getMessage());
}
String query = "declare namespace bgdb=\"http://bagridb.com/bdb\";\n" +
"declare variable $url external;\n" +
"declare variable $xml external;\n" +
"let $id := bgdb:store-document($url, $xml)\n" +
"return $id\n";
XQConnection xqc = xqds.getConnection();
XQPreparedExpression xqpe = xqc.prepareExpression(query);
xqpe.bindString(new QName("url"), "security1500.xml", xqc.createAtomicType(XQItemType.XQBASETYPE_ANYURI));
xqpe.bindString(new QName("xml"), xml, xqc.createAtomicType(XQItemType.XQBASETYPE_STRING));
XQSequence xqs = xqpe.executeQuery();
assertTrue(xqs.next());
xqs.close();
xqpe.close();
}
@Test
public void testCreateItemFromDocumentString() throws XQException {
XQConnection xqc = xqds.getConnection();
try {
xqc.createItemFromDocument((String)null, null, null);
fail("A-XQDF-1.2: null argument is invalid and throws an XQException.");
} catch (XQException e) {
// Expect an XQException
}
boolean failed = false;
try {
XQItem xqitem = xqc.createItemFromDocument("<e>Hello world!</e>", null, xqc.createAtomicType(XQItemType.XQBASETYPE_BOOLEAN));
// conversion succeeded, we're having implementation defined behaviour
// but at least the XDM instance must be of the right type.
if (xqitem.getItemType().getItemKind() != XQItemType.XQITEMKIND_ATOMIC) {
failed = true;
}
if (xqitem.getItemType().getBaseType() != XQItemType.XQBASETYPE_BOOLEAN) {
failed = true;
}
} catch (XQException e) {
// Expect an XQException
}
if (failed) {
fail("A-XQDF-1.3: The conversion is subject to the following constraints. " +
"Either it fails with an XQException, either it is successful in which case it must result in an instance of XDT.");
}
try {
XQItem xqitem = xqc.createItemFromDocument("<e>", null, null);
fail("A-XQDF-1.4: The conversion of the value to an XDM instance must fail.");
} catch (XQException e) {
// Expect an XQException
}
XQItem xqi = null;
try {
xqi = xqc.createItemFromDocument("<e>Hello world!</e>", null, null);
} catch (XQException e) {
fail("A-XQDF-1.5: createItemFromDocument() failed with message: " + e.getMessage());
}
String result = xqi.getItemAsString(null);
assertTrue("A-XQDF-1.5: Expects serialized result contains '<e>Hello world!</e>', but it is '"
+ result + "'", result.indexOf("<e>Hello world!</e>") != -1);
}
}