Как добавить дополнительный контекст / значения для пользовательского ограничения метода на основе XML с помощью инфраструктуры проверки OVal - PullRequest
0 голосов
/ 24 ноября 2011

С помощью инфраструктуры проверки OVal (http://oval.sourceforge.net/) можно создавать пользовательские аннотации или ограничения на основе XML (http://oval.sourceforge.net/userguide.html#d4e493).

). Я собираюсь создать файл конфигурации OVal XML из некоторых определений ограничений, поэтому я хотел быЯ хотел бы сделать полное определение ограничения OVal с конфигурацией XML (http://oval.sourceforge.net/userguide.html#d4e551).

. Я хотел бы проверить возвращаемое значение определенного метода (getDomain) класса (Attend), и мне нужно добавить дополнительные значения (шесть строк) для метода isSatisfied моего пользовательского класса проверки.

Моя конфигурация XML до сих пор выглядит следующим образом:

<class type="my.package.Attend"
    overwrite="false" applyFieldConstraintsToSetter="true">

    <field name="NAME">
        <notNull />
        <maxLength max="4" />
    </field>

    <method name="getDomain">
        <returnValue>
            <my.package.DomainCheck />
        </returnValue>
    </method>

</class>

У меня есть класс проверки DomainCheck, который должен получить возвращаемое значение из getDomainВ методе isSatisfied DomainCheck я должен проверить возвращаемое значение с некоторыми дополнительными параметрами, которые мне нужно каким-то образом настроить в XML.

Моя первая проблема заключается в том, что метод isSatisfied в DomainCheck не являетсяЕсли удалить ограничение метода, тРезультат проверки недействителен, так как я ожидаю его от ограничения поля.Но если я добавлю ограничение метода, DomainCheck не будет вызван, и результат проверки будет действительным (все равно должен быть недействительным).Я не могу понять, почему не вызывается пользовательская проверка.Что-то должно быть не так с моим определением ограничения метода.Вот мой пользовательский класс проверки и соответствующий интерфейс:

package my.package;

import ...

public class DomainCheck extends AbstractAnnotationCheck<Domain> {


    public boolean isSatisfied(Object validatedObject, Object valueToValidate, OValContext context, Validator validator) {
        if (valueToValidate == null) {
            return true;
        }

        List<?> domainMembers = (ArrayList<?>) valueToValidate;
        for (Object domainMember : domainMembers) {
            // do validation
        }

        return false
    }

}

package my.package;

import ...

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@net.sf.oval.configuration.annotation.Constraint(checkWith = DomainCheck.class)
public @interface Domain {

    String message() default "must be conform to ...";
}

Если это сработает, моей второй проблемой будет настройка дополнительных параметров.Я подумал о чем-то вроде:

    <method name="getDomain">
        <returnValue>
            <my.package.DomainCheck />
        </returnValue>
        <parameter type="java.lang.String">OneName</parameter>
        <parameter type="java.lang.String">AnotherName</parameter>
        <parameter type="java.lang.String">0</parameter>
        <parameter type="java.lang.String">*</parameter>
        <parameter type="java.lang.String">5</parameter>
        <parameter type="java.lang.String">100</parameter>
    </method>

Синтаксис выше для определения ограничений для сигнатуры метода, так что это, очевидно, не работает.Но я не могу найти какое-либо возможное определение для моей цели.

Итак, почему моя пользовательская проверка не вызывается и если есть решение для этого, как я могу определить дополнительные параметры для метода isSatisfied в конфигурации XMLи как я могу получить к ним доступ в методе isSatisfied?

Заранее благодарю за любой совет!Ура Давид

1 Ответ

1 голос
/ 15 июля 2012

Вы пытаетесь использовать функцию программирования по контракту здесь. Чтобы это работало, вам нужно выполнить некоторые дополнительные приготовления: http://oval.sourceforge.net/userguide.html#project-preparation

...