2010-12-06 23 views
2

Mon environnement: application multi-utilisateur avec serveur et client. Le serveur sait quel champ est actuellement utilisé et ne peut pas être modifié par un autre utilisateur.Comment éviter d'éditer la même valeur dans un formulaire dans un environnement multi-utilisateur?

J'ai un formulaire avec plusieurs JComponents comme JCheckBox, JTextField, JTextArea et JComboBox. Le problème est que je veux contrôler si l'utilisateur est autorisé à modifier la valeur du champ ou non. Lorsque l'utilisateur n'est pas autorisé à modifier le champ, le composant n'est pas autorisé à passer en mode édition.

Par exemple: L'utilisateur A modifie une valeur de champ de texte. Maintenant, l'utilisateur B veut éditer la même valeur. Il clique sur le même champ de texte et à ce stade, je veux m'assurer que le champ de texte ne passe pas en mode édition.

Quelqu'un a une bonne idée où le bon endroit est pour ce contrôle? Dois-je implémenter une vérification dans chaque composant ou est-ce qu'il y a peut-être une solution qui convient à tous les composants JComponents dans mon formulaire?

Merci

Répondre

1

Je crois que vous pouvez fournir une solution générique. Créer un écouteur EditabilityListener. Lorsque l'utilisateur change de valeur si le composant doit envoyer un signal au serveur et que tous les autres utilisateurs l'obtiennent, leurs instances de JComponent sont désactivées.

Le problème est en accès simultané. Par exemple, que voudriez-vous faire si l'utilisateur A commençait à saisir le champ de texte une seconde après l'utilisateur B, mais avant que le signal n'arrive à son application?

+0

Exactement, pour éviter l'accès simultané, je préférerais que les composants du formulaire puissent vérifier par eux-mêmes si le champ est actuellement édité ou non. Le serveur sait déjà quels champs sont actuellement modifiés, les composants doivent donc attendre la réponse du serveur. Mon problème est que je ne sais pas quand (ou où?) Le composant doit demander au serveur s'il est autorisé à éditer la valeur, particulièrement cette vérification doit être faite avant de changer dans son mode d'édition. – Seffel

+0

Le problème est que peu importe où vous demandez. Il n'y a pas de moyen "normal" de synchroniser les threads entre les processus, donc vous devriez toujours être en mesure d'attraper la situation lorsque vous autorisez l'utilisateur à éditer le champ et ensuite découvrir qu'il n'avait pas les droits pour le faire. Vous pouvez également désactiver tous les champs et chaque fois que l'utilisateur clique sur le champ, vérifiez si le champ n'est pas en cours de modification par un autre utilisateur. Mais cela rend l'application très peu réactive. – AlexR

1

Le serveur peut prendre en charge une demande de propriété de composant, qui renvoie un booléen utilisé par le client. L'implémentation côté serveur doit conserver une structure de données synchronisée sensible aux propriétaires de composants. Vous pouvez utiliser un ConcurrentHashMap par exemple (il supporte putIfAbsent qui effectue une opération atomique qui peut aider).

Notez que vous aurez également besoin des clients pour signaler quand ils libèrent le composant (en ajoutant éventuellement le délai de propriété dans le serveur).

+0

Nous utilisons déjà un ConcurrentHashMap pour gérer les verrous d'édition. Je ne sais pas quand et où chaque composant demande au serveur s'il est autorisé à passer en mode Edit, d'autant plus que chaque composant est différent. – Seffel