package gov.hhs.fha.nhinc.document; import gov.hhs.fha.nhinc.nhinclib.NullChecker; import gov.hhs.fha.nhinc.repository.model.Document; import gov.hhs.fha.nhinc.repository.model.DocumentQueryParams; import gov.hhs.fha.nhinc.repository.service.DocumentService; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import ihe.iti.xds_b._2007.RetrieveDocumentSetRequestType.DocumentRequest; import ihe.iti.xds_b._2007.RetrieveDocumentSetResponseType.DocumentResponse; import oasis.names.tc.ebxml_regrep.xsd.rs._3.RegistryResponseType; /** * Helper class for the document repository service. * * @author Neil Webb */ public class DocumentRepositoryHelper { public static final String XDS_RETRIEVE_RESPONSE_STATUS_FAILURE = "urn:oasis:names:tc:ebxml-regrep:ResponseStatusType:Failure"; public static final String XDS_RETRIEVE_RESPONSE_STATUS_SUCCESS = "urn:oasis:names:tc:ebxml-regrep:ResponseStatusType:Success"; private static Log log = LogFactory.getLog(DocumentRepositoryHelper.class); private static final String REPOSITORY_UNIQUE_ID = "1"; /** * Perform a document retrieve on the document repository. * * @param body Message containing docurment retrieve parameters * @return Document retrieve response message. */ public ihe.iti.xds_b._2007.RetrieveDocumentSetResponseType documentRepositoryRetrieveDocumentSet(ihe.iti.xds_b._2007.RetrieveDocumentSetRequestType body) { ihe.iti.xds_b._2007.RetrieveDocumentSetResponseType response = new ihe.iti.xds_b._2007.RetrieveDocumentSetResponseType(); if((body != null) && (body.getDocumentRequest() != null) && (!body.getDocumentRequest().isEmpty())) { String homeCommunityId = null; List documentUniqueIds = new ArrayList(); List repositoryUniqueIds = new ArrayList(); List olDocRequest = body.getDocumentRequest(); Iterator iterDocRequest = olDocRequest.iterator(); while (iterDocRequest.hasNext()) { DocumentRequest oDocRequest = iterDocRequest.next(); // Home Community //---------------- if ((homeCommunityId == null) && (oDocRequest.getHomeCommunityId() != null) && (oDocRequest.getHomeCommunityId().length() > 0)) { homeCommunityId = oDocRequest.getHomeCommunityId(); } // Document Uniqiue ID //-------------------- if ((oDocRequest.getDocumentUniqueId() != null) && (oDocRequest.getDocumentUniqueId().length() > 0)) { documentUniqueIds.add(oDocRequest.getDocumentUniqueId()); } // Repository Unique ID //---------------------- if ((oDocRequest.getRepositoryUniqueId() != null) && (oDocRequest.getRepositoryUniqueId().length() > 0)) { repositoryUniqueIds.add(oDocRequest.getRepositoryUniqueId()); } } // while (iterDocRequest.hasNext()) if((!documentUniqueIds.isEmpty()) && (!repositoryUniqueIds.isEmpty())) { boolean repositoryIdMatched = true; for(String repositoryUniqueId : repositoryUniqueIds) { if(!REPOSITORY_UNIQUE_ID.equals(repositoryUniqueId)) { repositoryIdMatched = false; log.warn("Document repository message not processed due to repository " + " unique id mismatch. Expected: " + REPOSITORY_UNIQUE_ID + ", found: " + repositoryUniqueId); } } if(repositoryIdMatched) { DocumentQueryParams params = new DocumentQueryParams(); params.setDocumentUniqueId(documentUniqueIds); DocumentService service = new DocumentService(); List docs = service.documentQuery(params); loadDocumentResponses(response, docs, homeCommunityId); } } } return response; } private void loadDocumentResponses(ihe.iti.xds_b._2007.RetrieveDocumentSetResponseType response, List docs, String homeCommunityId) { if(response != null) { String responseStatus = XDS_RETRIEVE_RESPONSE_STATUS_FAILURE; List olDocResponse = response.getDocumentResponse(); RegistryResponseType registryResponse = new oasis.names.tc.ebxml_regrep.xsd.rs._3.ObjectFactory().createRegistryResponseType(); response.setRegistryResponse(registryResponse); if((docs != null) && (!docs.isEmpty())) { for(Document doc : docs) { DocumentResponse oDocResponse = new DocumentResponse(); boolean bHasData = false; // Home Community Id //------------------- oDocResponse.setHomeCommunityId(homeCommunityId); // Repository Unique Id //---------------------- oDocResponse.setRepositoryUniqueId(REPOSITORY_UNIQUE_ID); // Document Unique ID //-------------------- if(NullChecker.isNotNullish(doc.getDocumentUniqueId())) { oDocResponse.setDocumentUniqueId(doc.getDocumentUniqueId()); log.info("Document unique id: " + doc.getDocumentUniqueId()); bHasData = true; } // Mime Type //---------- if(NullChecker.isNotNullish(doc.getMimeType())) { oDocResponse.setMimeType(doc.getMimeType()); log.info("Mime type: " + doc.getMimeType()); bHasData = true; } // Document //--------- if((doc.getRawData() != null) && (doc.getRawData().length > 0)) { oDocResponse.setDocument(doc.getRawData()); log.info("Document data: " + doc.getRawData()); bHasData = true; } if (bHasData) { olDocResponse.add(oDocResponse); responseStatus = XDS_RETRIEVE_RESPONSE_STATUS_SUCCESS; } } } else { log.info("loadDocumentResponses - no response messages returned."); } registryResponse.setStatus(responseStatus); } else { log.info("loadDocumentResponses - response object was null"); } } }