Class AuditCommand

java.lang.Object
it.rol.bean.ItemBean
it.rol.command.AuditCommand
All Implemented Interfaces:
Command, Constants, Serializable, Comparable<ItemBean>

public class AuditCommand extends ItemBean implements Command, Constants

AuditCommand.java
Implementa la logica per la presentazione dei quesiti (interviste) e per la gestione dell'inserimento, dell'aggiornamento e della visualizzazione delle risposte, nel contesto della raccolta e dell'analisi dei dati relativi alla mappatura effettuata tramite la web-application Rischi on Line (rol) . Si occupa, inoltre, del calcolo dei valori degli indicatori di rischio.

Created on Tue 12 Apr 2022 09:46:04 AM CEST

Author:
Giovanroberto Torre
See Also:
  • Field Details

    • LOG

      protected static Logger LOG
      Log per debug in produzione
  • Constructor Details

    • AuditCommand

      public AuditCommand()
      Crea una nuova istanza di WbsCommand
  • Method Details

    • init

      public void init(ItemBean voceMenu) throws CommandException

      Raccoglie i valori dell'oggetto ItemBean e li passa a questa classe command.

      Specified by:
      init in interface Command
      Parameters:
      voceMenu - la VoceMenuBean pari alla Command presente.
      Throws:
      CommandException - se l'attributo paginaJsp di questa command non e' stato valorizzato.
    • execute

      public void execute(javax.servlet.http.HttpServletRequest req) throws CommandException

      Gestisce il flusso principale.

      Prepara i bean.

      Passa nella Request i valori che verranno utilizzati dall'applicazione.

      Specified by:
      execute in interface Command
      Parameters:
      req - la HttpServletRequest contenente la richiesta del client
      Throws:
      CommandException - se si verifica un problema, tipicamente nell'accesso a campi non accessibili o in qualche altro tipo di puntamento
    • loadParams

      public static void loadParams(String part, com.oreilly.servlet.ParameterParser parser, HashMap<String,LinkedHashMap<String,String>> formParams) throws CommandException, AttributoNonValorizzatoException

      Valorizza per riferimento una mappa contenente tutti i valori parametrici riscontrati sulla richiesta.

      Parameters:
      part - la sezione del sito corrente
      parser - oggetto per la gestione assistita dei parametri di input, gia' pronto all'uso
      formParams - mappa da valorizzare per riferimento (ByRef)
      Throws:
      CommandException - se si verifica un problema nella gestione degli oggetti data o in qualche tipo di puntamento
      AttributoNonValorizzatoException - se si fa riferimento a un attributo obbligatorio di bean che non viene trovato
    • loadInterviewParams

      public static HashMap<String,LinkedHashMap<String,String>> loadInterviewParams(String codeSur, InterviewBean interview) throws CommandException, AttributoNonValorizzatoException

      Restituisce una mappa contenente gli estremi identificanti una singola intervista.

      Parameters:
      codeSur - codice rilevazione
      interview - oggetto intervista, contenente tutti i parametri al proprio interno, da estrarre e inserire nella mappa restituita
      Returns:
      HashMap<String, LinkedHashMap<String, String>> - struttura di tipo Dictionary, o Mappa ordinata, avente per chiave il valore del parametro p, e per valore una mappa contenente i relativi parametri
      Throws:
      CommandException - se si verifica un problema nella gestione degli oggetti data o in qualche tipo di puntamento
      AttributoNonValorizzatoException - se si fa riferimento a un attributo obbligatorio di bean che non viene trovato
    • retrieveQuestions

      public static ArrayList<QuestionBean> retrieveQuestions(PersonBean user, String codeSurvey, int idQ, int getAll, DBWrapper db) throws CommandException

      Estrae l'elenco dei quesiti e, per ogni quesito figlio trovato, lo valorizza con gli attributi aggiuntivi (tipo, formulazione, etc.)

      Parameters:
      user - utente loggato
      codeSurvey - codice testuale della rilevazione
      idQ - identificativo del quesito
      getAll - flag specificante, se vale -1, che si vogliono recuperare tutte le strutture collegate a tutti i macro/processi
      db - databound gia' istanziato
      Returns:
      ArrayList<QuestionBean> - ArrayList di quesiti trovati completi di quesiti figli (quesiti "di cui")
      Throws:
      CommandException - se si verifica un problema nella query o nell'estrazione, nel recupero di valori o in qualche altro tipo di puntamento
    • retrieveQuestionsByIndicators

      public static HashMap<String,LinkedList<Integer>> retrieveQuestionsByIndicators(PersonBean user, ArrayList<QuestionBean> answers, CodeBean survey, DBWrapper db) throws WebStorageException, CommandException

      Estrae gli identificativi dei quesiti e li indicizza per codice di indicatore.

      Parameters:
      user - utente loggato
      answers - lista delle risposte
      survey - oggetto rilevazione
      db - databound gia' istanziato
      Returns:
      HashMap<String, LinkedList<Integer>> - mappa degli identificativi dei quesiti corrispondenti a ciascun indicatore
      Throws:
      WebStorageException - se si verifica un problema a livello di query o di estrazione
      CommandException - se si verifica un problema nel recupero di valori o in qualche altro tipo di puntamento
    • decantStructs

      public static HashMap<String,Vector<DepartmentBean>> decantStructs(ArrayList<DepartmentBean> structs) throws CommandException

      Travasa una struttura vettoriale matriciale (Vector con Vector con Vector etc.) di DepartmentBean, ciascuno dei quali può contenere un Vector di figlie, in una corrispondente struttura di tipo Dictionary, HashMap, in cui le chiavi sono rappresentate da oggetti String e i valori sono rappresentati dalle figlie del nodo avente codice corrispondente alla chiave.

      Esempio:
       {1.9-1=[
       it.rol.bean.DepartmentBean: OFFERTA FORMATIVA, SERVIZI E SEGRETERIE STUDENTI (84),
       it.rol.bean.DepartmentBean: RISORSE FINANZIARIE (92),
       it.rol.bean.DepartmentBean: TECNICA, GARE-ACQUISTI E LOGISTICA (108),
       ...]}
      dove 1.9-1 (nell'esempio) è il codice della struttura che fa da chiave della mappa ed è ricavato come segue:
       idThru + DOT + s1.getId() + DASH + s1.getLivello(); 
      ovvero
       contatore . id_struttura - livello_struttura
      .

      È utile per un accesso piú diretto alle figlie di ogni struttura, evitando di dover ogni volta ciclare la struttura matriciale fino al nodo di cui si vogliono ottenere le strutture figlie.

      Parameters:
      structs - struttura vettoriale di DepartmentBean da travasare in HashMap
      Returns:
      HashMap<String, Vector<DepartmentBean>> - struttura di tipo Dictionary, o Mappa ordinata, avente per chiave il codice del nodo, e per valore il Vector delle sue figlie
      Throws:
      CommandException - se si verifica un problema nell'accesso all'id di un oggetto, nello scorrimento di liste o in qualche altro tipo di puntamento
    • filter

      public static ArrayList<QuestionBean> filter(ArrayList<QuestionBean> questions) throws CommandException

      Prende in input una struttura vettoriale di QuestionBean contenenti internamente le risposte e scarta le domande aventi risposta e note entrambe vuote.

      Parameters:
      questions - ArrayList di QuestionBean da indicizzare per ambito
      Returns:
      ArrayList<QuestionBean> - lista contenente solo le domande con risposte
      Throws:
      CommandException - se si verifica un problema nell'accesso all'id di un oggetto, nello scorrimento di liste o in qualche altro tipo di puntamento
    • decantAnswers

      public static HashMap<Integer,QuestionBean> decantAnswers(ArrayList<QuestionBean> questions, ArrayList<QuestionBean> answers) throws CommandException

      Prende in input una struttura vettoriale di quesiti, ciascuno contenente internamente la relativa risposta e restituisce una mappa di risposte, ciascuna indicizzata per identificativo quesito.

      Parameters:
      questions - ArrayList di QuestionBean rappresentanti ciascuno una domanda con risposta
      answers - ArrayList di QuestionBean rappresentanti ciascuno una risposta con domanda
      Returns:
      HashMap<Integer, QuestionBean> - struttura di tipo Dictionary, o Mappa ordinata, avente per chiave l'id quesito e per valore l'oggetto risposta
      Throws:
      CommandException - se si verifica un problema nell'accesso all'id di un oggetto, nello scorrimento di liste o in qualche altro tipo di puntamento
    • decantIndicators

      public static HashMap<String,CodeBean> decantIndicators(ArrayList<CodeBean> indicators) throws CommandException

      Prende in input una struttura vettoriale di indicatori (solo gli estremi, non i valori) li indicizza per codice e li restituisce in una tabella indicizzata.

      Parameters:
      indicators - ArrayList di CodeBean rappresentanti ciascuno un indicatore
      Returns:
      HashMap<String, CodeBean> - struttura di tipo Dictionary, o Mappa ordinata, avente per chiave il codice indicatore e per valore l'oggetto indicatore
      Throws:
      CommandException - se si verifica un problema nell'accesso all'id di un oggetto, nello scorrimento di liste o in qualche altro tipo di puntamento
    • compute

      public static LinkedHashMap<String,InterviewBean> compute(HashMap<String,LinkedList<Integer>> questByIndicator, HashMap<Integer,QuestionBean> answerByQuestion, HashMap<String,CodeBean> indicatorByCode, ArrayList<DepartmentBean> structs, ArrayList<DepartmentBean> subjects) throws CommandException

      Calcola e restituisce una tabella avente come chiavi i codici degli indicatori e come valori corrispondenti oggetti valorizzati con ogni possibile attributo che sia utile per la visualizzazione dell'indicatore stesso.
      Siccome la logica di calcolo di ogni indicatore è diversa da quella di ogni altro indicatore, il presente metodo richiama lo specifico metodo di calcolo di ciascun indicatore di probabilità e di ciascun indicatore di impatto.
      Acquisite queste informazioni, richiama i metodi di calcolo degli indici sintetici P ed I e infine, sulla base di questi, calcola il valore del giudizio sintetico P x I, che memorizza in un oggetto associato alla chiave PI.

      Il metodo è pensato per essere richiamato nel contesto di uno specifico processo organizzativo censito a fini anticorruttivi (processo_at); l'hoverhead legato al richiamo ciclico, laddove – come nei report aggregati – sia necessario calcolare gli indicatori di ogni processo, viene gestito attraverso un apposito meccanismo di caching su disco (db).

      Di piú, al fine di velocizzare i tempi di computazione, viene implementato il calcolo parallelo per i singoli indicatori, eseguendo la computazione di ogni indicatore in un thread separato.
      La tipologia di struttura usata per contenere i valori di tutti gli indicatori durante l'esecuzione in parallelo dei singoli threads è sincronizzata anche se l'uso di una struttura non sincronizzata (p.es. una LinkedHashMap anziché la ConcurrentHashMap adottata) non dovrebbe rappresentare un problema perché i vari threads né modificano la struttura di tale mappa, né aggiungono o cancellano elementi indicizzati da una stessa chiave (v. p.es. Note that this implementation is not synchronized.).
      Tuttavia, se si usa direttamente la struttura non sincronizzata, l'ordine di inserimento delle chiavi dipenderà dal tempo impiegato da ciascun thread a completare la propria elaborazione, e questo non è certo un buon criterio di ordinamento! I valori caricati dai vari threads nella mappa sincronizzata senza order insertion vengono quindi, alla fine, dopo aver riunificato tutti i threads, caricati in una mappa ordinata, che viene passata come valore restituito.

      Parameters:
      questByIndicator - tabella degli identificativi dei quesiti che, da db, risultano associati a ogni specifico codice indicatore, usato come chiave
      answerByQuestion - tabella in cui ogni id quesito permette di ottenere la relativa risposta
      indicatorByCode - tabella in cui ogni oggetto contenente i dati di un indicatore e' ricavabile utilizzando come chiave il codice dell'indicatore stesso
      structs - lista di strutture coinvolte nell'elaborazione del processo di cui si vogliono calcolare gli indicatori
      subjects - lista di soggetti interessati nell'elaborazione del processo di cui si vogliono calcolare gli indicatori
      Returns:
      LinkedHashMap<String, InterviewBean> - tabella ordinata contenente tutti i valori degli indicatori e delle dimensioni di rischio, indicizzati per nome
      Throws:
      CommandException - se si verifica un problema nel calcolo di un indicatore, nel recupero di dati o in qualche tipo di puntamento
      See Also:
    • compare

      public static LinkedHashMap<String,InterviewBean> compare(ArrayList<InterviewBean> interviews) throws CommandException

      Implementa l'algoritmo "In dubio pro peior" (nel dubbio si consideri il caso peggiore, ovvero, in questo caso, il rischio piú alto) laddove esistano piú valori per lo stesso indicatore, in particolare valori diversi raccolti nel contesto di interviste diverse.
      Controlla se effettivamente vi possono essere più valori per lo stesso indicatore; se vi sono piú interviste, procede alla scelta.

      Effettua una ricerca lineare dal momento che il numero di interviste in cui lo stesso processo può essere esaminato sarà sempre molto basso (in genere per ogni processo c'è al piú un'intervista) per cui, essendo il presente metodo piú implementato a fini precauzionali (può sempre verificarsi il caso in cui lo stesso processo sia esaminato nel contesto di due interviste rivolte a due differenti strutture) non si è ritenuto necessario implementare un algoritmo di ricerca binario (divide et impera).
      Per velocizzare i confronti, piuttosto che effettuare un ordinamento (sorting) prima del confronto, si utilizza in partenza strutture con insertion order (in questo caso, LinkedHashMap piuttosto che HashMap, cfr. commit [ec57a9c]).

      Parameters:
      interviews - elenco di interviste sui cui indicatori applicare l'algoritmo
      Returns:
      LindekHashMap<String, InterviewBean> - dictionary, con insertion order, contenente i valori scelti per gli indicatori, indicizzati per codice
      Throws:
      CommandException - se un attributo obbligatorio non risulta valorizzato o se si verifica un problema in qualche tipo di puntamento
    • count

      public static LinkedHashMap<String,Integer> count(LinkedHashMap<String,InterviewBean> indicatorsByName, String type) throws CommandException

      Calcola le frequenze di ogni valore di rischio e le indicizza per il valore stesso, conteggiando i valori degli indicatori afferenti alla dimensione specificata e restituendo una tabella delle frequenze dei valori indicizzate per il valore stesso. Il risultato è una tipica distribuzione di frequenza.

      Parameters:
      indicatorsByName - tabella contenente tutti i valori degli indicatori e anche quelli degli indici generali, indicizzati per nome
      type - dimensione (P o I) i cui indicatori afferenti devono essere contati
      Returns:
      LindekHashMap<String, Integer> - dictionary, con insertion order, contenente le frequenze dei valori degli indicatori afferenti alla dimensione specificata, indicizzati per valore
      Throws:
      CommandException - se un attributo obbligatorio non risulta valorizzato o se si verifica un problema in qualche tipo di puntamento