package gov.nist.registry.ws.sq;
import gov.nist.registry.common2.exception.MetadataException;
import gov.nist.registry.common2.exception.MetadataValidationException;
import gov.nist.registry.common2.exception.XDSRegistryOutOfResourcesException;
import gov.nist.registry.common2.exception.XdsException;
import gov.nist.registry.common2.exception.XdsInternalException;
import gov.nist.registry.common2.registry.AdhocQueryResponse;
import gov.nist.registry.common2.registry.Metadata;
import gov.nist.registry.common2.registry.MetadataSupport;
import gov.nist.registry.common2.registry.Response;
import gov.nist.registry.common2.registry.storedquery.ParamParser;
import gov.nist.registry.common2.registry.storedquery.SqParams;
import gov.nist.registry.common2.registry.storedquery.StoredQuerySupport;
import org.apache.axiom.om.OMElement;
import org.openhealthtools.openxds.log.LogMessage;
import org.openhealthtools.openxds.log.LoggerException;
/**
* Generic Stored Query Factory class that is sub-classed to define a specific stored query implementation.
* The generic/specific nature relates to the underlying implementation. The key method,
* buildStoredQueryHandler(), which is to be defined in the sub-class, decides which stored queries
* are implemented and what the implementation classes are. This class provides the generic stored
* query parsing and support.
* @author bill
*
*/
abstract public class StoredQueryFactory {
/**
* Returns an object of generic type StoredQuery which implements a single stored query
* type implemented against a specific registry implementation. The sub-class that implements
* this method is specific to an implementation.
* @param sqs
* @throws MetadataValidationException
* @throws LoggerException
*/
abstract public StoredQueryFactory buildStoredQueryHandler(StoredQuerySupport sqs) throws MetadataValidationException, LoggerException;
OMElement ahqr;
boolean return_objects = false;
SqParams params;
protected String query_id;
protected LogMessage log_message = null;
protected StoredQuery storedQueryImpl;
String service_name;
boolean is_secure = false;
protected Response response = null;
public void setIsSecure(boolean is) { is_secure = is; }
public void setServiceName(String serviceName) { serviceName = service_name; }
public void setQueryId(String qid) { query_id = qid; }
public String getQueryId() {
return query_id;
}
public boolean isLeafClassReturnType() {
OMElement response_option = MetadataSupport.firstChildWithLocalName(ahqr, "ResponseOption");
if (response_option == null) return true;
String return_type = response_option.getAttributeValue(MetadataSupport.return_type_qname);
if (return_type == null || return_type.equals("") || !return_type.equals("LeafClass")) return false;
return true;
}
public StoredQueryFactory(OMElement ahqr) throws XdsException, LoggerException {
this.ahqr = ahqr;
this.params = null;
this.log_message = null;
build();
}
public StoredQueryFactory(OMElement ahqr, Response response, LogMessage log_message) throws XdsInternalException, MetadataException, XdsException, LoggerException {
this.ahqr = ahqr;
this.log_message = log_message;
this.response = response;
this.params = null;
build();
}
public StoredQueryFactory(SqParams params, Response response, LogMessage log_message) throws XdsInternalException, MetadataException, XdsException, LoggerException {
this.params = params;
this.response = response;
ahqr = null;
this.log_message = log_message;
}
public StoredQueryFactory(SqParams params) throws XdsInternalException, MetadataException, XdsException, LoggerException {
this.params = params;
ahqr = null;
this.log_message = null;
}
void build() throws XdsException, LoggerException {
OMElement response_option = MetadataSupport.firstChildWithLocalName(ahqr, "ResponseOption") ;
if (response_option == null) {
throw new XdsInternalException("Cannot find /AdhocQueryRequest/ResponseOption element");
}
String return_type = response_option.getAttributeValue(MetadataSupport.return_type_qname);
if (return_type == null) throw new XdsException("Attribute returnType not found on query request");
if (return_type.equals("LeafClass"))
return_objects = true;
else if (return_type.equals("ObjectRef"))
return_objects = false;
else
throw new MetadataException("/AdhocQueryRequest/ResponseOption/@returnType must be LeafClass or ObjectRef. Found value "
+ return_type);
OMElement adhoc_query = MetadataSupport.firstChildWithLocalName(ahqr, "AdhocQuery") ;
if (adhoc_query == null) {
throw new XdsInternalException("Cannot find /AdhocQueryRequest/AdhocQuery element");
}
ParamParser parser = new ParamParser();
params = parser.parse(ahqr);
if (log_message != null)
log_message.addOtherParam("Parameters", params.toString());
if (response == null) {
log_message.addOtherParam("XXXX Allocating new Response!!!!", "");
response = new AdhocQueryResponse(Response.version_3);
}
query_id = adhoc_query.getAttributeValue(MetadataSupport.id_qname).trim();
StoredQuerySupport sqs = new StoredQuerySupport(params, return_objects, response, log_message, is_secure);
buildStoredQueryHandler(sqs); // this goes to a sub-class that knows about a specific implementation
}
protected void setTestMessage(String sqName) {
if (log_message == null)
return;
if (service_name == null)
log_message.setTestMessage(sqName);
else
log_message.setTestMessage(service_name + " " + sqName);
}
public StoredQuery getImpl() {
return storedQueryImpl;
}
public void setLogMessage(LogMessage log_message) { this.log_message = log_message; }
public Metadata run() throws XDSRegistryOutOfResourcesException, XdsException, LoggerException {
if (storedQueryImpl == null)
throw new XdsInternalException("storedQueryImpl is null");
return storedQueryImpl.run();
}
/**
* Stored Query API call. Relies on implementation specific sub-class to implement.
* @param sqs
* @return Metadata object
* @throws XdsException
* @throws LoggerException
* @throws XDSRegistryOutOfResourcesException
*/
abstract public Metadata FindDocuments(StoredQuerySupport sqs) throws XdsException, LoggerException, XDSRegistryOutOfResourcesException;
/**
* Stored Query API call. Relies on implementation specific sub-class to implement.
* @param sqs
* @return Metadata object
* @throws XdsException
* @throws LoggerException
*/
abstract public Metadata FindFolders(StoredQuerySupport sqs) throws XdsException, LoggerException;
/**
* Stored Query API call. Relies on implementation specific sub-class to implement.
* @param sqs
* @return Metadata object
* @throws XdsException
* @throws LoggerException
*/
abstract public Metadata FindSubmissionSets(StoredQuerySupport sqs) throws XdsException, LoggerException;
/**
* Stored Query API call. Relies on implementation specific sub-class to implement.
* @param sqs
* @return Metadata object
* @throws XdsException
* @throws LoggerException
*/
abstract public Metadata GetAssociations(StoredQuerySupport sqs) throws XdsException, LoggerException;
/**
* Stored Query API call. Relies on implementation specific sub-class to implement.
* @param sqs
* @return Metadata object
* @throws XdsException
* @throws LoggerException
*/
abstract public Metadata GetDocuments(StoredQuerySupport sqs) throws XdsException, LoggerException;
/**
* Stored Query API call. Relies on implementation specific sub-class to implement.
* @param sqs
* @return Metadata object
* @throws XdsException
* @throws LoggerException
*/
abstract public Metadata GetDocumentsAndAssociations(StoredQuerySupport sqs) throws XdsException, LoggerException;
/**
* Stored Query API call. Relies on implementation specific sub-class to implement.
* @param sqs
* @return Metadata object
* @throws XdsException
* @throws LoggerException
*/
abstract public Metadata GetFolderAndContents(StoredQuerySupport sqs) throws XdsException, LoggerException;
/**
* Stored Query API call. Relies on implementation specific sub-class to implement.
* @param sqs
* @return Metadata object
* @throws XdsException
* @throws LoggerException
*/
abstract public Metadata GetFolders(StoredQuerySupport sqs) throws XdsException, LoggerException;
/**
* Stored Query API call. Relies on implementation specific sub-class to implement.
* @param sqs
* @return Metadata object
* @throws XdsException
* @throws LoggerException
*/
abstract public Metadata GetFoldersForDocument(StoredQuerySupport sqs) throws XdsException, LoggerException;
/**
* Stored Query API call. Relies on implementation specific sub-class to implement.
* @param sqs
* @return Metadata object
* @throws XdsException
* @throws LoggerException
*/
abstract public Metadata GetRelatedDocuments(StoredQuerySupport sqs) throws XdsException, LoggerException;
/**
* Stored Query API call. Relies on implementation specific sub-class to implement.
* @param sqs
* @return Metadata object
* @throws XdsException
* @throws LoggerException
*/
abstract public Metadata GetSubmissionSetAndContents(StoredQuerySupport sqs) throws XdsException, LoggerException;
/**
* Stored Query API call. Relies on implementation specific sub-class to implement.
* @param sqs
* @return Metadata object
* @throws XdsException
* @throws LoggerException
*/
abstract public Metadata GetSubmissionSets(StoredQuerySupport sqs) throws XdsException, LoggerException;
}