2009-06-08 6 views
1

Je suis un grand fan de l'utilisation d'apache-digester pour charger des fichiers XML dans mon modèle d'objet.Existe-t-il un moyen d'amener Apache-digester à interner des chaînes pour certains attributs?

Je traite des fichiers volumineux qui contiennent beaucoup de doublons (journaux d'événements), et je voudrais donc String.intern() les chaînes pour des attributs spécifiques (ceux qui se répètent fréquemment). Comme Apache-Digester lit le fichier entier avant d'abandonner le contrôle, il génère initialement beaucoup de doublons qui consomment beaucoup de mémoire; Je peux alors aller et parcourir tous mes objets et stagiaires, mais je paye toujours le coût d'utilisation de beaucoup de mémoire. Une autre alternative est d'avoir toujours la fonction bean setProperty correspondante dans mon modèle d'objet interne au paramètre, mais j'utilise la même fonction dans mon code sur des chaînes déjà internées, ce qui serait inutile; d'ailleurs, je ne veux pas introduire de code spécifique au digesteur dans mon modèle.

Existe-t-il un moyen pour que Digester effectue un internat ou exécute du code personnalisé avant/après le paramétrage des propriétés?

Répondre

3

Vous pouvez créer votre propre digesteur Règle pour y parvenir:

public class InternRule extends BeanPropertySetterRule 
{ 
    public InternRule(String propertyName) 
    { 
     super(propertyName); 
    } 

    @Override 
    public void body(String namespace, String name, String text) 
     throws Exception 
    { 
     super.body(namespace, name, text.intern()); 
    } 

} 

Au lieu de faire:

digester.addBeanPropertySetter("book/author", "author"); 

Vous devez faire cela:

digester.addRule("book/author", new InternRule("author")); 

Selon la méthode de digestion vous utilisez il existe différentes classes que vous pouvez sous-classer (SetPropertyRule, CallMethodRule, etc)

Questions connexes