Преглед изворни кода

Gestion des lien entre entité avec une annotation

Arthur Brandao пре 5 година
родитељ
комит
0c25acb400

+ 87 - 10
src/db/Table.java

@@ -12,6 +12,7 @@ import java.util.Optional;
 
 import db.annotation.DbField;
 import db.annotation.DbId;
+import db.annotation.DbLink;
 import db.annotation.DbTable;
 
 public abstract class Table<T extends Persistable> {
@@ -141,6 +142,16 @@ public abstract class Table<T extends Persistable> {
 		return clazz.getAnnotation(DbTable.class);
 	}
 	
+	private void checkIfPersistable(Field f) {
+		boolean ok = false;
+		for(Class<?> clazz : f.getType().getInterfaces()) {
+			ok |= clazz.getName().endsWith("Persistable");
+		}
+		if (!ok) {
+			throw new IllegalStateException("Field object don't implement Persistable");
+		}
+	}
+	
 	private Optional<T> getFromDbById(long id) {
 		DbTable dbTable = getDbTableAnnotation();
 		// Cherche l'id
@@ -171,10 +182,22 @@ public abstract class Table<T extends Persistable> {
 					if(!field.isAnnotationPresent(DbField.class)) {
 						continue;
 					}
-					obj.getClass().getField(field.getName()).set(obj, rs.getObject(field.getAnnotation(DbField.class).name()));
+					// Recup valeur dans le resultat
+					Object value = rs.getObject(field.getAnnotation(DbField.class).name());
+					// Si lien avec une autre entité
+					if(field.isAnnotationPresent(DbLink.class)) {
+						checkIfPersistable(field);
+						String[] split = field.getType().getName().split("\\.");
+						String className = split[split.length - 1];
+						// Chargement de la class Table qui gère l'entité
+						Class<?> clazz = Class.forName(field.getAnnotation(DbLink.class).pckg() + "." + className + "Table");
+						Table table = (Table) clazz.getMethod("getInstance").invoke(null);
+						value = table.getById((Long) value);
+					}
+					field.set(obj, value);
 				}
 				return obj;
-			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | NoSuchFieldException | SQLException e) {
+			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | SQLException | ClassNotFoundException e) {
 				throw new IllegalStateException("Unable to map value to the entity");
 			}
 		});
@@ -197,12 +220,24 @@ public abstract class Table<T extends Persistable> {
 						if(!field.isAnnotationPresent(DbField.class)) {
 							continue;
 						}
-						obj.getClass().getField(field.getName()).set(obj, rs.getObject(field.getAnnotation(DbField.class).name()));
+						// Recup valeur dans le resultat
+						Object val = rs.getObject(field.getAnnotation(DbField.class).name());
+						// Si lien avec une autre entité
+						if(field.isAnnotationPresent(DbLink.class)) {
+							checkIfPersistable(field);
+							String[] split = field.getType().getName().split("\\.");
+							String className = split[split.length - 1];
+							// Chargement de la class Table qui gère l'entité
+							Class<?> clazz = Class.forName(field.getAnnotation(DbLink.class).pckg() + "." + className + "Table");
+							Table table = (Table) clazz.getMethod("getInstance").invoke(null);
+							val = table.getById((Long) val);
+						}
+						field.set(obj, val);
 					}
 					list.add(obj);
 				}
 				return list;
-			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | NoSuchFieldException | SQLException e) {
+			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | SQLException | ClassNotFoundException e) {
 				throw new IllegalStateException("Unable to map value to the entity");
 			}
 		});
@@ -229,12 +264,24 @@ public abstract class Table<T extends Persistable> {
 						if(!field.isAnnotationPresent(DbField.class)) {
 							continue;
 						}
-						obj.getClass().getField(field.getName()).set(obj, rs.getObject(field.getAnnotation(DbField.class).name()));
+						// Recup valeur dans le resultat
+						Object value = rs.getObject(field.getAnnotation(DbField.class).name());
+						// Si lien avec une autre entité
+						if(field.isAnnotationPresent(DbLink.class)) {
+							checkIfPersistable(field);
+							String[] split = field.getType().getName().split("\\.");
+							String className = split[split.length - 1];
+							// Chargement de la class Table qui gère l'entité
+							Class<?> clazz = Class.forName(field.getAnnotation(DbLink.class).pckg() + "." + className + "Table");
+							Table table = (Table) clazz.getMethod("getInstance").invoke(null);
+							value = table.getById((Long) value);
+						}
+						field.set(obj, value);
 					}
 					list.add(obj);
 				}
 				return list;
