/******************************************************************************* * Copyright (c) 2014 MEDEVIT. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * T. Huster - initial API and implementation *******************************************************************************/ package at.medevit.elexis.ehc.core.internal; import static ch.elexis.core.constants.XidConstants.DOMAIN_AHV; import static ch.elexis.core.constants.XidConstants.DOMAIN_EAN; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Calendar; import java.util.List; import java.util.Map; import org.apache.commons.io.IOUtils; import org.ehealth_connector.cda.ch.AbstractCdaCh; import org.ehealth_connector.common.Address; import org.ehealth_connector.common.Identificator; import org.ehealth_connector.common.enums.AddressUse; import org.ehealth_connector.common.enums.AdministrativeGender; import org.ehealth_connector.communication.ConvenienceCommunication; import org.ehealth_connector.communication.DocumentMetadata; import org.ehealth_connector.communication.xd.xdm.DocumentContentAndMetadata; import org.ehealth_connector.communication.xd.xdm.XdmContents; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.openhealthtools.ihe.xds.document.DocumentDescriptor; import org.openhealthtools.ihe.xds.document.XDSDocument; import org.openhealthtools.mdht.uml.cda.ClinicalDocument; import org.openhealthtools.mdht.uml.cda.ihe.MedicalDocument; import org.openhealthtools.mdht.uml.cda.util.CDAUtil; import ch.elexis.data.Anschrift; import ch.elexis.data.Kontakt; import ch.elexis.data.Mandant; import ch.elexis.data.Patient; import ch.elexis.data.Xid; public class EhcCoreServiceTest { public static final String DOMAIN_KSK = "www.xid.ch/id/ksk"; //$NON-NLS-1$ private static Patient patient; private static Mandant mandant; @BeforeClass public static void before() throws IOException{ patient = new Patient("name", "firstname", "01.01.2000", Patient.FEMALE); patient.set(Kontakt.FLD_PHONE1, "+01555123"); patient.set(Kontakt.FLD_MOBILEPHONE, "+01444132"); Anschrift anschrift = new Anschrift(); anschrift.setOrt("City"); anschrift.setPlz("123"); anschrift.setStrasse("Street 1"); patient.setAnschrift(anschrift); addAHVNumber(patient, 1); mandant = new Mandant("mandant", "firstname", "02.02.2002", Mandant.MALE); mandant.set(Kontakt.FLD_PHONE1, "+01555987"); mandant.set(Kontakt.FLD_MOBILEPHONE, "+01444987"); anschrift = new Anschrift(); anschrift.setOrt("City"); anschrift.setPlz("987"); anschrift.setStrasse("Street 2"); mandant.setAnschrift(anschrift); mandant.addXid(DOMAIN_EAN, "2000000000002", true); Xid.localRegisterXIDDomainIfNotExists(DOMAIN_KSK, "KSK/ZSR-Nr", Xid.ASSIGNMENT_REGIONAL); //$NON-NLS-1$ mandant.addXid(DOMAIN_KSK, "C000002", true); } private static void addAHVNumber(Patient pat, int index){ String country = "756"; String number = String.format("%09d", index); StringBuilder ahvBuilder = new StringBuilder(country + number); ahvBuilder.append(getCheckNumber(ahvBuilder.toString())); pat.addXid(DOMAIN_AHV, ahvBuilder.toString(), true); } private static String getCheckNumber(String string){ int sum = 0; for (int i = 0; i < string.length(); i++) { // reveresd order char character = string.charAt((string.length() - 1) - i); int intValue = Character.getNumericValue(character); if (i % 2 == 0) { sum += intValue * 3; } else { sum += intValue; } } return Integer.toString(sum % 10); } @AfterClass public static void after(){ patient.delete(); mandant.delete(); } @Test public void testGetPatientDocument(){ EhcCoreServiceImpl service = new EhcCoreServiceImpl(); AbstractCdaCh<?> cda = service.createCdaChDocument(patient, mandant); assertNotNull(cda); org.ehealth_connector.common.Patient cdaPatient = cda.getPatient(); assertNotNull(cdaPatient); assertEquals("name", cdaPatient.getName().getFamilyName()); assertEquals("firstname", cdaPatient.getName().getGivenNames()); assertEquals(AdministrativeGender.FEMALE, cdaPatient.getAdministrativeGenderCode()); Calendar bDay = Calendar.getInstance(); bDay.set(2000, 00, 01, 00, 00, 00); bDay.set(Calendar.MILLISECOND, 00); assertEquals(bDay.getTime(), cdaPatient.getBirthday()); List<Address> addresses = cdaPatient.getAddresses(); assertFalse(addresses.isEmpty()); assertEquals("City", addresses.get(0).getCity()); Map<String, AddressUse> phones = cdaPatient.getTelecoms().getPhones(); assertFalse(phones.isEmpty()); assertTrue(phones.containsKey("tel:+01555123")); } @Test public void testWritePatientDocument() throws Exception{ EhcCoreServiceImpl service = new EhcCoreServiceImpl(); AbstractCdaCh<?> cda = service.createCdaChDocument(patient, mandant); ByteArrayOutputStream output = new ByteArrayOutputStream(); CDAUtil.save(cda.getDocRoot().getClinicalDocument(), output); assertTrue(output.size() > 0); String xml = output.toString("UTF-8"); assertTrue(xml.contains("name")); assertTrue(xml.contains("firstname")); } @Test public void testWritePatientDocumentFile() throws Exception{ EhcCoreServiceImpl service = new EhcCoreServiceImpl(); AbstractCdaCh<?> cda = service.createCdaChDocument(patient, mandant); String userHome = System.getProperty("user.home"); String outFilePath = userHome + File.separator + "testPatientCda.xml"; cda.saveToFile(outFilePath); File outFile = new File(outFilePath); assertTrue(outFile.exists()); assertTrue(outFile.isFile()); assertTrue(outFile.length() > 0); outFile.deleteOnExit(); } @Test public void testGetDocument() throws Exception{ EhcCoreServiceImpl service = new EhcCoreServiceImpl(); AbstractCdaCh<?> cda = service.createCdaChDocument(patient, mandant); ByteArrayOutputStream output = new ByteArrayOutputStream(); CDAUtil.save(cda.getDocRoot().getClinicalDocument(), output); assertTrue(output.size() > 0); ByteArrayInputStream documentInput = new ByteArrayInputStream(output.toByteArray()); ClinicalDocument document = service.loadDocument(documentInput); assertNotNull(document); AbstractCdaCh<?> cdach = service.getAsCdaChDocument(document); assertNotNull(cdach); org.ehealth_connector.common.Patient readPatient = cdach.getPatient(); assertEquals("name", readPatient.getName().getFamilyName()); assertEquals("firstname", readPatient.getName().getGivenNames()); assertEquals(AdministrativeGender.FEMALE, readPatient.getAdministrativeGenderCode()); } @Test public void testGetVaccinationsDocument() throws Exception{ EhcCoreServiceImpl service = new EhcCoreServiceImpl(); AbstractCdaCh<?> cda = service.createCdaChDocument(patient, mandant); ByteArrayOutputStream output = new ByteArrayOutputStream(); CDAUtil.save(cda.getDocRoot().getClinicalDocument(), output); assertTrue(output.size() > 0); } @Test public void testGetXdmAsStream() throws Exception{ EhcCoreServiceImpl service = new EhcCoreServiceImpl(); AbstractCdaCh<?> cda = service.createCdaChDocument(patient, mandant); InputStream input = service.getXdmAsStream(cda.getDoc()); assertTrue(input != null); File testTmp = File.createTempFile("ehccoretest_", ".tmp"); try(FileOutputStream fout = new FileOutputStream(testTmp)) { IOUtils.copy(input, fout); input.close(); } List<org.ehealth_connector.common.Patient> patients = service.getXdmPatients(testTmp); assertFalse(patients.isEmpty()); List<Identificator> ids = patients.get(0).getIds(); assertFalse(ids.isEmpty()); Identificator id = ids.get(0); assertNotNull(id); assertEquals("7560000000011", id.getExtension()); } @Test public void testWriteXdm() throws Exception{ EhcCoreServiceImpl service = new EhcCoreServiceImpl(); AbstractCdaCh<?> cda = service.createCdaChDocument(patient, mandant); ByteArrayOutputStream output = new ByteArrayOutputStream(); CDAUtil.save(cda.getDocRoot().getClinicalDocument(), output); ConvenienceCommunication conCom = new ConvenienceCommunication(); DocumentMetadata metaData = conCom.addDocument(DocumentDescriptor.CDA_R2, new ByteArrayInputStream(output.toByteArray())); assertNotNull(metaData); List<Identificator> ids = cda.getPatient().getIds(); if (!ids.isEmpty()) { metaData.setDestinationPatientId(ids.get(0)); } output.reset(); conCom.createXdmContents(output); assertTrue(output.size() > 0); } @Test public void testReadXdm() throws Exception{ File xdmFile = createTempFile("/rsc/xdm/test_xdm.zip"); ConvenienceCommunication conCom = new ConvenienceCommunication(); XdmContents contents = conCom.getXdmContents(xdmFile.getAbsolutePath()); assertNotNull(contents); List<DocumentContentAndMetadata> documents = contents.getDocumentAndMetadataList(); assertNotNull(documents); assertFalse(documents.isEmpty()); XDSDocument xdsDocument = documents.get(0).getXdsDocument(); assertNotNull(xdsDocument); ClinicalDocument clinicalDocument = CDAUtil.load(xdsDocument.getStream()); assertNotNull(clinicalDocument); assertTrue(clinicalDocument instanceof MedicalDocument); DocumentMetadata meta = documents.get(0).getDocEntry(); assertNotNull(meta); Identificator id = meta.getPatientId(); assertNotNull(id); assertEquals("7560000000011", id.getExtension()); } private File createTempFile(String string) throws IOException{ File ret = File.createTempFile("test_", ".tmp"); if (ret != null) { try (FileOutputStream output = new FileOutputStream(ret)) { BufferedInputStream input = new BufferedInputStream(getClass().getResourceAsStream(string)); IOUtils.copy(input, output); input.close(); } } return ret; } }