org.apache.openmeetings.db.entity.user.User.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.openmeetings.db.entity.user.User.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache 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://www.apache.org/licenses/LICENSE-2.0
 *
 * 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.apache.openmeetings.db.entity.user;

import static org.apache.openmeetings.util.OpenmeetingsVariables.getSipContext;
import static org.apache.openmeetings.util.OpenmeetingsVariables.isSipEnabled;
import static org.apache.wicket.util.string.Strings.escapeMarkup;

import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.xml.bind.annotation.XmlType;

import org.apache.openjpa.persistence.ElementDependent;
import org.apache.openjpa.persistence.FetchAttribute;
import org.apache.openjpa.persistence.FetchGroup;
import org.apache.openjpa.persistence.FetchGroups;
import org.apache.openjpa.persistence.LoadFetchGroup;
import org.apache.openjpa.persistence.jdbc.ForeignKey;
import org.apache.openmeetings.db.dao.label.LabelDao;
import org.apache.openmeetings.db.entity.HistoricalEntity;
import org.apache.openmeetings.db.entity.label.OmLanguage;
import org.apache.openmeetings.db.entity.server.Sessiondata;
import org.apache.openmeetings.util.crypt.CryptProvider;
import org.apache.openmeetings.util.crypt.MD5;
import org.apache.wicket.util.string.Strings;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;

/**
 * Entity to store user data, password field is {@link FetchType#LAZY}, so that
 * is why there is an extra udpate statement at this moment
 *
 * @author sebawagner, solomax
 *
 */
@Entity
@FetchGroups({ @FetchGroup(name = "backupexport", attributes = { @FetchAttribute(name = "password") }),
        @FetchGroup(name = "groupUsers", attributes = { @FetchAttribute(name = "groupUsers") }) })
@NamedQuery(name = "getUserById", query = "SELECT u FROM User u WHERE u.id = :id")
@NamedQuery(name = "getUsersByIds", query = "select c from User c where c.id IN :ids")
@NamedQuery(name = "getUserByLogin", query = "SELECT u FROM User u WHERE u.deleted = false AND u.type = :type AND u.login = :login AND ((:domainId = 0 AND u.domainId IS NULL) OR (:domainId > 0 AND u.domainId = :domainId))")
@NamedQuery(name = "getUserByEmail", query = "SELECT u FROM User u WHERE u.deleted = false AND u.type = :type AND u.address.email = :email AND ((:domainId = 0 AND u.domainId IS NULL) OR (:domainId > 0 AND u.domainId = :domainId))")
@NamedQuery(name = "getUserByHash", query = "SELECT u FROM User u WHERE u.deleted = false AND u.type = :type AND u.resethash = :resethash")
@NamedQuery(name = "getUserByExpiredHash", query = "SELECT u FROM User u WHERE u.resetDate < :date")
@NamedQuery(name = "getContactByEmailAndUser", query = "SELECT u FROM User u WHERE u.deleted = false AND u.address.email = :email AND u.type = :type AND u.ownerId = :ownerId")
@NamedQuery(name = "selectMaxFromUsersWithSearch", query = "select count(c.id) from User c "
        + "where c.deleted = false " + "AND (" + "lower(c.login) LIKE :search "
        + "OR lower(c.firstname) LIKE :search " + "OR lower(c.lastname) LIKE :search )")
@NamedQuery(name = "getAllUsers", query = "SELECT u FROM User u ORDER BY u.id")
@NamedQuery(name = "getPassword", query = "SELECT u.password FROM User u WHERE u.deleted = false AND u.id = :userId ")
@NamedQuery(name = "updatePassword", query = "UPDATE User u SET u.password = :password WHERE u.id = :userId")
@NamedQuery(name = "getNondeletedUsers", query = "SELECT u FROM User u WHERE u.deleted = false")
@NamedQuery(name = "countNondeletedUsers", query = "SELECT COUNT(u) FROM User u WHERE u.deleted = false")
@NamedQuery(name = "getUsersByGroupId", query = "SELECT u FROM User u WHERE u.deleted = false AND u.groupUsers.group.id = :groupId")
@NamedQuery(name = "getExternalUser", query = "SELECT u FROM User u WHERE u.deleted = false AND u.externalId LIKE :externalId AND u.externalType LIKE :externalType")
@NamedQuery(name = "getUserByLoginOrEmail", query = "SELECT u from User u WHERE u.deleted = false AND u.type = :type AND (u.login = :userOrEmail OR u.address.email = :userOrEmail)")
@Table(name = "om_user")
@Root(name = "user")
public class User extends HistoricalEntity {
    private static final long serialVersionUID = 1L;
    public static final int SALUTATION_MR_ID = 1;
    public static final int SALUTATION_MS_ID = 2;
    public static final int SALUTATION_MRS_ID = 3;
    public static final int SALUTATION_DR_ID = 4;
    public static final int SALUTATION_PROF_ID = 5;

