Oracle UCM — создание пользовательских сервисов

У меня есть требование, когда мне нужно объединить некоторое содержимое (документы) в один документ и отправить его обратно во внешнее приложение ADF, чтобы пользователь мог его загрузить. Я пытаюсь создать настраиваемую службу, которая будет принимать параметры в виде списка массивов - что-то вроде ["Doc, ContentID1, ContentID 2", "Document, ContentID3, ContentID4"], где DOc и Document будут имя объединенных документов и ContentID1, ContentID2 будут содержимым, которое будет объединено и сформирует новый документ «Doc», а ContentID3, ContentID4 будут объединены и сформируют новый документ «Document», и оба эти документа будут отправлены обратно в приложение.

Если я создам пользовательскую службу, где я могу определить, какой тип параметров она будет принимать. Любая помощь/указатели приветствуются. ТИА


person user964819    schedule 11.06.2012    source источник


Ответы (1)


Параметры для сервисов аналогичны стандартным параметрам html GET, т.е. это просто строки (поэтому ответ - нет, вы не можете "определить, какой тип параметров он будет принимать" - они всегда строки) . После вызова службы все параметры доступны в m_binder.

В вашем случае звоните так:

http://<ucm_host>/<ucm_instance>/idcplg?IdcService=MEGE_DOCUMENTS&merge1=docName1,contentId1,contentId2&merge2=docName2,contentId1,contentId2

запустит пользовательский сервис MEGE_DOCUMENTS с двумя параметрами — merge1 и merge2 — в m_binder. Вы можете получить их следующим образом:

String parameter1 = m_binder.getLocal("merge1");
String parameter2 = m_binder.getLocal("merge2");

после этого параметр1 будет иметь значение "docName1,contentId1,contentId2", а параметр2 - "docName2,contentId1,contentId2"


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

Map<String, String> params = new HashMap<String,String>(); 
String prefix = "merge"; 
int index = 1; 
boolean hasMoreParams = true; 

while(hasMoreParams) { 
    String paramName = prefix + index;
    if(m_binder.m_localData.containsKey(paramName)) {
        String paramValue = m_binder.getLocal(paramName); 
        params.put(paramName, paramValue); 
        index++; 
    } else { 
        hasMoreParams = false; 
    } 
}

В случае, если ваша служба будет использоваться другими службами/фильтрами (т.е. вызываться из кода Java только), вы можете поместить любой объект Java (например, HashMap) в локальные данные биндера перед вызовом службы, а затем использовать его:

m_binder.m_localData.put(<Object>, <Object>);

Не путайте m_localData с m_binder.putLocal(). m_localData — это переменная свойства (расширение HashTable). putLocal() — это метод, который имеет только один строковый параметр.

person Mikhail Berastau    schedule 11.06.2012
comment
Спасибо за решение, но я ищу, что для слияния может потребоваться более двух документов, поэтому в конце компонента или в пользовательском коде Java, как я собираюсь получить эти параметры. В этом случае: http://‹ucm_host›/‹ucm_instance›/idcplg?IdcService=MEGE_DOCUMENTS&merge1=docName1,contentId1,contentId2&merge2=docName2,contentId1,contentId2&merge3=doc3,C3,C4&merge4=Dco4,c5,c6 и так далее. как я узнаю, что эта служба имеет более одного параметра? - person user964819; 12.06.2012
comment
Уточните, пожалуйста, как именно будет называться ваша услуга? В случае, если он будет использоваться другими службами/фильтрами (т.е. вызываться из java-кода), вы можете поместить любой java-объект (например, HashMap) в локальные данные связывателя перед вызовом службы, а затем использовать его. В случае, если этот сервис предполагается запускать независимо (например, из браузера/как отдельный сервис) - боюсь, вам придется перебирать параметры. - person Mikhail Berastau; 12.06.2012
comment
Спасибо, Михаил, эта служба будет вызываться из пользовательского кода Java из приложения ADF, поэтому я думаю, что первый подход с размещением объектов Java может сработать для меня. Что сказать? - person user964819; 12.06.2012
comment
Я попытался поместить объект java в локальные данные связующего, но, похоже, он принимает только значение String. Есть ли другой способ добиться этого? - person user964819; 13.06.2012
comment
Просто используйте переменную m_localData связующего (тип которой является расширением HashTable), а не метод putLocal(): m_binder.m_localData.put(‹Object›, ‹Object›); - person Mikhail Berastau; 14.06.2012
comment
Перемещение резюме всех этих комментариев к моему ответу - person Mikhail Berastau; 14.06.2012