/* * This file is part of ADDIS (Aggregate Data Drug Information System). * ADDIS is distributed from http://drugis.org/. * Copyright © 2009 Gert van Valkenhoef, Tommi Tervonen. * Copyright © 2010 Gert van Valkenhoef, Tommi Tervonen, Tijs Zwinkels, * Maarten Jacobs, Hanno Koeslag, Florin Schimbinschi, Ahmad Kamal, Daniel * Reid. * Copyright © 2011 Gert van Valkenhoef, Ahmad Kamal, Daniel Reid, Florin * Schimbinschi. * Copyright © 2012 Gert van Valkenhoef, Daniel Reid, Joël Kuiper, Wouter * Reckman. * Copyright © 2013 Gert van Valkenhoef, Joël Kuiper. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.drugis.addis.util.jaxb; import static org.drugis.addis.entities.AssertEntityEquals.assertEntityEquals; import static org.drugis.addis.util.jaxb.JAXBConvertor.nameReference; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.Duration; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.transform.TransformerException; import org.custommonkey.xmlunit.Diff; import org.drugis.addis.ExampleData; import org.drugis.addis.entities.Activity; import org.drugis.addis.entities.AdverseEvent; import org.drugis.addis.entities.Arm; import org.drugis.addis.entities.BasicContinuousMeasurement; import org.drugis.addis.entities.BasicMeasurement; import org.drugis.addis.entities.BasicRateMeasurement; import org.drugis.addis.entities.BasicStudyCharacteristic; import org.drugis.addis.entities.BasicStudyCharacteristic.Allocation; import org.drugis.addis.entities.BasicStudyCharacteristic.Blinding; import org.drugis.addis.entities.BasicStudyCharacteristic.Status; import org.drugis.addis.entities.CategoricalVariableType; import org.drugis.addis.entities.CharacteristicsMap; import org.drugis.addis.entities.ContinuousVariableType; import org.drugis.addis.entities.Domain; import org.drugis.addis.entities.DomainImpl; import org.drugis.addis.entities.DoseUnit; import org.drugis.addis.entities.Drug; import org.drugis.addis.entities.DrugTreatment; import org.drugis.addis.entities.Endpoint; import org.drugis.addis.entities.EntityIdExistsException; import org.drugis.addis.entities.Epoch; import org.drugis.addis.entities.FixedDose; import org.drugis.addis.entities.FlexibleDose; import org.drugis.addis.entities.FrequencyMeasurement; import org.drugis.addis.entities.Indication; import org.drugis.addis.entities.MeasurementKey; import org.drugis.addis.entities.Note; import org.drugis.addis.entities.ObjectWithNotes; import org.drugis.addis.entities.OutcomeMeasure.Direction; import org.drugis.addis.entities.PopulationCharacteristic; import org.drugis.addis.entities.PredefinedActivity; import org.drugis.addis.entities.PubMedId; import org.drugis.addis.entities.PubMedIdList; import org.drugis.addis.entities.RateVariableType; import org.drugis.addis.entities.Source; import org.drugis.addis.entities.Study; import org.drugis.addis.entities.StudyActivity; import org.drugis.addis.entities.StudyActivity.UsedBy; import org.drugis.addis.entities.StudyArmsEntry; import org.drugis.addis.entities.StudyOutcomeMeasure; import org.drugis.addis.entities.TreatmentActivity; import org.drugis.addis.entities.Variable; import org.drugis.addis.entities.Variable.Type; import org.drugis.addis.entities.WhenTaken; import org.drugis.addis.entities.WhenTaken.RelativeTo; import org.drugis.addis.entities.analysis.BenefitRiskAnalysis; import org.drugis.addis.entities.analysis.BenefitRiskAnalysis.AnalysisType; import org.drugis.addis.entities.analysis.DecisionContext; import org.drugis.addis.entities.analysis.MetaAnalysis; import org.drugis.addis.entities.analysis.MetaBenefitRiskAnalysis; import org.drugis.addis.entities.analysis.RandomEffectsMetaAnalysis; import org.drugis.addis.entities.analysis.StudyBenefitRiskAnalysis; import org.drugis.addis.entities.data.ActivityUsedBy; import org.drugis.addis.entities.data.AddisData; import org.drugis.addis.entities.data.AnalysisArms; import org.drugis.addis.entities.data.ArmReference; import org.drugis.addis.entities.data.ArmReferences; import org.drugis.addis.entities.data.Arms; import org.drugis.addis.entities.data.BaselineArmReference; import org.drugis.addis.entities.data.BenefitRiskAnalyses; import org.drugis.addis.entities.data.CategoricalMeasurement; import org.drugis.addis.entities.data.CategoricalVariable; import org.drugis.addis.entities.data.CategoryMeasurement; import org.drugis.addis.entities.data.Characteristics; import org.drugis.addis.entities.data.ContinuousMeasurement; import org.drugis.addis.entities.data.ContinuousVariable; import org.drugis.addis.entities.data.DateWithNotes; import org.drugis.addis.entities.data.Epochs; import org.drugis.addis.entities.data.Measurements; import org.drugis.addis.entities.data.MetaAnalyses; import org.drugis.addis.entities.data.MetaAnalysisAlternative; import org.drugis.addis.entities.data.MetaAnalysisReferences; import org.drugis.addis.entities.data.MetaBenefitRiskAnalysis.Alternatives; import org.drugis.addis.entities.data.MetaBenefitRiskAnalysis.Baseline; import org.drugis.addis.entities.data.NameReferenceWithNotes; import org.drugis.addis.entities.data.NetworkMetaAnalysis; import org.drugis.addis.entities.data.Notes; import org.drugis.addis.entities.data.OutcomeMeasure; import org.drugis.addis.entities.data.OutcomeMeasuresReferences; import org.drugis.addis.entities.data.PairwiseMetaAnalysis; import org.drugis.addis.entities.data.RateMeasurement; import org.drugis.addis.entities.data.RateVariable; import org.drugis.addis.entities.data.References; import org.drugis.addis.entities.data.RelativeTime; import org.drugis.addis.entities.data.StudyActivities; import org.drugis.addis.entities.data.StudyOutcomeMeasures; import org.drugis.addis.entities.data.Treatment; import org.drugis.addis.entities.data.TreatmentCategoryRef; import org.drugis.addis.entities.data.TrivialCategory; import org.drugis.addis.entities.treatment.TreatmentDefinition; import org.drugis.addis.imports.PubMedDataBankRetriever; import org.drugis.addis.util.EntityUtil; import org.drugis.addis.util.jaxb.JAXBConvertor.ConversionException; import org.drugis.addis.util.jaxb.JAXBHandler.XmlFormatType; import org.drugis.common.Interval; import org.drugis.common.JUnitUtil; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.xml.sax.SAXException; public class JAXBConvertorTest { public static final String TEST_DATA_PATH = "../../"; private static final String TEST_DATA_A_0 = TEST_DATA_PATH + "testDataA-0.xml"; private static final String TEST_DATA_3 = TEST_DATA_PATH + "testData-3.addis"; private static final String TEST_DATA_A_1 = TEST_DATA_PATH + "testDataA-1.addis"; private static final Duration ZERO_DAYS = EntityUtil.createDuration("P0D"); private static final String TEST_DATA_5 = TEST_DATA_PATH + "testData-5.addis"; private JAXBContext d_jaxb; private static Unmarshaller d_unmarshaller; private static Marshaller d_marshaller; @Before public void setup() throws JAXBException { d_jaxb = JAXBContext.newInstance("org.drugis.addis.entities.data"); d_unmarshaller = d_jaxb.createUnmarshaller(); d_marshaller = d_jaxb.createMarshaller(); } @Test public void testConvertContinuousEndpoint() throws ConversionException { final String name = "Onset of erection"; final String desc = "Time to onset of erection of >= 60 % rigidity"; final String unit = "Minutes"; final Direction dir = Direction.LOWER_IS_BETTER; final OutcomeMeasure m = new OutcomeMeasure(); m.setName(name); m.setDescription(desc); final ContinuousVariable value = new ContinuousVariable(); m.setDirection(dir); value.setUnitOfMeasurement(unit); m.setContinuous(value); final Endpoint e = new Endpoint(name, Endpoint.convertVarType(Type.CONTINUOUS), dir); e.setDescription(desc); ((ContinuousVariableType) e.getVariableType()) .setUnitOfMeasurement(unit); assertEntityEquals(e, JAXBConvertor.convertEndpoint(m)); assertEquals(m, JAXBConvertor.convertEndpoint(e)); } @Test public void testConvertRateEndpoint() throws ConversionException { final String name = "Efficacy"; final String desc = "Erection of >= 60% rigidity within 1 hr of medication"; final Direction dir = Direction.HIGHER_IS_BETTER; final OutcomeMeasure m = new OutcomeMeasure(); m.setName(name); m.setDescription(desc); final RateVariable value = new RateVariable(); m.setDirection(dir); m.setRate(value); final Endpoint e = new Endpoint(name, Endpoint.convertVarType(Type.RATE), dir); e.setDescription(desc); assertEntityEquals(e, JAXBConvertor.convertEndpoint(m)); m.setDirection(Direction.LOWER_IS_BETTER); e.setDirection(org.drugis.addis.entities.OutcomeMeasure.Direction.LOWER_IS_BETTER); assertEntityEquals(e, JAXBConvertor.convertEndpoint(m)); assertEquals(m, JAXBConvertor.convertEndpoint(e)); } @Test(expected = ConversionException.class) public void testConvertCategoricalEndpointThrows() throws ConversionException { final OutcomeMeasure m = new OutcomeMeasure(); m.setName("Gender"); m.setDescription("Which gender you turn out to be after taking medication"); final CategoricalVariable value = new CategoricalVariable(); m.setCategorical(value); JAXBConvertor.convertEndpoint(m); } @Test public void testConvertContinuousAdverseEvent() throws ConversionException { final String name = "Onset of erection"; final String desc = "Time to onset of erection of >= 60 % rigidity"; final String unit = "Minutes"; final OutcomeMeasure m = new OutcomeMeasure(); m.setName(name); m.setDescription(desc); final ContinuousVariable value = new ContinuousVariable(); m.setDirection(Direction.LOWER_IS_BETTER); value.setUnitOfMeasurement(unit); m.setContinuous(value); final org.drugis.addis.entities.OutcomeMeasure e = new AdverseEvent(name, AdverseEvent.convertVarType(Type.CONTINUOUS)); e.setDescription(desc); ((ContinuousVariableType) e.getVariableType()) .setUnitOfMeasurement(unit); assertEntityEquals(e, JAXBConvertor.convertAdverseEvent(m)); assertEquals(m, JAXBConvertor.convertAdverseEvent(e)); } @Test public void testConvertRateAdverseEvent() throws ConversionException { final String name = "Seizure"; final String desc = "Its bad hmmkay"; final OutcomeMeasure m = new OutcomeMeasure(); m.setName(name); m.setDescription(desc); final RateVariable value = new RateVariable(); m.setDirection(Direction.LOWER_IS_BETTER); m.setRate(value); final AdverseEvent e = new AdverseEvent(name, AdverseEvent.convertVarType(Type.RATE)); e.setDescription(desc); assertEntityEquals(e, JAXBConvertor.convertAdverseEvent(m)); m.setDirection(Direction.HIGHER_IS_BETTER); e.setDirection(org.drugis.addis.entities.OutcomeMeasure.Direction.HIGHER_IS_BETTER); assertEntityEquals(e, JAXBConvertor.convertAdverseEvent(m)); assertEquals(m, JAXBConvertor.convertAdverseEvent(e)); } @Test(expected = ConversionException.class) public void testConvertCategoricalAdverseEventThrows() throws ConversionException { final OutcomeMeasure m = new OutcomeMeasure(); m.setName("Efficacy"); m.setDescription("Erection of >= 60% rigidity within 1 hr of medication"); final CategoricalVariable value = new CategoricalVariable(); m.setCategorical(value); JAXBConvertor.convertAdverseEvent(m); } @Test public void testConvertContinuousPopChar() throws ConversionException { final String name = "Age"; final String desc = "Age (years since birth)"; final String unit = "Years"; final OutcomeMeasure m = new OutcomeMeasure(); m.setName(name); m.setDescription(desc); final ContinuousVariable value = new ContinuousVariable(); value.setUnitOfMeasurement(unit); m.setContinuous(value); final PopulationCharacteristic p = new PopulationCharacteristic(name, new ContinuousVariableType()); ((ContinuousVariableType) p.getVariableType()) .setUnitOfMeasurement(unit); p.setDescription(desc); assertEntityEquals(p, JAXBConvertor.convertPopulationCharacteristic(m)); assertEquals(m, JAXBConvertor.convertPopulationCharacteristic(p)); } @Test public void testConvertRatePopChar() throws ConversionException { final String name = "Seizure"; final String description = "Its bad hmmkay"; final OutcomeMeasure m = new OutcomeMeasure(); m.setName(name); m.setDescription(description); m.setRate(new RateVariable()); final PopulationCharacteristic p = new PopulationCharacteristic(name, new RateVariableType()); p.setDescription(description); assertEntityEquals(p, JAXBConvertor.convertPopulationCharacteristic(m)); assertEquals(m, JAXBConvertor.convertPopulationCharacteristic(p)); } @Test public void testConvertCategoricalPopChar() throws ConversionException { final String name = "Smoking habits"; final String desc = "Classification of smoking habits"; final String[] categories = new String[] { "Non-smoker", "Smoker", "Ex-smoker" }; final OutcomeMeasure m = new OutcomeMeasure(); m.setName(name); m.setDescription(desc); final CategoricalVariable var = new CategoricalVariable(); for (final String s : categories) { var.getCategory().add(s); } m.setCategorical(var); final PopulationCharacteristic catChar = new PopulationCharacteristic(name, new CategoricalVariableType(Arrays.asList(categories))); catChar.setDescription(desc); assertEntityEquals(catChar, JAXBConvertor.convertPopulationCharacteristic(m)); assertEquals(m, JAXBConvertor.convertPopulationCharacteristic(catChar)); } @Test public void testConvertIndication() { final String name = "Erectile Dysfunction"; final long code = 12; final org.drugis.addis.entities.data.Indication i1 = new org.drugis.addis.entities.data.Indication(); i1.setCode(code); i1.setName(name); final Indication i2 = new Indication(code, name); assertEntityEquals(i2, JAXBConvertor.convertIndication(i1)); assertEquals(i1, JAXBConvertor.convertIndication(i2)); } @Test public void testConvertDrug() { final String name = "Sildenafil"; final String code = "G04BE03"; final org.drugis.addis.entities.data.Drug d1 = new org.drugis.addis.entities.data.Drug(); d1.setAtcCode(code); d1.setName(name); final Drug d2 = new Drug(name, code); assertEntityEquals(d2, JAXBConvertor.convertDrug(d1)); assertEquals(d1, JAXBConvertor.convertDrug(d2)); } @Test public void testConvertArm() throws ConversionException { final int size = 99; final String name = "Sildenafil"; final org.drugis.addis.entities.data.Arm arm1 = new org.drugis.addis.entities.data.Arm(); arm1.setName(name + "-12"); arm1.setSize(size); final Notes armNotes = new Notes(); final Note note = new Note(Source.CLINICALTRIALS, "This is an arm note content"); armNotes.getNote().add(JAXBConvertor.convertNote(note)); arm1.setNotes(armNotes); final Arm arm2 = new Arm(name + "-12", size); arm2.getNotes().add(note); assertEntityEquals(arm2, JAXBConvertor.convertArm(arm1)); assertEquals(arm1, JAXBConvertor.convertArm(arm2)); } @Test public void testConvertTreatmentActivity() throws ConversionException { final String name = "Sildenafil"; final String code = "G04BE03"; final double quantity = 12.5; final double maxQuantity = 34.5; final Domain domain = new DomainImpl(); final Drug drug = new Drug(name, code); domain.getDrugs().add(drug); // fixdose part final org.drugis.addis.entities.data.FixedDose fixDose = new org.drugis.addis.entities.data.FixedDose(); fixDose.setQuantity(quantity); fixDose.setDoseUnit(JAXBConvertor .convertDoseUnit(DoseUnit.createMilliGramsPerDay())); final org.drugis.addis.entities.data.DrugTreatment dt = new org.drugis.addis.entities.data.DrugTreatment(); dt.setDrug(nameReference(name)); dt.setFixedDose(fixDose); final TreatmentActivity ta = buildFixedDoseTreatmentActivity(drug, quantity); assertTrue(EntityUtil.deepEqual(ta, JAXBConvertor .convertTreatmentActivity(wrapTreatment(dt), domain))); assertEquals(wrapTreatment(dt), JAXBConvertor.convertActivity(ta) .getTreatment()); // flexdose part final org.drugis.addis.entities.data.FlexibleDose flexDose = new org.drugis.addis.entities.data.FlexibleDose(); flexDose.setMinDose(quantity); flexDose.setMaxDose(maxQuantity); flexDose.setDoseUnit(JAXBConvertor .convertDoseUnit(DoseUnit.createMilliGramsPerDay())); final org.drugis.addis.entities.data.DrugTreatment dt2 = new org.drugis.addis.entities.data.DrugTreatment(); dt2.setDrug(nameReference(name)); dt2.setFlexibleDose(flexDose); final TreatmentActivity ta2 = buildFlexibleDoseTreatmentActivity(drug, quantity, maxQuantity); assertTrue(EntityUtil.deepEqual(ta2, JAXBConvertor .convertTreatmentActivity(wrapTreatment(dt2), domain))); assertEquals(wrapTreatment(dt2), JAXBConvertor.convertActivity(ta2) .getTreatment()); } private static Treatment wrapTreatment( final org.drugis.addis.entities.data.DrugTreatment dt2) { final Treatment t2 = new org.drugis.addis.entities.data.Treatment(); t2.getDrugTreatment().add(dt2); return t2; } @Test public void testConvertEpoch() throws DatatypeConfigurationException { final String name = "Randomization"; final Duration duration = DatatypeFactory.newInstance().newDuration("P42D"); final Epoch e = new Epoch(name, duration); final org.drugis.addis.entities.data.Epoch de = new org.drugis.addis.entities.data.Epoch(); de.setName(name); de.setDuration(duration); de.setNotes(new Notes()); assertEquals(de, JAXBConvertor.convertEpoch(e)); assertTrue(EntityUtil.deepEqual(e, JAXBConvertor.convertEpoch(de))); } @Test public void testConvertStudyActivity() throws ConversionException, DatatypeConfigurationException { final String drugName1 = "Sildenafil"; final String drugName2 = "Paroxeflox"; final String code1 = "G04BE03"; final String code2 = "G04BE04"; final double quantity = 12.5; final Domain domain = new DomainImpl(); final Drug drug1 = new Drug(drugName1, code1); final Drug drug2 = new Drug(drugName2, code2); domain.getDrugs().add(drug1); domain.getDrugs().add(drug2); // test with predefined activity final String activityName = "Randomization"; final PredefinedActivity activity = PredefinedActivity.RANDOMIZATION; StudyActivity sa = new StudyActivity(activityName, activity); final org.drugis.addis.entities.data.StudyActivity saData = new org.drugis.addis.entities.data.StudyActivity(); final org.drugis.addis.entities.data.Activity activData = new org.drugis.addis.entities.data.Activity(); activData.setPredefined(activity); saData.setName(activityName); saData.setActivity(activData); saData.setNotes(new Notes()); assertTrue(EntityUtil .deepEqual(sa, JAXBConvertor.convertStudyActivity(saData, new Study(), domain))); assertEquals(saData, JAXBConvertor.convertStudyActivity(sa)); // test with treatmentactivity final org.drugis.addis.entities.data.FixedDose fixDose = new org.drugis.addis.entities.data.FixedDose(); fixDose.setQuantity(quantity); fixDose.setDoseUnit(JAXBConvertor .convertDoseUnit(DoseUnit.createMilliGramsPerDay())); final org.drugis.addis.entities.data.DrugTreatment t = new org.drugis.addis.entities.data.DrugTreatment(); t.setDrug(nameReference(drugName1)); t.setFixedDose(fixDose); final TreatmentActivity ta1 = buildFixedDoseTreatmentActivity(drug1, quantity); sa = new StudyActivity(activityName, ta1); saData.getActivity().setPredefined(null); saData.getActivity().setTreatment(wrapTreatment(t)); assertTrue(EntityUtil .deepEqual(sa, JAXBConvertor.convertStudyActivity(saData, new Study(), domain))); assertEquals(saData, JAXBConvertor.convertStudyActivity(sa)); // test with Combination Treatment final org.drugis.addis.entities.data.DrugTreatment t2 = new org.drugis.addis.entities.data.DrugTreatment(); t2.setDrug(nameReference(drugName2)); t2.setFixedDose(fixDose); final org.drugis.addis.entities.data.Treatment ctData = new org.drugis.addis.entities.data.Treatment(); ctData.getDrugTreatment().add(t); ctData.getDrugTreatment().add(t2); final TreatmentActivity ct = new TreatmentActivity(); ct.getTreatments().add(JAXBConvertor.convertDrugTreatment(t, domain)); ct.getTreatments().add(JAXBConvertor.convertDrugTreatment(t2, domain)); sa = new StudyActivity(activityName, ct); saData.getActivity().setTreatment(ctData); assertTrue(EntityUtil .deepEqual(sa, JAXBConvertor.convertStudyActivity(saData, new Study(), domain))); assertEquals(saData, JAXBConvertor.convertStudyActivity(sa)); // test UsedBys final String armName1 = "armName1"; final String armName2 = "armName2"; final Arm arm1 = new Arm(armName1, 100); final Arm arm2 = new Arm(armName2, 200); final String epochName1 = "epoch 1"; final String epochName2 = "epoch 2"; final Epoch epoch1 = new Epoch(epochName1, DatatypeFactory.newInstance() .newDuration("P24D")); final Epoch epoch2 = new Epoch(epochName2, null); sa.setUsedBy(Collections.singleton(new UsedBy(arm1, epoch1))); // dummy study containing arms & epochs final Study s = new Study("studyname", ExampleData.buildIndicationChronicHeartFailure()); s.getEpochs().add(epoch1); s.getEpochs().add(epoch2); s.getArms().add(arm1); s.getArms().add(arm2); final ActivityUsedBy usedByData = buildActivityUsedby(armName1, epochName1); saData.getUsedBy().add(usedByData); assertTrue(EntityUtil.deepEqual(sa, JAXBConvertor.convertStudyActivity(saData, s, domain))); assertEquals(saData, JAXBConvertor.convertStudyActivity(sa)); final Set<UsedBy> usedBy = new HashSet<UsedBy>(sa.getUsedBy()); usedBy.add(new UsedBy(arm2, epoch2)); sa.setUsedBy(usedBy); assertFalse(EntityUtil.deepEqual(sa, JAXBConvertor.convertStudyActivity(saData, s, domain))); JUnitUtil.assertNotEquals(saData, JAXBConvertor.convertStudyActivity(sa)); } private ActivityUsedBy buildActivityUsedby(final String armName, final String epochName) { final ActivityUsedBy usedByData = new ActivityUsedBy(); usedByData.setArm(armName); usedByData.setEpoch(epochName); return usedByData; } private TreatmentActivity buildFixedDoseTreatmentActivity(final Drug drug, final double quantity) { return new TreatmentActivity( buildFixedDoseDrugTreatment(drug, quantity)); } private DrugTreatment buildFixedDoseDrugTreatment(final Drug drug, final double quantity) { final FixedDose dose = new FixedDose(quantity, DoseUnit.createMilliGramsPerDay()); final DrugTreatment dt = new DrugTreatment(drug, dose); return dt; } private TreatmentActivity buildFlexibleDoseTreatmentActivity(final Drug drug, final double minQuantity, final double maxQuantity) { final FlexibleDose dose = new FlexibleDose(new Interval<Double>(minQuantity, maxQuantity), DoseUnit.createMilliGramsPerDay()); return new TreatmentActivity(new DrugTreatment(drug, dose)); } @Test public void testConvertStudyChars() { final Allocation alloc = Allocation.RANDOMIZED; final Blinding blind = Blinding.UNKNOWN; final String title = "MyStudy"; final int centers = 5; final String objective = "The loftiest of goals"; final String incl = "Obesity"; final String excl = "Diabetes"; final Status status = Status.ENROLLING; final Source source = Source.MANUAL; final GregorianCalendar studyStart = new GregorianCalendar(2008, 8, 12); final GregorianCalendar studyEnd = new GregorianCalendar(2010, 1, 18); final GregorianCalendar created = new GregorianCalendar(2011, 2, 15); final PubMedIdList pmids = new PubMedIdList(); pmids.add(new PubMedId("1")); pmids.add(new PubMedId("12345")); final List<BigInteger> pmints = new ArrayList<BigInteger>(); for (final PubMedId id : pmids) { pmints.add(new BigInteger(id.getId())); } final org.drugis.addis.entities.data.Characteristics chars1 = new org.drugis.addis.entities.data.Characteristics(); chars1.setTitle(JAXBConvertor.stringWithNotes(title)); chars1.setAllocation(JAXBConvertor.allocationWithNotes(alloc)); chars1.setBlinding(JAXBConvertor.blindingWithNotes(blind)); chars1.setCenters(JAXBConvertor.intWithNotes(centers)); chars1.setObjective(JAXBConvertor.stringWithNotes(objective)); chars1.setStudyStart(JAXBConvertor.dateWithNotes(studyStart.getTime())); chars1.setStudyEnd(JAXBConvertor.dateWithNotes(studyEnd.getTime())); chars1.setStatus(JAXBConvertor.statusWithNotes(status)); chars1.setInclusion(JAXBConvertor.stringWithNotes(incl)); chars1.setExclusion(JAXBConvertor.stringWithNotes(excl)); final References refs = new References(); refs.getPubMedId().addAll(pmints); chars1.setReferences(refs); chars1.setSource(JAXBConvertor.sourceWithNotes(source)); chars1.setCreationDate(JAXBConvertor.dateWithNotes(created.getTime())); final CharacteristicsMap chars2 = new CharacteristicsMap(); chars2.put(BasicStudyCharacteristic.TITLE, new ObjectWithNotes<Object>( title)); chars2.put(BasicStudyCharacteristic.ALLOCATION, new ObjectWithNotes<Object>(alloc)); chars2.put(BasicStudyCharacteristic.BLINDING, new ObjectWithNotes<Object>(blind)); chars2.put(BasicStudyCharacteristic.CENTERS, new ObjectWithNotes<Object>(centers)); chars2.put(BasicStudyCharacteristic.OBJECTIVE, new ObjectWithNotes<Object>(objective)); chars2.put(BasicStudyCharacteristic.STUDY_START, new ObjectWithNotes<Object>(studyStart.getTime())); chars2.put(BasicStudyCharacteristic.STUDY_END, new ObjectWithNotes<Object>(studyEnd.getTime())); chars2.put(BasicStudyCharacteristic.INCLUSION, new ObjectWithNotes<Object>(incl)); chars2.put(BasicStudyCharacteristic.EXCLUSION, new ObjectWithNotes<Object>(excl)); chars2.put(BasicStudyCharacteristic.PUBMED, new ObjectWithNotes<Object>(pmids)); // References chars2.put(BasicStudyCharacteristic.STATUS, new ObjectWithNotes<Object>(status)); chars2.put(BasicStudyCharacteristic.SOURCE, new ObjectWithNotes<Object>(source)); chars2.put(BasicStudyCharacteristic.CREATION_DATE, new ObjectWithNotes<Object>(created.getTime())); assertEntityEquals(chars2, JAXBConvertor.convertStudyCharacteristics(chars1)); assertEquals(chars1, JAXBConvertor.convertStudyCharacteristics(chars2)); } @Test public void testConvertCharacteristicsWithNulls() { final String title = "title"; final org.drugis.addis.entities.data.Characteristics chars1 = new org.drugis.addis.entities.data.Characteristics(); initializeCharacteristics(chars1, title); final CharacteristicsMap chars2 = new CharacteristicsMap(); chars2.put(BasicStudyCharacteristic.TITLE, new ObjectWithNotes<Object>( title)); chars2.put(BasicStudyCharacteristic.PUBMED, new ObjectWithNotes<Object>(new PubMedIdList())); chars2.put(BasicStudyCharacteristic.CENTERS, new ObjectWithNotes<Object>(null)); assertEquals(chars1, JAXBConvertor.convertStudyCharacteristics(chars2)); assertEntityEquals(chars2, JAXBConvertor.convertStudyCharacteristics(chars1)); } @Test public void testConvertStudyOutcomeMeasure() throws ConversionException { final Domain domain = new DomainImpl(); ExampleData.initDefaultData(domain); final Epoch epoch = new Epoch("Measurement phase", EntityUtil.createDuration("P2D")); final List<Epoch> epochs = new ArrayList<Epoch>(); epochs.add(epoch); final Endpoint ep = ExampleData.buildEndpointHamd(); final org.drugis.addis.entities.data.StudyOutcomeMeasure om = new org.drugis.addis.entities.data.StudyOutcomeMeasure(); om.setNotes(new Notes()); om.setEndpoint(nameReference(ep.getName())); om.setPrimary(false); final RelativeTime rt = buildRelativeTime(epoch.getName(), ZERO_DAYS, RelativeTo.BEFORE_EPOCH_END); om.getWhenTaken().add(rt); assertEntityEquals(ep, JAXBConvertor .convertStudyOutcomeMeasure(om, epochs, domain).getValue()); final StudyOutcomeMeasure<Variable> sOm1 = new StudyOutcomeMeasure<Variable>( ep); final WhenTaken wt = new WhenTaken(ZERO_DAYS, RelativeTo.BEFORE_EPOCH_END, epoch); wt.commit(); sOm1.getWhenTaken().add(wt); assertEquals(JAXBConvertor.convertStudyOutcomeMeasure(sOm1), om); final AdverseEvent ade = ExampleData.buildAdverseEventDiarrhea(); domain.getAdverseEvents().add(ade); om.setEndpoint(null); om.setAdverseEvent(nameReference(ade.getName())); om.setPrimary(false); assertEntityEquals(ade, JAXBConvertor .convertStudyOutcomeMeasure(om, epochs, domain) .getValue()); final StudyOutcomeMeasure<Variable> sOm2 = new StudyOutcomeMeasure<Variable>( ade); sOm2.getWhenTaken().add(wt); assertEquals(JAXBConvertor.convertStudyOutcomeMeasure(sOm2), om); final PopulationCharacteristic pc = ExampleData.buildGenderVariable(); om.setAdverseEvent(null); om.setPopulationCharacteristic(nameReference(pc.getName())); assertEntityEquals(pc, JAXBConvertor .convertStudyOutcomeMeasure(om, epochs, domain).getValue()); final StudyOutcomeMeasure<Variable> sOm3 = new StudyOutcomeMeasure<Variable>( pc); sOm3.getWhenTaken().add(wt); assertEquals(JAXBConvertor.convertStudyOutcomeMeasure(sOm3), om); } @Test(expected = ConversionException.class) public void testConvertStudyOutcomeMeasureThrows() throws ConversionException { final Domain domain = new DomainImpl(); final org.drugis.addis.entities.data.StudyOutcomeMeasure om = new org.drugis.addis.entities.data.StudyOutcomeMeasure(); JAXBConvertor.convertStudyOutcomeMeasure(om, null, domain); } @Test public void testConvertStudyOutcomeMeasures() throws ConversionException { final Domain domain = new DomainImpl(); ExampleData.initDefaultData(domain); final Endpoint ep = ExampleData.buildEndpointHamd(); domain.getAdverseEvents().add(ExampleData.buildAdverseEventDiarrhea()); final LinkedHashMap<String, StudyOutcomeMeasure<?>> vars = new LinkedHashMap<String, StudyOutcomeMeasure<?>>(); final StudyOutcomeMeasure<Variable> epSom = new StudyOutcomeMeasure<Variable>( ep); final Epoch epoch = new Epoch("Measurement phase", EntityUtil.createDuration("P2D")); final List<Epoch> epochs = new ArrayList<Epoch>(); epochs.add(epoch); final WhenTaken wt = new WhenTaken(ZERO_DAYS, RelativeTo.BEFORE_EPOCH_END, epoch); wt.commit(); epSom.getWhenTaken().add(wt); vars.put("X", epSom); vars.put( "Y", new StudyOutcomeMeasure<Variable>(ExampleData .buildAdverseEventDiarrhea())); final org.drugis.addis.entities.data.StudyOutcomeMeasure epRef = new org.drugis.addis.entities.data.StudyOutcomeMeasure(); epRef.setNotes(new Notes()); epRef.setId("X"); epRef.setEndpoint(nameReference(ep.getName())); epRef.setPrimary(false); epRef.getWhenTaken().add( buildRelativeTime(epoch.getName(), wt.getDuration(), wt.getRelativeTo())); final org.drugis.addis.entities.data.StudyOutcomeMeasure adeRef = new org.drugis.addis.entities.data.StudyOutcomeMeasure(); adeRef.setNotes(new Notes()); adeRef.setId("Y"); adeRef.setAdverseEvent(nameReference(ExampleData .buildAdverseEventDiarrhea().getName())); adeRef.setPrimary(false); final StudyOutcomeMeasures oms = new StudyOutcomeMeasures(); oms.getStudyOutcomeMeasure().add(epRef); oms.getStudyOutcomeMeasure().add(adeRef); assertEquals(vars, JAXBConvertor.convertStudyOutcomeMeasures(oms, epochs, domain)); assertEquals(JAXBConvertor.convertStudyOutcomeMeasures(vars), oms); } /** * Test whether the numerical measurements (so NOT measurement time etc) are * converted properly */ @Test public void testConvertMeasurementData() throws ConversionException { final org.drugis.addis.entities.data.RateMeasurement rm = new org.drugis.addis.entities.data.RateMeasurement(); final int c = 12; final int s = 42; rm.setRate(c); rm.setSampleSize(s); org.drugis.addis.entities.data.Measurement meas = buildRateMeasurement( null, null, rm); final BasicRateMeasurement expected1 = new BasicRateMeasurement(c, s); assertEntityEquals(expected1, JAXBConvertor.convertMeasurement(meas)); assertEquals(meas, JAXBConvertor.convertMeasurement(expected1)); final org.drugis.addis.entities.data.ContinuousMeasurement cm = new org.drugis.addis.entities.data.ContinuousMeasurement(); final double m = 3.14; final double e = 2.71; cm.setMean(m); cm.setStdDev(e); cm.setSampleSize(s); meas = buildContinuousMeasurement(null, null, cm); final BasicContinuousMeasurement expected2 = new BasicContinuousMeasurement( m, e, s); assertEntityEquals(expected2, JAXBConvertor.convertMeasurement(meas)); assertEquals(meas, JAXBConvertor.convertMeasurement(expected2)); final List<CategoryMeasurement> cms = new ArrayList<CategoryMeasurement>(); final CategoryMeasurement c1 = new CategoryMeasurement(); c1.setName("Cats"); c1.setRate(18); final CategoryMeasurement c2 = new CategoryMeasurement(); c2.setName("Dogs"); c2.setRate(2145); cms.add(c1); cms.add(c2); meas = buildCategoricalMeasurement(null, null, cms); final HashMap<String, Integer> map = new HashMap<String, Integer>(); map.put("Dogs", 2145); map.put("Cats", 18); final FrequencyMeasurement expected3 = new FrequencyMeasurement( Arrays.asList((new String[] { "Cats", "Dogs" })), map); assertEntityEquals(expected3, JAXBConvertor.convertMeasurement(meas)); assertEquals(meas, JAXBConvertor.convertMeasurement(expected3)); } @Test public void testConvertMeasurements() throws ConversionException { final List<Arm> arms = new ArrayList<Arm>(); final Arm arm5 = new Arm("Opium", 42); arms.add(arm5); final Arm arm8 = new Arm("LSD", 42); arms.add(arm8); final List<Epoch> epochs = new ArrayList<Epoch>(); final Epoch mainPhase = new Epoch("Measurement phase", EntityUtil.createDuration("P2D")); epochs.add(mainPhase); final WhenTaken whenTaken = new WhenTaken(ZERO_DAYS, RelativeTo.BEFORE_EPOCH_END, mainPhase); whenTaken.commit(); final Map<String, StudyOutcomeMeasure<?>> oms = new HashMap<String, StudyOutcomeMeasure<?>>(); final String pcName = "popChar-hair"; final PopulationCharacteristic pc = new PopulationCharacteristic( "Hair Length", new ContinuousVariableType()); oms.put(pcName, new StudyOutcomeMeasure<Variable>(pc, whenTaken)); final String epName = "endpoint-tripping"; final Endpoint ep = new Endpoint("Tripping achieved", Endpoint.convertVarType(Type.RATE), Direction.HIGHER_IS_BETTER); oms.put(epName, new StudyOutcomeMeasure<Variable>(ep, whenTaken)); final String aeName = "ade-nojob"; final AdverseEvent ae = new AdverseEvent("Job loss", AdverseEvent.convertVarType(Type.RATE)); oms.put(aeName, new StudyOutcomeMeasure<Variable>(ae, whenTaken)); final org.drugis.addis.entities.data.RateMeasurement rm1 = new org.drugis.addis.entities.data.RateMeasurement(); rm1.setRate(10); rm1.setSampleSize(100); final BasicRateMeasurement crm1 = new BasicRateMeasurement(10, 100); final org.drugis.addis.entities.data.RateMeasurement rm2 = new org.drugis.addis.entities.data.RateMeasurement(); rm2.setRate(20); rm2.setSampleSize(100); final BasicRateMeasurement crm2 = new BasicRateMeasurement(20, 100); final org.drugis.addis.entities.data.ContinuousMeasurement cm1 = new org.drugis.addis.entities.data.ContinuousMeasurement(); cm1.setMean(1.5); cm1.setStdDev(1.0); cm1.setSampleSize(100); final BasicContinuousMeasurement ccm1 = new BasicContinuousMeasurement(1.5, 1.0, 100); final Measurements measurements = new Measurements(); final List<org.drugis.addis.entities.data.Measurement> list = measurements .getMeasurement(); list.add(buildRateMeasurement(arm5.getName(), epName, "Measurement phase", whenTaken.getDuration(), whenTaken.getRelativeTo(), rm1)); list.add(buildRateMeasurement(arm8.getName(), epName, "Measurement phase", whenTaken.getDuration(), whenTaken.getRelativeTo(), rm2)); list.add(buildRateMeasurement(arm5.getName(), aeName, "Measurement phase", whenTaken.getDuration(), whenTaken.getRelativeTo(), rm2)); list.add(buildRateMeasurement(arm8.getName(), aeName, "Measurement phase", whenTaken.getDuration(), whenTaken.getRelativeTo(), rm1)); list.add(buildContinuousMeasurement(arm5.getName(), pcName, "Measurement phase", whenTaken.getDuration(), whenTaken.getRelativeTo(), cm1)); list.add(buildContinuousMeasurement(arm8.getName(), pcName, "Measurement phase", whenTaken.getDuration(), whenTaken.getRelativeTo(), cm1)); list.add(buildContinuousMeasurement(null, pcName, "Measurement phase", whenTaken.getDuration(), whenTaken.getRelativeTo(), cm1)); final Map<MeasurementKey, BasicMeasurement> expected = new HashMap<MeasurementKey, BasicMeasurement>(); expected.put(new MeasurementKey(oms.get(epName), arm5, whenTaken), crm1); expected.put(new MeasurementKey(oms.get(epName), arm8, whenTaken), crm2); expected.put(new MeasurementKey(oms.get(aeName), arm5, whenTaken), crm2); expected.put(new MeasurementKey(oms.get(aeName), arm8, whenTaken), crm1); expected.put(new MeasurementKey(oms.get(pcName), arm5, whenTaken), ccm1); expected.put(new MeasurementKey(oms.get(pcName), arm8, whenTaken), ccm1); expected.put(new MeasurementKey(oms.get(pcName), null, whenTaken), ccm1); assertEquals(expected, JAXBConvertor.convertMeasurements(measurements, arms, epochs, oms)); JUnitUtil.assertAllAndOnly(measurements.getMeasurement(), JAXBConvertor .convertMeasurements(expected, oms).getMeasurement()); } private org.drugis.addis.entities.data.Measurement buildContinuousMeasurement( final String armName, final String omName, final String epochName, final Duration duration, final RelativeTo relativeTo, final org.drugis.addis.entities.data.ContinuousMeasurement cm) { final org.drugis.addis.entities.data.Measurement m = buildContinuousMeasurement( armName, omName, cm); m.setWhenTaken(buildRelativeTime(epochName, duration, relativeTo)); return m; } private org.drugis.addis.entities.data.Measurement buildContinuousMeasurement( final String armName, final String omName, final org.drugis.addis.entities.data.ContinuousMeasurement cm) { final org.drugis.addis.entities.data.Measurement m = initMeasurement(armName, omName); m.setContinuousMeasurement(cm); return m; } private RelativeTime buildRelativeTime(final String epochName, final Duration duration, final RelativeTo relativeTo) { final RelativeTime rt = new RelativeTime(); rt.setEpoch(nameReference(epochName)); rt.setRelativeTo(relativeTo); rt.setHowLong(duration); return rt; } private org.drugis.addis.entities.data.Measurement initMeasurement( final String armName, final String omName) { final org.drugis.addis.entities.data.Measurement m = new org.drugis.addis.entities.data.Measurement(); if (armName != null) { m.setArm(JAXBConvertor.nameReference(armName)); } if (omName != null) { m.setStudyOutcomeMeasure(JAXBConvertor.stringIdReference(omName)); } return m; } private org.drugis.addis.entities.data.Measurement buildRateMeasurement( final String armName, final String omName, final String epochName, final Duration duration, final RelativeTo relativeTo, final org.drugis.addis.entities.data.RateMeasurement rm) { final org.drugis.addis.entities.data.Measurement m = buildRateMeasurement( armName, omName, rm); m.setWhenTaken(buildRelativeTime(epochName, duration, relativeTo)); return m; } private org.drugis.addis.entities.data.Measurement buildRateMeasurement( final String armName, final String omName, final org.drugis.addis.entities.data.RateMeasurement rm) { final org.drugis.addis.entities.data.Measurement m = initMeasurement(armName, omName); m.setRateMeasurement(rm); return m; } @SuppressWarnings("unused") private org.drugis.addis.entities.data.Measurement buildCategoricalMeasurement( final String armName, final String omName, final List<CategoryMeasurement> cmList, final String epochName, final Duration duration, final RelativeTo relativeTo) { final org.drugis.addis.entities.data.Measurement m = buildCategoricalMeasurement( armName, omName, cmList); m.setWhenTaken(buildRelativeTime(epochName, duration, relativeTo)); return m; } private org.drugis.addis.entities.data.Measurement buildCategoricalMeasurement( final String armName, final String omName, final List<CategoryMeasurement> cmList) { final org.drugis.addis.entities.data.Measurement m = initMeasurement(armName, omName); final CategoricalMeasurement cms = new CategoricalMeasurement(); for (final CategoryMeasurement cm : cmList) { cms.getCategory().add(cm); } m.setCategoricalMeasurement(cms); return m; } public org.drugis.addis.entities.data.Study buildStudy(final String name) throws DatatypeConfigurationException, ConversionException { final String indicationName = ExampleData.buildIndicationDepression() .getName(); final String[] endpointNames = new String[] { ExampleData.buildEndpointHamd().getName(), ExampleData.buildEndpointCgi().getName() }; final String[] adverseEventName = new String[] { ExampleData .buildAdverseEventConvulsion().getName() }; final String[] popCharNames = new String[] { ExampleData.buildAgeVariable() .getName() }; final String title = "WHOO"; // Arms final Arms arms = new Arms(); final String fluoxArmName = "fluox arm"; final String paroxArmName = "parox arm"; arms.getArm().add(buildArmData(fluoxArmName, 100)); arms.getArm().add(buildArmData(paroxArmName, 42)); final String randomizationEpochName = "Randomization"; final String mainEpochName = "Main phase"; final Epochs epochs = new Epochs(); epochs.getEpoch().add(buildEpoch(randomizationEpochName, null)); epochs.getEpoch().add( buildEpoch(mainEpochName, DatatypeFactory.newInstance() .newDuration("P2D"))); final StudyActivities sas = new StudyActivities(); sas.getStudyActivity().add( buildStudyActivity("Randomization", PredefinedActivity.RANDOMIZATION)); final DrugTreatment fluoxActivity = new DrugTreatment( ExampleData.buildDrugFluoxetine(), new FixedDose(12.5, DoseUnit.createMilliGramsPerDay())); final DrugTreatment sertrActivity = new DrugTreatment( ExampleData.buildDrugSertraline(), new FixedDose(12.5, DoseUnit.createMilliGramsPerDay())); final List<DrugTreatment> combTreatment = Arrays.asList(fluoxActivity, sertrActivity); sas.getStudyActivity().add( buildStudyActivity("Fluox + Sertr fixed dose", new TreatmentActivity(combTreatment))); final DrugTreatment paroxActivity = new DrugTreatment( ExampleData.buildDrugParoxetine(), new FixedDose(12.0, DoseUnit.createMilliGramsPerDay())); sas.getStudyActivity().add( buildStudyActivity("Parox fixed dose", new TreatmentActivity( paroxActivity))); final ActivityUsedBy aub0 = buildActivityUsedby(fluoxArmName, randomizationEpochName); final ActivityUsedBy aub1 = buildActivityUsedby(paroxArmName, randomizationEpochName); final ActivityUsedBy aub2 = buildActivityUsedby(fluoxArmName, mainEpochName); final ActivityUsedBy aub3 = buildActivityUsedby(paroxArmName, mainEpochName); sas.getStudyActivity().get(0).getUsedBy().add(aub0); sas.getStudyActivity().get(0).getUsedBy().add(aub1); sas.getStudyActivity().get(1).getUsedBy().add(aub2); sas.getStudyActivity().get(2).getUsedBy().add(aub3); final org.drugis.addis.entities.data.Study study = buildStudySkeleton(name, title, indicationName, endpointNames, adverseEventName, popCharNames, arms, epochs, sas); study.getCharacteristics().setCenters(JAXBConvertor.intWithNotes(3)); study.getCharacteristics().setAllocation( JAXBConvertor.allocationWithNotes(Allocation.RANDOMIZED)); final List<org.drugis.addis.entities.data.Measurement> dataMeasurements = study .getMeasurements().getMeasurement(); final RateMeasurement rm1 = new RateMeasurement(); rm1.setRate(10); rm1.setSampleSize(110); final ContinuousMeasurement cm1 = new ContinuousMeasurement(); cm1.setMean(0.2); cm1.setStdDev(0.01); cm1.setSampleSize(110); // note: order is important! addRateMeasurement(rm1, fluoxArmName, "endpoint-" + endpointNames[0], dataMeasurements); addRateMeasurement(rm1, paroxArmName, "endpoint-" + endpointNames[0], dataMeasurements); addContinuousMeasurement(cm1, null, "popChar-" + popCharNames[0], dataMeasurements); return study; } private void addRateMeasurement(final RateMeasurement rm, final String armName, final String omName, final List<org.drugis.addis.entities.data.Measurement> dataMeasurements) { final org.drugis.addis.entities.data.Measurement m = buildRateMeasurement( armName, omName, "Main phase", ZERO_DAYS, RelativeTo.BEFORE_EPOCH_END, rm); dataMeasurements.add(m); } private void addContinuousMeasurement(final ContinuousMeasurement cm, final String armName, final String omName, final List<org.drugis.addis.entities.data.Measurement> dataMeasurements) { final org.drugis.addis.entities.data.Measurement m = buildContinuousMeasurement( armName, omName, "Main phase", ZERO_DAYS, RelativeTo.BEFORE_EPOCH_END, cm); dataMeasurements.add(m); } private org.drugis.addis.entities.data.StudyActivity buildStudyActivity( final String name, final Activity activity) throws ConversionException { final org.drugis.addis.entities.data.StudyActivity sa = new org.drugis.addis.entities.data.StudyActivity(); sa.setName(name); final org.drugis.addis.entities.data.Activity a = JAXBConvertor .convertActivity(activity); sa.setActivity(a); sa.setNotes(new Notes()); return sa; } private org.drugis.addis.entities.data.Epoch buildEpoch(final String epochName1, final Duration d) { final org.drugis.addis.entities.data.Epoch e = new org.drugis.addis.entities.data.Epoch(); e.setName(epochName1); e.setDuration(d); e.setNotes(new Notes()); return e; } private org.drugis.addis.entities.data.Arm buildArmData(final String name, final int size) { final org.drugis.addis.entities.data.Arm a = new org.drugis.addis.entities.data.Arm(); a.setName(name); a.setSize(size); a.setNotes(new Notes()); return a; } private void initializeCharacteristics(final Characteristics characteristics, final String title) { characteristics.setAllocation(JAXBConvertor .allocationWithNotes(Allocation.UNKNOWN)); characteristics.setBlinding(JAXBConvertor .blindingWithNotes(Blinding.UNKNOWN)); characteristics.setCenters(JAXBConvertor.intWithNotes(null)); characteristics.setCreationDate(JAXBConvertor.dateWithNotes(null)); characteristics.setExclusion(JAXBConvertor.stringWithNotes(null)); characteristics.setInclusion(JAXBConvertor.stringWithNotes(null)); characteristics.setObjective(JAXBConvertor.stringWithNotes(null)); characteristics.setReferences(new References()); characteristics.setSource(JAXBConvertor.sourceWithNotes(Source.MANUAL)); characteristics .setStatus(JAXBConvertor.statusWithNotes(Status.UNKNOWN)); characteristics.setStudyEnd(JAXBConvertor.dateWithNotes(null)); characteristics.setStudyStart(JAXBConvertor.dateWithNotes(null)); characteristics.setTitle(JAXBConvertor.stringWithNotes(title)); } private void addContinuousMeasurements(final org.drugis.addis.entities.data.Study study, final String omName) { final ContinuousMeasurement cm = new ContinuousMeasurement(); cm.setMean(0.5); cm.setSampleSize(50); cm.setStdDev(1.0); for (final org.drugis.addis.entities.data.Arm arm : study.getArms().getArm()) { // ARGH addContinuousMeasurement(cm, arm.getName(), omName, study.getMeasurements().getMeasurement()); } } private org.drugis.addis.entities.data.Study buildStudySkeleton( final String name, final String title, final String indicationName, final String[] endpointName, final String[] adverseEventName, final String[] popCharName, final Arms arms, final Epochs epochs, final StudyActivities sas) { final org.drugis.addis.entities.data.Study study = new org.drugis.addis.entities.data.Study(); study.setName(name); final NameReferenceWithNotes indicationRef = JAXBConvertor .nameReferenceWithNotes(indicationName); study.setIndication(indicationRef); // Outcome measures (empty) final StudyOutcomeMeasures studyOutcomeMeasures = new StudyOutcomeMeasures(); study.setStudyOutcomeMeasures(studyOutcomeMeasures); // Outcome measures: Endpoints for (final String epName : endpointName) { final org.drugis.addis.entities.data.StudyOutcomeMeasure ep = new org.drugis.addis.entities.data.StudyOutcomeMeasure(); ep.setNotes(new Notes()); ep.setId("endpoint-" + epName); ep.setEndpoint(nameReference(epName)); ep.setPrimary(false); studyOutcomeMeasures.getStudyOutcomeMeasure().add(ep); } // Outcome measures: Adverse events for (final String aeName : adverseEventName) { final org.drugis.addis.entities.data.StudyOutcomeMeasure ae = new org.drugis.addis.entities.data.StudyOutcomeMeasure(); ae.setNotes(new Notes()); ae.setId("adverseEvent-" + aeName); ae.setAdverseEvent(nameReference(aeName)); ae.getWhenTaken(); ae.setPrimary(false); studyOutcomeMeasures.getStudyOutcomeMeasure().add(ae); } // Outcome measures: Population chars for (final String pcName : popCharName) { final org.drugis.addis.entities.data.StudyOutcomeMeasure pc = new org.drugis.addis.entities.data.StudyOutcomeMeasure(); pc.setNotes(new Notes()); pc.setId("popChar-" + pcName); pc.setPopulationCharacteristic(nameReference(pcName)); pc.setPrimary(false); pc.getWhenTaken(); studyOutcomeMeasures.getStudyOutcomeMeasure().add(pc); } // Arms study.setArms(arms); // Epochs study.setEpochs(epochs); // StudyActivities study.setActivities(sas); // Study characteristics final Characteristics chars = new Characteristics(); study.setCharacteristics(chars); initializeCharacteristics(study.getCharacteristics(), title); // Measurements (empty) final Measurements measurements = new Measurements(); study.setMeasurements(measurements); study.setNotes(new Notes()); return study; } @Test public void testConvertStudy() throws ConversionException, DatatypeConfigurationException { final Domain domain = new DomainImpl(); ExampleData.initDefaultData(domain); final String name = "My fancy study"; final org.drugis.addis.entities.data.Study study = buildStudy(name); // ---------------------------------------- final Study study2 = new Study(); study2.setName(name); study2.setIndication(ExampleData.buildIndicationDepression()); final Epoch epoch1 = new Epoch("Randomization", null); final Epoch epoch2 = new Epoch("Main phase", EntityUtil.createDuration("P2D")); study2.getEpochs().add(epoch1); study2.getEpochs().add(epoch2); study2.getEndpoints().add( new org.drugis.addis.entities.StudyOutcomeMeasure<Endpoint>( ExampleData.buildEndpointHamd())); study2.getEndpoints().add( new org.drugis.addis.entities.StudyOutcomeMeasure<Endpoint>( ExampleData.buildEndpointCgi())); study2.getAdverseEvents() .add(new org.drugis.addis.entities.StudyOutcomeMeasure<AdverseEvent>( ExampleData.buildAdverseEventConvulsion())); study2.addVariable(ExampleData.buildAgeVariable()); final Arm fluoxArm = new Arm("fluox arm", 100); study2.getArms().add(fluoxArm); final Arm paroxArm = new Arm("parox arm", 42); study2.getArms().add(paroxArm); final StudyActivity randomizationActivity = new StudyActivity( "Randomization", PredefinedActivity.RANDOMIZATION); final DrugTreatment fluoxDrugTreatment = new DrugTreatment( ExampleData.buildDrugFluoxetine(), new FixedDose(12.5, DoseUnit.createMilliGramsPerDay())); final DrugTreatment sertrDrugTreatment = new DrugTreatment( ExampleData.buildDrugSertraline(), new FixedDose(12.5, DoseUnit.createMilliGramsPerDay())); ; final StudyActivity combTreatmentActivity = new StudyActivity( "Fluox + Sertr fixed dose", new TreatmentActivity( Arrays.asList(fluoxDrugTreatment, sertrDrugTreatment))); final StudyActivity paroxTreatmentActivity = new StudyActivity( "Parox fixed dose", new TreatmentActivity(new DrugTreatment( ExampleData.buildDrugParoxetine(), new FixedDose(12.0, DoseUnit.createMilliGramsPerDay())))); study2.getStudyActivities().add(randomizationActivity); study2.getStudyActivities().add(combTreatmentActivity); study2.getStudyActivities().add(paroxTreatmentActivity); study2.setCharacteristic(BasicStudyCharacteristic.TITLE, "WHOO"); study2.setCharacteristic(BasicStudyCharacteristic.CENTERS, 3); study2.setCharacteristic(BasicStudyCharacteristic.ALLOCATION, Allocation.RANDOMIZED); study2.setCharacteristic(BasicStudyCharacteristic.PUBMED, new PubMedIdList()); study2.setCharacteristic(BasicStudyCharacteristic.CREATION_DATE, null); study2.setStudyActivityAt(fluoxArm, epoch1, randomizationActivity); study2.setStudyActivityAt(paroxArm, epoch1, randomizationActivity); study2.setStudyActivityAt(fluoxArm, epoch2, combTreatmentActivity); study2.setStudyActivityAt(paroxArm, epoch2, paroxTreatmentActivity); study2.setMeasurement(study2.findStudyOutcomeMeasure(ExampleData.buildEndpointHamd()), paroxArm, new BasicRateMeasurement(10, 110)); study2.setMeasurement(study2.findStudyOutcomeMeasure(ExampleData.buildEndpointHamd()), fluoxArm, new BasicRateMeasurement(10, 110)); study2.setMeasurement(study2.findStudyOutcomeMeasure(ExampleData.buildAgeVariable()), new BasicContinuousMeasurement(0.2, 0.01, 110)); assertEntityEquals(study2, JAXBConvertor.convertStudy(study, domain)); assertEquals(study, JAXBConvertor.convertStudy(study2)); } @Test public void testConvertNote() { final org.drugis.addis.entities.data.Note note = new org.drugis.addis.entities.data.Note(); note.setSource(Source.CLINICALTRIALS); final String text = "Some text here"; note.setValue(text); final Note expected = new Note(Source.CLINICALTRIALS, text); assertEquals(expected, JAXBConvertor.convertNote(note)); assertEquals(note, JAXBConvertor.convertNote(expected)); } @Test public void testConvertStudyWithNotes() throws ConversionException, DatatypeConfigurationException { final Domain domain = new DomainImpl(); ExampleData.initDefaultData(domain); final String name = "My fancy study"; final org.drugis.addis.entities.data.Study studyData = buildStudy(name); final Study studyEntity = JAXBConvertor.convertStudy(studyData, domain); final Note armNote = new Note(Source.CLINICALTRIALS, "Some text here"); studyData.getArms().getArm().get(0).getNotes().getNote() .add(JAXBConvertor.convertNote(armNote)); studyData.getArms().getArm().get(1).getNotes().getNote() .add(JAXBConvertor.convertNote(armNote)); studyEntity.getArms().get(0).getNotes().add(armNote); studyEntity.getArms().get(1).getNotes().add(armNote); final Note adeNote = new Note(Source.MANUAL, "I would not like to suffer from this!"); studyData.getStudyOutcomeMeasures().getStudyOutcomeMeasure().get(2) .getNotes().getNote().add(JAXBConvertor.convertNote(adeNote)); studyEntity.getAdverseEvents().get(0).getNotes().add(adeNote); final Note hamdNote = new Note(Source.MANUAL, "Mmm... HAM!"); studyData.getStudyOutcomeMeasures().getStudyOutcomeMeasure().get(0) .getNotes().getNote().add(JAXBConvertor.convertNote(hamdNote)); studyEntity.getEndpoints().get(0).getNotes().add(hamdNote); final Note charNote = new Note(Source.CLINICALTRIALS, "A randomized double blind trial of something"); studyData.getCharacteristics().getAllocation().getNotes().getNote() .add(JAXBConvertor.convertNote(charNote)); studyEntity.getCharacteristics() .get(BasicStudyCharacteristic.ALLOCATION).getNotes() .add(charNote); final Note indicationNote = new Note(Source.CLINICALTRIALS, "Depression! Aah!"); studyData.getIndication().getNotes().getNote() .add(JAXBConvertor.convertNote(indicationNote)); studyEntity.getIndicationWithNotes().getNotes().add(indicationNote); final Note idNote = new Note(Source.CLINICALTRIALS, "NCT1337"); studyData.getNotes().getNote().add(JAXBConvertor.convertNote(idNote)); studyEntity.getNotes().add(idNote); assertEntityEquals(studyEntity, JAXBConvertor.convertStudy(studyData, domain)); assertEquals(studyData, JAXBConvertor.convertStudy(studyEntity)); } final class MetaAnalysisAlternativeComparator implements Comparator<MetaAnalysisAlternative> { @Override public int compare(final MetaAnalysisAlternative o1, final MetaAnalysisAlternative o2) { final SortedSet<String> drugs1 = getDrugs(o1); final SortedSet<String> drugs2 = getDrugs(o2); drugs1.removeAll(drugs2); drugs2.removeAll(drugs1); if (drugs1.size() == 0 && drugs2.size() == 0) { return 0; } if (drugs1.size() == 0) { return -1; } if (drugs2.size() == 0) { return 1; } return drugs1.iterator().next().compareTo(drugs2.iterator().next()); } private SortedSet<String> getDrugs(final MetaAnalysisAlternative o1) { final SortedSet<String> set = new TreeSet<String>(); for (final Object a : o1.getTreatmentDefinition().getRichCategoryOrTrivialCategory()) { set.add(getDrugFromTrivialOrRichCategory(a)); } return set; } } public class MetaAnalysisWithStudies { public org.drugis.addis.entities.data.PairwiseMetaAnalysis d_pwma; public org.drugis.addis.entities.data.NetworkMetaAnalysis d_nwma; public List<org.drugis.addis.entities.data.Study> d_studies; public MetaAnalysisWithStudies( final org.drugis.addis.entities.data.PairwiseMetaAnalysis ma, final List<org.drugis.addis.entities.data.Study> s) { d_pwma = ma; d_studies = s; } public MetaAnalysisWithStudies( final org.drugis.addis.entities.data.NetworkMetaAnalysis ma, final List<org.drugis.addis.entities.data.Study> s) { d_nwma = ma; d_studies = s; } } @Test public void testConvertPairWiseMetaAnalysis() throws ConversionException, DatatypeConfigurationException { final Domain domain = new DomainImpl(); ExampleData.initDefaultData(domain); final String name = "Fluox-Venla Diarrhea for PMA"; final MetaAnalysisWithStudies ma = buildPairWiseMetaAnalysis(name); // ----------------------------------- final Study study = JAXBConvertor.convertStudy(ma.d_studies.get(0), domain); final List<StudyArmsEntry> armsList = new ArrayList<StudyArmsEntry>(); final Arm base = study.getArms().get(0); final Arm subject = study.getArms().get(1); armsList.add(new StudyArmsEntry(study, base, subject)); domain.getStudies().add(study); RandomEffectsMetaAnalysis pwma = new RandomEffectsMetaAnalysis( name, ExampleData.buildEndpointHamd(), study.getTreatmentDefinition(base), study.getTreatmentDefinition(subject), armsList, false); assertEntityEquals(pwma, JAXBConvertor.convertPairWiseMetaAnalysis(ma.d_pwma, domain)); assertEquals(ma.d_pwma, JAXBConvertor.convertPairWiseMetaAnalysis(pwma)); } private MetaAnalysisWithStudies buildPairWiseMetaAnalysis(final String name) throws DatatypeConfigurationException, ConversionException { final String study_name = "My fancy pair-wise study"; final org.drugis.addis.entities.data.Study study = buildStudy(study_name); final org.drugis.addis.entities.data.PairwiseMetaAnalysis pwma = new org.drugis.addis.entities.data.PairwiseMetaAnalysis(); pwma.setName(name); pwma.setIndication(nameReference(ExampleData .buildIndicationDepression().getName())); pwma.setEndpoint(nameReference(ExampleData.buildEndpointHamd() .getName())); // Base final MetaAnalysisAlternative combi = new MetaAnalysisAlternative(); if (combi.getTreatmentDefinition() == null) { combi.setTreatmentDefinition(createTrivialTreatmentDefinition(new String[] {ExampleData.buildDrugFluoxetine().getName(), ExampleData.buildDrugSertraline().getName() })); } final AnalysisArms combiArms = new AnalysisArms(); combiArms.getArm().add( JAXBConvertor.armReference(study_name, study.getArms().getArm() .get(0).getName())); combi.setArms(combiArms); pwma.getAlternative().add(combi); // Subject final MetaAnalysisAlternative parox = new MetaAnalysisAlternative(); if (parox.getTreatmentDefinition() == null) { parox.setTreatmentDefinition(createTrivialTreatmentDefinition(new String[] {ExampleData.buildDrugParoxetine().getName()} )); } final AnalysisArms paroxArms = new AnalysisArms(); paroxArms.getArm().add( JAXBConvertor.armReference(study_name, study.getArms().getArm() .get(1).getName())); parox.setArms(paroxArms); pwma.getAlternative().add(parox); return new MetaAnalysisWithStudies(pwma, Collections.singletonList(study)); } public MetaAnalysisWithStudies buildNetworkMetaAnalysis(final String name) throws DatatypeConfigurationException, ConversionException { final String study1Name = "A Network Meta analysis study 1"; final String study2Name = "A Network Meta analysis study 2"; final String study3Name = "A Network Meta analysis study 3"; final String[] endpointNames = new String[] { ExampleData.buildEndpointHamd().getName(), ExampleData.buildEndpointCgi().getName() }; final Arms arms1 = new Arms(); final Epochs epochs1 = new Epochs(); final StudyActivities sas1 = new StudyActivities(); final String combiArmName = "fluox + sertr arm"; final String sertraArmName = "sertra arm"; final String paroxArmName = "parox arm"; final String mainPhaseName = "Main phase"; final String treatmentName = "Treatment"; final DrugTreatment fluox = buildFixedDoseDrugTreatment(ExampleData.buildDrugFluoxetine(), 12.5); final DrugTreatment sertr = buildFixedDoseDrugTreatment(ExampleData.buildDrugSertraline(), 12.5); final TreatmentActivity combiFixedDose = new TreatmentActivity(Arrays.asList(fluox, sertr)); final TreatmentActivity sertraFixedDose = buildFixedDoseTreatmentActivity(ExampleData.buildDrugSertraline(), 12.5); final TreatmentActivity paroxFixedDose = buildFixedDoseTreatmentActivity(ExampleData.buildDrugParoxetine(), 12.5); buildArmEpochTreatmentActivityCombination(arms1, epochs1, sas1, 20, combiArmName, mainPhaseName, treatmentName, combiFixedDose); buildArmEpochTreatmentActivityCombination(arms1, epochs1, sas1, 20, sertraArmName, mainPhaseName, treatmentName, sertraFixedDose); final String indicationName = ExampleData.buildIndicationDepression().getName(); final String[] popCharNames = new String[] {ExampleData.buildAgeVariable().getName()}; final String[] adverseEventNames = new String[] {}; final org.drugis.addis.entities.data.Study study1 = buildStudySkeleton(study1Name, study1Name, indicationName, endpointNames, adverseEventNames, popCharNames, arms1, epochs1, sas1); final String omName = "endpoint-" + ExampleData.buildEndpointCgi().getName(); addContinuousMeasurements(study1, omName); final Arms arms2 = new Arms(); final Epochs epochs2 = new Epochs(); final StudyActivities sas2 = new StudyActivities(); buildArmEpochTreatmentActivityCombination(arms2, epochs2, sas2, 20, paroxArmName, mainPhaseName, treatmentName, paroxFixedDose); buildArmEpochTreatmentActivityCombination(arms2, epochs2, sas2, 20, sertraArmName, mainPhaseName, treatmentName, sertraFixedDose); final org.drugis.addis.entities.data.Study study2 = buildStudySkeleton(study2Name, study2Name, indicationName, endpointNames, adverseEventNames, popCharNames, arms2, epochs2, sas2); addContinuousMeasurements(study2, omName); final Arms arms3 = new Arms(); final Epochs epochs3 = new Epochs(); final StudyActivities sas3 = new StudyActivities(); buildArmEpochTreatmentActivityCombination(arms3, epochs3, sas3, 20, sertraArmName, mainPhaseName, treatmentName, sertraFixedDose); buildArmEpochTreatmentActivityCombination(arms3, epochs3, sas3, 20, paroxArmName, mainPhaseName, treatmentName, paroxFixedDose); buildArmEpochTreatmentActivityCombination(arms3, epochs3, sas3, 20, combiArmName, mainPhaseName, treatmentName, combiFixedDose); final org.drugis.addis.entities.data.Study study3 = buildStudySkeleton(study3Name, study3Name, indicationName, endpointNames, adverseEventNames, popCharNames, arms3, epochs3, sas3); addContinuousMeasurements(study3, omName); final org.drugis.addis.entities.data.NetworkMetaAnalysis nma = new org.drugis.addis.entities.data.NetworkMetaAnalysis(); nma.setName(name); nma.setIndication(nameReference(indicationName)); nma.setEndpoint(nameReference(ExampleData.buildEndpointCgi().getName())); final List<org.drugis.addis.entities.data.Study> studiesl = new ArrayList<org.drugis.addis.entities.data.Study>(); studiesl.add(study1); studiesl.add(study2); studiesl.add(study3); // Fluoxetine final MetaAnalysisAlternative combi = new MetaAnalysisAlternative(); if (combi.getTreatmentDefinition() == null) { combi.setTreatmentDefinition(createTrivialTreatmentDefinition(new String[] {ExampleData.buildDrugFluoxetine().getName(), ExampleData.buildDrugSertraline().getName() })); } final AnalysisArms combiArms = new AnalysisArms(); combiArms.getArm().add(JAXBConvertor.armReference(study1Name, arms1.getArm().get(0).getName())); // study 1 combiArms.getArm().add(JAXBConvertor.armReference(study3Name, arms3.getArm().get(2).getName())); // study 3 combi.setArms(combiArms); nma.getAlternative().add(combi); // Paroxetine final MetaAnalysisAlternative parox = new MetaAnalysisAlternative(); if (parox.getTreatmentDefinition() == null) { parox.setTreatmentDefinition(createTrivialTreatmentDefinition(new String[] {ExampleData.buildDrugParoxetine().getName() })); } final AnalysisArms paroxArms = new AnalysisArms(); paroxArms.getArm().add(JAXBConvertor.armReference(study2Name, arms2.getArm().get(0).getName())); // study 2 paroxArms.getArm().add(JAXBConvertor.armReference(study3Name, arms3.getArm().get(1).getName())); // study 3 parox.setArms(paroxArms); nma.getAlternative().add(parox); // Sertraline final MetaAnalysisAlternative setr = new MetaAnalysisAlternative(); if (setr.getTreatmentDefinition() == null) { setr.setTreatmentDefinition(createTrivialTreatmentDefinition(new String[] {ExampleData.buildDrugSertraline().getName() })); } final AnalysisArms sertrArms = new AnalysisArms(); sertrArms.getArm().add(JAXBConvertor.armReference(study1Name, arms1.getArm().get(1).getName())); // study 1 sertrArms.getArm().add(JAXBConvertor.armReference(study2Name, arms2.getArm().get(1).getName())); // study 2 sertrArms.getArm().add(JAXBConvertor.armReference(study3Name, arms3.getArm().get(0).getName())); // study 3 setr.setArms(sertrArms); nma.getAlternative().add(setr); return new MetaAnalysisWithStudies(nma, studiesl); } private void buildArmEpochTreatmentActivityCombination(final Arms arms, final Epochs epochs, final StudyActivities sas, final int armSize, final String armName, final String mainPhaseName, final String treatmentName, final TreatmentActivity treatmentActivity) throws ConversionException { arms.getArm().add(buildArmData(armName, armSize)); epochs.getEpoch().add(buildEpoch(mainPhaseName, EntityUtil.createDuration("P2D"))); final org.drugis.addis.entities.data.StudyActivity studyActivity = buildStudyActivity(treatmentName, treatmentActivity); studyActivity.getUsedBy().add(buildActivityUsedby(armName, mainPhaseName)); sas.getStudyActivity().add(studyActivity); } @Test public void testConvertMetaAnalyses() throws NullPointerException, ConversionException, DatatypeConfigurationException { final Domain domain = new DomainImpl(); ExampleData.initDefaultData(domain); final MetaAnalyses analyses = new MetaAnalyses(); final MetaAnalysisWithStudies ma1 = buildPairWiseMetaAnalysis("XXX"); analyses.getPairwiseMetaAnalysisOrNetworkMetaAnalysis().add(ma1.d_pwma); final MetaAnalysisWithStudies ma2 = buildNetworkMetaAnalysis("XXX 2"); analyses.getPairwiseMetaAnalysisOrNetworkMetaAnalysis().add(ma2.d_nwma); addStudies(domain, ma1); addStudies(domain, ma2); final List<MetaAnalysis> expected = new ArrayList<MetaAnalysis>(); expected.add(JAXBConvertor.convertPairWiseMetaAnalysis(ma1.d_pwma, domain)); expected.add(NetworkMetaAnalysisConverter.load(ma2.d_nwma, domain)); assertEntityEquals(expected, JAXBConvertor.convertMetaAnalyses(analyses, domain)); assertEquals(analyses, JAXBConvertor.convertMetaAnalyses(expected)); } private void addStudies(final Domain domain, final MetaAnalysisWithStudies ma1) throws ConversionException { for (final org.drugis.addis.entities.data.Study study : ma1.d_studies) { domain.getStudies().add(JAXBConvertor.convertStudy(study, domain)); } } @Test public void testConvertDecisionContext() throws ConversionException, DatatypeConfigurationException { final String comparator = "Comparator bla"; final String perspective = "Perspective"; final String therapy = "Purely psychosomatic"; final String horizon = "New horizons"; final DecisionContext entityContext = new DecisionContext(); entityContext.setComparator(comparator); entityContext.setStakeholderPerspective(perspective); entityContext.setTherapeuticContext(therapy); entityContext.setTimeHorizon(horizon); final org.drugis.addis.entities.data.DecisionContext dataContext = new org.drugis.addis.entities.data.DecisionContext(); dataContext.setComparator(comparator); dataContext.setStakeholderPerspective(perspective); dataContext.setTherapeuticContext(therapy); dataContext.setTimeHorizon(horizon); assertEquals(dataContext, JAXBConvertor.convertDecisionContext(entityContext)); assertEntityEquals(entityContext, JAXBConvertor.convertDecisionContext(dataContext)); } @Test public void testConvertStudyBenefitRiskAnalysis() throws ConversionException, DatatypeConfigurationException { final Domain domain = new DomainImpl(); ExampleData.initDefaultData(domain); domain.getAdverseEvents().add(ExampleData.buildAdverseEventDiarrhea()); final String name = "BR Analysis"; final String[] adverseEvents = { ExampleData.buildAdverseEventDiarrhea().getName(), ExampleData.buildAdverseEventConvulsion().getName() }; final String[] endpoints = { ExampleData.buildEndpointCgi().getName(), ExampleData.buildEndpointHamd().getName() }; final String[] whichArms = { "parox arm high", "parox arm low" }; final Arms arms = new Arms(); final Epochs epochs = new Epochs(); final StudyActivities sas = new StudyActivities(); final TreatmentActivity fluoxTA = buildFixedDoseTreatmentActivity( ExampleData.buildDrugFluoxetine(), 13); final TreatmentActivity paroxTAHigh = buildFixedDoseTreatmentActivity( ExampleData.buildDrugParoxetine(), 45); final TreatmentActivity paroxTALow = buildFixedDoseTreatmentActivity( ExampleData.buildDrugParoxetine(), 12); buildArmEpochTreatmentActivityCombination(arms, epochs, sas, 12, "fluox arm", "Main phase", "Treatment", fluoxTA); buildArmEpochTreatmentActivityCombination(arms, epochs, sas, 23, "parox arm high", "Main phase", "Treatment", paroxTAHigh); buildArmEpochTreatmentActivityCombination(arms, epochs, sas, 11, "parox arm low", "Main phase", "Treatment", paroxTALow); final org.drugis.addis.entities.data.Study study = buildStudySkeleton( "Study for Benefit-Risk", "HI", ExampleData .buildIndicationDepression().getName(), endpoints, adverseEvents, new String[] {}, arms, epochs, sas); final DecisionContext entityContext = new DecisionContext(); final org.drugis.addis.entities.data.StudyBenefitRiskAnalysis br = buildStudyBR( name, study, endpoints, adverseEvents, whichArms[1], whichArms, entityContext); final Study convertStudy = JAXBConvertor.convertStudy(study, domain); domain.getStudies().add(convertStudy); final List<org.drugis.addis.entities.OutcomeMeasure> criteria = new ArrayList<org.drugis.addis.entities.OutcomeMeasure>(); criteria.add(ExampleData.buildEndpointCgi()); criteria.add(ExampleData.buildAdverseEventConvulsion()); final List<Arm> alternatives = new ArrayList<Arm>(); alternatives.add(convertStudy.getArms().get(1)); alternatives.add(convertStudy.getArms().get(2)); final StudyBenefitRiskAnalysis expected = new StudyBenefitRiskAnalysis(name, ExampleData.buildIndicationDepression(), convertStudy, criteria, alternatives.get(1), alternatives, AnalysisType.LyndOBrien, entityContext); assertEntityEquals(expected, JAXBConvertor.convertStudyBenefitRiskAnalysis(br, domain)); assertEquals(br, JAXBConvertor.convertStudyBenefitRiskAnalysis(expected)); } private org.drugis.addis.entities.data.StudyBenefitRiskAnalysis buildStudyBR( final String name, final org.drugis.addis.entities.data.Study study, final String[] endpoints, final String[] adverseEvents, final String baseline, final String[] whichArms, final DecisionContext entityContext) { final RateMeasurement rm = new RateMeasurement(); rm.setRate(2); rm.setSampleSize(50); final ContinuousMeasurement cm = new ContinuousMeasurement(); cm.setMean(0.5); cm.setSampleSize(50); cm.setStdDev(1.0); for (final String armName : whichArms) { for (final String aeName : adverseEvents) { // FIXME: Magic numbers in endpoint indices (too tired) addRateMeasurement(rm, armName, "adverseEvent-" + aeName, study.getMeasurements().getMeasurement()); addRateMeasurement(rm, armName, "endpoint-" + endpoints[1], study.getMeasurements().getMeasurement()); addContinuousMeasurement(cm, armName, "endpoint-" + endpoints[0], study.getMeasurements().getMeasurement()); } } final org.drugis.addis.entities.data.StudyBenefitRiskAnalysis br = new org.drugis.addis.entities.data.StudyBenefitRiskAnalysis(); br.setName(name); br.setIndication(nameReference(study.getIndication().getName())); br.setStudy(nameReference(study.getName())); br.setAnalysisType(AnalysisType.LyndOBrien); br.setOutcomeMeasures(new OutcomeMeasuresReferences()); br.getOutcomeMeasures().getEndpoint().add(nameReference(endpoints[0])); br.getOutcomeMeasures().getAdverseEvent().add(nameReference(adverseEvents[1])); final ArmReferences armRefs = new ArmReferences(); for (final String whichArm : whichArms) { armRefs.getArm().add( JAXBConvertor.armReference(study.getName(), whichArm)); } br.setArms(armRefs); final BaselineArmReference baselineRef = new BaselineArmReference(); baselineRef.setArm(JAXBConvertor.armReference(study.getName(), baseline)); br.setBaseline(baselineRef); if (entityContext != null) { br.setDecisionContext(JAXBConvertor .convertDecisionContext(entityContext)); } return br; } @Test public void testConvertMetaBenefitRiskAnalysis() throws ConversionException, NullPointerException, IllegalArgumentException, EntityIdExistsException, DatatypeConfigurationException { final Domain domain = new DomainImpl(); ExampleData.initDefaultData(domain); final String name = "Meta Benefit-Risk Analysis Test"; // create entities final String pairWiseName = "First Pair-Wise"; final String networkMetaName = "Second Network Meta Analysis"; final MetaAnalysisWithStudies ma1 = buildPairWiseMetaAnalysis(pairWiseName); final MetaAnalysisWithStudies ma2 = buildNetworkMetaAnalysis(networkMetaName); // add to the domain addStudies(domain, ma1); addStudies(domain, ma2); final RandomEffectsMetaAnalysis ma1ent = JAXBConvertor .convertPairWiseMetaAnalysis(ma1.d_pwma, domain); domain.getMetaAnalyses().add(ma1ent); final MetaAnalysis ma2ent = NetworkMetaAnalysisConverter.load( ma2.d_nwma, domain); domain.getMetaAnalyses().add(ma2ent); // create BR analysis final String[][] drugs = { new String[] { "Fluoxetine", "Sertraline" }, new String[] { "Paroxetine" } }; final String indication = ma1.d_pwma.getIndication().getName(); final String[] meta = { pairWiseName, networkMetaName }; final DecisionContext entityContext = new DecisionContext(); final org.drugis.addis.entities.data.MetaBenefitRiskAnalysis br = buildMetaBR( name, drugs, indication, meta, entityContext); final List<MetaAnalysis> metaList = new ArrayList<MetaAnalysis>(); metaList.add(ma1ent); metaList.add(ma2ent); final List<TreatmentDefinition> drugsEnt = new ArrayList<TreatmentDefinition>( ma1ent.getAlternatives()); final TreatmentDefinition baseline = drugsEnt.get(0); drugsEnt.remove(baseline); final MetaBenefitRiskAnalysis expected = new MetaBenefitRiskAnalysis(name, ma1ent.getIndication(), metaList, baseline, drugsEnt, AnalysisType.SMAA, entityContext); assertEntityEquals(expected, JAXBConvertor.convertMetaBenefitRiskAnalysis(br, domain)); assertEquals(br, JAXBConvertor.convertMetaBenefitRiskAnalysis(expected)); } private org.drugis.addis.entities.data.MetaBenefitRiskAnalysis buildMetaBR( final String name, final String[][] drugs, final String indication, final String[] meta, final DecisionContext entityContext) { final org.drugis.addis.entities.data.MetaBenefitRiskAnalysis br = new org.drugis.addis.entities.data.MetaBenefitRiskAnalysis(); br.setName(name); br.setAnalysisType(AnalysisType.SMAA); br.setIndication(nameReference(indication)); final Baseline baseline = new org.drugis.addis.entities.data.MetaBenefitRiskAnalysis.Baseline(); final org.drugis.addis.entities.data.TreatmentDefinition tc = createTrivialTreatmentDefinition(drugs[0]); baseline.setTreatmentDefinition(tc); br.setBaseline(baseline); br.setAlternatives(createAnalysisAlternative(drugs[0], drugs[1])); final MetaAnalysisReferences mRefs = new MetaAnalysisReferences(); for (final String mName : meta) { mRefs.getMetaAnalysis().add(nameReference(mName)); } br.setMetaAnalyses(mRefs); br.setDecisionContext(JAXBConvertor .convertDecisionContext(entityContext)); return br; } private org.drugis.addis.entities.data.TreatmentDefinition createTrivialTreatmentDefinition(final String[] drugs) { final org.drugis.addis.entities.data.TreatmentDefinition tc = new org.drugis.addis.entities.data.TreatmentDefinition(); for(final String drug : drugs) { final TrivialCategory trivialCategory = new TrivialCategory(); trivialCategory.setDrug(drug); tc.getRichCategoryOrTrivialCategory().add(trivialCategory); } return tc; } private org.drugis.addis.entities.data.MetaBenefitRiskAnalysis.Alternatives createAnalysisAlternative(final String[] ... drugs) { final Alternatives alternatives = new org.drugis.addis.entities.data.MetaBenefitRiskAnalysis.Alternatives(); for(final String[] drugPair : drugs) { final org.drugis.addis.entities.data.TreatmentDefinition tc = new org.drugis.addis.entities.data.TreatmentDefinition(); for(final String drug : drugPair) { final TrivialCategory trivial = new TrivialCategory(); trivial.setDrug(drug); tc.getRichCategoryOrTrivialCategory().add(trivial); } alternatives.getTreatmentDefinition().add(tc); } return alternatives; } @Test public void testConvertBenefitRiskAnalyses() throws ConversionException, EntityIdExistsException, DatatypeConfigurationException { final Domain domain = new DomainImpl(); ExampleData.initDefaultData(domain); domain.getAdverseEvents().add(ExampleData.buildAdverseEventDiarrhea()); final String name = "BR Analysis"; final String[] adverseEvents = { ExampleData.buildAdverseEventDiarrhea().getName(), ExampleData.buildAdverseEventConvulsion().getName() }; final String[] endpoints = { ExampleData.buildEndpointCgi().getName(), ExampleData.buildEndpointHamd().getName() }; final Arms arms = new Arms(); final Epochs epochs = new Epochs(); final StudyActivities sas = new StudyActivities(); final TreatmentActivity fluoxTA = buildFixedDoseTreatmentActivity( ExampleData.buildDrugFluoxetine(), 13); final TreatmentActivity paroxTAHigh = buildFixedDoseTreatmentActivity( ExampleData.buildDrugParoxetine(), 45); final TreatmentActivity paroxTALow = buildFixedDoseTreatmentActivity( ExampleData.buildDrugParoxetine(), 12); buildArmEpochTreatmentActivityCombination(arms, epochs, sas, 12, "fluox arm", "Main phase", "Treatment", fluoxTA); buildArmEpochTreatmentActivityCombination(arms, epochs, sas, 23, "parox arm high", "Main phase", "Treatment", paroxTAHigh); buildArmEpochTreatmentActivityCombination(arms, epochs, sas, 11, "parox arm low", "Main phase", "Treatment", paroxTALow); final org.drugis.addis.entities.data.Study study = buildStudySkeleton( "Study for Benefit-Risk", "HI", ExampleData .buildIndicationDepression().getName(), endpoints, adverseEvents, new String[] {}, arms, epochs, sas); final String[] whichArms = { "parox arm high", "parox arm low" }; final org.drugis.addis.entities.data.StudyBenefitRiskAnalysis studyBR = buildStudyBR( name, study, endpoints, adverseEvents, whichArms[0], whichArms, null); final Study convertStudy = JAXBConvertor.convertStudy(study, domain); domain.getStudies().add(convertStudy); final String pwName = "pairwise MA"; final String nwName = "network MA"; final MetaAnalysisWithStudies pairWiseMetaAnalysis = buildPairWiseMetaAnalysis(pwName); final MetaAnalysisWithStudies networkMetaAnalysis = buildNetworkMetaAnalysis(nwName); addStudies(domain, pairWiseMetaAnalysis); domain.getMetaAnalyses().add( JAXBConvertor.convertPairWiseMetaAnalysis( pairWiseMetaAnalysis.d_pwma, domain)); addStudies(domain, networkMetaAnalysis); domain.getMetaAnalyses().add( NetworkMetaAnalysisConverter.load( networkMetaAnalysis.d_nwma, domain)); final org.drugis.addis.entities.data.MetaBenefitRiskAnalysis metaBR = buildMetaBR( "Meta BR", new String[][] { new String[] { ExampleData.buildDrugFluoxetine().getName(), ExampleData.buildDrugSertraline().getName() }, new String[] { ExampleData.buildDrugParoxetine() .getName() } }, ExampleData .buildIndicationDepression().getName(), new String[] { nwName, pwName }, null); final BenefitRiskAnalyses analyses = new BenefitRiskAnalyses(); analyses.getStudyBenefitRiskAnalysisOrMetaBenefitRiskAnalysis().add( metaBR); analyses.getStudyBenefitRiskAnalysisOrMetaBenefitRiskAnalysis().add( studyBR); final List<BenefitRiskAnalysis<?>> expected = new ArrayList<BenefitRiskAnalysis<?>>(); expected.add(JAXBConvertor.convertMetaBenefitRiskAnalysis(metaBR, domain)); expected.add(JAXBConvertor.convertStudyBenefitRiskAnalysis(studyBR, domain)); assertEntityEquals(expected, JAXBConvertor.convertBenefitRiskAnalyses(analyses, domain)); assertEquals(analyses, JAXBConvertor.convertBenefitRiskAnalyses(expected)); } @Test public void testDefaultDataRoundTripConversion() throws Exception { doRoundTripTest(getTransformedDefaultData(), false); } @Test public void testEdarbiDataRoundTripConversion() throws Exception { doRoundTripTest(getTransformedEdarbiData(), false); } @Test public void testSmallerDataRoundTripConversion() throws Exception { doRoundTripTest(getTransformedTestData(), true); } @Test @Ignore public void testMysteriousDataRoundTripConversion() throws Exception { // FIXME: fails because the transform1-2.xslt (or later in the chain) doesn't add missing characteristics // The first study has only 8/13 characteristics defined. doRoundTripTest(getTestData(TEST_DATA_A_1), false); } @Test public void testCombinationTreatmentRoundTripConversion() throws Exception { doRoundTripTest(getTestData(TEST_DATA_3), false); } @Test public void testVersion5RoundTripConversion() throws Exception { doRoundTripTest(getTestData(TEST_DATA_5), false); } /** * @param sort Whether to sort the elements of the source XML to prevent order differences. */ public void doRoundTripTest(final InputStream transformedXmlStream, boolean sort) throws JAXBException, ConversionException, SAXException, IOException { System.clearProperty("javax.xml.transform.TransformerFactory"); final AddisData data = (AddisData) d_unmarshaller.unmarshal(transformedXmlStream); if (sort) { sortMeasurements(data); sortAnalysisArms(data); sortBenefitRiskOutcomes(data); sortCategoricalMeasurementCategories(data); sortMetaAnalysisAlternatives(data); sortUsedBys(data); } final Domain domainData = JAXBConvertor.convertAddisDataToDomain(data); final AddisData roundTrip = JAXBConvertor.convertDomainToAddisData(domainData); assertXMLSimilar(data, roundTrip); } private void sortMetaAnalysisAlternatives(final AddisData data) { for (final org.drugis.addis.entities.data.MetaAnalysis ma : data.getMetaAnalyses().getPairwiseMetaAnalysisOrNetworkMetaAnalysis()) { List<MetaAnalysisAlternative> alternatives; if (ma instanceof NetworkMetaAnalysis) { final NetworkMetaAnalysis nma = (NetworkMetaAnalysis) ma; alternatives = nma.getAlternative(); } else { final PairwiseMetaAnalysis nma = (PairwiseMetaAnalysis) ma; alternatives = nma.getAlternative(); } Collections.sort(alternatives, new MetaAnalysisAlternativeComparator()); } } private static void assertXMLSimilar(final AddisData expected, final AddisData actual) throws JAXBException, SAXException, IOException { final ByteArrayOutputStream os1 = new ByteArrayOutputStream(); final ByteArrayOutputStream os2 = new ByteArrayOutputStream(); d_marshaller.marshal(actual, os1); d_marshaller.marshal(expected, os2); final Diff myDiff = new Diff(os1.toString(), os2.toString()); assertTrue("XML similar " + myDiff.toString(), myDiff.similar()); } private void sortUsedBys(final AddisData data) { for (final org.drugis.addis.entities.data.Study s : data.getStudies() .getStudy()) { for (final org.drugis.addis.entities.data.StudyActivity a : s .getActivities().getStudyActivity()) { Collections.sort(a.getUsedBy(), new UsedByComparator()); } } } private class UsedByComparator implements Comparator<org.drugis.addis.entities.data.ActivityUsedBy> { @Override public int compare(final ActivityUsedBy o1, final ActivityUsedBy o2) { if (o1.getArm().compareTo(o2.getArm()) != 0) { return o1.getArm().compareTo(o2.getArm()); } return o1.getEpoch().compareTo(o2.getEpoch()); } } private static void sortCategoricalMeasurementCategories(final AddisData data) { for (final org.drugis.addis.entities.data.Study s : data.getStudies() .getStudy()) { for (final org.drugis.addis.entities.data.Measurement m : s .getMeasurements().getMeasurement()) { if (m.getCategoricalMeasurement() != null) { final CategoricalVariable var = findVariable(data, s, m .getStudyOutcomeMeasure().getId()); Collections.sort(m.getCategoricalMeasurement() .getCategory(), new CategoryMeasurementComparator( var)); } } } } private static CategoricalVariable findVariable(final AddisData data, final org.drugis.addis.entities.data.Study s, final String id) { String varName = null; for (final org.drugis.addis.entities.data.StudyOutcomeMeasure som : s .getStudyOutcomeMeasures().getStudyOutcomeMeasure()) { if (som.getId().equals(id)) { varName = som.getPopulationCharacteristic().getName(); } } for (final OutcomeMeasure om : data.getPopulationCharacteristics() .getPopulationCharacteristic()) { if (om.getName().equals(varName)) { return om.getCategorical(); } } return null; } private static void sortBenefitRiskOutcomes(final AddisData data) { for (final Object obj : data.getBenefitRiskAnalyses() .getStudyBenefitRiskAnalysisOrMetaBenefitRiskAnalysis()) { if (obj instanceof org.drugis.addis.entities.data.StudyBenefitRiskAnalysis) { final org.drugis.addis.entities.data.StudyBenefitRiskAnalysis sbr = (org.drugis.addis.entities.data.StudyBenefitRiskAnalysis) obj; Collections.sort(sbr.getOutcomeMeasures().getAdverseEvent(), new NameReferenceComparator()); Collections.sort(sbr.getOutcomeMeasures().getEndpoint(), new NameReferenceComparator()); } } } private static void sortAnalysisArms(final AddisData data) { for (final org.drugis.addis.entities.data.MetaAnalysis ma : data .getMetaAnalyses() .getPairwiseMetaAnalysisOrNetworkMetaAnalysis()) { List<MetaAnalysisAlternative> alternatives = null; if (ma instanceof org.drugis.addis.entities.data.PairwiseMetaAnalysis) { final org.drugis.addis.entities.data.PairwiseMetaAnalysis pwma = (org.drugis.addis.entities.data.PairwiseMetaAnalysis) ma; alternatives = pwma.getAlternative(); } if (ma instanceof org.drugis.addis.entities.data.NetworkMetaAnalysis) { final org.drugis.addis.entities.data.NetworkMetaAnalysis nwma = (org.drugis.addis.entities.data.NetworkMetaAnalysis) ma; alternatives = nwma.getAlternative(); } for (final MetaAnalysisAlternative a : alternatives) { Collections.sort(a.getArms().getArm(), new ArmComparator()); Collections.sort(a.getTreatmentDefinition().getRichCategoryOrTrivialCategory(), new CategoryComparator()); } } } private static void sortMeasurements(final AddisData data) { for (final org.drugis.addis.entities.data.Study s : data.getStudies() .getStudy()) { Collections.sort(s.getMeasurements().getMeasurement(), new MeasurementComparator(s)); } } public static class CategoryMeasurementComparator implements Comparator<CategoryMeasurement> { private final CategoricalVariable d_var; public CategoryMeasurementComparator(final CategoricalVariable var) { d_var = var; } @Override public int compare(final CategoryMeasurement o1, final CategoryMeasurement o2) { return d_var.getCategory().indexOf(o1.getName()) - d_var.getCategory().indexOf(o2.getName()); } } public static class NameReferenceComparator implements Comparator<org.drugis.addis.entities.data.NameReference> { @Override public int compare(final org.drugis.addis.entities.data.NameReference o1, final org.drugis.addis.entities.data.NameReference o2) { return o1.getName().compareTo(o2.getName()); } } public static class ArmComparator implements Comparator<org.drugis.addis.entities.data.ArmReference> { @Override public int compare(final ArmReference o1, final ArmReference o2) { return o1.getStudy().compareTo(o2.getStudy()); } } public static class CategoryComparator implements Comparator<Object> { @Override public int compare(final Object o1, final Object o2) { return getDrugFromTrivialOrRichCategory(o1).compareTo(getDrugFromTrivialOrRichCategory(o2)); } } public static String getDrugFromTrivialOrRichCategory(final Object o1) { if (o1 instanceof TrivialCategory) { return ((TrivialCategory) o1).getDrug(); } else { return ((TreatmentCategoryRef)o1).getDrug(); } } // FIXME: is *not* compatible with MeasurementKey.MeasurementKeyComparator! public static class MeasurementComparator implements Comparator<org.drugis.addis.entities.data.Measurement> { private final org.drugis.addis.entities.data.Study d_study; public MeasurementComparator(final org.drugis.addis.entities.data.Study s) { d_study = s; } @Override public int compare(final org.drugis.addis.entities.data.Measurement o1, final org.drugis.addis.entities.data.Measurement o2) { final org.drugis.addis.entities.data.StudyOutcomeMeasure om1 = findOutcomeMeasure(o1 .getStudyOutcomeMeasure().getId()); final org.drugis.addis.entities.data.StudyOutcomeMeasure om2 = findOutcomeMeasure(o2 .getStudyOutcomeMeasure().getId()); if (!om1.equals(om2)) { return compareOutcomeMeasure(om1, om2); } if (o1.getArm() == null) { return o2.getArm() == null ? 0 : 1; } if (o2.getArm() == null) { return -1; } return o1.getArm().getName().compareTo(o2.getArm().getName()); } private static int compareOutcomeMeasure( final org.drugis.addis.entities.data.StudyOutcomeMeasure om1, final org.drugis.addis.entities.data.StudyOutcomeMeasure om2) { if (om1.getEndpoint() != null) { return (om2.getEndpoint() == null ? -1 : compareOutcomeId(om1, om2)); } else if (om1.getAdverseEvent() != null) { if (om2.getEndpoint() != null) { return 1; } return (om2.getAdverseEvent() == null ? -1 : compareOutcomeId( om1, om2)); } else { return om2.getPopulationCharacteristic() == null ? 1 : compareOutcomeId(om1, om2); } } private static int compareOutcomeId( final org.drugis.addis.entities.data.StudyOutcomeMeasure om1, final org.drugis.addis.entities.data.StudyOutcomeMeasure om2) { return om1.getId().compareTo(om2.getId()); } private org.drugis.addis.entities.data.StudyOutcomeMeasure findOutcomeMeasure( final String id) { final List<org.drugis.addis.entities.data.StudyOutcomeMeasure> oms = d_study .getStudyOutcomeMeasures().getStudyOutcomeMeasure(); for (final org.drugis.addis.entities.data.StudyOutcomeMeasure om : oms) { if (om.getId().equals(id)) { return om; } } return null; } } @Test public void testDateWithNotes() { final Date oldXmlDate = new GregorianCalendar(2010, 11 - 1, 12).getTime(); final DateWithNotes dwn = JAXBConvertor.dateWithNotes(oldXmlDate); final XMLGregorianCalendar cal = JAXBConvertor.dateToXml(oldXmlDate); final DateWithNotes dwn2 = new DateWithNotes(); dwn2.setNotes(new Notes()); dwn2.setValue(cal); assertEquals(dwn, dwn2); } @Test @Ignore public void writeTransformedXML() throws TransformerException, IOException { final InputStream transformedXmlStream = getTransformedDefaultData(); final FileOutputStream output = new FileOutputStream("transformedDefaultData.xml"); PubMedDataBankRetriever.copyStream(transformedXmlStream, output); output.close(); } public static InputStream getTestData(final String fileName) throws TransformerException, IOException { InputStream is = JAXBConvertorTest.class.getResourceAsStream(fileName); final XmlFormatType xmlType = JAXBHandler.determineXmlType(is); int version = 0; if (xmlType.isFuture()) { throw new RuntimeException("XML Version from the future"); } if (xmlType.isLegacy()) { is = JAXBConvertor.transformLegacyXML(is); version = 1; } else { version = xmlType.getVersion(); } return JAXBConvertor.transformToLatest(is, version); } private static InputStream getTransformedDefaultData() throws TransformerException, IOException { return getTestData(TEST_DATA_PATH + "depressionExample.addis"); } private static InputStream getTransformedEdarbiData() throws TransformerException, IOException { return getTestData(TEST_DATA_PATH + "hypertensionExample.addis"); } private static InputStream getTransformedTestData() throws TransformerException, IOException { return getTestData(TEST_DATA_A_0); } }