/** * 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.JaxbOrganization; import org.opencastproject.security.api.JaxbRole; import org.opencastproject.security.api.JaxbUser; import org.opencastproject.security.api.Organization; import org.opencastproject.security.api.Role; import org.opencastproject.security.api.User; import org.opencastproject.util.EqualsUtil; import java.util.Date; import java.util.HashSet; import java.util.Set; import javax.persistence.Access; import javax.persistence.AccessType; import javax.persistence.CascadeType; import javax.persistence.Column; 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.Temporal; import javax.persistence.TemporalType; import javax.persistence.UniqueConstraint; /** * JPA-annotated user reference object. */ @Entity @Access(AccessType.FIELD) @Table(name = "mh_user_ref", uniqueConstraints = { @UniqueConstraint(columnNames = { "username", "organization" }) }) @NamedQueries({ @NamedQuery(name = "UserReference.findByQuery", query = "select u from JpaUserReference u where UPPER(u.username) like :query and u.organization.id = :org"), @NamedQuery(name = "UserReference.findByUsername", query = "select u from JpaUserReference u where u.username=:u and u.organization.id = :org"), @NamedQuery(name = "UserReference.findAll", query = "select u from JpaUserReference u where u.organization.id = :org"), @NamedQuery(name = "UserReference.countAll", query = "select COUNT(u) from JpaUserReference u where u.organization.id = :org") }) public class JpaUserReference { @Id @GeneratedValue @Column(name = "id") private Long id; @Column(name = "username", length = 128) protected String username; @Column(name = "name") protected String name; @Column(name = "email") protected String email; @Column(name = "login_mechanism") protected String loginMechanism; @Column(name = "last_login") @Temporal(TemporalType.TIMESTAMP) protected Date lastLogin; @OneToOne() @JoinColumn(name = "organization") protected JpaOrganization organization; @ManyToMany(cascade = { CascadeType.MERGE }, fetch = FetchType.EAGER) @JoinTable(name = "mh_user_ref_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") }, uniqueConstraints = { @UniqueConstraint(columnNames = { "user_id", "role_id" }) }) protected Set<JpaRole> roles; public User toUser(final String providerName) { Set<JaxbRole> roleSet = new HashSet<JaxbRole>(); for (JpaRole role : roles) { roleSet.add(JaxbRole.fromRole(role)); } return new JaxbUser(username, null, name, email, providerName, JaxbOrganization.fromOrganization(organization), roleSet); } /** * No-arg constructor needed by JPA */ public JpaUserReference() { } /** * Constructs a user with the specified username, name, email, login mechanism, last login date and organization. * * @param username * the username * @param name * the name * @param email * the email address * @param loginMechanism * the login mechanism * @param lastLogin * the last login date * @param organization * the organization */ public JpaUserReference(String username, String name, String email, String loginMechanism, Date lastLogin, JpaOrganization organization) { super(); this.username = username; this.name = name; this.email = email; this.loginMechanism = loginMechanism; this.lastLogin = lastLogin; this.organization = organization; this.roles = new HashSet<JpaRole>(); } /** * Constructs a user with the specified username, name, email, login mechanism, last login date, organization and * roles. * * @param username * the username * @param name * the name * @param email * the email address * @param loginMechanism * the login mechanism * @param lastLogin * the last login date * @param organization * the organization * @param roles * the roles */ public JpaUserReference(String username, String name, String email, String loginMechanism, Date lastLogin, JpaOrganization organization, Set<JpaRole> roles) { this(username, name, email, loginMechanism, lastLogin, organization); for (Role role : roles) { if (role.getOrganization() == null || !organization.getId().equals(role.getOrganization().getId())) throw new IllegalArgumentException("Role " + role + " is not from the same organization!"); } this.roles = roles; } public void setUsername(String username) { this.username = username; } public String getUsername() { return username; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setEmail(String email) { this.email = email; } public String getEmail() { return email; } public void setLoginMechanism(String loginMechanism) { this.loginMechanism = loginMechanism; } public String getLoginMechanism() { return loginMechanism; } public void setLastLogin(Date lastLogin) { this.lastLogin = lastLogin; } public Date getLastLogin() { return lastLogin; } public Organization getOrganization() { return organization; } public void setRoles(Set<JpaRole> roles) { this.roles = roles; } public Set<Role> getRoles() { return new HashSet<Role>(roles); } /** * {@inheritDoc} * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (!(obj instanceof JpaUserReference)) return false; JpaUserReference other = (JpaUserReference) obj; return username.equals(other.getUsername()) && organization.equals(other.getOrganization()); } /** * {@inheritDoc} * * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return EqualsUtil.hash(username, organization); } /** * {@inheritDoc} * * @see java.lang.Object#toString() */ @Override public String toString() { return new StringBuilder(username).append(":").append(organization).toString(); } }