Rational Developer for System z, Versión 7.6.1

Trabajar con REFER en estructuras PL/I generadas

Este tema describe cómo se utiliza la opción REFER para generar una estructura Enterprise PL/I compatible para una matriz XML de longitud variable en el escenario WSDL2PLI.

La información de este tema se aplica a:

Ejemplo de REFER

Una matriz de esquema XSD de longitud variable es aquella en la que maxOccurs="unbounded" o en la que el valor de maxOccurs sobrepasa el límite establecido en la propiedad inlineMaxOccursLimit del procesador por lotes (consulte la sección WSDL2ELSSpec). En la Figura 1 se muestra un ejemplo de una matriz de este tipo:

Figura 1. Declaración XSD de una matriz de longitud variable:
<!-- Declaración XSD: -->
<element name="planets" type="tns:PlanetsType"/>
<complexType name="PlanetsType">
   <sequence>
      <element name="planet_name" type="string" minOccurs="0" maxOccurs="unbounded"/>
   </sequence>
</complexType>

Para implementar la matriz equivalente en PL/I, el proceso de generación de código de WSDL2PLI crea dos estructuras principales PL/I, una para declaraciones de objeto REFER y otra para declaraciones de asunto REFER. La Figura 2 y la Figura 3 muestran las estructuras que se generarían para el ejemplo de esquema XSD de la Figura 1:

El código fuente de la figura siguiente muestra cómo inicializar las estructuras declaradas en la Figura 2 y en la Figura 3. En primer lugar, se establece el número de elementos que deben asignarse y se realiza la asignación. A continuación, se inicializan cuatro de los elementos de la matriz asignada. Finalmente, se establece el número de elementos asignados que se utilizan.
Nota: Una vez asignada la estructura principal planets, planets.planet_name_cnt debe establecerse en el número real de elementos de la matriz. Además, el valor de planets.planet_name_cnt no debe sobrepasar el valor de planets.planet_name_lim.
Figura 4. Inicializar las estructuras de las declaraciones de objeto y de asunto
/* Utilización: */
planets_ref.planet_name_lim = 10;
allocate (planets) set (planets_ptr);
planets.planet_name(1) = “Mercury”;
planets.planet_name(2) = “Venus”;
planets.planet_name(3) = “Earth”;
planets.planet_name(4) = “Mars”;
planets.planet_name_cnt = 4;

Ejemplo de REFER complejo

Este ejemplo define una estructura de sistema solar que contiene una matriz ilimitada de planetas, en la que cada estructura de planeta contiene una matriz ilimitada de lunas:

Figura 5. Declaraciones XSD de matrices de longitud variable
<!-- declaraciones XSD: -->
<element name="solar_system" type="tns:SolarSystemType" />
<complexType name="SolarSystemType">
   <sequence>
      <element name="planet" type="tns:PlanetType" minOccurs="0" maxOccurs="unbounded" />
   </sequence>
</complexType>

<complexType name="PlanetType">
<sequence>
   <element name="planet_name" type="string" minOccurs="1" maxOccurs="1" />
   <element name="moon_name" type="string" minOccurs="1" maxOccurs="unbounded" />
</sequence>
</complexType>

Para implementar las matrices equivalentes en PL/I, el proceso de generación de código de WSDL2PLI crea dos declaraciones de objeto REFER y dos declaraciones de asunto REFER, que se muestran en la Figura 6 y en la Figura 7:

El código fuente de la Figura 8 muestra cómo inicializar las estructuras declaradas en la Figura 6 y en la Figura 7.
Nota: después de la asignación, las variables de recuento planets.planet_cnt, solar_system.planet(1).moon_name_cnt y solar_system.planet(2).moon_name_cnt deben establecerse en el número real de elementos de las matrices respectivas.
Figura 8. Inicializar las estructuras de las declaraciones de objeto y de asunto
/* Utilización: */
/* inicializar la estructura principal solar_system */
solar_system_ref.planet_lim = 4;
solar_system_ref.moon_name_lim = 2;
allocate (solar_system) set (solar_system_ptr);
solar_system.planet_cnt = 0;

/* crear entrada planet */
solar_system.planet(1) = “Earth”;
solar_system.planet(1).moon_name_cnt = 0;
solar_system.planet(1).moon_name(1) = “Luna”;
solar_system.planet(1).moon_name_cnt += 1;
solar_system.planet_cnt +=1; // 1

/* crear entrada planet */
solar_system.planet(2) = “Mars”;
solar_system.planet(2).moon_name_cnt = 0;
solar_system.planet(2).moon_name(1) = “Phobos”;
solar_system.planet(2).moon_name(2) = “Deimos”;
solar_system.planet(2).moon_name_cnt = 2;
solar_system.planet_cnt +=1; // 2
Nota: En asuntos REFER complejos, como por ejemplo moon_name en el ejemplo anterior, es necesario asignar un límite que satisfaga todas las repeticiones del asunto. Por ejemplo, considere la conversión del siguiente código XML a o desde la estructura principal solar_system:
<solar_system>
   <planet>
      <planet_name>Earth</planet_name>
      <moon_name>Luna</moon_name>
   </planet>
   <planet>
      <planet_name>Mars</planet_name>
      <moon_name>Phobos</moon_name>
      <moon_name>Deimos</moon_name>
   </planet>
</solar_system>

El valor mínimo del objeto REFER solar_system_ref.moon_name_lim que satisfará todas las repeticiones de planet es 2. Establecer el valor de objeto en 2 provocará la asignación de espacio para dos entradas moon_name para cada entrada planet. Dado que moon_name sólo aparece una vez en la primera aparición de la entrada planet, el contador solar_system.planet(1).moon_name_cnt debe establecerse en 1 para que sólo se lea la primera entrada moon_name.


Términos de uso | Comentarios

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