package gov.nist.registry.ws.sq.ebxmlrr21;
import gov.nist.registry.common2.exception.MetadataException;
import gov.nist.registry.common2.exception.MetadataValidationException;
import gov.nist.registry.common2.exception.XdsException;
import gov.nist.registry.common2.exception.XdsInternalException;
import gov.nist.registry.common2.registry.Metadata;
import gov.nist.registry.common2.registry.MetadataParser;
import gov.nist.registry.common2.registry.MetadataSupport;
import gov.nist.registry.common2.registry.SQCodedTerm;
import gov.nist.registry.common2.registry.storedquery.StoredQuerySupport;
import gov.nist.registry.ws.sq.GetSubmissionSetAndContents;
import java.util.ArrayList;
import java.util.List;
import org.apache.axiom.om.OMElement;
import org.openhealthtools.openxds.log.LoggerException;
/**
* Implementation specific class for FindDocuments stored query.
* All the logic is in the runImplementation() method.
* @author bill
*
*/
public class EbXML21GetSubmissionSetAndContents extends GetSubmissionSetAndContents {
EbXML21QuerySupport eb;
/**
* Constructor
* @param sqs
* @throws MetadataValidationException
*/
public EbXML21GetSubmissionSetAndContents(StoredQuerySupport sqs) {
super(sqs);
eb = new EbXML21QuerySupport(sqs);
}
/**
* Main method, runs query logic
* @return Metadata
* @throws MetadataException
* @throws XdsException
*/
public Metadata runImplementation() throws XdsException, LoggerException,
MetadataException, MetadataValidationException,
XdsInternalException {
Metadata metadata;
if (ss_uuid != null) {
// starting from uuid
OMElement x = eb.getRpById(ss_uuid, "urn:uuid:96fdda7c-d067-4183-912e-bf5ee74998a8");
metadata = MetadataParser.parseNonSubmission(x);
if (sqs.return_leaf_class && metadata.getSubmissionSets().size() != 1)
return metadata;
if (!sqs.return_leaf_class && metadata.getObjectRefs().size() != 1)
return metadata;
} else {
// starting from uniqueid
OMElement x = eb.getRpByUid(ss_uid, "urn:uuid:96fdda7c-d067-4183-912e-bf5ee74998a8");
metadata = MetadataParser.parseNonSubmission(x);
if (sqs.return_leaf_class && metadata.getSubmissionSets().size() != 1)
return metadata;
if (!sqs.return_leaf_class && metadata.getObjectRefs().size() != 1)
return metadata;
if (sqs.return_leaf_class)
ss_uuid = metadata.getSubmissionSet().getAttributeValue(MetadataSupport.id_qname);
else
ss_uuid = metadata.getObjectRefs().get(0).getAttributeValue(MetadataSupport.id_qname);
}
// ss_uuid has now been set
SQCodedTerm conf_codes = sqs.params.getCodedParm("$XDSDocumentEntryConfidentialityCode");
SQCodedTerm format_codes = sqs.params.getCodedParm("$XDSDocumentEntryFormatCode");
OMElement doc_metadata = eb.getSsDocs(ss_uuid, format_codes, conf_codes, object_type);
metadata.addMetadata(doc_metadata);
OMElement fol_metadata = eb.getSsFolders(ss_uuid);
metadata.addMetadata(fol_metadata);
List<String> ssUuids = new ArrayList<String>();
ssUuids.add(ss_uuid);
OMElement assoc1_metadata = eb.getRegistryPackageAssocs(ssUuids);
if (assoc1_metadata != null)
metadata.addMetadata(assoc1_metadata);
List<String> folder_ids = metadata.getFolderIds();
OMElement assoc2_metadata = eb.getRegistryPackageAssocs(folder_ids);
if (assoc2_metadata != null)
metadata.addMetadata(assoc2_metadata);
//ArrayList<String> ss_and_folder_ids = new ArrayList<String>(folder_ids);
//ss_and_folder_ids.add(ss_uuid);
metadata.rmDuplicates();
// some document may have been filtered out, remove the unnecessary Associations
// first collect all the content ids that we want to keep...
List<String> content_ids = new ArrayList<String>();
content_ids.addAll(metadata.getSubmissionSetIds());
content_ids.addAll(metadata.getExtrinsicObjectIds());
content_ids.addAll(metadata.getFolderIds());
content_ids.addAll(metadata.getObjectRefIds());
// add in Associations that link the above parts
content_ids.addAll(metadata.getIds(metadata.getAssociationsInclusive(content_ids)));
// Assocs can link to Assocs to so repeat
content_ids.addAll(metadata.getIds(metadata.getAssociationsInclusive(content_ids)));
// ... Now, filter out all metadata that isn't in this id list
metadata.filter(content_ids);
return metadata;
}
}