Gli interventi eseguiti in ciascuna release sono raggruppati per area funzionale sulla quale hanno avuto impatto (scope) e sono classificati per tipo (feature, improvement, bugfix, …). Riportiamo di seguito una descrizione dei criteri di raggruppamento e classificazione adottati.
Aree funzionali
Tipi di intervento
Release 5.15.6 #
Model design & management
Miglioramento dello strumento per ricercare elementi inutilizzati
Sono state apportate migliorie al funzionamento di uno strumento interno, il cui scopo è quello di individuare attributi derivati o classi non utilizzate.
Lo strumento è accessibile da Designer nel menu Tools
, selezionando la voce Find unused model elements
.
Componenti interessati: Designer
Fix aggiornamento delle localizzazioni successivo al cambio di data type
Sono stati risolti i seguenti problemi derivati dal cambio di data type per un attributo:
le informazioni di localizzazione non erano aggiornate se facevano riferimento a un tipo di dato non più supportato;
la copia di un attributo incompatibile sollevava errori nella fase di copia delle informazioni di localizzazione.
Il nuovo comportamento è il seguente:
se il tipo non è supportato, viene creata una nuova localizzazione preservando la label e il tooltip (che sono sempre compatibili);
la copia avviene solo per i valori dei tipi di dato compatibili; in caso contrario, viene mostrato un errore.
Componenti interessati: Designer
Application generation & deployment
Ottimizzazione dei controlli di cardinalità
I controlli di cardinalità sono stati ottimizzati in modo da attivarsi solo nei casi strettamente necessari (i.e. cardinalità finita e diversa da 0N
). Questo ha comportato un aumento delle prestazioni.
Componenti interessati: Engine Framework
Abilitazione dell’istanziazione via plugin per le classi ApplicationMetadata
È ora possibile istanziare via plugin le implementazioni delle classi ApplicationMetadata
per scopi di test.
Componenti interessati: Engine Framework
Release 5.15.5 #
Model design & management
Fix eccezione durante il parsing delle espressioni math
È stato risolto un problema per cui, se il parsing di un’espressione math individuava degli errori, veniva sollevata un’eccezione nella fase di costruzione del relativo messaggio.
Componenti interessati: Designer
Application generation & deployment
Fix sollevamento anomalo dell’errore Object <ID> is not inside database
È stato risolto un problema per cui l’utilizzo dell’EntitySession da plugin poteva condurre a scenari in cui le risorse allocate non erano correttamente rilasciate.
Componenti interessati: Cloudlet Framework
Miglioramento delle prestazioni relative al ciclo di persistenza e validazione
Sono stati effettuati degli interventi mirati a ridurre il numero di query verso il database necessarie per completare le operazioni di persistenza e validazione degli oggetti.
Componenti interessati: Engine Framework, API GraphQL
Application management
Irrobustimento delle operazioni di upgrade per Cloudlet datate
È stato risolto un problema che rendeva impossibile la start di una Cloudlet che richiedeva un upgrade.
Componenti interessati: Dashboard, Dashboard Servant
Release 5.15.4 #
Modeling language
GraphQL: Nuovo supporto alla definizione di messaggi personalizzati nel caso in cui un utente non sia autorizzato ad accedere a una applicazione
Lato Designer, è ora possibile definire messaggi di errore personalizzati, i quali verranno mostrati nella fase di accesso a una vista applicativa in GraphQL nei seguenti due casi:
- l’utente non ha un profilo autorizzato ad accedere a quella vista applicativa;
- il filtro definito sulla vista non include l’utente in questione.
In GWT, le applicazioni a cui un utente non può accedere per le ragioni sopra citate continuano a non essere mostrate nella sua home page.
Componenti interessati: Designer, Engine Builder
Aggiunta di ID
all’elenco delle parole riservate per i membri di classe
Non è più possibile assegnare il nome ID
a un qualsiasi membro di una classe Livebase (attributo o ruolo). Farlo porta ora alla generazione di una issue bloccante, che non consente il salvataggio del modello.
Componenti interessati: Designer, Engine Builder
Model design & management
Nuova funzionalità che permette di disattivare le decorazioni delle icone nell’albero Schemas
È stata aggiunta una nuova checkbox al pannello Edit > Preferences
, all’interno della scheda Editor
, che permette di attivare o disattivare le decorazioni delle icone per le voci dell’albero Schemas
.
Componenti interessati: Designer
Fix decorazioni delle icone degli oggetti del modello nell’albero Schemas
È stato risolto un problema per cui, disabilitando tutte le classi all’interno di una vista applicativa, non veniva più mostrata l’icona di warning accanto a quella della suddetta vista, all’interno dell’albero Schemas
.
Componenti interessati: Designer
Application generation & deployment
GraphQL: Miglioramento prestazioni di deploy
Sono state effettuate operazioni di manutenzione all’infrastruttura Livebase che hanno permesso di velocizzare i tempi di deploy delle API GraphQL.
Componenti interessati: Hosting Server
Application management
Nuova funzionalità per la rigenerazione delle tabelle relative alle classi form
La necessità di correggere inconsistenze che possono verificarsi durante le operazioni di manutenzione evolutiva, relativamente all’upgrade delle classi form definite nel modello di una Cloudlet, ha portato all’introduzione di una nuova funzionalità all’interno del pannello Advanced Tools...
, raggiungibile dal menu contestuale del Cloudlet Database (clic destro sull’icona): è ora possibile forzare la rimozione e la creazione ex-novo delle tabelle corrispondenti alle classi form, senza perdite di dati.
La funzionalità cancellerà tutte le tabelle relative a classi form, per poi rigenerarle al successivo avvio della Cloudlet. Se questa è già avviata, sarà arrestata e rilanciata in automatico.
Componenti interessati: Dashboard, Dashboard Servant, Hosting Servant
Fix effetti grafici relativi al drag & drop sulla Dashboard
È stato risolto un bug grafico per cui l’icona dell’oggetto trascinato non era mostrata durante l’operazione di drag.
Componenti interessati: Dashboard
Fix creazione di Cloudlet su Hosting Server inattivi
Precedentemente, era possibile creare Cloudlet anche su Hosting Server che risultavano inattivi. Adesso, questo non è più consentito: se un utente vuole creare una Cloudlet e ha accesso a più di un server, quelli attualmente inattivi sono mostrati in grigio. Se nessuno di essi è disponibile, viene mostrato un messaggio di errore.
Componenti interessati: Dashboard, Dashboard Servant
Fix mancata rimozione delle tabelle relative alle classi form all’eliminazione del database
È stato risolto un problema per cui le tabelle relative alle classi form non venivano rimosse quando si richiedeva l’eliminazione del database di una Cloudlet.
Componenti interessati: Dashboard Servant, Hosting Servant
Fix errori nell’upgrade delle classi form a seguito della copia di un database
È stato risolto un problema per cui, copiando il database da una Cloudlet a un’altra tramite drag & drop, si verificavano inconsistenze nelle successive operazioni di upgrade delle classi form.
Componenti interessati: Dashboard Servant, Hosting Servant
Release 5.15.3 #
Modeling language
Fix impossibilità di definire sia associazioni che composizioni per la classe __User
È stato risolto un problema per cui non era possibile avere contemporaneamente un’associazione e una composizione con la classe __User
come sorgente. Ciò era dovuto a un meccanismo che propagava i class filter definiti sulla classe __User
ai suoi eventuali part, generando attributi derivati le cui espressioni math facevano riferimento a valori non accessibili. Intervenire sul meccanismo ha permesso di risolvere il problema.
Componenti interessati: Engine Builder
Application generation & deployment
Miglioramento dell’allineamento modello/database relativamente alle classi Form
Le operazioni di allineamento di modello e database, nel caso di modifiche a carico delle classi Form, sono state ottimizzate e corrette.
Componenti interessati: Dashboard Servant, Hosting Servant
Application management
Disattivazione del pulsante API & Public URLs
durante le operazioni sulla Cloudlet
Ora il pulsante API & Public URLs
() appare ingrigito se è in corso un’operazione sulla relativa Cloudlet, come una build o un avvio.
Componenti interessati: Dashboard Client
Release 5.15.2 #
Modeling language
Nuovi messaggi di validazione personalizzati per elementi del modello
Agendo sul Localization Schema della propria Cloudlet, il modellatore può ora definire una serie di messaggi di validazione personalizzati per ogni elemento del modello. Lo scopo è quello di avere errori maggiormente focalizzati sul dominio di definizione del modello. Per il momento, questi vengono inviati solo lato server, dunque in risposta alle chiamate GraphQL e ai metodi della EntitySession.
Gli elementi del modello per cui è possibile definire messaggi personalizzati sono i seguenti:
- ruoli
- violazione di cardinalità diretta;
- violazione di cardinalità indiretta;
- classi
- violazione di vincolo di unicità;
- attributi
- violazione di vincolo required;
- violazione di vincolo sul range di un attributo numerico;
- violazione di vincolo sul numero di cifre decimali;
- violazione di vincolo sulla lunghezza di un attributo stringa;
- violazione di vincolo sui pattern ammessi per un attributo stringa;
- violazione di vincolo sulle estensioni ammesse per un attributo file;
- violazione di vincolo sulle dimensioni massime ammesse per un attributo file.
Componenti interessati: Designer, Engine Builder
Application generation & deployment
Fix mancato reset dei campi relativi ai ruoli nelle Editable
È stato risolto il seguente problema a carico delle Editable: modificando il valore di un campo (attributo o ruolo) da cui dipendeva il dominio di associabilità di un ruolo, i relativi campi dell’Editable non erano resettati a loro volta, permettendo così associazioni inconsistenti (ad esempio: avendo due campi regione e provincia valorizzati a Lazio e Roma, modificando la regione in Lombardia il campo provincia rimaneva erroneamente valorizzato a Roma).
Componenti interessati: GWT Client
GraphQL: Fix mancato controllo dei permessi utente
È stato risolto un problema per cui, mancando gli opportuni controlli, gli utenti potevano utilizzare le API GraphQL per invocare il FormActionHandler di una classe, anche se questa non era accessibile in base al loro Profile Schema.
Componenti interessati: API GraphQL
Application management
Nuove funzionalità di gestione avanzata dei Cloudlet Database
Sono ora disponibili le seguenti nuove funzionalità relative alla gestione dei Cloudlet Database:
Check structure and update manufacturing plate
: confronta lo schema relazionale del database allo stato attuale con quello che sarebbe generato dal modello attualmente in uso. L’intento è quello di produrre un report con le differenze e farle opportunamente gestire allo sviluppatore, specialmente se questi ha precedentemente effettuato delle modifiche alla struttura del database senza avvalersi di Livebase;Download update plan
: genera e scarica l’update plan, ovvero un file contenente gli statement SQL necessari per allineare il database al modello attuale;Dump for update
: effettua il dump di tutte le tabelle che verranno influenzate dall’update plan.
Per accedere a queste nuove funzionalità, è necessario selezionare l’opzione Advanced Tools...
nel menu contestuale del Cloudlet Database (tasto destro sull’icona).
Componenti interessati: Dashboard Client, Dashboard Servant
Miglioramento delle politiche di under maintenance
È stato effettuato un raffinamento delle politiche che gestiscono lo stato di under maintenance relativamente agli account e alle Cloudlet:
- il fallimento di un’operazione a livello di account, per cui non è possibile attuare una procedura di recupero, determina il posizionamento dell’intero account in under maintenance;
- il fallimento di un’operazione in scrittura sulla singola Cloudlet, per cui non è possibile attuare una procedura di recupero, determina il posizionamento di quella sola Cloudlet in under maintenance;
- il fallimento di un’operazione in lettura o ripetibile sulla singola Cloudlet, per cui non è possibile attuare una procedura di recupero, NON determina il suo posizionamento in under maintenance.
Componenti interessati: Dashboard Servant
Fix stato di under maintenance per account senza Hosting Server associato
È stato risolto il seguente problema: un account senza Hosting Server associato che tentava di creare una Cloudlet provocava un’eccezione, e come conseguenza l’account passava nello stato under maintenance. Questo comportamento è stato modificato in modo che venga solamente sollevata l’eccezione.
Componenti interessati: Dashboard Servant, Hosting Servant
Release 5.15 #
Application generation & deployment
Miglioramento prestazionale attraverso la sostituzione dei vincoli NOT NULL
con CHECK CONSTRAINT
È stata effettuata la sostituzione dei vincoli NOT NULL
con le clausole CHECK CONSTRAINT
all’interno dei Cloudlet Database. Questa modifica ha migliorato la leggibilità delle query generate e delle prestazioni complessive del database. Inoltre, ora è possibile applicare indici alle tabelle, e l’algoritmo utilizzato per il calcolo dei valori derivati ha subito delle ottimizzazioni nelle fasi di inserimento e modifica.
Componenti interessati: Database Coder, Cloudlet Database, Database Checker, Database Updater, Engine Builder
Release 5.14.5 #
Application management
Migliori prestazioni dell’operazione di Expand
/Collapse
della Cloudlet
L’operazione di Expand
/Collapse
dei descrittori della Cloudlet è ora interamente gestita dalla Dashboard in memoria, nel modo seguente: all’avvio, tutti i descrittori sono mostrati espansi e l’utente può collassarli o espanderli nuovamente a sua discrezione. Se la Dashboard viene chiusa, lo stato dei descrittori viene resettato.
L’operazione è stata successivamente rimossa lato server, riducendo il numero di casistiche in cui è richiesto il reserve della Cloudlet (vedi note di rilascio 5.14.4) e migliorando le prestazioni di conseguenza.
Componenti interessati: Dashboard Servant
Fix toni di colore per i descrittori delle Cloudlet
È stata corretta la tonalità di rosso utilizzata per uno dei colori di sfondo assegnabili a un descrittore di una Cloudlet: questo ha permesso di rendere le scritte maggiormente leggibili.
Componenti interessati: Dashboard Client
Release 5.14.4 #
Model design & management
Fix blocco del designer a causa dell’operazione di Undo
/Redo
È stato risolto un problema per cui il Designer andava in blocco dopo aver eseguito l’operazione di Undo
o Redo
.
Componenti interessati: Designer
Fix calcolo incrementi LCP
Sono stati corretti alcuni errori che riguardavano il calcolo degli incrementi degli LCP in scenari particolari.
Componenti interessati: Designer
Fix crash dovuto all’importazione di classi da altri modelli
È stato risolto un problema per cui, importando dai modelli in libreria una classe con FormActionHandler insieme alla classe Form puntata dall’handler, il Designer subiva un crash al momento del salvataggio del modello.
Componenti interessati: Designer
Application management
GraphQL: fix bulk update effettiva su un insieme ristretto di elementi
Formulando una mutation di tipo updateBulk
e filtrando su un array di id, questa aveva effetto solo per i primi 10 elementi specificati. Il problema era dovuto a un comportamento di default che, in assenza dell’argomento options
, portava il server a ordinare tutti i record per id crescente selezionando poi solo i primi 10.
Componenti interessati: API GraphQL
Fix timeout nel completamento delle operazioni in corso
È stato risolto un problema per cui, al login sulla Dashboard o al suo refresh, la conclusione delle operazioni pendenti sulle Cloudlet poteva andare in timeout sollevando eccezioni, qualora alcune di queste operazioni impiegassero troppo tempo.
Componenti interessati: Dashboard Client, Dashboard Servant
Fix conflitto di concorrenza dovuto all’Expand
/Collapse
di una Cloudlet
È stato risolto un problema per cui l’operazione di Expand
/Collapse
del descrittore delle Cloudlet, nel caso di account con sub-account, causava conflitti di concorrenza. Ciò era dovuto al fatto che l’operazione non richiedeva il reserve della Cloudlet.
Componenti interessati: Dashboard Client
Rimozione della funzionalità View History
per i Cloudlet Database
Non è più disponibile la funzionalità View History
, che aveva lo scopo di visualizzare lo storico delle operazioni eseguite su un Cloudlet Database. Di conseguenza, non è più presente l’opzione nel menu contestuale del database e nel relativo pannello informativo.
Componenti interessati: Dashboard Client
Release 5.14.3 #
Model design & management
Fix errore nel calcolo degli incrementi LCP quando si modifica il percorso di un attributo query
È stato risolto un problema per cui la modifica del percorso di un attributo query determinava sempre un incremento di LCP pari a zero.
Componenti interessati: Designer
Application generation & deployment
Nuove informazioni sul connection pooler ottenibili dal servizio REST dataSourceStatus
I parametri del connection pooler, resi disponibili per la configurazione lato dashboard dalla versione 5.11.9, sono ora esposti anche tramite il servizio REST /auth/administration/dataSourceStatus
.
Il servizio restituisce ora strutture dati in formato JSON o xml, con i seguenti nuovi campi:
boolean autoCommit;
long connectionTimeout;
long idleTimeout;
long maxLifetime;
String connectionInitSql;
long validationTimeout;
long leakDetectionThreshold;
int maxPoolSize;
boolean allowPoolSuspension;
boolean readOnly;
String transactionIsolation;
Componenti interessati: Cloudlet Framework
Migliori tempi di esecuzione per le verifiche di allineamento tra modello e database
Rilassando un vincolo di cardinalità su un ruolo, non viene più eseguito il relativo controllo all’interno dei Cloudlet database. Come risultato, sono stati ridotti i tempi complessivi di esecuzione delle verifiche di allineamento tra modello e database.
Componenti interessati: Database Checker
Application management
Aggiunta richiesta di conferma per l’operazione di stop delle Cloudlet
Considerando che lo stop di una Cloudlet è un’operazione che può causare disservizi per i suoi utenti finali, viene ora mostrato un popup che richiede una conferma prima della sua esecuzione.
Componenti interessati: Dashboard Servant
Migliori tempi di esecuzione della start di una Cloudlet
L’avvio di una Cloudlet provocava la rimozione e rigenerazione di tutte le tabelle relative alle classi form definite nel modello, anche se non erano state fatte modifiche a loro carico.
Sono state dunque introdotte opportune strategie, in modo da ottenere rigenerazione delle sole tabelle relative alle classi form che sono state modificate nell’attuale versione del modello.
Componenti interessati: Dashboard Servant
Fix eccessiva durata dell’operazione di reserve di una Cloudlet
È stato risolto un problema per cui, in determinate situazioni, l’operazione di reserve di una Cloudlet impiegava un tempo eccessivo, anche dell’ordine di diversi minuti.
Componenti interessati: Dashboard Servant
Fix eccessiva durata dell’operazione di connessione alle Cloudlet
È stato risolto un problema per cui, al momento del login sulla Dashboard, l’operazione di connessione alle Cloudlet (segnalata dal messaggio Please wait while connecting to cloudlet) poteva impiegare tempi eccessivi. Questo è stato risolto introducendo opportune strategie di caching delle informazioni.
Componenti interessati: Dashboard Servant
Release 5.14.2 #
Model design & management
Miglioramento messaggi di segnalazione issue nella status bar
I messaggi per la segnalazione delle issue del modello, mostrati nella status bar del Designer, sono stati diversificati in funzione della severità:
- per le issue di bassa gravità, di tipo info, il messaggio è ora
This model has minor issues (no action required)
- per le issue di media gravità, di tipo warning, il messaggio è ora
This model has warnings you must fix before saving
- per le issue di alta gravità, di tipo error, il messaggio è ora
This model has errors you must fix before saving
Componenti interessati: Designer
Fix comando Set state of all elements
È stato risolto un problema per cui il comando Set state of all elements > Enabled/Disabled
, accessibile dal menu contestuale delle viste applicative, agiva anche sugli elementi delle classi che non potevano essere disabilitati.
Componenti interessati: Designer
Application generation & deployment
Nuovo task Gradle checkEngineDatabaseMismatch
È stato aggiunto un nuovo task denominato checkEngineDatabaseMismatch
al plugin Gradle: la sua esecuzione permette di individuare le issue di disallineamento tra l’engine caricato sulla Cloudlet e il suo database.
Componenti interessati: Livebase Gradle Plugin
Migliori prestazioni dell’operatore in
È stato complessivamente migliorato il throughput risultante dall’utilizzo dell’operatore in
, utilizzabile sia nella costruzione di espressioni math da Designer, che nella formulazione di filtri in chiamate GraphQL.
Componenti interessati: Engine Framework (Expression Parser)
GraphQL: migliori prestazioni per richieste annidate
È stato complessivamente migliorato il throughput delle richieste GraphQL annidate: nel caso in cui ci sia una sola nidificazione, le query SQL necessarie a recuperare gli oggetti “figli” usano ora come condizione di filtraggio l’uguaglianza anziché l’operatore in
come avviene per tutti gli altri casi.
Componenti interessati: API GraphQL
Fix errori di validazione con catene di attributi query verso l’attributo __id
È stato risolto un problema per cui, avendo un modello che presenta una catena di attributi query a cardinalità 1 verso l’attributo di piattaforma __id
, venivano sollevati errori a runtime durante la validazione degli oggetti salvati.
Componenti interessati: Engine Framework (Runtime Query Generator)
Fix sovrascrittura dei livelli di validazione in caso di invocazioni annidate di handler
È stato risolto un problema per cui se avvenivano invocazioni annidate di handler (es. persistence handler), quella di livello più basso sovrascriveva le impostazioni di applicationValidationLevel
e applicationVetoLevel
stabilite dal livello più in alto, riportandole ai valori di default.
Componenti interessati: Cloudlet Framework
Application management
Introdotta visualizzazione dei valori di default per le proprietà del connection pooler
Le proprietà del connection pooler, disponibili nell’omonima scheda del pannello di configurazione della Cloudlet, mostrano ora i propri valori di default qualora non siano state modificate. Per ogni proprietà è stato anche introdotto un pulsante che permette di resettare i valori impostati.
Componenti interessati: Dashboard Client
Migliore gestione del ciclo di vita dei Plugin
Per rendere l’operazione di start dei plugin maggiormente resistente agli errori, sono state operate delle modifiche alla gestione del loro ciclo di vita per consentire la start solo dopo che è stato effettuato il deploy dell’engine.
Componenti interessati: Dashboard Client
Migliore gestione della procedura di rebuild delle API GraphQL
Per ridurre i tempi di avvio delle Cloudlet, la procedura di rebuild delle API GraphQL è stata modificata per essere effettuata solo nelle seguenti condizioni:
- l’engine della Cloudlet ha subito un redeploy;
- le API GraphQL non sono mai state generate o sono state rimosse;
- il builder delle API ha subito un aggiornamento.
Componenti interessati: Dashboard Servant
Fix errore durante l’apertura del dettaglio del Cloudlet database
È stato risolto un problema che determinava il lancio di un’eccezione all’apertura del pannello di dettaglio del Cloudlet database, facendo clic sulla relativa icona all’interno del descrittore. Ciò era dovuto all’esistenza di alcuni scenari in cui il codice che governa l’interfaccia utente non riusciva ad individuare il pannello da aprire al clic sull’icona.
Componenti interessati: Dashboard Client
Fix procedura di recupero durante l’avvio di una Cloudlet
È stato risolto un problema per cui, se si verificava un fallimento durante l’operazione di avvio di una Cloudlet, fallivano anche le successive procedure di recupero dell’errore. La causa era dovuta al fatto che venivano effettuate modifiche su oggetti dichiarati immutabili.
Componenti interessati: Dashboard Servant
Release 5.14 #
Model design & management
Rimossa la possibilità di promuovere una normale classe in Singleton
Non è più disponibile la voce Class menu > Convert to singleton
, che consentiva di trasformare una normale classe in Singleton.
Componenti interessati: Designer
Application generation & deployment
Pubblicato un plugin Gradle per il controllo del ciclo di vita delle Cloudlet
È ora disponibile pubblicamente un plugin Gradle che consente agli sviluppatori di interagire programmaticamente con Livebase nell’ambito di un progetto Gradle, e gestirne il ciclo di vita dei propri modelli, Cloudlet e Plugin mediante task Gradle (ad esempio: avviare / fermare / aggiornare una Cloudlet esistente o le sue API GraphQL, installare un modello su una Cloudlet, scaricare un modello o il suo SPI dalla libreria, installare e avviare un Plugin su una Cloudlet…).
Il progetto e la relativa documentazione (al momento disponibile solo in lingua inglese) sono disponibili alla seguente repository: fhostercom/livebase-gradle-plugin, mentre la dipendenza Gradle è disponibile su Maven Central Repository.
Componenti interessati: Livebase Gradle Plugin
GraphQL: fix visibilità degli schema di viste applicative per utenti con profili non autorizzati all’accesso di tali viste
È stato risolto un problema per cui l’utente che effettuava la chiamata poteva compiere introspezione degli schema GraphQL di endpoint relativi alle viste applicative per le quali non era abilitato. Questo comportamento si verificava anche nel client GraphiQL: cambiando endpoint, l’utente autenticato poteva esplorare la documentazione anche degli endpoint per i quali non era autorizzato.
La soluzione è consistita nell’includere, nel controllo dei permessi di accesso (grant) alle viste applicative, anche le query verso i servizi __schema
e __type
. Attualmente resta possibile visionare da GraphiQL l’elenco (e i nomi) di tutti gli endpoint della Cloudlet, anche se l’utente non ha più accesso alla documentazione dello schema.
Componenti interessati: API GraphQL
GraphQL: rinominato il valore IssueType
APPLICATION_GRANT
in APPLICATION_ACCESS_FORBIDDEN
Contestualmente all’intervento appena descritto, per maggiore chiarezza è stato rinominato il valore APPLICATION_GRANT
dell’enum IssueType
in APPLICATION_ACCESS_FORBIDDEN
. La semantica del tipo di Issue resta invariata (maggiori informazioni disponibili qui)
Componenti interessati: API GraphQL
Application management
Fix aggiornamento del descrittore delle Cloudlet
È stato risolto un problema di aggiornamento del descrittore di una Cloudlet, che continuava a mostrare l’etichetta Please wait
e il pulsante API disabilitato anche dopo il termine dei preparativi.
Componenti interessati: Dashboard Servant
Release 5.13 #
Application management
Rese asincrone le operazioni di creazione e installazione di modelli
Sono state rese asincrone le operazioni di creazione di nuovi modelli in libreria e di installazione dei modelli sulle Cloudlet; questo consente di evitare lo scadere della sessione negli scenari in cui queste operazioni richiedono tempi di completamento elevati.
Componenti interessati: Dashboard Servant
Fix comportamento errato nell’elenco delle Cloudlet durante il caricamento iniziale
È stato risolto un problema per cui, durante il caricamento iniziale delle Cloudlet in seguito al login, l’elenco di queste era centrato automaticamente sulla prima Cloudlet caricata, invece che sulla prima dell’elenco.
Componenti interessati: Dashboard Client
Release 5.12 #
Modeling language
Rimosso il supporto alle ontologie
Il supporto alle ontologie è stato rimosso: non è più possibile definire ontologie all’interno di un modello e, nel caso venga aperto un modello che le presenta, vengono rimosse automaticamente previa comparsa di un warning.
Componenti interessati: Designer
Application generation & deployment
SPI: aggiunto overload del metodo persist()
nella EntitySession
per eseguire comandi in fase di persistenza
L’overload accetta un numero variabile di oggetti PersistCommand
che rappresentano uno o più comandi da eseguire al momento della persistenza della sessione, usando come contesto la connessione impiegata dalla relativa transazione.
In questo modo, è possibile persistere in modo transazionale anche quelle modifiche che non interessano esplicitamente gli oggetti manipolati nella sessione, come ad esempio operazioni CRUD su altre tabelle del Cloudlet Database.
interface EntitySession {
//...
persist(PersistCommand... commands)
}
Componenti interessati: Engine Framework (SPI)
Migliori prestazioni nella validazione dei ruoli di associazione
Sono stati eseguiti degli interventi al processo di validazione dei ruoli di associazione, il cui risultato è stata una riduzione dei tempi di salvataggio degli oggetti all’interno di una sessione di lavoro.
Gli interventi sono consistiti nel ridurre il numero di query necessarie a ottenere la persistenza, nel caso di modifiche fatte direttamente su un ruolo (aggiunta e rimozione di oggetti associati), o provocate dalla rimozione di oggetti che possiedono associati (verifica della cardinalità minima).
Componenti interessati: Engine Framework
GraphQL: miglioramento prestazionale dell’algoritmo di fetch
Sono state introdotte delle ottimizzazioni nell’algoritmo di fetch GraphQL: in particolare, è stato ottimizzato il processo di costruzione delle query SQL a partire da una richiesta GraphQL attraverso l’eliminazione di statement ridondanti.
Componenti interessati: API GraphQL
La Cloudlet ora espone pubblicamente il servizio di health check
Al fine di facilitare l’integrazione del servizio di health check con servizi e sistemi esterni alla Cloudlet, l’endpoint REST che espone tale funzionalità è stato spostato sull’endpoint pubblico <CloudletUrl>/public/administration/healthcheck
. Il servizio è pertanto accessibile senza bisogno di fornire credenziali.
Componenti interessati: Cloudlet Framework
Rimossi i package deprecati bean
e mock
dallo SPI
Sono stati rimossi i package bean
e mock
dallo SPI dei plugin, che erano stati dichiarati deprecati nel rilascio della versione 5.9.1.
Package rimossi:
com.fhoster.livebase.cloudlet.bean
com.fhoster.livebase.cloudlet.mock
Classi e interfacce rimosse:
com.fhoster.livebase.cloudlet.ImmutableEntityProvider
com.fhoster.livebase.cloudlet.Session
com.fhoster.livebase.cloudlet.CloudletSessionFactory
com.fhoster.livebase.cloudlet.CloudletMemberManager
com.fhoster.livebase.cloudlet.CloudletMember
com.fhoster.livebase.cloudlet.BeanIdentifier
Componenti interessati: SPI Plugin
SPI: Reintrodotta la classe deprecata DataValidationFailure
Per evitare disservizi sperimentati successivamente alla sua rimozione, è stata reintrodotta nello SPI la classe deprecata DataValidationFailure
.
Componenti interessati: Engine Framework (SPI)
Application management
Fix conteggio byte errato quando si carica un modello sulla Dashboard
È stato risolto un problema per cui il conteggio dei byte di un modello caricato sulla Dashboard veniva mostrato raddoppiato.
Componenti interessati: Dashboard Client
Rimosso switch per l’abilitazione delle API REST nel pannello API & Public URLs
Nel pannello informativo della Cloudlet API & Public URLs
, è stato rimosso lo switch che abilitava la generazione delle API REST dalla scheda API
, terminando di fatto il supporto alla generazione delle vecchie API REST deprecate. Sono stati rimossi anche tutti i servizi di visualizzazione dell’URL degli endpoint presso cui accedere a queste API.
Componenti interessati: Dashboard Client, Dashboard Servant
Release 5.11.9 #
Application generation & deployment
Nuova logica di validazione lato server: controllo del rispetto di Selection Filter e Selection Path per gli oggetti di nuova associazione
Il controllo dei Selection Filter e dei Selection Path, necessario per determinare l’associabilità di un oggetto satellite, viene ora eseguito sia dal client generato per le Cloudlet che lato server. Questo consente di risolvere alcuni problemi riscontrati nell’utilizzo dei servizi GraphQL, in particolare durante la configurazione dei parametri di invocazione dei FormActionHandler e nel salvataggio di oggetti aventi vincoli di associabilità.
Componenti interessati: Engine Builder
GraphQL: fix mappatura eccezioni lanciate da FormActionHandler
È stato risolto un problema relativo alla mappatura delle eccezioni lanciate da FormActionHandler invocati mediante gli appositi servizi GraphQL: in caso di errori esplicitamente sollevati dal codice del Plugin mediante HandlerException
, il server restituiva una risposta contenente un errore generico, determinando la perdita di tutte le informazioni diagnostiche incluse nel codice del Plugin. Questo accadeva perché le eccezioni venivano rilanciate come HandlerInvocationException
e subivano un’intercettazione prima di giungere al sottosistema GraphQL.
Componenti interessati: API GraphQL
Application management
Nuovi colori personalizzati per i descrittori delle Cloudlet
È ora possibile assegnare colori personalizzati ai descrittori delle Cloudlet. Questo consente agli utenti di distinguerle in base a diversi criteri, quali ad esempio l’ambiente di operatività (produzione, validazione, test, etc…). Questa funzione è inclusa nel menu contestuale delle Cloudlet: passando il mouse sulla voce Background
comparirà un menu dal quale scegliere un colore per il relativo descrittore.
Componenti interessati: Dashboard Client
Nuova scheda Connection pooler
nel pannello di configurazione della Cloudlet
È ora possibile configurare il connection pooler direttamente dalla Dashboard, senza dover agire sul database.
Per farlo è necessario accedere al pannello di configurazione della Cloudlet, attraverso la voce Configure...
presente nel suo menu contestuale. Il suddetto pannello presenta una nuova scheda denominata Connection pooler
, la quale contiene una tabella con due colonne:
Property
, contenente gli identificatori delle proprietà del connection pooler;Value
, contenente i valori per ciascuna proprietà.
L’utente può effettuare modifiche alla configurazione cliccando sulle celle della colonna Value
.
Componenti interessati: Dashboard Client, Hosting Servant
Fix mancata propagazione delle modifiche tra utenti di account e subaccount
È stato risolto un problema osservato nel caso di account Livebase con subordinati: precedentemente, se un utente A riservava la modifica del modello utilizzando il pulsante EDIT
nel Designer mentre un utente B aveva già eseguito delle modifiche in maniera concorrente, il modello non rifletteva nessuna delle modifiche operate da B. Ciò era dovuto al fatto che le operazioni di lock sui modelli non tengono conto delle versioni disponibili in un dato istante, e le successive operazioni di aggiornamento confrontano i timestamp lato client e lato server per la sola versione che si desidera modificare.
La soluzione è consistita nell’introdurre un controllo che impedisce la modifica di un modello da parte di un utente se la versione presente localmente non è la più recente (il modello è accessibile unicamente in sola lettura): l’utente dovrà chiudere il Designer ed effettuare un aggiornamento della Dashboard.
Componenti interessati: Dashboard Servant
Rimozione delle funzionalità relative al backup delle Cloudlet
Sono state rimosse le funzionalità relative al backup delle Cloudlet: il menu contestuale non comprende più l’opzione Backup
.
Componenti interessati: Dashboard Client, Dashboard Servant, Hosting Servant
Release 5.11.8 #
Application generation & deployment
GraphQL: nuovo argomento insight
nei servizi di tipo Mutation
È stata aggiunta la possibilità di richiedere le informazioni di insight per i servizi GraphQL di tipo Mutation aventi una componente di lettura dei dati: ciò avviene attraverso l’aggiunta dell’argomento opzionale insight
già utilizzato per i servizi Query (maggiori informazioni disponibili qui). Considerando che queste informazioni permettono di analizzare facilmente le strategie di ottimizzazione adottate dal framework in termini di query SQL eseguite, si è infatti ritenuto utile prevederle anche nell’ambito delle Mutation.
Componenti interessati: Runtime Query Generator
Migliori prestazioni delle Cloudlet nella gestione dei lock
Sono stati rimossi i controlli di esistenza precedentemente effettuati durante le operazioni di gestione dei lock nelle Cloudlet, considerati non necessari. Questo ha prodotto un miglioramento delle prestazioni complessive in quanto i suddetti controlli erano computazionalmente onerosi.
Componenti interessati: Engine Framework
Fix recupero di oggetti Singleton via Plugin in presenza di classi Singleton multiple
È stato risolto un problema relativo al recupero di oggetti Singleton via Plugin (mediante l’invocazione context.getEntitySession().get<SingletonName>()
), per cui veniva sollevata un’eccezione qualora fossero presenti più classi Singleton. Ciò era dovuto al fatto che il framework gestiva internamente gli ID delle istanze Singleton in modo analogo alle altre classi non-Singleton, pur non avendo queste degli ID univoci su tutto il sistema. La logica interna al framework è stata pertanto modificata assegnando identificatori “speciali” alle istanze Singleton e Enum, risolvendo l’eccezione sollevata da get<SingletonName>()
.
Componenti interessati: SPI Plugin
Release 5.11.7 #
Model design & management
Nuovi comandi Enable/Disable all attributes
nel Class menu nell’Application Schema
Per velocizzare le operazioni di abilitazione/disabilitazione di attributi a livello di Application Schema, sono stati introdotti due nuovi comandi nel menu contestuale delle classi (Class menu):
Enable > all attributes
permette di abilitare tutti gli attributi definiti per la classe;Disable > all attributes
permette di disabilitare tutti gli attributi definiti per la classe.
Componenti interessati: Designer
Application generation & deployment
Fix dipendenza dalla timezone del server di esecuzione per la funzione date()
È stato risolto un problema relativo alla valutazione della funzione date()
(la quale effettua il parsing di una stringa rappresentante una data in base a un formato), per cui i valori temporali restituiti erano riferiti al giorno precedente. La causa del problema era dovuta al fatto che la funzione date()
utilizzava erroneamente la timezone della Cloudlet, invece della timezone di default di Livebase (GMT).
Componenti interessati: Engine Framework
Fix inconsistenza nel recupero di oggetti part o associati in seguito all’espansione di ruoli in GraphQL in presenza di Class Filter su classi target
Nelle query che prevedono il recupero di oggetti part o associati, il framework non prevede di applicare eventuali Class Filter definiti sulla classe target puntata dal ruolo interessato dall’espansione, dal momento che questi filtri sono considerati solo quando la classe è radice della query.
Questo comportamento era rispettato dalle query originate dal Client web o da Plugin, ma non da quelle provenienti da chiamate GraphQL, che a causa di ottimizzazioni previste dal framework applicavano erroneamente i Class Filter delle classi target anche nell’espansione dei ruoli che puntano a esse.
Componenti interessati: Engine Framework (Runtime Query Generator)
Release 5.11.6 #
Application generation & deployment
Miglioramento delle performance di commit sui database delle Cloudlet
Le operazioni di commit sui database delle Cloudlet sono state rese più efficienti con i seguenti interventi:
- ottimizzazione della logica del controllo di esistenza nel database per le operazioni di merge degli oggetti in sessione;
- rimozione di ulteriori controlli di esistenza non necessari all’interno delle operazioni di gestione dei lock sugli oggetti.
Per effetto di questi interventi, i tempi di esecuzione sono stati dimezzati.
Componenti interessati: Engine Framework
Fix valutazione di espressioni math in presenza di variabili nulle riferite a Enum e Singleton
È stato risolto un problema relativo alla valutazione delle espressioni math, per cui veniva sollevata un’eccezione a runtime in presenza di variabili riferite a classi Enum o Singleton con valore nullo.
Componenti interessati: Engine Builder
Application management
Nuova indicazione della versione delle API GraphQL montate su una determinata Cloudlet
Selezionando la voce Help
dal menu contestuale di una Cloudlet, verranno ora mostrate sia la versione Livebase di riferimento sia quella delle API GraphQL, in modo da facilitare lo sviluppo dei plugin compatibili.
Componenti interessati: Dashboard Client, Dashboard Servant
Nuova scheda CORS
nel pannello di configurazione della Cloudlet
È ora possibile configurare il meccanismo CORS (Cross-Origin Resource Sharing) direttamente dalla Dashboard, senza dover agire sul database.
Per farlo, è necessario accedere al pannello di configurazione della Cloudlet e selezionare la voce Configure...
dal suo menu contestuale. Il suddetto pannello presenta una nuova scheda denominata CORS
, la quale contiene i controlli per abilitare o disabilitare il meccanismo e specificare gli header forniti dal server durante l’autenticazione del client. È anche presente un link alla documentazione CORS, allo scopo di facilitare le operazioni di configurazione.
Componenti interessati: Dashboard Client, Dashboard Servant
Miglioramento naming di default per i file .xml dei modelli scaricati
Per semplificare la catalogazione delle versioni dei modelli Livebase, è stata ripensata la denominazione dei relativi file .xml scaricabili dalla Cloudlet, in maniera analoga a quanto è avvenuto per i nomi dei .jar delle SPI nella versione 5.11.2.
- i modelli scaricati dalla libreria hanno come nome di default
<ModelName>_<Version>.xml
; - i modelli scaricati dalle Cloudlet e allineati con la versione di libreria hanno come nome di default
<ModelName>_<Version>.xml
; - i modelli scaricati dalle Cloudlet e con versione superiore a quella di libreria hanno come nome di default
<ModelName>_<Version>_modified.xml
; - i modelli scaricati dalle Cloudlet e senza un corrispettivo in libreria hanno come nome di default
<ModelName>.xml
.
<Version>
indica il numero di versione del modello con i tre numeri separati da underscore invece che dal punto (ad es. 1_0_0
al posto di 1.0.0
).
Componenti interessati: Dashboard Client, Dashboard Servant
Miglioramento dei tempi per effettuare login alla Dashboard
In precedenza, se un determinato utente possedeva molte Cloudlet, il caricamento della Dashboard successivo all’operazione di login richiedeva tempi elevati; questo accadeva perché ogni singola Cloudlet veniva contattata in modo sincrono attraverso l’Hosting Servant per effettuare controlli di raggiungibilità ed esistenza (accertando che ogni Cloudlet risulti registrata sia presso il Dashboard Servant che presso l’Hosting Servant).
Per risolvere questo problema è stato introdotto un procedimento di preparazione asincrona, per cui viene inizialmente generato un descrittore minimale per ciascuna Cloudlet, mentre le verifiche di raggiungibilità ed esistenza procedono in background.
Componenti interessati: Dashboard Client, Dashboard Servant
Release 5.11.5 #
Application generation & deployment
Fix NullPointerException durante il mapping di ruoli tra classi Form e Enum
È stato risolto un problema in fase di check del database: tentando di mappare i ruoli di una relazione tra una classe Form e una Enum veniva sollevata una NullPointerException
. Ciò era dovuto al fatto che la procedura di check è pensata per ignorare il mapping di relazioni in cui almeno uno degli estremi è una classe Form, ma questo non avveniva se l’altro estremo era una classe Enum.
Componenti interessati: Database Checker
Application management
⚠️Importante⚠️: Dismissione vecchio portale Fhoster
Il portale www.fhoster.com è stato dismesso e sostituito con un nuovo portale all’indirizzo www.livebase.com.
La sostituzione ha comportato i seguenti cambiamenti:
- La Dashboard va ora scaricata dal seguente URL: www.livebase.com/download ;
- È stata disabilitata la possibilità per i clienti di creare autonomamente un account master. La creazione dell’account master per i nuovi clienti viene ora effettuata dallo staff Fhoster in back-office;
- La Dashboard è stata estesa con funzionalità che consentono all’account master di modificare le proprietà dell’account e di gestire i sub-account.
Release 5.11.4 #
Model design & management
Nuovo comando per generare lo SPI direttamente dai modelli in libreria
È ora possibile effettuare il download dello SPI di un modello direttamente dalla libreria, senza prima doverlo installare in una Cloudlet.
A questo scopo, il menu contestuale richiamabile facendo clic destro su un modello comprende ora la voce Download SPI...
.
Componenti interessati: Dashboard Client, Dashboard Servant
Application generation & deployment
GraphQL: fix utilizzo inatteso della timezone locale nel recupero di valori math di tipo Date
È stato risolto un problema nel recupero attraverso query GraphQL di attributi di tipo Date e di valori math calcolati a partire da questi. I valori math erano infatti ricalcolati utilizzando la timezone locale del server, anziché la timezone GMT
su cui si basa Livebase; per questo motivo venivano generate risposte in cui essi si trovavano un giorno avanti o indietro rispetto al risultato atteso, come in questo esempio in cui math1
è semplicemente un alias di attribute1
:
{
"data": {
"Class1___getPage": {
"items": [
{
"attribute1": "16-Apr-2021",
"math1": "15-Apr-2021"
}
]
}
}
}
Componenti interessati: API GraphQL, Engine Framework (Runtime Query Generator)
GraphQL: Fix errori nel recupero di ruoli che puntano a classi Enum
È stato risolto un problema per cui, effettuando query GraphQL che richiedevano informazioni relative a ruoli che puntavano a classi Enum, venivano sollevati degli errori.
Ciò si verificava perché Livebase non prevede costrutti che rappresentano specificamente dei ruoli (class role) nel caso di classi part, Form e Enum. Il Runtime Query Generator gestiva correttamente questa particolarità solo per i primi due casi, per cui è stato necessario apportarvi delle modifiche per contemplare anche la casistica delle classi Enum.
Componenti interessati: API GraphQL, Engine Framework (Runtime Query Generator)
Application management
Nuove funzionalità nella Dashboard recuperate dal portale Fhoster
In previsione della dismissione del portale Fhoster, sono state introdotte le seguenti funzionalità all’interno della Dashboard:
- gestione dei subaccount: cliccando sul nome del proprio account, in alto a destra, è ora presente la voce
Subaccounts...
, la quale apre un pannello che elenca tutti i subaccount associati, consentendone inoltre la creazione ed eliminazione; - cambio password: sempre facendo clic sul nome del proprio account, il menu contestuale presenta ora la voce
Change Password...
, la quale apre un pannello che richiede la conferma del processo con l’immissione della vecchia password e di quella nuova; - recupero password: nella finestra di login è ora presente il link
Forgot?
. Cliccando su di esso viene richiesto il proprio nome utente o la propria e-mail. Una volta confermati questi dati, si riceve un codice da immettere nella finestra successiva per confermare il reset della propria password.
Componenti interessati: Dashboard Client, Dashboard Servant
Release 5.11.3 #
Model design & management
Miglioramento prestazioni nell’accesso alle versioni dei modelli archiviati
È stata aggiunta l’indicizzazione sulla data di archiviazione delle versioni dei modelli, in modo da migliorare le prestazioni di accesso.
Componenti interessati: Dashboard Database
Fix calcolo LCP durante la risoluzione automatica di elementi mancanti nel modello
È stato risolto un problema per cui, in fase di salvataggio di un modello che presenta Low issue relative a elementi mancanti, gli LCP non venivano correttamente aggiornati.
Quando un modello viene salvato con elementi mancanti, Livebase avvia una procedura che risolve le issue aggiungendoli automaticamente. Precedentemente, le operazioni seguivano un ordine di esecuzione che portava alla sovrascrittura dell’incremento di LCP relativo ai nuovi elementi. La soluzione è quindi consistita nel modificare la procedura inserendo un’operazione che forza il ricalcolo degli LCP, facendola terminare con l’aggiornamento al valore corretto.
Componenti interessati: Designer
Application generation & deployment
GraphQL: aggiunta di servizi preview generici per le classi Form
Sono stati aggiunti i servizi di tipo generico anche per le classi Form, con lo scopo di offrire strutture dati comuni e di facile utilizzo.
In particolare, sono stati aggiunti solo i servizi di tipo preview, in quanto non è possibile persistere o modificare oggetti appartenenti a classi Form (operazione svolta da save), e non risulta significativo controllare la correttezza di queste operazioni (operazione svolta da validate). Il parametro accettato è la struttura <FormClassName>Draft
che è già utilizzata nei servizi che permettono l’invocazione di FormActionHandler.
Inoltre, non essendo possibile persistere le classi Form, non è necessario consentire preview di tipo update, che nel caso di servizi generici si ottengono valorizzando il campo _id
nella relativa mutation: se si effettua una chiamata con tale campo valorizzato viene restituito un errore di tipo MALFORMED_REQUEST
.
Componenti interessati: API GraphQL
GraphQL: miglioramento significativo delle prestazioni per chiamate complesse
Lavorando sulle operazioni di merge a carico del Runtime Query Generator, ed effettuando ulteriori interventi sulla modellazione, è stato possibile ridurre i tempi di esecuzione di chiamate GraphQL molto complesse da 8 secondi fino a circa 2 secondi.
Componenti interessati: API GraphQL, Engine Framework (Runtime Query Generator)
Fix sparizione degli oggetti part creati con l’esecuzione di ListActionHandler
Creando oggetti part attraverso l’esecuzione di un ListActionHandler, per poi entrare in modifica sui suddetti senza persistere i cambiamenti, si notava la sparizione del part appena creato. Ciò era dovuto al fatto che l’esecuzione del ListActionHandler non rispettava le condizioni necessarie ad attivare una logica di persistenza in memoria per gli eventuali oggetti creati.
Componenti interessati: Engine Framework
Application management
Nuovo pannello di configurazione del Single Sign-On per le Cloudlet
È stato aggiunto un apposito pannello nella schermata di configurazione della Cloudlet, che permette di abilitare e configurare il meccanismo SSO (Single Sign-On), senza dover agire manualmente sul database.
Il pannello è raggiungibile dal Cloudlet menu
(), selezionando l’opzione Configure...
e accedendo alla scheda SSO
della finestra di dialogo mostrata.
Il contenuto prevede una casella di controllo che specifica se attivare o meno il meccanismo, e un campo testuale per il JSON che servirà da configurazione.
Componenti interessati: Dashboard Client, Dashboard Servant
Miglioramento messaggio di errore relativo al superamento del limite di LCP generabili
Nel caso in cui venga effettuata la start di una Cloudlet e che sia necessario generare un numero di LCP superiore al quantitativo residuo, viene ora mostrato un messaggio di errore che indica di quanto è stato superato il limite consentito. Questo permetterà all’utente di rivedere la complessità del modello che intende generare per tentare di riportare il conteggio degli LCP necessari sotto il limite.
Componenti interessati: Dashboard Client, Dashboard Servant
Fix errore 403 sollevato dopo la scadenza della sessione Dashboard
È stato risolto un problema che portava al sollevamento di un errore 403 (Forbidden)
, a seguito della scadenza di una sessione nella Dashboard. La causa è stata individuata nella perdita del comportamento di redirect alla schermata di login, prima gestito da un CAS (Central Authentication Service): l’errore è scomparso dopo il recupero e il reinserimento di tale comportamento.
Componenti interessati: Dashboard Client, Dashboard Servant
Fix impossibilità di effettuare il login a causa di problemi di sincronizzazione tra Dashboard Database e Hosting Servant
In presenza di problemi di sincronizzazione tra Dashboard Database e Hosting Servant, in particolare se il primo segnalava la presenza di una Cloudlet non registrata nel secondo, il login dell’utente veniva completamente negato e veniva sollevato un errore. Questo problema è stato risolto eliminando l’errore e marcando le Cloudlet assenti nell’Hosting Servant come irraggiungibili (unreachable
).
Componenti interessati: Dashboard Database, Hosting Servant
Migrazione delle funzionalità di gestione subscription dal portale alla Dashboard
Le funzionalità di visualizzazione della subscription e modifica del limite mensile di LCP sono state migrate dal vecchio portale Livebase alla Dashboard, in previsione della dismissione del primo.
Queste funzionalità sono ora accessibili facendo clic sul proprio nome utente in alto a destra, nella schermata principale della Dashboard.
Componenti interessati: Dashboard Client, Dashboard Servant
Eliminazione dell’intervento del CAS nel login alla Dashboard
Il CAS (Central Authentication Service), ovvero il componente che permetteva di realizzare il Single Sign-On tra il portale Livebase e la Dashboard, è stato rimosso dalle procedure di login su quest’ultima, in quanto il portale è in dismissione.
Componenti interessati: Dashboard Client, Dashboard Servant
Release 5.11.2 #
Model design & management
Avviso di perdita di dati in seguito alla sostituzione di un engine in presenza di un database originato da versione MODIFIED
Nel caso in cui il modellatore installi su una Cloudlet un modello, quando il relativo database fa riferimento a una versione del medesimo in stato MODIFIED
, viene ora mostrato un messaggio che avvisa di una possibile perdita dei dati memorizzati.
Ciò è fatto per notificare l’utente di un problema a carico del meccanismo di allineamento, per cui la rinominazione di una classe viene talvolta effettuata cancellando e ricreando la relativa tabella.
Componenti interessati: Dashboard Client, Dashboard Servant
Migliorato il comando Find unused model elements
La funzionalità Find unused model elements, che permette di individuare e rimuovere tutti gli elementi del modello non utilizzati, è stata migliorata come segue:
- è stata aggiunta la possibilità di eliminare solo alcuni degli elementi individuati, selezionandoli e facendo clic sul pulsante
Delete selected
; - per modelli di grandi dimensioni, viene mostrata una barra di avanzamento per il processo di eliminazione, che fornisce anche la possibilità di annullare l’operazione in ogni momento.
Componenti interessati: Designer
Fix eliminazione di modelli in presenza di sub-account
Risolto un problema per cui, eliminando un modello appena creato, veniva erroneamente mostrato un messaggio che indicava l’inesistenza di tale modello; l’errore scompariva dopo aver chiuso la finestra di dialogo.
La causa è stata individuata nelle politiche di lock e unlock: ogni operazione effettuata su un modello acquisiva inizialmente un lock sull’oggetto coinvolto per poi rilasciarlo una volta conclusa. Nel caso di un’eliminazione, l’oggetto coinvolto non è più presente al termine dell’operazione; ciò rendeva impossibile rilasciare il lock e causava l’errore sopra citato.
Componenti interessati: Dashboard
Fix mancato aggiornamento della versione di tutte le repliche di un modello archiviato
Risolto un problema per cui, archiviando un modello il cui engine è in stato MODIFIED
, veniva unicamente aggiornata la versione di quella particolare replica; eventuali altre repliche installate su Cloudlet differenti continuavano a mostrare la versione precedente o la dicitura MODIFIED
.
Componenti interessati: Dashboard Client, Dashboard Servant
Fix incremento indesiderato nel primo numero della versione del modello dopo l’aggiunta di relazioni che coinvolgono classi Form
Risolto un errore concettuale che determinava l’aumento del major number della versione di un modello anche se erano aggiunte relazioni tra classi Form.
Il major number viene aggiornato a seguito di modifiche alla struttura del database della Cloudlet. Aggiungere relazioni tra classi Form non richiede di modificare questa struttura, perciò è più appropriato incrementare il minor number.
Questa correzione determina anche un aumento delle performance di build, in quanto l’incremento del major number attiva una serie di computazioni di aggiornamento e di verifica della struttura che possono risultare superflue, nel caso in cui questa non abbia subito modifiche significative.
Componenti interessati: Dashboard Client, DashboardServant
Rimosso supporto al comando Set as current
per versioni di modelli archiviati
Per prevenire bug di difficile soluzione causati dal branching delle versioni dei modelli, è stato deciso di impedire, per modelli archiviati, di impostare una delle loro versioni come corrente. Di conseguenza, non è più presente il pulsante Set as current
nel pannello di gestione delle versioni (richiamabile selezionando l’opzione Versions...
nel menu contestuale del modello archiviato); inoltre, per tutti i modelli già presenti in produzione è stata settata l’ultima versione archiviata.
Componenti interessati: Dashboard Client, Dashboard Servant
Application generation & deployment
Aggiunto supporto alla validazione contestuale dei dati presenti nelle classi Form usate in input per FormActionHandler
Nel caso in cui un FormActionHandler sia invocato tramite le API GraphQL, e che a esso venga passata un’istanza di classe Form come insieme di parametri, il framework esegue una validazione contestuale di tali parametri in funzione dei vincoli dichiarati sul modello.
Questo intervento semplifica la scrittura del codice del Plugin, in quanto non richiede più allo sviluppatore di gestire manualmente la validazione dell’input.
Componenti interessati: Engine Framework
Fix conflitto tra API GraphQL personalizzate e di sistema
Risolto un problema relativo all’uso di API GraphQL personalizzate (definite come CloudletRestletPlugin
), che venivano oscurate da quelle di sistema offerte dalla Cloudlet.
Ciò era dovuto alle modalità con cui venivano esposte le GraphQL di sistema e quelle personalizzate: era generata un’unica risorsa Restlet che portava le API a condividere la porzione di URL auth/api/graphql
, determinando una collisione risolta con una strategia first match. La soluzione è consistita nell’adozione di una strategia best match e nella generazione di una risorsa per ogni applicazione della Cloudlet.
Componenti interessati: Engine Framework, API GraphQL
GraphQL: Fix mancata valorizzazione di ruoli di classi Form di input per l’esecuzione di FormActionHandler
È stato risolto un problema che determinava la non valorizzazione dei ruoli (sia delle associazioni sia delle composizioni) delle classi Form, quando queste erano usate come parametri di input per i servizi GraphQL che permettono di invocare i FormActionHandler.
Ciò era dovuto alla routine di pre-processamento dei parametri, che non costruiva ricorsivamente le catene di oggetti associati se il servizio GraphQL riceveva una classe Form.
Componenti interessati: API GraphQL
Fix case sensitivity nel nome degli endpoint GraphQL nel pannello API & Public URLs
Il pannello informativo della Cloudlet API & Public URLs è stato corretto perché rispetti il case (maiuscolo o minuscolo) dei nomi delle viste applicative di riferimento per ciascun endpoint GraphQL. Ad esempio, se il nome di una vista è Test, l’endpoint GraphQL corretto è <CloudletUrl>/auth/api/graphql/Test
.
Componenti interessati: Dashboard Servant
GraphQL: Rimosso il vincolo required per il parametro data
nei servizi di invocazione dei FormActionHandler
Nello schema GraphQL generato, è stato rimosso il vincolo required (simbolo !
) prima imposto sul parametro data
nei servizi per l’invocazione dei FormActionHandler (maggiori informazioni disponibili qui). Il parametro in questione era in precedenza obbligatorio pur essendo di tipo draft e quindi con tutti i campi opzionali, il che consentiva di passare un oggetto vuoto (data: {}
), ma essendo il campo obbligatorio non era possibile non passarlo completamente. Avendo rimosso il vincolo required, ora è invece possibile non passare affatto il campo, con il risultato analogo di passare un data
vuoto.
Componenti interessati: API GraphQL
Application management
Migliore naming di default per il .jar SPI
Per semplificare la catalogazione delle versioni delle SPI in rapporto all’evoluzione del modello di riferimento, sono state ripensate le politiche di naming per il file .jar contenente le interfacce SPI di una Cloudlet, scaricabile dal pannello dei Plugin.
Il nome del file .jar segue ora le seguenti regole:
- se il modello installato sulla Cloudlet è archiviato in libreria con la stessa versione, il nome avrà la forma
<ModelName>_<VersionNumber>_spi.jar
; - se il modello è archiviato in libreria, ma è installata una versione superiore, il nome avrà la forma
<ModelName>_<VersionNumber>_modified_spi.jar
; - se il modello non è archiviato in libreria, il nome avrà la forma
<ModelName>_<SaveTimestamp>_spi.jar
.
<VersionNumber>
è il numero di versione del modello con i tre numeri separati da underscore invece che dal punto (ad es. 1_0_0
al posto di 1.0.0
). <SaveTimestamp>
rappresenta la data e l’ora (timestamp) dell’ultimo salvataggio del modello; i caratteri di separazione sono ancora sostituiti da underscore (es. per il timestamp 12/10/2020 13:14
si avrebbe 12_10_2020_13_14
).
Componenti interessati: Dashboard Client, Dashboard Servant
Release 5.11.1 #
Model design & management
Fix generazione incorretta di query SQL da GraphQL a causa del controllo di univocità dei ruoli
Eseguendo una chiamata GraphQL che coinvolge associazioni con ruoli aventi lo stesso nome, specialmente tra classi regolari e classi Form, si verificava un problema per cui venivano generate query SQL su campi non voluti, portando alla restituzione di risultati inattesi.
Ciò era dovuto al fatto che le operazioni di disambiguazione dei ruoli ignoravano il nome della classe a cui il ruolo si riferiva, ovvero la classe presso cui è presente il “pallino” del ruolo nel Designer. I controlli sono quindi stati irrobustiti al riguardo considerando anche i ruoli cosiddetti “non validi”, ovvero quelli definiti dal sistema ma non editabili dall’utente per la mancanza del relativo pallino, come ad esempio quelli che puntano a classi Form. Per questi ruoli è stata inoltre definita la convenzione di aggiungere un doppio underscore all’inizio del loro nome, per evitare di introdurre ambiguità indesiderate con i ruoli definiti dall’utente.
Componenti interessati: Model
Release 5.11 #
Model design & management
Fix al meccanismo di modifica delle cardinalità per le relazioni incidenti su classi versionate
È stato individuato un problema per cui, se la cardinalità di un ruolo uscente da una classe sottoposta a versioning era modificata da 0N
a 1
, il Designer segnalava una low issue proponendo la risoluzione automatica, ma a seguito della conferma dell’operazione veniva sollevato un errore generico.
Ciò era dovuto alle operazioni eseguite sul database a causa della restrizione della cardinalità: la generazione di una colonna di associazione NOT NULL
rendeva inconsistente lo storico delle versioni della classe in questione.
Si è pertanto deciso di rivedere il meccanismo delle issue relative al versionamento, nel caso particolare in cui una classe versionata e una non versionata sono unite da una relazione bidirezionale non vincolata (con cardinalità 0N
per entrambi i ruoli):
- restringere a
1
il ruolo uscente dalla classe versionata solleva una high issue, per il motivo di cui sopra; - restringere a
01
il ruolo uscente è permesso, in quanto la colonna di associazione sarebbe nullabile e non introdurrebbe rischi di inconsistenza nello storico; - aumentare la cardinalità minima del ruolo uscente è permesso, in quanto si avrebbe una tabella di relazione che attualmente non si sottopone al versioning;
- restringere a
01
il ruolo entrante nella classe versionata è permesso, almeno finché anche l’altra classe non viene versionata.
Componenti interessati: Database Checker
Application generation & deployment
Nuova funzionalità: tabelle di supporto ai plugin
È stata introdotta la possibilità di definire particolari tabelle nel database delle Cloudlet, il cui unico scopo è fornire supporto all’operatività dei plugin sviluppati dai clienti Livebase. Queste tabelle, alle quali è stato riservato il prefisso @ext@
, non sono supportate dalle operazioni della dashboard. In generale, saranno ignorate da qualsiasi aspetto di Livebase che non sia il codice prodotto dai clienti.
Le tabelle @ext@
non possono inoltre relazionarsi con tabelle del modello (se non con relazioni lasche), per non interferire con l’operatività della cloudlet a livello delle operazioni CRUD.
Dettaglio: Esempio d’uso
Componenti interessati: Cloudlet Database
Nuovo costrutto SPI: interfaccia per notifiche SMS
È stata introdotta l’interfaccia SpiCloudletSMSSender
, la quale permette di realizzare servizi di notifica via SMS attraverso i plugin Livebase.
Il framework non fornisce un’implementazione per l’interfaccia, per cui lo sviluppatore che intende utilizzarla deve realizzare una classe implementativa e decorarla con l’annotazione @CloudletSMSSender
. Questo permetterà al framework di effettuare il binding dell’implementazione in maniera dinamica, e consentirà l’iniezione di SpiCloudletSMSSender
in tutti i plugin che la richiedono.
public interface SpiCloudletSMSSender {
void sendSMS(SMSMessage message);
}
Componenti interessati: SPI Plugin
Nuovo costrutto SPI: interfaccia SpiCloudletPluginActivator
Le API per lo sviluppo di plugin comprendono ora l’interfaccia SpiCloudletPluginActivator
, la quale permette di aggiungere logica personalizzata in concomitanza con le operazioni di start e stop dell’intero .jar
del plugin.
public interface SpiCloudletPluginActivator {
void start();
void stop();
}
Componenti interessati: SPI Plugin
Aggiunto supporto all’esposizione di risorse REST pubbliche senza autenticazione
Usando i plugin Restlet (CloudletRestletPlugin), è ora possibile esporre risorse REST personalizzate di tipo pubblico, ovvero che non richiedono autenticazione.
L’esposizione delle risorse pubbliche si ottiene agendo sul valore di ritorno di getType()
, metodo astratto della classe RestletServletResource
da cui derivano tutte le classi dei plugin Restlet:
public RestletServerResourceType getType()
La enum RestletServletResourceType
ammette a questo proposito i due nuovi valori PUBLIC_EXT
e PUBLIC_GRAPHQL
.
Le risorse create senza autenticazione saranno rese disponibili su URL del tipo <CloudletUrl>/public/api/ext/<ResourceUrl>
, a differenza delle risorse autenticate che invece sono disponibili su URL come <CloudletUrl>/auth/api/ext/<ResourceUrl>
.
Componenti interessati: Cloudlet SPI, Engine Framework, Engine Builder
Miglioramento del supporto alla rinominazione di classi e membri con versionamento nell’allineamento dei database
Precedentemente, rinominare una classe o un membro con versionamento forzava il database a ricreare le relative strutture (i.e. tabelle e colonne), facendo perdere lo storico delle versioni. Questa logica è stata migliorata per fornire un supporto completo alla rinominazione evitando la perdita di dati.
Componenti interessati: Database Checker
Fix fallimento nella generazione in presenza di una classe con nome Report
nel modello
È stato risolto un problema che portava a un fallimento dell’operazione di generazione delle Cloudlet, qualora nel modello fosse presente una classe denominata Report
. La presenza di questa classe, infatti, faceva sì che l’Engine Builder costruisse internamente due interfacce con lo stesso nome, sollevando un errore di compilazione.
Componenti interessati: Engine Builder
Fix falso positivo nella violazione delle cardinalità per i part a 1
modificati dai servizi generici save
e preview
È stato risolto un problema per cui, utilizzando i servizi GraphQL generici esposti per le varie classi (query di tipo preview e mutation di tipo save), non potevano essere applicate modifiche ai part con cardinalità pari a 1
. Veniva infatti creato un nuovo part che causava violazioni di cardinalità.
Componenti interessati: API GraphQL
Application management
Miglioramento del riutilizzo delle Cloudlet già generate durante l’operazione di Start
L’operazione di Start delle Cloudlet prevede un’ottimizzazione che, in fase di deploy di un engine, permette di riciclare l’engine già costruito per la nuova Cloudlet, anche se questa è ospitata su un diverso Hosting Server. In quest’eventualità, infatti, si verifica un handover diretto dell’engine tra un server e l’altro.
Precedentemente, se i due server non riuscivano a comunicare, veniva sollevato un errore, ma questo comportamento è stato risolto grazie al Dashboard Servant, che può ora fungere da ponte tra i due server per permettere comunque il completamento dell’handover.
Componenti interessati: Dashboard Servant
Fix contatore LCP nascosto nel caso di totale utilizzato pari a 0
Sono state apportate delle modifiche per mostrare sempre il contatore degli LCP utilizzati nella parte inferiore della scheda Cloudlets
, anche quando il quantitativo (specialmente a inizio mese) è pari a 0.
Componenti interessati: Dashboard
Rimozione della possibilità di effettuare download/upload di file .mdb
Le Cloudlet non consentono più di effettuare download e upload del proprio database attraverso dump in formato .mdb
(Microsoft Access).
Componenti interessati: Dashboard, Dashboard Servant
Rimozione della possibilità di archiviazione per engine modificati di vecchie versioni di modelli in libreria
Qualora una Cloudlet abbia un engine (anche MODIFIED
) costruito su un modello la cui versione è più vecchia di quella nella libreria, non è più possibile effettuarne l’archiviazione.
Come esempio, consideriamo una Cloudlet con un engine MODIFIED
il cui modello è alla versione 2.0.0
. Se in libreria lo stesso engine è stato aggiornato ad una versione superiore, come 4.0.0
, trascinare il modello dalla Cloudlet alla libreria per effettuarne un’archiviazione mostrerà ora un errore, invece di generare una nuova versione e settarla come attuale.
Componenti interessati: Dashboard, DashboardServant
Release 5.10.3 #
Model design & management
Miglioramento della finestra di dialogo per il system versioning
Nel Designer Livebase, sono stati effettuati i seguenti interventi a carico della finestra di dialogo relativa all’operazione di abilitazione del system versioning:
- è stata temporaneamente sospesa la possibilità di modificare manualmente i membri da sottoporre a versioning, attraverso la rimozione delle checkbox relative accanto a ciascuno di essi. La finestra di dialogo assume quindi una funzione di recap dei membri storicizzati, il cui nome è mostrato in grassetto;
- se non è possibile sottoporre a versioning un determinato ruolo di relazione, è presente una descrizione del motivo, corredata di un link se è possibile farlo abilitando il versioning nella classe opposta;
- nel caso di relazioni riflessive è mostrato solo il ruolo sorgente.
Componenti interessati: Designer
Rimossa la possibilità di impostare valori di default per gli attributi di piattaforma
È stata rimossa la possibilità di impostare valori di default per gli attributi di piattaforma (Platform attribute).
Componenti interessati: Model, Designer
Application generation & deployment
Nuovi endpoint per controllo dei lock e health check
Sono stati aggiunti due endpoint amministrativi alle Cloudlet generate, i cui URL sono visionabili aprendo la schermata Administration Services
nel client GWT. Il primo endpoint prevede l’accesso al registro dei lock attivi sugli oggetti; il secondo esegue l’interrogazione di un servizio di health check.
Componenti interessati: Cloudlet Framework
Fix visualizzazione del campo Team
nella form degli User
È stato risolto un problema per cui, usando il client GWT per modificare gli User di una certa Cloudlet, compariva il seguente valore in corrispondenza del campo Team
: {"value":"admin","computedValue":""}
. La causa è stata individuata nelle tracce delle vecchie API REST che sono in corso di rimozione.
Componenti interessati: Engine Framework (GUI)
GraphQL: Fix relativi all’utilizzo di filtri e cursori definiti su campi temporali formattati con il nome del mese
Sono stati risolti diversi problemi legati all’utilizzo di filtri e cursori, relativamente a campi temporali (Date e Datetime) formattati con un pattern comprendente il nome del mese (MMM
o MMMM
in notazione Java):
- una query comprendente solo il filtro, con l’effetto di memorizzare un cursore in un’apposita variabile, restituiva una risposta con
totalCount
inconsistente rispetto alla dimensione del risultato; - riutilizzare un cursore restituito in una query precedente produceva risposte con campo
items
vuoto.
Questi problemi erano dovuti alla mancanza di supporto per la localizzazione in italiano da parte delle funzioni adoperate per formattare i campi temporali; esse accettavano infatti la sola localizzazione in inglese e sollevavano delle eccezioni non visibili, che producevano risultati incongruenti.
Componenti interessati: API GraphQL
GraphQL: Fix totalCount
pari a 0 con la selezione di un attributo file in una pagina di oggetti associati
È stato risolto il seguente problema: richiedendo tramite una query getPage
gli attributi di un particolare oggetto e quelli degli oggetti associati, se questi ultimi comprendevano attributi di tipo file, veniva restituita una risposta comprendente un valore di totalCount
pari a 0.
Il problema era dovuto ad un errore in una logica particolare, che effettua una riscrittura della risposta GraphQL in presenza di attributi non mappati direttamente sul database, quali l’attributo file. Questa logica ignorava l’attributo speciale totalCount
, che veniva così assegnato a null
e poi tradotto in un valore 0 nei successivi processamenti.
Componenti interessati: API GraphQL
Application management
Nuova funzionalità: controllo dei dati di abbonamento (subscription) per gli utenti Livebase
Livebase effettua ora controlli sui dati di abbonamento (ovvero le subscription) per ciascun utente. In particolare, se l’utente ha sottoscritto un abbonamento mensile, per cui è previsto un limite di LCP (Livebase Complexity Points) generabile attraverso build per ogni periodo di fatturazione, egli non sarà più in grado di avviare nessuna Cloudlet che superi tale limite con la relativa build propedeutica.
Dettaglio: Scenario d’esempio
La dashboard mostra inoltre all’utente il quantitativo di LCP utilizzato e quello massimo per il mese, attraverso un opportuno indicatore nella parte inferiore della scheda Cloudlets
.
Infine, per evitare risultati inconsistenti nel controllo dei limiti di LCP a causa di start concorrenti, è stato aggiunto un controllo che impedisce l’avvio contemporaneo di più di una Cloudlet se l’utente ha un limite mensile.
Componenti interessati: Dashboard, Dashboard Servant, Dashboard Database
Miglioramento del controllo di concorrenza distribuito con l’introduzione di Hazelcast Client
È stato introdotto Hazelcast Client all’interno dell’Engine Framework, allo scopo di gestire il controllo di concorrenza in ambiente distribuito. Può essere abilitato con un’opportuna configurazione per tutte le cloudlet ridondate e distribuite.
Componenti interessati: Engine Framework
Miglioramento sistema di notifiche: introdotta notifica di perdita dei dati storicizzati in caso di operazioni sul database
Per le operazioni di download, backup, clone e drag & drop relative ai database è stato aggiunto un meccanismo di notifica che, nel caso in cui sia abilitato il system versioning su almeno una classe del modello, avverte l’utente che solo l’ultima versione di tutti gli oggetti sarà esportata o replicata.
Dettaglio: Messaggi
Componenti interessati: Dashboard Client, Dashboard Servant
Fix impossibilità di effettuare login sulla Dashboard
È stato risolto un problema che impediva il login nella Dashboard, a causa di inesattezze durante il processo di serializzazione delle eccezioni.
Componenti interessati: Dashboard Servant, Hosting Servant
Release 5.10.2 #
Model design & management
Fix algoritmo del calcolo degli LCP in particolari scenari
Sono stati risolti alcuni problemi nell’algoritmo per il calcolo degli LCP nei seguenti scenari:
- Trasformazione di una composizione: se una composizione viene trasformata in un’associazione filtrata (facente uso di un selection path), si verifica un’eccezione in fase di comparazione dei filtri tra le versioni, in quanto questi non sono supportati dalle composizioni;
- Modifica del tipo di attributo: se un attributo viene rimosso e poi creato nuovamente, ma con un tipo che possiede un dominio diverso (come nel caso del passaggio da
Integer
aDate
), si verifica un’eccezione dovuta all’impossibilità di comparare i domini degli attributi tra le versioni.
Componenti interessati: Designer
Application generation & deployment
Nuovo comando per effettuare il rebuild delle sole API GraphQL
È stata aggiunta una funzionalità che permette di effettuare il rebuild delle sole API GraphQL. Precedentemente era necessario eseguire il rebuild di tutta la Cloudlet.
La funzionalità è presente come opzione nel menu a tendina (pulsante nell’angolo inferiore destro del riquadro della Cloudlet):
Componenti interessati: Dashboard Client, Dashboard Servant
Fix inesattezze nella compilazione dei parametri per query su ruoli
È stato risolto un problema per cui i parametri relativi alle classi Profile, Singleton e Enum non venivano correttamente popolati quando venivano effettuate query su ruoli (associati e associabili). Per effetto di questo problema venivano restituiti risultati differenti a seguito del passaggio delle options
nelle query di paginazione riferite ai ruoli.
Componenti interessati: Engine Framework (Runtime Query Generator)
Fix segnalazioni di errori inaspettati dovuti all’utilizzo multiplo di __System.datetime
nella stessa query
È stato risolto un problema per cui il parametro __System.datetime
, se usato più volte all’interno della stessa query, causava degli errori inaspettati.
Ciò era dovuto a un controllo di consistenza all’interno del RuntimeQueryGenerator, che verifica che uno stesso token non abbia più di un valore assegnato nella fase di parsing e costruzione della relativa query SQL. Poiché __System.datetime
rappresenta il timestamp di sistema, che per natura assume valori diversi continuamente, nel momento in cui esso veniva usato come token si verificavano dei falsi positivi.
E’ stato dunque modificato il comportamento di questo controllo in modo che non sollevi eccezioni se __System.datetime
è usato più volte.
Componenti interessati: Engine Framework (Runtime Query Generator)
Fix mancato rilascio del lock applicativo su un oggetto a seguito del fallimento di un FormActionHandler.
È stato risolto un problema per cui un FormActionHandler non rilasciava i lock acquisiti sugli oggetti influenzati se la sua esecuzione falliva. Questo causava conseguenti problemi di concorrenza che impedivano l’accesso a quegli oggetti da parte di altre sessioni.
Componenti interessati: Engine Framework, Cloudlet
Modifica di funzionalità: rebuild non più permesso se la cloudlet non è aggiornata
È stato modificato il comportamento dell’opzione Rebuild & start
presente nel menu contestuale della Cloudlet: se l’engine necessita di un upgrade, non è possibile rigenerare e avviare la Cloudlet.
Componenti interessati: Dashboard Client, Dashboard Servant
Application management
Nuova funzionalità: switch per abilitare/disabilitare le GraphQL in una cloudlet
È stato aggiunto uno switch che permette di attivare o disattivare le GraphQL in una Cloudlet. Precedentemente questo era possibile solo tramite il database.
È possibile trovare questo switch nel pannello API della Cloudlet (fare clic sul pulsante a forma di spina elettrica, nell’angolo superiore destro del riquadro della Cloudlet), come mostrato nella seguente figura:
Componenti interessati: Dashboard Client, Dashboard Servant
Miglioramento della robustezza dell’operazione di avvio Cloudlet relativamente ai fallimenti del calcolo degli LCP
Precedentemente, un fallimento del sistema di calcolo degli LCP causava anche un fallimento dell’operazione di avvio della relativa Cloudlet.
Considerando che il calcolo degli LCP è un’operazione di fatturazione, non strettamente legata all’operatività di Livebase, si è deciso di consentire comunque l’avvio della Cloudlet in presenza di questo tipo di errori, effettuando il log dell’operazione all’interno del Dashboard Database in modo che possano essere presi in carico dal team di sviluppo.
Componenti interessati: Dashboard Client, Dashboard Servant
Rimozione pattern temporale mm/dd/yyyy
dall’elenco di pattern ammissibili per l’importazione attraverso fogli Excel
A causa di alcune ambiguità nell’importazione di attributi che rappresentano informazioni temporali, in particolare date
e datetime
, è stato temporaneamente rimosso il supporto al pattern mm/dd/yyyy
usato nei paesi anglofoni.
Commento degli sviluppatori
Componenti interessati: Excel Importer
Rimozione della funzionalità di drag & drop del modello in una Cloudlet running
È stata rimossa la possibilità di effettuare il drag & drop di un modello in libreria all’interno di una Cloudlet running, considerata ridondante e soggetta a errori.
Componenti interessati: Dashboard Client, Dashboard Servant
Release 5.10.1 #
Model design & management
Fix stato di abilitazione anomalo per le classi Form part
Le classi Form, non avendo un class role, hanno uno stato di abilitazione che dipende unicamente dal ruolo attraverso cui sono puntate. È stato risolto un problema per cui, se tali classi costituivano i part di una composizione, risultavano disabilitate anche se il relativo ruolo era abilitato.
Componenti interessati: Designer
Fix problema di salvataggio modelli per charset incompatibili
È stato risolto un problema che provocava il lancio di un’eccezione, qualora veniva salvato un modello avente nella propria rappresentazione caratteri non compresi nel charset latin1
. La soluzione è consistita nel predisporre il sistema per adottare in ogni circostanza il charset utf8
.
Componenti interessati: Dashboard Servant
Application generation & deployment
GraphQL: Fix dei conflitti tra Livebase e Keycloak relativamente a CORS
Sono stati risolti dei problemi dovuti al meccanismo CORS (Cross-Origin Resource Sharing), nel caso in cui per una certa cloudlet sia abilitato l’SSO (Single Sign-On) attraverso Keycloak. Si ha infatti che sia Livebase sia Keycloak prevedono un filtro CORS, i quali attivandosi contemporaneamente a valle di una richiesta facevano sì che il server fornisse risposte di preflight inconsistenti, generando dei falsi negativi nell’autorizzazione di un ipotetico client. La soluzione è consistita nel modificare questa logica, impedendo l’attivazione del filtro CORS di Livebase qualora l’SSO sia abilitato per una certa Cloudlet.
Componenti interessati: Cloudlet Framework
GraphQL: Fix bug di generazione delle query SQL relativo alla conversione dei parametri delle window functions
È stato risolto un problema dovuto a imprecisioni nella conversione dei parametri limit
e next
, utilizzati per la paginazione in GraphQL (per mezzo di una funzionalità chiamata window functions), nei loro equivalenti SQL limit
e offset
, che produceva risultati inconsistenti.
Componenti interessati: Engine Framework (Runtime Query Generator)
Application management
Miglioramento label del conteggio LCP
La label di informazione sugli LCP da addebitare per il ciclo di fatturazione attuale è stata corretta: è stato sostituito il termine generated
con charged
.
Componenti interessati: Dashboard Client
Miglioramenti al foglio excel di fatturazione e ai relativi meccanismi
Sono stati eseguiti i seguenti interventi sul sistema di fatturazione degli LCP e sul relativo file excel:
- è stato migliorato l’aspetto grafico del file, attraverso un refactor degli stili;
- per ogni modello che ha subito delle generazioni, è stato aggiunto un foglio che riporta tutti gli incrementi di LCP. Gli incrementi sono ordinati cronologicamente e per classe, intendendo per “ordine cronologico” dalla generazione del modello più vecchia a quella più recente;
- il formato delle descrizioni degli incrementi ha ora una struttura maggiormente discorsiva, rispetto a quello utilizzato nel Dashboard Client;
- per ovviare al fatto che il nome di un foglio non può superare i 31 caratteri, ad ogni modello è assegnato un progressivo nel foglio di
Overview
(es.M1
,M2
, ecc.). I fogli degli incrementi sono nominati di conseguenza; - considerando che la prima generazione ha incremento pari al peso, sono in questo caso elencati tutti gli elementi del modello fino ai 100 LCP.
Componenti interessati: Dashboard Servant
Rimossi duplicati dalla tabella model_change
La tabella model_change
conteneva svariati record duplicati, identificati come il residuo del problema risolto nel precedente rilascio, relativo alla mancata cancellazione dei ModelChanges
dopo la sostituzione dell’engine. I duplicati sono stati rimossi, ed è stato aggiunto un vincolo unique per scongiurare il verificarsi di un analogo problema nel futuro.
Componenti interessati: Dashboard Servant
Release 5.10 #
Model design & management
Migliore dialog di dettaglio degli LCP
Nella versione 5.5.3 sono stati introdotti gli LCP (Livebase Complexity Points) come punteggio per rappresentare la complessità dei modelli. Il punteggio del modello corrente è mostrato in basso a sinistra.
Sono state apportate diverse migliorie alla finestra di dettaglio degli LCP:
- modificato il titolo del pulsante da
Details
aDetails...
; - modificato il titolo della finestra in
LCP count details
; - rimosso il separatore verticale vicino al pulsante;
- il selettore per la modalità di raggruppamento del rapporto (schema o classi) è stato spostato accanto al pulsante
Export as XLSX
nell’angolo inferiore destro; - le due voci del suddetto selettore:
ClassBased
eSchemaBased
, sono state rispettivamente rinominate inGroup by class
eGroup by schema
.
Componenti interessati: Designer
Application generation & deployment
⚠️Importante⚠️: Prevista rimozione del codice deprecato nello SPI a partire da febbraio 2021
Da febbraio 2021 sarà rimosso dalla piattaforma il supporto al codice deprecato presente nello SPI. Nella documentazione javadoc generata per lo SPI sono sempre presenti i riferimenti al codice che va utilizzato al posto di quello deprecato; ad esempio, le strutture Entity
prendono il posto dei Bean
e gli Stub
sostituiscono i Mock
.
Dettaglio: codice SPI deprecato
Gli sviluppatori Livebase registrati hanno ricevuto una mail con allegata la procedura per l’aggiornamento dei plugin, ove necessario; tale procedura graduale è concepita per abbattere la possibilità di introdurre problematiche nelle applicazioni critiche.
Gli aggiornamenti non dovrebbero comportare più di qualche ora per plugin, che potranno essere pianificate con calma fino alla fine di gennaio, data oltre la quale non supporteremo più i servizi deprecati.
Componenti interessati: Engine Framework (SPI)
Nuovi servizi SPI per il test di ruoli part
Le classi stub incluse nello SPI (utili per il testing del codice dei Plugin) sono state arricchite con nuovi servizi che permettono di impostare il valore dei ruoli di tipo part; questi consentono di pre-popolare i ruoli delle classi whole, assegnando ID specifici agli oggetti part.
Dettaglio: esempio di implementazione
Componenti interessati: Engine Framework (SPI)
Migliore gestione del recupero di data/ora nell’applicazione generata
Negli scenari in cui il runtime Karaf (che ospita l’applicazione generata) e il DBMS (che ospita il database della Cloudlet) risiedono su server diversi, è possibile che la mancata sincronizzazione tra gli orologi dei due server introduca errori di runtime.
ad esempio, eseguendo più volte la stessa richiesta GraphQL di tipo Update, a distanza di poco tempo l’una dall’altra, il server sollevava il seguente errore di concorrenza:
Cannot update object <ObjectID> of <ClassName> because it was updated inside another session
Tutti i servizi relativi al recupero del current timestamp sono stati irrobustiti per evitare scenari d’errore come quello di sopra.
Componenti interessati: Engine Framework
GraphQL: fix risoluzione di attributi math dipendenti da query definite su Singleton
Le classi Singleton, introdotte nella versione 5.8, consentono di definire valori globali configurabili, utilizzabili dalle altre classi nelle espressioni math, WHERE e filtri senza doversi associare alla classe stessa. Un Singleton può avere relazioni verso altre classi e può quindi definire attributi di tipo query verso queste classi. Una classe <ClassName>
può quindi definire un’espressione math che referenzia uno o più attributi query definiti sul Singleton. La classe contenente questa math può essere inoltre target di relazioni a molti; in GraphQL, il ruolo a molti corrispondente ritorna un risultato paginato <ClassName>Page
, personalizzabile tramite l’input <ClassName>PageOptions>
(e relativi sotto-campi, tra cui <ClassName>Filter
).
Nello scenario di sopra, tuttavia, il server GraphQL non consentiva di usare un qualsiasi filtro, tra quelli basati sul suddetto attributo math, per filtrare il risultato paginato (ad esempio mathAttribute___eq: true
). Il server restituiva infatti il campo errors
contenente una Issue
di tipo SERVER_ERROR
.
L’errore è stato ricondotto a una NullPointerException
del RuntimeQueryGenerator nella risoluzione delle variabili nelle espressioni math; contestualmente alla risoluzione, sono stati irrobustiti i controlli sul passaggio dei parametri nelle espressioni math.
Commento degli sviluppatori
Componenti interessati: Engine Framework (RuntimeQueryGenerator), API GraphQL
GraphQL: fix risoluzione di filtri vuoti nelle <ClassName>PageOptions
Risolta un’eccezione nel server GraphQL per cui non era possibile inviare richieste contenenti <ClassName>PageOptions
in cui si richiedeva il campo filters
, ma senza specificare alcun valore (come consentito dallo schema, dato che l’input <ClassName>Filter
non ha campi obbligatori).
Il server ora effettua correttamente il parse e risolve richieste di questo tipo:
query {
Class1___getPage(options: {filter: {}})
}
Componenti interessati: API GraphQL
GraphQL: fix sovrascrittura delle informazioni insight in caso di query annidate
Risolto un problema per cui le informazioni di insight (richiedibili con l’argomento opzionale insight
disponibile per tutti i servizi generati) venivano sovrascritte nella risposta GraphQL in caso di query annidate.
Si verificavano così dei casi in cui venivano mostrate le insight solo per la query alla radice della richiesta, oppure non venivano mostrate affatto se l’argomento non era specificato nelle sotto-query. Il problema è stato risolto facendo in modo che l’argomento insight
agisca su tutto il sotto-albero della query; ovvero, se impostato alla radice sarà attivo per tutta la query.
Componenti interessati: API GraphQL
Fix risoluzione di attributi math con riferimenti ad altri attributi in forma estesa
Nelle espressioni definite su una classe è possibile far riferimento ad altri attributi della stessa classe in due modi:
- con la forma estesa:
ClassName.attributeName
; - con la forma abbreviata:
attributeName
.
È stato risolto un problema per cui riferimenti scritti nella forma estesa non venivano risolti correttamente dal RuntimeQueryGenerator.
Componenti interessati: Engine Framework (RuntimeQueryGenerator)
Fix conversione per attributi __id
tra i tipi Integer e BigInteger
È stato risolto un problema di conversione di tipi per cui, dopo l’assegnazione di valori oltre il range del tipo Integer per gli attributi __id
a seguito di un’importazione, veniva sollevata un’eccezione nel momento in cui essi erano richiesti tramite query GraphQL, anche se presenti in espressioni di attributi math. Il problema era legato alla sostituzione dell’attributo __id
con _id
in base alle convenzioni di GraphQL, che invalidava la logica di conversione tra Integer e BigInteger (tipo interno del database per gli ID dei record persistiti).
Un problema simile è stato riscontrato nella restituzione del seguente errore nella risposta GraphQL:
Can't serialize value (<GraphQLPath>/_id) : Expected type 'ID' but was 'BigInteger'.
dove <GraphQLPath>
è il percorso dell’endpoint GraphQL che è stato interrogato. In questo caso, l’errore dipendeva dall’uso di una versione precedente del runtime GraphQL, che non riconosce BigInteger come tipo compatibile per rappresentare un ID. È stato dunque richiesto un aggiornamento delle dipendenze e dei file di configurazione.
Commento degli sviluppatori
Componenti interessati: Engine Framework (QueryGenerator, RuntimeQueryGenerator), API GraphQL
Application management
Aggiunto riepilogo degli LCP generati nel mese corrente
In fondo alla scheda Cloudlets (accanto al bottone New cloudlet
) è stato aggiunto il riepilogo totale degli LCP generati nel mese corrente (TOT
LCP generated this month); questo conteggio è relativo agli LCP di tutti i modelli dell’account che sono stati impiegati almeno una volta nella generazione di applicazioni Livebase. Questo valore viene aggiornato ogni volta che viene rigenerata un’applicazione contestualmente all’avvio della sua Cloudlet.
Cliccando sulla cifra è possibile inoltre scaricare un report dettagliato in formato Excel (.xlsx). Questo riepilogo mostra gli incrementi di LCP per modello che hanno contribuito al totale degli LCP generati; per ciascun modello è inoltre incluso lo storico delle generazioni nel mese corrente (e relativi incrementi di LCP per generazione).
Componenti interessati: Dashboard Client
Fix proliferazione eccessiva di cambiamenti nell’engine di una Cloudlet
A seguito del rimpiazzo dell’engine di una Cloudlet attraverso un modello presente in libreria, i dati relativi ai cambiamenti subiti dal modello precedente (i ModelChanges) non venivano eliminati, e a questi si aggiungevano quelli generati dall’operazione di sostituzione. Questo portava a un’eccessiva proliferazione di ModelChanges che saturava inutilmente lo spazio del Dashboard Database.
Il problema si verificava in quanto la cancellazione dei ModelChanges veniva eseguita solo con la rimozione esplicita dell’engine; questa logica è stata ora inclusa anche nell’operazione di sostituzione.
Componenti interessati: Dashboard Servant
Import Excel: fix eccezione SQL Truncated Value non gestita
Risolto un problema per cui, tentando di importare record che presentano valori datetime che specificano millisecondi (informazione ancora non gestita da Livebase), veniva sollevato un errore generico anziché indirizzare al download del file Excel con le marcature.
Commento degli sviluppatori
Componenti interessati: Database Importer (ExcelImporter)
Import Excel: fix stato inconsistente della tabella @sys@idtable
in seguito all’importazione di un Reference Sheet
È stato riscontrato che, a seguito di importazioni successive, gli ID che venivano assegnati ai record risultavano non sequenziali; questo avveniva in particolare dopo l’importazione di Reference Sheet.
Il problema era dovuto a una gestione errata dell’aggiornamento della tabella @sys@idtable
del database, ovvero la tabella che tiene traccia del prossimo ID assegnabile, dovuta a discrepanze tra le diverse strategie di assegnazione degli ID implementate in Livebase. Il problema è stato quindi risolto allineando la strategia di assegnazione degli ID dell’Excel Importer alle altre già presenti.
Componenti interessati: Database Importer (ExcelImporter)
Fix falso messaggio di errore in seguito ad upload SQL terminato con successo
In seguito all’upload di un file SQL che esegue INSERT
di record aventi uno qualunque dei campi __createdBy
, __lastModifiedBy
e __ownedBy
vuoti, la Dashboard mostrava il seguente errore nonostante l’importazione si fosse conclusa correttamente:
Column '<EmptyByField>' cannot be null
Il problema era dovuto a un’errata gestione della generazione degli oggetti Singleton, che impostava queste colonne relative a metadati come stringa vuota (mentre nel database della Cloudlet le colonne dei metadati non possono essere nulle). Una successiva operazione di cleanup nel processo di importazione, avente il compito di impostare ogni valore vuoto a null
, violava questo vincolo per le colonne relative ai metadati della classe Singleton, scatenando l’eccezione.
La soluzione è consistita nella rimozione di questa operazione di cleanup e nella modifica della creazione dei Singleton, che ora riempie i campi di metadati con il valore system
.
Componenti interessati: Dashboard Client
Risolta impossibilità di avvio delle Cloudlet
Sono state risolte alcune eccezioni inattese, che rendevano impossibile l’avvio delle Cloudlet. È tuttavia ancora in atto un’analisi per irrobustire le operazioni correlate e ridurre la probabilità di occorrenza di questo errore in futuro.
Componenti interessati: Dashboard, Dashboard Servant
Rimossa operazione di fill del database
È stato rimosso il componente DatabaseFiller, responsabile della popolazione automatica di un Database con dati casuali. Di conseguenza, non è più contemplata l’operazione di fill e nella finestra di dettaglio del Database non è più presente il pulsante Fill
.
Componenti interessati: Dashboard Client, Dashboard Servant
Release 5.9.1 #
Model design & management
Fix disabilitazione di classi Form senza attributi
Risolto un problema che impediva la disabilitazione di una classe Form senza attributi; concettualmente, questo scenario è consentito (le classi Form sono le uniche classi a poter non avere attributi), tuttavia non era gestito correttamente dal Designer.
Componenti interessati: Designer (Application Schema)
Fix cambiamento dei permessi di default nel Permission Schema
Risolto un problema per cui, l’operazione alla voce Application permissions menu > Set permission on all classes
(raggiungibile facendo click destro su un Permission Schema) modificava, oltre ai grant di tutte le classi attualmente presenti, anche i loro default, con la conseguenza che tali default venivano considerati nelle successive modifiche puntuali dei grant su classi, attributi e relazioni.
Il comportamento del comando è stato corretto per non impattare i default (che ricordiamo possono essere modificati dal pannello Application permissions defaults
raggiungibile alla voce Application permissions menu > Default permissions on new elements...
).
Componenti interessati: Designer (Permission Schema)
Application generation & deployment
⚠️Importante⚠️: Prevista rimozione del codice deprecato nello SPI a partire da febbraio 2021
Da febbraio 2021 sarà rimosso dalla piattaforma il supporto al codice deprecato presente nello SPI. Nella documentazione javadoc generata per lo SPI sono sempre presenti i riferimenti al codice che va utilizzato al posto di quello deprecato; ad esempio, le strutture Entity
prendono il posto dei Bean
e gli Stub
sostituiscono i Mock
.
Dettaglio: codice SPI deprecato
Gli sviluppatori Livebase registrati hanno ricevuto una mail con allegata la procedura per l’aggiornamento dei plugin, ove necessario; tale procedura graduale è concepita per abbattere la possibilità di introdurre problematiche nelle applicazioni critiche.
Gli aggiornamenti non dovrebbero comportare più di qualche ora per plugin, che potranno essere pianificate con calma fino alla fine di gennaio, data oltre la quale non supporteremo più i servizi deprecati.
Componenti interessati: Engine Framework (SPI)
SPI: aggiunta la ImmutableEntitySession
al contesto dei DatabaseHandler con nuovo servizio per recuperare gli attributi modificati
È stato introdotto il servizio **getUpdatedAttributes**
alla ImmutableEntitySession
nello SPI statico che consente di recuperare, a partire dall’ID di una Entity, l’insieme di attributi nativi che sono stati modificati all’interno della sessione di lavoro. Se l’Entity è in creazione, il servizio restituisce tutti gli attributi nativi con valore diverso da null
; se è in modifica, restituisce gli attributi nativi che hanno un valore diverso da quello presente su database.
interface ImmutableEntitySession {
// ...
public Set<String> getUpdatedAttributes(EntityID id)
}
La ImmutableEntitySession
, gia disponibile nel contesto del ValidationHandler, è ora disponibile anche nel contesto di tutti i DatabaseHandler tramite il metodo getCloudletImmutableEntitySession()
.
Componenti interessati: Engine Framework (SPI)
SPI: aggiunto workaround nella EntitySession
per ignorare il controllo sullo stato di abilitazione di classi, attributi e ruoli
In previsione del passaggio pianificato dalle strutture deprecate (Bean
) alle nuove Entity
, è stato introdotto il metodo setDoNotThrowApplicationAccessForbiddenExceptionWorkaround
alla EntitySession
e alla ImmutableEntitySession
nello SPI statico, che consente di disabilitare il controllo sullo stato di abilitazione di ruoli e attributi delle Entity nel contesto della vista applicativa in cui è eseguito il codice del plugin.
Dettaglio: modifiche allo SPI statico
A differenza dei Bean, che possono accedere ad attributi e ruoli di una classe senza rispettare la visibilità degli stessi, le Entity devono sottostare alle regole di visibilità (manageability) definite negli Application Schema in cui i plugin sono utilizzati. Se si tenta di accedere a una classe, attributo o ruolo non gestito nella vista applicativa, il framework solleva una tra EntityAccessForbiddenException
o EntityAttributeAccessForbiddenException
o EntityRoleAccessForbiddenException
. Disabilitando questi controlli, è possibile far comportare le Entity come se fossero Bean.
Componenti interessati: SPI Plugin
SPI: supporto all’iniezione di ApplicationMetadata
negli Stub di Entity (testing)
È stata aggiunta la possibilità di istanziare gli Stub delle Entity (<EntityName>
) e delle ImmutableEntity (Immutable<EntityName>
) fornendo l’applicazione di riferimento, così da abilitare il controllo sullo stato di abilitazione di classi, attributi e ruoli anche all’interno dei test del codice dei Plugin.
A tale scopo, è stata introdotta nello SPI statico l’interfaccia ApplicationMetadata
, che consente di ottenere informazioni sulla manageability di classi, attributi e ruoli nel contesto della vista applicativa in cui è eseguito il codice del plugin. Questa è disponibile nella EntitySession
e nella ImmutableEntitySession
tramite il metodo getApplicationMetadata()
.
È possibile quindi iniettare l’applicazione negli Stub Stub<EntityName>
passando l’ApplicationMetadata
nel costruttore, così che queste classi di test possano eseguire i controlli sulla manageability allo stesso modo delle implementazioni delle Entity e delle ImmutableEntity di produzione.
Dettaglio: modifiche allo SPI statico
Componenti interessati: SPI Plugin
GraphQL: aggiunto il campo insight
al servizio per l’interrogazione di classi storicizzate (versioning)
È stato aggiunto il parametro insight
al servizio Query.<ClassName>__getVersion
per il recupero di versioni storiche delle classi storicizzate, introdotto nella versione 5.8.3. Questo parametro, già presente in tutti gli altri servizi GraphQL di lettura (inclusa la versione paginata Query.<ClassName>___getVersionPage
), permette di richiedere un dettaglio più o meno esaustivo (a seconda del valore scelto, tra LIGHT
e FULL
) sulle query SQL eseguite dal servizio. Se la query viene eseguita specificando insight
, la risposta, oltre al campo data
, conterrà il campo extensions
valorizzato.
La signature del nuovo servizio è:
enum InsightType {
FULL
LIGHT
}
type Query {
ClassName___getVersion(_id: ID!, atVersion: Datetime!, insight: InsightType): ClassName
}
Componenti interessati: API GraphQL
Client web: supporto alla navigazione dei ruoli anche in applicazioni dove tali classi non sono gestite
Nello scenario in cui una classe è disabilitata a livello di Application Schema (non è managed), ma sono abilitati eventuali ruoli entranti su essa, è ora possibile navigare questi ruoli dal client web dell’applicazione generata, ovvero è possibile aprire la form in sola lettura di tali oggetti. Lo stesso vale se la classe in questione è “spenta” (grigia) a livello di Profile Schema ma non lo sono i suoi ruoli entranti.
Questo case uniforma il comportamento tra il client web e le API GraphQL, in quanto GraphQL permette di navigare gli oggetti associati anche per classi “spente” nell’Application Schema o nel Profile Schema.
Componenti interessati: Engine Builder (client web)
GraphQL: fix gestione errata della timezone nel parametro di input atVersion
(versioning)
Risolto un problema per cui, in presenza di timezone custom sulla Cloudlet (non-GMT), il parametro di input atVersion
del servizio <ClassName>___getVersion
veniva considerato come Datetime GMT, a prescindere dalla timezone configurata sul server. Ora anche il parametro atVersion
è relativo alla timezone della Cloudlet. I valori dei campi Date ritornati in output continuano a rispettare la timezone custom (come corretto nella versione 5.8.3).
Componenti interessati: API GraphQL
GraphQL: fix versioni storiche duplicate in seguito a modifiche su oggetti di classi storicizzate (versioning)
Risolto un problema per cui, a seguito di una modifica su una classe storicizzata, venivano mostrate due versioni identiche. Questo era relativo a un comportamento non convenzionale di MariaDB, che invece di applicare un versionamento a un record (rappresentato dal valore della colonna row_start
) per ogni transazione lo fa invece per ogni statement. Le API GraphQL non tenevano conto di questa implicazione, per cui potevano mostrare valori incongruenti.
Nella versione 5.9, per lo stesso problema di MariaDB era stato corretto il recupero del totalCount
delle versioni, mentre in questo caso sono stati corretti i valori mostrati per ciascuna versione.
Componenti interessati: API GraphQL
GraphQL: fix fallimento nel recupero di attributi derivati di versioni storiche di oggetti (versioning)
Risolto un problema per cui il server GraphQL andava in errore quando si richiedeva di mostrare attributi derivati per versioni storiche di oggetti restituiti dai servizi Query.<ClassName>___getVersion
o Query.<ClassName>___getVersionPage
.
Componenti interessati: API GraphQL, Engine Framework (QueryGenerator)
Application management
Ottimizzazione delle operazioni di verifica del database della Cloudlet
A valle di operazioni di importazione dati sul database della Cloudlet da fonti esterne (file SQL o Excel), il Database Checker si occupa di verificare l’allineamento tra modello e database e segnalare eventuali inconsistenze, come ad esempio violazioni sulle cardinalità dei ruoli.
In precedenza, l’informazione sulle cardinalità effettive dei ruoli era contenuta nel Database Fingerprint, ma è stata rimossa nella versione 5.7.1 per motivi di performance. Pertanto, il Database Checker si rivolge all’Hosting Servant per recuperare queste informazioni e compararle con le cardinalità definite per ciascun ruolo del modello.
Prima dell’intervento, il Database Checker effettuava una singola chiamata per ciascun ruolo con la conseguenza che, al crescere del numero di relazioni nel modello, l’overhead introdotto dalle chiamate diventava un tempo importante.
Per risolvere questo problema di performance, le chiamate sono ora accorpate in un’unica chiamata tra Database Checker e Hosting Servant, il cui risultato viene salvato in memoria ed eliminato al termine della verifica.
Componenti interessati: Database Checker
Supporto per la creazione di utenti amministratori multipli in presenza di sub-account
Nella versione 5.9 è stato aggiunto il pulsante Create Admin
al pannello Members of cloudlet <CloudletName>
, abilitato solo se non erano presenti utenti con privilegi di amministratore (con attributo admin=true
).
La condizione è stata raffinata per consentire di creare più utenti amministratori se l’account della Dashboard ha dei sub-account, uno per ogni sub-account: il pulsante è quindi abilitato quando non esistono utenti con lo stesso username dell’account con cui si è autenticati sulla Dashboard.
Componenti interessati: Dashboard Client
Fix mancato aggiornamento del conteggio dei membri della Cloudlet dopo modifiche al database
Risolto un problema per cui, in seguito a modifiche al database della Cloudlet (attraverso le operazioni di creazione, copia o rimozione) che adesso comportano anche modifiche alla community, non venivano aggiornati i relativi descrittori; di conseguenza la Cloudlet riportava informazioni non aggiornate, come il conteggio degli utenti. Il problema era dovuto alla mancanza di un’operazione esplicita di refresh del Dashboard Servant.
Componenti interessati: Dashboard Servant
Release 5.9 #
Modeling language
Nuovo costrutto: la classe __User (e nuova gestione degli utenti della Cloudlet)
È ora disponibile una classe speciale che rappresenta un utente della Cloudlet: la classe __User. Si tratta di una classe di piattaforma le cui istanze corrispondono con gli attuali Cloudlet member e rappresenta pertanto la Community della Cloudlet all’interno del modello di un’applicazione. Questo nuovo costrutto porta con sé un ripensamento generale del modo con cui verranno gestite le utenze all’interno delle applicazioni Livebase. Il concetto stesso di utente diviene d’ora in poi parte del dominio ed è possibile pertanto espandere le informazioni di un Cloudlet member aggiungendo attributi e relazioni alla classe __User direttamente nel modello.
Modellazione della classe __User
Nel Designer è possibile abilitare la classe __User dalla voce Database menu > New platform class > User
oppure dal pulsante della palette(Create platform class User
). La classe __User ha di default i seguenti attributi, tutti di tipo string: username
, profile
e email
; oltre a questi, è possibile abilitare tutte le altre informazioni “statiche” relative al Cloudlet member (ad esempio firstName, lastName, etc…) mediante i predefined attributes selezionabili alla voce Class menu > new predefined attribute
. Per costruzione, non è possibile dichiarare vincoli unique o index su qualunque attributo di __User, né impostarli required; inoltre, alcuni attributi predefiniti (come profile
, language
, dateFormat
, etc…) hanno domini non modificabili nel modello e possono assumere solo i valori attualmente supportati da Livebase. Il valore dell’attributo profile
dipende invece dal nome di uno dei Profile Schema presenti nel modello. Sono supportati attributi di piattaforma e derivati sia di tipo query che math.
È consentito esprimere relazioni di qualunque tipo a partire dalla classe __User e da altre classi verso la classe __User, con l’unica regola che le relazioni uscenti devono avere come cardinalità minima del ruolo target zero; per questo motivo nei Role menu
dei target delle relazioni uscenti sono disabilitate le opzioni Exactly one
(1,1) e One or more
(1,N). Sono consentite sia associazioni che composizioni, tuttavia non è permesso dichiarare attributi derivati su classi part di __User; salvando il modello in questo scenario il Designer mostrerà una issue.
Nelle espressioni è possibile referenziare attributi e/o ruoli della classe __User esattamente come nelle normali classi: la visibilità dipende quindi da dove viene definito il filtro. Non cambia invece la possibilità di referenziare i predefined attributes dell’utente corrente, disponibile con la variabile __CurrentUser
.
A livello di Application Schema, la classe __User si comporta esattamente come le normali classi del modello. Tuttavia sarà necessario d’ora in poi che essa sia manageable (abilitata) almeno per una vista applicativa, altrimenti non sarà possibile gestire gli utenti della Cloudlet (vedi più avanti). A livello di Profile Schema, le opzioni impostate nella sezione Management of cloudlet members
si riflettono direttamente sui grants della classe __User a livello di Permission Schema, ovvero delle icone ( , , ) sulla classe; cliccando su esse, il Designer mostrerà una issue indicando che questi grant sono gestiti dal Profile Schema.
Gestione degli utenti lato Dashboard
Con l’introduzione della classe __User sono state riviste tutte le operazioni consentite lato Dashboard riguardo la gestione della community delle Cloudlet. Dato che gli utenti sono oggetti di dominio, le informazioni a essi relative verranno memorizzate d’ora in poi nel database della Cloudlet insieme ai dati delle altre classi. Per questo motivo, tutte le operazioni effettuabili sul database (copia, upload/download, backup) ora includono anche le informazioni degli utenti della Cloudlet. Per effetto di questa modifica, le operazioni di modifica di massa sulla community di una Cloudlet (download e delete) non sono più consentite, così come non è consentito il drag & drop di community tra Cloudlet differenti, perché gli utenti possono avere informazioni modellate e quindi essere dipendenti dal particolare modello installato sulla Cloudlet.
Il pannello Members of cloudlet <CloudletName>
ora non consente più di creare e/o modificare i membri/utenti della Cloudlet, anche qui perché potrebbero avere informazioni modellate aggiuntive; queste operazioni sono supportate esclusivamente nell’applicazione generata. Resta possibile eliminare uno o più utenti, a patto che questi non abbiano relazioni con altre classi del modello; in questi casi, la Dashboard mostra un messaggio d’errore. L’eliminazione di un utente della Cloudlet non comporta la rimozione dell’oggetto __User dalla tabella relativa del database; per l’utente eliminato viene impostato il flag di sola lettura deleted: true
.
È presente inoltre un nuovo pulsante Create Admin
, abilitato solo se non sono presenti utenti con privilegi di amministratore (con attributo admin=true
). Questo pulsante consente di ri-creare un utente amministratore qualora gli utenti della Cloudlet vengano eliminati (ad esempio eliminando il database). L’utente creato è analogo al default member presente su tutte le nuove Cloudlet e le sue credenziali sono le stesse dell’account con cui si è effettuato login nella Dashboard.
Gestione degli utenti nell’applicazione generata
La gestione degli utenti è supportata in tutta l’applicazione generata:
- nel client web, è stata rimossa la voce
Members management
dalla homepage; la gestione passa d’ora in poi dalla voce di menu relativa alla classe __User che dovrà essere presente su almeno una delle viste applicative modellate. Ora inoltre non viene più visualizzata nella homepage la lista dei membri facenti parte dello stesso team; - in ambito Plugin, lo SPI generato include le interfacce
Entity
per la gestione della classe __User come una normale classe del modello; - in GraphQL, vengono generati tutti i servizi base di lettura e scrittura per la classe __User, con la differenza nel nome del type: _User invece di __User, dato che l’utilizzo del doppio underscore in GraphQL è riservato ai metadati dello schema.
Anche in GraphQL e da Plugin, l’eliminazione di uno __User comporta l’impostazione del flag deleted=true
.
Componenti interessati: Designer (nuovo costrutto, icona nella palette e opzione nel Database menu), Dashboard Client (nuovo pannello gestione membri), Dashboard Servant, Cloudlet Framework, Engine Builder (RuntimeQueryGenerator), Engine Framework (client web, SPI), API GraphQL
Model design & management
Fix NullPointerException occasionale nel Designer
Risolto un problema occasionale per cui falliva la renderizzazione grafica del Designer per via di una NullPointerException dovuta alla mancanza di un riferimento. Sono stati irrobustiti i controlli risolvendo problemi di natura generica come questo.
Componenti interessati: Designer
Application generation & deployment
Fix count via GraphQL delle versioni storiche di un oggetto (versioning)
Nella versione 5.8.2 era stato introdotto un processamento della lista delle versioni storiche di un oggetto per risolvere un bug di MariaDB per cui venivano unificate le versioni “vicine” tra loro (considerando “vicine” le versioni comprese in un intervallo di 50ms). Tuttavia, chiedendo tramite GraphQL il conteggio delle versioni storiche di un oggetto (mediante la query <ClassName>___getVersionPage
si otteneva un valore errato nel campo totalCount
, dovuto al fatto che in questo scenario le versioni unificate venivano conteggiate separatamente.
Dettaglio
Componenti interessati: Engine Framework (RuntimeQueryGenerator), API GraphQL
L’Hosting Servant non utilizza più /tmp
per lo storage di file temporanei
In fase di creazione di dump di Cloudlet da parte dell’Hosting Servant, viene creato un file temporaneo nella cartella /tmp
della macchina su cui risiede l’Hosting Servant. Successivamente, questo file viene eventualmente spostato in altre cartelle apposite. La cartella /tmp
poteva però essere configurata per avere dei limiti di spazio o di diritti, comportando il possibile fallimento di alcune operazioni (ad esempio, update del database che comporti un dump delle tabelle oggetto di modifica). Per questo motivo, d’ora in poi i file verranno creati nella cartella /database
del file system della Cloudlet, invece che nella cartella /tmp
dell’Hosting Servant.
È stata inoltre resa configurabile la directory utilizzata da altri file temporanei (ad esempio, quelli legati all’importazione di file Excel), che verranno creati nella cartella indicata dalla proprietà TEMP_DIR
dell’Hosting Servant.
Componenti interessati: Hosting Servant
GraphQL: rimossi i servizi di interrogazione dei grants
Le API GraphQL sono state aggiornate per utilizzare le interfacce esposte dallo SPI generato relative al controllo dei permessi (grants) definiti nel modello, introdotte nella versione 5.8.3. In precedenza, il controllo dei permessi via GraphQL era realizzato con un’implementazione custom, mentre a partire da ora sarà possibile utilizzare, anche tramite GraphQL, tutte le funzioni attuali e future esposte nello SPI in merito al controllo dei permessi.
Contestualmente, è stata rimossa la generazione dell’endpoint ___Schema/Grants
che consentiva l’introspezione dei grants a livello di Application Schema e Profile Schema dell’applicazione generata.
Componenti interessati: API GraphQL
Application management
Migliore gestione delle sessioni concorrenti per lo stesso account nella Dashboard
In precedenza, accedendo più volte alla Dashboard con lo stesso account (ad esempio da PC differenti), tutte le sessioni eccetto l’ultima venivano invalidate silenziosamente dal Dashboard Servant, mostrando un errore solamente quando si provava a effettuare una qualunque operazione da una di queste sessioni.
Ora se si effettua un login su una sessione concorrente, la Dashboard rileva la presenza di più sessioni e consente all’utente di decidere se confermare o annullare l’override. In caso di override, le altre sessioni verranno automaticamente reindirizzate al login.
Componenti interessati: Dashboard Client, Dashboard Servant
Copy database consentita solo tra Cloudlet up to date
In seguito alla promozione dei membri della Cloudlet a oggetti di dominio (e quindi di database), è stato deciso di vietare la copia del database tra due Cloudlet se anche solo una tra esse non è up to date (ovvero necessita di un upgrade in seguito a un rilascio Livebase). La stessa precondizione è già presente per l’operazione di clone di Cloudlet.
Componenti interessati: Dashboard Client, Dashboard Servant
Import Excel: Fix mancato aggiornamento del conteggio degli oggetti del database
Risolto un problema per cui, dopo aver effettuato con successo l’importazione di un foglio Excel, il conteggio degli oggetti presenti nel database non veniva aggiornato automaticamente (era comunque possibile aggiornare il conteggio effettuando Refresh
della Dashboard). Ora il refresh non è più necessario in quanto l’informazione viene aggiornata contestualmente.
Componenti interessati: Dashboard, DashboardServant
Rimossa indicazione value can be approximate
quando non ci sono oggetti nel database
Nel caso in cui il database di una Cloudlet non contenga oggetti, non ha senso indicare che il conteggio è approssimato, per cui il messaggio (value can be approximate
) non compare più nel caso in cui il conteggio sia pari a 0. Al suo posto è mostrato invece il messaggio Database is empty
.
Componenti interessati: Dashboard
Fix issue errate in seguito al riordinamento di colonne di tabelle Enum via SQL
Risolto un comportamento errato che segnalava false differenze sulle tabelle relative a classi Enum: si verificava qualora si effettuavano modifiche via SQL alla struttura delle tabelle, che portavano eventualmente al riordinamento delle loro colonne rispetto a quello generale, successivo alla loro generazione da parte del Database Coder.
Componenti interessati: Dashboard Client, Database Checker
Rimosso il tutorial al primo avvio nella Dashboard
È stato rimosso il tutorial interattivo che veniva mostrato al primo avvio della Dashboard.
Componenti interessati: Dashboard Client
Release 5.8.3 #
Application generation & deployment
Nuove interfacce SPI per il controllo dei permessi
Sono state introdotte nello SPI generato delle interfacce che permettono di eseguire via Plugin il controllo dei permessi (grants) definiti nel modello a livello di Profile Schema (accesso alle viste applicative) e Permission Schema (permessi su classi, attributi e ruoli). Consulta il dettaglio per maggiori informazioni.
Dettaglio: interfacce SPI statiche
Il controllo dei permessi è disponibile anche all’interno delle risorse REST aggiunte in estensione alla Cloudlet: nella classe RestletServerResource
è stato reso disponibile il metodo getApplicationGrants(String applicationName)
, che ritorna un ApplicationGrants
.
Componenti interessati: Engine Framework (SPI)
GraphQL: nuovi servizi per l’interrogazione di classi storicizzate
Le API GraphQL ora supportano l’interrogazione delle versioni storiche delle classi per cui è abilitata la storicizzazione (o system versioning).
Background: cos’è la storicizzazione?
Per le classi abilitate, abbiamo esteso la struttura <ClassName>
con i seguenti campi:
type ClassName {
_id: ID
_clientId: ID
_versionStart: Datetime # indica l'inizio dell'intervallo di validità della versione (row_start)
_versionEnd: Datetime # indica la fine dell'intervallo di validità della versione (row_end)
# ... model-dependent fields
}
È possibile richiedere _versionStart
e _versionEnd
in qualunque servizio che restituisce la struttura <ClassName>
(che rappresenta la versione più recente dell’oggetto).
Vengono inoltre generati i seguenti servizi in lettura:
Query.<ClassName>___getVersion
:type Query { ClassName___getVersion(_id: ID!, atVersion: Datetime!): ClassName }
La versione di
<ClassName>
ritornata è quella il cui intervallo (row_start
,row_end
) include il timestampatVersion
passato come parametro.Query.<ClassName>___getVersionPage
:type Query { ClassName___getVersionPage(_id: ID!, options: ClassNamePageOptions): ClassNamePage }
La
<ClassNamePage>
ritornata contiene contiene una lista delle versioni storiche dell’oggetto identificato dall’_id
; il risultato può essere filtrato e/o ordinato utilizzando tutte le<ClassName>PageOptions
pre-esistenti, alle quali è aggiunta la possibilità di ordinare in base ai campi_versionStart
e_versionEnd
. La struttura<ClassName>Sort
aggiornata:input ClassNamePageOptions {
orderBy: [ClassNameSort!] = [_id___ASC]
# ... other options
}
enum ClassNameSort {
_id___ASC
_id___DESC
_versionStart___ASC
_versionStart___DESC
_versionEnd___ASC
_versionEnd___DESC
# ... model-dependent values
}Al momento non è possibile usare filtri che agiscono sui campi
_versionStart
e_versionEnd
.Formato dei Datetime
Il Datetime
atVersion
richiesto come argomento dal servizio<ClassName>___getVersion
accetta il formato standarddd-MM-yyyy HH:mm:ss.SSS
, indipendentemente dalle impostazioni dell’utente e della Cloudlet per questo tipo di dato.Il Datetime restituito in output dai campi
_versionStart
e_versionEnd
di<ClassName>
rispetta invece la formattazione dell’utente e della Cloudlet. È comunque possibile specificare un formato custom usando il parametroformat
, ad esempio:Employee__getVersion(_id: "11000", atVersion: "10-10-2020 00:00:00.000") { full_name _versionStart(format: "dd-MM-yyyy") }
Componenti interessati: API GraphQL
GraphQL: aggiunto il parametro forceWarnings
nei servizi di invocazione per FormActionHandler
I servizi GraphQL di invocazione per FormActionHandler (sia il servizio generico Mutation.<ClassName>___formAction___<HandlerName>
che quelli specifici di Create o Update) accettano ora il parametro di input opzionale forceWarnings
per bypassare eventuali Class warning non bloccanti valutati durante l’esecuzione dell’Handler, che normalmente bloccherebbero l’invocazione del Plugin via GraphQL. Tale parametro era già accettato da tutti i servizi di scrittura (save
, create
, update
, delete
).
Dettaglio: il parametro forceWarnings
Le condizioni dei Class warning definiti su una classe a livello di Application Schema possono essere valutate durante la validazione dell’oggetto (Database events) oppure in seguito ad azioni dell’utente sull’interfaccia (GUI events). I Class warning possono essere impostati per sollevare un errore al verificarsi della loro condizione ed impedire l’azione compiuta dall’utente (blocking), oppure mostrare un messaggio di warning, che nel client web può essere aggirato confermandone la presa visione.
In GraphQL, quando si verifica un Class warning non bloccante, il server ritorna delle Issue di livello WARNING; questo comportamento può essere aggirato passando il parametro opzionale forceWarnings
all’input della chiamata, che comunica al server di ignorare i warning non bloccanti.
Il valore del parametro è la struttura di input ForceWarnings
:
input ForceWarnings {
actionVeto: Boolean = false # ignora warning sollevati per GUI events
dataValidation: Boolean = false # ignora warning sollevati per Database events
}
Esempio: il servizio generico Mutation.<ClassName>___formAction___<HandlerName>
:
type Mutation {
ClassName___formAction___myFormAction(
data: ClassNameDraft!
forceWarnings: ForceWarnings
jsonParam: string
): ClassNameFormActionHandlerResult
}
Componenti interessati: API GraphQL
Generazione opzionale delle API REST
Prima dell’intervento, le API REST (deprecate ormai in favore delle API GraphQL) continuavano a essere generate per tutti i modelli, comportando un peso prestazionale nel processo di build. I test condotti (di cui riportiamo un esempio in fondo) hanno evidenziato una riduzione della quantità di codice generato, significativa per modelli grandi; tale riduzione consente di ridurre sia i tempi di generazione che quelli di compilazione, portando quindi un duplice beneficio. È stata inoltre condotta un’indagine per individuare i clienti che attualmente fanno uso in produzione delle API REST.
Per snellire il processo di build della Cloudlet, è stata quindi resa opzionale la generazione delle API REST per tutti i nuovi clienti Livebase e per i clienti pre-esistenti che sappiamo non utilizzare le REST, mentre resta abilitata la generazione per i clienti pre-esistenti che utilizzano le REST così da non garantire disservizi. Contattando il team Fhoster sarà possibile richiedere di abilitare le REST - che ricordiamo essere deprecate - finché non verrà abbandonato del tutto il supporto.
Sulla Dashboard, nel caso in cui le REST non siano abilitate per la Cloudlet, il pannello informativo API & Public URLs riporterà questa informazione nella sezione API REST, così come avviene per le API GraphQL.
Dettaglio: tempi di generazione a confronto
Di seguito riportiamo i risultati di un test effettuato su un modello di circa 25000 LCP:
Tempo generazione | Classi generate | Tempo compilazione | Tempo totale | |
---|---|---|---|---|
Con REST | 4' 33" | 44K | 2' 37" | 8' 04" |
Senza REST | 4' 11" | 38K | 2' 24" | 7' 27" |
Dalle prove effettuate, la disabilitazione delle REST riduce la generazione di codice di circa il 15%.
Componenti interessati: Engine Builder, Dashboard Client, Dashboard Servant
GraphQL: fix errata visualizzazione di attributi date su Cloudlet con timezone custom
Risolto un problema per cui, in presenza di timezone custom sulla Cloudlet (non-GMT), si ottenevano valori errati in risposta alle chiamate GraphQL per campi di tipo date. Tale problema dipendeva dalla versione del DBMS utilizzato dalla Cloudlet ed era dovuto a un disallineamento nella gestione della timezone.
Componenti interessati: API GraphQL
GraphQL: fix errata visualizzazione di _clientId
con valore null
Risolto un problema relativo alla gestione del campo clientId
: inviando al server una richiesta contenente il campo clientId valorizzato null
e richiedendo in output lo stesso valore, il server restituiva clientId: "null"
, ovvero una stringa invece del valore null
vero e proprio.
Dettaglio
La seguente query:
query {
Employee___preview(data: {_clientId: null}) {
_clientId
}
}
Restituiva il seguente risultato errato:
{
"data": {
"Employee___preview": {
"_clientId": "null"
}
}
}
Risposta corretta:
{
"data": {
"Employee___preview": {
"_clientId": null
}
}
}
Componenti interessati: API GraphQL
GraphQL: fix generazione di schema in presenza di classi part di tipo Form
Risolto un problema per cui falliva la generazione dello schema quando nel modello era presente almeno una classe part di tipo Form (ovvero una composizione tra due classi Form), dovuto alla mancata generazione delle strutture di input <PartFormClassName>RoleObject(s)
, di supporto ai servizi di Update. Ora tali strutture vengono generate correttamente.
Componenti interessati: API GraphQL
Fix accessibilità delle viste applicative senza profili assegnati
Risolto un problema in fase di build del modello che consentiva al primo profilo presente (Profile Schema) di accedere a tutte le viste applicative (Application Schema) che non avevano alcun profilo assegnato. Il problema era dovuto al pre-processamento del modello, per cui veniva erroneamente il primo profilo disponibile alle applicazioni “orfane”.
Componenti interessati: Engine Builder
Application management
Maggiore fault tolerance del processo di login
È stata modificata la gestione, da parte del Dashboard Servant, della tabella delle sessioni attive degli account; ciò ha consentito di risolvere alcuni scenari d’errore per cui, qualora per un account si verificassero crash della Dashboard o altri fallimenti, tale account finiva in uno stato inconsistente (under maintenance), impedendo successivi login sulla Dashboard.
In particolare, poteva capitare che lo stato inconsistente (under maintenance) di un sub-account impedisse l’accesso alla Dashboard anche ai sub-account “fratelli” su cui non si erano verificati errori.
Componenti interessati: Dashboard Servant
Resa asincrona l’operazione di cancellazione di Cloudlet
In alcuni scenari poteva accadere che l’operazione di cancellazione di una Cloudlet sull’Hosting Servant, pur andando a buon fine, impiegasse più tempo del timeout consentito da cxf per i servizi sincroni; per questo motivo, il Dashboard Servant non era informato del successo e l’account associato alla Cloudlet rimossa finiva in uno stato inconsistente, impedendo successivi login sulla Dashboard con tale account.
Il problema è stato risolto rendendo asincrona l’operazione di cancellazione di una Cloudlet dell’Hosting Servant e adattando i servizi correlati del Dashboard Servant: dopo aver avviato la cancellazione, il controllo ritorna immediatamente al Dashboard Servant, che si mette in polling in attesa della conclusione dell’operazione.
Componenti interessati: Dashboard Servant, Hosting Servant
Supporto al logging dell’operazione di rimozione delle tabelle di supporto al processo di importazione
La struttura del database generato della Cloudlet è stata aggiornata per supportare il log dell’operazione automatica di rimozione delle tabelle di supporto al processo di importazione, introdotta nella versione 5.8.2.
Dettaglio
È stato aggiunto il nuovo Operation_Type DELETE_EXCEL_IMPORTER_SUPPORT_TABLES
alla tabella @sys@operation_type
, referenziata dalla colonna log.operation_type
della tabella @sys@workgroup_database_log
.
Componenti interessati: Database Importer
Import Excel: fix importazione di valori booleani
Risolto un problema relativo a un recente cambiamento nella logica di inferenza dei tipi, per cui falliva l’importazione di fogli Excel in presenza di attributi booleani. La logica di inferenza degli attributi booleani è stata correttamente ripristinata per esaminare almeno due record con valori univoci, requisito necessario per riconoscere i due valori “vero” e “falso”.
Componenti interessati: Database Importer (Excel Importer)
Fix eccezione grafica dopo eliminazione di un backup
Risolto un problema relativo al rendering di componenti grafici per cui la Dashboard andava in eccezione dopo aver eliminato un backup di una Cloudlet dal pannello Backups della Dashboard. Il problema, di natura generica e di difficile riproduzione, è stato risolto irrobustendo alcuni controlli effettuati prima del rendering dei componenti.
Componenti interessati: Dashboard Client
Rimossa la gestione delle risorse delle Cloudlet, utilizzo di count approssimate
La gestione delle risorse per gli account è una feature in via di abbandono progressivo in favore delle nuove politiche di pricing della piattaforma. In questa ottica, è stata rimossa tutta la logica lato server relativa al calcolo e al controllo delle risorse assegnate, allocate e utilizzate dalle Cloudlet associate agli account Livebase; in particolare, è stato rimosso dal pannello Cloudlets della Dashboard la view Resources management (resta ora presente l’unica opzione Configuration, command & control).
Livebase non terrà più traccia delle quote imposte sulle risorse della Cloudlet relative a numero massimo di membri online, numero massimo di oggetti nel database, traffico mensile e dimensione del file storage.
Contestualmente, è stato scelto di rendere il conteggio approssimato la tecnica di default per tutte le count effettuate a fini statistici sulle tabelle database della Cloudlet. Questa tecnica è basata su un approccio offerto nativamente dal DBMS ed è supportata dal Cloudlet Framework a partire dalla versione 5.6.2 come alternativa più performante della count tradizionale. Ciò consente di ottenere un miglioramento di performance in fase di caricamento della Dashboard, specialmente se l’account possiede Cloudlet con database nell’ordine del milione di record.
Di conseguenza, l’interfaccia è stata modificata nei seguenti punti per veicolare l’informazione che il numero mostrato non è preciso:
- il pannello Cloudlets della Dashboard ora riporta la dicitura
(value can be approximate)
sotto alla conta degli oggetti nel database; - il pannello
Database of Cloudlet <CloudletName> -> Content overview
riporta la dicitura(approximate)
nell’intestazione della colonnaObjects
; - nel Designer aperto in modalità database_aware (modello installato su una Cloudlet su cui è presente un database) ora compare una tilde (
~
) accanto al numero di oggetti in fondo alle classi.
Componenti interessati: Dashboard Client (pannello Cloudlets, pannello Database) , Dashboard Servant, Designer (count degli oggetti sulle classi), Engine Framework, Cloudlet Framework, Hosting Servant
Release 5.8.2 #
Model design & management
Designer: utilizzo dei caratteri « e » per gli stereotipi
I caratteri di indicazione degli stereotipi di Enum e Singleton ora sono i simboli speciali « e ».
Componenti interessati: Designer
Application generation & deployment
Migliore gestione dei timestamp nei servizi di versioning
Il framework è stato adeguato per aggirare un problema noto di MariaDB, che si presenta nella gestione del system versioning quando si usano le colonne row_start
e row_end
di tipo timestamp
(scenario utilizzato da Livebase). La gestione dei timestamp attuale fa sì che si utilizzi l’istante dello statement anziché della transazione; ciò significa che, quando più righe vengono inserite in un’unica transazione (in Livebase avviene quando si persiste un part con il suo whole), le due righe avranno timestamp leggermente diversi.
Di conseguenza, in Livebase accadeva che la lista delle versioni mostrasse versioni duplicate, create a pochi millisecondi di distanza (causate dal persist delle classi part), mentre il retrive di una singola versione poteva essere incompleto (manca il part, in quanto creato un istante dopo).
Noti questi problemi, la lista delle versioni è stata modificata per unificare le versioni “vicine” tra loro (considerando “vicine” le versioni comprese in un intervallo di 50ms).
Componenti interessati: Engine Framework (RuntimeQueryGenerator)
Application management
Excel Importer : migliore gestione del ciclo di vita delle tabelle di supporto al processo di importazione
Durante l’importazione dati, il database della Cloudlet viene usato per memorizzare delle tabelle di supporto, con prefisso @sys@importer
. Queste tabelle non venivano toccate ulteriormente una volta terminato il processo, a prescindere dall’esito. Il processo è stato modificato per attuare la seguente gestione:
- nel caso in cui l’importazione vada a buon fine, le tabelle di supporto vengono automaticamente rimosse;
- nel caso in cui l’importazione fallisca, le tabelle tabelle vengono mantenute come strumento utile per il debug;
- nelle importazioni successive con successo, tutte le tabelle di supporto (anche quelle relative a importazioni fallite) vengono rimosse.
Componenti interessati: Database Importer, Hosting Servant
Release 5.8.1 #
Model design & management
Migliore messaggio d’errore per violazioni di cardinalità di ruoli su Enum e Singleton
È stata modificata la precedenza dei controlli effettuati dal Designer per garantire la validità delle relazioni nel modello. Nel caso di ruoli su classi Enum, Singleton e Form, per cui esistono regole specifiche (niente ruoli che partono da Enum, niente ruoli che arrivano su Singleton o Form), queste vengono controllate prima di altre regole comuni a tutto il modello. Grazie a questa modifica, il messaggio d’errore mostrato per queste classi è più specifico.
Componenti interessati: Designer (gestione issue)
Fix valutazione incorretta di filtri WHERE su attributi query in presenza di path impostati manualmente
Risolto un problema del Designer per cui, impostando manualmente il path di una query nel Query expression editor, eventuali filtri WHERE definiti sulla stessa non venivano valutati correttamente.
Componenti interessati: Designer (Database Schema, Query expression editor)
Fix query path incorretti in presenza di loop
Risolto un problema del Designer per cui la creazione automatica di query path (trascinando un attributo e selezionando Link here
) risultava in un path privo di eventuali loop anche in presenza di tali.
Componenti interessati: Designer (Database Schema)
Fix icone su attributi nell’Application Schema
Risolto un problema del Designer per cui, in presenza di attributi required su cui era impostato un valore di default, le icone required (!) e il simbolo del valore di default (◀) apparivano sovrapposte; ciò avveniva solamente per attributi con nome più lungo della larghezza di default della classe.
Componenti interessati: Designer (Application Schema)
Application generation & deployment
Ottimizzazione della compilazione nel processo di build
Sono state sperimentate diverse soluzioni per ottenere un miglioramento delle prestazioni della compilazione del codice Java generato a partire dal modello. Dopo aver esplorato la strada della compilazione incrementale (vedi commento), sono stati condotti dei test per confrontare il compilatore standard javac, attualmente utilizzato dall’Engine Builder, con il più performante EclipseJ.
I test (di cui riportiamo un esempio in fondo) hanno evidenziato una riduzione media del tempo di compilazione di circa il 40%. Per questo motivo, l’Engine Builder è stato modificato per utilizzare come default il nuovo compilatore EclipseJ; ciò si traduce in un aumento globale delle prestazioni dell’operazione di Start delle Cloudlet che coinvolge il build dell’applicazione generata.
L’incremento di prestazione riguarda esclusivamente la compilazione delle classi Java e il bundling del codice; le prestazioni di altre operazioni (come la generazione del codice o il deploy del bundle) restano invariate.
Commento degli sviluppatori: compilazione incrementale
I test condotti hanno evidenziato che questa soluzione porta vantaggi finché la parte preservata è inferiore al 50% dei file .class totali. Per compilazioni in cui circa il 50% dei .class è da ricompilare, si hanno invece risultati molto simili se non uguali al tempo di compilazione non incrementale.
Dato che il processo di generazione del codice, a monte della compilazione, non è deterministico (i sorgenti prodotti a partire dallo stesso modello producono classi che differiscono, ad esempio, nell’ordine degli import, nomi delle variabili, etc.), la conseguenza è che il 50% del codice risulta sempre modificato, così da rendere necessaria una ricompilazione. Per questo motivo, questa soluzione è stata scartata.
Dettaglio: tempi di compilazione a confronto
Di seguito riportiamo i risultati di un test effettuato su un modello molto grande (con circa 45mila classi), il cui attuale tempo di compilazione si attesta intorno ai 6 minuti. I test evidenziati in rosso sono relativi a un fallimento di build (javac a differenza di EclipseJ non consente di compilare con 4Gb); inoltre, la macchina di validazione non aveva 8Gb a disposizione, pertanto non è stato possibile effettuare i test in questo ambiente.
Javac 4Gb | EclipseJ 4Gb | Javac 8Gb | EclipseJ 8Gb | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
javac | javadoc | totale | javac | javadoc | totale | javac | javadoc | totale | javac | javadoc | totale | |
Local | 4:56 | 4:56 | 2:20 | 0:24 | 3:15 | 4:20 | 0:24 | 5:13 | 1:56 | 0:24 | 2:53 | |
Valid | 6:20 | 6:20 | 5:10 | 0:26 | 6:28 | |||||||
Prod | 5:10 | 5:10 | 2:55 | 0:37 | 4:32 | 5:34 | 0:42 | 7:07 | 2:10 | 0:38 | 3:50 |
In tutti i casi, l’incremento di prestazioni consente di risparmiare in media un minuto e mezzo per build. Nella tabella abbiamo evidenziato separatamente inoltre, il tempo richiesto per compilare i Javadoc della Cloudlet.
Componenti interessati: Engine Builder, Dashboard Servant
GraphQL: migliore documentazione generata per strutture dati e servizi per classi Enum e Singleton
È stata aggiunta l’informazione sullo stereotipo nella documentazione generata di strutture e servizi di classi Enum e Singleton, così poterle distinguere più facilmente dalle normali classi. Questo consente agli sviluppatori GraphQL che non hanno accesso al modello di ottenere informazioni sulla natura di ciascuna classe.
Componenti interessati: API GraphQL (schema builder)
GraphQL: fix invocazione di FormActionHandler tramite servizio generico su classi Form
Risolto un problema per cui il servizio generico per classi Form Mutation.<FormClassName>___formAction___<HandlerName>
(introdotto nella versione 5.8) non utilizzava correttamente la struttura save
generica, causando il fallimento di richieste di questo tipo.
Componenti interessati: API GraphQL
GraphQL: fix mancata cancellazione di ruoli e/o part a 1 nei servizi save generici
Risolto un problema relativo al servizio generico Mutation.<ClassName>___save
(introdotto nella versione 5.8) per cui non era possibile cancellare ruoli o part a 1 impostando il loro valore a null
.
Componenti interessati: API GraphQL
GraphQL: fix problema di concorrenza nell’accesso a variabili system
Risolto un problema di concorrenza nell’accesso a variabile System fatto tramite chiamate GraphQL.
Componenti interessati: Engine Framework
Fix eccezione di FormActionHandler su classi Form richiamati via GraphQL che utilizzano il persist di entity
Risolto un problema per cui, richiamando via GraphQL un FormActionHandler al cui interno veniva richiamato il metodo entitySession.persist()
si ottenevano due effetti collaterali:
- se si cercava di apportare modifiche all’entity form dopo il persist veniva lanciata una eccezione di tipo
EntityNotFoundException
; - a prescindere, GraphQL restituiva di ritorno il campo
data
nullo;
Il problema era causato da un disallineamento nella gestione della sessione da parte delle API GraphQL rispetto all’applicazione generata.
Componenti interessati: Engine Framework
Fix invocazione di FormActionHandler su oggetto part dalla lista globale degli oggetti part
Sul client web è possibile abilitare una voce di menu per visualizzare la lista globale degli oggetti di una classe part da cui è possibile solo leggere o editare gli oggetti pre-esistenti. È stato risolto un errore per cui falliva l’invocazione di un FormActionHandler definito su tale classe part e invocato dalla form di un oggetto part aperto dalla lista globale. L’errore era dovuto a una mancata inizializzazione, nel contesto in memoria, dell’oggetto whole relativo.
Componenti interessati: Engine Framework
Application management
Link agli endpoint GraphQL nel pannello API & Public Urls
Il pannello informativo della Cloudlet API & Public URLs è stato aggiornato per includere i link agli endpoint GraphQL. Per ciascuna vista applicativa <ApplicationName>
modellata, viene generato un endpoint GraphQL dedicato all’indirizzo <CloudletName>/auth/api/graphql/<ApplicationName>
.
Il Dashboard Servant è stato aggiornato con un nuovo servizio per ottenere i link degli endpoint GraphQL della Cloudlet.
Contatta Fhoster per abilitare le API GraphQL.
Componenti interessati: Dashboard Client, Dashboard Servant
Migliorato il pannello per la gestione dei Plugin
Il pannello Extensions of cloudlet <CloudletName>
, raggiungibile dalla voce del Cloudlet Menu
() Manage plugins
() è stato rinominato in Plugins of cloudlet <CloudletName>
. Inoltre, sono state aggiornate:
- la descrizione, che ora contiene i link ai Javadoc generati delle due API (Plugin e Framework);
- la lista dei plugin installati;
- il pulsante
Upload
(rinominato inUpload plugin
e spostato accanto al pulsanteDownload SPI
).
Componenti interessati: Dashboard Client
Miglioramento del log delle operazioni della Dashboard
Sono state aggiunte informazioni nel log della Dashboard relative alle seguenti operazioni:
- cambiamento dello stato di un Plugin da
start
astop
o viceversa (aggiunto il log mancante, include il nome del Plugin); - download di un Plugin (aggiunto il nome del Plugin);
- rimozione di un Plugin (aggiunto il log mancante, include il nome del Plugin);
- installazione di un engine (aggiunta la versione del modello);
Componenti interessati: Dashboard Servant
Miglioramento al messaggio d’errore in caso di fallimento di Backup
È stato aggiornato il messaggio d’errore che viene mostrato in caso di fallimento dell’operazione di Backup di una Cloudlet per includere il nome della Cloudlet.
Componenti interessati: Hosting Servant
Import Excel: fix importazione di relazioni riflessive
È stata ripristinata la possibilità di importare fogli Excel contenenti relazioni riflessive, siano esse associazioni o composizioni. Era presente infatti un errore nell’ordine di validazione delle relazioni per cui non venivano trovati i record puntati anche se correttamente presenti sul database.
Ora è possibile importare associazioni riflessive usando reference sheet o relation sheet, e composizioni riflessive usando reference sheet; su questi va sempre inclusa, per ciascun record part, una chiave al record whole puntato, che può essere formata da uno da più attributi. In ogni caso, tutti i fogli del file Excel devono sempre garantire l’atomicità dell’importazione.
Dettaglio: atomicità dell’importazione
Per atomicità intendiamo che il record puntato su un foglio (tramite una reference a una sua chiave) deve essere sempre pre-esistente sul database nel momento in cui il foglio viene letto e processato.
Una soluzione per garantire l’atomicità è spezzare l’importazione in più fasi: questo può avvenire importando più file Excel, in cui il primo contiene sempre un flat sheet e i successivi contengono eventuali riferimenti; è anche possibile dotare un singolo file Excel di più fogli, ordinando il flat sheet prima di eventuali reference sheet da cui è puntato.
Nel caso in cui si voglia importare una tassonomia (gerarchie di oggetti) su una composizione riflessiva, è necessario spezzare l’importazione in tanti passi quanto è il livello di profondità. È possibile anche in questo caso far uso di un flat sheet per aggiungere i “nodi radice”, a cui far seguire una catena di reference sheet, ciascuno dei quali aggiunge un “nodo” e lo collega al “nodo” precedente.
Componenti interessati: Database Importer (Excel Importer)
Release 5.8 #
Modeling language
Nuovo costrutto: la classe Singleton
Un Singleton è una nuova tipologia di classe che ammette un’unica istanza all’interno dell’applicazione generata ed un unico record nella corrispondente tabella del database. I Singleton sono utili per esprimere nel modello informazioni configurabili a visibilità globale. Come per le classi Enum, infatti, i Singleton sono accessibili da tutte le altre classi del modello; a esse è consentito referenziare attributi delle istanze Singleton nelle espressioni math, WHERE e filtri senza doversi associare alla classe stessa.
Come per i literal object degli Enum, la presenza di una classe Singleton nel modello garantisce l’esistenza della sua istanza nel database e nell’applicazione generata; tuttavia, mentre i literal object degli Enum sono definiti e valorizzati direttamente a livello di Database Schema, le istanze Singleton devono essere valorizzate nell’applicazione generata editando l’oggetto come avviene per normali classi. Nonostante ciò, è possibile modellare a livello di Application Schema dei valori di default per gli attributi dell’istanza Singleton.
Modellazione di Singleton
Nel Designer è possibile dichiarare classi Singleton dalla voce Database menu > New singleton class
oppure dal pulsante della palette(Create a new singleton
). In alcuni scenari supportati (vedi dettaglio) è inoltre possibile promuovere una normale classe a Singleton dalla voce Class menu > Convert to singleton
.
Dettaglio: promuovere una normale classe in Singleton
È consentito promuovere una classe a Singleton nelle seguenti situazioni:
- la classe non è puntata da altri Singleton o classi Form;
- la classe non ha attributi di tipo serial;
- la classe non ha vincoli unique o index;
Non è consentito inoltre promuovere una classe a Singleton se il Designer è in modalità database-aware (il modello corrente è installato su una Cloudlet su cui è presente un database) e la classe ha più di un oggetto sul database; salvare il modello in queste condizioni solleva una high issue.
Attenzione: L’operazione inversa (convertire un Singleton in classe normale) non è disponibile.
Una classe Singleton è distinguibile nel diagramma per lo stereotipo <<singleton>>
. È consentito dichiarare attributi nativi di tutti i tipi (a eccezione di serial) e derivati sia di tipo math sia query; è possibile inoltre abilitare tutti gli attributi platform. Per costruzione, non è possibile dichiarare vincoli unique o index sugli attributi del Singleton, né impostarli required. Non è consentito esprimere relazioni verso il Singleton (non avrebbe infatti senso, dato che l’istanza è unica ed è visibile globalmente), mentre è consentito esprimere relazioni dal Singleton verso le altre classi del modello, inclusi gli Enum, purché la cardinalità minima del ruolo target sia zero; per questo motivo nei Role menu
sono disabilitate le opzioni Exactly one
(1,1) e One or more
(1,N). Sono consentite sia associazioni che composizioni, pertanto è possibile dichiarare anche attributi derivati di tipo query sui ruoli del Singleton.
In modo simile alle classi Form, i ruoli sorgente nelle relazioni dal Singleton verso l’esterno non vengono mostrati nel Designer.
Nelle espressioni è possibile referenziare attributi e/o ruoli del Singleton con la stessa sintassi degli Enum, ma lasciando le parentesi quadre vuote: <SingletonClassName>[].<AttributeName>
. Nell’Expression editor, inoltre, i Singleton sono elencati in una lista accessibile dal pulsante (Singleton constants
), da cui è possibile selezionarne attributi e/o ruoli.
Come già detto, l’istanza Singleton è gestita nell’applicazione generata; pertanto, a livello di Application Schema, il Singleton è manageable e può essere attivato/disattivato come una normale classe; è possibile editarne la voce di menu, il Form layout, il Print layout e i Class warning. Per i Class warning, gli unici eventi disponibili sono open
, edit
e SaveExisting
. Infine, come già detto è possibile impostare default expression sugli attributi del singleton.
Singleton nell’applicazione generata
Dato che l’esistenza dell’istanza è sempre garantita, gli unici servizi CRUD generati sono quelli relativi all’edit di tale istanza, mentre non vengono generati servizi per crearla o eliminarla:
nel client web, per le viste e per i profili abilitati è disponibile una voce di menu che consente di accedere direttamente alla Form dell’istanza Singleton senza passare per alcuna vista tabellare.
in ambito Plugin, è supportato un sottoinsieme di Service Handler dichiarabili nel modello. Nello SPI, è possibile ottenere riferimenti alle istanze singleton tramite i servizi
getEntity
egetImmutableEntity
dellaEntitySession
, che richiedono solo il nome della classe Singleton e non l’id come per le normali classi.Dettaglio: Service Handler supportati per Singleton
Gli Handler sbarrati non sono modellabili:
- FormActionHandler
- ObjectPrintHandler
ListActionHandler(la vista tabellare è assente)ListPrintHandler(come sopra)- SaveActionHandler
- ValidationHandler
DbInsertHandler(non è possibile creare l’istanza Singleton)- DbUpdateHandler
DbDeleteHandler(non è possibile eliminare l’istanza Singleton)
in GraphQL, è supportato un sottoinsieme di servizi per classi Singleton (vedi dettaglio);
Dettaglio: Servizi GraphQL supportati per Singleton
Vengono generati i seguenti servizi:
Query.<SingletonClassName>___get
;Query.<SingletonClassName>___previewUpdate
;Query.<SingletonClassName>___validateUpdate
;Mutation.<SingletonClassName>___update
;Mutation.<SingletonClassName>___update___formAction
.
Tutti i servizi Update per Singleton non richiedono il parametro
_id
.
Singleton e manutenzione evolutiva
Dal momento che la classe Singleton non è altro che una normale classe la cui cardinalità di tabella è bloccata a 1, la maggior parte degli scenari di manutenzione evolutiva per Singleton erano già supportati dal Database Checker. È stato aggiunto un controllo per lo scenario in cui, in seguito all’operazione Convert to Singleton
, una normale classe viene promossa a Singleton.
Componenti interessati: Designer (nuovo costrutto, icona nella palette e opzione nel Database menu), Database Checker (supporto scenari singleton), Engine Builder (QueryGenerator e RuntimeQueryGenerator, supporto alla nuova sintassi), Engine Framework (client web, SPI), API GraphQL
Model design & management
Display del punteggio LCP anche per engine installati
Nella versione 5.5.3 sono stati introdotti gli LCP (Livebase Complexity Points) come punteggio per rappresentare la complessità dei modelli.
Il punteggio dei modelli veniva mostrato già nel Designer e a fianco dei modelli nella Engine Library. Questa informazione è stata estesa ai modelli installati sulle Cloudlet (engine): il punteggio LCP è mostrato nel riquadro Cloudlet e viene aggiornato al salvataggio del modello.
Componenti interessati: Dashboard Client (pannello Cloudlet), Dashboard Servant
Fix calcolo dei grant dopo l’eliminazione di una classe part readonly
Risolto un problema del Designer per cui l’eliminazione di una classe part dal Database Schema causava, nei Permission Schema in cui quella classe era abilitata, la modifica a readonly del grant sulla classe; questo effetto si propagava inoltre su tutte le classi main a essa connessa, e su tutte le altre classi part raggiungibili da tali main.
Componenti interessati: Designer (Permission Schema)
Fix locate automatico di issue in presenza di Class warning
Risolto un problema del Designer relativo al fix automatico di issue relative ai Class warning. Il problema era dovuto a una gestione errata delle variabili nelle espressioni del warning valutate sull’evento onCreate
.
Componenti interessati: Designer (gestione issue)
Application generation & deployment
GraphQL: nuove strutture di input draft e servizi generici
Prima dell’intervento, alcune strutture dati e servizi della API esistevano in due varianti: Create e Update; ciò vale, oltre che per i servizi stessi di creazione e modifica, anche per i servizi preview e validate. I motivi dietro questa diversificazione risalgono al voler offrire un meccanismo prevedibile e self-documented per interrogare le applicazioni Livebase.
Nel progettare applicazioni che utilizzano intensivamente le API GraphQL (a es. client web), una tipizzazione rigida può tuttavia rappresentare un limite, specialmente nei casi in cui non è necessario avere, lato client, strutture dati che differiscono relativamente poco, come è il caso per le strutture Create e Update.
Alla luce di questa riflessione, sono stati introdotti nuovi servizi generici che mettono a fattor comune queste differenze (save
, preview
, validate
e formAction
), e che utilizzano strutture di input flessibili (draft), in grado di assumere il significato di una Create o Update a seconda dei campi valorizzati. Consulta i dettagli per maggiori informazioni.
I nuovi servizi si aggiungono a quelli pre-esistenti, pertanto è garantita retrocompatibilità. L’unica rottura riguarda le strutture DraftRoleObject(s)
e al servizio previewUpdate
(vedi sotto).
Dettaglio: Strutture di input draft
<ClassName>Draft
: contiene tutti i campi di<ClassName>DraftUpdate
, con le seguenti differenze:- nessun campo è obbligatorio (
!
), incluso_id
. La presenza o meno di quest’ultimo distingue se la struttura è logicamente una Create o un Update. - i ruoli a molti usano le nuove strutture
<ClassName>DraftRoleObjects
e<ClassName>DraftRoleRefs
; - i ruoli di composizione a uno usano direttamente l’oggetto
<ClassName>Draft
, che assume significato di Delete se è valorizzatonull
; - i ruoli di associazione a uno usano direttamente l’ID o
null
(che indica la rimozione dell’associazione).
- nessun campo è obbligatorio (
<ClassName>DraftRoleObjects
(part a molti):input ClassNameDraftRoleObjects { save: [Project_assignmentDraft] delete: [ID] deleteAll: Boolean }
<ClassName>DraftRoleRefs
(associazione a molti):input ClassNameDraftRoleRefs { add: [ID] remove: [ID] removeAll: Boolean }
Attenzione: gli input DraftRoleObject(s)
(sia singola che a molti) erano già presenti e utilizzate nel servizio previewUpdate
; gli input da tale servizio sono stati rinominati come segue, mantenendo inalterati i campi:
<ClassName>DraftRoleObject
→<ClassName>DraftUpdateRoleObject
;<ClassName>DraftRoleObjects
→<ClassName>DraftUpdateRoleObjects
;
In ogni caso, si tratta di strutture di input i cui campi non sono cambiati; pertanto il servizio dovrebbe continuare a funzionare.
Dettaglio: Servizi generici
Mutation.<ClassName>___save
- crea o aggiorna un oggetto della classe
<ClassName>
; - accetta un
<ClassName>Draft
e ritorna l’oggetto creato o aggiornato a seconda della presenza o meno del campo_id
; - raggruppa i servizi
<ClassName>___create
e<ClassName>___update
;
type Mutation { ClassName___save(data: ClassNameDraft!, forceWarnings: ForceWarnings): ClassName }
- crea o aggiorna un oggetto della classe
Query.<ClassName>___preview
- mostra una preview del risultato di un’operazione save oggetto della classe
<ClassName>
; - accetta un
<ClassName>Draft
e ritorna una preview dell’oggetto; - raggruppa i servizi
<ClassName>___previewCreate
e<ClassName>___previewUpdate
;
type Query { ClassName___preview(data: ClassNameDraft!): ClassName }
- mostra una preview del risultato di un’operazione save oggetto della classe
Query.<ClassName>___validate
- valida l’operazione save di un oggetto della classe
<ClassName>
; - accetta un
<ClassName>Draft
e ritorna unValidationResult
; - raggruppa i servizi
<ClassName>___validateCreate
e<ClassName>___validateUpdate
;
type Query { ClassName___validate(data: ClassNameDraft!): ValidationResult }
- valida l’operazione save di un oggetto della classe
Mutation.<ClassName>___formAction___<HandlerName>
- Invoca l’handler su un nuovo oggetto della classe
<ClassName>
; - Accetta un
<ClassName>Draft
ed unjsonParam
opzionale, ritorna un<ClassName>FormActionHandlerResult
; - raggruppa i servizi
<ClassName>___create___formAction___<HandlerName>
e<ClassName>___update___formAction___<HandlerName>
.
type Mutation { ClassName___formAction___myFormAction( data: ClassNameDraft! jsonParam: String ): ClassNameFormActionHandlerResult }
- Invoca l’handler su un nuovo oggetto della classe
Componenti interessati: API GraphQL (schema builder)
GraphQL: i nuovi utenti creati sono abilitati di default
In precedenza, per endpoint dove la platform class __User è abilitata, gli utenti creati con il servizio Mutation.__User___create
erano abilitati solamente se sulla classe era stato esplicitato il predefined attribute __User.enabled
. Ciò risultava nella creazione di membri disabilitati impossibilitati ad accedere alla Cloudlet; il problema era risolvibile abilitando l’attributo e rigenerando le GraphQL. Il framework è stato sofisticato per rendere automatica questa soluzione, pertanto i nuovi utenti creati via GraphQL ora sono sempre abilitati di default.
Componenti interessati: Engine Framework
Fix build failure per modelli con attributi query con filtri WHERE che referenziano Enum
Risolto un fallimento del build che si presentava quando nel modello erano presenti attributi query con delle WHERE in cui si faceva uso di attributi di Enum. Il Query Generator è stato rifattorizzato per riconoscere correttamente i letterali Enum nei filtri.
Componenti interessati: Engine Framework (Query Generator)
Fix build failure per aggiunta di vincolo unique su attributi con lettere maiuscole
Risolto un fallimento del build che si presentava quando si aggiornava un modello aggiungendo un vincolo di unicità che coinvolgeva attributi contenenti lettere maiuscole. Il problema era dovuto a un errato mapping del Database Checker nella creazione del vincolo, per via delle lettere maiuscole.
Componenti interessati: Database Checker
Fix errata segnalazione issue di incompatibilità per modelli con classi Form
In alcuni scenari, lo start di una Cloudlet con un modello contenente classi Form causava la segnalazione di una falsa incompatibilità tra modello e Database; il problema era causato dalla mancata gestione delle tabelle delle classi Form nel database temporaneo usato nel controllo di incompatibilità. L’Hosting Servant è stato modificato per ignorare tutte le tabelle per cui non possono verificarsi incompatibilità, tra cui quelle delle classi Form.
Componenti interessati: Hosting Servant
Application management
Link al client GraphiQL nel pannello API & Public Urls, REST deprecate
Il pannello informativo della Cloudlet API & Public URLs è stato aggiornato per includere un link al client GraphiQL, disponibile per le Cloudlet con GraphQL abilitate all’indirizzo <CloudletName>/auth/api/graphql/asset/index.html
. Il link non è presente se le GraphQL non sono abilitate.
Contestualmente, le API REST sono state deprecate in favore di GraphQL. I link all’endpoint REST nei vari formati sono ora raggruppati in una sessione collassata.
Contatta Fhoster per abilitare le API GraphQL.
GraphiQL e endpoint GraphQL
GraphiQL è uno strumento che consente di testare il funzionamento delle GraphQL e di esplorarne la documentazione generata. L’indirizzo riportato nel pannello non è l’endpoint GraphQL della Cloudlet. Ricordiamo che per ciascuna vista applicativa <ApplicationName>
modellata, viene generato un endpoint GraphQL dedicato all’indirizzo <CloudletName>/auth/api/graphql/<ApplicationName>
. GraphiQL è in grado di interrogare gli endpoint corrispondenti alle applicazioni abilitate per il profilo dell’utente corrente.
Componenti interessati: Dashboard Client
Backup/restore disponibile anche in presenza di classi storicizzate
L’abilitazione della storicizzazione (o system versioning) su una classe comporta l’aggiunta, alla relativa tabella del database, delle colonne row_start
e row_end
; l’assenza di tali colonne dal backup della struttura del DB non consentiva il successivo restore. I Database Coder e Updater sono stati sofisticati per gestire in modo esplicito le colonne relative alla storicizzazione sia nello scenario di creazione di una tabella storicizzata, che nella successiva abilitazione/rimozione del versioning da una tabella esistente.
Componenti interessati: Database Coder, Database Updater
Import Excel: controllo delle cardinalità dei Relation Sheet
Nella versione 5.7.1 era stato aggiunto un controllo delle cardinalità dei ruoli espressi nei Reference Sheet (fogli Excel contenenti nuovi record e relazioni); tale controllo è stato esteso anche ai Relation Sheet, ovvero fogli Excel che aggiungono relazioni tra record esistenti, senza aggiungerne nuovi. Sono supportate tutte le possibili configurazioni di cardinalità, incluse cardinalità custom, e sono controllate anche le associazioni riflessive.
In caso di violazioni delle cardinalità, i record del foglio Excel interessati vengono opportunamente marcati, affinché l’utente possa risolvere agevolmente l’errore. L’eventuale individuazione di errori interrompe il processo di importazione e non lascia il database in uno stato inconsistente.
Componenti interessati: Database Importer (Excel Importer)
Import Excel: controllo dei vincoli di unicità su combinazioni di ruoli per Relation Sheet e Reference Sheet
Nel momento in cui viene importato un Relation Sheet o un Reference Sheet, una nuova fase del processo di validazione comprende ora il controllo dei vincoli di unicità definiti su combinazioni di ruoli della main table o di una delle tabelle coinvolte nell’associazione di riferimento. Il vincolo deve essere rispettato sia dai dati di nuova importazione che da quelli già presenti.
In caso di violazioni del vincolo, i record del foglio Excel interessati vengono opportunamente marcati, affinché l’utente possa risolvere agevolmente l’errore. L’eventuale individuazione di errori interrompe il processo di importazione e non lascia il database in uno stato inconsistente.
Componenti interessati: Database Importer (Excel Importer)
Import Excel: fix mancata segnalazione di high issue dovuta a violazione dei vincoli di dominio
Nel momento in cui veniva importato un foglio Excel contenente dati che non soddisfano alcuni vincoli di dominio, il server segnalava un errore generico ma non venivano evidenziate issue sul database, che conteneva comunque alcuni dati errati. È stato corretto un errore nell’operazione del Dashboard Servant responsabile del processo di importazione che causava un reset del Database Compatibility Report e, di conseguenza, il mancato aggiornamento delle issue. Inoltre, il messaggio d’errore mostrato sulla Dashboard è ora più specifico.
Componenti interessati: Dashboard Client, Dashboard Servant
Fix errore di visualizzazione del portale per account con licenze scadute
Nel portale, quando è stata rimossa la gestione dei pagamenti è stato introdotto il concetto di licenza Livebase: ogni account ha associata una licenza con relativo tipo e scadenza della stessa.
Nel caso in cui la licenza di un account fosse scaduta, effettuando login col suddetto si otteneva un errore di visualizzazione nella sezione My account. L’operazione di recupero è stata modificata per andare sempre a buon fine: il portale mostrerà le informazioni relative alla licenza anche se questa è al di fuori del periodo di validità.
Componenti interessati: Portale
Release 5.7.1 #
Model design & management
Migliore interazione con i menu del Designer
Sono stati migliorati i seguenti menu:
- Class menu > New relation: le opzioni disponibili vengono abilitate/disabilitate condizionatamente al fatto che la classe supporti o no quella relazione; se tutte e tre le voci sono disabilitate, anche il menu padre viene disabilitato. Questo vale per tutte le tipologie di classi esistenti;
- Role menu: le opzioni disponibili per la cardinalità vengono disattivate in tutti i casi in cui quella opzione non è ammessa. Nel momento in cui viene impostata una certa cardinalità, questa viene controllata e in caso di errori verrà sollevata un’eccezione.
Componenti interessati: Designer (Database schema)
Fix visualizzazione dell’albero nel Query Expression Editor con path ricorsivi
Corretto un comportamento errato dell’algoritmo di costruzione del TreePath per cui, nel caso di query che navigano relazioni riflessive, l’albero disegnato non rifletteva correttamente l’espressione.
Componenti interessati: Designer (Database schema)
Fix controllo sui nomi di modelli/engine
Il Dashboard Servant effettuava un controllo sui nomi di modelli/engine di tipo case sensitive, mentre sul Client il controllo era case insensitive. Per questo motivo, era consentito avere più modelli in libreria il cui nome conteneva stessi caratteri ma con case diverso. Tuttavia, il server andava in eccezione se si provava ad aprire uno di questi modelli/engine.
Per risolvere il disallineamento, il controllo è stato sofisticato lato Client, impedendo del tutto la coesistenza di modelli/engine con nomi con stessi caratteri e case diversi, e mostrando un’eccezione se si tenta il rename di un modello come descritto.
Componenti interessati: Dashboard Servant
Rinominato lo stereotipo <<enumeration>>
in <<enum>>
nel Designer
Rinominato lo stereotipo nell’header delle classi Enum. Sono stati rinominate inoltre la label del pulsante della palette(Create a new enum
) e la voce Database menu > New enum class.
Componenti interessati: Designer (Database schema)
Application generation & deployment
Ottimizzazione del recupero del Database Fingerprint
Il Database Fingerprint è un insieme di meta-informazioni relativi al database di una Cloudlet che riguardano il numero di record effettivamente presenti in ciascuna tabella, e la molteplicità reale dei ruoli di ciascuna relazione. Queste informazioni sono utilizzate dal Database Checker per determinare la compatibilità del database con il modello e stilare il relativo Database Compatibility Report, contenente eventuali compatibility issue. In particolare, il Checker necessita di conoscere le cardinalità effettive di tabelle e relazioni per determinare il livello (low, medium o high) di severità del disallineamento.
Prima dell’intervento, il Fingerprint veniva calcolato con un approccio eager; tuttavia, il tempo necessario per recuperare le cardinalità effettive di tutte le tabelle e relazioni cresceva in modo significativo all’aumentare del volume dei dati presenti nel database della Cloudlet.
Osservando che nella maggioranza dei casi il Checker necessita di sapere solamente se la tabella ha record o meno (per classificare issue di livello low o medium), per ottimizzare le performance è stato introdotto un approccio lazy:
- il Fingerprint viene ora calcolato omettendo l’informazione sulle cardinalità e impostando un valore booleano sulle tabelle (
hasRecords
), indicativo della presenza di record o meno; questo flag è molto rapido da calcolare in tutti gli scenari; - il Database Checker ora richiede all’Hosting Servant solo le cardinalità di cui necessita effettivamente; ad esempio, nel caso delle foreign key, vengono chieste solo le cardinalità delle tabelle interessate dalle modifiche;
- i valori sulle cardinalità di tabelle e foreign key sono posti in una cache, separata dal Fingerprint, che continua a mantenere solo informazioni statiche sulla struttura delle tabelle.
Componenti interessati: Dashboard Servant, Database Checker (modificato processo di retrieve delle cardinalità), Hosting Servant (CloudletDatabaseManager, nuovi servizi per retrieve di cardinalità)
Fix generazione di Report
Risolto un problema di classpath che impediva il corretto funzionamento della generazione dei Report.
Componenti interessati: Engine Builder
GraphQL: Fix valorizzazione di attributi custom su __CurrentUser
Risolto un problema per cui, da GraphQL, i valori di attributi query sulla classe __CurrentUser usati nelle math expression assumevano valore nullo. È stato modificato un servizio usato dalla API che inizialmente restituiva solamente gli attributi statici (nativi, system e default della classe User), affinché restituisse anche attributi derivati.
Componenti interessati: API GraphQL, Engine Framework (RuntimeQueryGenerator)
GraphQL: Fix utilizzo del _clientId
nelle filter expression
È stata cambiata la gestione dell’attributo _clientId
per essere trattato come stringa. In questo modo è possibile usarlo nel filtraggio di query paginate (come ad esempio su oggetti part), senza ottenere eccezioni. Prima era possibile aggirare il problema inserendo il valore tra apici, ora non è più necessario.
Componenti interessati: API GraphQL
GraphQL: Fix 401 unauthorized in accesso al client GraphiQL su Cloudlet con SSO
Accedendo al client GraphiQL di una Cloudlet con SSO abilitato, il caricamento della pagina index.html si bloccava per via di un errore 401 sulla richiesta per ritornare le applicazioni GraphQL disponibili. Le chiamate effettuate sono state modificate per funzionare correttamente anche con SSO.
Componenti interessati: API GraphQL (client)
Fix autenticazione per username con maiuscole su Cloudlet con SSO
In Keycloak, gli username vengono memorizzati nel JWT case insensitive, mentre nel database della Cloudlet sono case sensitive. Per via di questo disallineamento falliva il controllo dello username sul DB, impedendo il login a utenti con username contenenti maiuscole su Cloudlet con SSO abilitato. Il controllo è stato rilassato per supportare la case-insensitivity di Keycloak.
Componenti interessati: Engine Framework
Application management
Import Excel: controllo delle cardinalità dei Reference Sheet
Nel momento in cui viene importato un Reference Sheet (foglio Excel contenente nuovi record e relazioni), una nuova fase del processo di validazione comprende ora il controllo delle cardinalità dirette e/o inverse sia in riferimento ai dati di nuova importazione, che a quelli già esistenti nel database.
In caso di violazioni delle cardinalità, i record del foglio Excel interessati vengono opportunamente marcati, affinché l’utente possa risolvere agevolmente l’errore. L’eventuale individuazione di errori interrompe il processo di importazione e non lascia il database in uno stato inconsistente.
Componenti interessati: Database Importer (Excel Importer)
Fix comportamento del Force check database dopo import dei dati
Se dopo un’operazione import data su una Cloudlet venivano sollevate issue dovute a incompatibilità dei dati (a es. violazioni sul dominio degli attributi) e l’utente effettuava un Force check database sulla stessa, in alcuni casi le issue sollevate scomparivano. L’operazione di force check è stata modificata in modo da forzare il controllo sui dati se sono presenti violazioni dei vincoli.
Componenti interessati: Dashboard Servant
Fix clonazione di Cloudlet con GraphQL abilitate
Aggiunto al clone di una Cloudlet la configurazione dei system plugin a essa collegati; questo risolve un problema per cui il clone di una Cloudlet con le GraphQL abilitate non aveva la medesima abilitazione.
Componenti interessati: Dashboard Servant
Fix vecchio Dashboard Launcher mostrato nel portale a sub-account
Effettuando login con un sub-account, il portale mostrava, nella sezione My account, la pagina con il vecchio launcher della Dashboard invece dell’installer attuale. Il portale è modificato per uniformare la pagina del sub account a quella dell’account master, che ora mostra l’installer della Dashboard con il corretto link per scaricarlo (il default dipende dal sistema operativo utilizzato).
Componenti interessati: Portale
Release 5.7 #
Modeling language
Nuovo costrutto: la classe Enum
Un Enum è una nuova tipologia di classe che consente di dichiarare, direttamente nel modello, oggetti costanti a visibilità globale (detti literal objects, letterali) che possono essere usati dalle altre classi nel dichiarare espressioni math, condizioni WHERE sulle query o filtri su classi e ruoli a livello di Application Schema. Come in UML, è possibile esprimere ruoli di associazione verso un Enum così da associare oggetti di una classe ai singoli letterali. Gli Enum sono utili per esprimere nel modello informazioni statiche, come un elenco di stati o classificazioni da assegnare a singoli oggetti.
Modellazione di Enum
Nel Designer è possibile dichiarare classi Enum dalla voce Database menu > New enum class
oppure dal pulsante della palette(Create a new enum
). Una classe Enum è distinguibile nel diagramma dallo stereotipo <<enumeration>>
, e per la presenza di due liste: attributi e literal objects; è possibile aggiungere letterali selezionando Class menu > New literal. Tutti i letterali hanno sempre l’attributo name, una stringa uppercase univoca nel contesto della classe in cui è dichiarato; il name è obbligatorio in quanto identifica il letterale stesso nella lista dei literal objects. Nelle espressioni è possibile referenziare il letterale con la nuova sintassi <EnumClassName>[LITERAL_NAME].name
. Nell’Expression editor, inoltre, Enum e letterali sono elencati in una lista accessibile dal pulsante (Enum constants
), da cui è possibile selezionare gli attributi.
È possibile dichiarare letterali complessi composti da più campi definendo altri attributi sulla classe Enum. Sono consentiti tutti gli attributi platform e alcuni tipi di attributi nativi, mentre gli attributi derivati sono disabilitati. Per costruzione, non è possibile dichiarare vincoli unique o index sugli attributi degli Enum, né impostarli required; l’unico attributo required è name, che è anche sempre object title. I campi dei letterali così strutturati possono essere compilati selezionando Class menu > Edit literal objects (a eccezione del name, che può essere cambiato rinominando il letterale sulla classe). Come per il name, nelle espressioni è possibile referenziare gli attributi del letterale con la sintassi <EnumClassName>[LITERAL_NAME].<AttributeName>
.
Le uniche relazioni consentite con classi Enum sono associazioni unidirezionali, con l’Enum come target, con cardinalità Exactly one (1,1) o Zero or one (0,1). A livello di Application Schema è possibile imporre filtri di associazione o selection path sul ruolo che punta l’Enum. Sempre da questo schema è possibile scegliere la rappresentazione dell’Enum nelle form. La rappresentazione di default per nuovi Enum (con il solo attributo name) è un Dropdown menu con i nomi dei letterali come label; se vengono aggiunti nuovi attributi all’Enum, la rappresentazione cambia automaticamente in Single-row table.
Enum nell’applicazione generata
Gli Enum sono supportati in tutta l’applicazione generata:
- nel client web, gli Enum compaiono nelle form delle classi associate;
- in ambito Plugin, nello SPI generato è ora incluso un Java Enum per ogni classe Enum definita del modello. Inoltre, nel framework sono stati aggiunti nuovi servizi per ottenere i riferimenti ai literal object a partire dal name, oltre che dall’ID.
- in GraphQL è possibile specificare i letterali degli Enum nei servizi di scrittura per associare oggetti nuovi o esistenti alla classe Enum;
Per costruzione, le classi Enum non possono mai essere managed (abilitate nell’Application Schema): i valori letterali devono essere modificati esclusivamente da Designer a livello Database Schema, in quanto strettamente legati al modello. Pertanto, non verranno mai generate voci di menu o servizi per scrivere programmaticamente su queste classi, sia in GraphQL che nello SPI.
Enum e manutenzione evolutiva
In ambito di manutenzione evolutiva, il Database Checker e il Database Updater sono stati aggiornati per supportare tutti gli scenari di evoluzione che coinvolgono classi Enum.
Dettaglio: scenari di evoluzione per Enum
Modifiche strutturali:
- aggiunta di una nuova classe Enum (nessun controllo lato modello o database);
- rename di un Enum esistente;
- rimozione di un Enum esistente;
- aggiunta di attributi a una classe Enum esistente;
- rename di un attributo di un Enum esistente (rename automatico delle espressioni che usano la variabile globale);
- rimozione di un attributo di un Enum esistente;
- cambio del tipo di attributo di un Enum esistente;
- aggiunta di un’associazione a 1 verso una classe Enum esistente.
Modifiche ai valori:
- aggiunta di un letterale a una classe Enum esistente (nessun controllo lato model o database);
- rimozione di un letterale da una classe Enum esistente (controllo di reference del valore nelle espressioni del modello);
- modifica del valore letterale (name) di un letterale di un Enum esistente;
- modifica del valore di attributi custom di un letterale di un Enum esistente;
- modifica del valore
__id
del letterale di un Enum esistente; - scambio di
__id
tra letterali di un Enum esistente.
Componenti interessati:, Designer (nuovo costrutto, icona nella palette e opzione nel Database menu, nuovo pannello per la modifica dei letterali), Database Checker (supporto scenari enum), Database Updater (supporto scenari enum), Engine Builder (QueryGenerator e RuntimeQueryGenerator, supporto alla nuova sintassi), Engine Framework (client web, SPI), API GraphQL
Model design & management
Fix gestione delle espressioni query con percorsi non validi
Risolta un’eccezione del Designer quando si cercava di evidenziare il path di un attributo query con espressione invalida o nulla, la cui invalidità era comunque segnalata correttamente con una issue.
Componenti interessati: Designer (Database schema)
Fix editing del List layout della Editable
Risolto un problema per cui, per ruoli rappresentati con la Editable, nel List layout Editor del ruolo non era possibile aggiungere nuove colonne relative ad altri ruoli della classe.
Componenti interessati: Designer (Application schema > List layout Editor)
Fix tabelle non create in caso di relazioni unidirezionali verso classi Form
In precedenza era possibile collegare classi Form alle normali classi usando associazioni bidirezionali, che venivano implicitamente convertite in unidirezionali. In alcuni scenari, questo portava alla mancata creazione delle tabelle relative alle classi Form.
Il comportamento è stato corretto nel Database Coder. Per eliminare ambiguità, nel Designer è stata reso più stringente il modo con cui ci si associa a classi Form: Ora non è più possibile creare relazioni bidirezionali tra classi normali e classi Form, o relazioni unidirezionali con classi Form come target; l’unica operazione consentita - e per cui il Designer non solleva errori - è creare un’associazione unidirezionale cliccando prima sulla classe Form e poi sull’altra classe.
Componenti interessati: DatabaseCoder, Designer (nuova issue)
Aggiornamento del runtime Java della Dashboard
Aggiornata la versione da OpenJDK 11.0.1 ad AdoptOpenJDK 11.0.8. È possibile verificare la versione Java della Dashboard da Menu > Help > About.
Per utenti base, l’aggiornamento avviene automaticamente col passaggio a Livebase 5.7. Per gli sviluppatori (utenti con parametro --withDomains
) è necessario invece aggiornare manualmente la Dashboard scaricando un nuovo installer dal portale.
Ricordiamo che le vecchie installazioni della Dashboard basate su JNLP Java 8 (Java Web Start) sono deprecate in favore di Java 11. L’aggiornamento manuale in questo caso è richiesto per tutte le utenze ed è necessario per continuare a utilizzare la Dashboard.
Il passaggio alla nuova versione Java migliora notevolmente la stabilità del Designer su tutti gli OS e risolve alcuni problemi noti:
- nel Designer, falliva l’operazione Export as XLSX eseguibile dal pannello degli LCP;
- nella Engine Library, le label degli LCP visualizzate a fianco dei modelli apparivano a metà.
Componenti interessati: Dashboard Client, Designer
Application generation & deployment
GraphQL: Introduzione del _clientId
Aggiunto il supporto al campo _clientId: ID
nelle strutture dati <ClassName>
dello schema generato. Il campo è un attributo speciale con l’unico scopo di fornire un ID temporaneo per referenziare oggetti che ancora non ne hanno uno effettivo perché non ancora persistiti nel database. Questo campo è opzionale: per essere utilizzato deve essere compilato dal client con un valore arbitrario (a es. hash, timestamp o numero casuale).
Grazie al _clientId
, è ora possibile distinguere tra specifici oggetti Part quando si utilizzano servizi come preview
e <RoleName>___associables
per ruoli di composizione.
Contestualmente all’introduzione di questo campo, è stato rimosso il controllo sul modello che impediva la generazione dei servizi GraphQL in caso di modelli contenenti classi prive di attributi scrivibili; dato che ora tutte le strutture in input hanno almeno un attributo scrivibile, questo controllo è superfluo.
Componenti interessati: API GraphQL (schema builder)
GraphQL: migliore supporto alle classi Form
Le classi Form erano già supportate in GraphQL ma erano trattate come classi comuni, pertanto venivano generati servizi inutilizzati. D’ora in poi, il builder genererà solamente servizi e tipi supportati dal Framework per questa tipologia di classe.
Le seguenti strutture e servizi non verranno più generati
<FormClassName>Create
<FormClassName>DraftUpdate
<FormClassName>DraftUpdateBulk
<FormClassName>UpdateBulk
<FormClassName>BulkResult
Query.<FormClassName>___get
Query.<FormClassName>___getPage
Query.<FormClassName>___previewUpdate
Query.<FormClassName>___validateCreate
Query.<FormClassName>___validateDelete
Query.<FormClassName>___validateDeleteBulk
Query.<FormClassName>___validateUpdate
Query.<FormClassName>___validateUpdateBulk
Mutation.<FormClassName>___create
Mutation.<FormClassName>___delete
Mutation.<FormClassName>___deleteBulk
Mutation.<FormClassName>___update
Mutation.<FormClassName>___updateBulk
Solo i seguenti tipi e servizi verranno generati
<FormClassName>
<FormClassName>PageOptions
<FormClassName>Filter
<FormClassName>Cursor
<FormClassName>Sort
<FormClassName>Page
<FormClassName>DraftCreate
<FormClassName>FormActionHandlerResult
Query <FormClassName>___previewCreate
Mutation <FormClassName>___create___formAction___<HandlerName>
Mutation <FormClassName>___update___formAction___<HandlerName>
Le classi Form continuano a supportare i servizi GraphQL per i FormActionHandler introdotti nel rilascio precedente.
Componenti interessati: API GraphQL, Engine Builder, Engine Framework (modifiche a RuntimeQueryGenerator)
Migliorata la verifica dei tipi nei valori di default costanti
Il controllo sul tipo del valore di default di un attributo (impostabile da Application Schema con Attribute menu > Set default value > Constant) ora non tiene più conto del pattern di visualizzazione per i tipi di attributo con pattern - come Date, Time e Datetime.
Componenti interessati: Engine Builder
Fix gestione dei parametri nelle Form conditions
Con l’introduzione degli Enum, è stato sofisticato il modo in cui il framework inizializza gli attributi delle platform class (di cui l’Enum fa parte), risolvendo uno scenario di fallimento del build del modello in presenza di conditions su delle form che fanno uso di letterali.
Componenti interessati: Engine Builder
Fix rilevamento di issue high dopo l’aggiunta di vincoli di cardinalità (1,1)
In alcuni scenari, l’aggiunta di un vincolo di cardinalità Exactly one (1,1) su un ruolo di una classe di un modello con dati pre-esistenti non veniva valutata correttamente dal Database Checker, che avrebbe dovuto segnalare una issue di livello high (i dati pre-esistenti non rispettano il vincolo di cardinalità).
Componenti interessati: Database Checker
Fix servizi interni per la gestione di Enum dal Database Checker
Risolti dei problemi legati alla configurazione interna di alcuni servizi e descrittori dell’Hosting Servant e del Cloudlet Framework usati dal Database Checker per scenari di modifica che includono le classi Enum.
Componenti interessati: Hosting Servant, Cloudlet Framework (database)
Ripristinata la possibilità di abilitare il Single Sign-on (SSO) sulle Cloudlet
È stata ripristinata una proprietà nel descrittore della Cloudlet affinché “sappia” di essere configurata con SSO.
Contatta Fhoster per abilitare l’integrazione SSO.
Componenti interessati: Cloudlet Framework
Application management
Migliorata l’operazione Check engine/DB alignment
Con l’introduzione degli Enum è stata sofisticata l’operazione per consentire di rilevare eventuali disallineamenti tra i record presenti sulle tabelle degli Enum nel database, e quelli definiti nel modello.
Componenti interessati: Hosting Servant
Fix mancato aggiornamento del Database Compatibility Report a seguito di un Force check database
In precedenza, se si accedeva al database di una Cloudlet su cui erano presenti issue high per incompatibilità dei dati (ad esempio il dominio di un attributo), si risolveva manualmente la issue e in seguito si lanciava il comando Database issues > Force check database, le issue non venivano aggiornate.
Attualmente il problema è risolto lato server: il report viene correttamente aggiornato ed è possibile avviare la Dashboard, ma sulla Dashboard resta la notifica delle issue sull’icona del database. È comunque possibile refreshare manualmente la Dashboard per far sparire le issue.
Componenti interessati: Dashboard Servant
Fix eccezione nell’importazione di fogli Excel con composizioni
L’importazione di fogli Excel, in presenza di composizioni falliva per via di alcuni errori di CXF che impattavano i componenti Database Checker e Importer.
Componenti interessati: Database Checker, Database Importer (ExcelImporter), Dashboard Servant
Release 5.6.2 #
Novità
GraphQL: Ora è possibile richiamare i FormActionHandler via GraphQL.
Dettaglio: Servizi
formAction
Mutation.<ClassName>___create___formAction___<HandlerName>
- Invoca l’handler su un nuovo oggetto della classe;
- Accetta in input un
<ClassName>Create
e unjsonParam
opzionale;
type Mutation { ClassName___create___formAction___HandlerName( data: ClassNameCreate! jsonParam: String ): ClassNameFormActionHandlerResult }
Mutation.<ClassName>___update___formAction___<HandlerName>
- Invoca l’handler su un oggetto esistente della classe;
- Accetta in input un
<ClassName>Update
ed unjsonParam
opzionale;
type Mutation { ClassName___update___formAction___HandlerName( data: ClassNameUpdate! jsonParam: String ): ClassNameFormActionHandlerResult }
Dettaglio: Tipo di ritorno e strutture di supporto
- Viene generato il tipo model-independent
FormActionHandlerResult
e le seguenti strutture a supporto:
type FormActionHandlerResult { # analogo alla struttura ritornata dal FormActionHandler dello SPI generato type: FormActionHandlerResultType! message: FormActionHandlerMessageResult } enum FormActionHandlerResultType { MESSAGE NONE } type FormActionHandlerMessageResult { type: MessageType! message: String! title: String } enum MessageType { ERROR INFO WARNING }
- Viene generato il tipo model-dependent
<ClassName>FormActionHandlerResult
:- È un wrapper di un
FormActionHandlerResult
e include l’oggetto corrente su cui l’handler è stato invocato, eventualmente alterato dal codice del plugin.
- È un wrapper di un
type ClassNameFormActionHandlerResult { data: ClassName # oggetto corrente su cui è stato invocato l'handler, eventualmente alterato dal codice del plugin result: FormActionHandlerResult! }
Il supporto ai
FormActionHandler
in GraphQL è in beta, relativi servizi vengono generati al momento solo per classi Main.WorkgroupFramework: Aggiunta la proprietà
ENABLE_QUICK_QUERY_NUM_OF_DATASET_OBJECTS
che rende configurabile il modo con cui viene calcolato il numero di oggetti presenti nelle tabelle delle classi.- Se la proprietà non è presente o ha valore
false
, il DAO EngineDatabaseStatistics_DAO userà la queryCOUNT(*)
standard, più accurata ma meno performante. - Se proprietà è presente e ha valore
true
, il DAO userà la querySHOW TABLE STATUS WHERE NAME = <nomeTabella>
, prendendo il valore della colonna rows. Tale query è estremamente rapida anche in caso di tabelle con milioni di record, ma può restituire valori poco accurati con il crescere del numero dei record della tabella.
- Se la proprietà non è presente o ha valore
Bugfix
- DashboardServant - Risolto un problema relativo all’operazione Delete all della Engine Library per cui gli engine installati sulle Cloudlet non perdevano il riferimento al numero di versione di eventuali relativi modelli in libreria.
Miglioramenti
CloudletDatabaseManager - Ottimizzata l’operazione di fetch del DatabaseFingerprint per migliorare le prestazioni nel caso di DB molto grandi intorno al mezzo milione di record e oltre.
Dettaglio
- CloudletDatabaseManager - Modificata la costruzione del DatabaseFingerprint, in modo che i TableDescriptor contengano un flag sulla presenza o meno di record nella tabella al posto del numero esatto di record.
- DatabaseChecker - Il checker utilizza ora il flag
has_records
per decidere se una issue è medium o low. - DatabaseUpdater - Rimosso il campo affectedRecords della classe MediumSeverityCompatibilityIssue.
- Dashboard - Rimosso il campo affectedRecords della classe DashboardMediumSeverityCompatibilityIssue.
DashboardServant/HostingServant - Migliorate le prestazioni dell’operazione di start della Cloudlet: se l’account possiede un’altra Cloudlet in cui è presente lo stresso engine, alla stessa versione, generato con l’ultima versione del builder e in stato deployed, il prodotto del build viene riutilizzato, con notevole risparmio di tempo.
Altro
- Designer (Form Layout Editor) - Inibita l’opzione reset default per la property
type
del bottone Exec plugin (relativo a un FormActionHandler). - DashboardServant: Riportato il tempo di timeout di comunicazione CXF a 5 minuti.
Release 5.6.1 #
Novità
Designer
- Ora è possibile aggiungere/rimuovere degli indici sul DB relativi a uno o più attributi del modello. La gestione degli index nel Designer è possibile a livello di Database Schema ed è del tutto analoga a quella dei vincoli unique:
- Per creare un index su uno o più attributi, selezionarli e dall’Attribute menu cliccare su
Make index
. - Per ciascun index viene aggiunta un’icona bookmark sul footer della classe; le icone sono ordinate da sinistra a destra per data di definizione, ma sempre dopo eventuali icone di unique constraint sulla classe.
- Per gestire gli index sulla classe, aprire il Class menu e cliccare su
Edit indexes...
. Il Class index manager è analogo al Class constraints manager. - Dal Class index manager è possibile definire nuovi index che coinvolgano anche i ruoli a uno della classe, in modo analogo agli object constraints nei vincoli unique. L’ordine in cui i ruoli sono inclusi nell’index è rilevante.
- Cliccare sull’icona di un index nel footer evidenzia gli attributi coinvolti nella classe. Viceversa, cliccare su un attributo su cui è definito un index evidenzia la sua icona. Questo comportamento inverso è stato esteso anche per gli unique constraint.
- Per creare un index su uno o più attributi, selezionarli e dall’Attribute menu cliccare su
- Risolto un problema relativo alla gestione interna dello stato della Canvas che causava un crash in alcune condizioni particolari.
- Ora è possibile aggiungere/rimuovere degli indici sul DB relativi a uno o più attributi del modello. La gestione degli index nel Designer è possibile a livello di Database Schema ed è del tutto analoga a quella dei vincoli unique:
DatabaseChecker
- Il checker verifica che eventuali index definiti nelle classi del model siano correttamente mappati sul DB, e viceversa (un eventuale index sul DB trova riscontro nel model). In risposta a queste verifiche, il checker crea gli updater appropriati per gestire gli scenari.
- Aggiunto il supporto per la mappatura degli indici tra model e database, con relativa creazione degli updater per la rimozione ed aggiunta di indici dal DB.
- Esteso il supporto alla gestione dei plain index sui ruoli a 1 e per la verifica del corretto ordinamento delle colonne nella definizione dell’index.
DatabaseUpdater - Aggiunti i seguenti updater:
createIndexConstraint
(aggiunta di un nuovo index non presente sul DB);dropIndexConstraint
(rimozione di un index presente sul DB);dropIndexConstraint
+createIndexConstraint
(modifica di un index presente sul DB in termini dei suoi constraintObjects).
DatabaseCoder - Introdotto il supporto per la generazione degli indici plain sulle tabelle di classe.
Applicazione Generata
- EngineFramework/EngineBuilder: Aggiunto il supporto al versionamento delle classi part nell’applicazione generata.
- SPI: Aggiunta la nuova interfaccia
FormActionHandlerInvoker
e resa disponibile all’interno dellaRestletServerResource
per permettere al plugin GraphQL e alle risorse REST plugged-in di richiamare programmaticamente i FormActionHandler.
Bugfix
- Designer - Risolto un problema relativo alla gestione interna dello stato della Canvas che causava un crash in alcune condizioni particolari.
Miglioramenti
Model - Modificato il default di abilitazione del versionamento dei ruoli part di classi versionate. Se il versionamento è abilitato per la classe part, lo sarà anche per il ruolo e viceversa.
Commento degli sviluppatori
La semantica del ruolo indica che l’applicazione generata è in grado di gestire il versioning della relazione tra gli oggetti whole e part, e non solo delle classi come entità non correlate tra loro.
A differenza del legame di associazione, il legame di composizione è legato al ciclo di vita dell’oggetto, ed un part non potrà mai avere legami con un whole diverso da quello che l’ha creato (legame nella relazione whole-part chiaramente, altri legami si).
Quando viene editato un part senza che venga editato il whole, l’applicazione inserirà automaticamente anche il whole nella transazione, per fare in modo tale che le versioni degli oggetti viaggino sempre coerentemente nella linea temporale degli eventi.
DatabaseServant - Migliorato il servizio isModelForked per coprire uno scenario in cui il warning di fork di versione dei modelli veniva mostrato anche per modelli con root diverse.
Dashboard - Migliorato il controllo sul fork nella versione dei modelli/engine.
Altro
- ModelXml - Rimosso il pattern nella validazione dell’attributo email della classe _User.
Release 5.5.5 #
Novità
- Applicazione Generata > SPI - Aggiunta l’interfaccia
ImmutableEntitySession
. Questa viene attualmente iniettata nel context del ValidationHandler e del ListPrintHandler e permette di recuperare e navigare ImmutableEntity e di conoscere lo stato di una entity all’interno della sessione (creata, eliminata, modificata).
Miglioramenti
- DashboardServant - Migliorato il controllo sul fork nella versione dei modelli/engine. Ora il warning viene mostrato anche all’apertura di engine in stato modified.
Release 5.5.4 #
Novità
Dashboard/DashboardServant - Aggiunto un controllo sul salvataggio dei modelli per verificare se l’utente stia creando un fork nel versionamento di tale modello. Se per il modello salvato è presente una versione più recente nella Engine Library o installato su una Cloudlet, l’utente riceverà un warning non bloccante.
RuntimeQueryGenerator - Introdotti due servizi per ottenere le versioni storiche di oggetti, che rendono possibile sia l’utilizzo del RQG al posto dei DAO generati in tutte le situazioni, che l’aggiunta di un servizio GraphQL per il recupero dei dati storici. I servizi sono:
RuntimeQueryGenerator.selectObjectVersions()
: ritorna un RuntimeSelectQuery ordinabile contenente una lista delle versioni storiche dell’oggetto.RuntimeSelectQuery.setSelectForSystemTimeAsOf(Timestamp timestamp)
: ritorna una singola versione storica dell’oggetto. È disponibile dal RuntimeSelectQuery per supportare anche lista, associati e associabili.
Applicazione Generata > EngineFramework - Grazie ai nuovi servizi del RuntimeQueryGenerator, è possibile utilizzare quest’ultimo anche per il retrieve degli oggetti associati storici nelle rappresentazioni di associazione single attribute (listbox, radio buttons, …).
Bugfix
EngineFramework - Risolto un problema relativo all’uso del RuntimeQueryGenerator nel retrieve degli associati nelle rappresentazioni di associazione single attribute dovuto a dei parametri mancanti nella chiamata.
DashboardServant - Risolto un problema relativo al mancato aggiornamento della tabella
@efw@dbplate
durante drag di un modello in libreria sulla Cloudlet.DashboardServlet - Ora lunghe sessioni di edit su un modello non fanno scadere la sessione di lavoro.
Miglioramenti
- Designer - Migliorata l’enfasi del legame tra classi Form e Service Handler (FormActionHandler/ListActionHandler) dichiarati su altre classi connesse alla classe Form. La semantica dell’highlight è la stessa degli attributi query:
- Se il modellatore seleziona la classe Form, vengono illuminati in blu tutti gli Handler che la referenziano.
- Se il modellatore seleziona l’Handler, viene illuminata in rosso la classe Form da esso referenziata.
Altro
Applicazione Generata > EngineBuilder - Per risolvere alcuni problemi sia funzionali che di prestazioni nel retrieve delle rappresentazioni di associazione single attribute, sono stati reintrodotti i DAO generati che nel rilascio precedente erano stati sostituiti dal RuntimeQueryGenerator. L’applicazione può usare entrambe le strategie (DAO o RQG), la scelta è configurabile a runtime con la property
USE_RUNTIME_QUERY_GENERATOR
.Designer - Rimosso il supporto ai tipi di attributo file e image nelle rappresentazioni non tabellari.
Release 5.5.3 #
Novità
Algoritmo LCP - Introduzione di un nuovo algoritmo di calcolo della complessità dei modelli, che viene ora espressa mediante gli LCP (Livebase Complexity Points), in sostituzione degli UFP (Unique Functional Points).
- Designer - Il punteggio del modello corrente è mostrato in alto a destra; cliccando su di esso si accede a un dialog che mostra il contributo degli elementi del modello nel calcolo del punteggio. Sono disponibili due modalità:
- Per schema: albero Schemi -> Contributo classe -> Contributo membri nello schema
- Per classe: albero Classi -> Contributo schema -> Contributo membri nello schema.
- Dashboard - I punteggi LCP sono visualizzati in un campo nella tabella delle versioni di un modello e nella Engine Library; è possibile ordinare i modelli in libreria in base a questo campo.
- Designer - Il punteggio del modello corrente è mostrato in alto a destra; cliccando su di esso si accede a un dialog che mostra il contributo degli elementi del modello nel calcolo del punteggio. Sono disponibili due modalità:
DashboardServant - Aggiunto il comando Force Rebuild al menu della Cloudlet, che consente di richiedere esplicitamente il rebuild del suo engine.
DatabaseChecker - È ora possibile abilitare il versionamento sulla classi part del modello, sia su quelle ex-novo che su part preesistenti. È inoltre possibile aggiungere composizioni verso classi part su cui è già abilitato il versionamento.
Designer/EngineBuilder/EngineFramework - È ora possibile di utilizzare tutti gli attributi definiti nella classe __User all’interno delle rule del Form Layout Editor.
EngineBuilder - Aggiunta l’annotazione
--GRAPHQL_SCHEMA_INPUT_NOT_REQUIRED
che permette di discriminare la presenza del marcatore required!
su attributi e ruoli dello schema generato per le API GraphQL.Applicazione Generata > SPI
- Introdotto il servizio
context.result.failure(String, boolean)
nel ValidationHandler, che consente di forzare il tipo di fallimento della validazione (bloccante/non bloccante). - Ora è possibile visualizzare i javadoc dello SPI direttamente nell’IDE.
- Introdotto il servizio
Bugfix
Dashboard (multi-utente) - Risolto un problema relativo al reserve/release per cui l’edit di un modello in libreria non caricava l’ultima versione del modello.
Designer (List Layout Editor) - Risolto un problema per cui gli attributi derivati non venivano visualizzati correttamente nell’editor.
Applicazione Generata > SPI - Risolto un problema relativo alla modifica dei ruoli di associazione degli
StubEntity
che causava unaUnsupportedOperationException
nello scenario in cui allo Stub veniva associato unoStubImmutableEntity
.
Miglioramenti
Nuovo Excel Importer - L’Excel Importer è stato completamente re-ingegnerizzato. Grazie all’adozione del processamento di file via streaming, è ora possibile effettuare l’upload di file tabellari di grandi dimensioni.
- DashboardServant - È stato rimosso il limite sulla dimensione consentita dei file
.xlsx
inviati al DashboardServant. - ExcelDataImporter - Modificata l’operazione Import Data per gestire l’eventuale rollback delle modifiche nello scenario in cui l’importazione di un file comporti lo sforamento del limite di oggetti sul DB assegnati alla Cloudlet.
- DashboardServant - È stato rimosso il limite sulla dimensione consentita dei file
Designer - Migliorate le prestazioni in apertura dei modelli: se un modello non è stato modificato (ad esempio, viene aperto in sola lettura), il passaggio alla modalità edit non provoca un’ulteriore lettura dell’XML e consente di ricaricare il modello rapidamente
DashboardServant/HostingServant - Migliorate le prestazioni nel salvataggio degli engine delle Cloudlet grazie all’ottimizzazione della chiamata effettuata al DatabaseChecker.
Applicazione Generata > EngineFramework - Il RuntimeQueryGenerator viene ora utilizzato per il retrieve degli oggetti associati e associabili nelle rappresentazioni di associazione single attribute (listbox, radio buttons,…). Questo risolve alcuni problemi di performance e di funzionalità derivanti dalla vecchia implementazione basata nella generazione della query globale eseguita dal DAO.
Altro
- ExcelImporter
- Abbandonato il supporto ai file di tipo
.xls
, l’unica estensione supportata è.xlsx
. - Abbandonato il supporto alla modalità Create, l’unica modalità supportata è Append. L’importer consente quindi solo l’aggiunta di dati a classi già esistenti nel modello.
- Tutti i fogli ora opereranno quindi in modalità Append, rendendo non più necessario il suffisso “
+
” che rimane comunque supportato per retrocompatibilità.
- Tutti i fogli ora opereranno quindi in modalità Append, rendendo non più necessario il suffisso “
- I dati importati di tipo datetime utilizzano il parametro
SQL_DATETIME_TIMEZONE
nel calcolo della timezone.
- Abbandonato il supporto ai file di tipo
ExcelImporter e celle datetime
Sui file Excel non è presente l’informazione della timezone per le celle di tipo datetime, pertanto si assume che chi ha compilato il file lo abbia fatto lavorando con le date alla stessa timezone usata dal database della Cloudlet. Data questa assunzione, in fase di importazione non è necessario fare ulteriori processamenti che coinvolgono la timezone.
Release 5.5.2 #
Novità
- DashboardServant - Aggiunta l’operazione
forceCheckDatabase
, utile per calcolare le differenze tra il database esistente della tabella@efw@dbplate
con il modello nella Cloudlet. L’operazione è disponibile:- Sulla Dashboard, con il comando Force Check Issues, disponibile dai menu Database o Database Issues di una Cloudlet.
- Nel LivebaseGradlePlugin con il task
checkDatabase
.
Bugfix
DashboardServant - Risolto un problema di archiviazione a valle di una rinominazione di un engine il cui modello è già archiviato.
ExpressionParser - Risolto un problema relativo all’uso di attributi di tipo datetime nei filtri ed espressioni nel caso in cui la proprietà
SQL_DATETIME_TIMEZONE
impostata è diversa daGMT
.DatabaseChecker - Risolto un problema relativo alla modifica alla cardinalità di un ruolo part da 01 ad 1 con dati che non rispettano la nuova cardinalità, che comportava in alcuni casi un mancato sollevamento della relativa issue.
EngineFramework - Risolto un problema relativo al retrieve di campi di tipo date che causava una
SQLException
.Applicazione Generata > EngineFramework
- Risolto un problema relativo al retrieve di campi di tipo date che causava una
SQLException
. - Risolto un problema di regressione che portava a un errore di violazione del vincolo unique sugli ID durante il persist di oggetti creati tramite Handler.
- Risolto un problema che generava un errore di disallineamento su oggetti non modificati dall’utente, ma aperti unicamente in lettura all’interno della sessione.
- Risolto un problema relativo al retrieve di campi di tipo date che causava una
Altro
- ExcelModelImporter - Adozione della libreria StreamingXls. Il nuovo ExcelImporter lavorerà solo in Append e non saranno previste modifiche del modello.
Release 5.5.1 #
Bugfix
EngineBuilder - Risolto un problema relativo all’injection dell’id del
__CurrentUser
nel valutatore dei warnings dell’oggetto, che causava un’eccezione nell’operazione di save.EngineFramework - Risolto un problema relativo alla gestione dei backup nell’albero dei serventi.
Applicazione Generata > EngineFramework - Risolto un problema per cui un Handler non riusciva a effettuare l’override del valore di un attributo su cui era definito un valore di default.
Miglioramenti
EngineFramework - Ottimizzazioni interne del framework con l’introduzione del RuntimeQueryGenerator come componente. Ciò consente di riusarne la logica nelle seguenti operazioni:
- Retrieve di dati delle tabelle nelle liste degli oggetti.
- Retrieve di dati delle tabelle degli oggetti associabili.
Applicazione Generata
- WorkgroupFramework: i platform attribute
__lastModifiedOn
,__createdOn
e__ownedOn
relativi agli utenti della Cloudlet ora rispecchiano il valore della proprietàSQL_DATETIME_TIMEZONE
all’interno del framework di amministrazione. - GraphQL - La proprietà
SQL_DATETIME_TIMEZONE
viene usata anche per la per la costruzione del RuntimeQueryGeneratorFactory. Le proprietà della Cloudlet di tipo system presenti nella tabella@sys@properties
sono ora esposte ai plugin di tipo REST sotto forma dijava.util.Properties
.
- WorkgroupFramework: i platform attribute
Release 5.5 #
Novità
Applicazione Generata > EngineFramework - Introdotto il supporto per l’apertura delle differenti versioni di un oggetto di una classe storicizzata. Il pannello di dettaglio di una versione dell’oggetto è rappresentato, oltre all’object title, da un’icona a forma di orologio e dal timestamp della versione.
EngineBuilder - Aggiunta l’annotazione
--ROLE_ASSOCIABLE_REPRESENTATION_CONFIGURATION
per permettere di configurare il caricamento della tabella degli associabili.DashboardServant - Aggiunti i campi
TRACE_ID
eCORRELATION_ID
nei log.
Bugfix
DatabaseChecker - Risolto un problema per cui nella descrizione delle issue tipo
CLASS_CREATED
eATTRIBUTE_CREATED
non venivano valorizzati rispettivamente i parametri del nome della tabella e del nome della colonna mancanti sul DB.Applicazione Generata > EngineFramework - Risolto un problema relativo alla visualizzazione errata di un campo di tipo datetime a seguito del passaggio al nuovo driver MariaDB.
Miglioramenti
- DatabaseChecker - Il meccanismo è stato migliorato per supportare la rimozione “smart” della storicizzazione di una classe.
Commento degli sviluppatori
Dal momento che operazioni di modifica su una classe storicizzata o sui suoi attributi e relazioni (a es. rinominazione) sono impedite finché la policy non viene disattivata, è ora possibile applicare queste modifiche al DB se contestualmente anche la policy viene disattivata.
In passato il modellatore era costretto invece ad applicare le modifiche sul DB in due passi successivi: prima la rimozione della policy di storicizzazione, e poi eventuali operazioni sulla classe.
Altro
Designer - Aggiunto il supporto per impedire l’abilitazione della policy di storicizzazione su classi part.
DatabaseChecker
- È stato abbassato a low il livello della issue sollevata nello scenario in cui si ha una classe storicizzata che partecipa come classe main a una composizione, e la composizione viene trasformata in associazione.
Commento degli sviluppatori
La issue sollevata passa da high a low: non viene quindi controllato se la classe main è storicizzata o meno. Restano comunque attivi i controlli sulle cardinalità effettive dell’associazione per valutare se la trasformazione è consentita.
Il motivo del rilassamento dipende dal fatto che la composizione pone una Foreign Key sempre sul part, e quindi una su una tabella non versionata per costruzione, dato che le classi part non possono essere storicizzate.
- Migliorata la gestione delle issue che coinvolgono le
LiveClass
; in particolare, è stato messo a fattor comune il popolamento del report in un unico metodo e la creazione della issue ora è standardizzata.
Release 5.4.1 #
Bugfix
- Applicazione Generata > EngineBuilder/SPI - Risolto un problema relativo alla CloudletEntitySession che comportava il mancato caricamento degli elementi appena creati dopo un persist.
Miglioramenti
- Applicazione Generata > Logging - Ottimizzazione delle stampe dei log “User is not logged in”.
Release 5.4 #
Novità
DatabaseChecker - Sono state introdotte nuove Issue di tipo bloccante per impedire diverse modifiche su modelli già presenti nel database. Le modifiche impedite sono le seguenti:
- La rinominazione di una classe storicizzata;
- La rinominazione o il cambio di tipo di di attributi preesistenti di una classe storicizzata;
Note sulla modifica di attributi storicizzati
Con l’attuale implementazione entrambe le rename comportano la perdita dei dati storicizzati.
Il cambio di tipo da year a integer e viceversa resta possibile, dato che avviene solo nello strato applicativo e non comporta alcun update del database.
- L’aggiunta di un vincolo not null su attributi preesistenti di una classe storicizzata;
Note sull’aggiunta di vincoli not null
L’aggiunta del vincolo può causare un errore SQL se almeno un record “storico” ha valore nulla per la colonna in questione.
- La rinominazione di ruoli preesistenti di una classe storicizzata;
- Il cambio di cardinalità, la modifica di navigabilità o la trasformazione da associazione a composizione di relazioni la cui FK si trovi sulla tabella relativa a una classe storicizzata.
- La trasformazione da composizione ad associazione di relazioni il cui ruolo whole è una classe storicizzata.
- L’abilitazione della storicizzazione di una classe part nel caso in cui esista una associazione con una classe versionata e questa venga trasformata in composizione.
Commento degli sviluppatori
Si è scelto di impedire questo tipo di modifiche del database lato server, quindi sul DatabaseChecker, poiché farlo sul Designer sarebbe troppo bloccante, in quanto esso potrebbe non sapere se la classe è già versionata sul database o il versionamento è stato aggiunto nella stessa sessione di lavoro della rinomina.
HostingServant - Impostata la variabile
system_versioning_alter_history
al valoreKEEP
durante l’update di database su dbms che supportano il system versioning e sul DatabaseUpdaterExecutionPlan creato dall’operazionePrepareDownload_WorkgroupDatabaseUpdatePlan_Async
. Ciò consente di abilitare l’alter su tabelle di classi storicizzate.
Bugfix
Dashboard - Risolto un problema relativo all’offuscatore per apache-poi che rendeva inutilizzabile il comando
export to XLS file
della Function Point estimation.DashboardServant
- Risolto un problema per cui il
DROP DATABASE
non effettuava il drop delle tabelle con system versioning abilitato. - Risolto un errore nell’operazione di Import Excel.
- Risolto un problema per cui il
EngineFramework - Risolto un problema relativo alla connessione ai servizi di amministrazione della Cloudlet che ne impediva l’accesso via REST quando sulla Cloudlet è abilitato il Single Sign-On.
Applicazione Generata > EngineFramework - Risolto un problema relativo all’utilizzo del servizio
showDetail
come risultato del ListActionHandler.EngineBuilder
- Risolto un problema per cui non veniva fornita la corretta connessione al database nel metodo
afterCommit
alDatabaseUpdateHandlerContext
delleImmutableEntity
. Questo problema causava una NullPointerException nella entity quando si provava a ottenere un campo. - Risolto un bug nello stub generato
StubImmutable<className>
che causava unaUnsupportedOperationException
nello scenario in cui un Handler richiedeva un part con cardinalità XN alloStubImmutable
.
- Risolto un problema per cui non veniva fornita la corretta connessione al database nel metodo
Miglioramenti
Dashboard (multi-utente) - Miglioramento alla UX: nel caso in cui non si possiedono i diritti di scrittura, la Dashboard non richiederà più la conferma di apertura di un modello ma lo aprirà comunque; dopodiché sarà possibile effettuare il Reserve esclusivamente dal Designer.
XTend - Il plugin è stato aggiornato dalla versione
1.0.21
a2.0.8
sul branch principale. Questa nuova versione riduce notevolmente i tempi di sviluppo e compilazione.
Altro
- DatabaseChecker - Verificata la possibilità di cambiare il dominio degli attributi di una classe storicizzata.
Commento degli sviluppatori
Ciò è possibile perché attualmente il dominio viene controllato solo sui record live. È quindi consentito cambiare il dominio di un campo senza che i valori storici di esso lo rispettino.
Model
- Le keyword
row_start
erow_end
sono ora proibite nei membri di classe. - I List Layout custom per le Livetable non vengono più alterati automaticamente quando viene creato un nuovo attributo. I List Layout custom delle Editable vengono alterati automaticamente solo se viene creato un nuovo attributo nativo o un nuovo ruolo.
Editable e aggiunta di attributi
Essendo l’Editable un componente sfruttato per l’inserimento di dati, la policy di default quando si crea un nuovo elemento che richieda un input dell’utente è quella di aggiungerlo al layout.
- Le keyword
DashboardServant - Il messaggio sollevato dal
preconditionChecker
è stato modificato come segue:The selected operation cannot be performed because cloudlet does not support system versioning
System - Sono stati analizzati i modelli attualmente in produzione per supportare l’analisi dei requisiti dell’evoluzione degli attuali Class Filter. È stata delineata una roadmap per introdurre il visibility filter e associability filter, che consentiranno di supportare il concetto di grant di visibilità orizzontale dei dati.
Release 5.3 #
Novità
Storicizzazione delle classi
Model: Introdotto il concetto di storicizzazione nell’XML mediante il flag
LiveClass#isVersioned()
, possibile solo per le classi Main native. L’XML resta retrocompatibile senza bisogno di upgrader.Designer: Introdotta la configurazione della storicizzazione delle classi. Si tratta di una struttura simile alla Class Cloning Policy, che può essere abilitata e riempita con i membri della classe selezionati e abilitati alla storicizzazione.
DatabaseCoder: Aggiunto il supporto per la generazione di database con classi versionate mediante l’introduzione di
WITH SYSTEM VERSIONING
nello statement di creazione della tabellaTable#generateCreationStatement
.DatabaseChecker
- Gestione dei seguenti scenari:
- Viene aggiunta una nuova classe storicizzata nel modello.
- Viene abilitata la storicizzazione per una classe già presente nel modello.
- Aggiunta una issue di livello
high
per gestire il controllo sulla versione del DBMS dell’HostingServant; questa è necessaria in quanto per poter abilitare il versionamento di una classe è richiesta la versione10.3.4
di MariaDB.
- Gestione dei seguenti scenari:
DatabaseUpdater: Aggiunto il supporto per l’attivazione della storicizzazione nell’alter delle tabelle delle classi storicizzate.
CloudletDatabaseManager: Aggiunta la gestione di colonne nascoste nel
DatabaseFingerprint
mediante il campoinvisible
, per supportare lo scenario di classi storicizzate con vincoli unique.DashboardServant: Aggiunto un controllo per impedire la creazione del database nello scenario in cui la versione attuale del DBMS non supporta il versionamento e nel modello sono presenti classi storicizzate.
QueryGenerator: Aggiunto il supporto per le seguenti sintassi SQL sulla classe root della query:
for system_time all
, per ottenere la lista delle versioni storiche di un oggetto quando la sua classe è storicizzata.for system_time as of timestamp
, per ottenere la versione di un oggetto in un determinato istante nel tempo.
Applicazione Generata > EngineFramework/EngineBuilder
- Aggiunto il supporto per mostrare le versioni di un oggetto di una classe storicizzata.
Dettaglio
- Le versioni di un oggetto saranno visibili all’interno di una specifica applicazione.
- Se l’utente ha spento determinati attributi perché non vuole che siano visibili all’interno di quell’applicazione, anche la lista che visualizza le versioni storiche di un oggetto deve tenerne conto.
- L’icona che permette di visualizzare la lista delle versioni di un oggetto deve essere visibile solo se la classe del modello è versionata, e se non si sta usando un app pubblica.
- Quando si è in creazione al click sull’icona delle versioni viene mostrato un messaggio che indica che non esistono ulteriori versioni dell’oggetto in quanto lo si sta creando.
- Quando esiste una sola versione dell’oggetto (quella corrente della form), al click sull’icona delle versioni viene mostrato un messaggio che indica che non ci sono ulteriori versioni dell’oggetto.
- Le colonne mostrate nel layout della livetable delle versioni sono tutte le colonne presenti nel layout del management della classe definito a livello applicativo, tranne gli attributi query, oppure math che sono definite in funzione di query (sia query a 1 che query N) in quanto il QueryGenerator non le supporta (e probabilmente non le supporterà).
- Aggiunto il supporto al versioning per attributi di tipo File nel caso di classi storicizzate che includono tali attributi nella policy di storicizzazione.
Applicazione Generata > SPI/EngineBuilder - Aggiunti dei metodi getter per accedere a tutti i servizi offerti dalla Cloudlet all’interno di una risorsa REST aggiunta tramite plugin (RestletServerResource). L’unico servizio non ottenibile è il
CloudletFileStorage
per via del suo meccanismo di clean dei file temporanei.
Bugfix
DashboardServant/EngineBuilder
- Risolto un bug nello stub generato StubImmutable che causava una NPE nello scenario in cui un Handler effettuava una get di un ruolo che nello stub non era stato valorizzato.
- Risolto un bug nello stub generato
StubImmutable<className>
che causava unaUnsupportedOperationException
nello scenario in cui un Handler tentava di aggiungere un oggetto a unImmutableSet
.
Applicazione Generata > SPI/EngineFramework/EngineBuilder
- Risolto un bug in fase di generazione in presenza di classi storicizzate con part con cardinalità 1.
- Risolto un bug relativo all’injection del Correlation Username nelle chiamate GraphQL.
Miglioramenti
Dashboard (multi utente) - Miglioramento della UX:
- Tutte le istanze di Lock/Unlock vengono rinominate in Reserve/Release
- Tutti i comandi tornano abilitati, anche quelli che richiedono un lock, e quando l’utente li seleziona (senza prima aver richiesto il Reserve della risorsa) viene presentato il seguente messaggio
Action cannot be performed because cloudlet is not reserved. Please reserve the cloudlet and try again
.
Altro
- System: Aggiunta di un server di hosting nell’ambiente di validazione.
- DashboardServant/EngineBuilder - Rimossa la deprecazione del metodo
StubSaveActionHandlerContext.Builder.withEntitySession
.
Release 5.2 #
Novità
- Dashboard multi utente - Aggiunto il supporto per la presenza di N sessioni contemporanee relative a utenti afferenti allo stesso account. È stato rilasciato il supporto della gestione della concorrenza per garantire che più utenti modifichino la stessa risorsa (model, Cloudlet). La funzionalità è disponibile a livello CUSTOMER.
Bugfix
- Applicazione Generata > EngineFramework-core - Aggiunto l’header X-Correlation-Username da utilizzare per specificare lo username di un sistema esterno alla Cloudlet, da utilizzare a valle dell’autenticazione come nome utente dell’operazione sulla Cloudlet. Lo scenario è il seguente:
- COME sistema_esterno
- VOGLIO eseguire una chiamata GraphQL (e contestualmente tracciare l’utente del sistema_esterno che ha eseguito l’azione)
- PER poter ricostruire quale utente nel sistema_esterno ha modificato i dati nella Cloudlet Livebase
Release 5.1 #
Novità
Applicazione Generata > EngineBuilder/SPI - Introdotti gli stub per tutti i context dei Service Handler nello SPI.
EngineBuilder - Introdotta nei Service Handler la possibilità di navigare ed editare oggetti relativi a classi raggiungibili nell’Application Schema. Una classe “raggiungibile” può anche non essere managed.
Bugfix
Designer - Risolto un problema relativo al calcolo delle dimensioni degli attributi, che portava a un errore di visualizzazione (il nome dell’attributo terminava fuori dall’area della classe).
EngineBuilder - Risolto un problema relativo al download del file per utente con grant in sola lettura.
Applicazione Generata
- EngineFramework - Risolto un problema relativo alla comparsa di un’eccezione client-side dovuta all’utilizzo del componente Editable.
- GraphQL - Risolto un problema relativo al SERVER ERROR in caso di query contenente almeno un attributo di tipo file e un ruolo.
FileStorage - Risolto un problema CORS relativo al download dei file della Cloudlet.
Altro
- System - Terminata l’analisi delle temporal data table di MariaDB necessaria a fornire un primo supporto alla storicizzazione dei dati.
Release 5.0 #
Novità
GraphQL - Aggiunto il supporto per la generazione e il deploy automatico delle API GraphQL allo start della Cloudlet.
Dashboard - È ora possibile copiare dati e membri tra Cloudlet anche in presenza della classe __User nel modello
Model - I ruoli di classi raggiungibili possono essere attivati.
Applicazione Generata > EngineFramework/SPI
- È possibile estendere l’applicazione generata con risorse REST custom che necessitano di autenticazione mediante l’utilizzo di plugin. Le risorse saranno aggiunte sul path
$CLOUDLET_URL/auth/api/ext/$resourceURL
- È possibile estendere l’applicazione generata con risorse REST custom che necessitano di autenticazione mediante l’utilizzo di plugin. Le risorse saranno aggiunte sul path
Bugfix
DatabaseChecker
- Risolto un problema per cui le constraint definite nel modello venivano riportate con un nome errato nel report verso la Dashboard.
- Risolto un problema relativo alla conversione di una composizione in associazione, nel caso in cui la classe whole sia creata contestualmente alla conversione.
Dashboard - Risolto un problema per cui la posizione dei popup del Tutorial è incorretta quando la dimensione della Dashboard non è standard.
Designer
- Risolto un problema relativo all’anteprima del Form Layout in presenza di label configurate con
setVisible=false
. - Fix per la validazione del diagramma quando si importa una classe dal concept browser.
- Risolto un problema relativo all’anteprima del Form Layout in presenza di label configurate con
Miglioramenti
- Designer - Miglioramento della UX: Refactoring del dialog di definizione delle constraint.
Altro
- Model - Verificata la rimozione di
java.awt.Font
.
Release 4.28 #
Novità
- Applicazione Generata > EngineBuilder/SPI - Aggiunto il servizio
getOldEntity
nel context del SaveActionHandler.
Bugfix
- Designer
- Fix per la scorretta selezione di schemi ormai eliminati.
- Fix per il menu delle variabili utente nell’ExpressionEditor.
Altro
- Dashboard - Upgrade della libreria
HttpClient
.
Release 4.27 #
Novità
DatabaseChecker/DatabaseUpdater - Aggiunto il supporto per le modifiche fatte alla classe __User.
DashboardServant/HostingServant - Aggiunti i servizi di persistenza delle properties per gestire l’abilitazione del Single Sign-On della Cloudlet via Dashboard.
Applicazione Generata > EngineBuilder/SPI - Aggiunto il servizio
getOldEntity
nel context del ValidationHandler.
Bugfix
- EngineBuilder - Risolto un problema di build in presenza di classi con attributi con nome “ID”.
- Designer - Fix della localizzazione del componente preview LiveTable nel Form Layout.
- Applicazione Generata > EngineFramework-core - Risolto un problema relativo alla case-sensitivity del pre-filtro delle Livetable.
Miglioramenti
- Designer - Allineamento dei messaggi di errore nell’importazione di modelli con issue.
- Applicazione Generata > EngineBuilder/SPI - Revisione del naming utilizzato all’interno della SPI fornita agli sviluppatori per l’aggiunta di funzionalità custom mediante plugin.
- Introduzione delle interface
Entity
eEntitySessionFactory
all’interno di tutti gli handler, per deprecare definitivamente l’utilizzo delle interfacce del package bean e della vecchiaCloudletSessionFactory
. - Deprecato il package e le classi
mock
in favore delle nuove classistub
.
- Introduzione delle interface
Altro
- Portale - Rimossa la sezione blog.
Release 4.26 #
Novità
Dashboard - Aggiunta l’informazione sugli URL a cui si connette la Dashboard durante l’upload/download verso l’HostingServant.
Designer (Form Layout Editor)
- Aggiunta la funzionalità di pluralizzazione delle label di default dei ruoli a molti anche nell’editor.
- Aggiunta la funzionalità di copia tra layout associati/associabili nell’editor.
Applicazione Generata > SPI - Aggiunto nella sessione il servizio
public ActionType getActionType(EntityID entityID)
, per conoscere quale azione è stata eseguita su una specifica entity all’interno di quella sessione.
Bugfix
Designer (Widget Properties) - Risolto un problema per cui il valore del visibleItems non rispecchiava quello salvato nel modello.
Applicazione Generata > EngineFramework - Risolto un problema relativo alla mancata cancellazione di file temporanei a seguito dell’esecuzione di un plugin.
Altro
Dashboard
- Modificato il path di avvio del link sul desktop in Windows per risolvere un problema con il runtime VC.
- Il nome del jar del plugin di cui viene fatto l’upload su una Cloudlet viene troncato nel dialog corrispondente se troppo lungo.
Release 4.25 #
Bugfix
- Applicazione Generata > EngineFramework - Risolto un problema che causava l’invocazione di ValidationHandler su oggetti non modificati all’interno della sessione.
Release 4.24 #
Novità
- Applicazione Generata > EngineFramework/WorkgroupFramework - Definita una nuova proprietà della Cloudlet per indicare il tempo massimo oltre il quale gli Stopwatch devono riportare il log del tempo di esecuzione accumulato. Definita una proprietà apposita in riferimento al tempo di esecuzione degli Handler.
Bugfix
- Applicazione Generata > EngineFramework/EngineBuilder - Risolto un problema relativo alla cancellazione di file temporanei durante l’esecuzione di un plugin.
Release 4.23 #
Novità
- EngineFramework/WorkgroupFramework - Aggiunta del flag
--drop.fillDefaultUsers
per popolare il DB con solamente gli utenti di default.- Questo parametro ha senso di essere specificato solo se si sta creando un nuovo database (quindi il flag
-drop
è stato passato) ed è mutualmente esclusivo con gli altri flag-drop.*
. - In particolare, se si è specificato
-drop.fillRandom
verranno comunque creati gli utenti di default, mentre se si è specificato-drop.fillDump
non verranno creati utenti.
- Questo parametro ha senso di essere specificato solo se si sta creando un nuovo database (quindi il flag
Bugfix
- EngineBuilder - Risolto un problema relativo al build del modello in presenza di attributi di tipo date, time, datetime e file all’interno della classe __User.
Release 4.21 #
Novità
Dashboard - Durante l’aggiornamento della Dashboard, l’utente verrà notificato se la versione Java del nuovo pacchetto è obsoleta/non più supportata.
Model
(Permission schema) - La conversione da associazione a composizione ora conserva i diritti sulla classe target/part a livello di Profile Schema.
(Profile schema) - Ora i nuovi profili creati avranno di default permessi full write su tutte le viste applicative su cui vengono abilitati.
Applicazione generata > UtilsSQL - Aggiunto il supporto relativo alla conversione delle eccezioni del framework nelle eccezioni lato SPI.
Applicazione generata > SPI/EngineFramework/EngineBuilder - Aggiunto il
CloudletMember
alla parte statica del framework SPI.EngineFramework - Aggiunto il supporto relativo alla conversione delle eccezioni del framework nelle eccezioni lato SPI.
Miglioramenti
Designer (Concept Browser) - Se una classe part viene importata dal browser senza la sua classe main, essa diventa main nel nuovo modello e le viene aggiunto il class role. Allo stesso modo il class role viene aggiunto se la classe part viene clonata.
Applicazione generata > UtilsSQL - Migliorate le prestazioni riguardo la gestione delle connessioni al DB introducendo nuove regole di pulizia delle connessioni.
Altro
- Dashboard - Da questa versione non sarà più possibile installare la Dashboard su sistemi a 32 bit.
Release 4.20 #
Bugfix
- HostingServant - Risolto un problema relativo al download di un plan di update del database contenente errori.
Release 4.19 #
Miglioramenti
- Dashboard/DashboardServant - Ora il riquadro help della Cloudlet mostra le seguenti informazioni:
ID
,URL
eBuilder-Version
. Quest’ultimo contiene la versione dell’engineBuilder con cui è stato generato l’engine, ovvero la versione della pipeline dell’ultimo rilascio. Tale valore è vuoto per le Cloudlet esistenti prima di questo rilascio.
Bugfix
HostingServant.Core - Risolto un problema per cui un update plan di un database veniva passato alla fase di esecuzione pur contenendo delle eccezioni, lasciando il db in uno stato inconsistente. Ora i plan con eccezioni (che vengono comunque salvati sul db) sono arricchiti con l’informazione di fallimento.
EngineFramework.Core - Mitigati alcuni problemi relativi ai deadlock.
Release 4.17 #
Novità
- Dashboard/Designer - Ora è possibile effettuare l’abort su una selezione più ampia di operazioni, tra tutte le operazioni di upload xml e lettura di modelli.
Miglioramenti
- Applicazione generata > EngineFramework - Migliorato il servizio
EntityLockManager
, allineamento delle politiche di acquisizione dei lock tra le chiamate provenienti dall’applicazione generata e chiamate GraphQL.
Bugfix
Applicazione generata > EngineFramework
Risolto un problema relativo all’errata gestione delle action veto exception nei
FormActionHandler
.Risolto un problema relativo all’aggiornamento dei valori di default degli attributi a seguito di un update fatto da un plugin.
Applicazione generata > SPI
- Risolto un problema relativo ai servizi
getEntity
egetImmutableEntity
che sollevava unaMySQLSyntaxErrorException
nel caso di entityName che utilizzano keyword di MySQL senza essere escaped.
- Risolto un problema relativo ai servizi
Altro
- Designer (Application Schema - List Layout Editor) - Modificate le icone per l’ordinamento nell’editor.
Release 4.16 #
Novità
Dashboard - La finestra della library ora scorre per evidenziare i modelli che vengono importati.
EngineBuilder - Aggiunto il servizio
getConnection()
all’interno deiValidationHandler
. LaConnection
restituita contiene tutti i cambiamenti presenti in memoria che saranno persistiti nelle fasi successive.
Miglioramenti
- Applicazione generata > EngineFramework - Migliorata la gestione del flag
ignoreWarnings
, se pari atrue
, tutte le issue di tipowarning
non vengono valutate.
Bugfix
Designer - Risolto un problema di clipping errato delle classi nella modalità
HighQuality
Applicazione generata > EngineFramework - Risolto un problema relativo alle action veto exception (eccezioni relative a warnings su create, edit, delete, open) sollevate all’interno degli handler che usano la vecchia interfaccia
Session
.
Altro
- EngineFramework/EngineBuilder - Rimosso il supporto alla cardinalità di classe.
Release 4.15 #
Novità
HostingServant - Permessa l’autenticazione su una Cloudlet dell’hosting nel caso in cui la Cloudlet sia configurata per utilizzare il servizio di SSO
Designer (Application Schema - Form Layout Editor) - Ora è possibile l’eliminazione di condizioni multiple
Designer (Canvas) - Verifica rinominazione diagrammi alla pressione dell’
INVIO
Dashboard - Gestione delle sessionExpired causate dall’utente
Applicazione generata > EngineFramework/EngineBuilder
Aggiunto il supporto per il SSO all’interno dell’applicazione generata. Il supporto non è ancora integrabile a livello di sistema, per questo motivo nel momento in cui lato applicazione generata è abilitato il single sign on, tutte le operazioni in scrittura effettuate dalla Dashboard o dall’applicazione generata sugli utenti rilanciano un’apposita eccezione.
Abilitato CORS alle risorse pending
Applicazione generata > SPI - Aggiunti servizi per eseguire lock/unlock esplicito di un oggetto lato SPI
Miglioramenti
Designer - Refactoring del menu per la creazione degli handler; ora gli handler sono raggruppati in due categorie (interaction e persistence)
Dashboard - Verifica vecchia funzionalità di upgrade da JNLP
Model
Verifica vecchia eccezione del ModelChangeManager
Permesso di nascondere una classe anche se non è presente in altri diagrammi
Permettere di nascondere un commento anche se non è presente in altri diagrammi
Verifica eccezione su clonazione applicazione
EngineFramework - Refactoring data validation inside SPI
RuntimeQueryGenerator - Implementata logica
SelectionPath
: soluzione del bug che ignorava eventuali selection path definiti durante il retrieve degli associabili
Bugfix
Designer
(Application Schema - Form Layout Editor) - Risolto bug che visualizzava un drag non valido per le form annidate
Corretta NPE durante l’algoritmo di retain
Risolto clipping a diversi livelli di zoom
WorkgroupFramework - Fix di problemi nell’eseguire una POST per l’invio di file tramite REST
RuntimeQueryGenerator - Risolto il bug relativo all’applicazione di filtri per oggetti associati
Altro
Designer - Eliminato lo scroll automatico durante lo zoom del diagramma
Dashboard - Eliminazione database asincrona
EngineBuilder - Spostamento dei
ModelProcessor
in un progetto specificoEngineFramework - Modificata la gestione del lock pessimistico, abilitando lo stesso utente a poter prendere più volte il lock sullo stesso oggetto.
Release 4.14 #
Miglioramenti
Model - Migliorate le prestazioni dell’algoritmo
QueryPathFinder
. Inoltre, quando si crea un attributo query, l’elenco dei path possibili viene costruito dinamicamente, permettendo all’utente di scegliere da subito i path trovati per primi o di bypassare la ricerca e definire manualmente il path.Designer - Renderizzati correttamente i caratteri speciali HTML (come
<
e>
) nella preview dei filtri sui ruoli.
Release 4.13 #
Novità
Designer
Introdotta una nuova implementazione del componente
JTable
di Swing, usato nella maggior parte delle tabelle presenti in Livebase; questa versione offre una migliore interazione e risponde meglio a resize, scorrimento e riordinamento delle colonne.Aggiunti i comandi
CropAll
,OverviewAll
eCrop&OverviewAll
alla toolbar, che permettono di lanciare i comandiCrop
eOverview
su tutti i diagrammi.Aggiunto il comando shortcut
Export diagram as image...
al menu contestuale del diagramma, che consente di salvare come immagine un diagramma singolo.
Model
- Aggiunto un servizio per referenziare Platform Attribute con prefissi custom; in questo modo è possibile richiamarli anche in GraphQL, dove il prefisso con doppio underscore
__
è riservato ai metadati dello schema.
- Aggiunto un servizio per referenziare Platform Attribute con prefissi custom; in questo modo è possibile richiamarli anche in GraphQL, dove il prefisso con doppio underscore
REST
- Introdotto il supporto al tipo di file nelle operazioni REST.
Dashboard
- (Gestione Risorse): Ora è possibile editare le risorse delle Cloudlet accessibili anche in presenza di Cloudlet non accessibili.
Applicazione generata > SPI/EngineFramework/EngineBuilder - Introdotta la nuova API
CloudletEntitySessionFactory
per creare ed utilizzare una sessione di lavoro su una Cloudlet da plugin.Applicazione generata > EngineBuilder/SPI - Aggiunto un servizio per gli attributi di tipo File che consente di impostare il riferimento a un file del file storage caricato in precedenza.
Applicazione generica > EngineBuilder - Ora è possibile invocare il metodo
get
sul context di unListActionHandler
; quando l’Handler viene eseguito su una lista interna a una form, il servizio ritorna l’oggetto form, mentre ritornerànull
in tutti gli altri casi.RuntimeQueryGenerator - Aggiunto un servizio per referenziare Platform Attribute con prefissi custom; in questo modo è possibile richiamarli anche in GraphQL, dove il prefisso con doppio underscore
__
è riservato ai metadati dello schema.
Miglioramenti
Designer
Miglioramenti all’esportazione di immagini
Rifattorizzato il dialog del comando
Export diagrams as images...
: aggiunto il supporto alla creazione degli star diagram, miglioramento della selezione di diagrammi e classi, miglioramento dell’export del viewport.Migliorato il comportamento del comando
Export diagrams as images
su alcuni sistemi, tra cui Windows.
Applicazione generata > EngineFramework/EngineBuilder - Refactoring della gestione dei file temporanei per il client GWT.
Bugfix
Designer (Application Schema - Form layout editor) - Risolto un problema per cui il Form Layout veniva settato come modificato anche quando non si confermava l’aggiunta di un bottone.
Model - Risolto un problema per cui veniva mostrato un warning errato quando si eliminavano, in blocco, più attributi mutuamente dipendenti.
Dashboard - Corretti alcuni funzionamenti errati nelle API dell’
AlertDialog
, il componente usato per rappresentare i 4 diversi tipi di dialog in Livebase (Message/Error/Warning, Question, Input e Choice).Dashboard/DashboardServant - Risolto un problema relativo all’upgrade delle Cloudlet che impediva lo start a valle dell’upgrade.
- Applicazione generata > WorkgroupFramework - Risolto un problema relativo all’upgrade delle Cloudlet che impediva l’accesso alla homepage delle Cloudlet aggiornate in stato stopped.
Altro
- Designer - Rimossa la funzionalità di ricerca delle ontologie OWL in quanto il servizio web non esiste più.
Release 4.12.4 #
Bugfix
Model - Risolto un problema relativo allo spostamento nel diagramma dei ruoli whole delle composizioni.
Dashboard - Risolto un problema relativo all’avvio dell’eseguibile della Dashboard in ambiente Ubuntu/Mint.
Release 4.12.3 #
Novità
REST - Aggiunto il supporto al tipo file nelle operazioni REST. La servlet risponde all’indirizzo
/fileService
, accetta post conmultipart/form-data
contenenti file (un solo file e’ supportato per il momento).Portale Documentazione - La documentazione di Livebase sarà disponibile d’ora in poi all’indirizzo
docs.livebase.com
. Sotto lo stesso dominio sarà disponibile il nuovo portale Livebase.
- Applicazione generata > EngineBuilder/SPI - Aggiunto un servizio per gli attributi di tipo file per impostare il riferimento a un file precedentemente caricato e già presente nel file storage.
Bugfix
- Designer - Risolti diversi problemi relativi al comando
save model as image
; ora i diagrammi vengono correttamente adattati al meglio per il formato di output scelto.
Release 4.12.2 #
Novità
Model/Designer
(Application Schema) - Ora è possibile configurare il list layout della Livetable degli associabili, disponibile quando viene usata la Livetable come Association Manager (sia per associazioni a uno che a molti):
Aggiunta nelle Widget Properties dell’Association Manager di tipo Livetable una nuova spunta
Use custom list layout
racchiusa sottoAssociable table options
, che apre un nuovo List layout editor relativo al layout della Livetable degli associabili. Le opzioni preesistenti ora sono invece racchiuse sottoAssociated table options
e sono relative alla Livetable degli associati (visibile nella form).Aggiunte nel List layout editor accessibile dal GUI widgets configurator due tab
Associated
eAssociable
: il primo è il layout per gli oggetti associati visibile nella form, il secondo è il layout della Livetable degli associabili.
Dashboard/DashboardServant (Gestione risorse) - Aggiunto il supporto per abilitare/disabilitare il check di ogni singola risorsa assegnata alla Cloudlet; le checkbox sono modificabili dagli account PAYING, mentre sono sempre attive per gli account di tipo EVALUATION.
Miglioramenti
- Model - Irrobustiti i controlli di sicurezza durante il parsing dell’XML del modello: ora la lettura va in eccezione in caso di definizione di entità non valide, prevenendo potenziali attacchi XXE.
Bugfix
Dashboard/DashboardServant - Risolto un problema relativo al fallimento dell’import dei file Excel che causava la perdita di dati dal db della Cloudlet.
DashboardServant - Risolto un problema relativo al fallimento dell’import dei file Excel che causava la perdita di dati dal db della Cloudlet.
Miglioramenti
- WorkgroupFramework - Migliorati i controlli sulle risorse assegnate alla Cloudlet (numero massimo utenti online, numero massimo oggetti del db, traffico mensile massimo, dimensione massima di occupazione dei file gestiti dalla Cloudlet ) e definite delle proprietà apposite per disabilitarli singolarmente.
Bugfix
Designer (Application Schema) - Risolto un problema nel Form Layout Editor per cui le modifiche alla property
numberOfVisibleRows
non venivano lette riaprendo l’editor.Dashboard - Migliorata l’interfaccia del pannello di gestione delle risorse, ora gestisce assegnamenti invalidi passati dal server.
Dashboard/DashboardServant - Ora prima di eseguire un qualunque import di Excel su una Cloudlet viene per prima cosa validato il modello; eventualmente l’import viene bloccato qualora nel modello fossero presenti delle issue. Migliorato il messaggio d’errore.
Altro
- Model/Designer (Database Schema) - Rimozione delle proprietà deprecate in
SystemProperties
, che sono ora presenti nella Platform Class__User
.
Release 4.12 #
Miglioramenti
Portale/Dashboard/DashboardServant
Refactoring della gestione degli account e delle loro risorse.
D’ora in poi saranno presenti solo due tipologie di account: Evaluation (free, una sola Cloudlet con risorse pre-assegnate dal DashboardServant, non modificabili dall’utente) ed account Enterprise (numero illimitato di Cloudlet e risorse illimitate). L’unica risorsa limitata, a prescindere dal tipo di account, sarà il backup storage.
Nella Dashboard è stata rimossa la possibilità di modificare le risorse assegnate alle Cloudlet.
Sul Portale sono state rimosse le aree Subscription, Billing, Order e Invoices dalla sezione My Account.
Designer
(Database Schema/Application Schema) - Migliorata l’usabilità del List Layout Editor
Ora è possibile, cliccando sull’icona
i
a fianco degli attributi derivati, visualizzare un tooltip che riporta, rispettivamente:Math: espressione.
Query: eventuale funzione di aggregazione (nome), path ed eventuale condizione where.
Gli attributi nella sezione
initially hidden
ora sono spaziati della stessa distanza usata per le altre due sezioni.Le icone degli attributi Math e Query ora sono le stesse del Query Expression Editor.
Nel Query Expression Editor, il selettore della funzione di aggregazione ora ne riporta anche il nome per allineamento con l’informazione dei nuovi tooltip.
Release 4.11 #
Miglioramenti
Model (Application Schema) - Ora il valore di default della property
ContextualCreation
èfalse
per tutti i ruoli di associazione.Dashboard - Migliorata la gestione degli errori nell’eliminazione delle Cloudlet. Questo risolve un problema per cui le Cloudlet eliminate scomparivano dalla Dashboard anche quando la delete falliva.
Release 4.10.3 #
Novità
Designer (Database Schema) - Aggiunta l’estensione
p7m
all’interno del dominio degli attributiFile
Model/Designer
Aggiunta creazione diagramma per visualizzare classe con i vicini in uno
star_diagram
. Dal menù della classe nel database schema è possibile selezionare la voceShow neighbours in new diagram
:Il comando è disponibile solo su classi con relazioni ed è abilitato solo se la classe ha almeno due vicini.
Il comando crea un nuovo diagramma chiamato
STAR_
, posizionato dopo il diagramma corrente, in cui è presente la classe selezionata (raffigurata al centro) e tutte le classi a distanza 1 da essa (disposte a cerchio).Aggiunta la creazione di un diagramma per visualizzare il path di una query. Dal menù dell’attributo nel database schema è possibile selezionare la voce
Show path in new diagram
:Il comando crea un nuovo diagramma chiamato
PATH__
, posizionato dopo il diagramma corrente, in cui sono presenti tutte le classi e ruoli coinvolti nel path dell’attributo query selezionato.
Bugfix
Designer - Risolto il problema per cui a seguito dell’aggiornamento di un modello, l’opzione che permetteva di scaricare il modello originale generava un file vuoto (il filtro Xml nelle issue non era in grado di scrivere su file)
Model/Designer - Risolto il problema per cui la clonazione di un diagramma portava il diagramma clonato in ultima posizione. Adesso il diagramma clonato viene inserito subito dopo il diagramma originale
Applicazione generata > WorkgroupFramework - Risolto il problema per cui l’idGenerator forniva sempre id a partire dal valore 1000
Release 4.10.2 #
Novità
ExpressionParser
Aggiunta una nuova funzione
getWeek
che prende in input un valore di tipoDate
oDatetime
e restituisce una stringa che identifica univocamente la settimana di riferimento in accordo con lo standard ISO-8106Aggiunta una nuova funzione
getWeekOfYear
che prende in input un valore di tipoDate
oDatetime
e restituisce un intero che identifica univocamente la settimana di riferimento
Bugfix
Designer (Profile Schema) - Risolto il problema relativo alla presenza di classi con tutti gli attributi spenti ma con ruoli entranti accesi
Applicazione generata > EngineFramework - Risolto il problema relativo all’applicazione di un filtro in memoria funzione di una math calcolata in memoria e dipendente a sua volta da altre math calcolate in memoria
Release 4.10.1 #
Bugfix
- EngineFramework - Risolto il problema relativo all’impossibilità di modificare i parametri di ricerca a seguito dell’applicazione di una ricerca
Release 4.10 #
Novità
- ExpressionParser - Aggiunta la nuova funzione booleana
rangeValueCheck(value, rangeMin, rangeMax, minIncluded=true, maxIncluded=true)
. Ritorna true se value è compreso trarangeMin
erangeMax
,minIncluded
emaxIncluded
indicano se considerare inclusi nell’intervallo rispettivamente l’estremo minimo e l’estremo massimo.
Bugfix
ExpressionParser - Risolto un problema relativo al ritorno del valore
null
dalla valutazione di funzioni su mysql. Questo problema era nascosto da un bug presente nei test dell’expressionParser.Designer
(Database Schema) - Risolto un problema che causava un crash del Designer quando si tentava di eseguire il Reroute di una query con self loop.
(Application Schema) - Risolto un problema che causava un’eccezione in alcuni dialog in modalità read-only.
Dashboard - Risolto un problema relativo al completamento delle azioni sulle Cloudlet in ambiente multiutente.
EngineBuilder - Risolto un problema relativo al calcolo errato di un attributo all’interno di una tabella dovuto alla presenza o meno di altri attributi nel List Layout.
EngineFramework/EngineBuilder - Risolto un problema relativo al calcolo errato di una math all’interno del componente
Livetable in memory
. Contestualmente, sono state migliorate le performance del componenteLivetable in memory
.
Release 4.9.5 #
Novità
- Designer (Permission Schema) - Ora gli Handler disabilitati nell’Application Schema sovrastante appaiono nascosti come accade per gli attributi.
Miglioramenti
- Designer - Irrobustita la gestione della selezione dei ruoli.
Bugfix
- Applicazione generata > WorkgroupFramework - Risolto un problema relativo al retrieve del valore di alcune colonne (tra cui
__createdon
) dalla Livetable del pannello di gestione dei membri.
Release 4.9.4 #
Novità
ExpressionParser - Aggiunte le nuove funzioni
equalsCS(s1,s2)
eequalsCSx(s1,s2,s3)
: consentono la valutazione di uguaglianza insiemistica di due insiemi rappresentati come stringhe, indipendentemente dall’ordine con cui gli elementi compaiono nelle due stringhe. La prima funzione considera stringhe di elementi separati da virgole, la seconda consente di specificare un separatore custom nel terzo parametro.Designer
(Permission Schema) - Aggiunto il comando nel menu contestuale
Set permissions on all classes > Disabled
alle due voci già presentiFull write
eRead only
. Ciò consente di disabilitare i grant del profilo su tutte le classi abilitate per quella vista applicativa.Aggiunta la possibilità di avere note multiple per ogni schema.
Il diagramma speciale Notes è stato rimosso da ciascuno schema, mentre è possibile creare note dalla tab
Schemas > click destro sullo schema > new note
: il nodo a essa relativo è figlio dello schema per cui è stata creata. La clonazione degli schema non include più la clonazione delle note, che ora possono essere clonate individualmente (dalla tabSchemas > click destro sulla nota > clone
). È possibile creare note per tutti gli schemas di livello 0 (i Permission Schema sono quindi esclusi). L’editor delle note è smart e supporta funzioni per copia/incolla, undo/redo e selezione di righe multiple.Aggiunto il comando Edit in dialog dal menu contestuale dei commenti, tramite il quale è possibile aprire una finestra di dialogo in cui è possibile editare il commento senza modificare la dimensione del box che verrà visualizzato sul diagramma.
Ora il menu
Add Hidden Relations
di una classe mostra i ruoli ordinati alfabeticamente.(Diagramma) - Ora l’ordinamento alfabetico dei diagrammi è case-insensitive. Ciò risolve un problema per cui i diagrammi non venivano ordinati correttamente.
Model/Designer - Introdotta una nuova issue
PartFormMustHaveAnAttribute
, visualizzata quando una classe form senza attributi è part di un’altra form, indipendentemente dalla cardinalità. Ciò risolve un problema che impediva il salvataggio del modello.
Miglioramenti
- Designer (Diagramma) - Allineata la corrispondenza delle icone di classi/classi form/classe
__User
) in tutti i menu contestuali e nella tab Classes.
Bugfix
Designer
(Application Schema > Form Layout Editor) - Risolto un problema che impediva la renderizzazione del codice HTML degli snippet in un’esecuzione in ambiente JDK 11.
(Canvas) - Risolto un problema che causava un drag inatteso in seguito al doppio click su un ruolo.
Model/Designer
Risolto un problema relativo alla clonazione delle LinkedApp (applicazioni linkate tramite spunta copy to other applications) che causava la corruzione del modello.
Risolto un problema relativo a una codifica errata nel recupero delle stringhe della localizzazione italiana (caratteri accentati), che causava una visualizzazione errata dei caratteri in ambiente JDK 11.
Dashboard - Risolto un problema relativo al timeout di alcune richieste http verso la Cloudlet.
Applicazione generata > EngineBuilder
Risolto un problema relativo alla creazione di membri della Cloudlet dal pannello di gestione dei membri (Livetable della platform class
__User
).Risolto un problema relativo ai filtri di associabilità, che non mostrava oggetti che avrebbero dovuto essere effettivamente visibili.
Altro
Designer
(Application Schema > Form Layout Editor) - Rimossa la possibilità di modificare le etichette localizzate di widget non localizzabili nel modello, come gli snippet HTML.
Riassegnata la funzionalità di pan della canvas da click destro (tenendo premuto) a Ctrl+Click (uno tra tasto sinistro, destro o centrale del mouse). Ciò risolve problemi relativi all’interpretazione del comando che si verificava su Windows.
Release 4.9.3 #
Novità
- Designer (Database Schema) - Ora è possibile clonare attributi di qualsiasi tipo mediante click
dx -> Attribute Menu -> Clone
. In caso di derivati math e query, viene aperto l’expression editor corrispondente. In tutti e tre i casi, dopo il clone viene mostrato l’editor del nome sul nuovo attributo. Per simmetria, lo stesso comportamento (apertura dell’editor del nome dell’elemento dopo il clone) ora avviene anche per il comando clone di classi (solo per singola classe) e per il clone di Applicazioni/Profili dal tab Schemas.
Model/Designer
- Ora il modello ricorda l’ultima lingua visualizzata per tutti i layout localizzabili del modello (Form layout, List layout, Application Menu). L’impostazione di default è
null
e mostra gli identificatori. - Ora l’abilitazione di un elemento nell’Application Schema ne resetta i diritti nei grant inferiori (Profile Schema), come se la classe fosse stata appena creata.
- Ora il modello ricorda l’ultima lingua visualizzata per tutti i layout localizzabili del modello (Form layout, List layout, Application Menu). L’impostazione di default è
Applicazione generata > WorkgroupFramework - Ora è possibile abilitare/disabilitare in blocco utenti selezionati dalla Livetable di gestione dei membri, mediante gli appositi bottoni Enable/Disable (disponibili quando almeno un membro è selezionato).
Miglioramenti
Designer (Application Schema/Form Layout Editor) - Aumentato da 3 a 5 il numero di default di righe visibili nelle anteprime per tutti i widget disponibili.
Dashboard - Ora è possibile visualizzare la password digitata nel pannello di login mediante toggle a occhio.
Bugfix
Designer
(Canvas) - Risolto un problema di clipping che causava la sparizione dei pallini dei commenti/elementi nascosti in caso di zoom out.
Risolto un problema relativo al clone and paste di più classi, per cui le classi secondarie venivano disegnate fuori dalla Canvas se incollate vicino a un bordo.
(Application Schema/Form Layout Editor) - Risolto un problema relativo al rename delle label di sezioni create con la localizzazione attiva.
(Application Schema) - Corretto un errore relativo alla clonazione di applicazioni complesse.
Release 4.9.2 #
Bugfix
ExpressionParser - Risolto un problema che causava un’eccezione quando il
parse()
di una espressione veniva chiamato in multithreading.Dashboard - Risolto un problema relativo alla dipendenza
javax.activation
che rendeva impossibile l’upload di file su Cloudlet con Dashboard eseguita con Java 11
Release 4.9.1 #
- Applicazione generata > GUIFramework - Miglioramenti e modifiche del comando “Select all” per la rappresentazione
SetOfCheckbox
dei ruoli di associazione: l’opzione ora compare di fianco alla lista sotto l’eventuale opzione Create.
Bugfix
- DatabaseUpdater - Risolto un problema relativo alla rinominazione di un ruolo in un’associazione
0N-0N
che impediva il corretto update del Database.
Release 4.9 #
Novità
- Miscellaneous - Aggiunto il supporto a Java 11 per la dashboard. Creati pacchetti di installazione specifici per i sistemi operativi Windows, Mac OS, Linux.
Release 4.8.2 #
Miglioramenti
- Model - Migliorato il supporto alla codifica UTF-8 per le stringhe dei modelli nelle operazioni di importazione/esportazione.
Bugfix
- DatabaseUpdater - Risolto un problema relativo all’aggiornamento del Database a seguito della rename di un attributo.
Release 4.8 #
Miglioramenti
- Designer (Database Schema) - Migliorato l’algoritmo QueryPathFinder: in caso di path multipli, il menu viene aperto mostrando aggiornamenti “finding paths” e torna disponibile solo al termine del calcolo.
Bugfix
Designer
Risolto un errore relativo al disegno di ruoli di relazione con bend finali nascosti sotto le classi.
Risolto un errore che, in alcuni casi, interpretava come drag dei semplici click prolungati su attributi.
Model - Risolto un errore relativo all’eliminazione di classi in determinate circostanze, che causava la corruzione del modello.
Altro
- Dashboard - Rimossa l’area Trash dalla Dashboard. L’eliminazione degli oggetti avverrà tramite menu contestuale, l’eliminazione delle Cloudlet da menu.
Release 4.7.2 #
Novità
Designer (Application/Localization Schema) - Ora la localizzazione designata come Model Language - ML - viene mostrata come lingua di default nelle preview dei layout dell’Application Schema.
EngineBuilder (Sviluppo Plugin) - Aggiunto il supporto al ListPrintHandler e al SaveActionHandler, ora sono definibili nel modello direttamente dal class menu (senza bisogno di annotazioni).
Miglioramenti
Designer
(Diagramma) - L’algoritmo di ricerca di oggetti grafici è stato migliorato al fine di risolvere dei problemi relativi allo spostamento di elementi nei diagrammi di modelli molto grandi.
(Application Schema) - È stata migliorata l’interazione con drag&drop per i componenti del Form layout editor.
(Application Schema) - Ora gli attributi non visibili in classi non visibili possono comunque essere selezionati come parametri dal Form condition editor.
Bugfix
Designer
Risolto un problema relativo alla creazione dei link di commenti.
(Diagramma) - Risolto un problema relativo all’aggiornamento della canvas quando si aggiunge una classe nascosta dalla scheda classes o dal pallino hidden relations.
Applicazione generata > EngineFramework - Risolto un problema problema relativo all’associazione automatica a seguito della creazione di un oggetto associato all’interno di una form. Ora i nuovi oggetti associati in questo contesto vengono correttamente visualizzati senza bisogno di refresh.
Livetable - Risolto un problema relativo alla selezione di gruppi collassati di tipo date o time.
Altro
Designer
- È stata ripristinata la funzionalità Export XLSX dal menu dello strumento Estimate Function Points
- (Application/Localization Schema) - Ora la localizzazione designata come Model Language - ML - viene mostrata come lingua di default nelle preview dei layout dell’Application Schema.
Release 4.7.1 #
Novità
ExpressionParser - Aggiunta la funzione
getXmlFileInfo
per il tipo File. La funzionegetXmlFileInfo
prende in input un attributo di tipo file e ritorna in output la sua rappresentazione in xml, cosi’ come memorizzata sul db.Model/Designer - Aggiunta la possibilità, per le classi part, di avere le stesse evaluateActions delle classi main per i Class warning
EngineFramework/EngineBuilder - Aggiunto il supporto alla funzionalità sopracitata per un utente CUSTOMER.
Model - Aggiunta del SaveActionHandler e del ListPrintHandler a DEVELOPER.
Dashboard - Aggiunta la funzionalità download dei membri, con implementazione lato client.
Bugfix
- ExcelImporter - Risolti dei problemi relativi al reset della canvas durante l’importazione di file Excel, che causavano alle classi di apparire fuori dalla canvas.
Altro
Model - Modifica delle issue su attributi e ruoli required e rimozione della funzionalità IgnoreIssue.
DashboardServant - Pulizia delle interfacce non utilizzate relative al download/upload delle community.
Release 4.7 #
Novità
Applicazione generata - Introdotta la possibilità di portare il contenuto di una specifica applicazione della Cloudlet (menù e tab) in full screen
Designer - Aggiunto il Role Menu per i ruoli whole nelle composizioni
Applicazione generata > EngineBuilder - Aggiunto il supporto per la Livetable OTF che utilizza il Query Generator a runtime
Miglioramenti
Applicazione generata - Introdotta la Livetable in-memory come componente di default (quando viene scelta la Livetable come rappresentazione per la classe).
Applicazione generata > Editable - Diminuita l’altezza delle singole righe e sostituito il messaggio: “Empty” con “No Data” in caso di visualizzazione di un insieme vuoto
Bugfix
Risolti i problemi di avvio per conflitto librerie slf4j. Aggiornata la versione di cxf.
Designer
Risolto un problema grafico che “schiacciava” le classi tra loro in caso di drag multiplo delle stesse fuori dalla canvas
Risolto un problema grafico che causava flickering continuo dell’icona del cursore sull’hover di classi/ruoli e bordi della canvas
Risolto un problema grafico dovuto al comportamento della utility di Zoom e Crop nei modelli readonly mai aperti con la nuova canvas
Risolto il problema dell’aggiornamento dello stato del pulsante Overview nell’header
Risolto il problema che causava il mancato aggiornamento delle where sugli attributi query su rename della classe
EngineFramework - Risolto il problema relativo alla cancellazione di oggetti di una main class diversa da quella root della session da cui è stato lanciato il plugin
WorkgroupFramework - Risolto il problema relativo alla cancellazione di file appena creati in caso di un’impostazione errata della timezone di sistema
Altro
- Dashboard - Revisione dei messaggi mostrati quando si tenta di eseguire un’operazione su una Cloudlet (open engine) o su un insieme di Cloudlet (switch nel tab di configurazione delle risorse) e lo stato della Cloudlet o di una delle Cloudlet previene o limita l’operazione.