1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
| @Component("geographie")
@SessionScoped // Pour éviter les rechargements de base importants.
public class GeographieReferentiel extends AbstractController
{
/** Serial ID. */
private static final long serialVersionUID = -6530489997305989481L;
/** Service d'accès aux données géographiques. */
@Autowired
private GeographieService serviceGeographie;
/** Limite autocomplete des communes. */
private int limiteAutoComplete = 15;
/**
* Chargement dynamique des communes.
* @param requete Requête.
* @return Liste des communes.
*/
public List<Commune> autoCompleteCommune(String requete) {
Communes communes = getCommunes();
List<Commune> resultats = new ArrayList<>();
int nombre = 0;
Locale locale = this.getLocale();
Collator collator = Collator.getInstance(locale);
collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
collator.setStrength(Collator.PRIMARY); // A et B différents, mais A = a, et A = à.
for(Commune commune : communes)
{
if (startWith(commune.getNom(), requete, collator))
{
resultats.add(commune);
nombre ++;
if (nombre >= this.limiteAutoComplete)
break;
}
}
return resultats;
}
/**
* Formatter la commune répondant à un code pour la présenter de manière utile.
* @param codeCommune code de la commune.
* @return Chaîne de représentation.
*/
public String presentationVille(CodeCommune codeCommune)
{
if (codeCommune == null)
return ""; //$NON-NLS-1$
try
{
Commune commune = this.serviceGeographie.obtenirCommune(codeCommune);
return presentationVille(commune);
}
catch(CommuneInexistanteException e)
{
// Nous avons permis de sélectionner cette commune auparavant.
throw new RuntimeException(e.getMessage());
}
}
/**
* Formatter une commune pour la présenter de manière utile.
* @param commune Commune.
* @return Chaîne de représentation.
*/
public String presentationVille(Commune commune)
{
if (commune == null)
return ""; //$NON-NLS-1$
Departement departement = this.serviceGeographie.obtenirDepartements().get(commune.getCodeDepartement());
if (departement == null)
{
Ressources rsc = new Ressources(GeographieReferentiel.class);
rsc.warn("warn.departement_non_trouve", commune.getCodeDepartement(), commune.getCodeCommune(), commune.getNom()); //$NON-NLS-1$
return ""; //$NON-NLS-1$
}
String format = "{0} ({1} ({2}))"; //$NON-NLS-1$
String ville = MessageFormat.format(format, commune.getNom(), this.serviceGeographie.obtenirDepartements().get(commune.getCodeDepartement()).getNom(), commune.getCodeDepartement());
return ville;
}
/**
* Déterminer si deux chaînes débutent par la même séquence.
* @param chaine Chaîne candidate.
* @param start Chaine à comparer.
* @param collator Collateur.
* @return true si c'est le cas.
*/
private boolean startWith(String chaine, String start, Collator collator)
{
if (start.isEmpty())
return true;
if (chaine.length() < start.length())
return false;
return collator.compare(chaine.substring(0, start.length()), start) == 0;
}
/**
* Obtenir la liste des communes.
* @return Liste des communes.
*/
public Communes getCommunes()
{
Communes communes = this.serviceGeographie.obtenirCommunes();
communes.sort(getLocale());
return communes;
}
/**
* Obtenir la commune ayant un code particulier.
* @param code Code de la commune recherchée.
* @return Commune.
* @throws CommuneInexistanteException si la commune n'existe pas.
*/
public Commune getCommune(CodeCommune code) throws CommuneInexistanteException
{
Objects.requireNonNull(code, "Le code de la commune ne peut pas valoir null."); //$NON-NLS-1$
return this.serviceGeographie.obtenirCommune(code);
}
} |
Partager