Construindo a Amostra XMLNSC Namespaces

É 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:

  1. Crie um conjunto de mensagens chamado XMLNSCnamespaceMS. O conjunto de mensagens utiliza o analisador de tempo de execução XMLNSC.
    1. Abra o assistente de Novo Conjunto de Mensagens. Para fazer isso, clique com o botão direito do mouse em qualquer lugar na visualização Desenvolvimento do Broker; em seguida, clique em Novo > Recursos Independentes > Conjunto de Mensagens.
    2. Configure XMLNSCnamespaceMS como o Nome do conjunto de mensagens.
    3. Clique em Concluir.
    4. Assegure que o domínio de mensagem padrão seja configurado para XMLNSC.
    5. Feche o conjunto de mensagens.
  2. Importe arquivos de esquema XML para o conjunto de mensagens XMLNSCnamespaceMS. Os arquivos do Esquema XML contêm definições para a mensagem SaleListMessage que é usada em muitas das amostras do WebSphere Message Broker.
    1. Na visualização Desenvolvimento do Intermediário, expanda o projeto do conjunto de mensagens CHANGENAMESPACEMS.
    2. Selecione os seguintes arquivos:
      • SampleMessage.xsd
      • SampleMessageNamespace1.xsd
      • SampleMessageNamespace2.xsd
    3. Clique com o botão direito do mouse nos arquivos selecionados e clique em Copiar.
    4. Clique com o botão direito do mouse no projeto do conjunto de mensagens XMLNSCnamespaceMS e clique em Colar. Os arquivos do Esquema XML são incluídos no conjunto de mensagens XMLNSCnamespaceMS.
  3. Crie arquivos de definição de mensagem a partir dos arquivos de esquema XML.
    1. Clique com o botão direito do mouse em SampleMessage.xsd no projeto do conjunto de mensagens XMLNSCnamespaceMS e clique em Novo > Arquivo de Definições de Mensagens de > Arquivo de Esquema XML.
    2. Assegure que SampleMessage.xsd seja selecionado no assistente Novo Arquivo de Definições de Mensagens e clique em Avançar.
    3. Clique em Concluir.
    4. Repita estas etapas para criar arquivos de definição de mensagem a partir dos arquivos de Esquema XML restantes: SampleMessageNamespace1.xsd e SampleMessageNamespace2.xsd.
  4. Crie o projeto do Message Broker XMLNSCnamespaceMF.
  5. Crie o fluxo de mensagens ADDNAMESPACEMF. Esse fluxo de mensagens aceita uma mensagem de entrada de um nó MQInput, usando o analisador XMLNSC. A mensagem de entrada, denominada SalesListMessage, utiliza espaços de nomes. O fluxo de mensagens inclui um espaço de nomes na mensagem e envia a mensagem atualizada a partir de um nó MQOutput.
    1. Clique com o botão direito do mouse no projeto do Message Broker XMLNSCnamespaceMF e clique em Novo > Fluxo de Mensagens.
    2. Configure Nome do Fluxo de Mensagens para ADDNAMESPACEMF e clique em Concluir.
    3. Inclua os seguintes nós na tela do fluxo de mensagens:
      • 1 nó MQInput
      • 1 nó Compute
      • 1 nó MQOutput
    4. Conecte o terminal Out do nó MQInput no terminal In do nó Compute.
    5. Conecte o terminal Out do nó Compute no terminal In do nó MQOutput.
    6. Configure as propriedades do nó, conforme mostradas na tabela a seguir.

      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


    7. Clique com o botão direito do mouse no nó Compute e clique em Abrir ESQL.
    8. Inclua o seguinte código ESQL no começo do arquivo ESQL, antes do módulo ADDNAMESPACEMF_Compute. As funções ESQL ChangeNamespaceInOutputRoot e ChangeNamespace são usadas por todos os fluxos de mensagens na amostra.
      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;
      
    9. Codifique o seguinte ESQL para o Módulo Principal:
      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;
      
    10. Salve ADDNAMESPACEMF.esql e ADDNAMESPACEMF.msgflow.
  6. Crie o fluxo de mensagens CHANGENAMESPACEMF. Esse fluxo de mensagens aceita uma mensagem de entrada de um nó MQInput, usando o analisador XMLNSC. A mensagem de entrada, denominada SalesListMessage, utiliza espaços de nomes. O fluxo de mensagens altera o espaço de nomes usado pela mensagem e emite a saída da mensagem atualizada de um nó MQOutput.
    1. Clique com o botão direito do mouse no projeto do Message Broker XMLNSCnamespaceMF e clique em Novo > Fluxo de Mensagens.
    2. Configure Nome do Fluxo de Mensagens para CHANGENAMESPACEMF e clique em Concluir.
    3. Inclua os seguintes nós na tela do fluxo de mensagens:
      • 1 nó MQInput
      • 1 nó Compute
      • 1 nó MQOutput
    4. Conecte o terminal Out do nó MQInput no terminal In do nó Compute.
    5. Conecte o terminal Out do nó Compute no terminal In do nó MQOutput.
    6. Configure as propriedades do nó, conforme mostradas na tabela a seguir.

      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


    7. Clique com o botão direito do mouse no nó Compute e clique em Abrir ESQL.
    8. Substitua o ESQL no módulo CHANGENAMESPACEMF_Compute com o seguinte código:
      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;
      
    9. Salve CHANGENAMESPACEMF.esql e CHANGENAMESPACEMF.msgflow.
  7. Crie o fluxo de mensagens DELETENAMESPACEMF. Esse fluxo de mensagens aceita uma mensagem de entrada de um nó MQInput, usando o analisador XMLNSC. A mensagem de entrada, denominada SalesListMessage, utiliza espaços de nomes. O fluxo de mensagens exclui o espaço de nomes utilizado pela mensagem e envia a mensagem atualizada a partir de um nó MQOutput.
    1. Clique com o botão direito do mouse no projeto do Message Broker XMLNSCnamespaceMF e clique em Novo > Fluxo de Mensagens.
    2. Configure Nome do Fluxo de Mensagens para DELETENAMESPACEMF e clique em Concluir.
    3. Inclua os seguintes nós na tela do fluxo de mensagens:
      • 1 nó MQInput
      • 1 nó Compute
      • 1 nó MQOutput
    4. Conecte o terminal Out do nó MQInput no terminal In do nó Compute.
    5. Conecte o terminal Out do nó Compute no terminal In do nó MQOutput.
    6. Configure as propriedades do nó, conforme mostradas na tabela a seguir.

      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


    7. Clique com o botão direito do mouse no nó Compute e clique em Abrir ESQL.
    8. Inclua o seguinte ESQL entre BEGIN e END para o módulo DELETENAMESPACEMF_Compute para chamar a função ChangeNamespaceInOutputRoot:
      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;
    9. Salve DELETENAMESPACEMF.esql e DELETENAMESPACEMF.msgflow.
  8. Implemente o projeto do Message Broker XMLNSCnamespaceMF em um broker.
    1. Clique com o botão direito do mouse em Archives do Broker e clique em Novo > Archive do Broker de Mensagem.
    2. Selecione o projeto do servidor e configure o Nome do Arquivo para o archive do intermediário como XMLNSCnamespace.bar.
    3. Clique em Concluir.
    4. Inclua o projeto do Message Broker XMLNSCnamespaceMF em XMLNSCnamespace.bar
    5. Salve o arquivo archive do intermediário.
    6. Implemente XMLNSCnamespace.bar em um intermediário.

Voltar para o Início da Amostra