Customizando Barras de Progresso para Transformações

É possível customizar uma transformação para atualizar a barra de progresso em uma janela de progresso conforme a transformação conclui suas tarefas. Esse recurso fornece aos usuários de transformação informações mais precisas sobre quanto trabalho a transformação concluiu.
Antes de Iniciar

Um autor de transformação deve registrar a transformação no serviço de transformação.

Para obter mais informações sobre as propriedades que esse tópico descreve, consulte o link para o tópico de referência relacionado no final deste tópico.

Por Que e Quando Desempenhar Esta Tarefa
Conceitualmente, a barra de progresso é dividida em partes iguais, e que cada parte corresponde a uma unidade de trabalho. Por padrão, o núcleo da transformação define x+1 unidades de trabalho para a barra de progresso, em que x representa o número de utilitários que uma transformação invoca, mais uma unidade de trabalho para a própria transformação. Considere os seguintes exemplos:
  • Se uma transformação não invocar nenhum utilitário, o núcleo da transformação define uma unidade de trabalho para a barra de progresso. A barra de progresso mostra quanto trabalho a transformação concluiu.
  • Se uma transformação invocar dois utilitários, o núcleo da transformação define três unidades de trabalho para a barra de progresso. Quando um utilitário é concluído, o núcleo da transformação atualiza uma parte da barra de progresso. Quando a transformação conclui suas tarefas, ela atualiza a barra de progresso pelo número de unidades de trabalho que o autor da transformação alocou para cada tarefa.

Para a unidade de trabalho da barra de progresso que é alocada para a transformação, é possível controlar as atualizações para a barra de progresso dividindo a unidade de trabalho em várias unidades de trabalho menores. Cada unidade de trabalho menor representa uma tarefa que a transformação conclui.

Normalmente uma transformação conclui várias tarefas, em que cada tarefa é concluída por um elemento de transformação como uma regra, um extrator ou transformação. Como um autor da transformação, é possível identificar os pontos nos quais a transformação conclui tarefas. Nesses pontos, é possível incluir código que atualiza a barra de progresso à medida em que a transformação conclui suas tarefas.

Após entender os detalhes da implementação da transformação, é possível incluir código que atualiza a barra de progresso de uma das seguintes maneiras:
  • Invoque os métodos da interface IProgressMonitor. Você pode invocar esses métodos nos seguintes locais:
    • Em uma regra, transformação ou extrator
    • No corpo de um loop

      Por exemplo, se cada iteração do loop gerar um artefato de destino ou processar um elemento em um modelo de origem, o corpo de um loop pode ser um local adequado para atualizar a barra de progresso.

    Considere uma transformação básica que conclui duas tarefas: análise da origem da transformação e geração da saída, que pode ser estimada em 100 arquivos. Para esse exemplo, suponha que você defina a propriedadePROGRESS_MONITOR_WORK_UNITS para 200. Você pode alocar as unidades de trabalho da barra de progresso da seguinte maneira:
    • Após a transformação analisar a origem, incremente a barra de progresso na metade das unidades especificadas na propriedadePROGRESS_MONITOR_WORK_UNITS.
    • Quando a transformação gerar saída, para cada artefato que ela gerar, incremente a barra de progresso em uma unidade.
  • Execute uma instância da regracom.ibm.xtools.transform.core.UpdateProgressMonitorRule.

    Considere uma transformação que contém uma transformação que processa classes em um modelo de origem, talvez invocando um extrator Class. Dependendo do modelo de origem, essa transformação pode processar classes UML ou classes de código. Para cada classe no modelo de origem, a transformação Class executa. Após a transformação processar uma classe, a transformação executa uma instância da regra com.ibm.xtools.transform.core.UpdateProgressMonitorRule para atualizar a barra de progresso pelo número de unidades que a propriedadePROGRESS_MONITOR_INCREMENT especifica.

    O fragmento de código da tabela na etapa 3 mostra o modelo de uma transformação que processa classes e executa uma instância da regracom.ibm.xtools.transform.core.UpdateProgressMonitorRule. Os comentários no fragmento de código descrevem as tarefas que a transformação conclui, e a ordem na qual ela as conclui.

Para refinar a exatidão da barra de progresso quando uma transformação executa, conclua as seguintes etapas:

  1. No arquivo plugin.xml do projeto que contém uma transformação, no elemento <Transformation>, crie um elemento <Property>, para a propriedade PROGRESS_MONITOR_WORK_UNITS, com no exemplo a seguir:
    <Transformation
    	groupPath="myExampleTransformation"
    	id="myExampleTransformation.transformation"
    	name="Transformation"
    	sourceModelType="UML2"
    	targetModelType="resource"
    	version="1.0.0"/>
    	<Property
    		id="PROGRESS_MONITOR_WORK_UNITS"
    		metatype="integer"
    		name="PROGRESS_MONITOR_WORK_UNITS"
    		readonly="true"
    		value="200"
    
    	/>
    </Transformation>
  2. No código de origem para a transformação, determine quais elementos da transformação, transformação ou métodos representam a conclusão de tarefas específicas na transformação ou transformação dentro de uma transformação.
  3. Para cada local no código que você identificou na etapa 2, insira o código para atualizar a barra de progresso. Em cada local, uma instância da variável de contexto da transformação deve estar disponível para que as propriedades que estão relacionadas à barra de progresso possam ser atualizadas. A tabela a seguir mostra exemplos de como invocar os métodos que atualizam a barra de progresso:
    Método de atualização da barra de progresso Local para incluir o código Exemplo de código a incluir
    Invocando métodos da interface IProgressMonitor Em uma classe de elemento de transformação como um extrator, regra ou transformação Esse exemplo supõe que a transformação atualiza a barra de progresso em 10 unidades de trabalho:
    IProgressMonitor progressMonitor =
    getProgressMonitor(context);
    progressMonitor.worked(10);
    Em outro tipo de classe na transformação Esse exemplo supõe que a transformação atualiza a barra de progresso em 10 unidades de trabalho:
    IProgressMonitor
    progressMonitor =
    	(IProgressMonitor) context.getPropertyValue(ITransformContext.PROGRESS_MONITOR);
    progressMonitor.worked(10);
    Executando uma instância da regracom.ibm.xtools.transform.core.UpdateProgressMonitorRule Normalmente no final da transformação O fragmento de código a seguir mostra um exemplo de uma transformação que executa uma instância da regra UpdateProgressMonitor no final da transformação. Os comentários do código são sinalizadores de substituição para outras tarefas que a transformação conclui:
    private AbstractTransform createClassTransform(ITransformationDescriptor desc) {
    	Transform classTransform = new Transform(desc);
    	// Incluir os elementos da transformação que lêem as classes de origem.
    	// Um desses elementos deve definir a seguinte conversão
    	// variáveis de contexto por meio da invocação do método setPropertyValue na interface
    com.ibm.xtools.transform.core.ITransformContext:
    	// -PROGRESS_MONITOR_INCREMENT 
    	// -PROGRESS_MONITOR_TASK_NAME
    	
    	// Incluir a regra para atualizar o monitor de progresso.
    	classTransform.add(new UpdateProgressMonitorRule("myRuleId", "myRuleName"));
    	return classTransform;
    } 
Resultados
Para testar as atualizações para a barra de progresso, conclua as seguintes etapas:
  1. Inicie a ambiente de trabalho de tempo de execução.
  2. No ambiente de trabalho de tempo de execução, crie uma configuração de transformação para a transformação executar.
  3. Execute a transformação.
Quando a transformação executar, a barra de progresso na janela de progresso atualiza com mais exatidão se o código da transformação não atualizou a barra de progresso.

Feedback