    @XmlType(namespace = "org.apache.openmeetings.user.right")
    public enum Right {
        Admin // access to Admin module
        , GroupAdmin // partial access to Admin module (should not be directly assigned)
        , Room // enter the room
        , Dashboard // access the dashboard
        , Login // login to Om internal DB
        , Soap // use rest/soap calls
    }

    @XmlType(namespace = "org.apache.openmeetings.user.type")
    public enum Type {
        user, ldap, oauth, external, contact
    }

    @XmlType(namespace = "org.apache.openmeetings.user.salutation")
    public enum Salutation {
        mr(SALUTATION_MR_ID), ms(SALUTATION_MS_ID), mrs(SALUTATION_MRS_ID), dr(SALUTATION_DR_ID), prof(
                SALUTATION_PROF_ID);
        private int id;

        Salutation(int id) {
            this.id = id;
        }

        public int getId() {
            return id;
        }

        public static Salutation get(Long type) {
            return get(type == null ? 1 : type.intValue());
        }

        public static Salutation get(Integer type) {
            return get(type == null ? 1 : type.intValue());
        }

        public static Salutation get(int type) {
            Salutation rt = Salutation.mr;
            switch (type) {
            case SALUTATION_MS_ID:
                rt = Salutation.ms;
                break;
            case SALUTATION_MRS_ID:
                rt = Salutation.mrs;
                break;
            case SALUTATION_DR_ID:
                rt = Salutation.dr;
                break;
            case SALUTATION_PROF_ID:
                rt = Salutation.prof;
                break;
            default:
                //no-op
            }
            return rt;
        }
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    @Element(data = true, name = "user_id")
    private Long id;

    @Column(name = "age")
    @Element(data = true, required = false)
    private Date age;

    @Column(name = "firstname")
    @Element(data = true, required = false)
    private String firstname;

    @Column(name = "lastlogin")
    private Date lastlogin;

    @Column(name = "lastname")
    @Element(data = true, required = false)
    private String lastname;

    @Column(name = "displayName")
    @Element(data = true, required = false)
    private String displayName;

    @Column(name = "login")
    @Element(data = true, required = false)
    private String login;

    @Basic(fetch = FetchType.LAZY)
    @Column(name = "password", length = 1024)
    @LoadFetchGroup("backupexport")
    @Element(name = "pass", data = true, required = false)
    private String password;

    @Column(name = "regdate")
    @Element(data = true, required = false)
    private Date regdate;

    @Column(name = "salutation")
    @Enumerated(EnumType.STRING)
    @Element(name = "title_id", data = true, required = false)
    private Salutation salutation;

    @Column(name = "pictureuri")
    @Element(data = true, required = false)
    private String pictureUri;

    @Column(name = "language_id")
    @Element(name = "language_id", data = true, required = false)
    private long languageId;

    @Column(name = "resethash")
    @Element(data = true, required = false)
    private String resethash;

    @Column(name = "resetdate")
    @Element(data = true, required = false)
    private Date resetDate;

