package org.gcube.informationsystem.collector.impl.xmlstorage.exist; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import javax.xml.transform.OutputKeys; import org.exist.xmldb.XQueryService; import org.xmldb.api.base.Collection; import org.xmldb.api.base.CompiledExpression; import org.xmldb.api.base.ResourceSet; import org.gcube.informationsystem.collector.impl.xmlstorage.exist.State; import org.gcube.informationsystem.collector.impl.xmlstorage.exist.XQuery; import org.globus.wsrf.config.ContainerConfig; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Reads an XQuery file or string and executes it. * */ public class XQuery { private String query_string = null; private static Log logger = LogFactory.getLog(XQuery.class.getName()); //testsuite constructor: TO REMOVE public XQuery() throws IOException { try { this.query_string = this.getStaticQuery(); } catch (Exception e) { logger.error(State.logPrefix + "Unable to read the XQuery file"); throw new IOException("Unable to read the XQuery file " + e.getStackTrace()[0].toString()); } } public XQuery(String xquery) { this.query_string = xquery; } public XQuery(FileReader file) throws IOException { try { this.query_string = this.readFile(file); } catch (IOException ioe) { logger.error(State.logPrefix + "Unable to read the XQuery file"); throw new IOException("Unable to read the XQuery file " + ioe.getStackTrace()[0].toString()); } } /** * Returns the xquery string */ public String toString() { return this.query_string; } /** * Executes the query on the given base collection * * @param col */ public ResourceSet execute(Collection col) throws Exception { logger.info(State.logPrefix + "executing query on collection " + col.getName()); XQueryService service = (XQueryService) col.getService("XQueryService", "1.0"); // set pretty-printing on service.setProperty(OutputKeys.INDENT, "yes"); service.setProperty(OutputKeys.ENCODING, "UTF-8"); CompiledExpression compiled = service.compile(this.query_string); long start = System.currentTimeMillis(); // execute query and get results in ResourceSet ResourceSet result = service.execute(compiled); long qtime = System.currentTimeMillis() - start; start = System.currentTimeMillis(); /*Properties outputProperties = new Properties(); outputProperties.setProperty(OutputKeys.INDENT, "yes"); SAXSerializer serializer = (SAXSerializer) SerializerPool.getInstance().borrowObject(SAXSerializer.class); serializer.setOutput(new OutputStreamWriter(System.out), outputProperties); SerializerPool.getInstance().returnObject(serializer); */ //long rtime = System.currentTimeMillis() - start; logger.info(State.logPrefix + "hits: " + result.getSize()); logger.info(State.logPrefix + "query time: " + qtime + "ms"); //logger.info(State.logPrefix + "retrieve time: " + rtime); return result; } /** * Reads the xquery file and return as string. */ protected String readFile(FileReader file) throws IOException { BufferedReader f = new BufferedReader(file); String line; StringBuffer xml = new StringBuffer(); while ((line = f.readLine()) != null) xml.append(line + " "); f.close(); return xml.toString(); } /** * Retrives the query from a local file * * @return the query */ private String getStaticQuery() throws Exception { String file = ContainerConfig.getBaseDirectory() + "/etc/org_diligentproject_informationservice_disic/query-example.xq"; return this.readFile(new FileReader(file)); } }