<?xml version="1.0" encoding="iso-8859-1"?>
<!--
 ! Transforms XML bean description into PHP sourcecode
 !
 ! $Id: xp.xsl 6340 2005-12-22 17:15:36Z friebe $
 !-->
<xsl:stylesheet
 version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:exsl="http://exslt.org/common"
 xmlns:str="http://exslt.org/strings"
 xmlns:set="http://exslt.org/sets"
 xmlns:func="http://exslt.org/functions"
 extension-element-prefixes="func"
>
  <xsl:output method="text" encoding="iso-8859-1" indent="0"/>
  
  <!--
   ! Retrieves short class name for a fully qualified class name
   !
   ! @param   string classname
   ! @return  string
   !-->
  <func:function name="func:shortname">
    <xsl:param name="classname"/>

    <xsl:variable name="tokens" select="str:tokenize($classname, '.')"/>
    <func:result>
      <xsl:value-of select="$tokens[count($tokens)]"/>
    </func:result>
  </func:function>

  <!--
   ! Function that returns a string fully in upper case
   !
   ! @param   string string
   ! @return  string
   !-->
  <func:function name="func:ucfirst">
    <xsl:param name="string"/>
    <func:result>
      <xsl:value-of select="concat(
        translate(substring($string, 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'),
        substring($string, 2, string-length($string)- 1)
      )"/> 
    </func:result>
  </func:function>  

  <xsl:template name="interface">
    <xsl:param name="description"/>
    <xsl:param name="interface"/>
    
    <xsl:text><![CDATA[<?php
/* This file is part of the XP framework
 *
 * $Id]]>&#36;<![CDATA[
 */

  /**
   * ]]></xsl:text><xsl:value-of select="$description"/><xsl:text><![CDATA[
   *
   * @purpose  EASC Client stub
   */
  class ]]></xsl:text><xsl:value-of select="func:shortname(exsl:node-set($interface)/className)"/>
    <xsl:text> extends Interface {&#10;</xsl:text>
    <xsl:for-each select="set:distinct(exsl:node-set($interface)/methods/method/name/text())">
      <xsl:variable name="name" select="."/>
      <xsl:variable name="methods" select="exsl:node-set($interface)/methods/method[name = $name]"/>
      
      <!-- Generate different sourcecode depending on whether the method is overloaded or not -->
      <xsl:choose>
        <xsl:when test="count($methods) = 1">
      
          <!-- Not overloaded -->
          <xsl:text><![CDATA[
    /**
     * ]]></xsl:text><xsl:value-of select="func:ucfirst($name)"/><xsl:text><![CDATA[ method
     *
     * @access  public
]]></xsl:text>
          <xsl:for-each select="$methods[1]/parameterTypes/parameterType">
            <xsl:text>     * @param   </xsl:text>
            <xsl:value-of select="concat(., ' arg', position())"/>
            <xsl:text>&#10;</xsl:text>
          </xsl:for-each>
          <xsl:text><![CDATA[     * @return  ]]></xsl:text><xsl:value-of select="$methods[1]/returnType"/><xsl:text><![CDATA[
     */
    function ]]></xsl:text><xsl:value-of select="$name"/><xsl:text>(</xsl:text>
          <xsl:for-each select="$methods[1]/parameterTypes/parameterType">
            <xsl:value-of select="concat('$arg', position())"/>
            <xsl:if test="position() &lt; last()">, </xsl:if>
          </xsl:for-each>
          <xsl:text>) { }&#10;</xsl:text>        
        </xsl:when>
        <xsl:otherwise>
        
          <!-- Overloaded -->
          <xsl:text><![CDATA[
    /**
     * ]]></xsl:text><xsl:value-of select="func:ucfirst($name)"/><xsl:text><![CDATA[ method
     *
     * @access  public
     * @param   mixed*
     * @return  mixed
     */
    #[@overloaded(signatures= array(]]>&#10;</xsl:text>
        <xsl:for-each select="$methods">
          <xsl:text>    #  array('</xsl:text>
          <xsl:for-each select="parameterTypes/parameterType">
            <xsl:value-of select="."/>
            <xsl:if test="position() &lt; last()">', '</xsl:if>
          </xsl:for-each>
          <xsl:text>')</xsl:text>
          <xsl:if test="position() &lt; last()">,</xsl:if>
          <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
        <xsl:text><![CDATA[    #))]
    function ]]></xsl:text><xsl:value-of select="$name"/><xsl:text>() { }&#10;</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
    <xsl:text><![CDATA[
  }
?>]]></xsl:text>
  </xsl:template>
  
  <xsl:template match="description[@purpose= 'home']">
    <xsl:call-template name="interface">
      <xsl:with-param name="description" select="concat('Home interface for ', jndiName)"/>
      <xsl:with-param name="interface" select="interfaces/interface[1]"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template match="description[@purpose= 'remote']">
    <xsl:call-template name="interface">
      <xsl:with-param name="description" select="concat('Remote interface for ', jndiName)"/>
      <xsl:with-param name="interface" select="interfaces/interface[2]"/>
    </xsl:call-template>
  </xsl:template>
  
  <xsl:template match="/">
    <xsl:apply-templates/>
  </xsl:template>
  
</xsl:stylesheet>
