<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
		xmlns:java="http://www.o-xml.org/java"
		xmlns:o="http://www.o-xml.org/lang/">

  <xsl:output method="text" indent="no" encoding="UTF-8"/>

  <!-- utility templates  -->

  <xsl:template match="/">
    <xsl:choose>
      <xsl:when test="*/@java:package">
	<xsl:text>package </xsl:text>
	<xsl:value-of select="*/@java:package"/>;
      </xsl:when>
      <xsl:otherwise>package org.oXML.type;</xsl:otherwise>
    </xsl:choose>

    <xsl:call-template name="imports"/>

  /**
    *  ObjectBox - o:XML compiler and interpretor
    *  for more information see http://www.o-xml.org/objectbox
    *  Copyright (C) 2002/2003 Martin Klang, Alpha Plus Technology Ltd
    *  email: martin at hack.org
    *  This class has been generated from an o:XML template
    */
    <xsl:apply-templates/>
  </xsl:template>

  <!-- create Name with or without namespace -->
  <xsl:template match="node()|@*" mode="name">
    <xsl:variable name="prefix" select="substring-before(., ':')"/>
    <xsl:text>new Name("</xsl:text>
    <xsl:choose>
      <xsl:when test="$prefix">
	<xsl:value-of select="ancestor-or-self::*/namespace::node()[name(.) = $prefix]"/>
	<xsl:text>", "</xsl:text>
	<xsl:value-of select="substring-after(., ':')"/>
      </xsl:when>
      <xsl:otherwise>
	<xsl:value-of select="."/>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:text>")</xsl:text>
  </xsl:template>

  <!-- type templates: get Java Type object representing type -->
  <xsl:template match="node()|@*" mode="type">
    <xsl:value-of select="."/>
    <xsl:if test=". != 'Node'">Node</xsl:if>
    <xsl:text>.TYPE</xsl:text>
    <!-- should do some clever lookup somewhere -->
<!-- disabled in favour of static type refs
    <xsl:text>(Type)types.get(</xsl:text>
    <xsl:apply-templates select="." mode="name"/>
    <xsl:text>)</xsl:text>
-->
  </xsl:template>

  <xsl:template match="o:param" mode="type">
    <!-- default parameter type -->
    <xsl:text>Node.TYPE</xsl:text>
  </xsl:template>

  <xsl:template match="o:param[@type]" mode="type">
    <xsl:apply-templates select="@type" mode="type"/>
  </xsl:template>

  <xsl:template match="o:param" mode="signature">
    <xsl:apply-templates select="." mode="javaname"/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="@name"/>
    <xsl:if test="following-sibling::o:param">, </xsl:if>
  </xsl:template>

  <!-- javaname templates: get Java class for type -->
  <xsl:template match="o:param" mode="javaname">
    <xsl:text>Node</xsl:text>
  </xsl:template>

  <xsl:template match="o:param[@type]" mode="javaname">
    <xsl:value-of select="@type"/>
    <xsl:if test="@type != 'Node'">Node</xsl:if>
  </xsl:template>
<!--
  <xsl:template match="o:param[@java:class]" mode="javaname">
    <xsl:value-of select="@java:class"/>
  </xsl:template>
-->
  <xsl:template match="o:type" mode="javaname">
    <xsl:value-of select="@name"/>
  </xsl:template>

  <xsl:template match="o:type[@java:class]" mode="javaname">
    <xsl:value-of select="@java:class"/>
  </xsl:template>

  <xsl:template name="imports">
import org.oXML.type.*;
import org.oXML.engine.Module;
import org.oXML.ObjectBoxException;
import org.oXML.util.Log;
  </xsl:template>
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
</xsl:stylesheet>