Subversion Repositories bacoAlunos

Rev

Rev 1827 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.domain;

import com.owlike.genson.Genson;
import com.owlike.genson.GensonBuilder;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.utils.Globals;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.enums.CourseUnitContentsGrants;
import pt.estgp.estgweb.domain.test.TestCourseUnit;
import pt.estgp.estgweb.domain.utils.SimpleClearanceRuledSupport;
import pt.estgp.estgweb.utils.StringsUtils;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;

import java.io.IOException;
import java.io.Serializable;
import java.util.*;

/**
 * Created by IntelliJ IDEA.
 * User: Jorge Machado
 * Date: 7/Mai/2008
 * Time: 20:21:15
 * To change this template use File | Settings | File Templates.
 */

public class CourseUnitImpl extends CourseUnit implements ICanManage, ClearanceRuled
{

    private static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger = 1.5.0/docs/api/java/util/logging/Logger.html">Logger.getLogger(CourseUnitImpl.class);

    CourseUnitContentsGrants courseUnitContentsGrants = null;

    public 1.5.0/docs/api/java/io/Serializable.html">Serializable getSerializable()
    {
        return getId();
    }

    public 1.5.0/docs/api/java/lang/String.html">String getCourseNameInitials()
    {
        if(getCourseName() != null)
        {
            return StringsUtils.getInitials(getCourseName());
        }
        else
            return null;
    }

    public CourseUnitContentsGrants getCourseUnitContentsGrants() {
        if(courseUnitContentsGrants == null)
            courseUnitContentsGrants = CourseUnitContentsGrants.parse(super.getContentsGrants());
        return courseUnitContentsGrants;
    }

    public void setCourseUnitContentsGrants(CourseUnitContentsGrants courseUnitContentsGrants) {
        super.setContentsGrants(courseUnitContentsGrants.name());
        this.courseUnitContentsGrants = courseUnitContentsGrants;
    }

    public boolean isValid()
    {
        return true;  //To change body of implemented methods use File | Settings | File Templates.
    }

    public boolean checkIsOwnedBy(GenericUser u)
    {
        return checkIsOwnedBy(u, false);
    }

    public boolean checkIsOwnedBy(GenericUser u, boolean transaction)
    {
        return u != null && u instanceof TeacherImpl && ((TeacherImpl)u).hasCourseUnit(getId(),transaction);
    }

    /**
     * Not implemented can be variuous teachers
     * @return null
     * use checkIsOwnedBy in this class
     */

    public GenericUser getOwner()
    {
        return null;
    }
    /**
     * Not implemented
     * @return
     */

    public List<String> getOwnerRoles()
    {
        return null;
    }

    /**
     * Not implemented
     * @return
     */

    public 1.5.0/docs/api/java/lang/String.html">String getChoosedOwnerRole()
    {
        return null;
    }

    public boolean isInternal()
    {
        return true;
    }

    public CourseUnitBlogImpl getUnitBlog()
    {
        if(getBlogs()!=null && getBlogs().size() > 0)
            return (CourseUnitBlogImpl) getBlogs().iterator().next();
        return null;
    }


    public boolean equalsSiges(5+0%2Fdocs%2Fapi+Object">Object anotherInstance,boolean turmasSeparadas)
    {
        if(anotherInstance instanceof CourseUnitImpl)
        {
            CourseUnitImpl anCourseUnit = (CourseUnitImpl) anotherInstance;
            if(turmasSeparadas)
            {
                boolean turmaVazia = getCdTurma() == null || getCdTurma().trim().length() == 0;
                boolean anotherTurmaVazia = anCourseUnit.getCdTurma() == null || anCourseUnit.getCdTurma().trim().length() == 0;
                boolean turmasIguais = (turmaVazia && anotherTurmaVazia) || (!turmaVazia && !anotherTurmaVazia && getCdTurma().equals(anCourseUnit.getCdTurma()));
                return equalsIgnoringTurma(anotherInstance)
                &&
                turmasIguais;
            }
            else
                return equalsIgnoringTurma(anotherInstance);
        }
        return false;

    }

    public boolean equalsIgnoringTurma(5+0%2Fdocs%2Fapi+Object">Object anotherInstance)
    {
        if(anotherInstance instanceof CourseUnitImpl)
        {
            CourseUnitImpl anCourseUnit = (CourseUnitImpl) anotherInstance;

            return anCourseUnit.getCode() != null && getCode() != null && getCode().equals(anCourseUnit.getCode()) &&
                    anCourseUnit.getCourseCode() != null && getCourseCode() != null && getCourseCode().equals(anCourseUnit.getCourseCode()) &&
                    anCourseUnit.getSemestre() != null && getSemestre() != null && getSemestre().equals(anCourseUnit.getSemestre()) &&
                    anCourseUnit.getImportYear() != null && getImportYear() != null && getImportYear().equals(anCourseUnit.getImportYear());
        }
        return false;

    }

    /**
     * Means that is teacher os responsable teacher or from course commission
     * Only works in open transaction
     *
     * Needs Course and Responsable Teacher loaded
     */

    public boolean isFromCourseUnitCommission(UserSession userSession)
    {
        return userSession.getUser()!= null &&
                (((UserImpl) userSession.getUser()).checkIsTeacherOfCourseUnit(getId(), true)
                        || (getResponsableTeacher() != null && getResponsableTeacher().getId() == userSession.getUser().getId())
                        || ((CourseImpl)getCourse()).isFromCourseCommission(userSession)
                );
    }

    public boolean isFromCourseCommission(UserSession userSession)
    {
        return userSession.getUser()!= null &&
                userSession.getUser().hasRole(getCourse().getValidationRole());
    }




    public 1.5.0/docs/api/java/lang/String.html">String getSummariosPathIntranet()
    {
        return Globals.FTP_IONLINE_START_PATH + "/" + getPathIntranet() + "/" + Globals.INTRANET_DTP + "/" + Globals.INTRANET_DTP_Sumarios;
    }

    public 1.5.0/docs/api/java/lang/String.html">String getInqueritosPedagogicosPathIntranet()
    {
        return Globals.FTP_IONLINE_START_PATH + getPathIntranet() + "/" + Globals.INTRANET_DTP + "/" + Globals.INTRANET_DTP_InqueritoPedagogico;
    }


    public 1.5.0/docs/api/java/lang/String.html">String getSummariosPathFileIntranet()
    {
        return getSummariosPathIntranet() + "/" + getSummariosFileNameIntranet();
    }

    public 1.5.0/docs/api/java/lang/String.html">String getSummariosFileNameIntranet(){
        return getCode() + "_" + getNormalizedName() + "_sumarios.pdf";
    }


    public 1.5.0/docs/api/java/lang/String.html">String getSigesUniqueIdentifiers()
    {
        return "SIGES:" + getCode() + ", COURSE: " + getCourseCode() +
                ", " + getSemestre() + " of " + getImportYear() + " - " + getName() + " Turma - " + getCdTurma();
    }

    public int studentsSize()
    {
        if(getStudents() !=null)
            return getStudents().size();
        return 0;
    }

    public int studentsTurmaSize()
    {
        int countTotalStudentsTurmas = 0;
        if(getTurmas() == null)
            return 0;
        for(CourseUnitTurma turma: getTurmas())
        {
            if(turma.getStudents() != null)
                countTotalStudentsTurmas+=turma.getStudents().size();
        }
        return countTotalStudentsTurmas;
    }


    public boolean hasStudent(long studentId, boolean transaction)
    {
        Set<StudentImpl> students;
        if(transaction)
            students = getStudents();
        else
        {
            IServiceManager sm;
            try {
                sm = ServiceManager.getInstance();
                1.5.0/docs/api/java/lang/String.html">String[] names = new 1.5.0/docs/api/java/lang/String.html">String[]{"serializable"};
                5+0%2Fdocs%2Fapi+Object">Object[] args = new 5+0%2Fdocs%2Fapi+Object">Object[]{getId()};
                students = (Set<StudentImpl>) sm.execute(null, "LoadCourseUnitStudents", args, names);
            } catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e) {
                logger.error(e,e);
                return false;
            }
        }
        if(students == null)
            return false;
        for(Student s: students)
        {
            if(s.getId() == studentId)
                return true;
        }
        return false;
    }

