/******************************************************************************* * Open Behavioral Health Information Technology Architecture (OBHITA.org) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the <organization> nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ package gov.samhsa.acs.xdsb.repository.wsclient.adapter; import static gov.samhsa.acs.xdsb.common.XdsbMetadataGeneratorParams.PatientUniqueId_Parameter_Name; import static gov.samhsa.acs.xdsb.common.XdsbMetadataGeneratorParams.XdsDocumentEntry_EntryUUID_Parameter_Name; import gov.samhsa.acs.common.param.Params; import gov.samhsa.acs.common.tool.SimpleMarshaller; import gov.samhsa.acs.common.tool.XmlTransformer; import gov.samhsa.acs.common.tool.exception.SimpleMarshallerException; import gov.samhsa.acs.xdsb.common.UniqueOidProviderImpl; import gov.samhsa.acs.xdsb.common.XdsbDocumentType; import gov.samhsa.acs.xdsb.common.XdsbMetadataGenerator; import gov.samhsa.acs.xdsb.common.XdsbMetadataGeneratorImpl; import gov.samhsa.acs.xdsb.common.XdsbMetadataGeneratorParams; import gov.samhsa.acs.xdsb.repository.wsclient.XDSRepositorybWebServiceClient; import gov.samhsa.acs.xdsb.repository.wsclient.exception.XdsbRepositoryAdapterException; import ihe.iti.xds_b._2007.ProvideAndRegisterDocumentSetRequest; import ihe.iti.xds_b._2007.ProvideAndRegisterDocumentSetRequest.Document; import ihe.iti.xds_b._2007.RetrieveDocumentSetRequest; import ihe.iti.xds_b._2007.RetrieveDocumentSetRequest.DocumentRequest; import ihe.iti.xds_b._2007.RetrieveDocumentSetResponse; import java.util.List; import oasis.names.tc.ebxml_regrep.xsd.lcm._3.SubmitObjectsRequest; import oasis.names.tc.ebxml_regrep.xsd.rs._3.RegistryResponse; import org.springframework.util.Assert; /** * The Class XdsbRepositoryAdapter. */ public class XdsbRepositoryAdapter { /** The Constant EMPTY_XML_DOCUMENT. */ public static final String EMPTY_XML_DOCUMENT = "<empty/>"; // Services /** The xdsb repository. */ private XDSRepositorybWebServiceClient xdsbRepository; /** The marshaller. */ private SimpleMarshaller marshaller; /** The xml transformer. */ private XmlTransformer xmlTransformer; /** The response filter. */ private RetrieveDocumentSetResponseFilter responseFilter; /** * Instantiates a new xdsb repository adapter. */ public XdsbRepositoryAdapter() { } /** * Instantiates a new xdsb repository adapter. * * @param xdsbRepository * the xdsb repository * @param marshaller * the marshaller * @param responseFilter * the response filter * @param xmlTransformer * the xml transformer */ public XdsbRepositoryAdapter(XDSRepositorybWebServiceClient xdsbRepository, SimpleMarshaller marshaller, RetrieveDocumentSetResponseFilter responseFilter, XmlTransformer xmlTransformer) { this.xdsbRepository = xdsbRepository; this.marshaller = marshaller; this.responseFilter = responseFilter; this.xmlTransformer = xmlTransformer; } /** * Provide and register document set request (direct call to the XDS.b * repository service). * * @param provideAndRegisterDocumentSetRequest * the provide and register document set request * @return the registry response */ public RegistryResponse provideAndRegisterDocumentSet( ProvideAndRegisterDocumentSetRequest provideAndRegisterDocumentSetRequest) { return xdsbRepository .provideAndRegisterDocumentSet(provideAndRegisterDocumentSetRequest); } /** * Provide and register document set request (indirect call to the XDS.b * repository service with a simplified interface). * * @param documentXmlString * the document xml string (Pass * XdsbRepositoryAdapter.EMPTY_XML_DOCUMENT if deprecating a * document. Otherwise, pass the actual document to be provided.) * @param homeCommunityId * the home community id (May pass null if deprecating a * document.) * @param documentTypeForXdsbMetadata * the document type for xdsb metadata * @param patientUniqueId * the patient unique id (Pass this only if deprecating a * document. Otherwise, pass null.) * @param entryUUID * the entry uuid (Pass this only if deprecating a document. * Otherwise, pass null.) * @return the registry response * @throws XdsbRepositoryAdapterException * the xdsb repository adapter exception */ @Deprecated public RegistryResponse provideAndRegisterDocumentSet( String documentXmlString, String homeCommunityId, XdsbDocumentType documentTypeForXdsbMetadata, String patientUniqueId, String entryUUID) throws XdsbRepositoryAdapterException { switch (documentTypeForXdsbMetadata) { case DEPRECATE_PRIVACY_CONSENT: final String messageDeprecate = "patientUniqueId and entryUUID must be injected to deprecate a document."; Assert.notNull(patientUniqueId, messageDeprecate); Assert.notNull(entryUUID, messageDeprecate); break; default: final String messageNotDeprecate = "patientUniqueId and entryUUID can only be injected to deprecate a document."; Assert.isNull(patientUniqueId, messageNotDeprecate); Assert.isNull(entryUUID, messageNotDeprecate); break; } final String submitObjectRequestXml = generateMetadata( documentXmlString, homeCommunityId, documentTypeForXdsbMetadata, patientUniqueId, entryUUID); SubmitObjectsRequest submitObjectRequest; try { submitObjectRequest = marshaller.unmarshalFromXml( SubmitObjectsRequest.class, submitObjectRequestXml); } catch (final SimpleMarshallerException e) { throw new XdsbRepositoryAdapterException(e); } Document document = null; if (!documentXmlString.equals(EMPTY_XML_DOCUMENT)) { document = createDocument(documentXmlString); } final ProvideAndRegisterDocumentSetRequest request = createProvideAndRegisterDocumentSetRequest( submitObjectRequest, document); final RegistryResponse response = provideAndRegisterDocumentSet(request); return response; } /** * Provide and register document set. * * @param documentXmlString * the document xml string * @param documentTypeForXdsbMetadata * the document type for xdsb metadata * @param params * the params * @return the registry response * @throws XdsbRepositoryAdapterException * the xdsb repository adapter exception */ public RegistryResponse provideAndRegisterDocumentSet( String documentXmlString, XdsbDocumentType documentTypeForXdsbMetadata, Params params) throws XdsbRepositoryAdapterException { switch (documentTypeForXdsbMetadata) { case DEPRECATE_PRIVACY_CONSENT: final String messageDeprecate = "patientUniqueId and entryUUID must be injected to deprecate a document."; Assert.notNull( getParamValue(params, PatientUniqueId_Parameter_Name), messageDeprecate); Assert.notNull( getParamValue(params, XdsDocumentEntry_EntryUUID_Parameter_Name), messageDeprecate); break; default: final String messageNotDeprecate = "patientUniqueId and entryUUID can only be injected to deprecate a document."; Assert.isNull( getParamValue(params, PatientUniqueId_Parameter_Name), messageNotDeprecate); Assert.isNull( getParamValue(params, XdsDocumentEntry_EntryUUID_Parameter_Name), messageNotDeprecate); break; } final String submitObjectRequestXml = generateMetadata( documentXmlString, documentTypeForXdsbMetadata, params); SubmitObjectsRequest submitObjectRequest; try { submitObjectRequest = marshaller.unmarshalFromXml( SubmitObjectsRequest.class, submitObjectRequestXml); } catch (final SimpleMarshallerException e) { throw new XdsbRepositoryAdapterException(e); } Document document = null; if (!documentXmlString.equals(EMPTY_XML_DOCUMENT)) { document = createDocument(documentXmlString); } final ProvideAndRegisterDocumentSetRequest request = createProvideAndRegisterDocumentSetRequest( submitObjectRequest, document); final RegistryResponse response = provideAndRegisterDocumentSet(request); return response; } /** * Retrieve document set. * * @param docRequest * the doc request * @return the retrieve document set response */ public RetrieveDocumentSetResponse retrieveDocumentSet( DocumentRequest docRequest) { final RetrieveDocumentSetRequest request = createRetrieveDocumentSetRequest(docRequest); final RetrieveDocumentSetResponse retrieveDocumentSetResponse = retrieveDocumentSet(request); return retrieveDocumentSetResponse; } /** * Retrieve document set. * * @param docRequest * the doc request * @return the retrieve document set response */ public RetrieveDocumentSetResponse retrieveDocumentSet( List<DocumentRequest> docRequest) { final RetrieveDocumentSetRequest request = createRetrieveDocumentSetRequest(docRequest); final RetrieveDocumentSetResponse retrieveDocumentSetResponse = retrieveDocumentSet(request); return retrieveDocumentSetResponse; } /** * Retrieve document set request (direct call to XDS.b repository service). * * @param request * the request * @return the retrieve document set response */ public RetrieveDocumentSetResponse retrieveDocumentSet( RetrieveDocumentSetRequest request) { return xdsbRepository.retrieveDocumentSet(request); } /** * Retrieve document set. * * @param request * the request * @param patientId * the patient id * @param authorNPI * the author npi * @return the retrieve document set response * @throws XdsbRepositoryAdapterException * the xdsb repository adapter exception */ public RetrieveDocumentSetResponse retrieveDocumentSet( RetrieveDocumentSetRequest request, String patientId, String authorNPI) throws XdsbRepositoryAdapterException { try { RetrieveDocumentSetResponse response = xdsbRepository .retrieveDocumentSet(request); response = responseFilter.filterByPatientAndAuthor(response, patientId, authorNPI); return response; } catch (final Throwable t) { throw new XdsbRepositoryAdapterException(t); } } /** * Retrieve document set request (indirect call to the XDS.b repository * service with a simplified interface). * * @param documentUniqueId * the document unique id * @param repositoryId * the repository id * @return the retrieve document set response */ public RetrieveDocumentSetResponse retrieveDocumentSet( String documentUniqueId, String repositoryId) { final RetrieveDocumentSetRequest request = createRetrieveDocumentSetRequest( documentUniqueId, repositoryId); final RetrieveDocumentSetResponse retrieveDocumentSetResponse = retrieveDocumentSet(request); return retrieveDocumentSetResponse; } /** * Creates the document. * * @param documentXmlString * the document xml string * @return the document */ Document createDocument(String documentXmlString) { final Document document = new Document(); document.setId("Document01"); document.setValue(documentXmlString.getBytes()); return document; } /** * Creates the provide and register document set request. * * @param submitObjectRequest * the submit object request * @param document * the document * @return the provide and register document set request */ ProvideAndRegisterDocumentSetRequest createProvideAndRegisterDocumentSetRequest( SubmitObjectsRequest submitObjectRequest, Document document) { final ProvideAndRegisterDocumentSetRequest request = new ProvideAndRegisterDocumentSetRequest(); request.setSubmitObjectsRequest(submitObjectRequest); if (document != null) { request.getDocument().add(document); } return request; } /** * Creates the retrieve document set request. * * @param docRequest * the doc request * @return the retrieve document set request */ RetrieveDocumentSetRequest createRetrieveDocumentSetRequest( DocumentRequest docRequest) { final RetrieveDocumentSetRequest request = new RetrieveDocumentSetRequest(); request.getDocumentRequest().add(docRequest); return request; } /** * Creates the retrieve document set request. * * @param docRequest * the doc request * @return the retrieve document set request */ RetrieveDocumentSetRequest createRetrieveDocumentSetRequest( List<DocumentRequest> docRequest) { final RetrieveDocumentSetRequest request = new RetrieveDocumentSetRequest(); request.getDocumentRequest().addAll(docRequest); return request; } /** * Creates the retrieve document set request. * * @param documentUniqueId * the document unique id * @param repositoryId * the repository id * @return the retrieve document set request */ RetrieveDocumentSetRequest createRetrieveDocumentSetRequest( String documentUniqueId, String repositoryId) { final RetrieveDocumentSetRequest request = new RetrieveDocumentSetRequest(); final DocumentRequest documentRequest = new DocumentRequest(); documentRequest.setDocumentUniqueId(documentUniqueId); documentRequest.setRepositoryUniqueId(repositoryId); request.getDocumentRequest().add(documentRequest); return request; } /** * Creates the xdsb metadata generator. * * @param documentTypeForXdsbMetadata * the document type for xdsb metadata * @return the xdsb metadata generator impl */ XdsbMetadataGeneratorImpl createXdsbMetadataGenerator( XdsbDocumentType documentTypeForXdsbMetadata) { return new XdsbMetadataGeneratorImpl(new UniqueOidProviderImpl(), documentTypeForXdsbMetadata, this.marshaller, xmlTransformer); } /** * Generate metadata. * * @param documentXmlString * the document xml string * @param homeCommunityId * the home community id * @param documentTypeForXdsbMetadata * the document type for xdsb metadata * @param patientUniqueId * the patient unique id * @param entryUUID * the entry uuid * @return the string */ @Deprecated String generateMetadata(String documentXmlString, String homeCommunityId, XdsbDocumentType documentTypeForXdsbMetadata, String patientUniqueId, String entryUUID) { final XdsbMetadataGenerator xdsbMetadataGenerator = createXdsbMetadataGenerator(documentTypeForXdsbMetadata); final String metadata = xdsbMetadataGenerator.generateMetadataXml( documentXmlString, homeCommunityId, patientUniqueId, entryUUID); return metadata; } /** * Generate metadata. * * @param documentXmlString * the document xml string * @param documentTypeForXdsbMetadata * the document type for xdsb metadata * @param params * the params * @return the string */ String generateMetadata(String documentXmlString, XdsbDocumentType documentTypeForXdsbMetadata, Params params) { final XdsbMetadataGenerator xdsbMetadataGenerator = createXdsbMetadataGenerator(documentTypeForXdsbMetadata); final String metadata = xdsbMetadataGenerator.generateMetadataXml( documentXmlString, params); return metadata; } /** * Gets the param value. * * @param params * the params * @param paramKey * the param key * @return the param value */ private String getParamValue(Params params, XdsbMetadataGeneratorParams paramKey) { return params.get(paramKey); } }