/* * This file is part of gwap, an open platform for games with a purpose * * Copyright (C) 2013 * Project play4science * Lehr- und Forschungseinheit für Programmier- und Modellierungssprachen * Ludwig-Maximilians-Universität München * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package gwap.admin; import gwap.model.Person; import gwap.model.resource.ArtResource; import java.io.File; import java.io.Serializable; import java.util.Calendar; import java.util.Date; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Query; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Logger; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.security.Restrict; import org.jboss.seam.faces.FacesMessages; import org.jboss.seam.log.Log; /** * Computes the 'enabled' field for ArtResources and sets the appropriate * value in the objects. * * @author Fabian Kneißl */ @Name("adminArtResourceEnabled") @Restrict("#{s:hasPermission('artigo', 'all')}") public class ArtResourceEnabled implements Serializable { @Logger private Log log; @In private FacesMessages facesMessages; @In private EntityManager entityManager; private static int minYearsAuthorDead = 70; private static int minYearsArtResourceCreated = 130; // FIXME: how long? private Date getDateAuthorDead() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.YEAR, -minYearsAuthorDead); return cal.getTime(); } private int getDateArtResourceCreatedYear() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.YEAR, -minYearsArtResourceCreated); return cal.get(Calendar.YEAR)-1; } public void calculateAll() { Query query = entityManager.createNamedQuery("artResource.all"); List<ArtResource> artResources = (List<ArtResource>)query.getResultList(); log.info("Calculating enabled for #0 art resources...", artResources.size()); int updated = 0; int updatedEnabled = 0; int totalEnabled = 0; for (ArtResource r : artResources) { Boolean before = r.getEnabled(); updateArtResource(r); Boolean after = r.getEnabled(); if (before != after) { updated++; if (after) updatedEnabled++; } if (after) { totalEnabled++; } } String logMessage = String.format("%d resources processed: %d enabled (%d updated), %d disabled (%d updated)", artResources.size(), totalEnabled, updatedEnabled, artResources.size()-totalEnabled, updated-updatedEnabled); facesMessages.add(logMessage); log.info(logMessage); } public void updateArtResource(ArtResource r) { // Check if file exists boolean enabled = new File(r.getSource().getUrl() + r.getPath()).canRead(); logDisabled(enabled, "file does not exist", r.getId()); // Skipped by staff if (enabled && (r.getSkip() != null && r.getSkip())) { enabled = false; logDisabled(enabled, "skipped by staff", r.getId()); } if (enabled) { // Creator easement enabled = (r.getEasement() != null) && r.getEasement(); logEnabled(enabled, "easement", r.getId()); // Date check for author if (!enabled) { Person artist = r.getArtist(); if (artist != null && artist.getDeath() != null) { enabled = artist.getDeath().before(getDateAuthorDead()); logEnabled(enabled, "author dead (#1)", r.getId(), artist.getDeath()); } } // Date check for resource if (!enabled && r.getDateCreated() != null) { // Try to parse dateCreated int year = 0; try { year = Integer.parseInt(r.getDateCreated()); } catch (NumberFormatException e) { String[] split = r.getDateCreated().split("[^0-9]"); for (int i = 0; i < split.length; i++) { try { int yearTmp = Integer.parseInt(split[i]); if (yearTmp > year) year = yearTmp; } catch (NumberFormatException e1) { // do nothing } } } if (0 < year && year < getDateArtResourceCreatedYear()) enabled = true; logEnabled(enabled, "resource very old (#1)", r.getId(), r.getDateCreated()); } } r.setEnabled(enabled); } private void logEnabled(boolean enabled, String reason, Object... params) { if (enabled) log.info("ArtResource #0 enabled because of "+reason, params); } private void logDisabled(boolean enabled, String reason, Object... params) { if (!enabled) log.info("ArtResource #0 disabled because of "+reason, params); } }