/** * Copyright (C) 2008-2010, Squale Project - http://www.squale.org * * This file is part of Squale. * * Squale is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or any later version. * * Squale is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Squale. If not, see <http://www.gnu.org/licenses/>. */ /* * Cr�� le 22 juil. 05 * * Pour changer le mod�le de ce fichier g�n�r�, allez � : * Fen�tre>Pr�f�rences>Java>G�n�ration de code>Code et commentaires */ package org.squale.welcom.addons.access.excel; import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Date; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.validator.GenericValidator; import org.squale.welcom.addons.access.WAddOnsAccessManager; import org.squale.welcom.addons.access.excel.bd.BdAccessFactory; import org.squale.welcom.addons.access.excel.filereader.AccessKeyReaderException; import org.squale.welcom.addons.access.excel.filereader.AccessKeyReaderFactory; import org.squale.welcom.addons.access.excel.filereader.IAccessKeyReader; import org.squale.welcom.outils.WelcomConfigurator; import org.squale.welcom.outils.jdbc.WJdbc; import org.squale.welcom.outils.jdbc.WJdbcMagic; import org.squale.welcom.outils.jdbc.WStatement; /** * @author M327837 Pour changer le mod�le de ce commentaire de type g�n�r�, allez � : * Fen�tre>Pr�f�rences>Java>G�n�ration de code>Code et commentaires */ public class UpdateAccessManager { /** logger */ private static Log logStartup = LogFactory.getLog( "Welcom" ); /** Mon lecteur de fichier excel */ private static IAccessKeyReader accessKeyReader = null; /** Un petit signleton */ private static UpdateAccessManager updateAccessManager = null; /** Table pour la gestion des plugins */ private final static String WEL_ADDONS = WelcomConfigurator.getMessage( WelcomConfigurator.ADDONS_TABLE_NAME ); /** * Contructeur * * @param excelAccessFile du fichier excel * @throws AccessKeyReaderException : Probleme */ private UpdateAccessManager( final String excelAccessFile ) throws AccessKeyReaderException { WJdbc jdbc = null; try { jdbc = new WJdbcMagic(); // Verification et creation des tables BdAccessFactory.getBdCreate().checkAnCreateAllTable( jdbc ); } catch ( final SQLException e ) { logStartup.error( e ); } finally { if ( jdbc != null ) { jdbc.close(); } } final URL url = getUrlAccessKeyFile( excelAccessFile ); if ( !checkIfUpdateBDWithTheFile( url ) ) { logStartup.info( "Mise a jour de la BD ... en cours" ); updateBD( url ); } else { logStartup.info( "Base de donn�e ... Ok" ); } } /** * Met a jour la base de donn�e avec le fichier xls * * @param url : Url... * @throws AccessKeyReaderException : Probleme */ private void updateBD( final URL url ) throws AccessKeyReaderException { // Lecture du fichier excel accessKeyReader = AccessKeyReaderFactory.read( url ); WJdbc jdbc = null; int cpt = 0; try { jdbc = new WJdbcMagic(); // Mise a jour de la BD : Table ACCESSKEY cpt += BdAccessFactory.getBdUpdate().updateAccessKey( jdbc, accessKeyReader.getAccessKey(), BdAccessFactory.getBdReader().getAccessKey( jdbc, false ) ); // Mise a jour de la BD : Table PROFILE cpt += BdAccessFactory.getBdUpdate().updateProfile( jdbc, accessKeyReader.getProfile(), BdAccessFactory.getBdReader().getProfile( jdbc, false ) ); // Mise a jour de la BD : Table PROFILE_ACCESSKEY_INT cpt += BdAccessFactory.getBdUpdate().updateProfileAccessKey( jdbc, accessKeyReader.getProfileAccessKey(), BdAccessFactory.getBdReader().getProfileAccessKey( jdbc, false ) ); // Mise a jour de la Date setTimeStampBD( jdbc, url ); jdbc.commit(); } catch ( final SQLException e ) { logStartup.error( e, e ); } finally { if ( jdbc != null ) { jdbc.close(); } } } /** * @param excelAccessFile Nom du fichier excel * @throws AccessKeyReaderException : Probleme */ public static void update( final String excelAccessFile ) throws AccessKeyReaderException { if ( updateAccessManager == null ) { updateAccessManager = new UpdateAccessManager( excelAccessFile ); } } /** * @param url : URL * @return La date de dernier emodification de l'url */ private Date getTimeUrl( final URL url ) { try { final URLConnection urlCon = url.openConnection(); urlCon.setUseCaches( false ); urlCon.connect(); return new Date( urlCon.getLastModified() ); } catch ( final IOException e ) { logStartup.error( e, e ); } return null; } /** * Retourne vrai si la bd est ok * * @param url : URl du fichier * @return vrais si la base est a jour avec le fichier */ private boolean checkIfUpdateBDWithTheFile( final URL url ) { final Date excelFileDate = getTimeUrl( url ); final Date bdDate = getTimeStampBD(); if ( bdDate != null ) { return ( excelFileDate.getTime() <= bdDate.getTime() ); } return false; } /** * Met a jour la date de modification en base du fichier excel * * @param jdbcMagic : Connexion jdbc * @param url : Url du fichier excel */ private void setTimeStampBD( final WJdbc jdbcMagic, final URL url ) { Date excelFileDate; try { excelFileDate = getTimeUrl( url ); final WStatement sta = jdbcMagic.getWStatement(); sta.add( "update " + WEL_ADDONS + " set" ); sta.addParameter( "PARAMETERS=?", "" + excelFileDate.getTime() ); sta.addParameter( "where NAME=?", WAddOnsAccessManager.ADDONS_ACCESSMANAGEMENT_NAME ); sta.executeUpdate(); sta.close(); } catch ( final Exception e ) { logStartup.error( e, e ); } } /** * @return Derniere date de modification, null si la table n'existe pas */ private Date getTimeStampBD() { Date bdDate = null; WJdbcMagic jdbcMagic = null; try { jdbcMagic = new WJdbcMagic(); final WStatement sta = jdbcMagic.getWStatement(); sta.add( "select * from WEL_ADDONS where" ); sta.addParameter( "NAME=?", WAddOnsAccessManager.ADDONS_ACCESSMANAGEMENT_NAME ); final ResultSet rs = sta.executeQuery(); if ( ( rs != null ) && rs.next() ) { bdDate = new Date( rs.getLong( "PARAMETERS" ) ); } sta.close(); } catch ( final SQLException e ) { return null; } finally { if ( jdbcMagic != null ) { jdbcMagic.close(); } } return bdDate; } /** * @param fileName : Nom de la resource locale du projet. * @return Retourne l'url du fichier * @throws AccessKeyReaderException : Probleme sur la lecture du fichier */ private URL getUrlAccessKeyFile( final String fileName ) throws AccessKeyReaderException { final String extension = "xls"; if ( GenericValidator.isBlankOrNull( fileName ) ) { throw new AccessKeyReaderException( "Vous devez sp�cifier un fichier de gestion des droits d'acc�s, attribut 'excelAccessFile' du plugin" ); } // Set up to load the property resource for this locale key, if we can String name = fileName.replace( '.', '/' ); if ( name.endsWith( "/" + extension ) ) { name = name.substring( 0, name.length() - extension.length() - 1 ); } name += "." + extension; final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); final URL url = classLoader.getResource( name ); if ( url == null ) { throw new AccessKeyReaderException( "Le fichier de gestion des droits d'acc�s est introuvable, '" + name + "'" ); } return ( url ); } }