package it.corenet.sincro.frontend;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import java.util.HashMap;
import java.util.Properties;
import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import it.corenet.j2ee.common.LogUtils;
import it.corenet.j2ee.common.xml.XMLUtils;
import it.corenet.j2ee.servlet.ServletToolBox;
import it.corenet.sincro.common.AffineTransformParameters;
import it.corenet.sincro.common.AreaSincrona;
import it.corenet.sincro.common.CostantiSincro;
import it.corenet.sincro.common.IdentificativoComune;
import it.corenet.sincro.common.IdentificativoEnteLocale;
import it.corenet.sincro.common.exceptions.RepositoryAccessException;
import it.corenet.sincro.common.gestorescarico.GestoreScaricoRemote;
import it.corenet.sincro.common.gestorescarico.GestoreScaricoRemoteHome;
import it.corenet.sincro.common.scheduler.JobDescriptor;
import it.corenet.sincro.jobmanager.book.BookingSessionBeanRemote;
import it.corenet.sincro.jobmanager.book.BookingSessionBeanRemoteHome;
/**
* Classe di definizione della servlet di interfaccia del sistema Sincro di sincronizzazione del DBTL di Enti Locali con
* i dati forniti dal sistema SEL dell'Ente Regionale.
* Configurazione
* Per modificare il comportamento della servlet è possibile agire sui seguenti parametri di configurazione.
*
*
Nome | *Significato | *Valori ammessi | *Obbligatorietà/Valore di default | *
---|---|---|---|
codiceEnte | *Specifica il codice univoco dell'Ente Locale dell'installazione. | *Un qualsiasi Codice Belfiore (per i Comuni) o Codice ISTAT (per Province o Comunità Montane) * valido | *SI/nessuno |
*
nomeEnte | *Specifica il nome dell'Ente Locale dell'installazione. | *Il nome dell'Ente Locale corrispondente alla coppia (tipoEnte,codiceEnte) specificati | *SI/nessuno |
*
outputStylesheet | *Specifica il file XSL da utilizzare per il rendering delle risposte | *nessun vincolo |
* SI/nessuno |
*
classpath
.
*/
public static final String PNAME_SDO_SHAPE_TABLE_FILE_PATH = "tableFilePath";
/** Nome del parametro che specifica il percorso assoluto della directory contenente gli shape generati. */
public static final String PNAME_SDO_SHAPE_FILE_PATH = "shapeFilePath";
/** Nome del parametro che specifica il nome del file contenente gli shape generati. */
public static final String PNAME_SDO_SHAPE_FILE_NAME = "shapeFileName";
/** Nome del parametro che specifica la URL assoluta della directory contenente gli shape generati. */
public static final String PNAME_SDO_SHAPE_FILE_URL = "shapeFileURL";
/** Nome del parametro che specifica l'azione da eseguire. */
public static final String PNAME_COMMAND = "command";
/** Nome del parametro che specifica il metodo di comunicazione con i Servizi regionali Sigmater. */
public static final String PNAME_COMMUNICATION_MODE = "communicationMode";
/** Nome del parametro che specifica il tipo dei Servizi regionali Sigmater. */
public static final String PNAME_END_POINT_TYPE = "endPointType";
/** Nome del parametro che definisce lo stylesheet XSL da utilizzare per il rendering delle risposte. */
public static final String PNAME_OUTPUT_STYLESHEET = "outputStylesheet";
/** Nome del parametro che indica il nome dell'Ente Locale in cui è installato in SincroCat. */
public static final String PNAME_NOME_ENTE = "nomeEnte";
/** Nome del parametro che indica il tipo di Ente Locale in cui è installato in SincroCat. */
public static final String PNAME_TIPO_ENTE = "tipoEnte";
/** Nome del parametro che indica il codice univoco dell'Ente Locale in cui è installato in SincroCat. */
public static final String PNAME_CODICE_ENTE = "codiceEnte";
/** Nome del parametro che indica di scaricare tutti i Comuni di una Provincia o Comunità Montana. */
// public static final String PNAME_TUTTASSIEME = "tuttassieme";
/** Nome del parametro che indica se le aree tematiche disponibili saranno richieste sempre congiuntamente. */
public static final String PNAME_AREE_CONGIUNTE = "areeTematicheCongiunte";
/** Nome del parametro che indica se la funzionalità di generazione degli shape è disponibile. */
public static final String PNAME_SDO_SHAPE = "sdoshape";
/** Nome del parametro che indica se la funzionalità di sincronizzazione CAT-AE è disponibile. */
public static final String PNAME_SINCRO_AE = "sincroAE";
/** Nome del parametro che indica l'url di accesso alla funzionalità di sincronizzazione CAT-AE. */
public static final String PNAME_SINCRO_AE_HOME_PAGE = "sincroAEHomePage";
/** Nome del parametro CGI che specifica l'identificativo univoco dello Scarico. */
public static final String CGI_ID_SCARICO_PNAME = "idScarico";
/** Nome del parametro CGI che specifica il Codice univoco dell'Ente di cui si richiede lo Scarico. */
public static final String CGI_CODICE_ENTE_PNAME = "codiceEnte";
/** Nome del parametro CGI che specifica il tipo di Ente che richiede lo Scarico. */
public static final String CGI_TIPO_ENTE_ATTORE_PNAME = "tipoEnteAttore";
/** Nome del parametro CGI che specifica il Codicetipo di servizi installati a centro stella. */
//public static final String CGI_TIPO_END_POINT_PNAME = "tipoEndPoint";
/** Nome del parametro CGI che specifica il nome dell'Ente di cui si richiede lo Scarico. */
public static final String CGI_NOME_PNAME = "nomeEnte";
/** Nome del parametro CGI che specifica il tipo dell'Ente di cui si richiede lo Scarico. */
public static final String CGI_TIPO_ENTE_PNAME = "tipoEnte";
/** Nome del parametro CGI che specifica una delle Aree Tematiche di interesse. */
public static final String CGI_AREA_TEMATICA_PNAME = "areaTematica";
/** Nome del parametro CGI che specifica il Protocollo iniziale dell'intervallo di interesse. */
public static final String CGI_PROT_ULTIMO_AGG_PNAME = "protUltimoAgg";
/** Nome del parametro CGI che specifica se effettuare la sincronizzazione CAT-AE. */
public static final String CGI_SINCRO_AE = "sincroAE";
/** Nome del parametro CGI che specifica se effettuare la generazione degli shape delle geometrie del DBTL. */
public static final String CGI_SDO_SHAPE = "sdoshape";
/**
* Valore del parametro {@link CGI_ACTION_PNAME} per la costruzione dell'Home Page di gestione delle attività
* di sincronizzazione.
*/
protected static final String AZIONE_INDICE = "indice";
/** Valore del parametro {@link CGI_ACTION_PNAME} per la prenotazione dello scarico. */
protected static final String AZIONE_PRENOTA = "prenota";
/**
* Valore del parametro {@link CGI_ACTION_PNAME} per la visualizzazione dello storico delle attivita' di
* sincronizzazione relative ad una Area Tematica di un Comune.
*/
protected static final String AZIONE_STORICO_ATTIVITA = "storico_attivita";
/**
* Valore del parametro {@link CGI_ACTION_PNAME} per il reperimento di Protocollo e Data di Ultimo aggiornamento del
* DBTL.
*/
protected static final String AZIONE_CONFERMA = "conferma";
/** Valore del parametro {@link CGI_ACTION_PNAME} per il reperimento della lista degli Scarichi gestiti. */
protected static final String AZIONE_LISTA_SCARICHI = "listaScarichi";
/**
* Valore del parametro {@link CGI_ACTION_PNAME} per il reperimento dello stato di caricamento dei Comuni gestiti
* dal SincroCat.
*/
protected static final String AZIONE_STATO_CARICAMENTI = "statoCaricamenti";
/** Valore del parametro {@link CGI_ACTION_PNAME} per il reperimento del report di scarico. */
protected static final String AZIONE_REPORT = "report";
/** Valore del parametro {@link CGI_ACTION_PNAME} per la prenotazione di un nuovo Scarico Dati. */
protected static final String AZIONE_NUOVO = "nuovo";
/**
* Valore del parametro {@link CGI_ACTION_PNAME} per lo scaricamento di un nuovo Scarico Dati già prenotato
* (Test).
*/
protected static final String AZIONE_SCARICA = "scarica";
/**
* Valore del parametro {@link CGI_ACTION_PNAME} per la sincronizzazione di uno Scarico Dati già scricato
* (Test).
*/
protected static final String AZIONE_SINCRONIZZA = "sincronizza";
/** Valore del parametro {@link CGI_ACTION_PNAME} per il reperimento delle opzioni di prenotazione. */
protected static final String AZIONE_PIANIFICA_SINCRO = "pianifica";
/** Valore del parametro {@link CGI_ACTION_PNAME} per l'esecuzione della generazione shape. */
protected static final String AZIONE_SDO_SHAPE = "sdoshape";
/** Valore del parametro {@link CGI_ACTION_PNAME} per l'esecuzione della cancellazione shape. */
protected static final String AZIONE_DEL_SHAPE = "delshape";
/** Nome dell'elemento XML contenente l'Identificativo Scarico. */
public static final String ID_SCARICO_ELEMENT_NAME = "IdentificativoScarico";
/** L'istanza dello stylesheet riutilizzabile in output. */
protected Templates outputStylesheetTemplate = null;
/**
* Oggetto che racchiude i parametri di rototraslazione applicata ai dati cartografici prima del'inserimento nel
* DBTL.
*/
private AffineTransformParameters affineTransformParameters = null;
/**
* Se true
il sistema permette di effettuare richieste di aggiornamento per entrambe le aree tematiche
* (Censuario e Cartografia) contemporaneamente, se false
di una sola area tematica per volta.
*
* @deprecated a partire dalla versione 1.5.0 non viene piu' permesso l'aggiornamento contemporaneo di piu' aree
* tematiche. Questo parametro ha percio' valore costante false
.
*/
private boolean areeCongiunteInit = false;
/** Indica il codice univoco dell'Ente Locale in cui è installato il SincroCat. */
private String codiceEnteInit = null;
/** Indica l'azione applicativa richiesta all'atto dell'invocazione della servlet. */
private String commandInit = null;
/**
* Indica la modalità di comunicazione da utilizzare per il colloquio con il servizio. Ammette i valori
* {@link ServletToolBox#SOAP_COMMUNICATION_MODE_NAME}
oppure {@link
* ServletToolBox#PDD_COMMUNICATION_MODE_NAME}
. Se null
non è stato possibile determinare
* il valore del parametro o la lettura dello stesso deve ancora avvenire.
*/
private String communicationModeInit = null;
/**
* Indica il tipo di servizio. Ammette i valori
* sigmater2
oppure sigmater3
. Se null
non è stato possibile determinare
* il valore del parametro o la lettura dello stesso deve ancora avvenire.
*/
private String endPointTypeInit = null;
/** Identificativo del sistema di coordinate adottato per i dati cartografici del DBTL. */
private String dbtlCoordinateSystem = null;
/** Versione attuale del DBTL. */
private String dbtlVersion = null;
/** Indica il nome dell'Ente Locale in cui è installato il SincroCat. */
private String nomeEnteInit = null;
/**
* Parametro di inizializzazione che indica se è disponibile la funzionalità di generazione degli
* shape delle geometrie del DBTL.
*/
private boolean sdo2shapeInit = false;
/** Percorso della directory contenente gli shape generati. */
private static String shapeFilePath = null;
/** Nome del file contenente gli shape generati. */
private static String shapeFileName = null;
/** URL della directory contenente gli shape generati. */
private static String shapeFileURL = null;
/**
* Parametro di inizializzazione che indica se è disponibile la funzionalità di sincronizzazione delle
* relazioni CAT-AE.
*/
private boolean sincroAeInit = false;
/** Percorso del file di configurazione che specifica le tabelle di cui generare gli shape. */
private String tableFilePath = null;
/**
* Indica il tipo di Ente Locale in cui è installato il SincroCat.
*
* true
il sistema permette di effettuare richieste di aggiornamento per Enti Locali "aggragati"
* (Province e Comunita' Montante) con una sola richiesta, se false
di un solo Comune dell'Ente Locale
* per volta.
*
* @deprecated a partire dalla versione 1.5.0 non viene piu' permesso l'aggiornamento contemporaneo di piu' Comuni.
* Questo parametro ha percio' valore costante false
.
*/
private boolean tuttassiemeInit = false;
/** Indica il codice univoco dell'Ente Locale in cui è installato il SincroCat. */
private String urlSincroAEInit = null;
/**
* Costruttore di default.super.destroy()
.
*/
public void destroy()
{
super.destroy();
}
/**
* Provvede alla configurazione della servlet. Le servlet che ereditano da questa possono fare l'override di
* questo metodo ma devo sempre invocare super.init(config)
.
*
* @param config oggetto di configurazione della servlet.
*
* @throws ServletException se l'oggetto di configurazione non è corretto o manca di dati essenziali.
*/
public void init(ServletConfig config)
throws ServletException
{
super.init(config);
initCommunicationMode(config);
initCommand(config);
initEnteLocale(config);
initStylesheets(config);
initPlugins(config);
initEndPointType(config);
initDbtlMetadata();
}
/**
* Ridefinizione del metodo. La chiamata viene girata al metodo {@link #doPost(HttpServletRequest req,
* HttpServletResponse resp)}.
*
* @param req la richiesta
* @param resp la risposta
*
* @throws ServletException in caso di eccezione dovuta alla servlet
* @throws IOException in caso di errore di IO
*
* @see #doPost(HttpServletRequest req, HttpServletResponse resp)
*/
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
doPost(req, resp);
}
/**
* Ridefinizione del metodo.
*
* @param req la richiesta
* @param resp la risposta
*
* @throws ServletException in caso di eccezione dovuta alla servlet
* @throws IOException in caso di errore di IO
*/
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
// impostazione codifica caratteri
resp.setContentType("text/html; charset=UTF-8");
// documento che conterra' la risposta: ogni pezzo di codice dovrebbe aggiornare questo
Document respDoc = null;
// *************** REPERIMENTO LISTA ATTIVITA' SINCRONIZZAZIONE ********************
if (commandInit.equals(AZIONE_LISTA_SCARICHI))
{
String codCom = req.getParameter("codCom");
String codiceAreaTematica = req.getParameter("areaTem");
AreaSincrona areaCorrente = null;
if ((codCom != null) && (codiceAreaTematica != null))
{
areaCorrente = new AreaSincrona(req.getParameter("codCom"), Integer.valueOf(codiceAreaTematica));
}
respDoc = ActionPerformer.doAzioneListaScarichi(logger, dbtlVersion, getDbtlManager(), tipoEnteInit,
nomeEnteInit, areaCorrente, dbtlCoordinateSystem, affineTransformParameters);
}
// ******************** RICHIESTA NUOVA PRENOTAZIONE ************************
else if (commandInit.equals(AZIONE_NUOVO))
{
respDoc = ActionPerformer.doAzioneNuovoScarico(req, logger, dbtlVersion, getDbtlManager(), tipoEnteInit,
nomeEnteInit, sdo2shapeInit, sincroAeInit, areeCongiunteInit, tuttassiemeInit, codiceEnteInit,
dbtlCoordinateSystem, affineTransformParameters);
}
// ************************* RICHIESTA REPORT SINCRONIZZAZIONE *************************
else if (commandInit.equals(AZIONE_REPORT))
{
respDoc = ActionPerformer.doAzioneReport(req, logger, dbtlVersion, getDbtlManager(), dbtlCoordinateSystem,
affineTransformParameters);
}
// ************************* RICHIAMA COMPONENTE DI PRENOTAZIONE *************************
else if (commandInit.equals(AZIONE_CONFERMA))
{
respDoc = ActionPerformer.doAzioneConferma(req, logger, getSessionBeanPrenotazione(),
prepareBookingRequest(req));
}
// ************************* RICHIAMA COMPONENTE DI GENERAZIONE SHAPE *************************
else if (commandInit.equals(AZIONE_SDO_SHAPE))
{
respDoc = ActionPerformer.doAzioneSdoToShape(logger, SincroServletUtil.getScheduler(logger),
prepareSdoShapeRequest(), sdo2shapeInit);
}
// ************************* RICHIAMA COMPONENTE DI CANCELLAZIONE SHAPE *************************
else if (commandInit.equals(AZIONE_DEL_SHAPE))
{
respDoc = ActionPerformer.doAzioneDeleteShape(logger, req.getParameterValues("cancellaShape"), sdo2shapeInit, shapeFilePath, shapeFileName);
}
// ************************* CREAZIONE HOME PAGE *************************
else if (commandInit.equals(AZIONE_INDICE))
{
respDoc = ActionPerformer.doAzioneIndice(logger, sdo2shapeInit, sincroAeInit, urlSincroAEInit);
}
// ************************* INNESCA SCARICAMENTO PER UNA ATTIVITA' (ID SCARICO) SPECIFICA
// *************************
else if (commandInit.equals(AZIONE_SCARICA))
{
respDoc = ActionPerformer.doAzioneScarica(logger, SincroServletUtil.getScheduler(logger),
prepareDownloadRequest(req));
}
// ************************* INNESCA SINCRONIZZAZIONE PER UNA ATTIVITA' (ID SCARICO) SPECIFICA
// *************************
else if (commandInit.equals(AZIONE_SINCRONIZZA))
{
respDoc = ActionPerformer.doAzioneSincronizza(logger, SincroServletUtil.getScheduler(logger),
prepareSynchRequest(req));
}
// restituzione risposta servlet
returnResponse(resp, respDoc);
}
/**
* Recupera il riferimento al Gestore delle informazioni caratteristiche del DBTL.
*
* @return interfaccia remota del bean di gestione del DBTL.
*
* @throws ServletException sollevata in caso di errori di reperimento dell'istanza del bean.
*/
protected GestoreScaricoRemote getDbtlManager()
throws ServletException
{
GestoreScaricoRemote dbtlManager = null;
try
{
Context ctx = getNamingContext();
if (ctx != null)
{
Object homeObject = ctx.lookup(CostantiSincro.GESTORE_SCARICO_REMOTE_JNDI);
// logger.debug("home recuperata");
GestoreScaricoRemoteHome homeInterface = (GestoreScaricoRemoteHome)PortableRemoteObject.narrow(
homeObject, GestoreScaricoRemoteHome.class);
// logger.debug("home narrow eseguita");
dbtlManager = homeInterface.create();
// logger.debug("Interfaccia remota GestoreScarico ottenuta");
}
}
catch (NamingException e)
{
throw new ServletException("Impossibile ottenere la remote interface del bean '" +
CostantiSincro.GESTORE_SCARICO_REMOTE_JNDI + "'", e);
}
catch (RemoteException e)
{
throw new ServletException(
"E' occorsa una eccezione remota mentre si cercava di recuperare un'istanza di '" +
CostantiSincro.GESTORE_SCARICO_REMOTE_JNDI + "'", e);
}
catch (IOException e)
{
throw new ServletException("Impossibile ottenere un'istanza di '" +
CostantiSincro.GESTORE_SCARICO_REMOTE_JNDI + "'", e);
}
catch (CreateException e)
{
throw new ServletException("Impossibile ottenere un'istanza di '" +
CostantiSincro.GESTORE_SCARICO_REMOTE_JNDI + "'", e);
}
return dbtlManager;
}
/**
* Recupera il naming context.
*
* @return l'istanza del context
*
* @throws NamingException problemi nel recupero del context
* @throws RemoteException problemi di comunicazione
* @throws IOException problemi nell'accesso al file di proprietà
*/
protected Context getNamingContext()
throws NamingException, RemoteException, IOException
{
Properties jndiProperties = null;
InputStream jndiIs = Thread.currentThread().getContextClassLoader().getResourceAsStream(
CostantiSincro.JNDI_PROPERTIES_FILE);
if (jndiIs != null)
{
jndiProperties = new Properties();
jndiProperties.load(jndiIs);
}
if (jndiProperties != null)
{
// logger.debug("proprieta' JNDI recuperate");
return new InitialContext(jndiProperties);
}
// logger.debug("creazione nuovo InitialContext di Naming");
return new InitialContext();
}
/**
* Recupera il riferimento al SessionBean di prenotazione.
*
* @return interfaccia remota del SessionBean di prenotazione.
*
* @throws ServletException sollevata in caso di errori di reperimento dell'istanza del bean.
*/
protected BookingSessionBeanRemote getSessionBeanPrenotazione()
throws ServletException
{
BookingSessionBeanRemote sbPrenota = null;
try
{
// Recupero dello Scheduler dal contesto
Context ctx = getNamingContext();
if (ctx != null)
{
Object homeObject = ctx.lookup(CostantiSincro.BOOK_SESSION_BEAN_REMOTE_JNDI);
// logger.debug("home recuperata");
BookingSessionBeanRemoteHome homeInterface = (BookingSessionBeanRemoteHome)PortableRemoteObject.narrow(
homeObject, BookingSessionBeanRemoteHome.class);
// logger.debug("home narrow eseguita");
sbPrenota = homeInterface.create();
logger.debug("Interfaccia remota Session bean di prenotazione ottenuta");
}
}
catch (NamingException e)
{
throw new ServletException("Impossibile ottenere la remote interface del bean '" +
CostantiSincro.BOOK_SESSION_BEAN_REMOTE_JNDI + "'", e);
}
catch (RemoteException e)
{
throw new ServletException(
"E' occorsa una eccezione remota mentre si cercava di recuperare un'istanza di '" +
CostantiSincro.BOOK_SESSION_BEAN_REMOTE_JNDI + "'", e);
}
catch (IOException e)
{
throw new ServletException("Impossibile ottenere un'istanza di '" +
CostantiSincro.BOOK_SESSION_BEAN_REMOTE_JNDI + "'", e);
}
catch (CreateException e)
{
throw new ServletException("Impossibile ottenere un'istanza di '" +
CostantiSincro.BOOK_SESSION_BEAN_REMOTE_JNDI + "'", e);
}
return sbPrenota;
}
/**
* Restituisce una risposta della servlet processando il Documento XML di risposta mediante lo stylesheet di output.
*
* @param resp risposta http della servlet
* @param inDoc Documento XML contenente la risposta.
*
* @throws ServletException sollevata in caso di errori nell'esecuzione della servlet
*/
protected void returnResponse(HttpServletResponse resp, Document inDoc)
throws ServletException
{
LogUtils.logXMLDocument("Documento di risposta", inDoc, logger);
// ******************************************************************************
// DA ELIMINARE QUANDO IL FRAMEWORK GESTIRA' CORRETTAMENTE L'ENCODING
// ******************************************************************************
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try
{
Transformer transformer = outputStylesheetTemplate.newTransformer();
transformer.setOutputProperty("encoding", CostantiSincro.UTF_8_CHARSET_ENCODING);
transformer.transform(new DOMSource(inDoc), new StreamResult(bos));
PrintWriter printWriter = resp.getWriter();
printWriter.write(new String(bos.toByteArray(), CostantiSincro.UTF_8_CHARSET_ENCODING));
printWriter.close();
}
catch (TransformerException e)
{
String msg = "Errore nella trasformazione XSL della risposta";
logger.error(msg, e);
throw new ServletException(msg, e);
}
catch (UnsupportedEncodingException e)
{
String msg = "Errore nella creazione della risposta";
logger.error(msg, e);
throw new ServletException(msg, e);
}
catch (IOException e)
{
String msg = "Errore nella creazione della risposta";
logger.error(msg, e);
throw new ServletException(msg, e);
}
}
/**
* Compila uno stylesheet per poterlo riutilizzare.
*
* @param config la configurazione della servlet
* @param resName il nome della risorsa che punta allo stylesheet
*
* @return il template riutilizzabile dello stylesheet
*
* @throws ServletException se non è possibile compilare lo stylesheet
*/
private Templates compileStylesheet(ServletConfig config, String resName)
throws ServletException
{
logger.debug("Compilazione dello stylesheet dall'URL " + resName);
try
{
URL url = config.getServletContext().getResource(resName);
if (url == null)
{
String msg = new String("Impossibile recuperare lo stylesheet '" + resName + "'");
logger.error(msg);
throw new ServletException(msg);
}
return XMLUtils.getTemplates(url);
}
catch (TransformerException te)
{
String msg = new String("Impossibile compilare lo stylesheet '" + resName + "'");
logger.error(msg, te);
throw new ServletException(msg);
}
catch (MalformedURLException mue)
{
String msg = new String("Impossibile recuperare lo stylesheet '" + resName + "'");
logger.error(msg, mue);
throw new ServletException(msg);
}
}
/**
* Inizializza il comando associato alla servlet invocata.
*
* @param config oggetto di configurazione della servlet.
*/
private void initCommand(ServletConfig config)
{
// reperimento comando specificato
commandInit = config.getInitParameter(PNAME_COMMAND);
logger.debug("Azione da effettuare: " + commandInit);
}
/**
* Determina la modalità di comunicazione da impiegare per il colloquio con il servizio.
*
* @param config oggetto di configurazione della servlet.
*/
private void initCommunicationMode(ServletConfig config)
{
communicationModeInit = config.getInitParameter(PNAME_COMMUNICATION_MODE);
if (communicationModeInit == null)
{
communicationModeInit = ServletToolBox.PDD_COMMUNICATION_MODE_NAME;
}
logger.debug("I servizi vengono utilizzati in modalita' " + communicationModeInit);
}
/**
* Determina la tipologia di server.
*
* @param config oggetto di configurazione della servlet.
*/
private void initEndPointType(ServletConfig config)
{
endPointTypeInit = config.getInitParameter(PNAME_END_POINT_TYPE);
if (endPointTypeInit == null)
{
endPointTypeInit = "sigmater2";
}
logger.debug("I servizi vengono utilizzati in modalita' " + endPointTypeInit);
}
/**
* Inizializza i metadati del DBTL: versione, sistema di coordinate ed eventuali parametri di rototraslazione.
*
* @throws ServletException sollevata in caso di eccezioni nel recupero dei metadati del DBTL.
*/
private void initDbtlMetadata()
throws ServletException
{
// interfaccia remota al manager del DBTL
GestoreScaricoRemote dbtlManager = getDbtlManager();
// reperimento metadati DBTL
try
{
dbtlCoordinateSystem = dbtlManager.getDBTLCoordinateSystem();
affineTransformParameters = dbtlManager.getAffineTransformParameters();
dbtlVersion = dbtlManager.getDBTLVersion();
}
catch (RemoteException e)
{
String msg = "Errore nell'accesso ai metadati del DBTL";
logger.error(msg, e);
throw new ServletException(msg, e);
}
catch (RepositoryAccessException e)
{
String msg = "Errore nell'accesso ai metadati del DBTL";
logger.error(msg, e);
throw new ServletException(msg, e);
}
}
/**
* Imposta tipo e codice dell'Ente Locale in cui e' installato in SincroCat.Comune
, Provincia
, Comunità Montana
.Codice Belfiore
, Codice ISTAT
, Codice
* ISTAT
.
*
* @param config oggetto di configurazione della servlet.
*
* @throws ServletException se l'oggetto di configurazione non ` corretto o manca di dati essenziali.
*/
private void initEnteLocale(ServletConfig config)
throws ServletException
{
// impostazione validazione XML di risposta
String tipoEnteStr = config.getServletContext().getInitParameter(PNAME_TIPO_ENTE);
codiceEnteInit = config.getServletContext().getInitParameter(PNAME_CODICE_ENTE);
nomeEnteInit = config.getServletContext().getInitParameter(PNAME_NOME_ENTE);
if ((tipoEnteStr == null) || (codiceEnteInit == null) || (nomeEnteInit == null))
{
String msg = new String("Tipo o Codice dell'Ente Locale mancanti o errati. Specificare i parametri '" +
PNAME_TIPO_ENTE + "', '" + PNAME_CODICE_ENTE + "' e '" + PNAME_NOME_ENTE + "'" +
" con un valori ammissibili");
logger.error(msg);
throw new ServletException(msg);
}
else
{
tipoEnteInit = Integer.parseInt(tipoEnteStr);
}
logger.debug("Tipo Ente = " + tipoEnteInit);
logger.debug("Codice Ente = " + codiceEnteInit);
logger.debug("Nome Ente = " + nomeEnteInit);
}
/**
* Inizializza i parametri relativi ai plugin presenti per il SincroCat.
*
* @param config oggetto di configurazione della servlet.
*/
private void initPlugins(ServletConfig config)
{
// reperimento parametri dei plugin
sdo2shapeInit = (Boolean.valueOf(config.getServletContext().getInitParameter(PNAME_SDO_SHAPE))).booleanValue();
if (sdo2shapeInit)
{
shapeFilePath = config.getServletContext().getInitParameter(PNAME_SDO_SHAPE_FILE_PATH);
shapeFileName = config.getServletContext().getInitParameter(PNAME_SDO_SHAPE_FILE_NAME);
shapeFileURL = config.getServletContext().getInitParameter(PNAME_SDO_SHAPE_FILE_URL);
logger.debug("shapeFilePath: " + shapeFilePath);
tableFilePath = config.getServletContext().getInitParameter(PNAME_SDO_SHAPE_TABLE_FILE_PATH);
logger.debug("tableFilePath: " + tableFilePath);
}
sincroAeInit = (Boolean.valueOf(config.getServletContext().getInitParameter(PNAME_SINCRO_AE))).booleanValue();
if (sincroAeInit)
{
urlSincroAEInit = config.getServletContext().getInitParameter(PNAME_SINCRO_AE_HOME_PAGE);
logger.debug("Url Sincro AE: " + urlSincroAEInit);
}
logger.debug("sdoshape disponibile: " + sdo2shapeInit);
logger.debug("sincroAE disponibile: " + sincroAeInit);
}
/**
* Carica lo stylesheet e lo precompila.
*
* @param config la configurazione della servlet
*
* @throws ServletException se la configurazione non ` corretta o manca di dati essenziali.
*/
private void initStylesheets(ServletConfig config)
throws ServletException
{
String outputStylesheet = config.getInitParameter(PNAME_OUTPUT_STYLESHEET);
if (outputStylesheet != null)
{
outputStylesheetTemplate = compileStylesheet(config, outputStylesheet);
}
else
{
String msg = new String("Nessuno stylesheet di output configurato. Specificare il parametro '" +
PNAME_OUTPUT_STYLESHEET + "' con il percorso dello stylesheet di output");
logger.error(msg);
throw new ServletException(msg);
}
}
/**
* Prepara un JobDescriptor per una richiesta di prenotazione.
*
* @param req Servlet request
*
* @return a jobDescriptor for booking request
*/
private JobDescriptor prepareBookingRequest(HttpServletRequest req)
{
// lettura parametri CGI: DEVONO esserci
String codiceEnteIngresso = req.getParameter(CGI_CODICE_ENTE_PNAME);
String tipoEnteAttore = req.getParameter(CGI_TIPO_ENTE_ATTORE_PNAME);
String tipoEndPoint = endPointTypeInit;
String execSdo2Shape = null;
String execSincroAE = null;
// GESTIONE IDENTIFICATIVO ENTE LOCALE
IdentificativoEnteLocale idEnteOggetto = new IdentificativoComune(codiceEnteIngresso);
logger.debug("Comune indicato per Scarico: " + codiceEnteIngresso);
// GESTIONE AREA TEMATICA
int areaTematicaIngresso = Integer.parseInt(req.getParameter(CGI_AREA_TEMATICA_PNAME));
logger.debug("Area tematica --> " + areaTematicaIngresso);
String areaTematica = null;
switch (areaTematicaIngresso) {
case CostantiSincro.COD_AREA_TEMATICA_CENSUARIO:
areaTematica = "CENSUARIO";
break;
case CostantiSincro.COD_AREA_TEMATICA_CARTOGRAFIA:
areaTematica = "CARTOGRAFIA";
break;
case CostantiSincro.COD_AREA_TEMATICA_ICI:
areaTematica = "ICI";
break;
}
// GESTIONE PROTOCOLLO ULTIMO AGGIORNAMENTO
String tempParamValue = req.getParameter(CGI_PROT_ULTIMO_AGG_PNAME);
logger.debug("Parametro CGI " + CGI_PROT_ULTIMO_AGG_PNAME + ": " + tempParamValue);
int protUltimoAgg = Integer.parseInt(tempParamValue);
// GESTIONE OPERAZIONI ESEGUITE DAGLI EVENTUALI PLUGIN
execSincroAE = req.getParameter(CGI_SINCRO_AE);
logger.debug("Parametro CGI " + CGI_SINCRO_AE + ": " + execSincroAE);
execSdo2Shape = req.getParameter(CGI_SDO_SHAPE);
logger.debug("Parametro CGI " + CGI_SDO_SHAPE + ": " + execSdo2Shape);
// creazione e popolamento del job descriptor di prenotazione
HashMap initJobParams = new HashMap();
initJobParams.put(CostantiSincro.TIPO_END_POINT_JOB_PARAM_NAME, tipoEndPoint);
initJobParams.put("tipo_ente_attore", new Integer(tipoEnteAttore));
initJobParams.put("id_ente", idEnteOggetto);
initJobParams.put("area_tematica", areaTematica);
initJobParams.put("prot_ultimo_agg", new Integer(protUltimoAgg));
// creare JobDescriptor del sdo2shape: sdo2shape_jobdescriptor
if ("on".equals(execSdo2Shape) && sdo2shapeInit)
{
initJobParams.put(CostantiSincro.SDO_SHAPE_PARAM_ID, prepareSdoShapeRequest());
logger.debug("Aggiunto JobDescriptor SdoShape al JobDescriptor di prenotazione");
}
// creazione JobDescriptor del sincroAE: sincro_ae_jobdescriptor
if ("on".equals(execSincroAE) && sincroAeInit)
{
initJobParams.put(CostantiSincro.SINCRO_AE_PARAM_JOB_ID, prepareSincroAeRequest("Innesco Automatico"));
logger.debug("Aggiunto JobDescriptor SincroAE al JobDescriptor di prenotazione");
}
initJobParams.put(CostantiSincro.COMMUNICATION_MODE_JOB_PARAM_NAME, communicationModeInit);
JobDescriptor bookingJobDesc = new JobDescriptor(CostantiSincro.BOOKING_PROCESS_JOB_ID, "", initJobParams);
logger.debug("Creato il jobDescriptor di prenotazione: " + bookingJobDesc.toString());
return bookingJobDesc;
}
/**
* Prepara un JobDescriptor per una richiesta di prenotazione.
*
* @param req Servlet request
*
* @return a jobDescriptor for booking request
*/
private JobDescriptor prepareDownloadRequest(HttpServletRequest req)
{
// crea il JobDescriptor di download
HashMap initDownloadJobParams = new HashMap();
initDownloadJobParams.put(CostantiSincro.TIPO_END_POINT_JOB_PARAM_NAME, endPointTypeInit);
initDownloadJobParams.put(CostantiSincro.ID_SCARICO_JOB_PARAM_NAME, req.getParameter(CGI_ID_SCARICO_PNAME));
initDownloadJobParams.put(CostantiSincro.COMMUNICATION_MODE_JOB_PARAM_NAME, communicationModeInit);
JobDescriptor downloadJobData = new JobDescriptor(CostantiSincro.DOWNLOAD_PROCESS_JOB_ID, "",
initDownloadJobParams);
return downloadJobData;
}
/**
* Prepara un JobDescriptor per una richiesta di generazione di shape delle geometrie del DBTL.
*
* @return JobDescriptor per il componente generazione di shape delle geometrie del DBTL.
*/
private JobDescriptor prepareSdoShapeRequest()
{
HashMap initParam = new HashMap();
initParam.put(CostantiSincro.SHAPE_FILE_PATH_PARAM_NAME, shapeFilePath + shapeFileName);
initParam.put(CostantiSincro.TABLE_FILE_PATH_PARAM_NAME, tableFilePath);
return new JobDescriptor(CostantiSincro.SDO_SHAPE_PROCESS_JOB_ID, "", initParam);
}
/**
* Prepara un JobDescriptor per l'operazione di sincronizzazione CAT-AE.
*
* @param noteSincroAe note da inserire nel JobDescriptor.
*
* @return JobDescriptor per l'operazione di sincronizzazione CAT-AE.
*/
private JobDescriptor prepareSincroAeRequest(String noteSincroAe)
{
// creazione e popolamento del job descriptor di prenotazione
HashMap initJobParams = new HashMap();
initJobParams.put("note_sincro_ae", noteSincroAe);
JobDescriptor synchroAeJobDesc = new JobDescriptor(CostantiSincro.SYNCHRO_AE_PROCESS_JOB_ID, "", initJobParams);
logger.debug("Creato il jobDescriptor di prenotazione: " + synchroAeJobDesc.toString());
return synchroAeJobDesc;
}
/**
* Prepara un JobDescriptor per una richiesta di prenotazione.
*
* @param req Servlet request
*
* @return a jobDescriptor for booking request
*/
private JobDescriptor prepareSynchRequest(HttpServletRequest req)
{
// crea il JobDescriptor di download
HashMap initDownloadJobParams = new HashMap();
initDownloadJobParams.put("id_scarico", req.getParameter(CGI_ID_SCARICO_PNAME));
initDownloadJobParams.put(CostantiSincro.COMMUNICATION_MODE_JOB_PARAM_NAME, communicationModeInit);
JobDescriptor downloadJobData = new JobDescriptor(CostantiSincro.SYNCHRO_PROCESS_JOB_ID, "",
initDownloadJobParams);
return downloadJobData;
}
/**
* Ritorna il path in cui vengono memorizzati gli shape generati dal Sincrocat
*
* @return path in cui vengono memorizzati gli shape generati
*/
public static String getShapeFilePath()
{
return shapeFilePath;
}
/**
* Ritorna il nome di file con cui vengono memorizzati gli shape generati dal Sincrocat
*
* @return nome di file con cui vengono memorizzati gli shape
*/
public static String getShapeFileName()
{
return shapeFileName;
}
/**
* Ritorna il path con cui sono accessibili i file in cui vengono memorizzati gli shape generati dal Sincrocat
*
* @return path con cui sono accessibili i file
*/
public static String getShapeFileURL()
{
return shapeFileURL;
}
}