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.
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:
<!-- 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:
La estructura de declaraciones de objeto especifica el número máximo de elementos de matriz que pueden asignarse. Para conocer el significado de los sufijos _ref y _lim, consulte la sección Creación de identificadores de PL/I:
La estructura de las declaraciones de asunto correlaciona el espacio asignado. Para conocer el significado de los sufijos _ptr, _lim y _cnt, consulte la sección Creación de identificadores de PL/I:
/* Declaraciones de asunto PL/I REFER: */ 01 planets UNALIGNED BASED(planets_ptr), /* número guardado de objetos refer planet_name asignados (sólo lectura) */ 02 planet_name_lim SIGNED FIXED BINARY(31), /* recuento de entradas de matriz planet_name utilizadas */ 02 planet_name_cnt SIGNED FIXED BINARY(31), /* matriz planet_name con límite especificado durante la asignación */ 02 planet_name (planets_ref.planet_name_lim REFER (planets.planet_name_lim)) CHAR(255) VARYING;
/* 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;
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:
<!-- 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:
/* Declaraciones de objeto PL/I REFER: */ 01 solar_system_ref UNALIGNED, /* número de entradas planet a las que asignar espacio */ 02 planet_lim SIGNED FIXED BINARY(31), /* número de entradas moon_name a las que asignar espacio */ 2 moon_name_lim SIGNED FIXED BINARY(31);
/* Declaraciones de asunto PL/I REFER: */ 01 solar_system UNALIGNED BASED(solar_system_ptr), /* número guardado de objetos refer planet asignados (sólo lectura) */ 02 planet_lim SIGNED FIXED BINARY(31), /* número guardado de objetos refer moon_name asignados (sólo lectura) */ 02 moon_name_lim SIGNED FIXED BINARY(31), /* recuento de entradas de matriz planet utilizadas */ 02 planet_cnt SIGNED FIXED BINARY(31), /* matriz planet con límite especificado durante la asignación */ 02 planet(solar_system_ref.planet_lim REFER (solar_system.planet_lim)), 03 planet_name CHAR(255) VARYING, /* recuento de entradas de matriz moon_name[i] utilizadas */ 03 moon_name_cnt SIGNED FIXED BINARY(31), /* matriz moon_name con límite especificado durante la asignación */ 10 moon_name(solar_system_ref.moon_name_lim REFER (solar_system.moon_name_lim)) CHAR(255) VARYING;
/* 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
<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.