package org.esupportail.portal.channels.CAnnuaire;
/** 
 * <p>Titre : ElmOfQuery</p>
 * <p>Description : Un élément du formulaire</p>
 * <p>Copyright : Copyright (c) 2003</p>
 * <p>Société : esupPortail</p>
 * @author Sébatien GAUDIN
 * @version 1.0
 */

import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.SearchResult;

import org.jasig.portal.services.LogService;

public class ElmOfQuery {

	/**
	 * Represente le type de donnée (direct, listTable, ... )
	 */
	private String type;

	/**
	 * Represente le filtre lié à cet attribut
	 */
	private String filter;

	/**
	 * Represente le label à afficher dans le formulaire
	 */
	private String label;

	/**
	 * Represente la table liée à cet attribut dans le cas ou la valeur provient d'un table
	 */
	private String table;

	/**
	 * Represente le nombre minimum de caractère à saisir
	 */
	private int minChar = 0;

	/**
	 * Represente la valeur dans le cas d'une zone de texte
	 */
	private String searchValue = "*%s*";

	/**
	 * Represente le nombre maximum de résultat que LDAP va renvoyer
	 */
	private int maxEntries = 0;

	/**
	 * Represente si les "*" saisies par l'utilisateur seront supprimées
	 */
	private String delStar = "false";

	/**
	 * Represente le nom html du champ (pas dans la config, ce nom est donné automatiquement)
	 */
	private String nameHtml;

	/**
	 * Retourne le label à afficher dans le formulaire
	 *
	 *
	 * @return le label
	 */
	public String getLabel() {
		return label;
	} // end getLabel

	/**
	 * Définit le label à afficher dans le formulaire
	 *
	 *
	 * @param le label
	 */
	public void setLabel(String _label) {
		label = _label;
	} // end setLabel

	/**
	 * Dans le cas ou la valeur provient d'un table
	 * retourne la table liée à cet attribut 
	 *
	 *
	 * @return le nom de la table
	 */
	public String getTable() {
		return table;
	} // end getTable

	/**
	 * Dans le cas ou la valeur provient d'un table
	 * définit la table liée à cet attribut 
	 *
	 * @param le nom de la table
	 */
	public void setTable(String _table) {
		table = _table;
	} // end setTable

	/**
	 *retourne le type d'élément
	 *
	 * @return le nom de la table
	 */
	public String getType() {
		return type;
	} // end getType

	/**
	 * Définit le type d'élément
	 *
	 * @param type
	 */
	public void setType(String _type) {
		type = _type;
	} // end setType

	/**
	 * Retourne le filtre engendré par cet élément pour la requete LDAP
	 *
	 *
	 * @return le filtre
	 */
	public String getFilter() {
		return filter;
	} // end getFilter

	/**
	 * Définit le filtre engendré par cet élément pour la requete LDAP
	 * 
	 * @param le filter
	 */
	public void setFilter(String _filter) {
		filter = _filter;
	} // end setFilter

