Разобрать в свойствах со значениями по умолчанию, используя Commons Digester

<properties>
   <property name="p1">v1</property>
   <property name="p2">v2</property>
</properties>

Я хочу разобрать это в Properties объект с {"p1"="v1", "p2"="v2"}, Я был в состоянии сделать это много, используя обычный дайджест.

forPattern("properties").createObject()
        .ofType(Properties.class);
forPattern("properties/property")
        .callMethod("put").withParamCount(2)
        .withParamTypes(Object.class, Object.class).then()
        .callParam().fromAttribute("name").ofIndex(0).then()
        .callParam().ofIndex(1);

Кроме того, я также хотел пройти по умолчанию Properties объект, который у меня есть. т.е. вместо new Properties(), Мне нужно сделать new Properties(defaults) создать экземпляр свойств. Я в курсе .usingConstructor(Properties.class).then() но не нашел способ пройти существующий Properties объект в качестве аргумента.

Я использую v3.3.2. Любая помощь с благодарностью

1 ответ

Решение

Ну, я понял, что это можно сделать с помощью FactoryCreateRule

class PropertiesFactory extends AbstractObjectCreationFactory<Properties> {

    Properties defaultProperties;

    public PropertiesFactory(Properties defaultProperties) {
        super();
        this.defaultProperties = defaultProperties;
    }

    @Override
    public Properties createObject(Attributes attributes) throws Exception {
        return new Properties(defaultProperties);
    }

}

...
...

forPattern("properties").factoryCreate()
        .usingFactory(new PropertiesFactory(defaultProperties));
forPattern("properties/property")
        .callMethod("put").withParamCount(2)
        .withParamTypes(Object.class, Object.class).then()
        .callParam().fromAttribute("name").ofIndex(0).then()
        .callParam().ofIndex(1);
Другие вопросы по тегам