InfoExam infoExam = Cloner.copyIExam2InfoExam(elem);
InfoExam infoExam = InfoExam.newInfoFromDomain(elem);
    public List run(InfoRoom infoRoom, Calendar day, InfoExecutionPeriod infoExecutionPeriod) throws ExcepcaoPersistencia, FenixServiceException {        List<InfoObject> infoShowOccupations = new ArrayList<InfoObject>();        ISuportePersistente sp = PersistenceSupportFactory.getDefaultPersistenceSupport();        IPersistentExecutionPeriod persistentExecutionPeriod = sp.getIPersistentExecutionPeriod();        IAulaPersistente lessonDAO = sp.getIAulaPersistente();        IPersistentExam examDAO = sp.getIPersistentExam();        IExecutionPeriod executionPeriod = (IExecutionPeriod) persistentExecutionPeriod.readByOID(ExecutionPeriod.class, infoExecutionPeriod.getIdInternal());        Calendar startDay = Calendar.getInstance();        startDay.setTimeInMillis(day.getTimeInMillis());        startDay.add(Calendar.DATE, Calendar.MONDAY - day.get(Calendar.DAY_OF_WEEK));        Calendar endDay = Calendar.getInstance();        endDay.setTimeInMillis(startDay.getTimeInMillis());        endDay.add(Calendar.DATE, 6);        //Period weekPeriod = new Period(day, endDay);        InfoPeriod lessonsInfoPeriod = calculateLessonsSeason(executionPeriod);        if (this.intersectPeriods(day, endDay,lessonsInfoPeriod)) {            //adicionar as aulas            List lessonList = lessonDAO.readByRoomAndExecutionPeriod(infoRoom.getIdInternal(), executionPeriod.getIdInternal());            Iterator iterator = lessonList.iterator();            while (iterator.hasNext()) {                ILesson aula = (ILesson) iterator.next();                IRoomOccupation roomOccupation = aula.getRoomOccupation();                InfoRoomOccupation infoRoomOccupation = InfoRoomOccupation.newInfoFromDomain(roomOccupation);                IPeriod period = roomOccupation.getPeriod();                InfoPeriod infoPeriod = InfoPeriod.newInfoFromDomain(period);                infoRoomOccupation.setInfoPeriod(infoPeriod);                infoRoomOccupation.setInfoRoom(infoRoom);                if (this.intersectPeriods(day, endDay, infoPeriod)) {                    boolean add = true;                    if ((roomOccupation.getFrequency().intValue() == RoomOccupation.QUINZENAL)                            && (!RoomOccupation.periodQuinzenalContainsWeekPeriod(period.getStartDate(), period.getEndDate(), 	                            roomOccupation.getWeekOfQuinzenalStart().intValue(),                                    roomOccupation.getDayOfWeek(), day, endDay, null))) {                        add = false;                    }                    if (roomOccupation.getFrequency().intValue() == RoomOccupation.SEMANAL) {                        Calendar dayOfLesson = Calendar.getInstance();                        dayOfLesson.setTimeInMillis(day.getTimeInMillis());                        dayOfLesson.add(Calendar.DATE, roomOccupation.getDayOfWeek().getDiaSemana()                                .intValue()                                - Calendar.MONDAY);                        if (!this.intersectPeriods(dayOfLesson, dayOfLesson, infoPeriod)) {                            add = false;                        }                    }                    if (add) {                        InfoLesson infoLesson = InfoLesson.newInfoFromDomain(aula);                        IShift shift = aula.getShift();                        if (shift == null) {                            continue;                        }                        InfoShift infoShift = InfoShift.newInfoFromDomain(shift);                        infoLesson.setInfoShift(infoShift);                        infoLesson.setInfoRoomOccupation(infoRoomOccupation);                        final IExecutionCourse executionCourse = shift.getDisciplinaExecucao();                        final InfoExecutionCourse infoExecutionCourse = InfoExecutionCourse.newInfoFromDomain(executionCourse);                        infoShift.setInfoDisciplinaExecucao(infoExecutionCourse);                        infoExecutionCourse.setInfoExecutionPeriod(infoExecutionPeriod);                        infoShowOccupations.add(infoLesson);                    }                }            }        }        //adicionar os exames        List examList = examDAO.readByRoomAndWeek(infoRoom.getNome(), day);        Iterator iteratorExams = examList.iterator();        while (iteratorExams.hasNext()) {            IExam elem = (IExam) iteratorExams.next();            InfoExam infoExam = Cloner.copyIExam2InfoExam(elem);            infoShowOccupations.add(infoExam);        }        return infoShowOccupations;    }