/*******************************************************************************
* 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.common;
import static gov.samhsa.acs.xdsb.common.XdsbDocumentType.DEPRECATE_PRIVACY_CONSENT;
import static gov.samhsa.acs.xdsb.common.XdsbMetadataGeneratorParams.HomeCommunityId_Parameter_Name;
import static gov.samhsa.acs.xdsb.common.XdsbMetadataGeneratorParams.PatientUniqueId_Parameter_Name;
import static gov.samhsa.acs.xdsb.common.XdsbMetadataGeneratorParams.XdsDocumentEntry_EntryUUID_Parameter_Name;
import static gov.samhsa.acs.xdsb.common.XdsbMetadataGeneratorParams.XdsDocumentEntry_UniqueId_Parameter_Name;
import static gov.samhsa.acs.xdsb.common.XdsbMetadataGeneratorParams.XdsSubmissionSet_UniqueId_Parameter_Name;
import gov.samhsa.acs.common.exception.DS4PException;
import gov.samhsa.acs.common.param.Params;
import gov.samhsa.acs.common.param.ParamsBuilder;
import gov.samhsa.acs.common.tool.SimpleMarshaller;
import gov.samhsa.acs.common.tool.XmlTransformer;
import java.util.Optional;
import javax.xml.bind.JAXBException;
import oasis.names.tc.ebxml_regrep.xsd.lcm._3.SubmitObjectsRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
* The Class XdsbMetadataGeneratorImpl.
*/
public class XdsbMetadataGeneratorImpl implements XdsbMetadataGenerator {
/** The Constant XDSB_METADATA_XSL_FILE_NAME_FOR_CLINICAL_DOCUMENT. */
private static final String XDSB_METADATA_XSL_FILE_NAME_FOR_CLINICAL_DOCUMENT = "XdsbMetadata.xsl";
/** The Constant XDSB_METADATA_XSL_FILE_NAME_FOR_PRIVACY_CONSENT. */
private static final String XDSB_METADATA_XSL_FILE_NAME_FOR_PRIVACY_CONSENT = "XdsbMetadataForXacmlPolicy.xsl";
/** The Constant XDSB_METADATA_XSL_FILE_NAME_FOR_PRIVACY_CONSENT_DEPRECATED. */
private static final String XDSB_METADATA_XSL_FILE_NAME_FOR_PRIVACY_CONSENT_DEPRECATED = "XdsbMetadataForXacmlPolicyDeprecated.xsl";
/** The logger. */
private final Logger logger = LoggerFactory.getLogger(this.getClass());
/** The unique oid provider. */
private final UniqueOidProvider uniqueOidProvider;
/** The document type for xdsb metadata. */
private final XdsbDocumentType documentTypeForXdsbMetadata;
/** The marshaller. */
private final SimpleMarshaller marshaller;
/** The xml transformer. */
private final XmlTransformer xmlTransformer;
/**
* Instantiates a new xdsb metadata generator impl.
*
* @param uniqueOidProvider
* the unique oid provider
* @param documentTypeForXdsbMetadata
* the document type for xdsb metadata
* @param marshaller
* the marshaller
* @param xmlTransformer
* the xml transformer
*/
public XdsbMetadataGeneratorImpl(UniqueOidProvider uniqueOidProvider,
XdsbDocumentType documentTypeForXdsbMetadata,
SimpleMarshaller marshaller, XmlTransformer xmlTransformer) {
this.uniqueOidProvider = uniqueOidProvider;
this.documentTypeForXdsbMetadata = documentTypeForXdsbMetadata;
this.marshaller = marshaller;
this.xmlTransformer = xmlTransformer;
}
/*
* (non-Javadoc)
*
* @see
* gov.samhsa.acs.xdsb.common.XdsbMetadataGenerator#generateMetadata(java
* .lang.String, java.lang.String, java.lang.String, java.lang.String)
*/
@Override
@Deprecated
public SubmitObjectsRequest generateMetadata(String document,
String homeCommunityId, String patientUniqueId, String entryUUID) {
final String metadataXml = generateMetadataXml(document,
homeCommunityId, patientUniqueId, entryUUID);
SubmitObjectsRequest submitObjectsRequest = null;
try {
submitObjectsRequest = marshaller.unmarshalFromXml(
SubmitObjectsRequest.class, metadataXml);
} catch (final JAXBException e) {
throw new DS4PException(e.toString(), e);
}
return submitObjectsRequest;
}
/*
* (non-Javadoc)
*
* @see
* gov.samhsa.acs.xdsb.common.XdsbMetadataGenerator#generateMetadataXml(
* java.lang.String, gov.samhsa.acs.common.param.Params)
*/
@Override
public String generateMetadataXml(String document, Params params) {
// find xsl
final String xslUrl = Thread.currentThread().getContextClassLoader()
.getResource(resolveXslFileName(documentTypeForXdsbMetadata))
.toString();
// setup params
final String xdsDocumentEntryUniqueId = uniqueOidProvider.getOid();
final String xdsSubmissionSetUniqueId = uniqueOidProvider.getOid();
addIfValueHasText(params, XdsDocumentEntry_UniqueId_Parameter_Name,
xdsDocumentEntryUniqueId);
addIfValueHasText(params, XdsSubmissionSet_UniqueId_Parameter_Name,
xdsSubmissionSetUniqueId);
// assert params
assertDeprecatePrivacyPolicyConditions(params);
// transform
final String metadataXml = xmlTransformer.transform(document, xslUrl,
Optional.of(params), Optional.empty());
logger.debug("metadataXml:");
logger.debug(metadataXml);
return metadataXml;
}
/*
* (non-Javadoc)
*
* @see
* gov.samhsa.acs.xdsb.common.XdsbMetadataGenerator#generateMetadataXml(
* java.lang.String, java.lang.String, java.lang.String, java.lang.String)
*/
@Deprecated
@Override
public String generateMetadataXml(String document, String homeCommunityId,
String patientUniqueId, String entryUUID) {
// find xsl
final String xslUrl = Thread.currentThread().getContextClassLoader()
.getResource(resolveXslFileName(documentTypeForXdsbMetadata))
.toString();
// setup params
final String xdsDocumentEntryUniqueId = uniqueOidProvider.getOid();
final String xdsSubmissionSetUniqueId = uniqueOidProvider.getOid();
final Params params = ParamsBuilder.withParam(
XdsDocumentEntry_UniqueId_Parameter_Name,
xdsDocumentEntryUniqueId).and(
XdsSubmissionSet_UniqueId_Parameter_Name,
xdsSubmissionSetUniqueId);
addIfValueHasText(params, HomeCommunityId_Parameter_Name,
homeCommunityId);
addIfValueHasText(params, XdsDocumentEntry_EntryUUID_Parameter_Name,
entryUUID);
addIfValueHasText(params, PatientUniqueId_Parameter_Name,
patientUniqueId);
// assert params
assertDeprecatePrivacyPolicyConditions(params);
// transform
final String metadataXml = xmlTransformer.transform(document, xslUrl,
Optional.of(params), Optional.empty());
logger.debug("metadataXml:");
logger.debug(metadataXml);
return metadataXml;
}
/**
* Adds the if value has text.
*
* @param params
* the params
* @param paramName
* the param name
* @param paramValue
* the param value
*/
private void addIfValueHasText(final Params params,
final XdsbMetadataGeneratorParams paramName, String paramValue) {
if (StringUtils.hasText(paramValue)) {
params.and(paramName, paramValue.replace("'", ""));
}
}
/**
* Assert deprecate privacy policy conditions.
*
* @param params
* the params
*/
private void assertDeprecatePrivacyPolicyConditions(Params params) {
final String errEntryUUID = "entryUUID can only be injected while deprecating a document. Current Action: "
+ documentTypeForXdsbMetadata.toString();
final String errPatientUniqueId = "patientUniqueId can only be injected while deprecating a document. Current Action: "
+ documentTypeForXdsbMetadata.toString();
if (documentTypeForXdsbMetadata.equals(DEPRECATE_PRIVACY_CONSENT)) {
Assert.hasText(
params.get(XdsDocumentEntry_EntryUUID_Parameter_Name),
errEntryUUID);
Assert.hasText(params.get(PatientUniqueId_Parameter_Name),
errPatientUniqueId);
} else {
Assert.isNull(
params.get(XdsDocumentEntry_EntryUUID_Parameter_Name),
errEntryUUID);
Assert.isNull(params.get(PatientUniqueId_Parameter_Name),
errPatientUniqueId);
}
}
/**
* Resolve xsl file name.
*
* @param documentTypeForXdsbMetadata
* the document type for xdsb metadata
* @return the string
*/
private String resolveXslFileName(
XdsbDocumentType documentTypeForXdsbMetadata) {
switch (documentTypeForXdsbMetadata) {
case CLINICAL_DOCUMENT:
return XDSB_METADATA_XSL_FILE_NAME_FOR_CLINICAL_DOCUMENT;
case PRIVACY_CONSENT:
return XDSB_METADATA_XSL_FILE_NAME_FOR_PRIVACY_CONSENT;
case DEPRECATE_PRIVACY_CONSENT:
return XDSB_METADATA_XSL_FILE_NAME_FOR_PRIVACY_CONSENT_DEPRECATED;
default:
throw new DS4PException(
"Unsupported document type for XdsbMetadataGenerator.");
}
}
}