/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.control.common;
import net.codjo.variable.TemplateInterpreter;
import net.codjo.variable.UnknownVariableException;
import java.util.HashMap;
import java.util.Map;
/**
* Description of the Class
*
* @author $Author: nadaud $
* @version $Revision: 1.7 $
*/
public class Dictionary implements Cloneable {
private TemplateInterpreter interpreter = new TemplateInterpreter();
private Map<String, Variable> variablesForName = new HashMap<String, Variable>();
private java.sql.Timestamp now;
private Dictionary parent;
public Dictionary() {
}
/**
* Clone ce dictionnaire : les champs now et parent ne sont pas clon�s, mais les variables sont clon�es.
*
* @return
*/
@Override
public Object clone() {
// Cr�ation d'une nouvelle instance
Dictionary newDico = new Dictionary();
// On garde les m�mes r�f�rences pour now et parent
newDico.now = this.now;
newDico.parent = this.parent;
// On remplit la nouvelle Map en clonant les valeurs
for (String variableName : this.variablesForName.keySet()) {
Variable variable = this.variablesForName.get(variableName);
newDico.variablesForName.put(variableName, (Variable)variable.clone());
}
return newDico;
}
public void setNow(java.sql.Timestamp now) {
this.now = now;
addVariable("today", new java.sql.Date(now.getTime()).toString());
}
// public void setVariables(java.util.Collection variables) {
// interpreter.clear();
// this.variables = variables;
// interpreter.addAll((List)variables);
// }
public java.sql.Timestamp getNow() {
return now;
}
public java.util.Collection getVariables() {
return variablesForName.values();
}
public Variable getVariable(String variableName) {
return variablesForName.get(variableName);
}
public void addVariable(Variable variable) {
variablesForName.put(variable.getName(), variable);
}
public void addVariable(String name, String value) {
Variable variable = new Variable(name, value);
addVariable(variable);
}
public String replaceVariables(String pattern) {
try {
interpreter.clear();
// On ajoute d'abord les variables du dictionnaire p�re (s'il y en a un),
// le dictionnaire fils pouvant �craser certaines valeurs.
if (parent != null) {
interpreter.addAll(parent.variablesForName.values());
}
interpreter.addAll(variablesForName.values());
return interpreter.evaluate(pattern);
}
catch (UnknownVariableException error) {
throw new IllegalArgumentException(error.getMessage());
}
}
/**
* Ajoute les variables d'un dictionnaire � ce dictionnaire ; note : les variables ajout�es ne sont pas
* clon�es.
*
* @param dico
*/
public void addDictionary(Dictionary dico) {
for (Variable variable : dico.variablesForName.values()) {
addVariable(variable);
}
}
public Dictionary getParent() {
return parent;
}
public void setParent(Dictionary parent) {
this.parent = parent;
}
@Override
public String toString() {
return "(now=" + getNow() + " vars= " + variablesForName.values() + ")";
}
}