Отображение вычисляемых данных с внешними зависимостями

Я создаю отчет, который должен включать столбец «оценка», основанный на данных, которых нет в наборе данных.

В идеале я хотел бы иметь возможность определить интерфейс Java

public int getEstimate(int foo_id, int bar_id, int quantity);

где foo_id, bar_id и quantity доступны в строке, в которой я хочу представить оценку.

Будет несколько стратегий для получения оценки, поэтому было бы хорошо использовать интерфейс, позволяющий менять их местами при необходимости.

Глядя на документы BIRT, я думаю, что, возможно, мне следует использовать механизмы обработчика событий, но это, похоже, позволяет только определить класс для использования, и я как-то хотел бы внедрить настроенный оценщик.

В качестве незапутанного примера можно сказать, что у меня есть набор данных, который включает столбец IP-адреса, и я хотел бы иметь возможность использовать какой-либо сервис GeoIP для определения страны по IP-адресу. В этом случае у меня будет интерфейс public String getCountryName(String address), а реальные реализации могут использовать MaxMind, локальный кеш или какую-то другую систему.

Как мне это сделать?

Или... не лучше ли мне написать источник данных со сценарием, который может интегрировать вычисленные данные перед их доставкой в ​​BIRT?

Или... какой-то сценарий источника данных, который затем используется для создания набора данных соединения?


person ptomli    schedule 19.08.2009    source источник


Ответы (1)


Я думаю, что скриптовый источник данных будет работать нормально, но обработчик событий на основе Java будет более простым. Вы можете реализовать его как простой POJO и получить доступ ко всем без исключения сложным объектам и инструментам, которые позволят вам рассчитать вашу оценку. Самым простым решением может быть просто добавление вычисляемого поля в набор данных.

При создании вычисляемого поля вы можете усложнить логику сценариев, которую вы можете использовать для получения результирующего значения. Самое приятное в этом маршруте то, что все остальные значения столбцов в строке (которые, как я полагаю, вам нужны для расчета оценки) доступны через редактор выражений. Вы также можете использовать сложные объекты (POJO), чтобы помочь в своих вычислениях, используя объект «Пакеты» (например, var red = new Packages.redwood.HelloWorld())

Если вы хотите создать класс обработчика событий, я бы сделал следующее. Я бы создал текстовый объект и привязал onCreate даже к вашему POJO (путем расширения TextItemEventAdapter) и переопределил метод onCreate. Там вы можете делать любую работу, которую хотите, и в конце просто вызвать «text.setText(theEstimateResult);», чтобы сделать саму оценку видимой. Что касается доступа к значениям данных для выполнения ваших расчетов, вы также можете получить доступ к ним в POJO. Я предполагаю, что оценка будет частью более крупной таблицы значений. Вы можете получить доступ к любому конкретному значению строки через reportContext.

Это две идеи, которые я бы попробовал в первую очередь. Вычисляемый столбец реализуется быстрее всего и с наименьшей вероятностью вызовет затруднения во время развертывания. Дайте мне знать, какой способ вы выберете, и мы можем обсудить это дальше, если это необходимо.

person MystikSpiral    schedule 19.08.2009
comment
Я пытаюсь понять, как в вашем примере экземпляр redwood.HelloWord сможет иметь предварительно настроенные свойства не из сценария BIRT. Например, мой контекст Spring, в котором я пытаюсь запустить BIRT, может иметь реализацию интерфейса службы, которую должен использовать мой оценщик. Непосредственное создание экземпляра HelloWorld означает, что его необходимо настроить. Возможно, мне нужно взглянуть на Spring AOP для динамического внедрения, но я подозреваю, что бит BIRT OSGI может помешать. Обработчики событий выглядят красиво, но я просто не знаю, как получить ссылку на уже существующий внешний экземпляр. - person ptomli; 19.08.2009
comment
В примере с обработчиком событий, если вам нужно получить уже существующий экземпляр чего-то (и вы работаете на той же виртуальной машине), вам, вероятно, понадобится это что-то для реализации шаблона Singleton. Частный конструктор и общедоступный метод getInstance(). Это позволит вам довольно легко получить его из POJO. - person MystikSpiral; 19.08.2009
comment
Хорошо, я собираюсь попробовать пару вариантов и посмотреть, что получится. Я думаю, что источник данных обеспечит лучшие механизмы управления в Spring (я могу внедрить экземпляр, избегая Singleton), хотя обработчик событий хорошо «чувствует» его (конкретные классы для определенных целей). Спасибо - person ptomli; 20.08.2009