/** * Copyright © 2002 Instituto Superior Técnico * * This file is part of FenixEdu Academic. * * FenixEdu Academic is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * FenixEdu Academic 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>. */ package org.fenixedu.academic.domain.phd; import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.Locale; import org.fenixedu.academic.domain.Person; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.domain.phd.exceptions.PhdDomainOperationException; import org.fenixedu.academic.ui.struts.action.phd.PhdProcessStateBean; import org.fenixedu.academic.util.Bundle; import org.fenixedu.bennu.core.domain.Bennu; import org.fenixedu.bennu.core.i18n.BundleUtil; import org.joda.time.DateTime; import pt.ist.fenixframework.Atomic; abstract public class PhdProcessState extends PhdProcessState_Base { static final public Comparator<PhdProcessState> COMPARATOR_BY_DATE = new Comparator<PhdProcessState>() { @Override public int compare(PhdProcessState o1, PhdProcessState o2) { int result = o1.getStateDate().compareTo(o2.getStateDate()); return result != 0 ? result : o1.getExternalId().compareTo(o2.getExternalId()); } }; protected PhdProcessState() { super(); setRootDomainObject(Bennu.getInstance()); setWhenCreated(new DateTime()); } protected void init(final Person person, final String remarks, final DateTime stateDate, final PhdProcessStateType type) { String[] args = {}; if (person == null) { throw new DomainException("error.PhdProcessState.invalid.person", args); } String[] args1 = {}; if (stateDate == null) { throw new DomainException("error.PhdProcessState.invalid.stateDate", args1); } setStateDate(stateDate); checkStateDate(stateDate, type); setPerson(person); setRemarks(remarks); } private void checkStateDate(DateTime stateDate, final PhdProcessStateType type) { Collection<? extends PhdProcessState> orderedStates = getProcess().getOrderedStates(); for (PhdProcessState phdProcessState : orderedStates) { if (phdProcessState == this) { continue; } if (phdProcessState.getStateDate() != null && phdProcessState.getStateDate().isAfter(stateDate)) { String newStateDate = stateDate.toString("dd/MM/yyyy") + " - " + type.getLocalizedName(); String actualStateDate = phdProcessState.getStateDate().toString("dd/MM/yyyy") + " - " + phdProcessState.getType().getLocalizedName(); throw new PhdDomainOperationException("error.PhdProcessState.state.date.is.previous.of.actual.state.on.process", newStateDate, actualStateDate); } } } public void delete() { disconnect(); deleteDomainObject(); } protected void disconnect() { setPerson(null); setRootDomainObject(null); } abstract public PhdProcessStateType getType(); abstract public boolean isLast(); public abstract PhdProgramProcess getProcess(); @Atomic public void editStateDate(PhdProcessStateBean bean) { if (bean.getStateDate() == null) { throw new PhdDomainOperationException("error.PhdProcessState.state.date.required"); } setStateDate(bean.getStateDate()); } protected static String buildExpectedStatesDescription(List<? extends PhdProcessStateType> possibleNextStates) { if (possibleNextStates.isEmpty()) { return BundleUtil.getString(Bundle.PHD, Locale.getDefault(), "message.phd.process.state.none"); } StringBuilder builder = new StringBuilder(); for (PhdProcessStateType expectedState : possibleNextStates) { Locale locale = Locale.getDefault(); builder.append(expectedState.getLocalizedName(locale)).append(", "); } builder.delete(builder.length() - 2, builder.length()); return builder.toString(); } }