InfoPerson infoPerson, IUserView userView) throws FenixServiceException, ExcepcaoPersistencia {
InfoPerson infoPerson, IUserView userView, Boolean isNewPerson) throws FenixServiceException, ExcepcaoPersistencia {
    public InfoMasterDegreeCandidate run(InfoMasterDegreeCandidate newMasterDegreeCandidate,            InfoPerson infoPerson, IUserView userView) throws FenixServiceException,            ExcepcaoPersistencia {        ISuportePersistente sp = null;        IMasterDegreeCandidate existingMasterDegreeCandidate = null;        try {            sp = PersistenceSupportFactory.getDefaultPersistenceSupport();            IExecutionDegree executionDegree = Cloner                    .copyInfoExecutionDegree2ExecutionDegree(newMasterDegreeCandidate                            .getInfoExecutionDegree());            existingMasterDegreeCandidate = sp.getIPersistentMasterDegreeCandidate()                    .readByIdentificationDocNumberAndTypeAndExecutionDegreeAndSpecialization(                            newMasterDegreeCandidate.getInfoPerson().getNumeroDocumentoIdentificacao(),                            newMasterDegreeCandidate.getInfoPerson().getTipoDocumentoIdentificacao(), executionDegree.getIdInternal(),                            newMasterDegreeCandidate.getSpecialization());        } catch (ExcepcaoPersistencia ex) {            FenixServiceException newEx = new FenixServiceException("Persistence layer error");            newEx.fillInStackTrace();            throw newEx;        }        if (existingMasterDegreeCandidate == null) {            throw new ExcepcaoInexistente("Unknown Candidate !!");        }        try {            IService service = new ChangePersonalInfo();            ((ChangePersonalInfo) service).run(userView, infoPerson);        } catch (ExcepcaoPersistencia ex) {            FenixServiceException newEx = new FenixServiceException("Persistence layer error");            newEx.fillInStackTrace();            throw newEx;        }        // Change the Information        sp.getIPersistentMasterDegreeCandidate().simpleLockWrite(existingMasterDegreeCandidate);        existingMasterDegreeCandidate.setAverage(newMasterDegreeCandidate.getAverage());        existingMasterDegreeCandidate.setMajorDegree(newMasterDegreeCandidate.getMajorDegree());        existingMasterDegreeCandidate.setMajorDegreeSchool(newMasterDegreeCandidate                .getMajorDegreeSchool());        existingMasterDegreeCandidate.setMajorDegreeYear(newMasterDegreeCandidate.getMajorDegreeYear());        existingMasterDegreeCandidate.setSpecializationArea(newMasterDegreeCandidate                .getSpecializationArea());        // Change the Candidate Situation        InfoMasterDegreeCandidate infoMasterDegreeCandidate = null;        try {            IPersistentCandidateSituation candidateSituationDAO = sp.getIPersistentCandidateSituation();            infoMasterDegreeCandidate = InfoMasterDegreeCandidateWithInfoPerson                    .newInfoFromDomain(existingMasterDegreeCandidate);            List situations = new ArrayList();            ICandidateView candidateView = null;            ICandidateSituation candidateSituationFromBD = new CandidateSituation();            candidateSituationFromBD = (ICandidateSituation) sp.getIPersistentCandidateSituation()                    .readByOID(CandidateSituation.class,                            existingMasterDegreeCandidate.getActiveCandidateSituation().getIdInternal(),                            true);            candidateSituationFromBD.setValidation(new State(State.INACTIVE));            // Create the New Candidate Situation            ICandidateSituation activeCandidateSituation = createActiveSituation(                    existingMasterDegreeCandidate, candidateSituationDAO);            sp.confirmarTransaccao();            sp.iniciarTransaccao();            situations.add(Cloner                    .copyICandidateSituation2InfoCandidateSituation(activeCandidateSituation));            candidateView = new CandidateView(situations);            userView.setCandidateView(candidateView);            infoMasterDegreeCandidate.setInfoCandidateSituation(Cloner                    .copyICandidateSituation2InfoCandidateSituation(activeCandidateSituation));            infoMasterDegreeCandidate.setInfoPerson(infoPerson);        } catch (ExcepcaoPersistencia ex) {            FenixServiceException newEx = new FenixServiceException("Persistence layer error");            newEx.fillInStackTrace();            throw newEx;        }        return infoMasterDegreeCandidate;    }