/**
* 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.security.api.AccessControlParser.parseAclSilent;
import static org.opencastproject.security.api.AccessControlParser.toJsonSilent;
import static org.opencastproject.util.data.Tuple.tuple;
import static org.opencastproject.util.persistence.PersistenceUtil.findAll;
import static org.opencastproject.util.persistence.PersistenceUtil.runSingleResultQuery;
import static org.opencastproject.util.persistence.PersistenceUtil.runUpdate;
import org.opencastproject.authorization.xacml.manager.api.ManagedAcl;
import org.opencastproject.security.api.AccessControlList;
import org.opencastproject.util.data.Function;
import org.opencastproject.util.data.Function0;
import org.opencastproject.util.data.Lazy;
import org.opencastproject.util.data.Option;
import org.opencastproject.util.persistence.PersistenceUtil;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;
@Entity(name = "ManagedAcl")
@Table(name = "mh_acl_managed_acl",
uniqueConstraints = @UniqueConstraint(columnNames = {"name", "organization_id"}))
@NamedQueries({
@NamedQuery(name = "ManagedAcl.findByIdAndOrg",
query = "SELECT e FROM ManagedAcl e WHERE e.id = :id AND e.organizationId = :organization"),
@NamedQuery(name = "ManagedAcl.findAllByOrg",
query = "SELECT e FROM ManagedAcl e WHERE e.organizationId = :organization"),
@NamedQuery(name = "ManagedAcl.deleteByIdAndOrg",
query = "DELETE FROM ManagedAcl e WHERE e.id = :id AND e.organizationId = :organization") })
/** JPA link of {@link ManagedAcl}. */
public final class ManagedAclEntity implements ManagedAcl {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "pk")
private Long id;
@Column(name = "name", nullable = false)
private String name;
@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "acl", nullable = false)
private String acl;
@Transient
private Lazy<AccessControlList> parsedAcl = new Lazy<AccessControlList>(new Function0<AccessControlList>() {
@Override public AccessControlList apply() {
return parseAclSilent(acl);
}
});
@Column(name = "organization_id", nullable = false)
private String organizationId;
/** JPA constructor */
public ManagedAclEntity() {
}
ManagedAclEntity update(String name, AccessControlList acl, String orgId) {
// Update the ACL first, since it's fetching the entity and overriding the previous set values
this.acl = toJsonSilent(acl);
this.name = name;
this.organizationId = orgId;
return this;
}
@Override public Long getId() {
return id;
}
@Override public String getName() {
return name;
}
@Override public AccessControlList getAcl() {
return parsedAcl.value();
}
@Override public String getOrganizationId() {
return organizationId;
}
/** Find a managed ACL by id. */
public static Function<EntityManager, Option<ManagedAclEntity>> findByIdAndOrg(final String orgId, final Long id) {
return new Function<EntityManager, Option<ManagedAclEntity>>() {
@Override public Option<ManagedAclEntity> apply(EntityManager em) {
return runSingleResultQuery(em, "ManagedAcl.findByIdAndOrg", tuple("id", id), tuple("organization", orgId));
}
};
}
/** Find a managed ACL by id. */
public static Function<EntityManager, Option<ManagedAclEntity>> findById(final Long id) {
return PersistenceUtil.findById(ManagedAclEntity.class, id);
}
/** Find all ACLs of an organization. */
public static Function<EntityManager, List<ManagedAclEntity>> findByOrg(final String orgId) {
return new Function<EntityManager, List<ManagedAclEntity>>() {
@Override public List<ManagedAclEntity> apply(EntityManager em) {
return findAll(em, "ManagedAcl.findAllByOrg", tuple("organization", orgId));
}
};
}
/** Delete an ACL by id. */
public static Function<EntityManager, Boolean> deleteByIdAndOrg(final String orgId, final Long id) {
return new Function<EntityManager, Boolean>() {
@Override public Boolean apply(EntityManager em) {
return runUpdate(em, "ManagedAcl.deleteByIdAndOrg", tuple("id", id), tuple("organization", orgId));
}
};
}
}