/**
* 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 26 avr. 04
*
* 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.outils;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.validator.GenericValidator;
import org.apache.struts.util.MessageResources;
import org.squale.welcom.struts.plugin.WelcomContext;
import org.squale.welcom.taglib.aide.Aide;
import org.squale.welcom.taglib.aide.AideException;
/**
* @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 WelcomConfigurator
implements IWConfigurator
{
/** instance */
private static final HashMap htSingleton = new HashMap();
/** logger */
private static Log logStartup = LogFactory.getLog( "Welcom" );
/** Message bundle de l'application, pour la configuration */
private MessageResources message = null;
/** Message bundle interne ... contient la conf de welcom par defaut */
private static MessageResources messageInternal = null;
/** Emplacement par default de la conf de Welcom dans son package */
private final static String MSG_INTERNAL_KEY = "org.squale.welcom.resources.WelcomResources";
/** Date de derniere modification de parametres */
private Date lastDateFile = null;
/** Nom du fichier de configuration du projet pour welcom */
private String fileName = "";
/** Le fichie de configuration est trouv� */
private boolean goodFileResources = false;
/** Version de la charte */
private Charte charte = null;
/**
* @return Pseudo Singleton /recupere sous la clef JNDI : java:comp/env/welcomConfContext
*/
public static WelcomConfigurator getInstance()
{
WelcomConfigurator wc;
final String welcomContextName = WelcomContext.getWelcomContextName();
synchronized ( htSingleton )
{
wc = (WelcomConfigurator) htSingleton.get( welcomContextName );
if ( wc == null )
{
wc = new WelcomConfigurator();
htSingleton.put( welcomContextName, wc );
}
}
return wc;
}
/**
* Initialise les propri�t�s du fichier de configuration - lastDate - isGoodResources
*
* @param pFileName fichier de configuration
*/
private void initializeFile( final String pFileName )
{
String realFileName = "";
this.fileName = pFileName;
InputStream is = null;
if ( !GenericValidator.isBlankOrNull( fileName ) )
{
// Set up to load the property resource for this locale key, if we can
realFileName = fileName.replace( '.', '/' ) + ".properties";
goodFileResources = true;
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
// Recherche la date de derniere modification
final URL url = classLoader.getResource( realFileName );
URLConnection urlConn;
try
{
urlConn = url.openConnection();
urlConn.setUseCaches( false );
urlConn.connect();
urlConn.getLastModified();
lastDateFile = new Date( urlConn.getLastModified() );
}
catch ( final Exception e )
{
goodFileResources = false;
}
// Regarde si le fichier n'est pas vide
is = classLoader.getResourceAsStream( realFileName );
goodFileResources = ( is != null );
}
}
/**
* Retourne la charte actuelle dans le fichier de config
*
* @return la charte interne
*/
public Charte getInternalCharte()
{
if ( charte == null )
{
String versionMajor = WelcomConfigurator.getMessage( WelcomConfigurator.CHARTE );
String versionMinor = WelcomConfigurator.getMessage( "charte" + versionMajor + ".version" );
String version = versionMajor + "." + versionMinor;
if ( "v2.001".equalsIgnoreCase( version ) )
{
charte = Charte.V2_001;
}
else if ( "v2.002".equalsIgnoreCase( version ) )
{
charte = Charte.V2_002;
}
else if ( "v3.001".equalsIgnoreCase( version ) )
{
charte = Charte.V3_001;
}
else
{
/** Par default si ca merde ... */
charte = Charte.V3_001;
logStartup.warn( "Erreur sur la lecture de la charte passage en " + charte );
}
}
return charte;
}
/**
* @return Troune vrai si le fichier est trouv�
*/
public boolean isGoodFileResources()
{
return goodFileResources;
}
/**
* @return Retourne la date de derniere modification du fichier
*/
public Date getLastDateFile()
{
return lastDateFile;
}
/**
* initialise la configuration de Welcom
*
* @param pFileName : File name
*/
private void initialize( final String pFileName )
{
initializeFile( pFileName );
if ( !GenericValidator.isBlankOrNull( pFileName ) )
{
if ( message != null )
{
logStartup.warn( "Double initialisation de Welcom" );
logStartup.warn( "Seules les propri�t�s du dernier init seront prises en compte !" );
logStartup.warn( "Sp�cifier votre welcomContext (Variable d'environnement du web.xml)" );
}
if ( isGoodFileResources() )
{
logStartup.info( "Initialisation de " + WelcomContext.getWelcomContextName() + " : " + fileName );
message = MessageResources.getMessageResources( fileName );
}
else
{
logStartup.info( "ERREUR : fichier de config welcom non trouv� '" + fileName + "'" );
}
}
else
{
logStartup.info( "Initialisation de Welcom avec configuration par default" );
}
messageInternal = MessageResources.getMessageResources( MSG_INTERNAL_KEY );
// Init De l'aide
initAide();
}
/*******************************************************************************************************************
* Partie statique
******************************************************************************************************************/
/**
* Initilisation via le fichier de config
*
* @param fileName : Nom de la resource locale du projet. Celle-cis surcharge les definition de welcom
*/
public static void init( final String fileName )
{
getInstance().initialize( fileName );
}
/**
* Initialisation par default si par de resource par l'utilisateur
*/
private static void init()
{
getInstance().initialize( null );
}
/**
* Initialisation de l'aide .... Utilis� seulement par agir / n'est pas proppos� aux auters projets
*/
private static void initAide()
{
if ( Util.isTrue( getMessage( "aide.active" ) ) )
{
final String aideRessource = getMessage( "aide.properties" );
final String aidePath = getMessage( "aide.path.url" );
if ( GenericValidator.isBlankOrNull( aideRessource ) )
{
logStartup.info( "Parametre Aide.properties : null" );
}
else
{
logStartup.info( "Fichier d'aide :" + aideRessource );
try
{
Aide.openAide( aideRessource, aidePath );
}
catch ( final AideException ae )
{
logStartup.error( ae.getMessage(), ae );
}
}
}
}
/**
* Recuperation des messages de configuration .... L'internationnalisaion n'est pas necessaire
*
* @param locale : locale
* @param key : Clef a cherch�
* @param arg1 : attribut 1
* @param arg2 : attribut 2
* @param arg3 : attribut 3
* @param arg4 : attribut 4
* @return Valeur
*/
private String getComputedMessage( final Locale locale, final String key, final Object arg1, final Object arg2,
final Object arg3, final Object arg4 )
{
if ( ( message == null ) && ( messageInternal == null ) )
{
WelcomConfigurator.init();
}
if ( ( message != null ) && message.isPresent( locale, key ) )
{
return message.getMessage( locale, key, arg1, arg2, arg3, arg4 );
}
else
{
return messageInternal.getMessage( locale, key, arg1, arg2, arg3, arg4 );
}
}
/**
* Recuperation des messages de configuration .... L'internationnalisaion n'est pas necessaire
*
* @param locale : locale
* @param key : Clef a cherch�
* @param arg1 : attribut 1
* @param arg2 : attribut 2
* @param arg3 : attribut 3
* @param arg4 : attribut 4
* @return Valeur
*/
private static String getMessage( final Locale locale, final String key, final Object arg1, final Object arg2,
final Object arg3, final Object arg4 )
{
return getInstance().getComputedMessage( locale, key, arg1, arg2, arg3, arg4 );
}
/**
* Recuperation des messages de configuration ....
*
* @param partialKey : Clef a cherch�
* @return Valeur
*/
public static String getMessageWithFullCfgChartePrefix( final String partialKey )
{
final Charte vcharte = WelcomConfigurator.getCharte();
String prefix = vcharte.getWelcomConfigFullPrefix();
return getMessage( (Locale) null, prefix + partialKey, null, null, null, null );
}
/**
* Recuperation des messages de configuration ....
*
* @param partialKey : Clef a cherch�
* @return Valeur
*/
public static String getMessageWithCfgChartePrefix( final String partialKey )
{
final Charte vcharte = WelcomConfigurator.getCharte();
String prefix = vcharte.getWelcomConfigPrefix();
return getMessage( (Locale) null, prefix + partialKey, null, null, null, null );
}
/**
* Recuperation des messages de configuration ....
*
* @param key : Clef a cherch�
* @return Valeur
*/
public static String getMessage( final String key )
{
return getMessage( (Locale) null, key, null, null, null, null );
}
/**
* Recuperation des messages de configuration ....
*
* @param key : Clef a cherch�
* @param arg1 : attribut 1
* @return Valeur
*/
public static String getMessage( final String key, final Object arg1 )
{
return getMessage( null, key, arg1, null, null, null );
}
/**
* Recuperation des messages de configuration ....
*
* @param key : Clef a cherch�
* @param arg1 : attribut 1
* @param arg2 : attribut 2
* @return Valeur
*/
public static String getMessage( final String key, final Object arg1, final Object arg2 )
{
return getMessage( null, key, arg1, arg2, null, null );
}
/**
* Recuperation des messages de configuration ....
*
* @param key : Clef a cherch�
* @param arg1 : attribut 1
* @param arg2 : attribut 2
* @param arg3 : attribut 3
* @return Valeur
*/
public static String getMessage( final String key, final Object arg1, final Object arg2, final Object arg3 )
{
return getMessage( null, key, arg1, arg2, arg3, null );
}
/**
* Recuperation des messages de configuration ....
*
* @param key : Clef a cherch�
* @param arg1 : attribut 1
* @param arg2 : attribut 2
* @param arg3 : attribut 3
* @param arg4 : attribut 4
* @return Valeur
*/
public static String getMessage( final String key, final Object arg1, final Object arg2, final Object arg3,
final Object arg4 )
{
return getMessage( key, arg1, arg2, arg3, arg4 );
}
/**
* @return Date de modification des fichiers
*/
public static Date getLastDate()
{
return getInstance().getLastDateFile();
}
/**
* Retourne la charte actuelle dans le fichier de config
*
* @return la charte actuelle dans le fichier de config
*/
public static Charte getCharte()
{
return getInstance().getInternalCharte();
}
}