/*
* (c) 2008- RANDI2 Core Development Team
*
* This file is part of RANDI2.
*
* RANDI2 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.
*
* RANDI2 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
* RANDI2. If not, see <http://www.gnu.org/licenses/>.
*/
package de.randi2.testUtility.utility;
import java.io.File;
import java.io.FileWriter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.Locale;
import java.util.Random;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.sql.DataSource;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.DatabaseSequenceFilter;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.FilteredDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.filter.ITableFilter;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.authentication.dao.ReflectionSaltSource;
import org.springframework.security.authentication.dao.SystemWideSaltSource;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import de.randi2.model.Login;
import de.randi2.model.Person;
import de.randi2.model.Role;
import de.randi2.model.SubjectProperty;
import de.randi2.model.TreatmentArm;
import de.randi2.model.Trial;
import de.randi2.model.TrialSite;
import de.randi2.model.TrialSubject;
import de.randi2.model.criteria.DichotomousCriterion;
import de.randi2.model.criteria.constraints.DichotomousConstraint;
import de.randi2.model.enumerations.Gender;
import de.randi2.model.enumerations.TrialStatus;
import de.randi2.model.randomization.BlockRandomizationConfig;
import de.randi2.model.randomization.BlockRandomizationConfig.TYPE;
import de.randi2.services.ServiceException;
import de.randi2.services.TrialService;
import de.randi2.services.TrialSiteService;
import de.randi2.services.UserService;
import de.randi2.unsorted.ConstraintViolatedException;
import de.randi2.utility.BoxedException;
import de.randi2.utility.security.RolesAndRights;
/**
* This class insert two user and two trial sites (name: Trial Site 1 and Trial
* Site 2: password per trial site 1$heidelberg). One test trial (trial site
* stratified block randomization)
*
* User Trial Site 1:
* <ul>
* <li>role: Administrator</li>
* <li>login: admin@trialsite1.de</li>
* <li>password: 1$heidelberg</li>
* </ul>
*
* <ul>
* <li>role: Principal Investigator</li>
* <li>login: p_investigator@trialsite1.de</li>
* <li>password: 1$heidelberg</li>
* </ul>
*
** <ul>
* <li>role: Investigator</li>
* <li>login: investigator@trialsite1.de</li>
* <li>password: 1$heidelberg</li>
* </ul>
*
* *
* <ul>
* <li>role: Statistican</li>
* <li>login: statistican@trialsite1.de</li>
* <li>password: 1$heidelberg</li>
* </ul>
*
* <ul>
* <li>role: Monitor</li>
* <li>login: monitor@trialsite1.de</li>
* <li>password: 1$heidelberg</li>
* </ul>
*
* User Trial Site 2
*
* <ul>
* <li>role: Principal Investigator</li>
* <li>login: p_investigator@trialsite2.de</li>
* <li>password: 1$heidelberg</li>
* </ul>
*
* @author Daniel Schrimpf <dschrimpf@users.sourceforge.net>
*
*/
public class Bootstrap {
private RolesAndRights rolesAndRights;
private EntityManager entityManager;
private PasswordEncoder passwordEncoder;
private ReflectionSaltSource saltSourceUser;
long time1 = System.nanoTime();
private SystemWideSaltSource saltSourceTrialSite;
private TrialService trialService;
private TrialSiteService trialSiteService;
private UserService userService;
private DataSource dataSource;
public Bootstrap() throws ServiceException {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
"classpath:/META-INF/spring-bootstrap.xml");
rolesAndRights = (RolesAndRights) ctx.getBean("rolesAndRights");
entityManager = (((EntityManagerFactory) ctx.getBean("entityManagerFactory")).createEntityManager());
passwordEncoder = (PasswordEncoder) ctx.getBean("passwordEncoder");
saltSourceUser = (ReflectionSaltSource) ctx.getBean("saltSourceUser");
saltSourceTrialSite = (SystemWideSaltSource) ctx
.getBean("saltSourceTrialSite");
trialService = (TrialService) ctx.getBean("trialService");
trialSiteService = (TrialSiteService) ctx.getBean("trialSiteService");
userService = (UserService) ctx.getBean("userService");
dataSource = (DataSource) ctx.getBean("dataSource");
init();
try {
IDatabaseConnection conn = new DatabaseConnection(dataSource.getConnection());
ITableFilter filter = new DatabaseSequenceFilter(conn);
IDataSet dataset = new FilteredDataSet(filter, conn.createDataSet());
FlatXmlDataSet.write(dataset, new FileWriter(new File(
"testDBUNIT.xml")));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void init() throws ServiceException {
long time1 = System.nanoTime();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
entityManager.persist(Role.ROLE_INVESTIGATOR);
entityManager.persist(Role.ROLE_USER);
entityManager.persist(Role.ROLE_STATISTICAN);
entityManager.persist(Role.ROLE_MONITOR);
entityManager.persist(
Role.ROLE_P_INVESTIGATOR);
entityManager.persist(Role.ROLE_ANONYMOUS);
entityManager.persist(Role.ROLE_ADMIN);
Role.ROLE_ADMIN.getRolesToAssign().add(Role.ROLE_ADMIN);
entityManager.merge(Role.ROLE_ADMIN);
transaction.commit();
transaction.begin();
Role roleAdmin = (Role) entityManager.find(
Role.class, 1L);
roleAdmin.getRolesToAssign().add(roleAdmin);
entityManager.merge(roleAdmin);
transaction.commit();
transaction.begin();
Person cp1 = new Person();
cp1.setFirstname("Contact");
cp1.setSurname("Person");
cp1.setEmail("randi2@action.ms");
cp1.setPhone("1234567");
cp1.setSex(Gender.MALE);
Person cp2 = new Person();
cp2.setFirstname("Contact");
cp2.setSurname("Person");
cp2.setEmail("randi2@action.ms");
cp2.setPhone("1234567");
cp2.setSex(Gender.MALE);
Person adminP = new Person();
adminP.setFirstname("Max");
adminP.setSurname("Administrator");
adminP.setEmail("randi2@action.ms");
adminP.setPhone("1234567");
adminP.setSex(Gender.MALE);
Login adminL = new Login();
adminL.setUsername("admin@trialsite1.de");
adminL.setPassword(passwordEncoder.encodePassword("1$heidelberg",
saltSourceUser.getSalt(adminL)));
adminL.setPerson(adminP);
adminL.setPrefLocale(Locale.GERMANY);
adminL.addRole(Role.ROLE_ADMIN);
adminL.setPrefLocale(Locale.GERMAN);
entityManager.persist(adminL);
TrialSite trialSite = new TrialSite();
trialSite.setCity("Heidelberg");
trialSite.setCountry("Germany");
trialSite.setName("Trial Site 1");
trialSite.setPostcode("69120");
trialSite.setStreet("INF");
trialSite.setPassword(passwordEncoder.encodePassword("1$heidelberg",
saltSourceTrialSite.getSystemWideSalt()));
trialSite.setContactPerson(cp1);
trialSite.getMembers().add(adminP);
entityManager.persist(trialSite);
transaction.commit();
rolesAndRights.registerPerson(adminL);
rolesAndRights.grantRights(adminL, trialSite);
rolesAndRights.grantRights(trialSite, trialSite);
entityManager.clear();
AnonymousAuthenticationToken authToken = new AnonymousAuthenticationToken(
"anonymousUser", adminL, new ArrayList<GrantedAuthority>(
adminL.getAuthorities()));
// Perform authentication
SecurityContextHolder.getContext().setAuthentication(authToken);
SecurityContextHolder.getContext().getAuthentication()
.setAuthenticated(true);
Person userPInv = new Person();
userPInv.setFirstname("Maxi");
userPInv.setSurname("Investigator");
userPInv.setEmail("randi2@action.ms");
userPInv.setPhone("1234567");
// userPInv.setTrialSite(trialSite);
Login userLInv = new Login();
userLInv.setUsername("investigator@trialsite1.de");
userLInv.setPassword("1$heidelberg");
userLInv.setPerson(userPInv);
userLInv.setPrefLocale(Locale.GERMANY);
userLInv.addRole(Role.ROLE_INVESTIGATOR);
userLInv.setPrefLocale(Locale.GERMAN);
userService.create(userLInv, trialSite);
Person userPPInv = new Person();
userPPInv.setFirstname("Max");
userPPInv.setSurname("PInvestigator");
userPPInv.setEmail("randi2@action.ms");
userPPInv.setPhone("1234567");
userPPInv.setSex(Gender.MALE);
// userPPInv.setTrialSite(trialSite);
Login userLPInv = new Login();
userLPInv.setUsername("p_investigator@trialsite1.de");
userLPInv.setPassword("1$heidelberg");
userLPInv.setPerson(userPPInv);
userLPInv.setPrefLocale(Locale.GERMANY);
userLPInv.addRole(Role.ROLE_P_INVESTIGATOR);
userLPInv.setPrefLocale(Locale.GERMAN);
userService.create(userLPInv, trialSite);
Person userP = new Person();
userP.setFirstname("Maxi");
userP.setSurname("Monitor");
userP.setEmail("randi2@action.ms");
userP.setPhone("1234567");
userP.setSex(Gender.FEMALE);
// userP.setTrialSite(trialSite);
Login userL = new Login();
userL.setUsername("monitor@trialsite1.de");
userL.setPassword("1$heidelberg");
userL.setPerson(userP);
userL.setPrefLocale(Locale.GERMANY);
userL.addRole(Role.ROLE_MONITOR);
userL.setPrefLocale(Locale.GERMAN);
userService.create(userL, trialSite);
userP = new Person();
userP.setFirstname("Max");
userP.setSurname("Statistican");
userP.setEmail("randi2@action.ms");
userP.setPhone("1234567");
userP.setSex(Gender.MALE);
// userP.setTrialSite(trialSite);
userL = new Login();
userL.setUsername("statistican@trialsite1.de");
userL.setPassword("1$heidelberg");
userL.setPerson(userP);
userL.setPrefLocale(Locale.GERMANY);
userL.addRole(Role.ROLE_STATISTICAN);
userL.setPrefLocale(Locale.GERMAN);
userService.create(userL, trialSite);
TrialSite trialSite1 = new TrialSite();
trialSite1.setCity("Heidelberg");
trialSite1.setCountry("Germany");
trialSite1.setName("Trial Site 2");
trialSite1.setPostcode("69120");
trialSite1.setStreet("INF");
trialSite1.setPassword("1$heidelberg");
trialSite1.setContactPerson(cp2);
trialSiteService.create(trialSite1);
// create test trial
trialSite1 = trialSiteService.getObject(trialSite1.getId());
Person userPInv2 = new Person();
userPInv2.setFirstname("Max");
userPInv2.setSurname("Investigator");
userPInv2.setEmail("randi2@action.ms");
userPInv2.setPhone("1234567");
userPInv2.setSex(Gender.MALE);
Login userLInv2 = new Login();
userLInv2.setUsername("investigator@trialsite2.de");
userLInv2.setPassword("1$heidelberg");
userLInv2.setPerson(userPInv2);
userLInv2.setPrefLocale(Locale.GERMANY);
userLInv2.addRole(Role.ROLE_INVESTIGATOR);
userLInv2.setPrefLocale(Locale.GERMAN);
userService.create(userLInv2, trialSite1);
// create test trial
System.out.println("create user: " + (System.nanoTime() - time1)
/ 1000000 + " ms");
time1 = System.nanoTime();
// create test trial
authToken = new AnonymousAuthenticationToken("anonymousUser",
userLPInv, new ArrayList<GrantedAuthority>(
userLPInv.getAuthorities()));
// Perform authentication
SecurityContextHolder.getContext().setAuthentication(authToken);
SecurityContextHolder.getContext().getAuthentication()
.setAuthenticated(true);
trialSite1 = entityManager.find(TrialSite.class, trialSite1.getId());
Trial trial = new Trial();
trial.setAbbreviation("bs");
trial.setName("Block study");
trial.setDescription("Block study with two treatment arms and blocksize 8, stratified by trial site");
trial.setGenerateIds(true);
trial.setStratifyTrialSite(true);
trial.setSponsorInvestigator(userPPInv);
trial.setLeadingSite(trialSite);
trial.addParticipatingSite(trialSite);
trial.addParticipatingSite(trialSite1);
trial.setStartDate(new GregorianCalendar(2009, 0, 1));
trial.setEndDate(new GregorianCalendar(2010, 11, 1));
trial.setStatus(TrialStatus.ACTIVE);
BlockRandomizationConfig randConf = new BlockRandomizationConfig();
randConf.setMaximum(8);
randConf.setMinimum(8);
randConf.setType(TYPE.ABSOLUTE);
trial.setRandomizationConfiguration(randConf);
TreatmentArm arm1 = new TreatmentArm();
arm1.setDescription("First Treatment");
arm1.setName("arm1");
arm1.setDescription("description");
arm1.setPlannedSubjects(200);
TreatmentArm arm2 = new TreatmentArm();
arm2.setDescription("Second Treatment");
arm2.setName("arm2");
arm2.setDescription("description");
arm2.setPlannedSubjects(200);
trial.setTreatmentArms(new HashSet<TreatmentArm>(Arrays.asList(arm1, arm2)));
DichotomousCriterion cr = new DichotomousCriterion();
cr.setName("SEX");
cr.setOption1("M");
cr.setOption2("F");
DichotomousCriterion cr1 = new DichotomousCriterion();
cr1.setOption1("1");
cr1.setOption2("2");
cr1.setName("Tum.Status");
DichotomousCriterion cr2 = new DichotomousCriterion();
cr2.setOption1("1");
cr2.setOption2("2");
cr2.setName("Fit.Level");
try {
cr.addStrata(new DichotomousConstraint(Arrays
.asList(new String[] { "M" })));
cr.addStrata(new DichotomousConstraint(Arrays
.asList(new String[] { "F" })));
cr1.addStrata(new DichotomousConstraint(Arrays
.asList(new String[] { "1" })));
cr1.addStrata(new DichotomousConstraint(Arrays
.asList(new String[] { "2" })));
cr2.addStrata(new DichotomousConstraint(Arrays
.asList(new String[] { "1" })));
cr2.addStrata(new DichotomousConstraint(Arrays
.asList(new String[] { "2" })));
trial.addCriterion(cr);
trial.addCriterion(cr1);
trial.addCriterion(cr2);
} catch (ConstraintViolatedException e) {
BoxedException.throwBoxed(e);
}
try {
trialService.create(trial);
} catch (ConstraintViolationException e) {
// TODO: handle exception
System.out.println(e.getMessage());
for (ConstraintViolation<?> v : e.getConstraintViolations()) {
System.out.println(v.getPropertyPath() + " " + v.getMessage());
}
}
System.out.println("create trial: " + (System.nanoTime() - time1)
/ 1000000 + " ms");
time1 = System.nanoTime();
int countTS1 = 120;
int countTS2 = 60;
int countMo = (new GregorianCalendar()).get(GregorianCalendar.MONTH)+1;
int countAll = 0;
// Objects for the while-loop
Random rand = new Random();
GregorianCalendar date;
int runs;
boolean tr1;
int count;
// ---
while (countTS1 != 0 || countTS2 != 0) {
countAll++;
date = new GregorianCalendar(2009, countAll % countMo, 1);
runs = 0;
tr1 = false;
count = 0;
if (rand.nextInt(2) == 0 && countTS1 != 0) {
count = countTS1;
tr1 = true;
} else if (countTS2 != 0) {
count = countTS2;
}
if (count >= 10) {
runs = rand.nextInt(10) + 1;
} else if (count != 0) {
runs = rand.nextInt(count) + 1;
}
// Authorizing the investigator for upcoming randomization
AnonymousAuthenticationToken at = tr1 ? new
AnonymousAuthenticationToken(
"anonymousUser", userLInv, new ArrayList<GrantedAuthority>(
userLInv.getAuthorities()))
: new AnonymousAuthenticationToken("anonymousUser",
userLInv2, new ArrayList<GrantedAuthority>(
userLInv2.getAuthorities()));
SecurityContextHolder.getContext().setAuthentication(at);
SecurityContextHolder.getContext().getAuthentication()
.setAuthenticated(true);
// ---
for (int i = 0; i < runs; i++) {
initRandBS(trial, date, rand);
if (tr1) {
countTS1--;
} else {
countTS2--;
}
}
}
System.out.println("added trial subjects: "
+ (System.nanoTime() - time1) / 1000000 + " ms");
}
private void initRandBS(Trial trial, GregorianCalendar date, Random rand) {
// long time1 = System.nanoTime();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
trial = entityManager.find(Trial.class, trial.getId());
TrialSubject subject = new TrialSubject();
SubjectProperty<Serializable> subprob = new SubjectProperty<Serializable>(
trial.getCriteria().get(0));
SubjectProperty<Serializable> subprob1 = new SubjectProperty<Serializable>(
trial.getCriteria().get(1));
SubjectProperty<Serializable> subprob2 = new SubjectProperty<Serializable>(
trial.getCriteria().get(2));
try {
if (rand.nextInt(2) == 0) {
subprob.setValue(DichotomousCriterion.class.cast(
trial.getCriteria().get(0)).getOption1());
} else {
subprob.setValue(DichotomousCriterion.class.cast(
trial.getCriteria().get(0)).getOption2());
}
if (rand.nextInt(2) == 0) {
subprob1.setValue(DichotomousCriterion.class.cast(
trial.getCriteria().get(1)).getOption1());
} else {
subprob1.setValue(DichotomousCriterion.class.cast(
trial.getCriteria().get(1)).getOption2());
}
if (rand.nextInt(2) == 0) {
subprob2.setValue(DichotomousCriterion.class.cast(
trial.getCriteria().get(2)).getOption1());
} else {
subprob2.setValue(DichotomousCriterion.class.cast(
trial.getCriteria().get(2)).getOption2());
}
} catch (ConstraintViolatedException e) {
e.printStackTrace();
}
Set<SubjectProperty<?>> proberties = new HashSet<SubjectProperty<?>>();
proberties.add(subprob);
proberties.add(subprob1);
proberties.add(subprob2);
subject.setProperties(proberties);
trialService.randomize(trial, subject);
transaction.commit();
transaction.begin();
subject = entityManager.find(TrialSubject.class, subject.getId());
subject.setCreatedAt(date);
subject = entityManager.merge(subject);
transaction.commit();
// System.out.println("time random before: " +
// (System.nanoTime()-time1)/1000000 + " ms");
}
/**
* @param args
*/
public static void main(String[] args) {
try {
new Bootstrap();
} catch (ServiceException e) {
e.printStackTrace();
}
}
}