Class AuditCommand
- All Implemented Interfaces:
Command,Constants,Serializable,Comparable<ItemBean>
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 Summary
FieldsFields inherited from interface it.rol.Constants
AMPERSAND, APOSTROPHE, BEAN_DEFAULT_FLOAT, BEAN_DEFAULT_ID, BLANK_SPACE, COLON, COMMA, COMMAND_AUDIT, COMMAND_HOME, COMMAND_INDICATOR, COMMAND_MEASURE, COMMAND_PROCESS, COMMAND_REPORT, COMMAND_RISK, COMMAND_STRUCTURES, CP1, CP2, CP3, CSV, DASH, DATA_FORMAT, DATA_GENERAL_PATTERN, DATA_SQL_PATTERN, DEFAULT_ID, DELETE, DOT, ELEMENT_LEV_1, ELEMENT_LEV_2, ELEMENT_LEV_3, ELEMENT_LEV_4, ENGLISH_DOUBLE_QUOTE_CLOSE, ENGLISH_DOUBLE_QUOTE_OPEN, ENGLISH_SINGLE_QUOTE, EQ, ERR, GR, HTML, HYPHEN, I, I1, I2, I3, I4, IF_EXISTS_DONOT_CREATE_NEW, INTERVIEW, INTERVIEWS, JSON, JSP_EXT, LIVELLI_RISCHIO, LIVELLI_RISCHIO_AS_LIST, LOG_IND, MAIN_MENU, MDASH, MESSAGE, MIME_TYPE_HTML, MIME_TYPE_TEXT, ND, NDASH, NOTHING, P, P1, P2, P3, P4, P5, P6, P7, PARAM_SURVEY, PART_CONFIRM_QST, PART_CREDITS, PART_FACTORS, PART_GRAPHICS, PART_INDICATOR, PART_INPUT, PART_INSERT_ACT_STRUCTS, PART_INSERT_ACTIVITY, PART_INSERT_F_R_P, PART_INSERT_INDICATOR, PART_INSERT_INPUT, PART_INSERT_M_R_P, PART_INSERT_MEASURE, PART_INSERT_MEASUREMENT, PART_INSERT_MONITOR_DATA, PART_INSERT_OUTPUT, PART_INSERT_PROCESS, PART_INSERT_PROCESS_RISK, PART_INSERT_RISK, PART_INSERT_RISK_PROCESS, PART_INSERT_SUBJECT, PART_MACROPROCESS, PART_MEASURES, PART_MONITOR, PART_OUTPUT, PART_PI_NOTE, PART_PROCESS, PART_RESUME_QST, PART_RISKS, PART_SEARCH, PART_SELECT_MEASUREMENT, PART_SELECT_MONITOR_DATA, PART_SELECT_QSS, PART_SELECT_QST, PART_SELECT_STR, PART_UPDATE_ACTIVITY, PART_UPDATE_MEASURE, PART_USR, PER_CENT, PI, PIM, PIR, PRO_PFX, PROCESS, QM, QUOTE, REFERRAL, REPORT_MDM, REPORT_MDM_MES, RISKS, ROOT_QM, RTF, SEMICOLON, SEPARATOR, SLASH, STATI_STRUTTURA, STATI_STRUTTURA_AS_LIST, STR_PFX, STRUCTURES, SUB_MENU, THE_END_OF_TIME, TIME_SQL_PATTERN, TIPI_LISTE, TWELWE_HOUR_FORMAT, UNDERSCORE, UNIX_EPOCH, UPDATE, VOID_SQL_STRING, VOID_STRING, WEIGHT_GENERIC, WEIGHT_SPECIFIC, YEAR_SHIFT -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic LinkedHashMap<String, InterviewBean> compare(ArrayList<InterviewBean> interviews) 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.static LinkedHashMap<String, InterviewBean> compute(HashMap<String, LinkedList<Integer>> questByIndicator, HashMap<Integer, QuestionBean> answerByQuestion, HashMap<String, CodeBean> indicatorByCode, ArrayList<DepartmentBean> structs, ArrayList<DepartmentBean> subjects) 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.static LinkedHashMap<String, Integer> count(LinkedHashMap<String, InterviewBean> indicatorsByName, String type) 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.static HashMap<Integer, QuestionBean> decantAnswers(ArrayList<QuestionBean> questions, ArrayList<QuestionBean> answers) 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.decantIndicators(ArrayList<CodeBean> indicators) 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.static HashMap<String, Vector<DepartmentBean>> decantStructs(ArrayList<DepartmentBean> structs) Travasa una struttura vettoriale matriciale (Vector con Vector con Vector etc.)voidexecute(javax.servlet.http.HttpServletRequest req) Gestisce il flusso principale.static ArrayList<QuestionBean> filter(ArrayList<QuestionBean> questions) Prende in input una struttura vettoriale di QuestionBean contenenti internamente le risposte e scarta le domande aventi risposta e note entrambe vuote.voidRaccoglie i valori dell'oggetto ItemBean e li passa a questa classe command.static HashMap<String, LinkedHashMap<String, String>> loadInterviewParams(String codeSur, InterviewBean interview) Restituisce una mappa contenente gli estremi identificanti una singola intervista.static voidloadParams(String part, com.oreilly.servlet.ParameterParser parser, HashMap<String, LinkedHashMap<String, String>> formParams) Valorizza per riferimento una mappa contenente tutti i valori parametrici riscontrati sulla richiesta.static ArrayList<QuestionBean> retrieveQuestions(PersonBean user, String codeSurvey, int idQ, int getAll, DBWrapper db) Estrae l'elenco dei quesiti e, per ogni quesito figlio trovato, lo valorizza con gli attributi aggiuntivi (tipo, formulazione, etc.)static HashMap<String, LinkedList<Integer>> retrieveQuestionsByIndicators(PersonBean user, ArrayList<QuestionBean> answers, CodeBean survey, DBWrapper db) Estrae gli identificativi dei quesiti e li indicizza per codice di indicatore.Methods inherited from class it.rol.bean.ItemBean
compareTo, equals, getCod1, getCod2, getCod3, getCod4, getCodice, getExtraInfo, getExtraInfo1, getExtraInfo2, getExtraInfo3, getExtraInfo4, getIcona, getId, getInformativa, getLabelWeb, getLivello, getNome, getNomeClasse, getNomeReale, getOrdinale, getPaginaJsp, getUrl, getValue1, getValue1AsInt, getValue2, getValue2AsInt, getValue3, getValue3AsInt, getValue4, getValue4AsInt, hashCode, isPrivato, isUrlInterno, setCod1, setCod2, setCod3, setCod4, setCodice, setExtraInfo, setExtraInfo1, setExtraInfo2, setExtraInfo3, setExtraInfo4, setIcona, setId, setInformativa, setLabelWeb, setLivello, setNome, setNomeClasse, setNomeReale, setOrdinale, setPaginaJsp, setPrivato, setUrl, setUrlInterno, setValue1, setValue2, setValue3, setValue4, toString
-
Field Details
-
LOG
Log per debug in produzione
-
-
Constructor Details
-
AuditCommand
public AuditCommand()Crea una nuova istanza di WbsCommand
-
-
Method Details
-
init
Raccoglie i valori dell'oggetto ItemBean e li passa a questa classe command.
- Specified by:
initin interfaceCommand- Parameters:
voceMenu- la VoceMenuBean pari alla Command presente.- Throws:
CommandException- se l'attributo paginaJsp di questa command non e' stato valorizzato.
-
execute
Gestisce il flusso principale.
Prepara i bean.
Passa nella Request i valori che verranno utilizzati dall'applicazione.
- Specified by:
executein interfaceCommand- 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, throws CommandException, AttributoNonValorizzatoExceptionString>> formParams) Valorizza per riferimento una mappa contenente tutti i valori parametrici riscontrati sulla richiesta.
- Parameters:
part- la sezione del sito correnteparser- oggetto per la gestione assistita dei parametri di input, gia' pronto all'usoformParams- mappa da valorizzare per riferimento (ByRef)- Throws:
CommandException- se si verifica un problema nella gestione degli oggetti data o in qualche tipo di puntamentoAttributoNonValorizzatoException- se si fa riferimento a un attributo obbligatorio di bean che non viene trovato
-
loadInterviewParams
public static HashMap<String,LinkedHashMap<String, loadInterviewParamsString>> (String codeSur, InterviewBean interview) throws CommandException, AttributoNonValorizzatoException Restituisce una mappa contenente gli estremi identificanti una singola intervista.
- Parameters:
codeSur- codice rilevazioneinterview- 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 puntamentoAttributoNonValorizzatoException- 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 loggatocodeSurvey- codice testuale della rilevazioneidQ- identificativo del quesitogetAll- flag specificante, se vale -1, che si vogliono recuperare tutte le strutture collegate a tutti i macro/processidb- 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 loggatoanswers- lista delle rispostesurvey- oggetto rilevazionedb- 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 estrazioneCommandException- 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();
ovverocontatore . 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 rispostaanswers- 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, throws CommandExceptionQuestionBean> answerByQuestion, HashMap<String, CodeBean> indicatorByCode, ArrayList<DepartmentBean> structs, ArrayList<DepartmentBean> subjects) 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 chiaveanswerByQuestion- tabella in cui ogni id quesito permette di ottenere la relativa rispostaindicatorByCode- tabella in cui ogni oggetto contenente i dati di un indicatore e' ricavabile utilizzando come chiave il codice dell'indicatore stessostructs- lista di strutture coinvolte nell'elaborazione del processo di cui si vogliono calcolare gli indicatorisubjects- 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 CommandExceptionCalcola 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 nometype- 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
-