custom:external_plugin

Plugin Esterni

…breve descrizione …

Il plugin è stato sviluppato per il caricamento dei dati di uno shape nel database dei dati dell'applicazione di gestore dei servizi energetici. Ha due macro casi; il primo il caricamento dello shape su una nuova tabella, il secondo il caricamento dello shape su una tabella esistente.Oltre il servizio rest 'loadShape' che si preoccupa appunto di caricare i dati, sono stati sviluppati dei servizi rest a contorno per la gestione di una serie di attività necessarie prima del caricamento. Questi servizi rest sono necessari all'interfaccia desktop per consentire il popolamento di un di un file json di metadati che deve essere passato in input oltre il file shape.

  • getAllGeometricClasses()
  • getAllAttributesClass(name)
  • getAllSchema()
  • getAllThemesAllProjects()
  • getAllThemes(id)
  • getAllProjects()
  • classExists(name)
  • tableExists(name)
  • loadShape(file)

Questo servizio è una chiamata post che produce un application/json e non riceve alcun parametro. Restituisce l' elenco di tutte le classi definite nel database dei metadati con le seguenti informazioni:

  • className
  • tableName
  • description
  • label
  • nameFieldGeometryShape
  • nameColumn
  • type
  • datasource
  • fkTheme

Questo servizio è una chiamata post che produce un application/json e riceve come parametro il nome della classe di cui si vuole conoscere gli attributi in una viariabile denominata name. Restituisce l' elenco di tutti gli attributi della classe definiti nel database dei metadati con le seguenti informazioni:

  • columnName
  • dataType
  • label
  • filtered
  • listed
  • hidden

Questo servizio è una chiamata post che produce un application/json e non riceve alcun parametro. Resituisce un elenco di strighe con tutti i nomi dei datasource definiti per l'applicazione.

Questo servizio è una chiamata post che produce un application/json e non riceve alcun parametro. Restituisce l' elenco di tutti i temi definiti nel database dei metadati con le seguenti informazioni:

  • name
  • description
  • gwId

Questo servizio è una chiamata post che produce un application/json e riceve come parametro l'id del progetto in una variabile denominata id. Restituisce l' elenco di tutti i temi definiti nel database dei metadati per quel progetto con le seguenti informazioni:

  • name
  • description
  • gwId

Questo servizio è una chiamata post che produce un application/json e non riceve alcun parametro. Restituisce l' elenco di tutti i progetti definiti nel database dei metadati con le seguenti informazioni:

  • name
  • description
  • gwId

Questo servizio è una chiamata post che produce un application/json e riceve come parametro il nome della classe di cui si vuole conoscere l'esistenza in una viariabile denominata name. Restituisce un json contente nel campo esito 0 o 1 rispettivamente se la classe non esiste o esiste.

Questo servizio è una chiamata post che produce un application/json e riceve come parametro il nome della tabella di cui si vuole conoscere l'esistenza in una viariabile denominata name. Restituisce un json contente nel campo exists 0 o 1 rispettivamente se la tabella non esiste o esiste.

Questo servizio è una chiamata post che produce un application/json e riceve come parametri un file zip in una variabile denominata file. Il file zip deve contenere i files dello shape ed un file json così composto.

  • className
  • tableName
  • description
  • label
  • nameFieldGeometryShape
  • nameColumn
  • type
  • datasource
  • fkTheme
  • srid
  • mgMapName
  • featureSource
  • attributes

I primi 9 attributi riguardano la classe sulla quale caricare i dati.dello shape; Nel caso di caricamento dello Shape su una classe o tabella esistente, tali valori vengono riempiti attraverso le informazioni recuperate dal metodo gettAllGeometricClasses specifiche per la classe di interesse. Nel caso di caricamento dello Shape su una nuova classe o nuova tabella, tali valori vengono popolati dall'utente da interfaccia con l'ausilio delle altre chiamate rest deputate al controllo del nome classe e nome tabella inserito e alla restituzione dei combobox per il popolamento delle altre informazioni.
Il campo srid,mgMapName e featureSource devono essere passati dall'interfaccia, con i seguenti valori fissi:

srid=32633
mgMapName=Library://GSE/maps/MappaImpianti.MapDefinition,featureSource=gsedata

