package com.deugo.jersey.models;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import com.deugo.jersey.common.Messages;
/*
* To use //@GeneratedValue(strategy=GenerationType.IDENTITY)
* then private static final String CREATE_TABLE_SQL = "create table " + CLIENT_TABLE_NAME + "(CLIENT_ID_PRIMARY_KEY int primary key not null AUTO_INCREMENT,"
* and id field type must be long not String
*/
@Entity
@Table(name="CLIENT")
public class Client {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name="uuid", strategy="uuid2")
@Column(name="CLIENT_ID_PRIMARY_KEY")
private String clientIdPrimarKey;
@Column(name="FIRST_NAME")
private String firstName;
@Column(name="LAST_NAME")
private String lastName;
@Column(name="EMAIL_ADDRESS")
private String emailAddress;
@Column(name="PASSWORD")
private String password;
@Column(name="CREATION_TIME")
private Timestamp creationTimestamp;
@Column(name="LAST_UPDATE_TIME")
private Timestamp lastUpdateTimestamp;
@Column(name="LAST_ACCESSED_TIME")
private Timestamp lastAccessedTimestamp;
@Column(name="LANGUAGE")
private String language;
@Column(name="PHONE_NUMBER")
private String phoneNumber;
// https://dzone.com/tutorials/java/hibernate/hibernate-example/hibernate-mapping-one-to-one-using-annotations-1.html
// http://howtodoinjava.com/hibernate/hibernate-one-to-one-mapping-using-annotations/
// http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#associations-one-to-one
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="OPTION_SETTING_FK")
private OptionSetting optionSetting;
// https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/collections.html
// http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#associations-one-to-many
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="CLIENT_ID_FK")
private List
addresses;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="CLIENT_JOIN_ACCOUNT", joinColumns=@JoinColumn(name="CLIENT_FK"), inverseJoinColumns=@JoinColumn(name="ACCOUNT_FK"))
private List accounts;
public static final String ENGLISH = "en";
public static final String FRENCH = "fr";
public boolean isFrench () {
return getLanguage().equals(FRENCH);
}
public String toString() {
return getPhoneNumber();
}
public Client() {
Calendar calendar = Calendar.getInstance();
setAddresses(new ArrayList());
setAccounts(new ArrayList());
setFirstName(Messages.UNKNOWN);
setLastName(Messages.UNKNOWN);
setEmailAddress(Messages.UNKNOWN);
setPassword(Messages.UNKNOWN);
setPhoneNumber(Messages.UNKNOWN);
setCreationTimestamp(new Timestamp(calendar.getTimeInMillis()));
setLastUpdateTimestamp(new Timestamp(calendar.getTimeInMillis()));
setLastAccessedTimestamp(new Timestamp(calendar.getTimeInMillis()));
setLanguage(ENGLISH);
setOptionSetting(new OptionSetting());
}
public Timestamp getCreationTimestamp() {
return creationTimestamp;
}
public void setCreationTimestamp(Timestamp creationTimestamp) {
this.creationTimestamp = creationTimestamp;
}
public Timestamp getLastUpdateTimestamp() {
return lastUpdateTimestamp;
}
public void setLastUpdateTimestamp(Timestamp lastUpdateTimestamp) {
this.lastUpdateTimestamp = lastUpdateTimestamp;
}
public Timestamp getLastAccessedTimestamp() {
return lastAccessedTimestamp;
}
public void setLastAccessedTimestamp(Timestamp lastAccessedTimestamp) {
this.lastAccessedTimestamp = lastAccessedTimestamp;
}
public boolean equals(Client client) {
return getClientIdPrimarKey() == (client.getClientIdPrimarKey());
}
public String getClientIdPrimarKey() {
return clientIdPrimarKey;
}
public void setClientIdPrimarKey(String clientIdPrimarKey) {
this.clientIdPrimarKey = clientIdPrimarKey;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFirstName() {
return firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getLastName() {
return lastName;
}
public String getFullName() {
return getFirstName() + Messages.SPACE + getLastName();
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
public String getEmailAddress() {
return emailAddress;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void updateFromClient(Client client) {
setClientIdPrimarKey(client.getClientIdPrimarKey());
setAddresses(client.getAddresses());
setAccounts(client.getAccounts());
setFirstName(client.getFirstName());
setLastName(client.getLastName());
setEmailAddress(client.getEmailAddress());
setPassword(client.getPassword());
setPhoneNumber(client.getPhoneNumber());
setCreationTimestamp(client.getCreationTimestamp());
setLastUpdateTimestamp(client.getLastUpdateTimestamp());
setLastAccessedTimestamp(client.getLastAccessedTimestamp());
setLanguage(client.getLanguage());
}
public Client copy() {
Client client = new Client();
client.updateFromClient(this);
return client;
}
public void setLanguage(String language) {
this.language = language;
}
public String getLanguage() {
return language;
}
public List getAddresses() {
return addresses;
}
public void setAddresses(List addresses) {
this.addresses = addresses;
}
public void addAddresses(Address address) {
getAddresses().add(address);
}
public OptionSetting getOptionSetting() {
return optionSetting;
}
public void setOptionSetting(OptionSetting optionSetting) {
this.optionSetting = optionSetting;
}
public List getAccounts() {
return accounts;
}
public void setAccounts(List accounts) {
this.accounts = accounts;
}
public void addAccount(Account account) {
getAccounts().add(account);
}
}