package org.ariadne_eu.service;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.http.HTTPConstants;
import org.apache.axis2.transport.http.TransportHeaders;
import org.apache.log4j.Logger;
import org.ariadne_eu.metadata.query.QueryMetadataFactory;
import org.ariadne_eu.metadata.query.language.TranslateLanguage;
import org.ariadne_eu.metadata.resultsformat.TranslateResultsformat;
import org.ariadne_eu.utils.config.RepositoryConstants;
import be.cenorm.www.AsynchronousQuery;
import be.cenorm.www.FaultCodeType;
import be.cenorm.www.GetTotalResultsCount;
import be.cenorm.www.GetTotalResultsCountResponse;
import be.cenorm.www.SessionExpiredException;
import be.cenorm.www.SetMaxDuration;
import be.cenorm.www.SetMaxQueryResults;
import be.cenorm.www.SetQueryLanguage;
import be.cenorm.www.SetResultsFormat;
import be.cenorm.www.SetResultsSetSize;
import be.cenorm.www.SetSourceLocation;
import be.cenorm.www.SqiTargetSkeleton;
import be.cenorm.www.SynchronousQuery;
import be.cenorm.www.SynchronousQueryResponse;
import be.cenorm.www.Ticket;
import be.cenorm.www._SQIFault;
import be.cenorm.www._SQIFaultException;
/**
* Created by ben
* Date: 6-jan-2007
* Time: 23:50:48
* To change this template use File | Settings | File Templates.
*/
@Path("/sqitarget")
public class SqiTargetImplementation extends SqiTargetSkeleton {
private static Logger log = Logger.getLogger(SqiTargetImplementation.class);
public GetTotalResultsCountResponse getTotalResultsCount(GetTotalResultsCount getTotalResultsCount)
throws _SQIFaultException{
int queryLanguage = -1;
String fIP = ((HttpServletRequest)MessageContext.getCurrentMessageContext().getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST)).getRemoteAddr();
String oIP = remoteAddr(((HttpServletRequest)MessageContext.getCurrentMessageContext().getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST)));
TransportHeaders th = (TransportHeaders)(MessageContext.getCurrentMessageContext().getProperty("TRANSPORT_HEADERS"));
String userAgent = (String) th.get("user-agent");
String host = (String) th.get("host");
log.info("GetTotalResultsCountResponse:query="+getTotalResultsCount.getQueryStatement()+",sessionID="+getTotalResultsCount.getTargetSessionID()+",Forwarding IP="+fIP+",Original IP="+oIP+",User-Agent="+userAgent+",Host="+host);
Ticket ticket = null;
try {
// if (getTotalResultsCount.getTargetSessionID().equalsIgnoreCase(PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().REPO_STATICKEY))) {
// ticket = Ticket.newTicket("http://www.ariadne-eu.org/metadatastore/");
// queryLanguage = getQueryLanguage(ticket.toString());
// } else {
ticket = Ticket.getTicket(getTotalResultsCount.getTargetSessionID());
queryLanguage = getQueryLanguage(getTotalResultsCount.getTargetSessionID());
// }
} catch (SessionExpiredException e) {
log.error("GetTotalResultsCountResponse: ", e);
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00013);
fault.setMessage("The given session ID is invalid");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
if (queryLanguage != TranslateLanguage.UNDEFINED)
return getTotalResultsCount(getTotalResultsCount, queryLanguage);
// try {
// Ticket.getTicket(getTotalResultsCount.getTargetSessionID()); //throws exception if no valid ticket exists
// } catch (SessionExpiredException e) {
// log.error("GetTotalResultsCountResponse: ", e);
// _SQIFault fault = new _SQIFault();
// fault.setSqiFaultCode(FaultCodeType.SQI_00013);
// fault.setMessage("The given session ID is invalid");
// _SQIFaultException exception = new _SQIFaultException();
// exception.setFaultMessage(fault);
// throw exception;
// }
log.error("GetTotalResultsCountResponse:query="+getTotalResultsCount.getQueryStatement()+",sessionID="+getTotalResultsCount.getTargetSessionID()+",queryLanguage="+getQueryLanguage(getTotalResultsCount.getTargetSessionID()));
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00001);
fault.setMessage("Query has not been executed");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
private GetTotalResultsCountResponse getTotalResultsCount(GetTotalResultsCount getTotalResultsCount, int queryLanguage) throws _SQIFaultException {
try {
int count = QueryMetadataFactory.getQueryImpl(queryLanguage).count(getTotalResultsCount.getQueryStatement());
GetTotalResultsCountResponse response = new GetTotalResultsCountResponse();
response.setGetTotalResultsCountReturn(count);
return response;
} catch (Exception e) {
log.error("GetTotalResultsCountResponse:query="+getTotalResultsCount.getQueryStatement()+",sessionID="+getTotalResultsCount.getTargetSessionID()+",queryLanguage="+queryLanguage, e);
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00001);
fault.setMessage("Database exception");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
}
@GET
@Produces({"application/xml", "application/json"})
public String synchronousQuery(@QueryParam("query") String query, @QueryParam("start") String start, @QueryParam("size") String size, @QueryParam("lang") String queryLanguage, @QueryParam("format") String resultFormat) {
Ticket ticket = null;
ticket = Ticket.newTicket("http://www.ariadne-eu.org/metadatastore/");
log.info("synchronousQuery:query="+query+",sessionID="+ticket.toString());
int queryLang = getQueryLanguage(ticket.toString());
if(queryLanguage != null) {
queryLang = TranslateLanguage.getQueryLanguage(queryLanguage);
if (queryLang == TranslateLanguage.UNDEFINED){
log.debug("setQueryLanguage:queryLanguageID not supported");
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00011);
fault.setMessage("Query Language Not Supported");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
Ticket.destroy(ticket);
return fault.getMessage();
}
}
int resultsFormat = getResultsFormat(ticket.toString());
if(resultFormat != null) {
resultsFormat = TranslateResultsformat.getResultsFormat(resultFormat);
if (resultsFormat == TranslateResultsformat.UNDEFINED){
log.debug("setResultsFormat:Invalid Results format");
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00010);
fault.setMessage("Invalid Results format");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
Ticket.destroy(ticket);
return fault.getMessage();
}
}
int startResult = 1;
int nbResults = 12;
if (start != null) {
try {
startResult = Integer.parseInt(start);
if(startResult < 1) throw new Exception();
} catch (Exception e) {
log.debug("setStartResult:Invalid Start Result");
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00003);
fault.setMessage("Invalid Start Result");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
Ticket.destroy(ticket);
return fault.getMessage();
}
}
if (size != null) {
try {
nbResults = Integer.parseInt(size);
if(nbResults < 1) throw new Exception();
} catch (Exception e) {
log.debug("setNumberOfResults:Invalid Results Set Size");
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00005);
fault.setMessage("Invalid Results Set Size");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
Ticket.destroy(ticket);
return fault.getMessage();
}
}
SynchronousQuery synchronousQuery = new SynchronousQuery();
synchronousQuery.setQueryStatement(query);
synchronousQuery.setTargetSessionID(ticket.toString());
try {
SynchronousQueryResponse qReturn = synchronousQuery(synchronousQuery, queryLang, resultsFormat, startResult, nbResults);
Ticket.destroy(ticket);
return qReturn.getSynchronousQueryReturn();
} catch (_SQIFaultException e) {
log.error("synchronousQuery:sessionID=" + ticket.toString());
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00001);
fault.setMessage("Query has not been executed");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
Ticket.destroy(ticket);
return fault.getMessage();
}
}
public SynchronousQueryResponse synchronousQuery(SynchronousQuery synchronousQuery)
throws _SQIFaultException{
int queryLanguage = -1, resultsFormat = -1;
String fIP = ((HttpServletRequest)MessageContext.getCurrentMessageContext().getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST)).getRemoteAddr();
String oIP = remoteAddr(((HttpServletRequest)MessageContext.getCurrentMessageContext().getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST)));
TransportHeaders th = (TransportHeaders)(MessageContext.getCurrentMessageContext().getProperty("TRANSPORT_HEADERS"));
String userAgent = (String) th.get("user-agent");
String host = (String) th.get("host");
log.info("synchronousQuery:query="+synchronousQuery.getQueryStatement()+",sessionID="+synchronousQuery.getTargetSessionID()+",Forwarding IP="+fIP+",Original IP="+oIP+",User-Agent="+userAgent+",Host="+host);
Ticket ticket = null;
try {
// if (synchronousQuery.getTargetSessionID().equalsIgnoreCase(PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().REPO_STATICKEY))) {
// ticket = Ticket.newTicket("http://www.ariadne-eu.org/metadatastore/");
// queryLanguage = getQueryLanguage(ticket.toString());
// resultsFormat = getResultsFormat(ticket.toString());
// } else {
ticket = Ticket.getTicket(synchronousQuery.getTargetSessionID());
queryLanguage = getQueryLanguage(synchronousQuery.getTargetSessionID());
resultsFormat = getResultsFormat(synchronousQuery.getTargetSessionID());
// }
} catch (SessionExpiredException e) {
log.error("synchronousQuery:sessionID="+synchronousQuery.getTargetSessionID());
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00013);
fault.setMessage("The given session ID is invalid");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
if (queryLanguage != TranslateLanguage.UNDEFINED) {
int startResult = synchronousQuery.getStartResult();
int nbResults = 25;
if (ticket != null)
nbResults = Integer.parseInt(ticket.getParameter("resultsSetSize"));
return synchronousQuery(synchronousQuery, queryLanguage, resultsFormat, startResult, nbResults);
}
if (ticket == null) {
try {
Ticket.getTicket(synchronousQuery.getTargetSessionID());
log.debug("synchronousQuery:ticket=null");
} catch (SessionExpiredException e) {
log.error("synchronousQuery: ", e);
}
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00013);
fault.setMessage("The given session ID is invalid");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
log.error("synchronousQuery:sessionID="+synchronousQuery.getTargetSessionID());
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00001);
fault.setMessage("Query has not been executed");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
public SynchronousQueryResponse synchronousQuery(SynchronousQuery synchronousQuery, int queryLanguage, int resultsFormat, int startResult, int nbResults) throws _SQIFaultException {
try {
String result = QueryMetadataFactory.getQueryImpl(queryLanguage).query(synchronousQuery.getQueryStatement(), startResult, nbResults, resultsFormat);
result = TranslateResultsformat.processResults(result, getResultsFormatString(synchronousQuery.getTargetSessionID()), getQueryLanguageString(synchronousQuery.getTargetSessionID()), synchronousQuery.getQueryStatement());
SynchronousQueryResponse response = new SynchronousQueryResponse();
response.setSynchronousQueryReturn(result);
return response;
} catch (Exception e) {
log.error("synchronousQuery:query="+synchronousQuery.getQueryStatement()+",sessionID="+synchronousQuery.getTargetSessionID()+",queryLanguage="+queryLanguage+",startResult="+startResult+",nbResults="+nbResults, e);
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00001);
fault.setMessage("Database exception");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
}
public void setMaxDuration(SetMaxDuration setMaxDuration)
throws _SQIFaultException{
log.info("setMaxDuration:maxDuration="+setMaxDuration.getMaxDuration()+",sessionID="+setMaxDuration.getTargetSessionID());
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00012);
fault.setMessage("Method not supported: setMaxDuration");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
public void setResultsFormat(SetResultsFormat setResultsFormat) throws _SQIFaultException{
try {
String rf = setResultsFormat.getResultsFormat();
log.info("setResultsFormat:resultsFormat="+ rf +",sessionID="+setResultsFormat.getTargetSessionID());
Ticket ticket = Ticket.getTicket(setResultsFormat.getTargetSessionID()); //throws exception if no valid ticket exists
if (TranslateResultsformat.getResultsFormat(rf) != TranslateResultsformat.UNDEFINED)
ticket.setParameter("resultsFormat", rf);
else {
log.debug("setResultsFormat:resultsFormat not supported");
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00010);
fault.setMessage("Results format Not Supported");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
} catch (SessionExpiredException e) {
log.debug("setResultsFormat: ", e);
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00013);
fault.setMessage("The given session ID is invalid");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
}
public void asynchronousQuery(AsynchronousQuery asynchronousQuery)
throws _SQIFaultException{
log.info("asynchronousQuery:query="+asynchronousQuery.getQueryStatement()+",sessionID="+asynchronousQuery.getTargetSessionID());
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00012);
fault.setMessage("Method not supported: asynchronousQuery");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
public void setResultsSetSize(SetResultsSetSize setResultsSetSize) throws _SQIFaultException{
try {
log.info("setResultsSetSize:resultsSetSize="+setResultsSetSize.getResultsSetSize()+",sessionID="+setResultsSetSize.getTargetSessionID());
Ticket ticket = Ticket.getTicket(setResultsSetSize.getTargetSessionID()); //throws exception if no valid ticket exists
if (setResultsSetSize.getResultsSetSize() >= 0)
ticket.setParameter("resultsSetSize", ""+setResultsSetSize.getResultsSetSize());
else {
log.debug("setResultsSetSize:resultsSetSize not supported");
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00005);
fault.setMessage("Invalid results set size");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
} catch (SessionExpiredException e) {
log.debug("setResultsSetSize: ", e);
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00013);
fault.setMessage("The given session ID is invalid");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
}
public void setMaxQueryResults(SetMaxQueryResults setMaxQueryResults)
throws _SQIFaultException{
log.info("setMaxQueryResults:maxQueryResults="+setMaxQueryResults.getMaxQueryResults()+",sessionID="+setMaxQueryResults.getTargetSessionID());
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00012);
fault.setMessage("Method not supported: setMaxQueryResults");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
public void setQueryLanguage(SetQueryLanguage setQueryLanguage) throws _SQIFaultException{
try {
log.info("setQueryLanguage:queryLanguageID="+setQueryLanguage.getQueryLanguageID()+",sessionID="+setQueryLanguage.getTargetSessionID());
Ticket ticket = Ticket.getTicket(setQueryLanguage.getTargetSessionID()); //throws exception if no valid ticket exists
if (getQueryLanguage(setQueryLanguage.getTargetSessionID()) != TranslateLanguage.UNDEFINED)
ticket.setParameter("queryLanguage", setQueryLanguage.getQueryLanguageID());
else {
log.debug("setQueryLanguage:queryLanguageID not supported");
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00011);
fault.setMessage("Query Language Not Supported");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
} catch (SessionExpiredException e) {
log.debug("setQueryLanguage: ", e);
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00013);
fault.setMessage("The given session ID is invalid");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
}
public void setSourceLocation(SetSourceLocation setSourceLocation)
throws _SQIFaultException{
log.info("setSourceLocation:sourceLocation="+setSourceLocation.getSourceLocation()+",sessionID="+setSourceLocation.getTargetSessionID());
_SQIFault fault = new _SQIFault();
fault.setSqiFaultCode(FaultCodeType.SQI_00012);
fault.setMessage("Method not supported: setSourceLocation");
_SQIFaultException exception = new _SQIFaultException();
exception.setFaultMessage(fault);
throw exception;
}
private int getQueryLanguage(String targetSessionID) {
String queryLanguage = getQueryLanguageString(targetSessionID);
return TranslateLanguage.getQueryLanguage(queryLanguage);
}
private String getQueryLanguageString(String targetSessionID) {
String queryLanguage;
try {
Ticket ticket = Ticket.getTicket(targetSessionID); //throws exception if no valid ticket exists
queryLanguage = ticket.getParameter("queryLanguage");
} catch (SessionExpiredException e) {
queryLanguage = targetSessionID;
}
return queryLanguage;
}
private String getStartResult(String targetSessionID) {
String startResult;
try {
Ticket ticket = Ticket.getTicket(targetSessionID); //throws exception if no valid ticket exists
startResult = ticket.getParameter("startResult");
} catch (SessionExpiredException e) {
startResult = targetSessionID;
}
return startResult;
}
private int getResultsFormat(String targetSessionID) {
String resultsFormat = getResultsFormatString(targetSessionID);
return TranslateResultsformat.getResultsFormat(resultsFormat);
}
private String getResultsFormatString(String targetSessionID) {
String resultsFormat;
try {
Ticket ticket = Ticket.getTicket(targetSessionID); //throws exception if no valid ticket exists
resultsFormat = ticket.getParameter("resultsFormat");
} catch (SessionExpiredException e) {
resultsFormat = targetSessionID;
}
return resultsFormat;
}
private String remoteAddr(HttpServletRequest request) {
String remoteAddr = request.getRemoteAddr();
String x;
if ((x = request.getHeader(RepositoryConstants.getInstance().HEADER_X_FORWARDED_FOR)) != null) {
remoteAddr = x;
int idx = remoteAddr.indexOf(',');
if (idx > -1) {
remoteAddr = remoteAddr.substring(0, idx);
}
}
return remoteAddr;
}
}