	/**
	 * Remplace les caractères %s et %c du filtre par la valeur passée en aramètre 
	 * 
	 * @param _value
	 * @return le filtre engendré
	 */
	public String updateFilter(String _value,Table T,String urlServeur) {
		String filtreLocal = "";
		if ((_value != null) && (_value.length() > 0)) {
			if (type.equals("text")) {
				filtreLocal = filter.replaceAll("%s", _value);
			} else if (type.equals("direct")) {
				filtreLocal = filter;
			} else if (type.equals("listTable")) {
				filtreLocal = filter.replaceAll("%c", _value);
			} else if (type.equals("textTable")) {				
					
				/*Met les attributs LDAP à récupérer dans un tableau de chaines*/
				String[] attrIDs = new String[1];
				attrIDs[0] = T.getAttrCode();
				LDAPHandler LDAP = new LDAPHandler();
				LDAP.setUrl(urlServeur);
				LDAP.setAttributes(attrIDs);
				LDAP.setMaxEntries(getMaxEntries());
				LDAP.setBase(T.getBase());
				String filtreTmp =
					"(&"
						+ T.getFilter()
						+ "("
						+ T.getAttrValue()
						+ "="
						+ searchValue.replaceAll("%s", _value)
						+ "))";
				LDAP.setFilter(filtreTmp);

				LDAP.setScope(T.getScopeNum());
				NamingEnumeration answer = LDAP.search();
				filtreLocal += "(|";
				if (answer != null) {
					try {
						while (answer.hasMore()) {
							SearchResult sr;
							try {
								sr = (SearchResult) answer.next();
								filtreLocal += "("
									+ getFilter().replaceAll(
										"%c",
										(String) sr
											.getAttributes()
											.get(
											attrIDs[0]).get(
											0))
									+ ")";

							} catch (NamingException f) {
								LogService.log(
									LogService.ERROR,
									"Table::loadItems() : Parcours les réponses NullPointerException : "
										+ f.toString());
								break;
							}
						}
					} catch (NullPointerException f) {
						LogService.log(
							LogService.ERROR,
							"Table::loadItems() : aucune réponse : "
								+ f.toString());
					} catch (NamingException f) {
						LogService.log(
							LogService.ERROR,
							"Table::loadItems() : search : "
								+ f.toString());
					}
					finally{
						LDAP.close();
					}
				}
			filtreLocal += ")";
			}
		} else {
			filtreLocal = "";
		}
		return (filtreLocal);
	} // end setFilter

	/**
	 * Retourne le nom de html de l'élément du formulaire
	 * 
	 * @return le nom html
	 */
	public String getNameHtml() {
		return nameHtml;
	}

	/**
	 * Définit le nom de html de l'élément du formulaire
	 * ce nom n'est pas dans la config mais il est donné automatiquement
	 * 
	 * @param le nom de html
	 */
	public void setNameHtml(String _nameHtml) {
		nameHtml = _nameHtml;
	}

	/**
	 * Dans le cas d'une zone de type text
	 * Retourne le nombre minimum de caractères à saisir
	 * 
	 * @return  le nombre minimum de caractères
	 */
	public int getMinChar() {
		return minChar;
	}

	/**
	 * Dans le cas d'une zone de type text
	 * Définit le nombre minimum de caractères à saisir
	 * 
	 * @param le nombre minimum de caractères
	 */
	public void setMinChar(int _minChar) {
		minChar = _minChar;
	}

	/**
	 * Dans le cas d'une zone de type textTable
	 * retourne le masque de saisie (ex : *%s*)
	 * 
	 * @return le masque
	 */
	public String getSearchValue() {
		return searchValue;
	}

	/**
	 * Dans le cas d'une zone de type textTable
	 * Définit le masque de saisie (ex : *%s*)
	 * 
	 * @param le masque
	*/ 
	public void setSearchValue(String _searchValue) {
		searchValue = _searchValue;
	}

	/**
	 * Dans le cas d'une zone de type textTable ou listTable
	 * retourne le nombre maximum de résultats à récupérer
	 * 
	 * @return le nombre maximum de résultats
	 */
	public int getMaxEntries() {
		return maxEntries;
	}

	/**
	 * Dans le cas d'une zone de type textTable ou listTable
	 * défnit le nombre maximum de résultat à récupérer
	 * 
	 * @param le nombre maximum de résultats
	 */
	public void setMaxEntries(int i) {
		maxEntries = i;
	}

	/**
	 * Retourne si oui ou non, les '*' saisies par l'utilisateur sera supprimée
	 * 
	 * @return true / false 
	 */
	public boolean getDelStarBool() {
		if (delStar.equals("true"))
			return true;
		else
			return false;
	}

	/**
	 * Définit si oui ou non, les '*' saisies par l'utilisateur sera supprimée
	 * 
	 * @param "true" / "false" 
	 */
	public void setDelStar(String string) {
		delStar = string;
	}

} // end ElmOfQuery
