É possível usar as instruções deste tópico para construir a amostra XMLNSC Namespaces. Como alternativa, é possível importar o conjunto de mensagens concluído e o projeto do Message Broker para a amostra. Deve-se importar os arquivos da amostra XMLNSC Namespaces para sua área de trabalho antes de usar as instruções para construir a amostra.
Para construir a amostra XMLNSC Namespaces:
Nó | Página | Propriedade | Valor |
---|---|---|---|
MQInput | Básico | Nome da fila | ADDNAMESPACEMF.IN |
Análise de Mensagem de Entrada | Domínio de mensagem | XMLNSC | |
Validação | Validar | Herdar | |
Compute | Validação | Validar | Herdar |
MQOutput | Básico | Nome da fila |
ADDNAMESPACEMF.OUT |
CREATE FUNCTION ChangeNamespaceInOutputRoot(In rootNode REFERENCE, In oldNamespace CHARACTER, In newNamespace CHARACTER) BEGIN -- -- É necessário remover as declarações schemalocation e namespace -- IF newNamespace = '' THEN SET rootNode.(XMLNSC.Element)*[1].*:schemaLocation = NULL; DECLARE I1 INTEGER CARDINALITY(rootNode.(XMLNSC.Element)*[1].(XMLNSC.NamespaceDecl)*[]); DECLARE I2 INTEGER 1; WHILE I2 <= I1 DO SET rootNode.(XMLNSC.Element)*[1].(XMLNSC.NamespaceDecl)*[1] = NULL; SET I2 = I2 + 1; END WHILE; ELSE -- -- É necessário modificar as declarações de schema locations e namespace -- -- O schemalocations de destino pode ser identificado na mensagem de origem -- MQRFH2 header, <usr> folder, tag <TargetSchemaLocation> -- IF rootNode.(XMLNSC.Element)*[1].*:schemaLocation IS NOT NULL THEN SET rootNode.(XMLNSC.Element)*[1].*:schemaLocation = newNamespace; END IF; END IF; -- -- CHECKSIBLING é um sinalizador que, quando configurado para TRUE, garante que o loop WHILE faça um -- MOVE incondicional... NEXTSIBLING (ao invés de MOVE ... FIRSTCHILD) -- Isto é necessário ao subir um nível na árvore... caso contrário retorna-se para o local de -- onde veio -- DECLARE CHECKSIBLING BOOLEAN FALSE; -- -- DEPTH determina quando concluir. -- Cada vez que MOVE FIRSTCHILD inclui 1 para DEPTH -- Cada vez que MOVE PARENT diminui 1 de DEPTH -- MOVE NEXTSIBLING não altera DEPTH -- O valor inicial é 1, então está concluído quando DEPTH = 0 -- DECLARE DEPTH INTEGER 1; -- -- Caminhe da parte superior para a parte inferior da árvore, esquerda para direita -- WHILE DEPTH <> 0 DO IF CHECKSIBLING = FALSE THEN MOVE rootNode FirstChild; IF LASTMOVE(rootNode) = TRUE THEN SET DEPTH = DEPTH + 1; CALL ChangeNamespace(rootNode, oldNamespace, newNamespace); ELSE MOVE rootNode NEXTSIBLING; IF LASTMOVE(rootNode) = TRUE THEN CALL ChangeNamespace(rootNode, oldNamespace, newNamespace); SET CHECKSIBLING = FALSE; ELSE SET DEPTH = DEPTH - 1; Move rootNode PARENT; SET CHECKSIBLING = TRUE; END IF; END IF; ELSE MOVE rootNode NEXTSIBLING; IF LASTMOVE(rootNode) = TRUE THEN CALL ChangeNamespace(rootNode, oldNamespace, newNamespace); SET CHECKSIBLING = FALSE; ELSE SET DEPTH = DEPTH - 1; Move rootNode PARENT; SET CHECKSIBLING = TRUE; END IF; END IF; END WHILE; END; CREATE FUNCTION ChangeNamespace(IN rootNode REFERENCE, In oldNamespace CHARACTER, In newNamespace CHARACTER) BEGIN -- -- Verifique por elementos/atributos com o namespace de origem -- IF (FIELDTYPE(rootNode) = Name) OR (FIELDTYPE(rootNode) = NameValue) THEN IF FIELDNAMESPACE(rootNode) IN (oldNamespace) THEN -- -- Configure o novo namespace de destino -- SET rootNode NAMESPACE = newNamespace; -- -- Exclua quaisquer definições de namespace sequencial -- SET rootNode.(XMLNSC.NamespaceDecl)* = NULL; END IF; END IF; END;
CREATE COMPUTE MODULE ADDNAMESPACEMF_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN DECLARE SourceNamespace NAMESPACE ''; DECLARE TargetNamespace NAMESPACE 'http://www.samplemessage.brokertest.hursley.ibm.com'; CALL CopyMessageHeaders(); DECLARE oldNamespace CHARACTER ''; DECLARE newNamespace CHARACTER ''; SET oldNamespace = SourceNamespace; SET newNamespace = TargetNamespace; IF InputRoot.MQRFH2.usr.SourceNamespace IS NOT NULL THEN SET oldNamespace = InputRoot.MQRFH2.usr.SourceNamespace; END IF; -- The target namespace can be specified dynamically in the MQRFH2 header. -- The following logic checks whether the MQRFH2 contains this info; if it does not, -- defaults are supplied in the message flow. IF InputRoot.MQRFH2.usr.TargetNamespace IS NOT NULL THEN SET newNamespace = InputRoot.MQRFH2.usr.TargetNamespace; ELSE SET newNamespace = TargetNamespace; END IF; -- Torne a árvore de saída a mesma que a árvore de entrada. SET OutputRoot.XMLNSC = InputBody; -- Altere o namespace do elemento-raiz. DECLARE rootNode REFERENCE TO OutputRoot.XMLNSC.*[<]; CALL ChangeNamespace (rootNode, oldNamespace, newNamespace); -- Alternativamente, aplique namespaces para os elementos locais (aninhados) também. -- DECLARE rootNode REFERENCE TO OutputRoot.XMLNSC; -- CALL ChangeNamespace (rootNode, oldNamespace, newNamespace); RETURN TRUE; END; CREATE PROCEDURE CopyMessageHeaders() BEGIN DECLARE I INTEGER 1; DECLARE J INTEGER; SET J = CARDINALITY(InputRoot.*[]); WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; END; CREATE PROCEDURE CopyEntireMessage() BEGIN SET OutputRoot = InputRoot; END; END MODULE;
Nó | Ativo | Propriedade | Valor |
---|---|---|---|
MQInput | Básico | Nome da fila | CHANGENAMESPACEMF.IN |
Análise de Mensagem de Entrada | Domínio de mensagem | XMLNSC | |
Validação | Validar | Conteúdo e Valor | |
Compute | Validação | Validar | Herdar |
MQOutput | Básico | Nome da fila |
CHANGENAMESPACEMF.OUT |
CREATE COMPUTE MODULE CHANGENAMESPACEMF_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN DECLARE SourceNamespace NAMESPACE 'http://www.samplemessage.broker.hursley.ibm.com'; DECLARE TargetNamespace NAMESPACE 'http://www.samplemessage.brokertest.hursley.ibm.com'; CALL CopyMessageHeaders(); DECLARE oldNamespace CHARACTER ''; DECLARE newNamespace CHARACTER ''; SET oldNamespace = SourceNamespace; SET newNamespace = TargetNamespace; IF InputRoot.MQRFH2.usr.SourceNamespace IS NOT NULL THEN IF InputRoot.MQRFH2.usr.SourceNamespace = 'NONAMESPACE' THEN SET oldNamespace = ''; ELSE SET oldNamespace = InputRoot.MQRFH2.usr.SourceNamespace; END IF; ELSE SET oldNamespace = SourceNamespace; END IF; -- O namespace de destino pode ser especificado dinamicamente no cabeçalho MQRFH2. -- The following logic checks whether the MQRFH2 contains this info; if it does not, -- defaults are supplied in the message flow. IF InputRoot.MQRFH2.usr.TargetNamespace IS NOT NULL THEN IF InputRoot.MQRFH2.usr.TargetNamespace = 'NONAMESPACE' THEN SET newNamespace = ''; ELSE SET newNamespace = InputRoot.MQRFH2.usr.TargetNamespace; END IF; ELSE SET newNamespace = TargetNamespace; END IF; -- Torne a árvore de saída a mesma que a árvore de entrada. -- Caminhe então, na árvore alterando as coisas conforme vai SET OutputRoot.XMLNSC = InputBody; DECLARE rootNode REFERENCE TO OutputRoot.XMLNSC; CALL ChangeNamespaceInOutputRoot (rootNode, oldNamespace, newNamespace); RETURN TRUE; END; CREATE PROCEDURE CopyMessageHeaders() BEGIN DECLARE I INTEGER 1; DECLARE J INTEGER; SET J = CARDINALITY(InputRoot.*[]); WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; END; CREATE PROCEDURE CopyEntireMessage() BEGIN SET OutputRoot = InputRoot; END; END MODULE;
Nó | Ativo | Propriedade | Valor |
---|---|---|---|
MQInput | Básico | Nome da fila | DELETENAMESPACEMF.IN |
Análise de Mensagem de Entrada | Domínio de mensagem | XMLNSC | |
Validação | Validar | Conteúdo e Valor | |
Compute | Validação | Validar | Herdar |
MQOutput | Básico | Nome da fila |
DELETENAMESPACEMF.OUT |
CREATE COMPUTE MODULE DELETENAMESPACEMF_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN DECLARE SourceNamespace NAMESPACE 'http://www.samplemessage.broker.hursley.ibm.com'; DECLARE TargetNamespace NAMESPACE ''; CALL CopyMessageHeaders(); DECLARE oldNamespace CHARACTER ''; DECLARE newNamespace CHARACTER ''; SET oldNamespace = SourceNamespace; SET newNamespace = TargetNamespace; -- O namespace de destino pode ser especificado dinamicamente no cabeçalho MQRFH2. -- The following logic checks whether the MQRFH2 contains this info; if it does not, -- defaults are supplied in the message flow. IF InputRoot.MQRFH2.usr.SourceNamespace IS NOT NULL THEN IF InputRoot.MQRFH2.usr.SourceNamespace = 'NONAMESPACE' THEN SET oldNamespace = ''; ELSE SET oldNamespace = InputRoot.MQRFH2.usr.SourceNamespace; END IF; ELSE SET oldNamespace = SourceNamespace; END IF; -- Torne a árvore de saída a mesma que a árvore de entrada. -- Caminhe então, na árvore alterando as coisas conforme vai SET OutputRoot.XMLNSC = InputBody; DECLARE rootNode REFERENCE TO OutputRoot.XMLNSC; CALL ChangeNamespaceInOutputRoot (rootNode, oldNamespace, newNamespace); RETURN TRUE; END; CREATE PROCEDURE CopyMessageHeaders() BEGIN DECLARE I INTEGER 1; DECLARE J INTEGER; SET J = CARDINALITY(InputRoot.*[]); WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; END; CREATE PROCEDURE CopyEntireMessage() BEGIN SET OutputRoot = InputRoot; END; END MODULE;