Info Window
Медиа объекты в мобильных приложениях JDE
26.10.2017
В статье рассказывается о возможности использования компоненты (feature) по работе с фотографиями как с медиа-объектами JDE в мобильных приложениях Oracle JD Edwards EnterpriseOne, созданных на основе Mobile Application Framework (MAF)

Часто при создании мобильных приложений JDE на основе MAF (далее порсто мобильных приложений) возникает необходимость прикреплять к записям таблиц файлы фотографмй. Можно, конечно, создать самому всю клиентскую часть приложения для работы с сервисом медиа-объектов сервера Application Interface Services (AIS). Однако намного быстрее воспользоваться уже существующей компонентой (MAF Feature) и включить ее в свое приложение. Я веду речь о компоненте, входящей в состав некоторых мобильных приложений Oracle, коих уже существует более 90. Данные приложения доступны в виде архива Mobile Application Archive (MAA) и разрешены к использованию в качестве основы для создания собственных мобильных приложений.

Демо-приложение AddressBook

Для демонстрации технологии подключения внешней компоненты воспользуемся предоставляемым компанией Oracle демонстрационным проектом мобильного приложения по работе с Адресной книгой (приложение P01012). Распакуем архив JDEMobileSampleApplication.zip, содержащийся в пакете JDE_Mobile_Framework_ххх_24_99.par (раздел "Prerequisites"), в отдельную папку:

Содержимое архива мобильного демо-приложения AddressBook
Рис. 1. Содержимое архива мобильного демо-приложения AddressBook.
и откроем в JDeveloper файл проекта AddressBook.jws.

Теперь необходимо внести некторые изменения в настройки приложения, а именно, - указать правильные пути к файлам JDEMobileFramework.jar и Login.jar, а так же заменить файл с текстовыми ресурсами jdemfResourceBundle.xlf (если вы сами создали это демо-приложение, а не скачали его в виде архива, то эти шаги вы уже сделали).

И так, в JDeveloper, в панели Projects нажмите правую кнопку мышки на ApplicationController и выберите Project Properties. В окне Project Properties выберите Libraries and Classpath. В панели Classpath Entries выберите JDEMobileFramework.jar и нажмите кнопку Remove:

Окно Project Properties
Рис. 2. Удаление некорректной ссылки на JDEMobileFramework.jar в окне Project Properties.
В этом же окне нажмите кнопку Add JAR/Directory и найдите у себя на диске файл JDEMobileFramework.jar (он поставляется в пакете JDE_Mobile_Framework_ххх_24_99.par (раздел "Prerequisites")):
Путь к JDEMobileFramework.jar
Рис. 3. Указание ути к JDEMobileFramework.jar в окне Project Properties.
Аналогичным способом укажите правильную сылку на Login.jar. В главном меню Application выберите Application Properties:
Application Properties
Рис. 4. Вызов окна Application Properties.
В окне Application Properties выберите Libraries and Classpath. В панели Classpath Entries выберите Login.jar и нажмите кнопку Remove:
Окно Application Properties
Рис. 5. Удаление некорректной ссылки на Login.jar в окне Application Properties.
В этом же окне нажмите кнопку Add JAR/Directory и найдите у себя на диске файл Login.jar (он поставляется в пакете JDE_Mobile_Framework_ххх_24_99.par (раздел "Prerequisites")):
Путь к Login.jar
Рис. 6. Указание ути к Login.jar в окне Application Properties.

Найдите файл jdemfResourceBundle.xlf (он поставляется в пакете JDE_Mobile_Framework_ххх_24_99.par (раздел "Prerequisites") и находится по адресу \JDE_Mobile_Framework_XXX_24_99.par\JDEMobileFramework_XXX.zip\JDEMobileFramework_XXX\bundle\) и скопируйте его в папку [Папка нашего проекта AddressBook]\ApplicationController\src\com\oracle\e1\jdemf\bundle\ (если ее не существует, создайте еe)

Проверьте работоспособность приложения, установив его на эмулятор, либо на реальное мобильное устройство (Application -> Deploy)

Архив с компонентой

Мы будем использовать версию архива компоненты (Feature ARchive (FAR)) для планшета, находящуюся в файле MediaObjectsTablet.jar. С версией для смартфонов (MediaObjectsPhones.jar) можно поступить аналогично. Для получения нужного нам архива компоненты скачаем архив МАА приложения Manage Equipment Tablet (M13040) c updatecenter.oracle.com, для этого в поле Type выберем EnterpriseOne Mobile Enterprise Applications, а в поле Search for Name введем Manage_Equipment* и скачаем файл Manage_Equipment_Tablet_MAA_XXX:

