/*
* 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.model.resource;
import gwap.model.ArtResourceRating;
import gwap.model.Person;
import gwap.model.Source;
import gwap.tools.ImageAccessBean;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Transient;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
@NamedQueries({
// internal usage only (no enabled check)
@NamedQuery(name="artResource.all", query="select r from ArtResource r"),
@NamedQuery(name="artResource.byId", query="select r from ArtResource r where id=:id"),
@NamedQuery(name="artResource.byIdWithTeasers", query="select r from ArtResource r inner join fetch r.teasers where r.id=:id"),
@NamedQuery(name="artResource.byIdNotInCache", query="select r from ArtResource r where id=:id and " +
"not exists (select id from ArtResourceCache c where c.resource = r and name = :name and language = :language)"),
// public usage
@NamedQuery(name="artResource.nrEnabled", query="select count(r) from ArtResource r where r.enabled=true"),
@NamedQuery(name="artResource.enabled", query="select r from ArtResource r where r.enabled=true order by id"),
@NamedQuery(name="artResource.teaserByLanguage",
query="select t.description " +
"from ArtResource r join r.teasers t " +
"where r=:resource and t.language=:language and " +
" r.enabled=true"),
@NamedQuery(name="artResource.tagFrequencyByTagNameAndLanguageAndThreshold",
query="select r " +
"from ArtResource r " +
"where " +
" r.enabled=true and " +
" r.id in ( " +
" select t.resource.id " +
" from Tagging t " +
" where lower(t.tag.name)=lower(:tagName) and t.tag.language=:language and t.resource.enabled=true " +
" group by t.resource.id, t.tag.id " +
" having count(t.person) >= :threshold " +
" order by count(t.person) desc )"),
@NamedQuery(name="artResource.random",
query="select r " +
"from ArtResource r " +
"where r.enabled=true " +
"order by random()"),
@NamedQuery(name="artResource.woelfflin",
query="select r " +
"from ArtResource r " +
"where r.enabled=true and " +
//"r.id < 5000 and r.id > 999 and " +
/* "ascii(substr(r.dateCreated,1,1)) >= 48 and ascii(substr(r.dateCreated,1,1)) <= 57 and " +
"ascii(substr(r.dateCreated,2,1)) >= 48 and ascii(substr(r.dateCreated,2,1)) <= 57 and " +
"ascii(substr(r.dateCreated,3,1)) >= 48 and ascii(substr(r.dateCreated,3,1)) <= 57 and " +
"ascii(substr(r.dateCreated,4,1)) >= 48 and ascii(substr(r.dateCreated,4,1)) <= 57 and " +
"cast(substr(r.dateCreated,1,4) as INTEGER) < 1770 and " +
"cast(substr(r.dateCreated,1,4) as INTEGER) > 1400 and " +
*/
"r.artist is not null "+
"order by random()"),
@NamedQuery(name="artResource.randomCustom",
query="select r " +
"from ArtResource r " +
"where r.enabled=true and " +
" r.source=:source " +
"order by random()"),
@NamedQuery(name="artResource.idRandom",
query="select r.id " +
"from ArtResource r " +
"where r.enabled=true " +
"order by random()"),
@NamedQuery(name="artResource.withTeaser",
query="select distinct r " +
"from ArtResource r join r.teasers t " +
"where t is not null and " +
" r.enabled=true " +
"order by r.id"),
@NamedQuery(name="artResource.withTeaserCustom",
query="select distinct r " +
"from ArtResource r join r.teasers t " +
"where t is not null and " +
" r.enabled=true " +
" and r.source = :source " +
"order by r.id"),
@NamedQuery(name="artResource.randomWithTeaser",
query="select distinct r " +
"from ArtResource r join r.teasers t " +
"where t is not null and " +
" r.enabled=true " +
"order by random()"),
@NamedQuery(name="artResource.randomWithoutTeaser",
query="select r " +
"from ArtResource r left outer join r.teasers t " +
"where t is null and " +
" r.enabled=true " +
"order by random()"),
@NamedQuery(name="artResource.randomWithoutTeaserInLanguage",
query="select r " +
"from ArtResource r join r.teasers t " +
"where not exists (from ArtResourceTeaser t2 where t2.resource = r and t2.language = :language) and " +
" r.enabled=true " +
"order by random()"),
@NamedQuery(name="artResource.randomWithoutTaggings",
query="select t.resource " +
"from Tagging t right outer join t.resource " +
"where t is null and " +
" t.resource.enabled=true " +
"order by random()"),
@NamedQuery(name="artResource.notTaggedResourceId",
query="select r.id " +
"from ArtResource r left join r.taggings t " +
"where " +
" t.id is null and " +
" r.enabled=true " +
"order by random()"
),
@NamedQuery(name="artResource.notTaggedResourceIdCustom",
query="select r.id " +
"from ArtResource r left join r.taggings t " +
"where " +
" t.id is null and " +
" r.enabled=true and " +
" r.source=:source " +
"order by random()"
),
@NamedQuery(name="artResource.notTaggedResourceIdWithTeaser",
query="select r.id " +
"from ArtResource r left join r.taggings t join r.teasers " +
"where " +
" t.id is null and " +
" r.enabled=true " +
"order by random()"
),
@NamedQuery(name="artResource.notTaggedResourceIdWithTeaserCustom",
query="select r.id " +
"from ArtResource r left join r.taggings t join r.teasers " +
"where " +
" t.id is null and " +
" r.enabled=true and " +
" r.source=:source " +
"order by random()"
),
@NamedQuery(name="artResource.leastTaggedResourceId",
query="select r.id " +
"from ArtResource r join r.taggings t " +
"where " +
" t.tag.language=:language and" +
" r.enabled=true " +
"group by r.id " +
"order by count(r.id) asc, random() "
),
@NamedQuery(name="artResource.leastTaggedResourceIdCustom",
query="select r.id " +
"from ArtResource r join r.taggings t " +
"where " +
" t.tag.language=:language and " +
" r.enabled=true and " +
" r.source=:source " +
"group by r.id " +
"order by count(r.id) asc, random() "
),
@NamedQuery(name="artResource.leastTaggedResourceIdMaxCount",
query="select r.id " +
"from ArtResource r join r.taggings t " +
"where " +
" t.tag.language=:language and" +
" r.enabled=true " +
"group by r.id " +
"having count(r.id) <= :maxCount " +
"order by count(r.id) asc, random() "
),
@NamedQuery(name="artResource.leastTaggedResourceIdMaxCountCustom",
query="select r.id " +
"from ArtResource r join r.taggings t " +
"where " +
" t.tag.language=:language and " +
" r.enabled=true and " +
" r.source=:source " +
"group by r.id " +
"having count(r.id) <= :maxCount " +
"order by count(r.id) asc, random() "
),
@NamedQuery(name="artResource.leastTaggedResourceIdWithTeaser",
query="select r.id " +
"from ArtResource r join r.taggings t join r.teasers " +
"where " +
" t.tag.language=:language and" +
" r.enabled=true " +
"group by r.id " +
"order by count(r.id) asc, random() "
),
@NamedQuery(name="artResource.leastTaggedResourceIdWithTeaserCustom",
query="select r.id " +
"from ArtResource r join r.taggings t join r.teasers " +
"where " +
" t.tag.language=:language and " +
" r.enabled=true and " +
" r.source=:source " +
"group by r.id " +
"order by count(r.id) asc, random() "
),
@NamedQuery(name="artResource.leastTaggedResourceIdLimit",
query="select r.id " +
"from ArtResource r inner join r.taggings t " +
"where " +
"t.tag.language = :language and " +
"r.enabled=true " +
"and r.id in (:limitlist) " +
"group by r.id " +
"order by count(r.id) asc " ),
@NamedQuery(name="artResource.atLeastTaggedResourceId",
query="select t.resource.id " +
"from Tagging t " +
"where " +
" t.resource.enabled=true " +
"group by t.resource.id " +
"having count(t.id) >= :minTaggings " +
"order by random() " ),
@NamedQuery(name="artResource.atLeastTaggedResourceByLanguageId",
query="select t.resource.id " +
"from Tagging t " +
"where " +
" t.resource.enabled=true and " +
" t.tag.language=:language " +
"group by t.resource.id " +
"having count(t.id) >= :minTaggings " +
"order by random() " ),
@NamedQuery(name="artResource.atLeastTaggedResourceByLanguageIdCustom",
query="select t.resource.id " +
"from Tagging t " +
"where " +
" t.resource.enabled=true and " +
" t.tag.language=:language and " +
" t.resource.source=:source " +
"group by t.resource.id " +
"having count(t.id) >= :minTaggings " +
"order by random() " ),
@NamedQuery(name="artResource.atLeastTaggedResourceIdCustom",
query="select t.resource.id " +
"from Tagging t " +
"where " +
" t.resource.enabled=true and " +
" t.resource.source=:source " +
"group by t.resource.id " +
"having count(t.id) >= :minTaggings " +
"order by random() " ),
@NamedQuery(name="artResource.atLeastTaggedResourceIdLimit",
query="select t.resource.id " +
"from Tagging t " +
"where " +
"t.resource.enabled=true " +
"and t.resource.id in (:limitlist) "+
"and t.tag.language = :language "+
"group by t.resource.id " +
"having count(t.id) >= :minTaggings " +
"order by random() " ),
@NamedQuery(name="artResource.byNotIdRandom",
query="select r from ArtResource r where id!=:id and " +
"r.enabled=true " +
"order by random()"),
/*@NamedQuery(name="artResource.bySimilarityId",
query="select r from ArtResource r " +
"left join r.taggings t1 " +
"left join t1.tag.taggings t2 " +
"where t2.resource.id=:id and r.id!=:id " +
"group by r.id, r.enabled, r.artist, r.dateCreated, r.institution, r.location, r.path, r.source " +
"order by count(t1) desc"),*/
@NamedQuery(name="artResource.bySimilarityIdAndNotIdListLimit",
query="select new gwap.tools.ArtResourceFrequency(r, count(t1)) from ArtResource r " +
"left join r.taggings t1 " +
"left join t1.tag.taggings t2 " +
"where t2.resource.id=:id and r.id!=:id and t1.tag.language=:lang and " +
"r not in (:others) and " +
"r.id in (:limitlist) and " +
"r.enabled=true " +
"group by r.id, r.enabled, r.artist, r.dateCreated, r.institution, r.location, r.path, r.source " +
"order by count(t1) desc"),
@NamedQuery(name="artResource.bySimilarityIdAndNotIdListAtLeastTaggedLimit",
query="select new gwap.tools.ArtResourceFrequency(r, count(t1)) from ArtResource r " +
"left join r.taggings t1 " +
"left join t1.tag.taggings t2 " +
"where t2.resource.id=:id and r.id!=:id and t1.tag.language=:lang and " +
"r not in (:others) and " +
"r.id in (:limitlist) and " +
"r.enabled=true " +
"group by r.id, r.enabled, r.artist, r.dateCreated, r.institution, r.location, r.path, r.source " +
"having count(t1) >= :minTaggings " +
"order by count(t1) desc"),
@NamedQuery(name="artResource.byNotIdListRandom",
query="select r from ArtResource r " +
"where r not in (:others) and " +
"r.enabled=true " +
"order by random()"),
@NamedQuery(name="artResource.resourcesByGameRoundId",
query="select r from GameRound g " +
"inner join g.resources r " +
"where g.id=:id and " +
"r.enabled=true "
),
/*@NamedQuery(name="artResource.playedResourceIdsByGameRoundId",
query="select res.id from Description d " +
"left join d.gameRound g " +
"left join g.resources res " +
"where g.id=:id and d.tagRating.resource.id=res.id " +
"group by res.id, res.enabled " +
"order by min(d.created)"),*/
@NamedQuery(name="artResource.playedResourceIdsByGameRoundId",
query="select r.id from Tagging t " +
"left join t.gameRound g " +
"left join g.resources r " +
"where g.id=:id and t.resource.id=r.id and " +
"r.enabled=true " +
"group by r.id, r.enabled " +
"order by min(t.created)"),
@NamedQuery(name="artResource.FrequencyByIdListAndTagNames",
query="select new gwap.tools.ArtResourceFrequency(r, count(t1)) " +
"from ArtResource r " +
"inner join r.taggings t1 " +
"where r.id in (:resids) and t1.tag in (:tags) " +
"and t1.tag.language=:lang " +
"group by r.id, r.enabled, r.artist, r.dateCreated, r.institution, r.location, r.path, r.source "),
@NamedQuery(name="artResource.FrequencyInTagsByIdListAndTagNames",
query="select new gwap.tools.ArtResourceFrequency(r, count(distinct t1.tag)) " +
"from ArtResource r " +
"inner join r.taggings t1 " +
"where r.id in (:resids) and t1.tag in (:tags) " +
"and t1.tag.language=:lang " +
"and t1.person.id!=:personid " +
"group by r.id, r.enabled, r.artist, r.dateCreated, r.institution, r.location, r.path, r.source"),
@NamedQuery(name="artResource.tagCount",
query="select count(distinct tag) from Tagging t " +
"left join t.tag tag " +
"where t.resource.id=:resid and tag.language=:lang"),
@NamedQuery(name="artResource.tagCountForTagname",
query="select count(distinct tag) from Tagging t " +
"left join t.tag tag " +
"where t.resource.id=:resid and tag.language=:lang and lower(tag.name)=:tagname"),
@NamedQuery(name="artResource.taggingCount",
query="select count(t) from Tagging t " +
"where t.resource.id=:resid and t.tag.language=:lang"),
@NamedQuery(name="artResource.gameLocations",
query="select a from ArtResource a " +
"join a.virtualTaggings v join v.virtualTaggingTypes t " +
"where t.id = :virtualTaggingTypeId " +
"and a.shownLocation.type = 'APP' " +
"and not exists (from ArtResource a2 where a2.isVersionOf.artist.deviceId = :deviceId and a2 = a)"),
@NamedQuery(name="artResource.getRandomPictures",
query="select a from ArtResource a " +
"where a.origin = :origin and " +
"not exists (from ArtResourceRating r where r.person.deviceId = :deviceId and r.resource = a) " +
"order by random()"),
@NamedQuery(name="artResource.byOriginAndDeviceId",
query="select count(*) from ArtResource a where a.origin = :origin and a.artist.deviceId = :deviceId"),
@NamedQuery(name="artResource.hasBeenPlayedSince",
query="select count(*) from ArtResource r join r.gameRounds g join g.person p " +
"where coalesce(p.personConnected, p) = :person " +
"and g.startDate >= :startDate " +
"and r = :resource")
})
/**
* ArtResource that can be tagged in a game. The resource could be an image that
* is tagged with "tree".
*
* @author Fabian Kneißl
*
*/
@Entity
@Name("artResource")
@Scope(ScopeType.CONVERSATION)
public class ArtResource extends Resource {
private static final long serialVersionUID = 1L;
public static final String ORIGIN_APP_USER = "vom Nutzer gemacht";
public static final String ORIGIN_APP_CRIMESCENE = "Bild aus App-Spiel";
@ManyToOne
private Person artist;
@ManyToOne private Source source;
@OneToMany(mappedBy="resource",
cascade=CascadeType.PERSIST) private Set<ArtResourceTitle> titles = new HashSet<ArtResourceTitle>();
@OneToMany(mappedBy="resource") private List<ArtResourceTeaser> teasers = new ArrayList<ArtResourceTeaser>();
@OneToMany(mappedBy="resource",
cascade=CascadeType.PERSIST) private Set<ArtResourceRating> ratings = new HashSet<ArtResourceRating>();
@OneToOne private Location shownLocation; // Ort der Abblidung (ex. Marienplatz)
@ManyToOne private ArtResource isVersionOf; // A photo references the original artwork
private String path;
private String dateCreated;
private String location; // Ausstellungsort (ex. Staatliche Kunstsammlung ...)
private String institution; // Einrichtung
@Lob
private String origin; // Kauf, Leihgabe, Geschenk, Mittelverwendung
private Boolean easement; // permission to use the ArtResource is given by the author
private Boolean skip; // if ArtResource is not suitable to be tagged by users (e.g., boring)
@Transient
private String url;
public String getDefaultTitle() {
if (titles.size() == 1)
return titles.iterator().next().getTitle();
else if (titles.size() > 1)
//FIXME: do it more sensibly
return titles.iterator().next().getTitle();
else
return "";
}
public String getArtistName() {
try {
String artistAsString = "";
if (artist.getForename() != null)
artistAsString += artist.getForename() + " ";
if (artist.getSurname() != null)
artistAsString += artist.getSurname();
return artistAsString;
} catch (NullPointerException e) {
return null;
}
}
public Person getArtist() {
return artist;
}
public void setArtist(Person artist) {
this.artist = artist;
}
public Set<ArtResourceTitle> getTitles() {
return titles;
}
public void setTitles(Set<ArtResourceTitle> titles) {
this.titles = titles;
}
public String getDateCreated() {
return dateCreated;
}
public void setDateCreated(String dateCreated) {
this.dateCreated = dateCreated;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getInstitution() {
return institution;
}
public void setInstitution(String institution) {
this.institution = institution;
}
public String getOrigin() {
return origin;
}
public void setOrigin(String origin) {
this.origin = origin;
}
public Source getSource() {
return source;
}
public void setSource(Source source) {
this.source = source;
}
public List<ArtResourceTeaser> getTeasers() {
return teasers;
}
public void setTeasers(List<ArtResourceTeaser> teasers) {
this.teasers = teasers;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public void setUrl(String url) {
this.url = url;
}
public String getUrl() {
if (url == null)
ImageAccessBean.setResourceUrl(this);
return url;
}
public Boolean getEasement() {
return easement;
}
public void setEasement(Boolean easement) {
this.easement = easement;
}
public Boolean getSkip() {
return skip;
}
public void setSkip(Boolean skip) {
this.skip = skip;
}
public void setShownLocation(Location shownLocation) {
this.shownLocation = shownLocation;
}
public Location getShownLocation() {
return shownLocation;
}
public ArtResource getIsVersionOf() {
return isVersionOf;
}
public void setIsVersionOf(ArtResource isVersionOf) {
this.isVersionOf = isVersionOf;
}
public Set<ArtResourceRating> getRatings() {
return ratings;
}
public void setRatings(Set<ArtResourceRating> ratings) {
this.ratings = ratings;
}
@Override
public String toString() {
return "ArtResource#" + id;
}
}