Bonjour à tous,

Je suis en train de développer une application dans laquelle on retrouve des dossiers. L'application est 100% Web et utilisent les technologies suivantes :
- EJB 2
- Struts 1.2.9
- JSP
- PostgreSQL 9.0.3 (via JDBC)

Ce que je veux faire est un système qui permettrait de limiter l'accès en modification à seulement un utilisateur à la fois. Voici un scénario typique :
1. L'utilisateur A accède au dossier en édition. Il est en train d'écrire un journal de travail dans un éditeur de texte riche.
2. L'utilisateur B se connecte dans l'application et veut lui aussi aller inscrire des données dans le dossier que l'utilisateur A est en train de modifier.
3. L'utilisateur B peut actuellement entrer dans le dossier et commencer à inscrire ses trucs.
4. L'utilisateur A sauvegarde son travail et tout fonctionne.
5. L'utilisateur B sauvegarde son travail et tout fonctionne, mais a écrasé les données de l'utilisateur A.


Mon EntityBean est configuré de la sorte pour le paramètre container-configuration:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
@jboss.container-configuration name = "Optimistic CMP EntityBean"
J'aimerais donc savoir s'il existe un pattern ou une autre bonne pratique éprouvée qui me permettrait de savoir si une bean a un lock dessus sans devoir laisser l'utilisateur B faire ses changements et lui refuser sa modification étant donné que l'utilisateur A est déjà dans le dossier. J'aimerais simplement verrouiller le dossier tout comme le fait Adobe Dreamweaver quand on extrait ou archive un fichier dans un site Web.

J'ai trouvé une classe sur le Net qui permet de gérer des locks. La voici
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
public class LockManager {
  private HashMap locks;
 
  private static HashMap managers = new HashMap();
 
  /**
   * Get a named Lock Manager. The manager will be created if not found.
   */
  public static synchronized LockManager getLockManager(String managerName) {
    LockManager manager = (LockManager)managers.get(managerName);
    if(manager == null) {
        manager = new LockManager();
        managers.put(managerName, manager);
    }
    return manager;
  }
 
  /**
   * Create a new LockManager instance.
   */
  public LockManager() {
    locks = new HashMap();
  }
 
 /**
  * Request a lock from this LockManager instance.
  */
  public boolean requestLock(String username, Object lockable) {
    if(username == null)
      return false; // or raise exception
 
    synchronized(locks) {
      if(!locks.containsKey(lockable)) {
        locks.put(lockable, username);
        return true;
      }
      // Return true if this user already has a lock
      return (username.equals(locks.get(lockable)));
    }
  }
 
 /**
  * Release a Lockable object.
  */
  public Object releaseLock(Object lockable) {
    return locks.remove(lockable);
  }
}
Par contre, on doit passer un objet en paramètre. J'ai tenté d'y aller avec le hashcode de l'objet instancié, mais je ne suis pas 100% sur que c'est une bonne pratique étant donné que je ne peux pas garantir que le hashcode sera unique et invariable. J'ai également pensé fonctionner avec le ID du dossier (primary key de la bean Dossier).

Si quelqu'un a une idée, ce serait grandement apprécié de vous lire!

Merci beaucoup

Charles