Dans ce troisième article, nous allons nous intéresser aux entités de l’application.

Entités persistées

Dans LoFiDroX, il y a deux types d’entités: celles qui sont des représentations des données en base et celles qui sont des représentations des contenus JSON échangés avec le front-end. Nous allons nous intéresser au premier type, composé de trois entités.

Entité FileDescriptor

Cette entité représente un fichier qui a été uploadé par un utilisateur.

    
 1package ch.gobothegeek.lofidrox.model.entities;
 2
 3import javax.persistence.*;
 4import java.io.Serializable;
 5import java.util.Date;
 6import java.util.List;
 7import java.util.Objects;
 8
 9// Described a user in this application
10@Entity
11@Table(name = "PUBLIC.PUBLIC.FILEDESCRIPTOR")
12@IdClass(FileDescriptorPK.class)
13public class FileDescriptor implements Serializable {
14	@Id @Column(name = "ID") @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; // unique file number
15	@Column(name = "NAME") private String name; // filename to show
16	@Column(name = "FILEPATH") private String path; // path to access file on disk
17	@Column(name = "USERFROM") private String source; // user who sent this file
18	@Column(name = "SENTON") @Temporal(TemporalType.TIMESTAMP) private Date sendOn; // timestamp when file was received on server
19	@Column(name = "DATATYPE") private String dataType; // type of base64 data
20
21	@OneToMany(fetch = FetchType.EAGER, targetEntity = FileRecipient.class, mappedBy = "file")
22	private List<FileRecipient> recipients;
23
24	public FileDescriptor() { }
25
26	public FileDescriptor(Integer id, String name, String path, String source, Date sendOn, String dataType) {
27		this.id = id;
28		this.name = name;
29		this.path = path;
30		this.source = source;
31		this.sendOn = sendOn;
32		this.dataType = dataType;
33	}
34
35	public Integer getId() { return id; }
36	public void setId(Integer id) { this.id = id; }
37
38	public String getName() { return name; }
39	public void setName(String name) { this.name = name; }
40
41	public String getPath() { return path; }
42	public void setPath(String path) { this.path = path; }
43
44	public String getSource() { return source; }
45	public void setSource(String source) { this.source = source; }
46	public Date getSendOn() { return sendOn; }
47	public void setSendOn(Date sendOn) { this.sendOn = sendOn; }
48
49	public String getDataType() { return dataType; }
50	public void setDataType(String dataType) { this.dataType = dataType; }
51
52	public List<FileRecipient> getRecipients() { return recipients; }
53	public void setRecipients(List<FileRecipient> recipients) { this.recipients = recipients; }
54
55	@Override
56	public boolean equals(Object o) {
57		if (this == o) return true;
58		if (o == null || getClass() != o.getClass()) return false;
59		FileDescriptor file = (FileDescriptor) o;
60		return Objects.equals(path, file.path);
61	}
62
63	@Override
64	public int hashCode() {
65		return Objects.hash(path);
66	}
67
68	@Override
69	public String toString() {
70		return "FileDb{" + "id=" + id + ", name='" + name + '\'' + ", path='" + path + '\'' + ", source='" + source + '\'' + '}';
71	}
72}

Cette entité est définie comme ceci:

  • id: un identifiant unique auto-incrémenté.
  • name: le nom du fichier qui sera affiché.
  • path: le chemin vers le fichier (path ne contient pas name).
  • source: l’identifiant de l’utilisateur qui a déposé le fichier.
  • sentOn: la date de dépôt du fichier.
  • dataType: le mime-type du fichier.

Cette entité possède également un mapping nommé recipients qui contient la liste des destinataires du fichier.

Entité FileRecipient

