Instant Developer

Tips&Tricks Instant Developer Foundation: lock documentale in poche mosse

| 24 Settembre 2014 | Giuseppe Lanzi
7 Instant Developer

Devo ammettere che non mi aspettavo un simile successo, ma pare che i post Tips&Tricks suscitino davvero il gradimento di molti lettori. È per questo motivo che anche quest’oggi vi scrivo per rispondere ad una domanda che mi avete fatto spesso e per la quale avete votato in tanti: c’è un esempio pratico di lock documentale?

Quando si deve implementare il lock sulle entità di un’applicazione bisogna partire da alcune semplici domande, perché rispondendo avremo ottenuto tutte le regole necessarie per implementare il servizio:

  • dove memorizzo i lock?
  • come identifico i lock e le entità bloccate?
  • dopo quanto tempo un lock viene considerato obsoleto?

La prima domanda nasconde un’affermazione implicita: non c’è un modo standard di memorizzare i lock applicativi. Possiamo salvarli su file XML, possiamo memorizzarli come un nuovo campo in ogni tabella di ogni entità, possiamo tenerli temporaneamente in memoria in una server session. La strada che preferisco io è l’aggiunta di una tabella locks al database.

La seconda domanda viene direttamente dalla mia risposta alla prima: se uso una sola tabella come faccio a riconoscere un lock su una Fattura da un lock su un Cliente? In questo caso viene in nostro aiuto la funzione getDNA della document orientation, che ritorna un identificativo univoco dell’entità in tutta l’applicazione. Non importa se uso i DocID o i normali contatori, un DNA è sempre univoco  (all’interno dello stesso database). Per identificare correttamente i lock di tutte le entità della mia applicazione mi basterà quindi avere una tabella Locks con i campi IDDocDNAUserDate Time, per indicare chi e quanto ha preso un lock su quale entità.

La terza domanda arriva sempre durante l’implementazione. L’idea alla base del servizio di lock è la seguente: quando l’utente comincia a modificare un’entità allora il sistema cerca di prendere un lock, se può farlo lo scrive sul database, se non può farlo annulla la modifica e avvisa l’utente; quando l’utente smette di lavorare sull’entità il lock viene cancellato. Ma cosa succede se viene preso un lock e poi l’applicazione va in crash o il server viene riavviato o c’è un qualche errore? Succede che il lock non lo cancella nessuno e quell’entità risulta bloccata per sempre. Ecco perché bisogna arrivare ad affermare qualcosa come “dopo un giorno i lock sono considerati obsoleti e quindi nulli”.

Una volta che abbiamo risposto a queste domande passiamo all’implementazione. Come molti servizi della Document Orientation il lock documentale si basa sull’uso di un Document Helper, la classe che ci permette di globalizzare il comportamento delle classi applicative. In questo progetto di esempio ho implementato il lock usando gli eventi getLock e releaseLock.

Nel getLock verifico se l’entità modificata dall’utente è bloccata da un altro operatore cercandola per DNA, a seconda del risultato faccio qualcosa di diverso per valorizzare il parametro di input/output Result:

  • se non la trovo inserisco la riga nel database, memorizzando il momento e l’utente corrente, imposto result a true;
  • se la trovo e se l’utente che la blocca è l’utente corrente rinfresco il lock aggiornando l’ora, imposto result a true;
  • se la trovo, se l’utente che la blocca non è l’utente corrente ma il lock è obsoleto (più vecchio di un giorno) cancello il lock e ne inserisco uno nuovo, imposto result a true;
  • se la trovo, se l’utente che la blocca non è l’utente corrente e il lock non è obsoleto, imposto result a false e do un messaggio all’utente.

Provare per credere, avviate il progetto di esempio e fate il login due volte da due browser diversi usando due username diversi. Modificate una riga nel primo browser e lasciate il pannello in stato aggiornato, andate nel secondo e cercate di modificare la stessa riga. Non potrete modificare l’entità da questa seconda finestra e vedrete un errore a video.

E poi non dite che non vi penso 🙂

Giuseppe Lanzi
Technical Support Manager
Mi occupo di assistenza e consulenza tecnica, dei corsi di formazione e dei sistemi rivolti ai clienti. Amo la tecnologia e ogni tipo di nuovo gadget, mi interesso di fotografia e prendo al volo ogni occasione di scoprire un nuovo gioco.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


Potrebbe interessarti

Instant Developer all’Evento Tech che apre il 2025

Mi chiamo Savino Carlone, per tutti sono solo “Savi” dalla nascita e sono una persona atipica per il mondo dell’informatica: preferisco la parte relazionale –...

Leggi Tutto

Instant Developer Foundation e Cloud 24.5: la prima volta insieme

Il rilascio delle versioni 24.5 di Instant Developer Foundation e Instant Developer Cloud rappresenta una grande novità: è la prima occasione in cui le due...

Leggi Tutto

Integrazione di librerie JavaScript per generare barcode

Scegliere il modo giusto per generare barcode non è semplice e la decisione che prendi può fare la differenza in termini di costi e praticità.Potresti...

Leggi Tutto

Rimani Aggiornato

Iscriviti alla nostra newsletter per ricevere aggiornamenti su novità, eventi, release, webinar e tante altre notizie sui prodotti Instant Developer.

    Presa visione dell'informativa (disponibile qui) resa da Pro Gamma SpA, acconsento al trattamento dei miei dati personali per l'invio di newsletter.*