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.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
NomeSignificatoValori ammessiObbligatorietà/Valore di default
codiceEnteSpecifica il codice univoco dell'Ente Locale dell'installazione.Un qualsiasi Codice Belfiore (per i Comuni) o Codice ISTAT (per Province o Comunità Montane) * validoSI/nessuno
nomeEnteSpecifica il nome dell'Ente Locale dell'installazione.Il nome dell'Ente Locale corrispondente alla coppia (tipoEnte,codiceEnte) specificatiSI/nessuno
outputStylesheetSpecifica il file XSL da utilizzare per il rendering delle rispostenessun vincoloSI/nessuno
*
* LIMITAZIONI Per ora la servlet tratta solo id enti locali costituiti da codice Belfiore Comune e codice ISTAT * Provincia. * * @author Francesco Marani */ public class SincroManagerServlet extends HttpServlet { /** Il logger di log4j (NB: HTTPServlet ha già un suo logger) */ protected static Logger logger = null; /** * Nome del parametro che specifica il percorso del file di configurazione delle tabelle da processare relativamente * al 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. * *
    *
  1. 1 - Comune
  2. *
  3. 2 - Provincia
  4. *
  5. 3 - Comunita' Montana
  6. *
*/ private int tipoEnteInit = CostantiSincro.TE_UNKNOWN; /** * Se 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.
* Inizializza il logger. */ public SincroManagerServlet() { super(); logger = Logger.getLogger(this.getClass()); } /** * Provvede al rilascio delle risorse della servlet. Le servlet che ereditano da questa possono fare l'override * di questo metodo ma devo sempre invocare 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.
* Tipi ammessi: Comune, Provincia, Comunità Montana.
* Codici univoci corrispondenti: 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; } }