/**
* 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.task;
import org.fenixedu.academic.domain.Person;
import org.fenixedu.academic.domain.PhotoState;
import org.fenixedu.academic.domain.PhotoType;
import org.fenixedu.academic.domain.Photograph;
import org.fenixedu.academic.domain.candidacyProcess.IndividualCandidacy;
import org.fenixedu.academic.domain.candidacyProcess.IndividualCandidacyDocumentFile;
import org.fenixedu.academic.domain.candidacyProcess.IndividualCandidacyDocumentFileType;
import org.fenixedu.academic.domain.exceptions.DomainException;
import org.fenixedu.academic.domain.photograph.Picture;
import org.fenixedu.academic.domain.student.Registration;
import org.fenixedu.academic.util.ContentType;
import org.fenixedu.bennu.core.domain.Bennu;
import org.fenixedu.bennu.scheduler.CronTask;
import org.fenixedu.bennu.scheduler.annotation.Task;
@Task(englishTitle = "SetStudentPhotosFromCandidacies", readOnly = false)
public class SetStudentPhotosFromCandidacies extends CronTask {
@Override
public void runTask() throws Exception {
int missing = 0;
int withContent = 0;
int withContentType = 0;
int unableToProcessImage = 0;
int fixed = 0;
for (final IndividualCandidacy candidacy : Bennu.getInstance().getIndividualCandidaciesSet()) {
for (final IndividualCandidacyDocumentFile file : candidacy.getDocumentsSet()) {
final IndividualCandidacyDocumentFileType type = file.getCandidacyFileType();
if (type == IndividualCandidacyDocumentFileType.PHOTO) {
final Registration registration = candidacy.getRegistration();
if (registration != null) {
final Person person = registration.getPerson();
final Photograph personalPhotoEvenIfPending = person.getPersonalPhotoEvenIfPending();
if (personalPhotoEvenIfPending == null) {
missing++;
final byte[] content = file.getContent();
if (content != null && content.length > 0) {
withContent++;
final ContentType contentType = ContentType.getContentType(file.getContentType());
if (contentType != null) {
withContentType++;
if (chew(content)) {
final Photograph p = new Photograph(PhotoType.INSTITUTIONAL, contentType, content);
p.setState(PhotoState.APPROVED);
person.setPersonalPhoto(p);
fixed++;
} else {
unableToProcessImage++;
}
}
}
}
}
}
}
}
taskLog("Missing: %s photos.%n", Integer.toString(missing));
taskLog("Possible Content Fix: %s.%n", Integer.toString(withContent));
taskLog("Valid Content Type Fix: %s.%n", Integer.toString(withContentType));
taskLog("Unable to chew: %s.%n", Integer.toString(unableToProcessImage));
taskLog("Fixed: %s photos.%n", Integer.toString(fixed));
}
private boolean chew(final byte[] content) {
try {
Picture.readImage(content);
return true;
} catch (final DomainException ex) {
return false;
}
}
}