/** * 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.security.impl.jpa; import org.opencastproject.security.api.Group; import org.opencastproject.security.api.Role; import org.opencastproject.util.EqualsUtil; import java.util.HashSet; import java.util.Set; import javax.persistence.Access; import javax.persistence.AccessType; import javax.persistence.CascadeType; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.UniqueConstraint; /** * JPA-annotated group object. */ @Entity @Access(AccessType.FIELD) @Table(name = "mh_group", uniqueConstraints = { @UniqueConstraint(columnNames = { "group_id", "organization" }) }) @NamedQueries({ @NamedQuery(name = "Group.findAll", query = "Select g FROM JpaGroup g WHERE g.organization.id = :organization"), @NamedQuery(name = "Group.findByUser", query = "Select g FROM JpaGroup g WHERE g.organization.id = :organization AND :username MEMBER OF g.members"), @NamedQuery(name = "Group.findById", query = "Select g FROM JpaGroup g WHERE g.groupId = :groupId AND g.organization.id = :organization"), @NamedQuery(name = "Group.findByRole", query = "Select g FROM JpaGroup g WHERE g.role = :role AND g.organization.id = :organization") }) public final class JpaGroup implements Group { @Id @GeneratedValue @Column(name = "id") private Long id; @Column(name = "group_id", length = 128) private String groupId; @Column(name = "name", length = 128) private String name; @OneToOne() @JoinColumn(name = "organization") private JpaOrganization organization; @Column(name = "description") private String description; @Column(name = "role") private String role; @ElementCollection @CollectionTable(name = "mh_group_member", joinColumns = { @JoinColumn(name = "group_id") }) @Column(name = "member") private Set<String> members; @ManyToMany(cascade = { CascadeType.MERGE }, fetch = FetchType.EAGER) @JoinTable(name = "mh_group_role", joinColumns = { @JoinColumn(name = "group_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") }, uniqueConstraints = { @UniqueConstraint(columnNames = { "group_id", "role_id" }) }) private Set<JpaRole> roles; /** * No-arg constructor needed by JPA */ public JpaGroup() { } /** * Constructs a group with the specified groupId, name, description and group role. * * @param groupId * the group id * @param organization * the organization * @param name * the name * @param description * the description * @throws IllegalArgumentException * if group id or name is longer than 128 Bytes */ public JpaGroup(String groupId, JpaOrganization organization, String name, String description) throws IllegalArgumentException { super(); if (groupId.length() > 128) throw new IllegalArgumentException("Group id must not be longer than 128 Bytes"); if (name.length() > 128) throw new IllegalArgumentException("Name must not be longer than 128 Bytes"); this.groupId = groupId; this.organization = organization; this.name = name; this.description = description; this.role = ROLE_PREFIX + groupId.toUpperCase(); this.roles = new HashSet<JpaRole>(); } /** * Constructs a group with the specified groupId, name, description, group role and roles. * * @param groupId * the group id * @param organization * the organization * @param name * the name * @param description * the description * @param roles * the additional group roles * @throws IllegalArgumentException * if group id or name is longer than 128 Bytes */ public JpaGroup(String groupId, JpaOrganization organization, String name, String description, Set<JpaRole> roles) throws IllegalArgumentException { this(groupId, organization, name, description); this.roles = roles; } /** * Constructs a group with the specified groupId, name, description, group role and roles. * * @param groupId * the group id * @param organization * the organization * @param name * the name * @param description * the description * @param roles * the additional group roles * @param members * the group members * @throws IllegalArgumentException * if group id or name is longer than 128 Bytes */ public JpaGroup(String groupId, JpaOrganization organization, String name, String description, Set<JpaRole> roles, Set<String> members) throws IllegalArgumentException { this(groupId, organization, name, description, roles); this.members = members; } /** * @see org.opencastproject.security.api.Group#getGroupId() */ @Override public String getGroupId() { return groupId; } /** * @see org.opencastproject.security.api.Group#getName() */ @Override public String getName() { return name; } /** * Sets the group name * * @param name * the name */ public void setName(String name) { this.name = name; } /** * @see org.opencastproject.security.api.Group#getOrganization() */ @Override public JpaOrganization getOrganization() { return organization; } /** * @see org.opencastproject.security.api.Group#getDescription() */ @Override public String getDescription() { return description; } /** * Sets the description * * @param description * the description */ public void setDescription(String description) { this.description = description; } @Override public String getRole() { return role; } @Override public Set<String> getMembers() { return members; } /** * Sets the members * * @param members * the members */ public void setMembers(Set<String> members) { this.members = members; } @Override public Set<Role> getRoles() { return new HashSet<Role>(roles); } /** * Sets the roles * * @param roles * the roles */ public void setRoles(Set<JpaRole> roles) { this.roles = roles; } @Override public int hashCode() { return EqualsUtil.hash(id, organization); } @Override public boolean equals(Object obj) { if (!(obj instanceof Group)) return false; Group other = (Group) obj; return groupId.equals(other.getGroupId()) && organization.equals(other.getOrganization()); } @Override public String toString() { return new StringBuilder(groupId).append(":").append(organization).toString(); } }