Jos Nieuwenhuis


Het gebruik van embedded Java in BPEL

In BPEL kun je op verschillende manieren gegevens manipuleren. Meestal gebruik je hiervoor XSLT, maar in sommige situaties is het beter om embedded Java te gebruiken.

XSLT is zeer geschikt voor transformaties. Het biedt enorm veel mogelijkheden om data in de juiste vorm te krijgen. Echter, sommige dingen zijn niet zo eenvoudig om in XSLT uitgevoerd te worden. Bijvoorbeeld een While-loop. Door recursief een template aan te roepen kan de functionaliteit worden verkregen, maar door de recursiviteit kan de Java heap space opraken (StackOverflow). Dit is al heel snel het geval als de Java startup parameter -Xss128k wordt gebruikt. Het gebruik van Java is veel gunstiger voor wat betreft de heap space.

Hieronder laat ik eerst de XSLT variant:

<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:ns1="http://www.josnieuwenhuis.nl/da/workeremployment/v1"
      exclude-result-prefixes="xsl ns1">
  <xsl:variable name="max"
      select="number(/ns1:WrapperVariable/ns1:root/ns1:ns1:Max)"/>
  <xsl:variable name="minExcluded"
      select="number(/ns1:WrapperVariable/ns1:root/ns1:ExcludedMin)"/>
  <xsl:variable name="maxExcluded"
      select="number(/ns1:WrapperVariable/ns1:root/ns1:ExcludedMax)"/>
  <xsl:template match="/">
    <ns1:GenerateDAPersoneelsnummerResponse>
      <ns1:Personeelnummer>
        <xsl:call-template name="for.loop">
          <xsl:with-param name="i"
              select="/ns1:WrapperVariable/ns1:root/ns1:Min"/>
        </xsl:call-template>
      </ns1:Personeelnummer>
    </ns1:GenerateDAPersoneelsnummerResponse>
  </xsl:template>
  <xsl:template name="for.loop">
    <xsl:param name="i"/>
    <xsl:variable name="counted" 
        select="count(//ns1:Personeelsnummer[. = $i])"/>
    <xsl:if test="number($i) <= $max">
      <xsl:choose>
        <xsl:when test="(number($i) <= $maxExcluded 
            and number($i) >= $minExcluded) or ($counted > 0)">
          <xsl:call-template name="for.loop">
            <xsl:with-param name="i" select="number($i) + 1"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$i"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

Dezelfde functionaliteit in Java:

String minValue = ((oracle.xml.parser.v2.XMLText) 
   getVariableData("InputVariable","payload",
   "/client:root/client:Min/text()")).getData();     
String maxValue = ((oracle.xml.parser.v2.XMLText) 
   getVariableData("InputVariable","payload",
   "/client:root/client:Max/text()")).getData();      
String minExcludedValue = ((oracle.xml.parser.v2.XMLText) 
   getVariableData("InputVariable","payload",
   "/client:root/client:ExcludedMin/text()")).getData();      
String maxExcludedValue = ((oracle.xml.parser.v2.XMLText) 
   getVariableData("InputVariable","payload",
   "/client:root/client:ExcludedMax/text()")).getData();   
String personeelsnummers = ((oracle.xml.parser.v2.XMLText) 
   getVariableData("WrapperVariable",
   "/client:WrapperVariable/client:UsedPersoneelsnummers/text()")).getData();   
     
int i = Integer.parseInt(minValue);      
int max =  Integer.parseInt(maxValue);    
int minExcluded = Integer.parseInt(minExcludedValue);      
int maxExcluded =  Integer.parseInt(maxExcludedValue);       
    
while(i <= max){      
    if(!(i <= maxExcluded && i >= minExcluded)){    
        if(personeelsnummers.indexOf("|"+ i+ "|") == -1){   
            setVariableData("OutputVariable","payload",
               "/client:GenerateDAPersoneelsnummerResponse/client:Personeelnummer",
               i + "");    
            break;    
        }   
    }   
    i++;     
}
Datum: 14 mei 2011 - BPEL,Java,SOA

Geen reacties

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.