/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.broadcast.common; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import net.codjo.variable.TemplateInterpreter; import net.codjo.variable.UnknownVariableException; /** * Contexte d'une diffusion. * * <p> Un contexte contient la definition de variable. </p> * * <p> Les variables definit lors de la construction du contexte sont consid�r� comme immutable (la methode put refusera * leurs redefinition). </p> */ public class Context { private Map<String, Object> immutableParameters = new HashMap<String, Object>(); private Map<String, Object> parameters = new HashMap<String, Object>(); private java.sql.Date forceToday = null; private Context subContext = null; private List<String> warnings; private boolean computedTableWasCreated; public Context() { } public Context(java.sql.Date forceDate) { this(null, forceDate); } public Context(Map<String, Object> params) { this(params, null); } public Context(Map<String, Object> params, java.sql.Date forceDate) { if (params != null) { immutableParameters = new HashMap<String, Object>(params); } forceToday(forceDate); } /** * Connecte ce contexte a un sous-contexte. Ce contexte utilisera aussi les variables du sous-contexte. * * @param ctxt un sous-contexte. */ public void connectTo(Context ctxt) { subContext = ctxt; } /** * Force la date du jour. * * @param newToday Une date */ public void forceToday(java.sql.Date newToday) { this.forceToday = newToday; } /** * Retourne la valeur du parametre. Si le parametre est indefini une exception est levee. * * @return la valeur du parametre * * @throws NoSuchElementException Parametre inconnu */ public Object getParameter(String parameterName) { Map params = getParameters(); Object val = params.get(parameterName); if (val == null && !params.containsKey(parameterName)) { throw new NoSuchElementException("Le parametre " + parameterName + " n'est pas definit"); } return val; } /** * Retourne les parametres de ce contexte (+ les parametres du sous-contexte). * * @return une map de parametres : clef = nom du parametres / valeur = valeur du parametre (pas forcement une * string) */ public Map<String, Object> getParameters() { Map<String, Object> params = new HashMap<String, Object>(); if (subContext != null) { params.putAll(subContext.getParameters()); } params.putAll(parameters); params.putAll(immutableParameters); return params; } /** * Renvoie la date du jour. * * @return La date du jour ou la date forc�e par forceToday(). */ public java.sql.Date getToday() { if (this.forceToday == null) { return new java.sql.Date(System.currentTimeMillis()); } else { return this.forceToday; } } /** * Teste la presence d'un parametre. * * @param parameterName Le parametre a tester * * @return <code>true</code> si la variable est definie. */ public boolean hasParameter(String parameterName) { return getParameters().containsKey(parameterName); } public void putParameter(String parameterName, Object value) { if (immutableParameters.containsKey(parameterName)) { throw new IllegalArgumentException("La variable " + parameterName + "ne peut etre redefinit."); } parameters.put(parameterName, value); } /** * Remplace les variables du fichier <code>templateFile</code> par leurs valeurs. * * @return le fichier converti */ public File replaceVariables(File templateFile) { return new File(replaceVariables(templateFile.getPath())); } /** * Remplace les variables de la String <code>template</code> par leurs valeurs. * * @return le template instancie * * @throws IllegalArgumentException si le templateFile contient une variable inconnue. */ public String replaceVariables(String template) { TemplateInterpreter interpreter = new TemplateInterpreter(); interpreter.addAsVariable(getParameters()); try { return interpreter.evaluate(template); } catch (UnknownVariableException ex) { throw new IllegalArgumentException("La string >" + template + "< contient des variables inconnues : " + ex.getMessage()); } } public void addWarning(String warning) { if (warnings == null) { warnings = new ArrayList<String>(); } // a given computed field might report the same warning multiple times // if it's used by multiple sections of the same exported file // => we must avoid reporting warning more than once if (!warnings.contains(warning)) { warnings.add(warning); } } public String getWarnings() { if (warnings == null) { return null; } StringBuilder result = new StringBuilder(); String lineSeparator = System.getProperty("line.separator"); boolean first = true; for (String warning : warnings) { if (!first) { result.append(lineSeparator); } first = false; result.append(warning); } return result.toString(); } public void setComputedTableWasCreated(boolean computedTableWasCreated) { this.computedTableWasCreated = computedTableWasCreated; } public boolean getComputedTableWasCreated() { return computedTableWasCreated; } }