======Creazione di un plugin per Geoweb======
Geoweb è stato sviluppato in maniera da poter funzionare con vari plugin, che ne estendono le funzionalità di base.
Tipicamente si crea un plugin per aggiungere al framework nuovi componenti, che possono essere:
* schede
* widget
* leafItem
* java service lato server (servizi rest per comunicare con terzi, api accessibili da .groovy)
* function lato javascript (formatter lista, api js)
Per fare ciò, durante lo sviluppo, sono state stabilite convenzioni e sono stati creati meccanismi che permettono di poter produrre plugin per il framework, potenzialmente anche senza avere a disposizione il sorgente di Geoweb.
=====1. Creazione progetto plugin=====
Mettiamo di voler creare il plugin //gwplugin//.
I seguenti passi sono validi se si dispone del progetto maven completo di Geoweb.
* da dentro Eclipse: //File => New.. => Maven Module//.
{{:custom:plugin_1.png?600|}}
* Premere '//Next//'.
* si apre la scheda '//Select the module name and parent//'.
* inserire il nome del pugin per '//Module Name//'.
* selezionare 'geowebframework' in '//Parent Project//' .
* Premere '//Next//'.
* si apre ora la scheda '//Select an Archetype//'.
{{:custom:plug2.png?600|}}
* selezionare l'archetype con '//Arttifact Id//' uguale a '//maven-archetiye-quickstart//'.
* Premere '//Next//'.
* Si apre la scheda '//Specify Archetype parameters//'
{{:custom:plug3.png?600|}}
* in '//Group Id//' lasciare il nome suggerito
* in '//Package//' mettere per convenzione com.geowebframework.gwplugin
* Ora bisogna importare il progetto, File => Import.. => Existing Maven Projects
* selezionare la cartella base del framework 'c:\pathToEclispeWorkspace\GeoWebFramework' in 'Root Directory' e mettere la spunta sul progetto da importare in '//Projects//'
* Premere '//Finish//'.
=====2. Struttura progetto plugin=====
Questa è la struttura di massima per il progetto
{{:custom:plug4.png?400|}}
La sezione //src/main/java// ospita il package che segue per convenzione il pattern
'com.geowebframework.' + nomepluginminuscolo
Sempre per convenzione in genere vengono creati dei sotto package //controller, service// e //model// che ospitano le varie classi in base alla loro funzione.
La sezione //src/main/resources// ospita:
* **locale**: ospita i file di localizzazione. dato un locale, mettiamo en, la regola è che vengono inclusi in automatico tutti i file che stanno sotto la cartella locale/, che iniziano per '//messages//_' e finiscono per '_//en.properties//'. Per convenzione in mezzo si usa scrivere il nome del plugin.
* **META-INF**: per come è impostato il dispacher-servelt.xml del webclient essa deve contenere
* //**resources**// ospita i file jsp.
* //**static-resources**// ospita css, debug/js, icons
* //**xxx.beandef.xml**// nel dispacher-servelt.xml del webclient si definisce che in automatico vengano aggiunti alla configurazione tutti i bean spring dentro i file che matchano META-INF/*.beandef.xml .
...
Nel //**pom.xml**// possono essere importate, tramite sintassi Maven, tutte le librerie java richieste.
Dato che probabilmente il plugin è un maven module di progetto maven geowebframework, le librerie che stanno anche nel modulo principale possono anche importate omettendo la versione.
4.0.0
com.geowebframework
com.geowebframework
0.0.1-SNAPSHOT
gwplugin
gwplugin
http://maven.apache.org
8
8
UTF-8
com.geowebframework
dataservice
${project.parent.version}
com.geowebframework
metadataservice
${project.parent.version}
com.geowebframework
transfer-objects
${project.parent.version}
org.slf4j
slf4j-log4j12
=====3. InitializerService=====
Le dichiarazioni dei nuovi widget, leafItem, etc vengono in genere fatte tramite un'apposita classe di inizializzazione presente sotto il package **service** (che per convenzione si chiama come il plugin+'InitializerService', camel case. Es: //GwPluginInitializerService.java//)
Il //bean// di tale classe può essere dichiarato esplicitamente, o può essere istanziato in automatico tramite il component-scan. In entrambi i casi da dentro il //**gwplugin.beandef.xml**.//
Questa è la struttura tipica della classe.
public class GwPluginInitializerService {
private final static Logger log = Logger.getLogger(GwPluginInitializerService.class);
@Autowired private GwRegistry gwRegistry;
public GwPluginInitializerService(){
super();
}
@PostConstruct
public void init(){
//registering widgets
...
//registering leafItem
...
//mapping plugin js resources
...
//mapping plugin css resources
...
}
}
Il bean della classe viene creato in avvio, e l'annotazione //@PostConstruct// causa l'esecuzione del metodo init() non appena tutti i bean dipendenti sono pronti ed istanziati.
**Registrazione widget**
Si rimanda all'apposita sezione per una descrizione approfondita / / TODO ADD LINK
Qui da integrare c'è solo il fatto che eventuali risorse .js o .css usate dal widget possono essere incluse in modo agevole (vedi sotto).
**Registrazione leafItem**
Non vi sono oneri obbligatori. Un tipo di leafItem si dichiara, nell'xml di progetto, semplicemente usandolo nell'attributo type di un tag leafItem (posto sotto un tag leafItemContainer).
Valgono poi tutte le istruzioni contenute nell'[[custom:development#Creazione Nuovo Menu Terzo Livello (leafItem)|apposita sezione]] riguardante la definizione di nuove tipologie di Menu di Terzo Livello (LeafItem).
**Dichiarazione risorsa javascript**
I file js dichiarati da plugin saranno aggiunti all'apertura della pagina jsp principale del progetto, ma per ultimi dopo le seguenti categorie di file javascript, in ordine:
- js dojo framework
- js customDojo
- js comuni
- js specifici del tipo di progetto.
L'ordine può non essere indifferente nel caso in cui nei file js del plugin si faccia riferimento ad entità javascript dichiarate altrove nel framework.
Le risorse verranno importate con usando un //tag// **