<?xml version="1.0"?>

<!--
 * ========================================================================
 * 
 * Copyright 2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * ========================================================================
-->

<!--
 Customized version of maven annnouncement plugin style sheet to create
 release notes for commons-math.  Customizations are:
 * Add a title
 * Display the description attribute in the release at the beginning
 * Add a heading to the project description and move the URL to follow
 * Get rid of "have fun" sig-like thingy
-->
    
<jsl:stylesheet
    select="$doc"
    xmlns:j="jelly:core"
    xmlns:jsl="jelly:jsl"
    xmlns:x="jelly:xml"
    xmlns:u="jelly:util"
    xmlns:maven="jelly:maven"
    xmlns="dummy" trim="true">

  <!-- This stylesheet expects the versionVariable to be defined before calling it -->
  <jsl:template match="document/body/release">

    <x:set var="version" select="string(@version)"/>
    <x:set var="description" select="string(@description)"/>
    <j:if test="${versionVariable.equals(version)}">
      <j:whitespace trim="false">
Jakarta Commons Math Version ${version} 
         RELEASE NOTES

      </j:whitespace>

      <j:useBean var="formatter" class="org.apache.maven.announcement.Formatter"/>

      <j:set var="header" trim="false" value="${description}"/>

<j:forEach var="line" items="${formatter.format(header,78)}">
<j:whitespace trim="false">${line}
</j:whitespace>
</j:forEach>
For more information on Jakarta Commons Math, see
${pom.url}
      <j:whitespace trim="false">
Changes in this version include:</j:whitespace>

      <x:set var="actions" select="action[@type='add']" sort="@type" />
        <j:if test="${!empty(actions)}">
<j:whitespace trim="false">

  New Features:
</j:whitespace>
        <j:forEach var="action" items="${actions}">
          <x:set var="item" select="."/><jsl:applyTemplates select="$action"/>
        </j:forEach>
      </j:if>
      <x:set var="actions" select="action[@type='fix']" sort="@type" />
        <j:if test="${!empty(actions)}">
<j:whitespace trim="false">

  Fixed bugs:
</j:whitespace>
        <j:forEach var="action" items="${actions}">
          <x:set var="item" select="."/><jsl:applyTemplates select="$action"/>
        </j:forEach>
      </j:if>
      <x:set var="actions" select="action[@type='update']" sort="@type" />
        <j:if test="${!empty(actions)}">
<j:whitespace trim="false">

  Changes:
</j:whitespace>
        <j:forEach var="action" items="${actions}">
          <x:set var="item" select="."/><jsl:applyTemplates select="$action"/>
        </j:forEach>
      </j:if>
      <x:set var="actions" select="action[@type='remove']" sort="@type" />
        <j:if test="${!empty(actions)}">
<j:whitespace trim="false">

  Removed features:
</j:whitespace>
        <j:forEach var="action" items="${actions}">
          <x:set var="item" select="."/><jsl:applyTemplates select="$action"/>
        </j:forEach>
      </j:if>

      <!-- Nasty hack to detect a plugin until pom.type exists -->
      <u:available file="${basedir}/plugin.jelly">
        <j:whitespace trim="false"> 

To automatically install the plugin, type the following on a single line:

maven plugin:download 
  -DgroupId=${pom.groupId} 
  -DartifactId=${pom.artifactId}
  -Dversion=${versionVariable}

For a manual installation, you can download the plugin here:
${distributionUrl}/${pom.artifactId}-${versionVariable}.jar
        </j:whitespace>
      </u:available>
      <j:whitespace trim="false"> 

      </j:whitespace>
    </j:if>

  </jsl:template>
  
  <jsl:template match="action" trim="true">
    <x:set var="body" select="string(.)"/>
    <j:set var="counter" value=""/>
        
    <j:set var="issue"><x:expr select="@issue"/></j:set>
    <j:set var="dueto"><x:expr select="@due-to"/></j:set>
        
    <j:set var="text" trim="true">
      ${body}
      <j:if test="${issue != ''}"><j:whitespace> Issue: ${issue}.</j:whitespace></j:if>
      <j:if test="${dueto != ''}"><j:whitespace> Thanks to ${dueto}.</j:whitespace></j:if>
    </j:set>
        
    <j:forEach var="line" items="${formatter.format(text,75)}">
      <j:choose>
        <j:when test="${counter.length() == '0'}">
          <j:whitespace trim="false">
o ${line}</j:whitespace>
        </j:when>
        <j:otherwise>
          <j:whitespace trim="false">
  ${line}</j:whitespace>
        </j:otherwise>
      </j:choose>
      <j:set var="counter" value="${counter}X"/>
    </j:forEach>
  </jsl:template>

  <jsl:template match="@*"/>

  <jsl:template match="text()"/>

</jsl:stylesheet>
