Есть ли способ получить Apache-Digester для интернирования строк для определенных атрибутов? - PullRequest
1 голос
/ 08 июня 2009

Я большой поклонник использования apache-digester для загрузки файлов XML в мою объектную модель.

Я имею дело с большими файлами, которые содержат много дубликатов (журналов событий), и поэтому хотел бы String.intern () строки для определенных атрибутов (те, которые часто повторяются).

Поскольку Apache-Digester считывает весь файл перед передачей управления, он изначально генерирует много дубликатов, которые поглощают много памяти; Затем я могу перебрать все мои объекты и стажера, но я все равно плачу за использование большого количества памяти.

Другая альтернатива заключается в том, чтобы моя соответствующая функция bean-объекта setProperty в моей объектной модели всегда интернировала параметр, но я использую эту же функцию из своего кода для уже интернированных строк, так что это будет расточительно; кроме того, я не хочу вводить специфический для метателя код в мою модель.

Есть ли способ заставить Digester интернировать или выполнять пользовательский код до / после установки свойств?

1 Ответ

3 голосов
/ 09 июня 2009

Вы можете создать собственное Правило Digester для достижения этой цели:

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() );
    }

}

Вместо того, чтобы делать:

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

Вы бы сделали это:

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

В зависимости от того, какой метод метантенка вы используете, существуют разные классы, которые вы можете подклассировать (SetPropertyRule, CallMethodRule и т. Д.)

...