Subversion Repositories bacoAlunos

Rev

Rev 1312 | Rev 1315 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.domain;

import com.owlike.genson.Genson;
import com.owlike.genson.TransformationException;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.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.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.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * 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 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 isOwnedBy(GenericUser u)
    {
        return isOwnedBy(u, false);
    }

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

    /**
     * Not implemented can be variuous teachers
     * @return null
     * use isOwnedBy 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()).isTeacherOfCourseUnit(getId(), true)
                        || (getResponsableTeacher() != null && getResponsableTeacher().getId() == userSession.getUser().getId())
                        || userSession.getUser().hasRole(getCourse().getValidationRole())
                );
    }

    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 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);
    }

    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

        ;

        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, TransformationException
    {
        return Tipologias.deserialize(getTipologias());
    }

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

    public TipologiaPersistent loadPersistent(Tipologia myTipo)
    {
        TipologiaPersistent tipologiaPersistent = new TipologiaPersistent();
        tipologiaPersistent.setHorRef(myTipo.isHorRef());
        tipologiaPersistent.setExtra(myTipo.isExtra());
        tipologiaPersistent.setTeacher(DaoFactory.getTeacherDaoImpl().loadBySigesCode(1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(myTipo.getCdDocente())));
        tipologiaPersistent.setCdTipologia(myTipo.getCdTipologia());
        tipologiaPersistent.setOcorrencias(myTipo.getOcorrencias());

        tipologiaPersistent.setCourseUnitTurma(findTurma(myTipo.getCdTurma()));
        if(tipologiaPersistent.getCourseUnitTurma() == null || tipologiaPersistent.getTeacher() == null)
        {
            logger.error("Turma ou professor nao encontrados enquanto fazia uma tipologia persistente");
            return 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;
        private 1.5.0/docs/api/java/lang/String.html">String cdTipologia;
        private 1.5.0/docs/api/java/lang/Integer.html">Integer ocorrencias = 0;
        protected boolean extra;
        protected boolean horRef;

        public boolean isExtra() {
            return extra;
        }

        public boolean isHorRef() {
            return horRef;
        }

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

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

        public void setHorRef(boolean horRef) {
            this.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 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/Integer.html">Integer getOcorrencias() {
            return ocorrencias;
        }

        public void setOcorrencias(1.5.0/docs/api/java/lang/Integer.html">Integer ocorrencias) {
            this.ocorrencias = ocorrencias;
        }
    }
    /**
     * 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; // apenas faz sentido nos sumarios. no horario ref nao.

        protected boolean extra;
        protected boolean horRef;

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

        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)
        {
            return o instanceof Tipologia &&
                    ((((Tipologia)o).getCdTurma() == null && getCdTurma() == null)
                            ||
                     (((Tipologia)o).getCdTurma().equals(getCdTurma())))
                    &&

                    (
                     (((Tipologia)o).getCdDocente() == null && getCdDocente() == null)
                            ||
                     (((Tipologia)o).getCdDocente().equals(getCdDocente())))
                    &&

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

        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 static class Tipologias
    {
        ArrayList<Tipologia> tipologiasHorarioReferencia = new ArrayList<Tipologia>();
        ArrayList<Tipologia> tipologiasSumarios = new ArrayList<Tipologia>();
        ArrayList<Tipologia> tipologiasExtraAdicionadas = new ArrayList<Tipologia>();

        public ArrayList<Tipologia> getTipologiasHorarioReferencia() {
            return tipologiasHorarioReferencia;
        }

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

        public ArrayList<Tipologia> getTipologiasSumarios() {
            return tipologiasSumarios;
        }

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

        public ArrayList<Tipologia> getTipologiasExtraAdicionadas() {
            return tipologiasExtraAdicionadas;
        }

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

        private static Genson getGenson(){
            Genson genson = new Genson.Builder()
                    .exclude(5+0%2Fdocs%2Fapi+Object">Object.class)
                    .include("tipologiasExtraAdicionadas", Tipologias.class)
                    .include("tipologiasSumarios", Tipologias.class)
                    .include("tipologiasHorarioReferencia", Tipologias.class)
                    .include("cdTipologia", Tipologia.class)
                    .include("cdDocente", Tipologia.class)
                    .include("cdTurma", Tipologia.class)
                    .include("dsTipologia",Tipologia.class)
                    .include("ocorrencias", 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, TransformationException
        {
            Genson genson = getGenson();
            try {
                return genson.serialize(this);
            } catch (TransformationException e) {
                throw e;
            } catch (1.5.0/docs/api/java/io/IOException.html">IOException e) {
                throw e;
            }
        }
        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, TransformationException
        {
            if(serial == null)
                return null;
            try {
                return getGenson().deserialize(serial, Tipologias.class);
            } catch (TransformationException e) {
                throw e;
            } catch (1.5.0/docs/api/java/io/IOException.html">IOException e) {
                throw e;
            }
        }

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

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

            for(Tipologia tipo: tipologiasHorarioReferencia)
            {
                if(!merge.contains(tipo))
                {
                    merge.add(tipo);
                }
            }
            for(Tipologia tipo: tipologiasExtraAdicionadas)
            {
                if(!merge.contains(tipo))
                {
                    merge.add(tipo);
                }
            }
            for(Tipologia tipo: merge)
            {
                if(tipologiasHorarioReferencia.contains(tipo))
                {
                    tipo.horRef = true;
                }

                if(tipologiasExtraAdicionadas.contains(tipo))
                {
                    tipo.extra = true;
                }
            }
            return merge;
        }


    }





}