/*
* 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 gwap.model.resource.ArtResourceTeaser;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.annotations.web.RequestParameter;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.log.Log;
@Name("artResourceTeaserBean")
@Scope(ScopeType.PAGE)
public class ArtResourceTeaserBean implements Serializable {
private static final long serialVersionUID = 1L;
@Logger private Log log;
@In private FacesMessages facesMessages;
@In private EntityManager entityManager;
@In private Person person;
@Out(required=false)
private ArtResource resource;
@DataModelSelection
@Out(required=false)
private ArtResourceTeaser artResourceTeaser;
@RequestParameter
private Long resourceId;
private Long resourceIdNoRequestParameter;
private String chosenLanguage;
private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
@DataModel
private List<ArtResourceTeaser> getTeaserList() {
if (resource != null)
return resource.getTeasers();
else
return null;
}
public void chooseResourceWithoutTeaser() {
Query query = entityManager.createNamedQuery("artResource.randomWithoutTeaser");
query.setMaxResults(1);
try {
resource = (ArtResource) query.getSingleResult();
chosenLanguage = "de";
newTeaser();
resourceIdNoRequestParameter = resource.getId();
} catch (NoResultException e) {
facesMessages.addFromResourceBundle("admin.resourceTeaser.noResourceFound");
resource = null;
}
}
public void chooseNotTranslatedResource(String language) {
Query query = entityManager.createNamedQuery("artResource.randomWithoutTeaserInLanguage");
query.setParameter("language", language);
query.setMaxResults(1);
try {
resource = (ArtResource) query.getSingleResult();
chosenLanguage = language;
newTeaser();
resourceIdNoRequestParameter = resource.getId();
} catch (NoResultException e) {
facesMessages.addFromResourceBundle("admin.resourceTeaser.noResourceFound");
resource = null;
}
}
public void chooseResource(Long resourceId) {
if (resourceId != null) {
resource = entityManager.find(ArtResource.class, resourceId);
if (resource != null) {
chosenLanguage = null;
newTeaser();
resourceIdNoRequestParameter = resource.getId();
} else {
facesMessages.addFromResourceBundle("admin.resourceTeaser.noResourceFound");
}
}
}
public void chooseResource() {
// Workaround: If resourceId is given as RequestParameter, it is not set in this bean
if (resourceIdNoRequestParameter != null && resourceIdNoRequestParameter > 0)
chooseResource(resourceIdNoRequestParameter);
else
chooseResource(resourceId);
}
public void modifyTeaser() {
if (artResourceTeaser != null && resource != null) {
if (artResourceTeaser.getId() == null) {
Query q = entityManager.createNamedQuery("artResourceTeaser.byLanguageAndResource");
q.setParameter("language", artResourceTeaser.getLanguage());
q.setParameter("resource", resource);
q.setMaxResults(1);
if (q.getResultList().isEmpty()) {
log.info("Adding teaser #0 to resource #1", artResourceTeaser, resource);
artResourceTeaser.setResource(resource);
artResourceTeaser.setCreateDate(new Date());
artResourceTeaser.setCreator(person);
entityManager.persist(artResourceTeaser);
resource.getTeasers().add(artResourceTeaser);
facesMessages.addFromResourceBundle("admin.resourceTeaser.teaserAdded");
} else {
log.info("Did not add teaser #0 to resource #1 because one with the same language already exists", artResourceTeaser, resource);
facesMessages.addFromResourceBundle("admin.resourceTeaser.teaserAlreadyExists");
}
} else {
log.info("Updating teaser #0", artResourceTeaser);
ArtResourceTeaser oldTeaser = entityManager.find(ArtResourceTeaser.class, artResourceTeaser.getId());
oldTeaser.setInternalNote("updated at "+dateFormat.format(new Date()) + ", resource_id="+oldTeaser.getResource().getId());
oldTeaser.setResource(null);
resource.getTeasers().remove(oldTeaser);
ArtResourceTeaser newTeaser = new ArtResourceTeaser();
newTeaser.setResource(resource);
newTeaser.setCreateDate(new Date());
newTeaser.setCreator(person);
newTeaser.setLanguage(artResourceTeaser.getLanguage());
newTeaser.setDescription(artResourceTeaser.getDescription());
entityManager.persist(newTeaser);
resource.getTeasers().add(newTeaser);
artResourceTeaser = newTeaser;
facesMessages.addFromResourceBundle("admin.resourceTeaser.teaserUpdated");
}
updateResourceTeasers();
}
}
private void updateResourceTeasers() {
entityManager.flush();
Query q = entityManager.createNamedQuery("artResource.byIdWithTeasers");
q.setParameter("id", resource.getId()).setMaxResults(1);
try {
resource = (ArtResource) q.getSingleResult();
} catch (NoResultException e) {
resource = entityManager.find(ArtResource.class, resource.getId());
}
newTeaser();
}
public void editTeaser(Long id) {
}
public void newTeaser() {
artResourceTeaser = new ArtResourceTeaser();
if (chosenLanguage != null) {
artResourceTeaser.setLanguage(chosenLanguage);
} else {
// Guess language
if (getTeaserList() != null && getTeaserList().size() > 0) {
List<String> languages = new ArrayList<String>();
languages.add("de"); languages.add("en"); languages.add("fr");
for (ArtResourceTeaser teaser : getTeaserList()) {
languages.remove(teaser.getLanguage());
}
if (languages.size() > 0)
artResourceTeaser.setLanguage(languages.get(0));
}
}
}
public void deleteTeaser(Long id) {
log.info("Deleting teaser #0", artResourceTeaser);
artResourceTeaser = entityManager.find(ArtResourceTeaser.class, id);
artResourceTeaser.setInternalNote("deleted at "+dateFormat.format(new Date())+ ", resource_id="+artResourceTeaser.getResource().getId());
artResourceTeaser.setResource(null);
resource.getTeasers().remove(artResourceTeaser);
updateResourceTeasers();
newTeaser();
}
public Map<String, String> getLanguages() {
Map<String, String> languages = new TreeMap<String, String>();
languages.put("Deutsch", "de");
languages.put("English", "en");
languages.put("Francais", "fr");
return languages;
}
public ArtResource getResource() {
return resource;
}
public void setArtResourceTeaser(ArtResourceTeaser artResourceTeaser) {
this.artResourceTeaser = artResourceTeaser;
}
public ArtResourceTeaser getArtResourceTeaser() {
return artResourceTeaser;
}
public void setResourceId(Long resourceId) {
this.resourceId = resourceId;
}
public Long getResourceId() {
return resourceId;
}
public Long getResourceIdNoRequestParameter() {
return resourceIdNoRequestParameter;
}
public void setResourceIdNoRequestParameter(Long resourceIdNoRequestParameter) {
this.resourceIdNoRequestParameter = resourceIdNoRequestParameter;
}
}