L'ultimo attributo, attributes è un elenco di oggetti ciascuno dei quali riferisce un campo dello shape da caricare. Hanno queste informazioni:

  • description
  • label
  • nameColumn
  • dataType
  • lengthType
  • listed
  • filtred
  • hidden

nameColumn è il nome del campo nella tabella

nameFieldShape è il nome del campo nello shape

dataType è il tipo di dato che può assumere 4 valori: varchar, number, integer, date

lengthtype è la lunghezza del tipo nella tabella e va indicata solo per tipi varchar e solo in caso di nuova tabella

listed,filtered,hidden possono assumere solo valori 0 o 1 e indicano rispettivamente la presenza o meno nella scheda di lista filtro e dettaglio.

Il servizio restituisce un json con questa struttura:

  • log
  • listExceptions
  • InsertionCounter
  • result

log è una stringa contenente un eventuale eccezione intercettata prima del caricamento o vuoto se non si sono verificate eccezioni. InsertionCounter indica il numero di record inseriti correttamente.Result indica l'esito dell'operazione 0 se si è verificata un eccezione (contenuta in log), 1 se è andato tutto a buon fine, 3 se si sono verificati warning. ListException contiene l'elenco degli errori riscontrati in fase di caricamento dei records. Assume una struttura costituita da tutti i dati del record in cui si è verificata l'eccezione e un campo log dove viene riportata l'eccezione java riscontrata sul singolo record.

file json di esempio



Versione geowebframework: a partire dalla 4.6

Si riassumono i passaggi per l'utilizzo del plugin:

  • aggiungere al pom.xml la dipendenza
                <dependency>
			<groupId>com.geowebframework</groupId>
			<artifactId>externalDatabase</artifactId>
			<version>2.0.0</version>
		</dependency>
    

Per ogni nuova connessione applicare i seguenti passaggi:

  • aggiungere nel dispatcher.servlet i beans per la gestione del nuovo dataSource (nel caso di più di una connessione esterna, sostituire il carattere 1 con 2, 3…)
    <bean id="extDbdataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${jdbc1.driverClassName}" />
		<property name="url" value="${jdbc1.url:''}" />
		<property name="username" value="${jdbc1.username}" />
		<property name="password" value="${jdbc1.password:''}" />
		<property name="maxActive" value="${jdbc1.maxActive}" />
		<property name="minIdle" value="${jdbc1.minIdle}" />
		<property name="maxIdle" value="${jdbc1.maxIdle}" />
		<property name="validationQuery" value="${jdbc1.validationQuery}"/>
	</bean>
	
	<bean id="extDbdataSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="extDbdataSource" />
		<property name="configLocation" value="classpath:mybatis-config.xml" />
	</bean>																							    

	 <bean id="extDbService" class="com.geowebframework.externalDatabase.service.ExternalDatabaseService" >
	 </bean>
	
	<bean id="extDbMapper1" class="org.mybatis.spring.mapper.MapperFactoryBean">
		<property name="mapperInterface"
			value="com.geowebframework.externalDatabase.mapper.ExternalDatabaseMapper" />
		<property name="sqlSessionFactory" ref="extDbdataSqlSessionFactory" />
	</bean>
  • aggiungere nel configuration.properties le 8 proprietà (driverClassName, url, username…) per jdbc1 (nel caso di più di una connessione esterna aggiungere le 8 proprietà per jdbc2, jdbc3 e così via)
jdbc1.driverClassName=org.postgresql.Driver
jdbc1.url=
jdbc1.username=nome fisso schema target
jdbc1.password=
jdbc1.maxActive=10
jdbc1.minIdle=2
jdbc1.maxIdle=6
jdbc1.validationQuery=select 1

Per le piattaforme Geoweb , e più in generale nelle installazione che usano il file remapConfiguration.properties, aggiungere al remapConfiguration.properties (esempiO:)

jdbc1.url=GW_DB_URL_PRM
jdbc1.password=PRM_DATI_GW_PWD

Per l'utilizzo del servizio externalDatabaseService, valgono le stesse regole della versione 1.0.0

Geoweb utilizza due connessioni al database: una per i metadati una per i dati.

