package org.example; import javax.xml.xquery.XQConnection; import javax.xml.xquery.XQDataSource; import javax.xml.xquery.XQExpression; import javax.xml.xquery.XQSequence; import junit.framework.Assert; import org.junit.Test; /** * Unit test to investigate: "Error: [BXDB0007] Database 'factbook' is opened by * another process." *

* When the database is somehow in use, the Java code fails silently. Like: * *

* */ public class SimpleBaseXTest { private static final String DRIVER = "net.xqj.basex.BaseXXQDataSource"; private static final String SELECT = "xs:long(collection('factbook')//country[name='Albania']/@population[1]/data(.))"; private static final String UPDATE = "for $c in collection('factbook')//country[name='Albania']" + "return(" + " replace value of node $c/@population with xs:integer($c/@population + 1)" + ")"; @Test public void testUpdate() { try { XQDataSource xqd = (XQDataSource) Class.forName(DRIVER) .newInstance(); XQConnection xqc = xqd.getConnection("admin", "admin"); XQExpression xqe = xqc.createExpression(); XQSequence xqs = xqe.executeQuery(SELECT); xqs.next(); long before = xqs.getLong(); System.out.println("Initial value: " + before); System.out.println("Updating..."); xqs = xqe.executeQuery(UPDATE); xqs = xqe.executeQuery(SELECT); xqs.next(); long after = xqs.getLong(); System.out.println("Resulting value: " + after); xqc.close(); Assert.assertEquals("Update should have succeeded or failed", before + 1, after); } catch (Exception e) { e.printStackTrace(); } } }