OaiPmhEntity.java
/*
* Licensed to The Apereo Foundation under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
*
* The Apereo Foundation licenses this file to you under the Educational
* Community 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://opensource.org/licenses/ecl2.txt
*
* 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 org.opencastproject.oaipmh.persistence;
import org.opencastproject.mediapackage.Attachment;
import org.opencastproject.mediapackage.Catalog;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
@Entity(name = "OaiPmhEntity")
@IdClass(OaiPmhEntityId.class)
@Table(name = "oc_oaipmh", uniqueConstraints = @UniqueConstraint(columnNames = { "modification_date" }))
@NamedQueries({ @NamedQuery(name = "OaiPmh.findById",
query = "SELECT o FROM OaiPmhEntity o "
+ "WHERE o.mediaPackageId=:mediaPackageId"
+ " AND o.repositoryId=:repository"
+ " AND o.organization=:organization") })
public class OaiPmhEntity {
/** media package id, primary key */
@Id
@Column(name = "mp_id", length = 64)
private String mediaPackageId;
/** Organization id */
@Id
@Column(name = "organization", length = 96)
protected String organization;
/** Repository id */
@Id
@Column(name = "repo_id", length = 12)
private String repositoryId;
/** Series id */
@Column(name = "series_id",length = 128)
private String series;
/** Flag indicating deletion. */
@Column(name = "deleted")
private boolean deleted = false;
/** The last modification date */
@Column(
name = "modification_date")
@Temporal(TemporalType.TIMESTAMP)
private Date modificationDate;
/** Serialized media package */
@Lob
@Column(name = "mediapackage_xml", length = 65535, nullable = false)
private String mediaPackageXML;
/** List of serialized media package element entities */
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumns({
@JoinColumn(name = "mp_id", referencedColumnName = "mp_id", nullable = false, table = "oc_oaipmh_elements", insertable = false, updatable = false),
@JoinColumn(name = "organization", referencedColumnName = "organization", nullable = false, table = "oc_oaipmh_elements", insertable = false, updatable = false),
@JoinColumn(name = "repo_id", referencedColumnName = "repo_id", nullable = false, table = "oc_oaipmh_elements", insertable = false, updatable = false)
})
private List<OaiPmhElementEntity> mediaPackageElements = new ArrayList<>();
/**
* Default constructor without any import.
*/
public OaiPmhEntity() {
this.modificationDate = new Date();
}
/**
* Returns media package id.
*
* @return media package id
*/
public String getMediaPackageId() {
return mediaPackageId;
}
/**
* Sets media package id. Id length limit is 128 charachters.
*
* @param mediaPackageId
*/
public void setMediaPackageId(String mediaPackageId) {
this.mediaPackageId = mediaPackageId;
this.modificationDate = new Date();
}
/**
* @return the organization
*/
public String getOrganization() {
return organization;
}
/**
* @param organization
* the organization to set
*/
public void setOrganization(String organization) {
this.organization = organization;
this.modificationDate = new Date();
}
/**
* @return the deletion flag
*/
public boolean isDeleted() {
return deleted;
}
/**
* Sets the deletion flag
*
* @param deleted
* the deletion flag
*/
public void setDeleted(boolean deleted) {
this.deleted = deleted;
this.modificationDate = new Date();
}
/**
* @return the series identifier
*/
public String getSeries() {
return series;
}
/**
* Sets the series identifier
*
* @param series
* the series identifier
*/
public void setSeries(String series) {
this.series = series;
this.modificationDate = new Date();
}
/**
* @return the modification date
*/
public Date getModificationDate() {
return modificationDate;
}
/**
* Returns serialized media package.
*
* @return serialized media package
*/
public String getMediaPackageXML() {
return mediaPackageXML;
}
/**
* Sets serialized media package
*
* @param mediaPackageXML
*/
public void setMediaPackageXML(String mediaPackageXML) {
this.mediaPackageXML = mediaPackageXML;
this.modificationDate = new Date();
}
/**
* @return the repository id
*/
public String getRepositoryId() {
return repositoryId;
}
/**
* Sets the repository id
*
* @param repositoryId
*/
public void setRepositoryId(String repositoryId) {
this.repositoryId = repositoryId;
this.modificationDate = new Date();
}
/**
* @return serialized media package attachment entities
*/
public List<OaiPmhElementEntity> getAttachments() {
return getMediaPackageElementsOfType(Attachment.TYPE.name());
}
/**
* @return serialized media package catalog entities
*/
public List<OaiPmhElementEntity> getCatalogs() {
return getMediaPackageElementsOfType(Catalog.TYPE.name());
}
/**
* A list of serialized media package element entities, filtered by given type
*
* @param elementType type of media package element to filter on
* @return serialized media package elements of given type
*/
private List<OaiPmhElementEntity> getMediaPackageElementsOfType(String elementType) {
// as we do not expect to many media package elements per media package, we can filter them in java
List<OaiPmhElementEntity> filteredElements = new ArrayList<>();
for (OaiPmhElementEntity element : mediaPackageElements) {
if (StringUtils.equals(elementType, element.getElementType()))
filteredElements.add(element);
}
return filteredElements;
}
/**
* @return all serialized media package element entities
*/
public List<OaiPmhElementEntity> getMediaPackageElements() {
return mediaPackageElements;
}
/**
* Add an serialized media package element
*
* @param mediaPackageElementEntity serialized media package element to add
*/
public void addMediaPackageElement(OaiPmhElementEntity mediaPackageElementEntity) {
mediaPackageElements.add(mediaPackageElementEntity);
mediaPackageElementEntity.setOaiPmhEntity(this);
this.modificationDate = new Date();
}
/**
* Remove media package element entity from the list of elements
*
* @param mediaPackageElementEntity serialized media package element entity to remove
*/
public void removeMediaPackageElement(OaiPmhElementEntity mediaPackageElementEntity) {
mediaPackageElements.remove(mediaPackageElementEntity);
this.modificationDate = new Date();
}
/**
* Clear the list of media package element entities
*/
public void removeAllMediaPackageElements() {
mediaPackageElements.clear();
}
}