пятница, 6 января 2012 г.

Что это, Берриссон?

Логично было бы предположить, что первая запись после НГ будет об итогах года. Так как итоги будут уже вторые - они и пойдут вторыми.

Так что первой в этом году будет запись о странном баге в ODI. Чувствую я, что год пройдет как раз под знаком разбирательств с багами в нашем любимом инструменте.

Начнем.

Некоторые вещи, как описываемая ниже, очень огорчают. В частности, вот эта ошибка, понять причины которой я пока так и не смог.

Предистория.

Разрабатываем проект в новой версии ODI. В наличии три десятка простых интерфейсов со справочниками и несколько штук таблиц фактов. И вот один из интерфейсов для загрузки таблицы фактов, после того, как добрый десяток таблиц источников был добавлен в диаграмму и успешно соединен между собой, открываться отказался.

Что ж, проект, можно сказать, тренировочный. Делаем интерфейс еще раз. Получаем через время тот же результат. И третий раз уже другой разработчик делает интерфейс, соединяет примерно половину справочников с таблицей фактов, сохраняет интерфейс и уходит на выходные.

В понедельник все повторяется... При попытке открыть маппинг интерфейса получаем вот такую ошибку :


Поиск по патчам результата не дал. Изменение контекста по-умолчанию, назначение связок для неиспользуемого контекста Global тоже не помогло.

После попытки открыть маппинг курсор мыши отображается в виде песочных часов при всех последующих действиях. Чтобы избавиться от этого приходилось просто перезапускать ODI Студию.

Мною была осуществленна попытка работать через вкладку Quick Edit. Удаление таблиц источников или изменения в маппингах колонок, удаление соединений - любые изменения в режиме быстрого редактирования интерфейса не сохраняются, так как сам интерфейс не сохраняется.

Причем, когда пытаешься закрыть интерфейс, и отвечаешь Да, на вопрос о сохранении - просто ничего не происходит, и вкладка редактирования интерфейса просто не закрывается. При нажатии на кнопку сохранения - выдает вот эту ошибку:


К сожалению, причину ошибки в отображении маппинга найти пока так и не удалось. Даже специальная утилита для проверки корректности записей в репозитории, называемая Repository Consistency Checker (RCC) в этом случае не помогла. Она при полной проверке выдала только некое предупреждение для одного из интерфейсов в проекте.

Единственная радость - удалось этот (и потом еще один) интерфейс вернуть к жизни с помошью одного нехитрого трюка. Нехитрого и стандартного процесса экспорта - импорта объекта ODI (т.е. описываемого поврежденного интерфейса).

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

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


Как видно, все таблицы источники выстроены в строгом порядке сверху вниз, в отличие от реальных интерфейсов, которые могут выглядеть самым замысловатым образом (вот тут примеры для OWB).

Полный текст ошибки для тех кто ищет по интернету что произошло с их интерфейсом:

An internal error occured, whilst opening the diagram.
java.io.IOException
 at oracle.diagram.dif.DiagramIdeNode.getDiagram(DiagramIdeNode.java:226)
 at oracle.modeler.dif.ModelerGraphicBridge.getGrapher(ModelerGraphicBridge.java:408)
 at oracle.modeler.dif.ModelerGraphicBridge.getGrapher(ModelerGraphicBridge.java:326)
 at oracle.modeler.addin.ModelerNode.findOrCreateManager(ModelerNode.java:212)
 at oracle.modeler.addin.ModelerDiagram.findOrCreateGraphSystemFromContext(ModelerDiagram.java:344)
 at oracle.diagram.framework.editor.CommonDiagram.open(CommonDiagram.java:219)
 at oracle.modeler.addin.ModelerDiagram.open(ModelerDiagram.java:106)
 at oracle.odi.ui.etlmodeler.custom.OdiModelerDiagram.access$0(OdiModelerDiagram.java:1)
 at oracle.odi.ui.etlmodeler.custom.OdiModelerDiagram.open(OdiModelerDiagram.java:268)
 at oracle.diagram.framework.editor.IdeDiagramEditor.openDiagram(IdeDiagramEditor.java:264)
 at oracle.diagram.framework.editor.IdeDiagramEditor.open(IdeDiagramEditor.java:222)
 at oracle.modeler.addin.ModelerEditor.open(ModelerEditor.java:74)
 at oracle.odi.ui.editor.pop.OdiTabbedModelerEditor.open(OdiTabbedModelerEditor.java:629)
 at oracle.ideimpl.editor.EditorState.openEditor(EditorState.java:283)
 at oracle.ideimpl.editor.EditorState.createEditor(EditorState.java:184)
 at oracle.ideimpl.editor.EditorState.getOrCreateEditor(EditorState.java:95)
 at oracle.ideimpl.editor.SplitPaneState.canSetEditorStatePos(SplitPaneState.java:232)
 at oracle.ideimpl.editor.SplitPane.setCurrentEditorStatePos(SplitPane.java:1228)
 at oracle.ideimpl.editor.SplitPane$1.valueChanged(SplitPane.java:134)
 at oracle.ide.controls.customtab.CustomTab.fireSelectionChange(CustomTab.java:304)
 at oracle.ide.controls.customtab.CustomTab._setSelectedPage(CustomTab.java:635)
 at oracle.ide.controls.customtab.CustomTab.setSelectedPage(CustomTab.java:596)
 at oracle.ide.controls.customtab.CustomTab.selectPageAt(CustomTab.java:650)
 at oracle.ide.controls.customtab.CustomTab.mousePressed(CustomTab.java:1016)
 at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:262)
 at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:262)
 at java.awt.Component.processMouseEvent(Component.java:6286)
 at javax.swing.JComponent.processMouseEvent(JComponent.java:3268)
 at java.awt.Component.processEvent(Component.java:6054)
 at java.awt.Container.processEvent(Container.java:2042)
 at java.awt.Component.dispatchEventImpl(Component.java:4652)
 at java.awt.Container.dispatchEventImpl(Container.java:2101)
 at java.awt.Component.dispatchEvent(Component.java:4483)
 at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
 at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4235)
 at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
 at java.awt.Container.dispatchEventImpl(Container.java:2085)
 at java.awt.Window.dispatchEventImpl(Window.java:2479)
 at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:645)
 at java.awt.EventQueue.access$000(EventQueue.java:85)
 at java.awt.EventQueue$1.run(EventQueue.java:604)
 at java.awt.EventQueue$1.run(EventQueue.java:601)
 at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:614)
 at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:270)
 at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:175)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:170)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:162)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Вот такая овсянка получается...
Желаю всем удачной борьбы с противостоящими багами в наступившем году.

3 комментария:

  1. Причина случайно не найдена?
    Если интерфейсы содержат хотя бы один джойн, то вот такое сейчас постоянно выпадает :(

    ОтветитьУдалить
    Ответы
    1. Точная причина не найдена, есть предположение.

      Постарайтесь не сворачивать таблицы в тот вид, когда не видно столбцов. У меня подобное произошло в интерфейсе, где было больше 10 источников, сейчас, когда источников до 5 ни в одном интерфейсе не повторялась эта ошибка, возможно, это тоже причина.

      Удалить
  2. Gracias!
    Как раз очень часто использую сворачивание, поскольку монитор махонький. Придется отказаться от этого.

    ОтветитьУдалить

Примечание. Отправлять комментарии могут только участники этого блога.