package org.gcube.informationsystem.collector.impl.porttypes; import org.globus.wsrf.utils.FaultHelper; import org.xmldb.api.base.ResourceSet; import org.xmldb.api.modules.XMLResource; import org.gcube.common.core.contexts.GCUBEServiceContext; import org.gcube.common.core.porttypes.GCUBEPortType; import org.gcube.common.core.utils.logging.GCUBELog; import org.gcube.informationsystem.collector.impl.contexts.ICServiceContext; import org.gcube.informationsystem.collector.impl.xmlstorage.exist.State; import org.gcube.informationsystem.collector.impl.xmlstorage.exist.XQuery; import org.gcube.informationsystem.collector.stubs.XQueryExecuteRequest; import org.gcube.informationsystem.collector.stubs.XQueryExecuteResponse; import org.gcube.informationsystem.collector.stubs.XQueryFaultType; /** * XQueryAccess portType implementation * * @author Manuele Simi (ISTI-CNR) * */ public class XQueryAccess extends GCUBEPortType { private final GCUBELog logger = new GCUBELog(XQueryAccess.class); /** {@inheritDoc} */ @Override protected GCUBEServiceContext getServiceContext() { return ICServiceContext.getContext(); } /** * Executes a XQuery expression in the XML storage * @param XQueryExpression the XQuery expression * @return a formatted XML document * @throws XQueryFaultType if the execution fails */ public XQueryExecuteResponse XQueryExecute(XQueryExecuteRequest request) throws XQueryFaultType { StringBuilder dataset = new StringBuilder(); XQueryExecuteResponse response = new XQueryExecuteResponse(); try { logger.debug("executing XQuery: " + request.getXQueryExpression()); XQuery q = new XQuery(request.getXQueryExpression()); ResourceSet result = State.query_manager.executeXQuery(q); response.setSize(result.getSize()); logger.debug("number of returned documents: " + result.getSize()); dataset.append("\n"); for (int i = 0; i < (int) result.getSize(); i++) { XMLResource xmlres = (XMLResource) result.getResource((long) i); dataset.append("\n" + xmlres.getContent() + "\n\n"); } dataset.append(""); response.setDataset(dataset.toString()); } catch (Exception e) { XQueryFaultType fault = new XQueryFaultType(); FaultHelper faultHelper = new FaultHelper(fault); faultHelper.addFaultCause(e); faultHelper.addDescription("IC service: Exception when executing the requested XQuery"); throw fault; } return response; } }