Цель:
При использовании JMS Adapter для получения текстового сообщения в формате XML, для которого XSD не известна, используется опция "Native format translation is not required (Schema is Opaque)". В этом случае входящее сообщение будет содержать элемент типа xsd:base64Binary, содержащий закодированное в base64 полученное сообщение.
Решение:
Т.к. в Oracle SOA Suite 11g отсутствует XSLT или XPATH-функции, позволяющая декодировать base64, поэтому можно использовать активность "Java Embedding" для решения данной задачи.
Итак, в BPEL-процессе есть две переменные:
<!-- входная переменная из JMS Adapter -->
<variable name="encoded_Input" messageType="ns1:Consume_Message_msg"/>
<!-- переменная в которую декодируем base64 -->
<variable name="decoded_Input" type="xsd:string"/>
Добавляем в BPEL-процесс активность "Java Embedding" содержащую следующий код:
try {
oracle.xml.parser.v2.XMLElement input = (oracle.xml.parser.v2.XMLElement) getVariableData("encoded_Input", "opaque");
String input_str = input.getTextContent();
oracle.soa.common.util.Base64Decoder decoder = new oracle.soa.common.util.Base64Decoder();
String decoded = null;
decoded = decoder.decode(input_str);
setVariableData("decoded_Input", decoded);
} catch (Exception e) {
addAuditTrailEntry("EXCEPTION OCCURRED: " + e.toString());
}
Альтернативный вариант - создание собственной XSLT или XPATH-функции для декодирования base64.