is-collector/src/org/gcube/informationsystem/collector/impl/porttypes/XQueryAccess.java

68 lines
2.5 KiB
Java

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;
/**
* <em>XQueryAccess</em> 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("<Resultset>\n");
for (int i = 0; i < (int) result.getSize(); i++) {
XMLResource xmlres = (XMLResource) result.getResource((long) i);
dataset.append("<Record>\n" + xmlres.getContent() + "\n</Record>\n");
}
dataset.append("</Resultset>");
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;
}
}