/* MyMAM - Open Source Digital Media Asset Management.
* http://www.mymam.net
*
* Copyright 2013, MyMAM contributors as indicated by the @author tag.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.mymam.entity;
import net.mymam.data.json.MediaFileImportStatus;
import javax.persistence.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.*;
/**
* @author fstab
*/
@NamedQueries({
@NamedQuery(
name = "findAll",
query = "SELECT f from MediaFile f"
),
@NamedQuery(
name = "findMediaFileByStatus",
query = "SELECT f FROM MediaFile f WHERE f.status = :status"
),
@NamedQuery(
name = "findMediaFileByStatusAndAccess",
query = "SELECT f FROM MediaFile f WHERE f.status = :status AND f.access = :access"
),
@NamedQuery(
name = "countMediaFileByStatusListAndUser",
query = "SELECT COUNT(f) FROM MediaFile f WHERE f.uploadingUser = :user AND f.status IN (:statusList)"
),
@NamedQuery(
name = "findMediaFileByStatusListAndUser",
query = "SELECT f FROM MediaFile f WHERE f.uploadingUser = :user AND f.status IN (:statusList)"
),
@NamedQuery(
name = "findMediaFileWithPendingTasks",
query = "SELECT f FROM MediaFile f JOIN f.pendingTasksQueue t WHERE INDEX(t) = 0 AND t.status = net.mymam.data.json.FileProcessorTaskStatus.PENDING AND TYPE(t) IN :classes ORDER BY t.creationDate"
),
@NamedQuery(
name = "findMediaFileByStatusAndUser",
query = "SELECT f FROM MediaFile f WHERE f.status = :status AND f.uploadingUser = :user"
)
})
@Entity
public class MediaFile {
@Id
@GeneratedValue
private Long id;
@Version
private Long version; // use pessimistic locking to prevent multiple file processors from modifying the file at the same time.
// @Past
@Temporal(TemporalType.TIMESTAMP)
@NotNull
private Date creationDate;
@ManyToOne
private User uploadingUser;
@ManyToOne
private Project project;
@NotNull
@Enumerated(value = EnumType.STRING)
private MediaFileImportStatus status;
@NotNull
@Column(unique = true)
private String rootDir;
@NotNull
private String origFile;
@NotNull
@Enumerated(value = EnumType.STRING)
private Access access = Access.PRIVATE;
@Valid
private MediaFileProxyVideoData proxyVideoData;
@Valid
private MediaFileThumbnailData thumbnailData;
@Valid
private MediaFileUserProvidedMetaData userProvidedMetadata;
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "file")
@OrderColumn
private List<FileProcessorTask> pendingTasksQueue;
public Long getId() {
return id;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date created) {
this.creationDate = created;
}
public MediaFileImportStatus getStatus() {
return status;
}
public void setStatus(MediaFileImportStatus status) {
this.status = status;
}
public User getUploadingUser() {
return uploadingUser;
}
public void setUploadingUser(User uploadingUser) {
this.uploadingUser = uploadingUser;
}
public String getRootDir() {
return rootDir;
}
public void setRootDir(String rootDir) {
this.rootDir = rootDir;
}
public String getOrigFile() {
return origFile;
}
public void setOrigFile(String origFile) {
this.origFile = origFile;
}
public MediaFileProxyVideoData getProxyVideoData() {
return proxyVideoData;
}
public void setProxyVideoData(MediaFileProxyVideoData proxyVideoData) {
this.proxyVideoData = proxyVideoData;
}
public MediaFileThumbnailData getThumbnailData() {
return thumbnailData;
}
public void setThumbnailData(MediaFileThumbnailData thumbnailData) {
this.thumbnailData = thumbnailData;
}
public MediaFileUserProvidedMetaData getUserProvidedMetadata() {
return userProvidedMetadata;
}
public void setUserProvidedMetadata(MediaFileUserProvidedMetaData userProvidedMetadata) {
this.userProvidedMetadata = userProvidedMetadata;
}
public Access getAccess() {
return access;
}
public void setAccess(Access access) {
this.access = access;
}
public List<FileProcessorTask> getPendingTasksQueue() {
if ( pendingTasksQueue == null ) {
pendingTasksQueue = new LinkedList<>();
}
return pendingTasksQueue;
}
public void setPendingTasksQueue(List<FileProcessorTask> pendingTasks) {
this.pendingTasksQueue = pendingTasks;
}
}