Rational Developer for System z

Especificar un constructor diferente para un subproyecto MVS

Este ejemplo muestra cómo sustituir un constructor de subproyecto MVS con un constructor nuevo. El constructor nuevo puede utilizarse para cambiar la forma en que se construye un subproyecto cuando se solicita una acción de construcción.

Escenario de ejemplo

Crear un proyecto z/OS y un subproyecto MVS según las instrucciones de los temas siguientes: Al crear un subproyecto nuevo se crea un archivo XML en el que se mantienen varias características y propiedades del subproyecto. La ilustración siguiente muestra una parte de este archivo XML después de la creación del subproyecto:

Imagen de DefaultBuilderXML

Para sustituir el constructor de subproyectos predeterminado con un constructor diferente (definido por el usuario), pulse con el botón derecho sobre el subproyecto y seleccione la acción Acciones de ejemplo de API > Sustituir constructor predeterminado.

Esta acción hace que se actualice la información del archivo XML. El archivo no se actualizará inmediatamente, pero la información del constructor cambiará la próxima vez que se escriba el archivo. En este punto, el archivo tendrá un aspecto parecido al de la ilustración siguiente:

Imagen de SampleBuilderXML

Si desea restaurar el constructor de subproyecto original (predeterminado), seleccione la acción Acciones de ejemplo de API > Restaurar constructores predeterminados.

Recorrido por el código de ejemplo

Definición de constructor de subproyecto

Los constructores de subproyecto en Rational Developer for System z son parecidos en concepto a un constructor de proyecto incremental en Eclipse base. Proporcionan un medio de construir el contenido de un subproyecto, creando resultados de construcción nuevos y/o actualizados. Por ejemplo, todos los archivos fuente COBOL del subproyecto puede procesarlos un compilador COBOL y los archivos resultantes (objeto, listado, ejecutable, etc.) pueden añadirse al subproyecto.

Para definir un constructor de proyectos personalizado para un subproyecto remoto, debe crear una clase que implemente la interfaz ILogicalSubProjectBuilder. Así pues, la clase SampleBuilder contiene el código siguiente:

public class SampleBuilder implements ILogicalSubProjectBuilder {
   ......
}

La interfaz ILogicalSubProjectBuilder es relativamente simple. En SampleBuilder añada simplemente un campo privado subproject para la instancia de subproyecto. Este ejemplo emite una sentencia println que dice "Sample Builder called for subProject:" e incluye el nombre del subproyecto.

El código fuente completo se puede encontrar en SampleBuilder.java.

Sustituir el constructor de subproyectos predeterminado

El elemento de menú Sustituir constructor predeterminado se implementa mediante la clase AddSubProjectBuilderAction. El método run(IAction) cambia el buildSpec del subproyecto para sustituir el nombre de la clase de constructor predeterminada por el nombre de la clase de constructor de ejemplo SampleBuilder mediante el método getBuildSpec() del subproyecto, buscando constructor antiguo en la lista de IBuildCommand y actualizando el BuildSpec mediante el método setBuildSpec(com.ibm.ftt.projects.core.logical.IBuildCommand newCommands) del subproyecto.
		IBuildCommand[] buildCommands = subProject.getBuildSpec();

		// buscar el constructor RDz "estándar" para subproyectos MVS en los
		// mandatos de constructor existentes y si se encuentra, sustituir por
		// el constructor de ejemplo
		for (int i = 0; i < buildCommands.length; ++i) {
			if (buildCommands[i].getBuilderName().equals(IProjectCoreConstants.ZOS_BUILDER_ID)) {
				// copiar los mandatos que preceden al constructor RDz
				IBuildCommand[] newCommands = new IBuildCommand[buildCommands.length];
				if (i > 0) {
					System.arraycopy(buildCommands, 0, newCommands, 0, i - 1);
				}
				// crear un mandato nuevo para el constructor de ejemplo
				IBuildCommand buildCommand = getSubProject().newCommand();
				buildCommand.setBuilderName("com.ibm.ftt.api.samples.samplebuilder");
				// añadir el mandato nuevo
				newCommands[i] = buildCommand;
				// copiar el resto de los mandatos de construcción
				if (i < buildCommands.length) {
					System.arraycopy(
						buildCommands,
						i + 1,
						newCommands,
						i,
						buildCommands.length - i - 1);
				}
				
				// almacenar el conjunto nuevo de mandatos de construcción
				subProject.setBuildSpec(newCommands);
				
				System.out.println("Sample builder replaces RDz builder");
				break;
			}
		}

