vai al contenuto principale

Note di rilascio

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 a Date), 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):

Graphql rebuild

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:

GraphQL On/Off functionality

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 a Details...;
  • 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 e SchemaBased, sono state rispettivamente rinominate in Group by class e Group 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 timestamp atVersion 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
    }

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
Esempio: il servizio generico Mutation.<ClassName>___formAction___<HandlerName>:

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

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

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

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 colonna Objects;
  • 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.

Commento degli sviluppatori: compilazione incrementale
Dettaglio: tempi di compilazione a confronto

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.

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 in Upload plugin e spostato accanto al pulsante Download 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 a stop 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

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

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.

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 e getImmutableEntity della EntitySession, che richiedono solo il nome della classe Singleton e non l’id come per le normali classi.

    Dettaglio: Service Handler supportati per Singleton
  • in GraphQL, è supportato un sottoinsieme di servizi per classi Singleton (vedi dettaglio);

    Dettaglio: Servizi GraphQL supportati per Singleton

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.

Dettaglio: Strutture di input draft
Dettaglio: Servizi generici

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.

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;

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

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.

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
Solo i seguenti tipi e servizi verranno generati

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.

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
    Dettaglio: Tipo di ritorno e strutture di supporto
  • 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 query COUNT(*) standard, più accurata ma meno performante.
    • Se proprietà è presente e ha valore true, il DAO userà la query SHOW 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.

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
  • 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.
    • Risolto un problema relativo alla gestione interna dello stato della Canvas che causava un crash in alcune condizioni particolari.
  • 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 della RestletServerResource 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
  • 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.
  • 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.

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 una UnsupportedOperationException nello scenario in cui allo Stub veniva associato uno StubImmutableEntity.

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.
  • 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à.
    • I dati importati di tipo datetime utilizzano il parametro SQL_DATETIME_TIMEZONE nel calcolo della 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 da GMT.

  • 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.

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 di java.util.Properties.

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 e CORRELATION_ID nei log.

Bugfix

  • DatabaseChecker - Risolto un problema per cui nella descrizione delle issue tipo CLASS_CREATED e ATTRIBUTE_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

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
    • 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;
    • L’aggiunta di un vincolo not null su attributi preesistenti di una classe storicizzata;
    • 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
  • HostingServant - Impostata la variabile system_versioning_alter_history al valore KEEP durante l’update di database su dbms che supportano il system versioning e sul DatabaseUpdaterExecutionPlan creato dall’operazione PrepareDownload_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.
  • 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 al DatabaseUpdateHandlerContext delle ImmutableEntity. Questo problema causava una NullPointerException nella entity quando si provava a ottenere un campo.
    • Risolto un bug nello stub generato StubImmutable<className> che causava una UnsupportedOperationException nello scenario in cui un Handler richiedeva un part con cardinalità XN allo StubImmutable.

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 a 2.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
  • Model

    • Le keyword row_start e row_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.
  • 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 tabella Table#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 versione 10.3.4 di MariaDB.
    • 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 campo invisible, 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
      • 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 una UnsupportedOperationException nello scenario in cui un Handler tentava di aggiungere un oggetto a un ImmutableSet.
  • 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

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.

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 e EntitySessionFactory all’interno di tutti gli handler, per deprecare definitivamente l’utilizzo delle interfacce del package bean e della vecchia CloudletSessionFactory.
    • Deprecato il package e le classi mock in favore delle nuove classi stub.

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.

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 e Builder-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 e getImmutableEntity che sollevava una MySQLSyntaxErrorException nel caso di entityName che utilizzano keyword di MySQL senza essere escaped.

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 dei ValidationHandler. La Connection 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 a true, tutte le issue di tipo warning 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 specifico

  • EngineFramework - 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 e Crop&OverviewAll alla toolbar, che permettono di lanciare i comandi Crop e Overview 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.
  • 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 un ListActionHandler; 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 con multipart/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 sotto Associable table options, che apre un nuovo List layout editor relativo al layout della Livetable degli associabili. Le opzioni preesistenti ora sono invece racchiuse sotto Associated 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 e Associable: 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 attributi File

  • 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 voce Show 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 tipo Date o Datetime e restituisce una stringa che identifica univocamente la settimana di riferimento in accordo con lo standard ISO-8106

    • Aggiunta una nuova funzione getWeekOfYear che prende in input un valore di tipo Date o Datetime 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 tra rangeMin e rangeMax, minIncluded e maxIncluded 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 componente Livetable 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) e equalsCSx(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à presenti Full write e Read 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 tab Schemas > 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.
  • 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 funzione getXmlFileInfo 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.