-			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | NoSuchFieldException | SQLException e) {
+			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | SQLException | ClassNotFoundException e) {
 				throw new IllegalStateException("Unable to map value to the entity");
 			}
 		});
@@ -258,12 +305,24 @@ public abstract class Table<T extends Persistable> {
 						if(!field.isAnnotationPresent(DbField.class)) {
 							continue;
 						}
-						obj.getClass().getField(field.getName()).set(obj, rs.getObject(field.getAnnotation(DbField.class).name()));
+						// Recup valeur dans le resultat
+						Object value = rs.getObject(field.getAnnotation(DbField.class).name());
+						// Si lien avec une autre entité
+						if(field.isAnnotationPresent(DbLink.class)) {
+							checkIfPersistable(field);
+							String[] split = field.getType().getName().split("\\.");
+							String className = split[split.length - 1];
+							// Chargement de la class Table qui gère l'entité
+							Class<?> clazz = Class.forName(field.getAnnotation(DbLink.class).pckg() + "." + className + "Table");
+							Table table = (Table) clazz.getMethod("getInstance").invoke(null);
+							value = table.getById((Long) value);
+						}
+						field.set(obj, value);
 					}
 					list.add(obj);
 				}
 				return list;
-			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | NoSuchFieldException | SQLException e) {
+			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | SQLException | ClassNotFoundException e) {
 				throw new IllegalStateException("Unable to map value to the entity");
 			}
 		});
@@ -302,7 +361,16 @@ public abstract class Table<T extends Persistable> {
 				}
 				sql.append(field.getAnnotation(DbField.class).name());
 				values.append("?");
