package gov.va.ds4p.cas.providers;
import gov.va.ds4p.policy.reference.Addr;
import gov.va.ds4p.policy.reference.AssignedAuthor;
import gov.va.ds4p.policy.reference.AssignedAuthoringDevice;
import gov.va.ds4p.policy.reference.AssignedPerson;
import gov.va.ds4p.policy.reference.DefaultCustodianInfo;
import gov.va.ds4p.policy.reference.DefaultPatientDemographics;
import gov.va.ds4p.policy.reference.ManufacturingModelName;
import gov.va.ds4p.policy.reference.Name;
import gov.va.ds4p.policy.reference.OrganizationConsentPolicyInfo;
import gov.va.ds4p.policy.reference.OrganizationPolicy;
import gov.va.ds4p.policy.reference.SoftwareName;
import java.io.PrintStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.namespace.QName;
import org.apache.commons.codec.binary.Base64;
import org.hl7.v3.AD;
import org.hl7.v3.ActClinicalDocument;
import org.hl7.v3.ActRelationshipHasComponent;
import org.hl7.v3.AdxpCity;
import org.hl7.v3.AdxpCountry;
import org.hl7.v3.AdxpCounty;
import org.hl7.v3.AdxpPostalCode;
import org.hl7.v3.AdxpState;
import org.hl7.v3.AdxpStreetAddressLine;
import org.hl7.v3.BinaryDataEncoding;
import org.hl7.v3.CD;
import org.hl7.v3.CE;
import org.hl7.v3.CS;
import org.hl7.v3.ED;
import org.hl7.v3.EnFamily;
import org.hl7.v3.EnGiven;
import org.hl7.v3.II;
import org.hl7.v3.IVLTS;
import org.hl7.v3.IVXBTS;
import org.hl7.v3.ON;
import org.hl7.v3.ObjectFactory;
import org.hl7.v3.PN;
import org.hl7.v3.POCDMT000040Act;
import org.hl7.v3.POCDMT000040AssignedAuthor;
import org.hl7.v3.POCDMT000040AssignedCustodian;
import org.hl7.v3.POCDMT000040AssignedEntity;
import org.hl7.v3.POCDMT000040Author;
import org.hl7.v3.POCDMT000040AuthoringDevice;
import org.hl7.v3.POCDMT000040ClinicalDocument;
import org.hl7.v3.POCDMT000040Component2;
import org.hl7.v3.POCDMT000040Component3;
import org.hl7.v3.POCDMT000040Criterion;
import org.hl7.v3.POCDMT000040Custodian;
import org.hl7.v3.POCDMT000040CustodianOrganization;
import org.hl7.v3.POCDMT000040DocumentationOf;
import org.hl7.v3.POCDMT000040Entry;
import org.hl7.v3.POCDMT000040EntryRelationship;
import org.hl7.v3.POCDMT000040InformationRecipient;
import org.hl7.v3.POCDMT000040InfrastructureRootTypeId;
import org.hl7.v3.POCDMT000040IntendedRecipient;
import org.hl7.v3.POCDMT000040LegalAuthenticator;
import org.hl7.v3.POCDMT000040ObservationMedia;
import org.hl7.v3.POCDMT000040Organization;
import org.hl7.v3.POCDMT000040Participant2;
import org.hl7.v3.POCDMT000040Patient;
import org.hl7.v3.POCDMT000040PatientRole;
import org.hl7.v3.POCDMT000040Person;
import org.hl7.v3.POCDMT000040Precondition;
import org.hl7.v3.POCDMT000040RecordTarget;
import org.hl7.v3.POCDMT000040Section;
import org.hl7.v3.POCDMT000040ServiceEvent;
import org.hl7.v3.POCDMT000040StructuredBody;
import org.hl7.v3.SC;
import org.hl7.v3.ST;
import org.hl7.v3.TEL;
import org.hl7.v3.TS;
import org.hl7.v3.XActClassDocumentEntryAct;
import org.hl7.v3.XActRelationshipEntry;
import org.hl7.v3.XActRelationshipEntryRelationship;
import org.hl7.v3.XDocumentActMood;
import org.hl7.v3.XInformationRecipient;
import org.hl7.v3.XInformationRecipientRole;
public class ClinicalDocumentProvider
{
private POCDMT000040ClinicalDocument clinicalDocument;
public POCDMT000040ClinicalDocument createClinicalDocumentFromXMLString(String xml)
{
POCDMT000040ClinicalDocument obj = null;
try {
JAXBContext context = JAXBContext.newInstance(new Class[] { POCDMT000040ClinicalDocument.class });
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader sr = new StringReader(xml);
Object o = unmarshaller.unmarshal(sr);
JAXBElement element = (JAXBElement)o;
obj = (POCDMT000040ClinicalDocument)element.getValue();
}
catch (Exception e)
{
e.printStackTrace();
}
return obj;
}
private String createClinicalDocumentStringFromObject(POCDMT000040ClinicalDocument doc) throws JAXBException
{
String res = "";
ObjectFactory factory = new ObjectFactory();
JAXBElement element = factory.createClinicalDocument(doc);
try {
JAXBContext context = JAXBContext.newInstance(new Class[] { POCDMT000040ClinicalDocument.class });
Marshaller marshaller = context.createMarshaller();
StringWriter sw = new StringWriter();
marshaller.setProperty("jaxb.formatted.output", Boolean.valueOf(true));
marshaller.setProperty("jaxb.schemaLocation", "http://www.w3.org/2001/XMLSchema-instance");
marshaller.marshal(element, sw);
res = sw.toString();
}
catch (Exception ex) {
ex.printStackTrace();
}
return res;
}
public String createConsentDirective(OrganizationPolicy orgPolicy, String patientName, String patientId, String patientIdType, String patientBirthDate, String patientGender, String authorization, String intendedPOU, List<String> allowedPOU, String primaryRecipient, List<String> allowedRecipients, List<String> maskingActions, List<String> redactActions, String pdfstring, String xacml)
{
String res = "";
try {
this.clinicalDocument = new POCDMT000040ClinicalDocument();
this.clinicalDocument.setClassCode(ActClinicalDocument.DOCCLIN);
this.clinicalDocument.getMoodCode().add("EVN");
CS realmCode = new CS();
realmCode.setCode("US");
this.clinicalDocument.getRealmCode().add(realmCode);
POCDMT000040InfrastructureRootTypeId cId = new POCDMT000040InfrastructureRootTypeId();
cId.setExtension("09230");
cId.setRoot("2.16.840.1.113883.1.3");
this.clinicalDocument.setTypeId(cId);
List ids = getDocumentTemplates();
Iterator iter = ids.iterator();
while (iter.hasNext()) {
II i = (II)iter.next();
this.clinicalDocument.getTemplateId().add(i);
}
II idV = new II();
idV.setExtension("221");
idV.setRoot("1.3.6.4.1.4.1.2835.888888");
this.clinicalDocument.setId(idV);
this.clinicalDocument.setCode(getDocumentCode());
this.clinicalDocument.setTitle(getDocumentTitle());
this.clinicalDocument.setEffectiveTime(getDocumentEffectiveDate());
this.clinicalDocument.setConfidentialityCode(getDocumentConfidentialityCode(orgPolicy, maskingActions, redactActions));
List<POCDMT000040RecordTarget> recordTarget = getDocumentRecordTargets(patientId, patientName, patientGender, patientBirthDate, orgPolicy);
this.clinicalDocument.getRecordTarget().add(recordTarget.get(0));
POCDMT000040Author author = getDocumentAuthor(orgPolicy);
this.clinicalDocument.getAuthor().add(author);
POCDMT000040Custodian custodian = getDocumentCustodian(orgPolicy);
this.clinicalDocument.setCustodian(custodian);
POCDMT000040InformationRecipient recipient = getDocumentInformationRecipient(primaryRecipient);
this.clinicalDocument.getInformationRecipient().add(recipient);
POCDMT000040LegalAuthenticator authenticator = getDocumentLegalAuthenticator(orgPolicy, patientName);
this.clinicalDocument.setLegalAuthenticator(authenticator);
POCDMT000040DocumentationOf docOf = getDocumentDocumentOf();
this.clinicalDocument.getDocumentationOf().add(docOf);
POCDMT000040Component2 comp = getDocumentComponent2(getDocumentConfidentialityCode(orgPolicy, maskingActions, redactActions), intendedPOU, authorization, orgPolicy, maskingActions, redactActions, pdfstring, xacml);
this.clinicalDocument.setComponent(comp);
try {
res = createClinicalDocumentStringFromObject(this.clinicalDocument);
}
catch (Exception tEx) {
res = tEx.getMessage();
}
}
catch (Exception ex)
{
System.out.println(ex.getMessage());
ex.printStackTrace();
}
return res;
}
private String getCurrentTime() {
String res = "";
Date dt = new Date();
SimpleDateFormat sdt = new SimpleDateFormat("yyyyMMddhhmmss");
try {
res = sdt.format(dt);
}
catch (Exception ex2) {
ex2.printStackTrace();
}
return res;
}
private String getCurrentDate() {
String res = "";
Date dt = new Date();
SimpleDateFormat sdt = new SimpleDateFormat("yyyyMMdd");
try {
res = sdt.format(dt);
}
catch (Exception ex2) {
ex2.printStackTrace();
}
return res;
}
private String getDefaultEndDate() {
String res = "";
Calendar cal = Calendar.getInstance();
cal.add(1, 5);
Date dt = cal.getTime();
SimpleDateFormat sdt = new SimpleDateFormat("yyyyMMdd");
try {
res = sdt.format(dt);
}
catch (Exception ex2) {
ex2.printStackTrace();
}
return res;
}
private POCDMT000040InfrastructureRootTypeId getDocumentInfrastructureTypeId() {
POCDMT000040InfrastructureRootTypeId cId = new POCDMT000040InfrastructureRootTypeId();
cId.setExtension("09230");
cId.setRoot("2.16.840.1.113883.1.3");
return cId;
}
private List<II> getDocumentTemplates() {
List mList = new ArrayList();
II t1 = new II();
II t2 = new II();
t1.setRoot("2.16.840.1.113883.10.20.3");
t2.setRoot("2.16.840.1.113883.3.445.1");
mList.add(t1);
mList.add(t2);
return mList;
}
private II getDocumentId() {
II i = new II();
i.setRoot("1.3.6.4.1.4.1.2835.888888");
i.setExtension("221");
return i;
}
private CE getDocumentCode() {
CE docCode = new CE();
docCode.setDisplayName("Privacy Policy Acknowledgement Document");
docCode.setCodeSystemName("LOINC");
docCode.setCodeSystem("2.16.840.1.113883.6.1");
docCode.setCode("57016-8");
return docCode;
}
private ST getDocumentTitle() {
ST st = new ST();
st.setMediaType("text/plain");
st.setRepresentation(BinaryDataEncoding.TXT);
st.getContent().add(new String("Privacy Consent Authorization"));
return st;
}
private TS getDocumentEffectiveDate() {
TS ts = new TS();
ts.setValue(getCurrentTime());
return ts;
}
private CE getDocumentConfidentialityCode(OrganizationPolicy orgPolicy, List<String> maskingActions, List<String> redactActions) {
CE conf = new CE();
conf.setCodeSystem("2.16.840.1.113883.5.25");
conf.setCodeSystemName("Confidentiality");
conf.setCodeSystemVersion("3.0");
String law = orgPolicy.getUsPrivacyLaw();
if ((law.equals("42CFRPart2")) || (law.equals("Title38Section7332")) || (!maskingActions.isEmpty()) || (!redactActions.isEmpty())) {
conf.setCode("R");
conf.setDisplayName("R (restricted)");
}
else {
conf.setCode("N");
conf.setDisplayName("N (normal)");
}
return conf;
}
private List<POCDMT000040RecordTarget> getDocumentRecordTargets(String patientId, String patientName, String patientGender, String patientBirthDate, OrganizationPolicy orgPolicy) {
List targets = new ArrayList();
POCDMT000040RecordTarget target = new POCDMT000040RecordTarget();
II uniqueId = new II();
uniqueId.setExtension(patientId);
uniqueId.setRoot(orgPolicy.getHomeCommunityId());
POCDMT000040Patient patient = new POCDMT000040Patient();
CE gender = new CE();
gender.setCode(patientGender);
patient.setAdministrativeGenderCode(gender);
TS birthtime = new TS();
birthtime.setValue(patientBirthDate);
patient.setBirthTime(birthtime);
PN patientname = new PN();
StringTokenizer st = new StringTokenizer(patientName);
String first = st.nextToken();
String last = st.nextToken();
patientname.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "given"), EnGiven.class, first));
patientname.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "family"), EnFamily.class, last));
patient.getName().add(patientname);
AD patientaddr = new AD();
patientaddr.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "streetAddressLine"), AdxpStreetAddressLine.class, orgPolicy.getOrganizationConsentPolicyInfo().getDefaultPatientDemographics().getAddr().getStreetAddressLine()));
patientaddr.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "city"), AdxpCity.class, orgPolicy.getOrganizationConsentPolicyInfo().getDefaultPatientDemographics().getAddr().getCity()));
patientaddr.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "state"), AdxpState.class, orgPolicy.getOrganizationConsentPolicyInfo().getDefaultPatientDemographics().getAddr().getState()));
patientaddr.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "postalCode"), AdxpPostalCode.class, orgPolicy.getOrganizationConsentPolicyInfo().getDefaultPatientDemographics().getAddr().getPostalCode()));
patientaddr.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "county"), AdxpCounty.class, orgPolicy.getOrganizationConsentPolicyInfo().getDefaultPatientDemographics().getAddr().getCounty()));
patientaddr.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "country"), AdxpCountry.class, orgPolicy.getOrganizationConsentPolicyInfo().getDefaultPatientDemographics().getAddr().getCountry()));
POCDMT000040PatientRole patientRole = new POCDMT000040PatientRole();
patientRole.getId().add(uniqueId);
patientRole.getAddr().add(patientaddr);
patientRole.setPatient(patient);
target.setPatientRole(patientRole);
targets.add(target);
return targets;
}
private POCDMT000040Author getDocumentAuthor(OrganizationPolicy orgPolicy) {
POCDMT000040Author author = new POCDMT000040Author();
POCDMT000040InfrastructureRootTypeId authortemplate = new POCDMT000040InfrastructureRootTypeId();
authortemplate.setRoot("2.16.840.1.113883.3.445.2");
author.setTypeId(authortemplate);
TS authortime = new TS();
authortime.setValue(getCurrentTime());
author.setTime(authortime);
POCDMT000040AssignedAuthor assigned = new POCDMT000040AssignedAuthor();
POCDMT000040InfrastructureRootTypeId assignedTemp = new POCDMT000040InfrastructureRootTypeId();
assignedTemp.setRoot("1.3.5.35.1.4436.7");
assignedTemp.setExtension("999999999^^^&" + orgPolicy.getHomeCommunityId() + "&ISO");
assignedTemp.setAssigningAuthorityName(orgPolicy.getOrgName());
assigned.setTypeId(assignedTemp);
POCDMT000040Person person = new POCDMT000040Person();
PN authorName = new PN();
authorName.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "given"), EnGiven.class, orgPolicy.getOrganizationConsentPolicyInfo().getAssignedAuthor().getAssignedPerson().getName().getGiven()));
authorName.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "family"), EnFamily.class, orgPolicy.getOrganizationConsentPolicyInfo().getAssignedAuthor().getAssignedPerson().getName().getFamily()));
person.getName().add(authorName);
assigned.setClassCode("PSN");
assigned.setAssignedPerson(person);
POCDMT000040AuthoringDevice device = new POCDMT000040AuthoringDevice();
SC model = new SC();
SC sft = new SC();
model.setDisplayName(orgPolicy.getOrganizationConsentPolicyInfo().getAssignedAuthoringDevice().getManufacturingModelName().getDisplayName());
model.setCode(orgPolicy.getOrganizationConsentPolicyInfo().getAssignedAuthoringDevice().getManufacturingModelName().getCode());
sft.setDisplayName(orgPolicy.getOrganizationConsentPolicyInfo().getAssignedAuthoringDevice().getSoftwareName().getDisplayName());
sft.setCode(orgPolicy.getOrganizationConsentPolicyInfo().getAssignedAuthoringDevice().getSoftwareName().getCode());
device.setManufacturerModelName(model);
device.setSoftwareName(sft);
assigned.setAssignedAuthoringDevice(device);
author.setAssignedAuthor(assigned);
return author;
}
private POCDMT000040Custodian getDocumentCustodian(OrganizationPolicy orgPolicy) {
POCDMT000040Custodian custodian = new POCDMT000040Custodian();
POCDMT000040AssignedCustodian assignedC = new POCDMT000040AssignedCustodian();
POCDMT000040CustodianOrganization custOrg = new POCDMT000040CustodianOrganization();
ON orgName = new ON();
orgName.getUse().add(orgPolicy.getOrgName());
custOrg.setName(orgName);
TEL oTEL = new TEL();
oTEL.setValue(orgPolicy.getOrganizationConsentPolicyInfo().getDefaultCustodianInfo().getTelcom());
custOrg.setTelecom(oTEL);
assignedC.setRepresentedCustodianOrganization(custOrg);
custodian.setAssignedCustodian(assignedC);
return custodian;
}
private POCDMT000040Component2 getDocumentComponent2(CE conf, String intendedPurposeOfUse, String authorization, OrganizationPolicy orgPolicy, List<String> maskingActions, List<String> redactActions, String pdf, String xacml) {
POCDMT000040Component2 comp = new POCDMT000040Component2();
POCDMT000040StructuredBody body = new POCDMT000040StructuredBody();
POCDMT000040Component3 comp2 = new POCDMT000040Component3();
comp2.setTypeCode(ActRelationshipHasComponent.COMP);
POCDMT000040Section section = new POCDMT000040Section();
section.getClassCode().add("DOCSECT");
section.getMoodCode().add("EVN");
II sectTemp = new II();
sectTemp.setRoot("2.16.840.1.113883.3.445.17");
section.getTemplateId().add(sectTemp);
ST sectTitle = new ST();
sectTitle.getContent().add(new String("Consent Directive Detail"));
section.setTitle(sectTitle);
section.getEntry().add(getEntryPurposeOfUse(intendedPurposeOfUse, authorization, orgPolicy, maskingActions, redactActions, pdf, xacml));
section.setConfidentialityCode(conf);
POCDMT000040InfrastructureRootTypeId sectionId = new POCDMT000040InfrastructureRootTypeId();
sectionId.setRoot("2.16.840.1.113883.3.445.5");
POCDMT000040Entry entry = new POCDMT000040Entry();
entry.setTypeCode(XActRelationshipEntry.COMP);
POCDMT000040InfrastructureRootTypeId entryType = new POCDMT000040InfrastructureRootTypeId();
entryType.setRoot("2.16.840.1.113883.3.445.4");
entry.setTypeId(entryType);
POCDMT000040Act act = new POCDMT000040Act();
act.setClassCode(XActClassDocumentEntryAct.ACT);
act.setMoodCode(XDocumentActMood.DEF);
entry.setAct(act);
comp2.setSection(section);
body.getComponent().add(comp2);
comp.setStructuredBody(body);
return comp;
}
private POCDMT000040InformationRecipient getDocumentInformationRecipient(String primaryRecipient) {
POCDMT000040InformationRecipient recipient = new POCDMT000040InformationRecipient();
XInformationRecipient x = XInformationRecipient.PRCP;
recipient.setTypeCode(x);
POCDMT000040IntendedRecipient iRecipient = new POCDMT000040IntendedRecipient();
XInformationRecipientRole role = XInformationRecipientRole.ASSIGNED;
POCDMT000040InfrastructureRootTypeId cId = new POCDMT000040InfrastructureRootTypeId();
cId.setExtension("7878");
cId.setRoot(primaryRecipient);
iRecipient.setTypeId(cId);
POCDMT000040Organization vaOrg = new POCDMT000040Organization();
vaOrg.setClassCode("ORG");
vaOrg.setDeterminerCode("INSTANCE");
POCDMT000040InfrastructureRootTypeId oId = new POCDMT000040InfrastructureRootTypeId();
oId.setRoot("2.16.840.1.113883.4.349");
vaOrg.setTypeId(oId);
iRecipient.setReceivedOrganization(vaOrg);
recipient.setIntendedRecipient(iRecipient);
return recipient;
}
private POCDMT000040LegalAuthenticator getDocumentLegalAuthenticator(OrganizationPolicy orgPolicy, String patientName)
{
POCDMT000040LegalAuthenticator authenticator = new POCDMT000040LegalAuthenticator();
TS ts = new TS();
ts.setValue(getCurrentTime());
authenticator.setTime(ts);
CS cs = new CS();
cs.setCode("S");
authenticator.setSignatureCode(cs);
POCDMT000040AssignedEntity entity = new POCDMT000040AssignedEntity();
AD patientaddr = new AD();
patientaddr.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "streetAddressLine"), AdxpStreetAddressLine.class, orgPolicy.getOrganizationConsentPolicyInfo().getDefaultPatientDemographics().getAddr().getStreetAddressLine()));
patientaddr.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "city"), AdxpCity.class, orgPolicy.getOrganizationConsentPolicyInfo().getDefaultPatientDemographics().getAddr().getCity()));
patientaddr.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "state"), AdxpState.class, orgPolicy.getOrganizationConsentPolicyInfo().getDefaultPatientDemographics().getAddr().getState()));
patientaddr.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "postalCode"), AdxpPostalCode.class, orgPolicy.getOrganizationConsentPolicyInfo().getDefaultPatientDemographics().getAddr().getPostalCode()));
patientaddr.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "county"), AdxpCounty.class, orgPolicy.getOrganizationConsentPolicyInfo().getDefaultPatientDemographics().getAddr().getCounty()));
patientaddr.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "country"), AdxpCountry.class, orgPolicy.getOrganizationConsentPolicyInfo().getDefaultPatientDemographics().getAddr().getCountry()));
entity.getAddr().add(patientaddr);
PN patientname = new PN();
StringTokenizer st = new StringTokenizer(patientName);
String first = st.nextToken();
String last = st.nextToken();
patientname.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "given"), EnGiven.class, first));
patientname.getContent().add(new JAXBElement(new QName("urn:hl7-org:v3", "family"), EnFamily.class, last));
POCDMT000040Person person = new POCDMT000040Person();
person.getName().add(patientname);
entity.setAssignedPerson(person);
authenticator.setAssignedEntity(entity);
return authenticator;
}
private POCDMT000040DocumentationOf getDocumentDocumentOf()
{
POCDMT000040DocumentationOf doc = new POCDMT000040DocumentationOf();
doc.getTypeCode().add("DOC");
POCDMT000040ServiceEvent event = new POCDMT000040ServiceEvent();
event.getMoodCode().add("EVN");
II ii = new II();
ii.setRoot("2.16.840.1.113883.3.445.3");
event.getTemplateId().add(ii);
ii = new II();
ii.setRoot("2.16.840.1.113883.3.72.4.2.5");
event.getId().add(ii);
CE code = new CE();
code.setCode("57016-8");
code.setCodeSystem("2.16.840.1.113883.6.1");
code.setCodeSystemName("LOINC");
code.setDisplayName("Privacy Policy Acknowledgement Document");
event.setCode(code);
IVLTS effTime = new IVLTS();
effTime.getRest().add(new JAXBElement(new QName("urn:hl7-org:v3", "low"), IVXBTS.class, getCurrentDate()));
effTime.getRest().add(new JAXBElement(new QName("urn:hl7-org:v3", "high"), IVXBTS.class, getDefaultEndDate()));
event.setEffectiveTime(effTime);
doc.setServiceEvent(event);
return doc;
}
private POCDMT000040Precondition getEntryRelationPrecondition(String actInfomationSensitivity) {
POCDMT000040Precondition cond = new POCDMT000040Precondition();
POCDMT000040InfrastructureRootTypeId oId = new POCDMT000040InfrastructureRootTypeId();
oId.setRoot("2.16.840.1.113883.3.445.12");
cond.setTypeId(oId);
POCDMT000040Criterion criterion = new POCDMT000040Criterion();
criterion.getMoodCode().add("EVN.CRT");
criterion.getClassCode().add("COND");
CD cd = new CD();
cd.setCode(actInfomationSensitivity);
cd.setDisplayName(actInfomationSensitivity);
cd.setCodeSystem("2.16.840.1.113883.1.11.20429");
cd.setCodeSystemName("ActInformationSensitivity");
criterion.setCode(cd);
cond.setCriterion(criterion);
return cond;
}
private POCDMT000040Entry getEntryPurposeOfUse(String actGeneralReason, String authorization, OrganizationPolicy orgPolicy, List<String> maskingActions, List<String> redactActions, String pdfString, String xacmlPolicy) {
POCDMT000040Entry entry = new POCDMT000040Entry();
XActRelationshipEntry actx = XActRelationshipEntry.COMP;
entry.setTypeCode(actx);
POCDMT000040InfrastructureRootTypeId oId = new POCDMT000040InfrastructureRootTypeId();
oId.setRoot("2.16.840.1.113883.3.445.4");
entry.setTypeId(oId);
POCDMT000040Act act = new POCDMT000040Act();
XActClassDocumentEntryAct actClass = XActClassDocumentEntryAct.ACT;
XDocumentActMood actMood = XDocumentActMood.DEF;
entry.setAct(act);
POCDMT000040InfrastructureRootTypeId aId = new POCDMT000040InfrastructureRootTypeId();
aId.setRoot("2.16.840.1.113883.3.445.5");
act.setTypeId(oId);
CD code = new CD();
code.setCode(actGeneralReason);
code.setCodeSystem("2.16.840.1.113883.5.8");
code.setCodeSystemName("ActReason");
code.setDisplayName(actGeneralReason);
act.setCode(code);
CS status = new CS();
status.setCode("active");
act.setStatusCode(status);
POCDMT000040Participant2 participant = new POCDMT000040Participant2();
participant.getTypeCode().add("IRCP");
POCDMT000040InfrastructureRootTypeId pId = new POCDMT000040InfrastructureRootTypeId();
pId.setRoot("2.16.840.1.113883.3.445.6");
participant.setTypeId(aId);
act.getParticipant().add(participant);
act.getEntryRelationship().add(getDisclosure(authorization));
act.getEntryRelationship().add(getPrivacyObligations(orgPolicy));
Iterator mIter = maskingActions.iterator();
while (mIter.hasNext()) {
String mask = (String)mIter.next();
act.getPrecondition().add(getEntryRelationPrecondition(mask));
}
Iterator rIter = redactActions.iterator();
while (rIter.hasNext()) {
String redact = (String)rIter.next();
act.getPrecondition().add(getEntryRelationPrecondition(redact));
}
act.getEntryRelationship().add(getPDFValue(pdfString));
act.getEntryRelationship().add(getXACMLValue(xacmlPolicy));
entry.setAct(act);
return entry;
}
private POCDMT000040EntryRelationship getDisclosure(String authorization) {
POCDMT000040EntryRelationship eR = new POCDMT000040EntryRelationship();
XActRelationshipEntryRelationship xC = XActRelationshipEntryRelationship.COMP;
eR.setTypeCode(xC);
eR.setContextConductionInd(Boolean.TRUE);
POCDMT000040Act act = new POCDMT000040Act();
XActClassDocumentEntryAct aClass = XActClassDocumentEntryAct.ACT;
act.setClassCode(aClass);
XDocumentActMood mood = XDocumentActMood.DEF;
act.setMoodCode(mood);
if (authorization.equals("Permit")) {
act.setNegationInd(Boolean.FALSE);
}
else {
act.setNegationInd(Boolean.TRUE);
}
CD code = new CD();
code.setCode("DISCLOSE");
code.setCodeSystem("2.16.840.1.113883.5.4");
code.setCodeSystemName("ActConsentType");
code.setDisplayName("Disclose");
act.setCode(code);
eR.setAct(act);
return eR;
}
private POCDMT000040EntryRelationship getPrivacyObligations(OrganizationPolicy orgPolicy) {
POCDMT000040EntryRelationship obl = new POCDMT000040EntryRelationship();
String law = orgPolicy.getUsPrivacyLaw();
if ((law.equals("42CFRPart2")) || (law.equals("Title38Section7332"))) {
obl.setContextConductionInd(Boolean.TRUE);
XActRelationshipEntryRelationship xR = XActRelationshipEntryRelationship.COMP;
obl.setTypeCode(xR);
II pId = new II();
pId.setRoot("2.16.840.1.113883.3.445.13");
obl.getTemplateId().add(pId);
POCDMT000040Act act = new POCDMT000040Act();
XDocumentActMood mood = XDocumentActMood.DEF;
act.setMoodCode(mood);
XActClassDocumentEntryAct dClass = XActClassDocumentEntryAct.CONS;
act.setClassCode(dClass);
CD cd = new CD();
cd.setCode(law);
cd.setCodeSystem("2.16.840.1.113883.5.1138");
cd.setCodeSystemName("ActUSPrivacyLaw");
cd.setDisplayName(law);
act.setCode(cd);
POCDMT000040Precondition cond = new POCDMT000040Precondition();
II oId = new II();
oId.setRoot("2.16.840.1.113883.3.445.14");
cond.getTemplateId().add(oId);
POCDMT000040Criterion criterion = new POCDMT000040Criterion();
criterion.getMoodCode().add("EVN.CRT");
criterion.getClassCode().add("OBS");
CD c2 = new CD();
c2.setCode("NORDSCLCD");
c2.setDisplayName("NORDSCLCD");
c2.setCodeSystem("2.16.840.1.113883.1.11.20446");
c2.setCodeSystemName("RefrainPolicy");
criterion.setCode(c2);
cond.setCriterion(criterion);
act.getPrecondition().add(cond);
obl.setAct(act);
}
else
{
obl = null;
}
return obl;
}
private POCDMT000040EntryRelationship getPDFValue(String pdfString) {
POCDMT000040EntryRelationship pdf = new POCDMT000040EntryRelationship();
II id = new II();
id.setRoot("2.16.840.1.113883.3.445.15");
POCDMT000040ObservationMedia media = new POCDMT000040ObservationMedia();
media.getMoodCode().add("EVN");
media.getClassCode().add("OBS");
ED ed = new ED();
ed.setMediaType("application/pdf");
ed.setRepresentation(BinaryDataEncoding.B_64);
String pdfArray = Base64.encodeBase64String(pdfString.getBytes());
ed.getContent().add(pdfArray);
media.setValue(ed);
pdf.setObservationMedia(media);
pdf.getTemplateId().add(id);
return pdf;
}
private POCDMT000040EntryRelationship getXACMLValue(String policy) {
POCDMT000040EntryRelationship xacml = new POCDMT000040EntryRelationship();
II id = new II();
id.setRoot("2.16.840.1.113883.3.445.16");
POCDMT000040ObservationMedia media = new POCDMT000040ObservationMedia();
media.getMoodCode().add("EVN");
media.getClassCode().add("OBS");
ED ed = new ED();
ed.setMediaType("application/xacml+xml");
ed.setRepresentation(BinaryDataEncoding.B_64);
String xacmlarray = Base64.encodeBase64String(policy.getBytes());
ed.getContent().add(xacmlarray);
media.setValue(ed);
xacml.setObservationMedia(media);
xacml.getTemplateId().add(id);
return xacml;
}
}