Получение M13040.maa
Рис. 7. Получение архива приложения Manage Equipment Tablet (M13040).
Далее откроем архив Manage_Equipment_Tablet_MAA_XXX_24_99.par, в нем архив M13040.maa, а в нем в папке ExternalLibs найдем и скопируем на диск файл MediaObjectsTablet.jar:
Нахождение MediaObjectsTablet.jar
Рис. 8. Получение файла MediaObjectsTablet.jar.
Лучше всего скопировать этот файл туда же, где находится файл Login.jar, который мы подключали чуть выше.

Текстовые ресурсы

Скачанный нами архив приложения может пригодиться еше и как источник текстовых ресурсов на любом из 22 поддерживаемых JDE языков. Для этого необходимо требуемый файл ресурсов jdemfResourceBundle_XX.xlf, находящийся в папке архива Manage_Equipment_Tablet_MAA_XXX_24_99.par\M13040.maa\Projects\ApplicationController\src\com\oracle\e1\jdemf\bundle\, скопировать в папку текстовых ресурсов нашего проекта ([Папка нашего проекта AddressBook]\ApplicationController\src\com\oracle\e1\jdemf\bundle\)

Регистрация компоненты

Есть 3 способа подключить архив с компонентой (FAR) к нашему проекту: 1 - как библиотеку, 2 - как проект ViewController и 3 - как внешний JAR. Мы будем работать по 1-му варианту - подключать архив как библиотеку. Прежде всего нам необхоимо зарегистрировать в JDeveloper место хранения архива как IDE Соединение (IDE Connection). Для этого в окне Resources

Открытие окна Resources
Рис. 9. Открытие окна Resources.
создайте новое IDE Соединение с файловой системой:
Окно Create File System Connection
Рис. 10. Окно Create File System Connection.
В поле Directory Path укажите полный путь к папке, где находится файл MediaObjectsTablet.jar.
Откройте вновь созданное соединение, нажмите правой кнопкой мышки на MediaObjectsTablet.jar и выберите Add to Application As -> Application Library:
Добавление FAR как библиотеки
Рис. 11. Добавление архива компонента FAR как библиотеки.
Убедитесь, что в панели Application Resources, в разделе Libraries появился наш архив:
FAR в панели Application Resources
Рис. 12. Архив компоненты FAR в панели Application Resources.
Теперь мы готовы зарегистрировать компоненту в нашем приложении. Для этого в панели Application Resources откройте папку Descriptors, а в ней - папку ADF META-INF. В папке ADF META-INF откройте файл maf-application.xml
В открывшейся панели справа выберите закладку Feature References и в ней нажмите зеленый "плюс", а в открывшемся окне Insert Feature References в поле Feature Id выберите com.oracle.e1.jdemf.MediaObjectsTablet.MediaObjectTablet:
Регистрация компоненты
Рис. 13. Регистрация компненты в приложении.
Иногда JDeveloper "глючит" (наверное, в этом месте программист из Индии отвлекся на проходившую мимо священную корову) и выдает ошибку:
Ошибка регистрации компоненты
Рис. 14. Ошибка регистрации компненты в приложении.
В этом случае зайдите на вкладку Source файла maf-application.xml и вручную впишите все необходимое для регистрации компоненты:
Ручная правка файла maf-application.xml
Рис. 15. Ручная правка файла maf-application.xml.
Перейдите на вкладку Overview и убедитесь, что компонента зарегистрирована:
Компонента com.oracle.e1.jdemf.MediaObjectsTablet.MediaObjectTablet зарегистрирована
Рис. 16. Компонента com.oracle.e1.jdemf.MediaObjectsTablet.MediaObjectTablet зарегистрирована.

Работа с компонентой

Мы готовы к использованию новой компоненты.
Для передачи параметров из нашего приложения в компонент используются переменные области видимости "Приложение" (applicationScope):

Имя переменной Значение
mediaObjectFormName Имя формы приложения JDE в формате APPL_VERSION, в котором реализована работа с медиа-объектами (например, "P01012_W01012A")
mediaObjectStructure Имя медиа-структуры JDE, с которой будет проходить работа (например, "ABGT")
mediaObjectKeyValue Значение ключа, однозначно отпределяющее запись, к которой относятся медиа-объекты. Ключ формируется в формате АА|BB|CC - значения полей структуры mediaObjectStructure, разделенных вертикальными чертами (например, "123|AB|00001")
booleanMediaObjectReadOnly Определяет будут ли доступны операции добавления и удаения медиа-объектов (например, "true")
mediaObjectReturnFeature Идентификатор компоненты в нашем приложении, в окно которой необходимо вернуться при нажатии кнопки Назад в верхнем левом углу окна компоненты работы с медиа-объектами (например, "ABList")
mediaObjectTitle Заголовок окна компоненты (например, "Фотографии")

Создайте метод launchPhotoDlg() в классе AddressBookDC, содержащимся в файле ApplicationController\Application Sources\application\AddressBookDC.java:

public void launchPhotoDlg() {
    ResourceBundle bundle = BundleFactory.getBundle("com.oracle.e1.jdemf.bundle.jdemfResourceBundle", Locale.getDefault(), AddressBookDC.class.getClassLoader());

    AdfmfJavaUtilities.setELValue("#{applicationScope.mediaObjectFormName}", "P01012_W01012A");
    AdfmfJavaUtilities.setELValue("#{applicationScope.mediaObjectStructure}", "ABGT");

    P01012_W01012B_GridData gd = p01012_W01012B_FormParent.getFs_P01012_W01012B().getData().getGridData();

    AdfmfJavaUtilities.setELValue("#{applicationScope.mediaObjectKeyValue}", gd.getRowset()[gd.getRowIndex()].getMnAddressNumber_19().getValue());
    AdfmfJavaUtilities.setELValue("#{applicationScope.booleanMediaObjectReadOnly}", "false");
    AdfmfJavaUtilities.setELValue("#{applicationScope.mediaObjectReturnFeature}", "ABList");
    AdfmfJavaUtilities.setELValue("#{applicationScope.mediaObjectTitle}", bundle.getString("PHOTOS_1"));
    ApplicationGlobals.getInstance().setReturnFeature("ABList");

    try {
        AdfmfContainerUtilities.resetFeature("com.oracle.e1.jdemf.MediaObjectsTablet.MediaObjectTablet");
    } catch (AdfException e) {
        throw new AdfException(e.getMessage(), "ERROR");
    }
}

Выберите место для кнопки, по нажатию которой будет октрываться экран по работе с медиа-объектами. Мы выбрали место рядом с кнопкой Create Device Contact на экране Detail нашего приложения.

Экран Detail демо-приложения AddressBook
Рис. 17. Экран Detail демо-приложения AddressBook.

Откройте файл abdetail.amx (ViewController\Web Content\abdetail.amx) и "протяните" мышкой метод launchPhotoDlg(), созданный нами чуть выше, из панели Data Controls в выбранное место файла abdetail.amx, создав тем самым кнопку, вызывающую данный метод:

Создание кнопки для вызова launchPhotoDlg()
Рис. 18. Создание кнопки для вызова launchPhotoDlg().
Измените значения атрибута text тэга amx:commandButton и добавьте разделитель amx:spacer. В результате получится блок кода (окружен метками "Sample code by JDE IDea"):

    <amx:facet name="footer">
        <amx:panelGroupLayout id="pgl6" layout="horizontal" halign="end">
            <!-- Sample code by JDE IDea-->
            <amx:commandButton actionListener="#{bindings.launchPhotoDlg.execute}"
                text="#{viewcontrollerBundle.PHOTOS_2}"
                disabled="#{!bindings.launchPhotoDlg.enabled}" id="cb2"/>
            <amx:spacer id="s1" width="8"/>
            <!-- End of sample code by JDE IDea-->
            <!-- Add Contact To Device-->
            <amx:commandButton actionListener="#{bindings.createDeviceContact.execute}" text="Create Device Contact"
                disabled="#{!bindings.createDeviceContact.enabled}" id="cb4">
                <amx:showPopupBehavior id="spb1" popupId="p1" align="overlapTopCenter" alignId="it2"/>
            </amx:commandButton>
        </amx:panelGroupLayout>
    </amx:facet>

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

Создайте файл JavaScript. Для этого в панели Projects нажмите правую кнопку мышки на папке ViewController\Web Content\js\ и выберите New -> JavaScript File:

Создание файла JavaScript
Рис. 19. Создание файла JavaScript.
В окне Create JavaScript File в поле File Name введите имя (например, "ABList.js"), значение в поле Directory оставьте без изменения:
Название файла JavaScript
Рис. 20. Название файла JavaScript.
Создайте функцию originalFeatureLaunchFromMediaObjects в файле ABList.js следующего содержания:

    originalFeatureLaunchFromMediaObjects = function(featureId){
        adf.mf.api.gotoFeature(featureId,
        function(req, res) {
            //здесь можно вызвать какой-нибудь метод AddressBookDC, используя метод adf.mf.api.invokeMethod
        },
        function(req, res) {});
    };

Теперь необходимо включить созданный файл JavaScript в наше приложение. Для этого в панели Projects откройте файл ViewController\Application Sources\META-INF\maf-feature.xml. В панели Features выберите основной компонент ABList. Ниже откройте закладку Content, в которой выберите Task Flow ABList.1. Ниже в панели Includes нажмите на зеленый "плюс":

Включение файла JavaScript в Task Flow ABList.1
Рис. 21. Включение файла JavaScript в Task Flow ABList.1.
В поле File укажите относительный путь к созданному файлу JavaScript:
Задание пути к файлу JavaScript
Рис. 22. Задание пути к файлу JavaScript.

Сохраните проект и установите приложение на эмулятор, или на реальное мобильное устройство (Application -> Deploy)

Наслаждайтесь

Фото в мобильном приложении
Рис. 23. Создание фото в мобильном приложении.

Фото в JDE
Рис. 24. просмотр фото в приложении P01012 JDE.