La connessione ai dati, se configurata per un utente multi schema può permettere di lavorare su diversi schema dello stesso database, ma non di lavorare su database differenti. Il limite del Geoweb è quindi la possibilità, di lavorare su più database differenti. Questo plugin, se incluso nella cartella di deploy (cartella web-inf/lib) supera questo limite, consentendo di definire nel file configuration.properties tanti database quanti si necessita interrogare o manipolare nel proprio progetto.

La configurazione è molto semplice, segue la stessa sintassi dei database definiti per il geoweb: Ad esempio:

jdbc1.driverClassName =oracle.jdbc.driver.OracleDriver
jdbc1.url=jdbc:oracle:thin:@ORA11DEV.GRUPPOESC.IT:1521:ORA11DEV
jdbc1.username=CITY4_DATA_ESC
jdbc1.password=CITY4_DATA_ESC
jdbc1.maxActive=6
jdbc1.minIdle=2
jdbc1.maxIdle=6

Se si volesse aggiungere il secondo database basterebbe aggiungere un altro blocco come segue e cosi via…

jdbc2.driverClassName =oracle.jdbc.driver.OracleDriver
jdbc2.url=jdbc:oracle:thin:@ORA11DEV.GRUPPOESC.IT:1521:ORA11DEV
jdbc2.username=CITY4_DATA_ESC
jdbc2.password=CITY4_DATA_ESC
jdbc2.maxActive=6
jdbc2.minIdle=2
jdbc2.maxIdle=6

E' possibile accedere e fare query nei nuovi database nei trigger groovy. Si rimanda la guida a questo link trigger. L'utilizzo è molto simile a come fino a questo momento sono state eseguite query nel database standard configurato nel Geoweb, ovvero utilizzando un service java disponibile nel codice groovy.

A differenza del database standard, si utilizza l'oggetto java externalDatabaseService al posto del queryService. I metodi che vi troviamo dentro sono gli stessi del queryService standard li elenco qui sotto:

  • executeQuery(query, valuesMap)
  • executeCountQuery(String query,HashMap<String,Object> valuesMap)
  • executeInsertQuery(String query,HashMap<String,Object> valuesMap)
  • executeUpdateQuery(String query,HashMap<String,Object> valuesMap)
  • executeDeleteQuery(String query,HashMap<String,Object> valuesMap)

externalDatabaseService fornisce un metodo aggiuntivo

  • executeInsertQuerySequence(String querySequence,String query,HashMap<String,Object> valuesMap)

questo metodo per l'esecuzione di una query di inserimento in tabella, permette di passare la query per il recupero della sequence e quindi di utilizzare tra i dati di inserimento tale valore denominato map.id utile qualora si voglia popolare la chiave della tabella. In questa maniera si riesce a ovviare al problema della query per il recupero della sequence differente per database differenti.

E' necessario settare ad ogni utilizzo il nome del database su cui si intende lavorare. La sintassi per settarlo è la seguente:

externalDatabaseService.setDatabase("extDbMapper1");

Tutti i database aggiunti nel configuration.properties per convenzione verranno denominati extDbMapper concatenato con il progressivo. Nulla vieta che si possa cambiare.

ATTENZIONE!!!! Qualora si voglia includere il plugin dentro il war, è necessario aprire e controllare prima il file externalDatabase.beandef.xml dentro il plugin. Questo file gestisce le connessioni aggiunte nel file configuration.properties. Se si include il jar nel war, l'applicazione potrebbe non ripartire se non si configurano correttamente tutte le connessioni sia nel file .properties esterno sia nell'xml interno. Per default il plugin ha configurata una unica connessione aggiuntiva. Quindi è necessario includere una connessione aggiuntiva nel file configuration.properties. In questo caso non è necessario fare nulla. Altrimenti, per ogni altra connessione aggiunta dovrà essere aggiunta anche nell'xml all'interno del plugin e dovrà essere configurata come quella di esempio. L'applicazione non parte quando all'interno dell'xml è configurata una connessione non presente nel file configuration.properties. Viceversa, qualora non sia presente dentro xml, l'applicazione parte ma la connessione mancante non potrà essere utilizzata nei groovy. Per la configurazione interna al plugin chiedere supporto ad un programmatore.

  • custom/external_plugin.txt
  • Ultima modifica: 2024/03/07 13:00
  • da francesco.rosati