    public boolean hasTeacher(long teacherId, boolean transaction)
    {
        Set<TeacherImpl> teachers;
        if(transaction)
            teachers = getTeachers();
        else
        {
            IServiceManager sm;
            try {
                sm = ServiceManager.getInstance();
                1.5.0/docs/api/java/lang/String.html">String[] names = new 1.5.0/docs/api/java/lang/String.html">String[]{"serializable"};
                5+0%2Fdocs%2Fapi+Object">Object[] args = new 5+0%2Fdocs%2Fapi+Object">Object[]{getId()};
                teachers = (Set<TeacherImpl>) sm.execute(null, "LoadCourseUnitTeachers", args, names);
            } catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e) {
                logger.error(e,e);
                return false;
            }
        }
        if(teachers == null)
            return false;
        for(Teacher t: teachers)
        {
            if(t.getId() == teacherId)
                return true;
        }
        return false;
    }

    public boolean isResponsibleTeacher(long teacherId, boolean transaction)
    {
        Teacher t;
        if(transaction)
            t = getResponsableTeacher();
        else
        {
            IServiceManager sm;
            try {
                sm = ServiceManager.getInstance();
                1.5.0/docs/api/java/lang/String.html">String[] names = new 1.5.0/docs/api/java/lang/String.html">String[]{"serializable"};
                5+0%2Fdocs%2Fapi+Object">Object[] args = new 5+0%2Fdocs%2Fapi+Object">Object[]{getId()};
                t = (Teacher) sm.execute(null, "LoadCourseUnitResponsibleTeacher", args, names);
            } catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e) {
                logger.error(e,e);
                return false;
            }
        }
        if(t == null)
            return false;
        if(t.getId() == teacherId)
            return true;
        return false;
    }

    SimpleClearanceRuledSupport clearanceRuledSupport = null;

    public SimpleClearanceRuledSupport getClearanceRuledSupport() {
        return clearanceRuledSupport;
    }

    public void setClearanceRuledSupport(SimpleClearanceRuledSupport clearanceRuledSupport) {
        this.clearanceRuledSupport = clearanceRuledSupport;
    }

    @1.5.0/docs/api/java/lang/Override.html">Override
    public boolean isClearanceInitialized(UserSessionImpl u) {
        return clearanceRuledSupport == null ? false :
         clearanceRuledSupport.isClearanceInitialized(u);
    }

    @1.5.0/docs/api/java/lang/Override.html">Override
    public boolean isClear(UserSessionImpl u, 1.5.0/docs/api/java/lang/String.html">String OP) {

        if(clearanceRuledSupport == null) return false;
        if(OP.startsWith("EVALUATION") && !OP.startsWith("EVALUATION_INFO")
                && clearanceRuledSupport.isClear(u,CourseUnitClearancesOperation.EVALUATION_ALL.name()))
            return true;
        return clearanceRuledSupport.isClear(u, OP);
    }

    @1.5.0/docs/api/java/lang/Override.html">Override
    public void initClearances(UserSessionImpl usession,boolean force)
    {
        CourseUnitImpl c = this;
        1.5.0/docs/api/java/lang/String.html">String activeYear = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveYear();
        List<String> activeDegrees = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveDegrees();
        List<Long> activeCourseIds = DaoFactory.getConfigurationDaoImpl().getCourseUnitEvaluationActiveCourseIds();

        boolean isActiveYear = activeYear != null && c.getImportYear().equals(activeYear);
        boolean isActiveDegree = activeDegrees!=null && activeDegrees.contains(c.getCourse().getDegree());
        boolean isActiveCourseId = activeCourseIds!=null && activeCourseIds.contains(c.getCourse().getId());

        boolean activePeriod = (isActiveYear && (isActiveCourseId || isActiveDegree));
        boolean active = activePeriod || c.isEvaluationOpenByAdmin();

        boolean isComplete = c.getCourseUnitEvaluation() != null && c.getCourseUnitEvaluation().isTeacherComplete() && !c.getCourseUnitEvaluation().isClosed();
        boolean isClosed = c.getCourseUnitEvaluation() != null && c.getCourseUnitEvaluation().isClosed();
        boolean isEdit = !isClosed && !isComplete;


        SimpleClearanceRuledSupport s = new SimpleClearanceRuledSupport();
        s.setDirty();

        if(isEdit)
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_STATE_EDIT.name(),usession);
        else if(isComplete)
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_STATE_COMPLETE.name(),usession);
        else if(isClosed)
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_STATE_CLOSED.name(),usession);

        if(activePeriod)
        {
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_ACTIVE.name(),usession);
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_ACTIVE_REGULAR_PERIOD.name(),usession);
        }
        if(c.isEvaluationOpenByAdmin())
        {
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_ACTIVE.name(),usession);
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_ACTIVE_SPECIAL_ADMIN.name(),usession);
        }


        if(usession.getUser() != null && (usession.getUser().isSuperuserOrAdmin() || usession.getUser().hasRole(Globals.SERVICES_PROGRAMS_ROLE)))
        {
            s.addClearance(CourseUnitClearancesOperation.STATISTICS_CAN_VIEW.name(),usession);
            s.addClearance(CourseUnitClearancesOperation.EVALUATION_ALL.name(),usession);
            s.addClearance(CourseUnitClearancesOperation.PROGRAM_EDIT_PROGRAM.name(), usession);
            s.addClearance(CourseUnitClearancesOperation.PROGRAM_CAN_VALIDATE.name(),usession);
            s.addClearance(CourseUnitClearancesOperation.PROGRAM_TEACHER_PART.name(),usession);
            s.addClearance(CourseUnitClearancesOperation.PROGRAM_COORDINATOR_PART.name(),usession);
        }

        if(usession.getUser() != null && usession.getUser() instanceof Teacher)
        {
            Teacher t = ((Teacher)(usession.getUser()));
            boolean teacher = ((Teacher)(usession.getUser())).checkIsTeacherOfCourseUnit(c.getId(), true);
            boolean responsable = c.getResponsableTeacher()!=null && usession.getUser().getId() == c.getResponsableTeacher().getId();
            boolean isCoordinator = ((CourseImpl) DaoFactory.getCourseDaoImpl().narrow(c.getCourse())).isFromCourseCommission(t);

            if(teacher)
            {
                s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_USER_TEACHER.name(), usession);
            }
            if(responsable)
            {
                s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_USER_RESP_TEACHER.name(), usession);
            }
            if(teacher || responsable)
            {
                s.addClearance(CourseUnitClearancesOperation.STATISTICS_CAN_VIEW.name(),usession);
                //s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_USER_TEACHER.name(), usession);
                s.addClearance(CourseUnitClearancesOperation.EVALUATION_EDITION.name(),usession);
                if(active && isEdit)
                {
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_EDITSAVE.name(),usession);
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_PERSIST_TEACHER_PART.name(),usession);
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_TRANSITATE_TO_COMPLETE.name(),usession);
                }
            }

            if(isCoordinator)
            {
                s.addClearance(CourseUnitClearancesOperation.STATISTICS_CAN_VIEW.name(),usession);
                s.addClearance(CourseUnitClearancesOperation.PROGRAM_CAN_VALIDATE.name(),usession);
                s.addClearance(CourseUnitClearancesOperation.EVALUATION_INFO_USER_COMMISSION.name(), usession);
                s.addClearance(CourseUnitClearancesOperation.EVALUATION_EDITION.name(), usession);
                if(active && isEdit)
                {
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_EDITSAVE.name(),usession);
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_PERSIST_TEACHER_PART.name(),usession);
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_PERSIST_COMISSION_PART.name(),usession);
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_TRANSITATE_TO_COMPLETE.name(),usession);
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_TRANSITATE_TO_CLOSE.name(),usession);
                }
                else if(active && isComplete)
                {
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_EDITSAVE.name(),usession);
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_PERSIST_TEACHER_PART.name(),usession);
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_PERSIST_COMISSION_PART.name(),usession);
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_TRANSITATE_TO_CLOSE.name(),usession);
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_TRANSITATE_TO_EDIT.name(),usession);
                }
                else if(active && isClosed)
                {
                    s.addClearance(CourseUnitClearancesOperation.EVALUATION_TRANSITATE_TO_EDIT.name(),usession);
                }
            }


            if(!c.isValidProgram())
            {
                if(teacher)
                {
                    s.addClearance(CourseUnitClearancesOperation.PROGRAM_EDIT_PROGRAM.name(), usession);
                    s.addClearance(CourseUnitClearancesOperation.PROGRAM_TEACHER_PART.name(), usession);
                }
                if(isCoordinator)
                {
                    s.addClearance(CourseUnitClearancesOperation.PROGRAM_EDIT_PROGRAM.name(), usession);
                    s.addClearance(CourseUnitClearancesOperation.PROGRAM_TEACHER_PART.name(), usession);
                    s.addClearance(CourseUnitClearancesOperation.PROGRAM_COORDINATOR_PART.name(), usession);
                }
            }
            else
            {
                s.addClearance(CourseUnitClearancesOperation.PROGRAM_INFO_VALID_NOT_ACTIVE.name(), usession);
            }

        }

        c.setClearanceRuledSupport(s);
    }

    public static enum CourseUnitClearancesOperation
    {
        EVALUATION_ALL, //SPECIAL OPERATION FOR DENY AND PERMIT REPLACE FULL CONTROL

        //COURSE UNIT EVALUATION
        EVALUATION_PERSIST_TEACHER_PART, //SERVICE PERSIST THIS PART
        EVALUATION_PERSIST_COMISSION_PART, //SERVICE PERSIST THIS PART

        EVALUATION_EDITION, //CAN SEE EDITION SCREEN
        EVALUATION_EDITSAVE, //CAN PRESS SAVE
        EVALUATION_TRANSITATE_TO_COMPLETE, //CAN_TRANSITATE
        EVALUATION_TRANSITATE_TO_CLOSE, //CAN CLOSE
        EVALUATION_TRANSITATE_TO_EDIT, //CAN REVERT

        EVALUATION_INFO_ACTIVE, //INFO CLEARANCE WHEN ACTIVE
        EVALUATION_INFO_ACTIVE_SPECIAL_ADMIN, //INFO CLEARANCE REASON OF BEING ACTIVE
        EVALUATION_INFO_ACTIVE_REGULAR_PERIOD, //INFO CLEARANCE REASON OF BEING ACTIVE

        EVALUATION_INFO_STATE_EDIT, //INFO CLEARANCE
        EVALUATION_INFO_STATE_COMPLETE, //INFO CLEARANCE
        EVALUATION_INFO_STATE_CLOSED, //INFO CLEARANCE

        EVALUATION_INFO_USER_TEACHER, //INFO CLEARANCE
        EVALUATION_INFO_USER_RESP_TEACHER, //INFO CLEARANCE
        EVALUATION_INFO_USER_COMMISSION, //INFO CLEARANCE


        PROGRAM_EDIT_PROGRAM,
        PROGRAM_COORDINATOR_PART,
        PROGRAM_TEACHER_PART,

        PROGRAM_CAN_VALIDATE,
        PROGRAM_INFO_VALID_NOT_ACTIVE,

        STATISTICS_CAN_VIEW,


        ;

        public static CourseUnitClearancesOperation parse(1.5.0/docs/api/java/lang/String.html">String clearance)
        {
            if(clearance == null)
                return null;
            for(CourseUnitClearancesOperation op: CourseUnitClearancesOperation.values())
            {
                if(op.name().equals(clearance))
                    return op;
            }
            return null;
        }
    }


    public Tipologias getTipologiasClass() throws 1.5.0/docs/api/java/io/IOException.html">IOException
    {
        return Tipologias.deserialize(getTipologias());
    }

    public void setTipologiasClass(Tipologias tipologias) throws 1.5.0/docs/api/java/io/IOException.html">IOException
    {
        if(tipologias != null)
            setTipologias(tipologias.serialize());
    }

    public static class TipologiaLoadExeption extends 1.5.0/docs/api/java/lang/Exception.html">Exception
    {
        boolean teacherFail = false;
        boolean turmaFail = false;

        public TipologiaLoadExeption(boolean teacherFail, boolean turmaFail) {
            this.teacherFail = teacherFail;
            this.turmaFail = turmaFail;
        }

        public boolean isTeacherFail() {
            return teacherFail;
        }

        public boolean isTurmaFail() {
            return turmaFail;
        }

        @1.5.0/docs/api/java/lang/Override.html">Override
        public 1.5.0/docs/api/java/lang/String.html">String getMessage() {
            return "Professor: " + (teacherFail? "Falhou" : "OK") + " Turma: " + (turmaFail? "Falhou" : "OK");
        }
    }
    /**
     *
     * @param myTipo
     * @return
     */

    public TipologiaPersistent loadPersistent(Tipologia myTipo) throws TipologiaLoadExeption
    {
        TipologiaPersistent tipologiaPersistent = new TipologiaPersistent();
        tipologiaPersistent.tipologiaOriginal = myTipo;
        tipologiaPersistent.setTeacher(DaoFactory.getTeacherDaoImpl().loadBySigesCode(1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(myTipo.getCdDocente())));
        tipologiaPersistent.setCourseUnitTurma(findTurma(myTipo.getCdTurma()));
        if(tipologiaPersistent.getCourseUnitTurma() == null || tipologiaPersistent.getTeacher() == null)
        {
            logger.error("Turma ou professor nao encontrados enquanto fazia uma tipologia persistente: turma:" + myTipo.getCdTurma() + " teacher code: " + myTipo.getCdDocente());
            throw new TipologiaLoadExeption(tipologiaPersistent.getTeacher() == null,tipologiaPersistent.getCourseUnitTurma() == null);
        }
        return tipologiaPersistent;
    }

    public CourseUnitTurma findTurma(1.5.0/docs/api/java/lang/String.html">String turma)
    {
        if(getTurmas() == null)
            return null;
        for(CourseUnitTurma t: getTurmas())
        {
            if(t.getTurma().equals(turma))
                return t;
        }
        return null;
    }


    public static class TipologiaPersistent
    {
        private Teacher teacher;
        private CourseUnitTurma courseUnitTurma;
        Tipologia tipologiaOriginal;

        /*private String cdTipologia;
        private Integer ocorrencias = 0;
        protected boolean extra;
        protected boolean horRef;
        protected boolean use;   //campo auxiliar para marcar se vai ser ou não usada  nas afetacoes especificas
        //por omissão apenas as que têm sumários
        protected boolean markWarning; //camp*/



        public boolean isUse() {
            return tipologiaOriginal.isUse();
        }

        public void setUse(boolean use) {
            tipologiaOriginal.use = use;
        }

        public boolean isMarkWarning() {
            return tipologiaOriginal.markWarning;
        }

        public void setMarkWarning(boolean markWarning) {
            tipologiaOriginal.markWarning = markWarning;
        }

        public boolean isExtra() {
            return tipologiaOriginal.extra;
        }

        public boolean isHorRef() {
            return tipologiaOriginal.horRef;
        }

        public boolean isSumario() {
            return tipologiaOriginal.ocorrencias != null && tipologiaOriginal.ocorrencias > 0;
        }

        public void setExtra(boolean extra) {
            tipologiaOriginal.extra = extra;
        }

        public void setHorRef(boolean horRef) {
            tipologiaOriginal.horRef = horRef;
        }

        public Teacher getTeacher() {
            return teacher;
        }

        public void setTeacher(Teacher teacher) {
            this.teacher = teacher;
        }

        public CourseUnitTurma getCourseUnitTurma() {
            return courseUnitTurma;
        }

        public void setCourseUnitTurma(CourseUnitTurma courseUnitTurma) {
            this.courseUnitTurma = courseUnitTurma;
        }

        public 1.5.0/docs/api/java/lang/String.html">String getCdTipologia() {
            return tipologiaOriginal.cdTipologia;
        }

        public void setCdTipologia(1.5.0/docs/api/java/lang/String.html">String cdTipologia) {
            tipologiaOriginal.cdTipologia = cdTipologia;
        }

        public 1.5.0/docs/api/java/lang/Integer.html">Integer getOcorrencias() {
            return tipologiaOriginal.ocorrencias == null ? 0:tipologiaOriginal.ocorrencias;
        }

        public void setOcorrencias(1.5.0/docs/api/java/lang/Integer.html">Integer ocorrencias) {
            tipologiaOriginal.ocorrencias = ocorrencias;
        }

        public boolean isExclude() {
            return tipologiaOriginal.exclude;
        }

        public void setExclude(boolean exclude) {
            tipologiaOriginal.exclude = exclude;
        }
    }
    /**
     * Os codigos de tipologia devem ser limitados a T TP OT etc
     */

    public static class Tipologia
    {
        protected 1.5.0/docs/api/java/lang/String.html">String cdDocente;
        protected 1.5.0/docs/api/java/lang/String.html">String cdTurma;
        protected 1.5.0/docs/api/java/lang/String.html">String cdTipologia;
        protected 1.5.0/docs/api/java/lang/String.html">String dsTipologia;
        protected 1.5.0/docs/api/java/lang/Integer.html">Integer ocorrencias = 0; // apenas faz sentido nos sumarios. no horario ref nao.


        protected boolean tdocturma = false;

        //NOVO NESTE MOMENTO NAS TIPOLOGIAS APENAS O EXCLUDED É UTILIZADO
        //O USE NAO É UTILIZADO, APENAS EM REAL TIME PARA VER SE SE USA OU NAO UMA TIPO
        //NOS METODOS DE MERGE, POR EXEMPLO SO SE USAM AS QUE TEM SUMARIO, NAS SIMPES
        //TODAS AS GERADAS SE USAM
        //O MARKWARNING É USADO EM REAL TIME QUANDO UM AVISO É ENCONTRADO
        //AS extras e as horarioRef são marcadas em tempo real caso estejam numa lista
        //ou noutra assim como as tdocturma
        protected boolean exclude = false;

        protected boolean use;   //campo auxiliar para marcar se vai ser ou não usada  nas afetacoes especificas
        protected boolean markWarning; //campo auxiliar para marcar se vai ser ou não usada  nas afetacoes especificas
        protected boolean extra;
        protected boolean horRef;

        public boolean isTdocturma() {
            return tdocturma;
        }

        public void setTdocturma(boolean tdocturma) {
            this.tdocturma = tdocturma;
        }

        public boolean isUse() {
            return use;
        }

        public boolean isExclude() {
            return exclude;
        }

        public void setExclude(boolean exclude) {
            this.exclude = exclude;
        }

        public void setUse(boolean use) {
            this.use = use;
        }

        public boolean isMarkWarning() {
            return markWarning;
        }

        public void setMarkWarning(boolean markWarning) {
            this.markWarning = markWarning;
        }

        public 1.5.0/docs/api/java/lang/Integer.html">Integer getOcorrencias() {
            return ocorrencias == null ? 0:ocorrencias;
        }

        public boolean hasOcorrencias() {
            return ocorrencias != null && ocorrencias > 0;
        }

        public void setOcorrencias(1.5.0/docs/api/java/lang/Integer.html">Integer ocorrencias) {
            this.ocorrencias = ocorrencias;
        }

        public 1.5.0/docs/api/java/lang/String.html">String getCdDocente() {
            return cdDocente;
        }

        public void setCdDocente(1.5.0/docs/api/java/lang/String.html">String cdDocente) {
            this.cdDocente = cdDocente;
        }

        public 1.5.0/docs/api/java/lang/String.html">String getCdTurma() {
            return cdTurma;
        }

        public void setCdTurma(1.5.0/docs/api/java/lang/String.html">String cdTurma) {
            this.cdTurma = cdTurma;
        }

        public 1.5.0/docs/api/java/lang/String.html">String getCdTipologia() {
            return cdTipologia;
        }

        public void setCdTipologia(1.5.0/docs/api/java/lang/String.html">String cdTipologia) {
            this.cdTipologia = cdTipologia;
        }

        public 1.5.0/docs/api/java/lang/String.html">String getDsTipologia() {
            return dsTipologia;
        }

        public void setDsTipologia(1.5.0/docs/api/java/lang/String.html">String dsTipologia) {
            this.dsTipologia = dsTipologia;
        }

        public boolean isExtra() {
            return extra;
        }

        public boolean isSumario() {
            return ocorrencias != null && ocorrencias > 0;
        }

        public boolean isHorRef() {
            return horRef;
        }



        @1.5.0/docs/api/java/lang/Override.html">Override
        public boolean equals(5+0%2Fdocs%2Fapi+Object">Object o)
        {
            if(o instanceof Tipologia){
                boolean equalTurma = (
                        (((Tipologia)o).getCdTurma() == null && getCdTurma() == null)
                        ||
                        (((Tipologia)o).getCdTurma().equals(getCdTurma()))
                );
                boolean equalDocente = (
                        (((Tipologia)o).getCdDocente() == null && getCdDocente() == null)
                        ||
                        (((Tipologia)o).getCdDocente().equals(getCdDocente()))
                );
                if(equalTurma && equalDocente)
                {

                    if(((Tipologia)o).getCdTipologia() == null && getCdTipologia() == null)
                        return true;
                    if(((Tipologia)o).getCdTipologia().equals(getCdTipologia()))
                        return true;
                    //Se uma das tipologias é simples virtual tem de ser sempre igual à outra seja ela qual for
                    //pois a simples tem de fazer match em todas
                    if(((Tipologia)o).getCdTipologia().equals(Globals.BACO_TIPOLOGIA_SIMPLES_VIRTUAL_CODE)
                            ||
                            getCdTipologia().equals(Globals.BACO_TIPOLOGIA_SIMPLES_VIRTUAL_CODE))
                        return true;
                }
            }
            return false;
        }

        public boolean equalsIncDsFields(5+0%2Fdocs%2Fapi+Object">Object o)
        {
            return o instanceof Tipologia &&
                    equals(o)
                    &&
                    (
                            (((Tipologia)o).getDsTipologia() == null && getDsTipologia() == null)
                                    ||
                                    (((Tipologia)o).getDsTipologia().equals(getDsTipologia())))
                    &&

                    (
                            (((Tipologia)o).getOcorrencias() == null && getOcorrencias() == null)
                                    ||
                                    (((Tipologia)o).getOcorrencias().equals(getOcorrencias())))
                    ;
        }
    }

    public void canUse(1.5.0/docs/api/java/lang/String.html">String cdDocente,1.5.0/docs/api/java/lang/String.html">String cdTipologia,1.5.0/docs/api/java/lang/String.html">String cdTurma)
    {

    }
    /**
     * Marca uma tipologia como excluida em todas as Listas
     * @param cdDocente
     * @param cdTipologia
     * @param cdTurma
     */

    public void setExcludedTipologia(boolean excluded, 1.5.0/docs/api/java/lang/String.html">String cdDocente,1.5.0/docs/api/java/lang/String.html">String cdTipologia,1.5.0/docs/api/java/lang/String.html">String cdTurma)
    {
        try {
            boolean found = false;
            Tipologias tipoClass = getTipologiasClass();

            Tipologia proto = new Tipologia();
            proto.setCdDocente(cdDocente);
            proto.setCdTipologia(cdTipologia);
            proto.setCdTurma(cdTurma);
            if(tipoClass.getTipologiasSumarios() != null)
                for(Tipologia tipo: tipoClass.getTipologiasSumarios())
                {
                    if(tipo.equals(proto))
                    {
                        tipo.setExclude(excluded);
                        found = true;
                    }
                }
            if(tipoClass.getTipologiasHorarioReferencia() != null)
                for(Tipologia tipo: tipoClass.getTipologiasHorarioReferencia())
                {
                    if(tipo.equals(proto))
                    {
                        tipo.setExclude(excluded);
                        found = true;
                    }
                }
            if(tipoClass.getTipologiasExtraAdicionadas() != null)
                for(Tipologia tipo: tipoClass.getTipologiasExtraAdicionadas())
                {
                    if(tipo.equals(proto))
                    {
                        tipo.setExclude(excluded);
                        found = true;
                    }
                }
            if(tipoClass.getTipologiasTdocTurma() != null)
                for(Tipologia tipo: tipoClass.getTipologiasTdocTurma())
                {
                    if(tipo.equals(proto))
                    {
                        tipo.setExclude(excluded);
                        found = true;
                    }
                }
            if(!found)
            {
                logger.info("Tipologia não encontrada para excluir, provavelmente é uma tipologia que foi carregada da lista de docentes por não pertencer às tipologias");
                logger.info("Vamos adicionar tipologia Extra à lista de tipologias da unidade");
                Tipologia tipoExtra = new Tipologia();
                tipoExtra.cdDocente = cdDocente;
                tipoExtra.cdTurma = cdTurma;
                tipoExtra.cdTipologia = Globals.BACO_TIPOLOGIA_SIMPLES_VIRTUAL_CODE;
                tipoExtra.dsTipologia = Globals.BACO_TIPOLOGIA_SIMPLES_DS;
                tipoExtra.extra = true;
                tipoExtra.exclude = excluded;
                if(tipoClass.getTipologiasExtraAdicionadas() == null)
                    tipoClass.setTipologiasExtraAdicionadas(new ArrayList<Tipologia>());
                tipoClass.getTipologiasExtraAdicionadas().add(tipoExtra);
            }

            setTipologiasClass(tipoClass);

        } catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e) {
            logger.error(e,e);
        }
    }

    public static class MergedTipologias
    {
        ArrayList<Tipologia> tipologiasWithMarkedAndUsed = new ArrayList<Tipologia>();

        public ArrayList<Tipologia> getTipologiasWithMarkedAndUsed() {
            return tipologiasWithMarkedAndUsed;
        }

        public void setTipologiasWithMarkedAndUsed(ArrayList<Tipologia> tipologiasWithMarkedAndUsed) {
            this.tipologiasWithMarkedAndUsed = tipologiasWithMarkedAndUsed;
        }
    }
    public static class Tipologias
    {
        ArrayList<Tipologia> tipologiasHorarioReferencia = new ArrayList<Tipologia>();
        ArrayList<Tipologia> tipologiasSumarios = new ArrayList<Tipologia>();
        ArrayList<Tipologia> tipologiasExtraAdicionadas = new ArrayList<Tipologia>();
        ArrayList<Tipologia> tipologiasUsadas = new ArrayList<Tipologia>();
        ArrayList<Tipologia> tipologiasMarcadas = new ArrayList<Tipologia>();
        ArrayList<Tipologia> tipologiasTdocTurma = new ArrayList<Tipologia>();

        public ArrayList<Tipologia> getTipologiasTdocTurma() {
            return tipologiasTdocTurma == null ? new ArrayList<Tipologia>() : tipologiasTdocTurma;
        }

        public void setTipologiasTdocTurma(ArrayList<Tipologia> tipologiasTdocTurma) { this.tipologiasTdocTurma = tipologiasTdocTurma; }

        public ArrayList<Tipologia> getTipologiasHorarioReferencia() {

            return tipologiasHorarioReferencia == null ? new ArrayList<Tipologia>() : tipologiasHorarioReferencia;

        }

        public void setTipologiasHorarioReferencia(ArrayList<Tipologia> tipologiasHorarioReferencia) {
            this.tipologiasHorarioReferencia = tipologiasHorarioReferencia;
        }

        public ArrayList<Tipologia> getTipologiasSumarios() {
            return tipologiasSumarios == null ? new ArrayList<Tipologia>() : tipologiasSumarios;
        }

        public void setTipologiasSumarios(ArrayList<Tipologia> tipologiasSumarios) {
            this.tipologiasSumarios = tipologiasSumarios;
        }

        public ArrayList<Tipologia> getTipologiasExtraAdicionadas() {
            return tipologiasExtraAdicionadas == null ? new ArrayList<Tipologia>() : tipologiasExtraAdicionadas;
        }

        public void setTipologiasExtraAdicionadas(ArrayList<Tipologia> tipologiasExtraAdicionadas) {
            this.tipologiasExtraAdicionadas = tipologiasExtraAdicionadas;
        }

        public ArrayList<Tipologia> getTipologiasUsadas() {
            return tipologiasUsadas == null ? new ArrayList<Tipologia>() : tipologiasUsadas;
        }

        public void setTipologiasUsadas(ArrayList<Tipologia> tipologiasUsadas) { this.tipologiasUsadas = tipologiasUsadas; }

        public ArrayList<Tipologia> getTipologiasMarcadas() {
            return tipologiasMarcadas == null ? new ArrayList<Tipologia>() : tipologiasMarcadas;
        }

        public void setTipologiasMarcadas(ArrayList<Tipologia> tipologiasMarcadas) { this.tipologiasMarcadas = tipologiasMarcadas; }

        private static Genson getGenson(){
            Genson genson = new GensonBuilder()
                    .exclude(5+0%2Fdocs%2Fapi+Object">Object.class)
                    .include(1.5.0/docs/api/java/lang/Boolean.html">Boolean.class)
                    .include(1.5.0/docs/api/java/lang/Integer.html">Integer.class)
                    .include(1.5.0/docs/api/java/lang/Long.html">Long.class)
                    .include(1.5.0/docs/api/java/lang/Double.html">Double.class)
                    .include(1.5.0/docs/api/java/lang/Float.html">Float.class)
                    .include("tipologiasExtraAdicionadas", Tipologias.class)
                    .include("tipologiasSumarios", Tipologias.class)
                    .include("tipologiasHorarioReferencia", Tipologias.class)
                    .include("tipologiasUsadas", Tipologias.class)
                    .include("tipologiasMarcadas", Tipologias.class)
                    .include("tipologiasTdocTurma", Tipologias.class)
                    .include("cdTipologia", Tipologia.class)
                    .include("cdDocente", Tipologia.class)
                    .include("cdTurma", Tipologia.class)
                    .include("dsTipologia",Tipologia.class)
                    .include("ocorrencias", Tipologia.class)
                    .include("tdocturma", Tipologia.class)
                    .include("exclude", Tipologia.class)
                    .create();
            return genson;
        }


        /*
        private static Genson getGensonMergedTipologiasComplete(){
            Genson genson = new GensonBuilder()
                    .exclude(Object.class)
                    .include(Boolean.class)
                    .include(Integer.class)
                    .include(Long.class)
                    .include(Double.class)
                    .include(Float.class)
                    .include("tipologiasWithMarkedAndUsed", MergedTipologias.class)
                    .include("cdTipologia", Tipologia.class)
                    .include("cdDocente", Tipologia.class)
                    .include("cdTurma", Tipologia.class)
                    .include("dsTipologia",Tipologia.class)
                    .include("ocorrencias", Tipologia.class)
                    .include("horRef", Tipologia.class)
                    .include("exclude", Tipologia.class)
                    .include("extra", Tipologia.class)
                    .include("use", Tipologia.class)
                    .include("tdocturma", Tipologia.class)
                    .include("markWarning", Tipologia.class)
                    .create();
            return genson;
        }*/


        public 1.5.0/docs/api/java/lang/String.html">String serialize() throws 1.5.0/docs/api/java/io/IOException.html">IOException
        {
            Genson genson = getGenson();

                return genson.serialize(this);

        }
        public static Tipologias deserialize(1.5.0/docs/api/java/lang/String.html">String serial) throws 1.5.0/docs/api/java/io/IOException.html">IOException
        {
            if(serial == null)
                return new Tipologias();

                return getGenson().deserialize(serial, Tipologias.class);

        }

        public static void main(1.5.0/docs/api/java/lang/String.html">String [] args)
        {
            new TestCourseUnit().testTipologias();
        }

        /* Metodos em plenos funcionamento mas não sao usados para simplificar revisões foram comentados
        public static String serializeMergedList(ArrayList<Tipologia> tipologias) throws IOException
        {
            MergedTipologias mergedTipologias = new MergedTipologias();
            if(tipologias != null)
            {
                mergedTipologias.setTipologiasWithMarkedAndUsed(tipologias);
            }
            Genson genson = getGensonMergedTipologiasComplete();

                return genson.serialize(mergedTipologias);

        }
        */

        /*
        public static ArrayList<Tipologia> deserializeMergedTipologias(String serial) throws IOException
        {
            if(serial == null)
                return new ArrayList<Tipologia>();

                MergedTipologias mergedTipologias = getGensonMergedTipologiasComplete().deserialize(serial, MergedTipologias.class);
                if(mergedTipologias.getTipologiasWithMarkedAndUsed() == null)
                    return new ArrayList<Tipologia>();
                return mergedTipologias.getTipologiasWithMarkedAndUsed();


        }
        */

        /*
        public String obtainMergeTipologiasSerialized() throws IOException
        {
            return serializeMergedList(obtainMergeTipologias());
        }
        */





        /**
         * Junta todas as tipologias obtidas dos
         * sumarios, horario(ref+trab) + extra + tdoc turma
         * As restantes  listas são as marcadas e as usadas
         * que apenas estarão disponiveis quando houver gestão de marcação de tipologias
         * e coloca todas numa lista de unicas
         * Marca-as com isHorario, isSumario, isExtra
         * @return
         */


        public ArrayList<Tipologia> obtainMergeTipologias()
        {
            ArrayList<Tipologia> merge = new ArrayList<Tipologia>();
            if(getTipologiasSumarios() != null)
                merge.addAll(getTipologiasSumarios());


            /**
             * OBTER TODAS DAS LISTAS SUMARIOS HORARIOS EXTRA E TDOC TURMA
             */

            if(getTipologiasHorarioReferencia() != null)
                for(Tipologia tipo: getTipologiasHorarioReferencia())
                {
                    if(!merge.contains(tipo))
                    {
                        merge.add(tipo);
                    }
                }
            if(getTipologiasExtraAdicionadas() != null)
                for(Tipologia tipo: getTipologiasExtraAdicionadas())
                {
                    if(!merge.contains(tipo))
                    {
                        merge.add(tipo);
                    }
                }
            if(getTipologiasTdocTurma() != null)
                for(Tipologia tipo: getTipologiasTdocTurma())
                {
                    if(!merge.contains(tipo))
                    {
                        merge.add(tipo);
                    }
                }

            /**
             * FIM DE OBTER TODAS DAS LISTAS SUMARIOS HORARIOS EXTRA E TDOC TURMA
             */




            for(Tipologia tipo: merge)
            {
                tipo.setMarkWarning(false);
                tipo.setUse(false);
                if(getTipologiasHorarioReferencia() != null && getTipologiasHorarioReferencia().contains(tipo))
                {
                    tipo.horRef = true;
                }

                if(getTipologiasExtraAdicionadas() != null && getTipologiasExtraAdicionadas().contains(tipo))
                {
                    tipo.extra = true;
                }
                //NOVO
                if(getTipologiasTdocTurma() != null && getTipologiasTdocTurma().contains(tipo))
                {
                    tipo.tdocturma = true;
                }
            }

            if(getTipologiasMarcadas() != null)
                for(Tipologia t: getTipologiasMarcadas())
                {
                    for(Tipologia tMerge: merge)
                    {
                        if(tMerge.equals(t))
                        {
                            tMerge.setMarkWarning(true);
                            break;
                        }
                    }
                }
            if(getTipologiasUsadas() != null)
                for(Tipologia t: getTipologiasUsadas())
                {
                    for(Tipologia tMerge: merge)
                    {
                        if(tMerge.equals(t))
                        {
                            tMerge.setUse(true);
                            break;
                        }
                    }
                }
            //NAO SERVE PARA NADA
            if(getTipologiasTdocTurma() != null)
                for(Tipologia t: getTipologiasTdocTurma())
                {
                    for(Tipologia tMerge: merge)
                    {
                        if(tMerge.equals(t))
                        {
                            tMerge.setUse(true);
                            break;
                        }
                    }
                }
            return merge;
        }

        /**
         *
         *
         * @param courseUnit
         * @return
         */

        public ArrayList<Tipologia> obtainTipologiasSimples(CourseUnit courseUnit)
        {
            ArrayList<Tipologia> merge = new ArrayList<Tipologia>();

            Map<String,Map<String,Tipologia>> docenteTurmas = new HashMap<String,Map<String,Tipologia>>();

            fullfillTipologiasSimples(getTipologiasSumarios(), docenteTurmas);
            fullfillTipologiasSimples(getTipologiasExtraAdicionadas(), docenteTurmas);
            fullfillTipologiasSimples(getTipologiasHorarioReferencia(), docenteTurmas);
            fullfillTipologiasSimples(getTipologiasMarcadas(), docenteTurmas);
            fullfillTipologiasSimples(getTipologiasUsadas(), docenteTurmas);
            fullfillTipologiasSimples(getTipologiasTdocTurma(), docenteTurmas);


            if(docenteTurmas.size() == 0)
            {
                //NAO Há sumários vamos associar todos os docentes a todas as turmas
                obtainTipologiasSimplesParaEstesTeachersParaTodasAsTurmas(courseUnit, new HashSet<Teacher>(courseUnit.getTeachers()), merge);
            }
            else
            {
                for(1.5.0/docs/api/java/util/Map.html">Map.Entry<String,Map<String,Tipologia>> docentes: docenteTurmas.entrySet())
                {
                    for(Tipologia tipologia: docentes.getValue().values())
                    {
                        merge.add(tipologia);
                    }
                }
                //NOVO
                //FRAGMENTO PARA OS QUE FALTAM APENAS POR SEGURANÇA JA DEVIAM TER VINDO DO T_DOC_TURMA
                //DO SINC
                //NO LOCAL ONDE AS TIPOLOGIAS SAO INCIALIZADAS NO IMPORT
                //ISTO E MAU PORQUE SE HOUVER TURMAS OS DOCENTES SAO ASSOCIADOS
                //A TODAS E SO DEVERIAM SER ASSOCIADOS AS QUE ESTAO ASSOCAIDOS NO SIGES
                //POR ISSO E QUE ISTO SO SE RESOLVE NO DisciplinaDao durante a Sincronizacao
                //para saber as relacoes TDOC TURMA
                Map<String,Teacher> professoresEsperados = new HashMap<String, Teacher>();
                for(Teacher t: courseUnit.getTeachers())
                {
                    professoresEsperados.put(t.getSigesCode() + "", t);
                }

                for(CourseUnitImpl.Tipologia tMerge: merge)
                {
                    professoresEsperados.remove(tMerge.getCdDocente());
                }
                obtainTipologiasSimplesParaEstesTeachersParaTodasAsTurmas(courseUnit, professoresEsperados.values(), merge);
                //FRAGMENTO EM FALTA PARA INTRODUZIR PROFS SEM SUMARIO



            }


            return merge;
        }

        private void obtainTipologiasSimplesParaEstesTeachersParaTodasAsTurmas(CourseUnit courseUnit, Collection<Teacher> teachers, ArrayList<Tipologia> merge) {
            if(courseUnit.getTurmas() != null && courseUnit.getTeachers() != null)
            {
                for(CourseUnitTurma turma: courseUnit.getTurmas())
                {
                    for(Teacher t : teachers)
                    {
                        Tipologia simples = new Tipologia();
                        simples.setMarkWarning(true);
                        //simples.setUse(true);
                        simples.setCdDocente(""+t.getSigesCode());
                        simples.setCdTurma(turma.getTurma());
                        simples.setCdTipologia(Globals.BACO_TIPOLOGIA_SIMPLES_VIRTUAL_CODE);
                        simples.setDsTipologia(Globals.BACO_TIPOLOGIA_SIMPLES_DS);
                        merge.add(simples);
                    }
                }
            }
        }

        /**
         * Cria uma tipologia Simples para cada par Docente-Turma nesta cadeira olhando para
         * todas as tipologias existentes, uma vez que o Baco não guarda associações entre
         * Docentes e Turmas isso será retirado das tipologias importadas
         *
         * @param tipologias
         * @param docenteTurmas
         */

        private void fullfillTipologiasSimples(ArrayList<Tipologia> tipologias, Map<String, Map<String, Tipologia>> docenteTurmas) {
            if(tipologias != null)
                for(Tipologia tipo: tipologias)
                {
                    Map<String,Tipologia> turmasDocente = docenteTurmas.get(tipo.getCdDocente());
                    if(turmasDocente == null)
                        turmasDocente = new HashMap<String,Tipologia>();
                    docenteTurmas.put(tipo.getCdDocente(),turmasDocente);
                    Tipologia simples = turmasDocente.get(tipo.getCdTurma());
                    //Se nao tiver entrado o sumario vai entrar aqui como TDOC Turma com 0 ocorrencias
                    if(simples==null)
                    {
                        simples = new Tipologia();
                        simples.setCdDocente(tipo.getCdDocente());
                        simples.setCdTurma(tipo.getCdTurma());
                        simples.setCdTipologia(Globals.BACO_TIPOLOGIA_SIMPLES_VIRTUAL_CODE);
                        simples.setDsTipologia(Globals.BACO_TIPOLOGIA_SIMPLES_DS);
                        //simples.setUse(true);//TODAS USADAS
                        if(tipo.hasOcorrencias())
                        {
                            simples.setOcorrencias(tipo.getOcorrencias());
                        }
                        turmasDocente.put(tipo.getCdTurma(), simples);
                        if(tipo.isHorRef())
                            simples.horRef = true;
                        if(tipo.isExtra())
                            simples.extra = true;
                        if(tipo.isTdocturma())
                            simples.setTdocturma(true);
                        if(tipo.isExclude())
                            simples.setExclude(true);
                    }
                    //se for tDocturma e ja tiver entrado como sumário nao entra aqui sequer
                    //Nunca entra primeiro como TDOC Turma se já entrou como sumário
                    else if(tipo.hasOcorrencias())
                    {
                        if(tipo.isHorRef())
                            simples.horRef = true;
                        if(tipo.isExtra())
                            simples.extra = true;
                        if(simples.getOcorrencias() == null)
                            simples.setOcorrencias(0);
                        simples.setOcorrencias(simples.getOcorrencias()+tipo.getOcorrencias());
                        if(tipo.isTdocturma())
                            simples.setTdocturma(true);
                        //Nao devera fazer falta porque quando excluimos uma simples excluimos todas
                        if(tipo.isExclude())
                            simples.setExclude(true);
                    }

                }
        }


    }


    /**Services**/

    /**
     * Require Open Transaction
     * @return 1, 2, 3, 4
     */

    public int getAnoPlanoFromStudiesPlan()
    {
        CourseImpl courseImpl = (CourseImpl) DaoFactory.getCourseDaoImpl().narrow(getCourse());
        1.5.0/docs/api/java/lang/Integer.html">Integer ano = courseImpl.getUnidadeAnoPlano(getSemestre(),getCode());
        if(ano == null)
            return -1;
        else
            return ano;
    }

    /**
     * Require Open Transaction
     * @return S1, .., S8, T1 .. T8, A1 .. A4
     */

    public 1.5.0/docs/api/java/lang/String.html">String getPeriodoPlanoFromStudiesPlan()
    {
        CourseImpl courseImpl = (CourseImpl) DaoFactory.getCourseDaoImpl().narrow(getCourse());
        return courseImpl.getUnidadePeriodoPlano(getSemestre(), getCode());
    }

    /**
     * Require Open Transaction
     * @return  S1 = 1, S2 = 2,S3 = 3,S4 = 4 ...T1 e T2 = 1, T2 e T3 = 2, T4 e T5 = 3 ...
     */

    public int getSemestrePlanoConvertido()
    {
        CourseImpl courseImpl = (CourseImpl) DaoFactory.getCourseDaoImpl().narrow(getCourse());
        1.5.0/docs/api/java/lang/Integer.html">Integer semestre = courseImpl.getUnidadeSemestrePlanoConvertido(getSemestre(), getCode());
        if(semestre == null)
            return -1;
        else
            return semestre;
    }

    /**
     * Require Open Transaction
     * @return S1 = 1, S2 = 2, S3 = 1, S4 = 2 ... T1 e T2 = 1,  T2 e T3 = 2, T4 e T5 = 1, T6 e T7 = 2
     */

    public int getSemestrePlanoAbsoluto()
    {
        1.5.0/docs/api/java/lang/String.html">String id = getSemestre();
        if(id.equals("S1"))
            return 1;
        else if(id.equals("S2"))
            return 2;
        else if(id.equals("A"))
            return -1;

        else if(id.equals("T1"))
            return 1;
        else if(id.equals("T2"))
            return 1;
        else if(id.equals("T3"))
            return 2;
        else if(id.equals("T4"))
            return 2;


        return -1;

    }

    public 1.5.0/docs/api/java/lang/String.html">String getSemestreAbsolutoS1S2()
    {
        1.5.0/docs/api/java/lang/String.html">String id = getSemestre();
        if(id.equals("S1"))
            return "S1";
        else if(id.equals("S2"))
            return "S2";
        else if(id.equals("A"))
            return "S2";

        else if(id.equals("T1"))
            return "S1";
        else if(id.equals("T2"))
            return "S1";
        else if(id.equals("T3"))
            return "S2";
        else if(id.equals("T4"))
            return "S2";
        return "S2";

    }


}