пятница, 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!
    Как раз очень часто использую сворачивание, поскольку монитор махонький. Придется отказаться от этого.

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