User.java

/*
 * +====================================================================+
 * |         Copyright (C) 2015 Rochester Institute of Technology,      |
 * |            103 Lomb Memorial Drive, Rochester, NY - 14623          |
 * |                        All Rights Reserved.                        |
 * +====================================================================+
 *   FILENAME
 *    User.java
 *
 *   AUTHOR
 *    @author Khanh Ho (kchisd at rit.edu)
 *
 * =====================================================================
 */

package edu.rit.coopeval.model;

import javax.persistence.*;
import java.util.*;

import com.fasterxml.jackson.annotation.*;
import edu.rit.coopeval.authentication.beans.UserType;
import edu.rit.coopeval.viewmodel.JsonViewer;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import org.springframework.util.StringUtils;

@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "\"USER\"")
@NamedEntityGraph(name = "userDetails", includeAllAttributes = true)
public class User extends AuditableEntity {

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_USER_ID")
    @SequenceGenerator(name = "SEQ_USER_ID", sequenceName = "SEQ_USER_ID", allocationSize = 1)
    @JsonView(JsonViewer.Summary.class)
    private Long id;

    @Column(name = "USERNAME")
    @JsonView(JsonViewer.Summary.class)
    private String username;

    @Column(name = "PASSWORD")
    private String password;

    @Column(name = "EMAIL")
    @JsonView(JsonViewer.Summary.class)
    private String email;

    @Column(name = "\"UID\"")
    @JsonView(JsonViewer.Summary.class)
    private String uid;

    @Column(name = "NAME")
    @JsonView(JsonViewer.Summary.class)
    private String name;

    @Column(name = "FIRSTNAME")
    @JsonView(JsonViewer.UserDetails.class)
    private String firstname;

    @Column(name = "LASTNAME")
    @JsonView(JsonViewer.UserDetails.class)
    private String lastname;

    @Column(name = "COMPANY_NAME")
    @JsonView(JsonViewer.UserDetails.class)
    private String companyName;

    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JsonView(JsonViewer.UserDetails.class)
    private Set<UserRole> roles;

    @ManyToMany(mappedBy = "evaluators")
    @JsonView(JsonViewer.UserDetails.class)
    private Collection<Department> departments;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @JsonIgnore
    public String getPassword() {
        return password;
    }

    @JsonProperty
    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public Set<UserRole> getRoles() {
        return roles;
    }

    public void setRoles(Set<UserRole> roles) {
        this.roles = roles;
    }

    public void addRole(UserRole role) {
        if (roles == null) {
            roles = new HashSet<>();
        }

        roles.add(role);
        role.setUser(this);
    }

    public void addRole(UserType enumType) {
        addRole(new UserRole(enumType.toString()));
    }

    public String getName() {
        if (StringUtils.hasText(name)) {
            return name;
        }
        // else return first + last
        return getFirstname() + " " + getLastname();
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public Collection<Department> getDepartments() {
        return departments;
    }

    public void setDepartments(Collection<Department> departments) {
        this.departments = departments;
    }
}