-				params.add(field.get(obj));
+				// Si il y a un lien avec une autre entité
+				if(field.isAnnotationPresent(DbLink.class)) {
+					checkIfPersistable(field);
+					Persistable persistable = (Persistable) field.get(obj);
+					params.add(persistable.getId());
+				}
+				// Sinon ajoute simplement le parametre
+				else {
+					params.add(field.get(obj));
+				}
 				first = false;
 			}
 		} catch (IllegalArgumentException | IllegalAccessException e) {
@@ -358,7 +426,16 @@ public abstract class Table<T extends Persistable> {
 					sql.append(",");
 				}
 				sql.append(field.getAnnotation(DbField.class).name() + " = ?");
-				params.add(field.get(obj));
+				// Si il y a un lien avec une autre entité
+				if(field.isAnnotationPresent(DbLink.class)) {
+					checkIfPersistable(field);
+					Persistable persistable = (Persistable) field.get(obj);
+					params.add(persistable.getId());
+				}
+				// Sinon ajoute simplement le parametre
+				else {
+					params.add(field.get(obj));
+				}
 				first = false;
 			} catch (IllegalArgumentException | IllegalAccessException e) {
 				throw new IllegalStateException("Unable to access to the attribute", e);

+ 14 - 0
src/db/annotation/DbLink.java

@@ -0,0 +1,14 @@
+package db.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface DbLink {
+	
+	public String pckg() default "db.table";
+	
+}

+ 0 - 50
src/db/table/EcoleTable.java

@@ -1,7 +1,5 @@
 package db.table;
 
-import java.util.List;
-
 import db.Table;
 import db.annotation.DbTable;
 import entity.Ecole;
@@ -10,58 +8,10 @@ import entity.Ecole;
 public class EcoleTable extends Table<Ecole> {
 	
 	private static EcoleTable instance;
-	private static VilleTable vt = VilleTable.getInstance();
-	private static NiveauTable nt = NiveauTable.getInstance();
 	
 	private EcoleTable() {
 		// Private constructor for singleton
 	}
-
-	@Override
-	public Ecole getById(long id) {
-		return link(super.getById(id));
-	}
-
-	@Override
-	public List<Ecole> getByField(String fieldname, Object value) {
-		return link(super.getByField(fieldname, value));
-	}
-
-	@Override
-	public List<Ecole> getWhere(List<String> where, List<Object> params) {
-		return link(super.getWhere(where, params));
-	}
-
-	@Override
-	public List<Ecole> getAll() {
-		return link(super.getAll());
-	}
-
-	@Override
-	public void save(Ecole obj) {
-		vt.save(obj.ville);
-		nt.save(obj.niveau);
-		obj.villeId = obj.ville.id;
-		obj.niveauId = obj.niveau.id;
-		super.save(obj);
-	}
-
-	private Ecole link(Ecole obj) {
-		if(obj == null) {
-			return null;
-		}
-		obj.ville = vt.getById(obj.villeId);
-		obj.niveau = nt.getById(obj.niveauId);
-		return obj;
-	}
-	
-	private List<Ecole> link(List<Ecole> list) {
-		if(list.isEmpty()) {
-			return list;
-		}
-		list.forEach(elt -> link(elt));
-		return list;
-	}
 	
 	public static EcoleTable getInstance() {
 		if(instance == null) {

+ 2 - 50
src/db/table/FrequentationTable.java

@@ -1,66 +1,18 @@
 package db.table;
 
-import java.util.List;
-
 import db.Table;
+import db.annotation.DbTable;
 import entity.Frequentation;
 
+@DbTable(name = "Frequentation", entity = Frequentation.class)
 public class FrequentationTable extends Table<Frequentation>{
 
 	private static FrequentationTable instance;
-	private static EspaceTable et = EspaceTable.getInstance();
-	private static UsagerTable ut = UsagerTable.getInstance();
 	
 	private FrequentationTable() {
 		// Private constructor for singleton
 	}
 
-	@Override
-	public Frequentation getById(long id) {
-		return link(super.getById(id));
-	}
-
-	@Override
-	public List<Frequentation> getByField(String fieldname, Object value) {
-		return link(super.getByField(fieldname, value));
-	}
-
-	@Override
-	public List<Frequentation> getWhere(List<String> where, List<Object> params) {
-		return link(super.getWhere(where, params));
-	}
-
-	@Override
-	public List<Frequentation> getAll() {
-		return link(super.getAll());
-	}
-
-	@Override
-	public void save(Frequentation obj) {
-		et.save(obj.espace);
-		ut.save(obj.usager);
-		obj.espaceId = obj.espace.id;
-		obj.usagerId = obj.usager.id;
-		super.save(obj);
-	}
-
-	private Frequentation link(Frequentation obj) {
-		if(obj == null) {
-			return null;
-		}
-		obj.espace = et.getById(obj.espaceId);
-		obj.usager = ut.getById(obj.usagerId);
-		return obj;
-	}
-	
-	private List<Frequentation> link(List<Frequentation> list) {
-		if(list.isEmpty()) {
-			return list;
-		}
-		list.forEach(elt -> link(elt));
-		return list;
-	}
-	
 	public static FrequentationTable getInstance() {
 		if(instance == null) {
 			instance = new FrequentationTable();

+ 0 - 48
src/db/table/UsagerTable.java

@@ -11,8 +11,6 @@ import entity.Usager;
 public class UsagerTable extends Table<Usager> {
 	
 	private static UsagerTable instance;
-	private static VilleTable vt = VilleTable.getInstance();
-	private static EcoleTable et = EcoleTable.getInstance();
 	
 	private UsagerTable() {
 		// Private constructor for singleton
@@ -33,52 +31,6 @@ public class UsagerTable extends Table<Usager> {
 		}
 		return Optional.of(obj);
 	}
-
-	@Override
-	public Usager getById(long id) {
-		return link(super.getById(id));
-	}
-
-	@Override
-	public List<Usager> getByField(String fieldname, Object value) {
-		return link(super.getByField(fieldname, value));
-	}
-
-	@Override
-	public List<Usager> getWhere(List<String> where, List<Object> params) {
-		return link(super.getWhere(where, params));
-	}
-
-	@Override
-	public List<Usager> getAll() {
-		return link(super.getAll());
-	}
-
-	@Override
-	public void save(Usager obj) {
-		vt.save(obj.ville);
-		et.save(obj.ecole);
-		obj.villeId = obj.ville.id;
-		obj.ecoleId = obj.ecole.id;
-		super.save(obj);
-	}
-
-	private Usager link(Usager obj) {
-		if(obj == null) {
-			return null;
-		}
-		obj.ville = vt.getById(obj.villeId);
-		obj.ecole = et.getById(obj.ecoleId);
-		return obj;
-	}
-	
-	private List<Usager> link(List<Usager> list) {
-		if(list.isEmpty()) {
-			return list;
-		}
-		list.forEach(elt -> link(elt));
-		return list;
-	}
 	
 	public static UsagerTable getInstance() {
 		if(instance == null) {

+ 4 - 5
src/entity/Ecole.java

@@ -3,6 +3,7 @@ package entity;
 import db.Persistable;
 import db.annotation.DbField;
 import db.annotation.DbId;
+import db.annotation.DbLink;
 
 public class Ecole implements Persistable {
 	
@@ -13,14 +14,12 @@ public class Ecole implements Persistable {
 	@DbField(name = "LIBELLE")
 	public String libelle;
 	
+	@DbLink
 	@DbField(name = "VILLE")
-	public long villeId;
-	
-	@DbField(name = "NIVEAU")
-	public long niveauId;
-	
 	public Ville ville;
 	
+	@DbLink
+	@DbField(name = "NIVEAU")
 	public Niveau niveau;
 
 	@Override

+ 5 - 6
src/entity/Frequentation.java

@@ -5,6 +5,7 @@ import java.util.Date;
 import db.Persistable;
 import db.annotation.DbField;
 import db.annotation.DbId;
+import db.annotation.DbLink;
 
 public class Frequentation implements Persistable {
 
@@ -12,19 +13,17 @@ public class Frequentation implements Persistable {
 	@DbField(name = "ID")
 	public long id;
 	
+	@DbLink
 	@DbField(name = "ESPACE")
-	public long espaceId;
+	public Espace espace;
 	
+	@DbLink
 	@DbField(name = "USAGER")
-	public long usagerId;
+	public Usager usager;
 	
 	@DbField(name = "DATE")
 	public Date date;
 	
-	public Espace espace;
-	
-	public Usager usager;
-	
 	@Override
 	public long getId() {
 		return id;

+ 4 - 5
src/entity/Usager.java

@@ -5,6 +5,7 @@ import java.util.Date;
 import db.Persistable;
 import db.annotation.DbField;
 import db.annotation.DbId;
+import db.annotation.DbLink;
 
 public class Usager implements Persistable {
 	
@@ -39,14 +40,12 @@ public class Usager implements Persistable {
 	@DbField(name = "DESCRIPTION")
 	public String description;
 	
+	@DbLink
 	@DbField(name = "VILLE")
-	public long villeId;
-	
-	@DbField(name = "ECOLE")
-	public long ecoleId;
-	
 	public Ville ville;
 	
+	@DbLink
+	@DbField(name = "ECOLE")
 	public Ecole ecole;
 
 	@Override

+ 15 - 0
src/servlets/TestDb.java

@@ -1,6 +1,7 @@
 package servlets;
 
 import java.io.IOException;
+import java.lang.reflect.Field;
 import java.sql.ResultSet;
 import java.util.List;
 import java.util.Optional;
@@ -13,11 +14,14 @@ import javax.servlet.http.HttpServletResponse;
 
 import db.Database;
 import db.ManageTable;
+import db.annotation.DbTable;
 import db.table.EcoleTable;
 import db.table.EspaceTable;
+import db.table.UsagerTable;
 import db.table.VilleTable;
 import entity.Ecole;
 import entity.Espace;
+import entity.Usager;
 import entity.Ville;
 
 /**
@@ -41,6 +45,7 @@ public class TestDb extends HttpServlet {
 	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 		EcoleTable et = EcoleTable.getInstance();
 		List<Ecole> le = et.getAll();
+		System.out.println("---------------------");
 		le.forEach(elt -> System.out.println(elt.libelle + " " + elt.ville.libelle + " " + elt.niveau.libelle));
 		
 		Ecole e = et.findById(1).get();
@@ -50,12 +55,22 @@ public class TestDb extends HttpServlet {
 		
 		et = EcoleTable.getInstance();
 		le = et.getAll();
+		System.out.println("---------------------");
 		le.forEach(elt -> System.out.println(elt.libelle + " " + elt.ville.libelle + " " + elt.niveau.libelle));
 		
 		VilleTable vt = VilleTable.getInstance();
 		Ville v = vt.getById(1);
+		System.out.println("---------------------");
 		System.out.println(v.libelle);
 		
+		
+		UsagerTable ut = UsagerTable.getInstance();
+		Usager u = ut.getById(1);
+		System.out.println("---------------------");
+		System.out.println(u.prenom);
+		System.out.println(u.ville.libelle);
+		System.out.println(u.ecole.libelle);
+		
 		response.getWriter().append("Served at: ").append(request.getContextPath());
 	}