package com.bagri.samples.client.xqj; import static com.bagri.core.Constants.pn_schema_address; import static com.bagri.core.Constants.pn_schema_name; import static com.bagri.core.Constants.pn_schema_password; import static com.bagri.core.Constants.pn_schema_user; import static com.bagri.core.Constants.pn_document_data_format; import static com.bagri.xqj.BagriXQDataSource.ADDRESS; import static com.bagri.xqj.BagriXQDataSource.PASSWORD; import static com.bagri.xqj.BagriXQDataSource.SCHEMA; import static com.bagri.xqj.BagriXQDataSource.USER; import static com.bagri.xqj.BagriXQDataSource.XDM_REPOSITORY; import static com.bagri.xqj.BagriXQDataSource.XQ_PROCESSOR; import java.util.ArrayList; import java.util.List; import java.util.Properties; import javax.xml.namespace.QName; import javax.xml.xquery.XQConnection; import javax.xml.xquery.XQDataSource; import javax.xml.xquery.XQException; import javax.xml.xquery.XQExpression; import javax.xml.xquery.XQItemType; import javax.xml.xquery.XQPreparedExpression; import javax.xml.xquery.XQResultSequence; import javax.xml.xquery.XQSequence; import com.bagri.samples.client.BagriClientApp; import com.bagri.xqj.BagriXQDataSource; public class XQJClientApp implements BagriClientApp { private XQConnection xqConn; public static void main(String[] args) throws Exception { if (args.length < 4) { throw new XQException("wrong number of arguments passed. Expected: schemaAddress schemaName userName password"); } Properties props = new Properties(); props.setProperty(pn_schema_address, args[0]); props.setProperty(pn_schema_name, args[1]); props.setProperty(pn_schema_user, args[2]); props.setProperty(pn_schema_password, args[3]); XQJClientApp client = new XQJClientApp(props); tester.testClient(client); } public XQJClientApp(Properties props) throws XQException { XQDataSource xqds = new BagriXQDataSource(); xqds.setProperty(ADDRESS, props.getProperty(pn_schema_address)); xqds.setProperty(SCHEMA, props.getProperty(pn_schema_name)); xqds.setProperty(USER, props.getProperty(pn_schema_user)); xqds.setProperty(PASSWORD, props.getProperty(pn_schema_password)); xqds.setProperty(XQ_PROCESSOR, "com.bagri.xquery.saxon.XQProcessorClient"); xqds.setProperty(XDM_REPOSITORY, "com.bagri.client.hazelcast.impl.SchemaRepositoryImpl"); xqConn = xqds.getConnection(); } public XQJClientApp(XQConnection xqConn) { this.xqConn = xqConn; } @Override public void close() throws XQException { xqConn.close(); } @Override public boolean createDocument(String uri, String content) throws XQException { String result = storeDocument(uri, content); return result != null; } @Override public String readDocument(String uri) throws XQException { String query = "declare namespace bgdb=\"http://bagridb.com/bdb\";\n" + "declare variable $uri external;\n" + "let $doc := bgdb:get-document-content($uri)\n" + "return $doc\n"; XQPreparedExpression xqpe = xqConn.prepareExpression(query); xqpe.bindString(new QName("uri"), uri, xqConn.createAtomicType(XQItemType.XQBASETYPE_ANYURI)); XQResultSequence xqs = xqpe.executeQuery(); String result = null; if (xqs.next()) { result = xqs.getItemAsString(null); } return result; } @Override public String queryDocumentByUri(String uri) throws XQException { String query = "for $doc in fn:doc(\"" + uri + "\")\n" + "return $doc\n"; XQExpression xqe = xqConn.createExpression(); XQResultSequence xqs = xqe.executeQuery(query); String result = null; if (xqs.next()) { result = xqs.getItemAsString(null); } return result; } @Override public String queryDocumentFromCollection() throws XQException { String query = "for $doc in fn:collection()\n" + "return $doc\n"; XQExpression xqe = xqConn.createExpression(); XQResultSequence xqs = xqe.executeQuery(query); String result = null; if (xqs.next()) { result = xqs.getItemAsString(null); } return result; } @Override public boolean updateDocument(String uri, String content) throws XQException { String result = storeDocument(uri, content); // document version must be > 1 return uri.equals(result); } @Override public void deleteDocument(String uri) throws XQException { String query = "declare namespace bgdb=\"http://bagridb.com/bdb\";\n" + "declare variable $uri external;\n" + "let $uri := bgdb:remove-document($uri)\n" + "return $uri\n"; XQPreparedExpression xqpe = xqConn.prepareExpression(query); xqpe.bindString(new QName("uri"), uri, xqConn.createAtomicType(XQItemType.XQBASETYPE_ANYURI)); XQSequence xqs = xqpe.executeQuery(); String result = null; try { if (xqs.next()) { result = xqs.getAtomicValue(); } if (!uri.equals(result)) { throw new XQException("got no result from bgdb:remove-document function"); } } finally { xqpe.close(); xqs.close(); } } private String storeDocument(String uri, String content) throws XQException { String query = "declare namespace bgdb=\"http://bagridb.com/bdb\";\n" + "declare variable $uri external;\n" + "declare variable $xml external;\n" + //"declare variable $props external;\n" + //"let $uri := bgdb:store-document($uri, $xml, $props)\n" + "let $uri := bgdb:store-document($uri, $xml)\n" + "return $uri\n"; XQPreparedExpression xqpe = xqConn.prepareExpression(query); xqpe.bindString(new QName("uri"), uri, xqConn.createAtomicType(XQItemType.XQBASETYPE_ANYURI)); xqpe.bindString(new QName("xml"), content, xqConn.createAtomicType(XQItemType.XQBASETYPE_STRING)); //List<String> props = new ArrayList<>(2); //props.add(pn_document_data_format + "=xml"); // //xqpe.bindSequence(new QName("props"), xqConn.createSequence(props.iterator())); XQSequence xqs = xqpe.executeQuery(); String result = null; try { if (xqs.next()) { result = xqs.getAtomicValue(); } } finally { xqpe.close(); xqs.close(); } return result; } }