El código fuente completo se puede encontrar en AddSubProjectBuilderAction.java.

La acción se aporta mediante mecanismos de aportación de Eclipse estándar.

       <objectContribution
         adaptable=“false”
         objectClass=“com.ibm.ftt.projects.core.logical.ILogicalSubProject”
         id=“com.ibm.ftt.api.samples.addbuilder”>
         <visibility>
            <not>
               <objectState
                     name=“projectBuilder”
                     value=“com.ibm.ftt.api.samples.samplebuilder”>
               </objectState>
            </not>
         </visibility>
         <action
            label=“
            class=“com.ibm.ftt.api.samples.builders.AddSubProjectBuilderAction”
            menubarPath=“com.ibm.ftt.api.samples.PopupMenu/group1”
            id=“com.ibm.ftt.api.samples.addbuilderaction”/>
      </objectContribution>

Restaurar el constructor de subproyectos predeterminado

El elemento de menú Restaurar constructor predeterminado se implementa mediante la clase RemoveSubProjectBuilderAction. El método run(IAction) cambia el buildSpec del subproyecto para sustituir el nombre de la clase de constructor SampleBuilder de ejemplo por el nombre de la clase de constructor predeterminada mediante el método getBuildSpec() del subproyecto, buscando constructor antiguo en la lista de IBuildCommand y actualizando el BuildSpec mediante el método setBuildSpec(com.ibm.ftt.projects.core.logical.IBuildCommand newCommands) del subproyecto.
      
		IBuildCommand[] buildCommands = subProject.getBuildSpec();

		// buscar el constructor de ejemplo en los mandatos de construcción
		// existentes y si se encuentra, sustituir por el constructor RDz
		// "estándar"
		for (int i = 0; i < buildCommands.length; ++i) {
			if (buildCommands[i].getBuilderName().equals("com.ibm.ftt.api.samples.samplebuilder")) {
				// copiar los mandatos que preceden al constructor de ejemplo
				IBuildCommand[] newCommands = new IBuildCommand[buildCommands.length];
				if (i > 0) {
					System.arraycopy(buildCommands, 0, newCommands, 0, i - 1);
				}
				// crear un mandato nuevo para el constructor RDz
				IBuildCommand buildCommand = getSubProject().newCommand();
				buildCommand.setBuilderName(IProjectCoreConstants.ZOS_BUILDER_ID);
				// añadir el mandato nuevo
				newCommands[i] = buildCommand;
				// copiar el resto de los mandatos de construcción
				if (i < buildCommands.length) {
					System.arraycopy(
						buildCommands,
						i + 1,
						newCommands,
						i,
						buildCommands.length - i - 1);
				}
				
				// almacenar el conjunto nuevo de mandatos de construcción
				subProject.setBuildSpec(newCommands);
				
				System.out.println("RDz builder replaces Sample builder");
				break;
			}
		}

El código fuente completo se puede encontrar en RemoveSubProjectBuilderAction.java.

La acción se aporta mediante mecanismos de aportación de Eclipse estándar.

                  <objectContribution
         adaptable=“false”
         objectClass=“com.ibm.ftt.projects.core.logical.ILogicalSubProject”
         id=“com.ibm.ftt.api.samples.removebuilder”>
         <filter
            value=“com.ibm.ftt.api.samples.samplebuilder”
            name=“projectBuilder”/>
         <action
            label=“
            class=“com.ibm.ftt.api.samples.builders.RemoveSubProjectBuilderAction”
            menubarPath=“com.ibm.ftt.api.samples.PopupMenu/group1”
            id=“com.ibm.ftt.api.samples.removebuilderaction”/>
      </objectContribution>

Términos de uso | Comentarios

Este Information Center está basado en tecnología Eclipse. (http://www.eclipse.org)