# ManyDesigns Portofino

ManyDesigns Portofino, o più semplicemente Portofino, è un web application framework scritto in Java e distribuito con licenza open source LGPL.
Il framework permette la creazione di applicazioni web basate sui database relazionali. Il processo di creazione delle pagine viene effettuato con un wizard, con una configurazione manuale attraverso l'interfaccia web, o personalizzato con un linguaggio di scripting.
Portofino è principalmente pensato per programmatori Java che sviluppino applicazioni industriali e siti web dinamici. È progettato per soddisfare tre necessità tipiche di un progetto IT quali la produttività, la ricchezza di funzionalità e l'affidabilità dell'architettura.
Le principali caratteristiche dello strumento sono la possibilità di connettersi ad un database esistente per generare un'applicazione web completa e funzionante, in base all'analisi automatica della struttura del database, e la possibilità di modificare l'applicazione stessa mentre essa è in esecuzione, aggiungendo nuove pagine o nuove funzionalità direttamente dall'interfaccia web o, in maniera più tradizionale e strutturata, modificando i sorgenti sul file system, senza necessità di ricompilare e riavviare. Per questo motivo, il framework presenta alcune caratteristiche tipiche di un Content management system oltre a quelle più tipiche di uno strumento RAD.

## Storia

Le versioni del framework 1.x, 2.x, e 3.x (versioni legacy) sono considerate delle evoluzioni incrementali del progetto iniziale, mentre la versione 4 ha introdotto una nuova riprogettazione. La versione 5, uscita nel 2019, non è più basata sul paradigma MVC classico (il client invia un modulo, il server lo processa e restituisce la nuova pagina HTML) ma adotta un modello "rich web application", con un client in Angular Material che comunica via server in modalità REST.
Le versioni fino alla 3 seguono i principi dello sviluppo model driven e della modellazione domain-specific. Le applicazioni sono scritte definendo dei modelli logici, che descrivono le strutture delle applicazioni e le loro funzionalità. In questo senso, i modelli servono allo stesso scopo dei linguaggi di programmazione, ma ad un livello più elevato di astrazione.
La versione 4.x sposta l'attenzione dal modello logico al modello fisico. Anziché vincolare lo sviluppatore a creare attraverso il framework il modello per il database, Portofino permette di connettersi a database esistenti, realizzati eventualmente con strumenti esterni. Rimane possibile effettuare maggiori personalizzazioni dell'applicazione attraverso script scritti in Groovy.
La tabella seguente mostra i principali cambiamenti architetturali fra le versioni legacy e le nuove versioni.
| Funzioni | Versioni legacy | Versioni 4.x | Versioni 5.x |
| framework MVC | Struts | Stripes | Nessuno |
| Persistenza | Soluzione sviluppata internamente | Hibernate 4 | Hibernate 5 |
| Scripting | BeanShell | Groovy | Groovy |
| Framework CSS/JavaScript | Nessuno | jQuery, jQuery UI e Bootstrap | Angular Material |
| Sicurezza | Soluzione sviluppata internamente | Apache Shiro | Apache Shiro |
| Report | JasperReports e JFreeChart | Formatting Objects Processor (FOP), iText e JFreeChart | iText, Apache POI |
| Refactoring del Database | Soluzione sviluppata internamente | Liquibase | Liquibase |
| Altre tecnologie | - | - | Spring |
Nonostante le differenze sopracitate, alcuni principi di progettazione, come la possibilità di modificare l'applicazione tramite la sola interfaccia web, sono presenti in tutte le versioni.
La versione corrente 5.x è attivamente sviluppata, mantenuta e supportata. Le versioni 4.x e 3.x sono mantenute con release per correzioni ai bug. Le versioni 1.x e 2.x sono obsolete e non più mantenute.
Nel 2006 Portofino ha ricevuto il premio Perotto nella sezione industria.
Portofino è stato distribuito nel 2006 come applicazione closed-source. Nel febbraio 2009 è stato reso disponibile in open-source sotto la licenze GPL v3 con FLOSS exception.

## Descrizione tecnica
### Struttura di una applicazione

Portofino è una applicazione web in Java e quindi necessita di un application server per poter essere utilizzata. La distribuzione del framework include anche Tomcat, ma può essere utilizzato anche con altri application server. Il war contiene le librerie del framework, risorse css e JavaScript e le pagine jsp dell'interfaccia predefinita. Il war contiene anche una cartella "apps" dove lo sviluppatore può salvare le sue applicazioni. Un'applicazione (o più semplicemente app) consiste nei seguenti file e cartelle:
* app.properties: il file con le proprietà per l'applicazione
* blobs: la cartella dove sono salvati i file binari
* dbs: la cartella per gli script Liquibase
* groovy: la cartella dove vengono salvate le classi Groovy condivise dall'intera applicazione
* pages: una cartella che contiene le pagine
* portofino-messages.properties: il file I18N per l'internazionalizzazione
* portofino-model.xml: un file xml che contiene le informazioni per la connessione e i metadati
* web: una cartella per le risorse web specifiche per l'applicazione
Questi file e cartelle sono di solito modificati attraverso l'interfaccia web, ma è anche possibile modificarli direttamente sul file system con un editor di testi o un IDE.

### Connettività ai database

Portofino supporta come base dati le seguenti piattaforme commerciali e open: Oracle, Microsoft SQL Server, MySQL, PostgreSQL, e H2. Il framework si connette al database impostato e ne espone le tabelle attraverso un'interfaccia web per le operazioni CRUD. Le tabelle che non hanno una chiave primaria non possono essere esposte con questo metodo. Indici, vincoli di unicità, viste e stored procedure, benché non rilevate dal framework, possono essere utilizzate.
Portofino supporta la maggior parte dei data type dei database. Le chiavi primarie possono essere sia semplici che composte e di tutti i tipi. Supporta anche le chiavi straniere sia semplici che composte.

### Tipologie di pagina

Il framework supporta sette tipologie di pagina come descritto di seguito.

#### CRUD

    Supporta le operazioni CRUD (Create, Read, Update, Delete) su una tabella del database, fornisce inoltre alcune operazioni accessorie come le esportazioni in PDF e Excel.

#### Chart

    Istogrammi e grafici a torta interattivi.

#### Custom

    Un modello per costruire pagine personalizzate.

#### Text

    Testo html formattato con allegati quali immagini o documenti.

#### Calendar

    Un calendario interattivi popolato con eventi estratti dalla base dati.

#### Many-to-many

    Un'interfaccia per gestire le relazioni molti a molti.

#### Change password

    Un'interfaccia per cambiare la propria password.
Tutte le pagine sono implementate come action bean scritti in Java. Le pagine possono essere personalizzate estendendo le classi Java negli script Groovy.