/**
* 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.authorization.xacml.manager.impl.persistence;
import static org.opencastproject.authorization.xacml.manager.impl.Util.createConfiguredWorkflowRef;
import static org.opencastproject.authorization.xacml.manager.impl.Util.splitConfiguredWorkflowRef;
import static org.opencastproject.util.ReflectionUtil.run;
import static org.opencastproject.util.data.Option.option;
import org.opencastproject.authorization.xacml.manager.api.EpisodeACLTransition;
import org.opencastproject.authorization.xacml.manager.api.ManagedAcl;
import org.opencastproject.util.data.Option;
import org.opencastproject.util.data.Tuple;
import org.opencastproject.workflow.api.ConfiguredWorkflowRef;
import java.util.Date;
import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
/** JPA link of {@link org.opencastproject.authorization.xacml.manager.api.EpisodeACLTransition}. */
@Entity(name = "EpisodeAclTransition")
@Access(AccessType.FIELD)
@Table(name = "mh_acl_episode_transition",
uniqueConstraints = @UniqueConstraint(columnNames = {"episode_id", "organization_id", "application_date"}))
@NamedQueries({
@NamedQuery(name = "EpisodeAcl.findByTransitionId",
query = "SELECT e FROM EpisodeAclTransition e WHERE e.id = :id AND e.organizationId = :organizationId"),
@NamedQuery(name = "EpisodeAcl.findByEpisodeId",
query = "SELECT e FROM EpisodeAclTransition e WHERE e.episodeId = :id AND e.organizationId = :organizationId ORDER BY e.applicationDate ASC") })
public class EpisodeAclTransitionEntity implements EpisodeACLTransition {
/** Transition id, primary key */
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "pk")
private Long id;
/** Media package ID, */
@Column(name = "episode_id", length = 128)
private String episodeId;
/** Organization ID */
@Column(name = "organization_id", length = 128)
protected String organizationId;
/** Start date */
@Column(name = "application_date")
@Temporal(TemporalType.TIMESTAMP)
private Date applicationDate;
/** Managed acl id */
@OneToOne
@JoinColumn(name = "managed_acl_fk")
private ManagedAclEntity managedAcl;
/** The workflow definition id */
@Column(name = "workflow_id", length = 128)
private String workflowId;
/** The workflow parameters as json */
@Column(name = "workflow_params")
private String workflowParams;
/** Indicates if already applied */
@Column(name = "done")
private boolean done = false;
/** No-arg constructor needed by JPA */
public EpisodeAclTransitionEntity() {
}
EpisodeAclTransitionEntity update(final String episodeId,
final String orgId,
final Date applicationDate,
final Option<ManagedAclEntity> managedAcl,
final Option<ConfiguredWorkflowRef> workflow) {
final EpisodeAclTransitionEntity self = this;
run(EpisodeACLTransition.class, new EpisodeACLTransition() {
@Override public String getEpisodeId() {
self.episodeId = episodeId;
return null;
}
@Override public Option<ManagedAcl> getAccessControlList() {
self.managedAcl = managedAcl.getOrElseNull();
return null;
}
@Override public boolean isDelete() {
return false;
}
@Override public long getTransitionId() {
return 0;
}
@Override public String getOrganizationId() {
self.organizationId = orgId;
return null;
}
@Override public Date getApplicationDate() {
self.applicationDate = applicationDate;
return null;
}
@Override public Option<ConfiguredWorkflowRef> getWorkflow() {
final Tuple<Option<String>, Option<String>> s = splitConfiguredWorkflowRef(workflow);
self.workflowId = s.getA().getOrElseNull();
self.workflowParams = s.getB().getOrElseNull();
return null;
}
@Override public boolean isDone() {
self.done = done;
return false;
}
});
return self;
}
void setDone(boolean done) {
this.done = done;
}
@Override public String getEpisodeId() {
return episodeId;
}
@Override public Option<ManagedAcl> getAccessControlList() {
return option((ManagedAcl) managedAcl);
}
@Override public boolean isDelete() {
return managedAcl == null;
}
@Override public long getTransitionId() {
return id;
}
@Override public String getOrganizationId() {
return organizationId;
}
@Override public Date getApplicationDate() {
return applicationDate;
}
@Override public Option<ConfiguredWorkflowRef> getWorkflow() {
return createConfiguredWorkflowRef(option(workflowId), option(workflowParams));
}
@Override public boolean isDone() {
return done;
}
@Override
public String toString() {
return "{TransitionId=" + id + ", episodeId=" + episodeId + ", orgId=" + organizationId + ", applicationDate="
+ applicationDate + "}";
}
}