EMML , или Enterprise Mashup Markup Language , — это язык разметки XML для создания корпоративных mashup-приложений , представляющих собой программные приложения, которые потребляют и смешивают данные из различных источников. Эти приложения часто выполняют логические или математические операции, а также представляют данные.
Смешанные данные, созданные корпоративными mashup-приложениями, представлены в графических пользовательских интерфейсах в виде mashlets, виджетов или гаджетов. EMML также можно [1] считать декларативным языком mashup-приложений (DSL). DSL mashup-приложений устраняет необходимость в сложной, трудоемкой и повторяемой процедурной логике программирования для создания корпоративных mashup-приложений. EMML также предоставляет декларативный язык для создания визуальных инструментов для корпоративных mashup-приложений.
Основными преимуществами EMML являются переносимость дизайна mashup и совместимость решений mashup. Ожидается, что эти преимущества ускорят принятие корпоративных mashup-приложений за счет создания переносимых навыков для разработчиков программного обеспечения и снижения привязки к поставщику .
Ожидается, что внедрение EMML поможет ускорить тенденцию к интеграции веб-приложений и технологий сервисно-ориентированной архитектуры (SOA). [2] Bank of America был одним из первых заметных сторонников EMML. [3] Другими известными ранними сторонниками были Hewlett-Packard , Capgemini , Adobe Systems и Intel . [4]
Радж Кришнамурти (главный архитектор в JackBe Corporation) и Дипак Алур (вице-президент по инжинирингу в JackBe Corporation) начали работать над EMML в 2006 году. Их целью было обеспечить ориентированные на пользователя и поддерживаемые пользователем mashup-приложения путем создания нового типа промежуточного программного обеспечения, называемого Enterprise Mashup Platform. Радж Кришнамурти стал главным разработчиком языка и реализатором EMML, а также возглавил команду по созданию EMML IDE на базе Eclipse под названием Mashup Studio. [5] Эта работа переросла в эталонную реализацию EMML, которая была передана в дар Open Mashup Alliance. Радж Кришнамурти продолжает оставаться одним из ключевых участников EMML через Open Mashup Alliance.
Язык EMML предоставляет богатый набор высокоуровневого словаря mashup-domain для гибкого использования и смешивания различных веб-источников данных. EMML предоставляет единый синтаксис для вызова гетерогенных стилей обслуживания: REST , WSDL , RSS / ATOM , RDBMS и POJO . Язык EMML также предоставляет возможность смешивать различные форматы данных: XML , JSON , JDBC , JavaObjects и примитивные типы.
К высокоуровневым возможностям языка EMML относятся:
If
/ Then
/ Else
, While
,ForEach
EMML — это в первую очередь декларативный язык на основе XML, но он также обеспечивает возможность кодирования сложной логики с использованием встроенных скриптовых движков. XPath — это язык выражений, используемый в EMML.
directinvoke
[6] обеспечивает возможность вызова и потребления различных служб данных. Эти службы данных могут быть службами REST , RSS / ATOM или SOAP . directinvoke
также поддерживает веб-вырезку, позволяя указывать HTML-HTTP GET
страницы в качестве конечных точек службы. Протоколы , POST
, PUT
, и DELETE
поддерживаются в directinvoke
. Также доступна поддержка заголовков HTTP и файлов cookie, что обеспечивает возможность потребления широкого спектра веб-служб REST / SOAP . Возможно использование с прокси-сервером.directinvoke
Пример кода передачи атрибутов в качестве параметров службе:
<directinvoke endpoint= "http://www.myCompany.com/rest-services/getItems" method= "GET" outputvariable= "$result" query= "items=all" appID= "67GYH30N25" /> <directinvoke endpoint= "http://www.svcsltd.com/getReservation" method= "GET" outputvariable= "$news" xmlns:sc= "http://www.svcltd.com/" sc:date= "20070515" sc:nights= "3" />
Оператор filter
[7] фильтрует содержимое переменной с помощью выражения XPath и помещает результат в новую переменную.
Пример кода для фильтрации клиентов западного побережья с использованием элемента данных региона:
<filter inputvariable= "$queryResult" filterexpr= "/customers[region='West']" outputvariable= "$westCoastOnly" />
Оператор sort
[8] сортирует содержимое переменной типа документа или фрагмента переменной на основе ключевых выражений и помещает результат в другую переменную.
Пример кода, сортирующего тикеты по дате создания и клиенту:
<sort inputvariable= "$troubleTickets" sortexpr= "ticket" sortkeys= "xs:date(created) по убыванию, клиент по возрастанию" outputvariable= "$troubleTickets" />
groupby
[9] обеспечивает возможность группировать и агрегировать наборы данных. Можно использовать стандартные операции агрегации XPath , а также есть механизм расширения для добавления пользовательских функций. Также поддерживаются вложенные группировки иерархических наборов данных. Есть Having
предложение для фильтрации атрибутов Group.
Пример кода, который группирует книги по жанрам и вычисляет общее количество экземпляров для каждого жанра:
<group by= "$catalog//book/genre" outputvariable= "$groupResult" > <res:genre name= "{$group_key}" copysold= "{sum(copiessold)}" /> </group>
merge
[10] обеспечивает возможность объединения различных источников данных, включая каналы RSS / ATOM , XML , форматы полезной нагрузки JSON . Функция объединения похожа на SQL UNION
функциональность, но объединяет иерархические структуры документов.
Пример кода, объединяющий каналы Yahoo! News , Financial News и Reuters :
<merge inputvariables= "$YahooRSS, $FinancialNewsRss, $ReutersRSS" outputvariable= "$NewsAggregate" />
annotate
[11] обеспечивает возможность обогащения семантического значения исходных данных сервиса с помощью элементов/атрибутов, подобных микроформатам. Эти аннотации данных могут использоваться машлетами или гаджетами для предоставления более богатых визуальных пользовательских интерфейсов.
Пример кода для аннотирования полезной нагрузки поставщика с помощью географических координат:
<annotate variable= "$vendors" expr= "/vendor/site" >
элемент geo:lat { $georesult//y:Широта/строка() },
элемент geo:long { $georesult//y:Долгота/строка() } </annotate>
Оператор join
[12] определяет, как объединяются разрозненные иерархические форматы данных, и сопоставим с внутренними объединениями для реляционных баз данных.
Пример кода, где выходная переменная содержит <res:recommendations>
элемент с повторяющимся набором <res:movie>
потомков, которые являются повторяющимися элементами. Каждый <res:movie>
содержит <res:movietitle>
потомка с данными из переменной с именем movies и <res:rating>
потомков <res:comment>
с данными из переменной с именем reviews:
<join outputvariable= "$joinResult" joincondition= "$movies/movie/@id = $reviews/review/movie/title" > <select name= "res:recommendations" > <res:movie> <res:movietitle> {$movies/title} </res:movietitle> <res:rating> {$reviews/rating} </res:rating> <res:comment> {$reviews/comment} </res:comment> </res:movie> </select> </join>
EMML — декларативный язык, но предоставляет программные расширения сценариев [13] для выполнения сложной логики mashup. Поддерживаются среды сценариев JavaScript , JRuby , Groovy , POJO , XQuery . Данные легко передаются между EMML и средами сценариев.
Пример кода, в котором фрагмент JavaScript используется для извлечения токена аутентификации, необходимого для последующих вызовов переменной «result», которая распространяется в среду JavaScript :
< script type = "text/javascript" > <! [ CDATA [ var r = new String ( result ) var ar = r . split ( "=" ); auth = ar [ ar . length - 1 ]; auth = auth . slice ( 0 , - 1 ) ]] > </ script >
{{cite web}}
: Отсутствует или пусто |url=
( помощь )