Cette entité représente le destinataire d’un fichier

    
1package ch.gobothegeek.lofidrox.model.entities;import javax.persistence.*;import java.io.Serializable;import java.util.Objects;// Described a link between a file and a receiver@Entity@Table(name = "PUBLIC.PUBLIC.FILERECIPIENT")@IdClass(FileRecipientPK.class)public class FileRecipient implements Serializable {   @Id @Column(name = "ID") @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; // unique recipient number   @Column(name = "FILEID") private Integer fileId; // id of file linked   @Column(name = "USERTO") private String userTo; // username who can access this file   @Column(name = "DOWNLOADED") private Boolean downloaded = Boolean.FALSE; // true if user has downloaded file   @ManyToOne(fetch = FetchType.EAGER)   @JoinColumn(name = "FILEID", referencedColumnName = "ID")   private FileDescriptor file; // file linked   public FileRecipient() { }   public FileRecipient(Integer id, Integer fileId, String userTo, Boolean downloaded) {      this.id = id;      this.fileId = fileId;      this.userTo = userTo;      this.downloaded = downloaded;   }   public Integer getId() { return id; }   public void setId(Integer id) { this.id = id; }   public Integer getFileId() { return fileId; }   public void setFileId(Integer fileId) { this.fileId = fileId; }   public String getUserTo() { return userTo; }   public void setUserTo(String userTo) { this.userTo = userTo; }   public Boolean getDownloaded() { return downloaded; }   public void setDownloaded(Boolean downloaded) { this.downloaded = downloaded; }   public FileDescriptor getFile() { return file; }   public void setFile(FileDescriptor file) { this.file = file; }   @Override   public boolean equals(Object o) {      if (this == o) return true;      if (o == null || getClass() != o.getClass()) return false;      FileRecipient fileRecipient = (FileRecipient) o;      return Objects.equals(getFileId(), fileRecipient.getFileId()) && Objects.equals(getUserTo(), fileRecipient.getUserTo());   }   @Override   public int hashCode() {      return Objects.hash(getFileId(), getUserTo());   }   @Override   public String toString() {      return "FileRecipient{" + "id=" + id + ", fileId=" + fileId + ", userTo='" + userTo + '\'' + ", downloaded=" + downloaded + '}';   }}

Elle est composée de 4 champs et un mapping:

  • id: un identifiant auto-généré.
  • fileId: l’identifiant du fichier (FileDescriptor) concerné.
  • userTo: l’identifiant de l’utilisateur qui reçoit le fichier.
  • downloaded: un booléen indiquant si le destinataire a téléchargé le fichier.
  • file: un mapping vers le FileDescriptor référencé par fileId.

Entité User

Cette entité représente un utilisateur de LoFiDroX.

    
 1package ch.gobothegeek.lofidrox.model.entities;
 2
 3import javax.persistence.*;
 4import java.io.Serializable;
 5import java.util.Objects;
 6
 7// Described a user in this application
 8@Entity
 9@Table(name = "PUBLIC.PUBLIC.USERS")
10@IdClass(UserPK.class)
11public class User implements Serializable {
12	@Id @Column(name="USERNAME") private String username; // username for this account
13	@Column(name="PWD") private String pwd; // encrypted password
14
15	public User() { }
16
17	public User(String username, String pwd) {
18		this.username = username;
19		this.pwd = pwd;
20	}
21
22	public String getUsername() { return username; }
23	public void setUsername(String username) { this.username = username; }
24
25	public String getPwd() { return pwd; }
26	public void setPwd(String pwd) { this.pwd = pwd; }
27
28	@Override
29	public boolean equals(Object o) {
30		if (this == o) return true;
31		if (o == null || getClass() != o.getClass()) return false;
32		User that = (User) o;
33		return Objects.equals(username, that.username);
34	}
35
36	@Override
37	public int hashCode() {
38		return Objects.hash(username);
39	}
40
41	@Override
42	public String toString() {
43		return "UserEntity{" + "username='" + username + '\'' + ", pwd='" + pwd + '\'' + '}';
44	}
45}

Ici il n’y a que deux champs:

  • username: l’identifiant de l’utilisateur
  • pwd: son mot de passe chiffré.

Conclusion

Les entités de LoFiDroX sont simples, se stockent dans HSqlDB sans difficulté et se manipulent aisément avec Apache Deltaspike (comme nous le verrons dans les prochains articles).

Code source

Comme annoncé dans l’article Fuyez GitHub, le code n’est plus disponible sur GitHub. L’intégralité du code est disponible sur mon CodeBerg: https://codeberg.org/GoboTheGeek/LoFiDroX