    @Column(name = "activatehash")
    @Element(data = true, required = false)
    private String activatehash;

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "address_id", insertable = true, updatable = true)
    @ForeignKey(enabled = true)
    @Element(name = "address", required = false)
    private Address address;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "user_id", insertable = true, updatable = true, nullable = false)
    @ElementList(name = "organisations", required = false)
    @ElementDependent
    private List<GroupUser> groupUsers = new ArrayList<>();

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @PrimaryKeyJoinColumn(name = "sip_user_id", referencedColumnName = "id")
    @Element(name = "sipUser", required = false)
    private AsteriskSipUser sipUser;

    // Vars to simulate external Users
    @Column(name = "external_id")
    @Element(name = "externalUserId", data = true, required = false)
    private String externalId;

    @Column(name = "external_type")
    @Element(name = "externalUserType", data = true, required = false)
    private String externalType;

    /**
     * java.util.TimeZone Id
     */
    @Column(name = "time_zone_id")
    @Element(data = true, required = false)
    private String timeZoneId;

    @Transient
    private Sessiondata sessionData;

    @Column(name = "forceTimeZoneCheck", nullable = false)
    @Element(data = true, required = false)
    private boolean forceTimeZoneCheck;

    @Column(name = "user_offers")
    @Element(data = true, required = false)
    private String userOffers;

    @Column(name = "user_searchs")
    @Element(data = true, required = false)
    private String userSearchs;

    @Column(name = "show_contact_data", nullable = false)
    @Element(data = true, required = false)
    private boolean showContactData;

    @Column(name = "show_contact_data_to_contacts", nullable = false)
    @Element(data = true, required = false)
    private boolean showContactDataToContacts;

    @Column(name = "type")
    @Element(data = true, required = false)
    @Enumerated(EnumType.STRING)
    private Type type = Type.user;

    @Column(name = "owner_id")
    @Element(data = true, required = false)
    private Long ownerId;

    @ElementCollection(fetch = FetchType.EAGER)
    @Column(name = "om_right")
    @CollectionTable(name = "om_user_right", joinColumns = @JoinColumn(name = "user_id"))
    @Enumerated(EnumType.STRING)
    @ElementList(name = "rights", data = true, required = false)
    private Set<Right> rights = new HashSet<>();

    @Column(name = "domain_id")
    @Element(data = true, required = false)
    private Long domainId; // LDAP config id for LDAP, OAuth server id for OAuth

    @Override
    public Long getId() {
        return id;
    }

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

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public Date getAge() {
        return age;
    }

    public void setAge(Date age) {
        this.age = age == null ? new Date() : age;
    }

    public String getFirstname() {
        return firstname;
    }

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

    public Date getLastlogin() {
        return lastlogin;
    }

    public void setLastlogin(Date lastlogin) {
        this.lastlogin = lastlogin;
    }

    public String getLastname() {
        return lastname;
    }

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

    public String getDisplayName() {
        return Strings.isEmpty(displayName) ? generateDisplayName() : displayName;
    }

    public User setDisplayName(String displayName) {
        if (!Strings.isEmpty(displayName)) {
            this.displayName = escapeMarkup(displayName).toString();
        }
        return this;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public void updatePassword(String pass) throws NoSuchAlgorithmException {
        if (isSipEnabled()) {
            AsteriskSipUser u = getSipUser();
            if (u == null) {
                setSipUser(u = new AsteriskSipUser());
            }
            String defaultRoomContext = getSipContext();
            u.setName(login);
            u.setDefaultuser(login);
            u.setMd5secret(MD5.checksum(login + ":asterisk:" + pass));
            u.setContext(defaultRoomContext);
            u.setHost("dynamic");
        } else {
            setSipUser(null);
        }
        password = CryptProvider.get().hash(pass);
    }

    public String getPassword() {
        return password;
    }

    /**
     * @deprecated should not be used directly (for bean usage only)
     *
     * @param password - password to set
     */
    @Deprecated
    public void setPassword(String password) {
        this.password = password;
    }

    public Date getRegdate() {
        return regdate;
    }

    public void setRegdate(Date regdate) {
        this.regdate = regdate;
    }

    public Salutation getSalutation() {
        return salutation;
    }

    public void setSalutation(Salutation salutation) {
        this.salutation = salutation;
    }

    public String getPictureUri() {
        return pictureUri;
    }

    public void setPictureUri(String pictureUri) {
        this.pictureUri = pictureUri;
    }

    public long getLanguageId() {
        return languageId;
    }

    public void setLanguageId(long languageId) {
        this.languageId = languageId;
    }

    public List<GroupUser> getGroupUsers() {
        return groupUsers;
    }

    public void setGroupUsers(List<GroupUser> groupUsers) {
        if (groupUsers != null) {
            this.groupUsers = groupUsers;
        }
    }

    public String getResethash() {
        return resethash;
    }

    public void setResethash(String resethash) {
        this.resethash = resethash;
    }

    public Date getResetDate() {
        return resetDate;
    }

    public void setResetDate(Date resetDate) {
        this.resetDate = resetDate;
    }

    public String getActivatehash() {
        return activatehash;
    }

    public void setActivatehash(String activatehash) {
        this.activatehash = activatehash;
    }

    public String getExternalId() {
        return externalId;
    }

    public void setExternalId(String externalId) {
        this.externalId = externalId;
    }

    public String getExternalType() {
        return externalType;
    }

    public void setExternalType(String externalType) {
        this.externalType = externalType;
    }

    public Sessiondata getSessionData() {
        return sessionData;
    }

    public void setSessionData(Sessiondata sessionData) {
        this.sessionData = sessionData;
    }

    public AsteriskSipUser getSipUser() {
        return sipUser;
    }

    public void setSipUser(AsteriskSipUser sipUser) {
        this.sipUser = sipUser;
    }

    public String getTimeZoneId() {
        return timeZoneId;
    }

    public void setTimeZoneId(String timeZoneId) {
        this.timeZoneId = timeZoneId;
    }

    public boolean getForceTimeZoneCheck() {
        return forceTimeZoneCheck;
    }

    public void setForceTimeZoneCheck(boolean forceTimeZoneCheck) {
        this.forceTimeZoneCheck = forceTimeZoneCheck;
    }

    public String getUserOffers() {
        return userOffers;
    }

    public void setUserOffers(String userOffers) {
        this.userOffers = userOffers;
    }

    public String getUserSearchs() {
        return userSearchs;
    }

    public void setUserSearchs(String userSearchs) {
        this.userSearchs = userSearchs;
    }

    public boolean isShowContactData() {
        return showContactData;
    }

    public void setShowContactData(boolean showContactData) {
        this.showContactData = showContactData;
    }

    public boolean isShowContactDataToContacts() {
        return showContactDataToContacts;
    }

    public void setShowContactDataToContacts(boolean showContactDataToContacts) {
        this.showContactDataToContacts = showContactDataToContacts;
    }

    public Type getType() {
        return type;
    }

    public void setType(Type type) {
        this.type = type;
    }

    public Long getOwnerId() {
        return ownerId;
    }

    public void setOwnerId(Long ownerId) {
        this.ownerId = ownerId;
    }

    public Set<Right> getRights() {
        return rights;
    }

    public void setRights(Set<Right> rights) {
        this.rights = rights;
    }

    public Long getDomainId() {
        return domainId;
    }

    public void setDomainId(Long domainId) {
        this.domainId = domainId;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", firstname=" + firstname + ", lastname=" + lastname + ", login=" + login
                + ", pictureuri=" + pictureUri + ", deleted=" + isDeleted() + ", languageId=" + languageId
                + ", address=" + address + ", externalId=" + externalId + ", externalType=" + externalType
                + ", type=" + type + "]";
    }

    private String generateDisplayName() {
        StringBuilder sb = new StringBuilder();
        String delim = "";
        OmLanguage l = LabelDao.getLanguage(languageId);
        String first = l.isRtl() ? getLastname() : getFirstname();
        String last = l.isRtl() ? getFirstname() : getLastname();
        if (!Strings.isEmpty(first)) {
            sb.append(first);
            delim = " ";
        }
        if (!Strings.isEmpty(last)) {
            sb.append(delim).append(last);
        }
        if (Strings.isEmpty(sb) && address != null && !Strings.isEmpty(address.getEmail())) {
            sb.append(delim).append(address.getEmail());
        }
        if (Strings.isEmpty(sb)) {
            sb.append("N/A");
        }
        return escapeMarkup(sb).toString();
    }
}