Исследование Oracle Form при помощи Java Development API(JDAPI)

    Для поиска зависимости форма от обьектов базы данных мне нужно было разобрать файл Oracle Form(в дальнейшем — fmb файл).
    Fmb — это псевдотекстовый файл, если очень нужно, PL/SQL код можно увидеть и искать как используются обьекты БД там, но все равно трудно понять тип триггера или программы и к какому элементу формы он относится. Можно использовать конвертацию в FMT, но не думаю, что разбор fmt файла легче чем использование API, который дает Оракл.
    Тем более, что вся остальная часть моей программы была написана в Java Swing, логичней было использовать JDAPI, который позволяет разобрать форм по полочкам и видеть весь код PL/SQL и properties, которые меня интересовали.

    На самом деле, все оказалось делом простым. У вас установлен Oracle Forms, значит все на месте. Архив jar, который необходимо подключить к вашей java аппликации называется frmjdapi.jar, можете поискать его в дереве директорий под ORACLE_HOME, скорей всего он находится %ORACLE_HOME%\jlib\ (Oracle Middleware) или %ORACLE_HOME%\forms\java\ (Forms 10).
    Открытие fmb
    	JdapiModule module = null;
            File theFile = new File(path);
           module = JdapiModule.openModule(theFile);
    


    Получение списка параметров
    for (JdapiIterator params = ((FormModule)module).getModuleParameters(); params.hasNext();){
      ModuleParameter param = (ModuleParameter) params.next();
      System.out.println(param.getName());
             			}
    


    Список блоков
    for (JdapiIterator blocks = ((FormModule)module).getBlocks(); blocks.hasNext();){
      Block block = (Block) blocks.next();
      System.out.println(block .getName());
             			}
    

    Block properties
    if (!block.getWhereClause().equals(""))
           	System.out.println("Where Clause: "+ block.getWhereClause());
    if (!block.getOrderByClause().equals(""))
    	System.out.println("Order by Clause: "+ block.getOrderByClause());
    if (!block.getParentName().equals(""))
    	System.out.println("Reference Object: "+ block.getParentName();
    if (block.isInsertAllowed())
    	System.out.println("Insert Allowed: Yes");
    else
    	System.out.println("Insert Allowed: No");
    if (block.isDeleteAllowed())
    	System.out.println("Delete Allowed: Yes");
    else
    	System.out.println("Delete Allowed: No");
    if (block.isUpdateAllowed())
    	System.out.println("Update Allowed: Yes");
    else
    	System.out.println("Update Allowed: No");
    


    Логика понятна. Мой Eclipse мне просто подсказывал, все что мне было нужно. Так вы можете получить любую информацию о форме.
    Для моих целей JDAPI мне очень подошел, по ходу дела был написан форм браузер.
    Форм в нем выглядит примерно так.
    К сожалению, с Oracle Report так просто не получилось. Но в Oracle, такое впечатление, forms и reports как будто две разные команды писали, которые еще и друг друга не любили.
    Почему-то для отчетов Оракл API не дал. Пришлось rdf файл в batch конвертировать в XML командой
    rwconverter stype=rdffile source="+f.getAbsoluteFile()+ " dtype=xmlfile dest="+xmlFileName+" batch=yes
    а потом парсить этот XML при помощи org.xml.sax, но это уже другая история.
    Метки:
    Поделиться публикацией
    Похожие публикации
    Комментарии 2
    • +1
      Форм-браузер, это круто!
      А получить удобочитаемый XML из FMB можно было посредством утилиты frmf2xml, лежащей в %DevSuiteHome%\BIN\

      @ECHO OFF
      REM
      REM  DESCRIPTION
      REM    This file is used to call the Forms2XML conversion tool.
      REM    It takes .fmb, .mmb, and .olb files and converts them into XML.
      REM 
      REM  NOTES
      REM    It wraps the class oracle.forms.util.xmltools.Forms2XML and passes
      REM    any parameters given onto the tool.
      REM    You can only use the standard nine parameters, but these can include
      REM    wildcards in the filenames.
      REM
      
      REM Setup the path to include the necessary Forms dlls.
      set PATH=C:\DevSuiteHome_1\bin;%PATH%
      
      REM Run the tool with the required jar files added to the classpath
      C:\DevSuiteHome_1\jdk\bin\java -classpath C:\DevSuiteHome_1\forms\java\frmxmltools.jar;C:\DevSuiteHome_1\forms\java\frmjdapi.jar;C:\DevSuiteHome_1\lib\xmlparserv2.jar;C:\DevSuiteHome_1\lib\xschema.jar oracle.forms.util.xmltools.Forms2XML %*
      


      Правда, она тоже использует frmjdapi.jar, но вдруг кто-то захочет взять уже готовое решение.
      • 0
        Я писал, мне было удобно, что это Java.
        Программа вытаскивает из форма весь PL/SQL и сохраняет его в своем репозитории.
        Я так же сохраняю весь PL/SQL хранимый в ДБ(процедуры, пакеты, view...).
        Это позволяет дать общий ответ, где и как используется объект ДБ в коде.
        И если сравнивать, время выполнения, то работа XML несравнимо дольше. это я вижу. Я даже вынужден использовать multi threading и обрабатывать несколько файлов RDF одновременно, а в случае форм, которые я обрабатываю jdapi можно принять 700 форм минут за 40, что приемлимо.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.