Transcodificação entre Formatos de Mensagens
Uma mediação pode converter uma mensagem de um formato para outro, sem alterar o significado semântico da mensagem. Essa operação é chamada de transcodificação da mensagem.
O código a seguir é um manipulador de mediação de exemplo, que transcodifica uma mensagem em um novo formato de mensagem, desde que a mensagem possa ser transcodificada:
private static final String NEW_FORMAT = "JMS:text";
public boolean(MessageContext context) throws MessageContextException
{
try
{
SIMessageContext msgCtx = (SIMessageContext)context;
SIMessage msg = msgCtx.getMessage();
DataGraph newDg = msg.getNewDataGraph(NEW_FORMAT);
msg.setDataGraph(newDg,NEW_FORMAT);
return true;
}
catch(Exception e)
{
// Reroute the original message to the exception destination
MessageContextException mce =
new MessageContextException("Unable to transcode to "+NEW_FORMAT",e);
throw mce;
}
}
A tabela a seguir descreve as mensagens que podem ser transcodificadas e fornece o resultado de cada pareamento de formato. Observe que a abreviação
DG representa "gráfico de dados". Os números entre parênteses na tabela são explicados da seguinte forma:
- (1) Uma mensagem com formato JMS: não pode ter carga útil. Ela não transporta nenhum dado da mensagem, além das propriedades da mensagem. Se uma mediação chamar getDataGraph() em uma mensagem com formato JMS:, o valor null será sempre retornado. Todos os outros formatos de mensagens deve ter uma carga útil da mensagem. Isso significa que uma mensagem com formato JMS: não pode ser transcodificada para outro formato. Se uma mediação precisar mudar uma mensagem com formato JMS: para uma mensagem com qualquer outro formato, essa mediação precisará chamar os métodos SIDataGraphFactory.getInstance().createDataGraph(newFormat) e setDataGraph no objeto SIMessage para alterar o conteúdo da mensagem.
- (2) O valor null será retornado sempre que uma mediação chamar getDataGraph() em uma mensagem com formato JMS:
- (3) Uma mediação pode chamar o método getNewDataGraph() em uma mensagem para retornar um gráfico de dados de cópia com o mesmo formato da mensagem. A cópia pode ser editada, mantendo a mensagem original inalterada. Para SOAP e Beans, é possível alterar o modelo de mensagem, editando a sequência de formatações, para alterar o valor mostrado depois de ":".
Para JMS: | Para JMS:text | Para JMS:bytes | Para JMS:stream | Para JMS:object | Para SOAP: | Para Bean: | |
---|---|---|---|---|---|---|---|
De JMS: | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) | DG=null (1) |
De JMS:text | DG=null (2) | Sim (3) | Sim, os bytes contêm UTF-8 | Sim, se XML do texto for adequado ao esquema correto. | No | Sim, se o conteúdo da mensagem for um SOAP válido. | Sim, se o conteúdo da mensagem for um SOAP válido. |
De JMS:bytes | DG=null (2) | Sim, mas apenas quando os bytes puderem ser corretamente interpretados como uma sequência UTF-8. | Sim (3) | Sim, se XML dos bytes for adequado ao esquema correto. | Sim, considerar bytes como um objeto serializado. | Sim, se o conteúdo da mensagem for um SOAP válido. | Sim, se o conteúdo da mensagem for um SOAP válido. |
De JMS:stream | DG=null (2) | Sim, o texto é uma transcodificação de XML. | Sim, os bytes contém transcodificação de XML. | Sim (3) | Nenhum | No | No |
De JMS:object | DG=null (2) | No | Sim, os bytes podem conter a serialização do objeto. | Nenhum | Sim (3) | Nenhum | Nenhum |
De SOAP: | DG=null (2) | Sim | Sim | No | Nenhum | Sim (3) - se o conteúdo da mensagem for correspondente ao novo WSDL. | Sim |
De Bean: | DG=null (2) | Sim | Sim | No | Nenhum | Sim | Sim (3) - se o conteúdo da mensagem for correspondente ao novo WSDL. |