de.randi2.testUtility.utility.Bootstrap.java Source code

Java tutorial

Introduction

Here is the source code for de.randi2.testUtility.utility.Bootstrap.java

Source

/* 
 * (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();
        }
    }

}