<?xml version="1.0"?>
<!-- 
/*
 * Copyright 2001-2004 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.
 */
 -->


<project 
  xmlns:j="jelly:core"
  xmlns:ant="jelly:ant"
  xmlns:artifact="artifact"
  xmlns:license="license"
  xmlns:maven="jelly:maven"
  xmlns:util="jelly:util"
  xmlns:x="jelly:xml"
  >

  <!--==================================================================-->
  <!-- Default goal : Builds a ear file                                 -->
  <!--==================================================================-->
  <goal name="ear" prereqs="ear:ear" description="Build an ear file"/>

  <!--==================================================================-->
  <!-- Initializations                                                  -->
  <!--==================================================================-->
  <goal name="ear:init" 
    description="Initialise filesystem and other resources for an ear">

  </goal>
  
  <!--==================================================================-->
  <!-- Builds an ear file                                               -->
  <!--==================================================================-->
  <goal name="ear:ear" prereqs="ear:init" description="Build an ear file">

    <ant:mkdir dir="${maven.build.dir}" />
    
     <j:set var="isGenerateAppXML" 
            value="${context.getVariable('maven.ear.appxml.generate')}"/>
     <j:if test="${isGenerateAppXML == 'true'}">
       <!-- make sure that target directory exists -->       
       <ant:mkdir dir="${maven.ear.descriptordir}"/>
       <attainGoal name="ear:generate-ear-descriptor"/>
     </j:if >
    
    <ant:echo>Building EAR ${maven.final.name} with appxml "${maven.ear.appxml}"</ant:echo>
    
    <ant:available property="maven.ear.manifest.available"
      file="${maven.ear.manifest}"/>

    <ant:ear destfile="${maven.build.dir}/${maven.final.name}.ear"
         appxml="${maven.ear.appxml}">

      <!-- include files from maven.ear.src if available -->
      <util:available file="${maven.ear.src}">
        <fileset dir="${maven.ear.src}" casesensitive="false" 
          excludes="**/META-INF/application.xml"/>
      </util:available>
      
      <!-- include marked dependencies -->
      <j:forEach var="lib" items="${pom.artifacts}">
        <j:set var="dep" value="${lib.dependency}"/>      
        <j:if test="${dep.getProperty('ear.bundle')=='true' || dep.getProperty('ear.module')=='true'}">
          
          <!-- 
           We know that this dep "wants" to be bundled.
          -->
                    
          <ant:echo>Bundling: ${dep.type} - ${dep.id}</ant:echo>                                             
          <ant:fileset dir="${lib.file.parent}">
            <ant:include name="${lib.file.name}"/>
          </ant:fileset>
            
        </j:if>  
      </j:forEach>

      <!-- include license -->
      <j:set var="licenseFileName"><license:fileName/></j:set>
      <util:file name="${licenseFileName}" var="licenseFile"/>
      <ant:metainf dir="${licenseFile.canonicalFile.parent}">
        <ant:include name="${licenseFile.canonicalFile.name}"/>
      </ant:metainf>

      <j:if test="${maven.ear.manifest.available}">
        <ant:setProperty name="manifest" value="${maven.ear.manifest}" />
      </j:if>

      <!-- standard manifest entries -->
      <ant:manifest>
        <ant:attribute name="Built-By" value="${user.name}" />
        <ant:section name="${pom.package}">
          <ant:attribute name="Specification-Title" value="${pom.artifactId}" />
          <ant:attribute name="Specification-Version"
                     value="${pom.currentVersion}" />
          <ant:attribute name="Specification-Vendor"
                     value="${pom.organization.name}" />
          <ant:attribute name="Implementation-Title"
                     value="${pom.package}" />
          <ant:attribute name="Implementation-Version"
                     value="${pom.currentVersion}" />
          <ant:attribute name="Implementation-Vendor"
                     value="${pom.organization.name}" />
        </ant:section>
      </ant:manifest>
      
      <j:if test="${!pom.build.resources.isEmpty()}">
        <mkdir dir="${maven.ear.resources}"/>
        <maven:copy-resources resources="${pom.build.resources}" todir="${maven.ear.resources}"/>
        <fileset dir="${maven.ear.resources}" />
      </j:if>
      
    </ant:ear>

  </goal>

  
  
  <!--==================================================================-->
  <!-- Creates ear descriptor - application.xml file                    -->
  <!--==================================================================-->
  <goal name="ear:generate-ear-descriptor" description="Generates the ear descriptor">
     
     <ant:echo>Generating appxml file:"${maven.ear.appxml} version ${maven.ear.appxml.version}"</ant:echo>
     
     <j:file  name="${maven.ear.appxml}"
              outputMode="xml"
              prettyPrint="true"
              encoding="UTF-8"
     >

        <j:switch on="${maven.ear.appxml.version}">
              <j:case value="1.3">
                 <x:doctype name="application" publicId="-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" systemId="http://java.sun.com/dtd/application_1_3.dtd"/>
              </j:case>
              <j:default>
                 <x:doctype name="application" publicId="-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN" systemId="http://java.sun.com/j2ee/dtds/application_1_2.dtd"/>
              </j:default>
        </j:switch>

        <x:element name="application">
        <x:element name="display-name">${maven.ear.displayname}</x:element>
        <!-- NEW 1: START -->
        <j:set var="applicationDescription" value="${maven.ear.appxml.description}"/>
	<j:if test="${!empty(applicationDescription)}">
	   <x:element name="description">${maven.ear.appxml.description}</x:element>
        </j:if >
        <!-- NEW 1: END -->
        <j:forEach var="lib" items="${pom.artifacts}">
	      <j:set var="dep" value="${lib.dependency}"/>
          <j:if test="${dep.getProperty('ear.bundle')=='true' || dep.getProperty('ear.module')=='true'}">
            <j:choose>
              <j:when test="${dep.type=='war'}">
                <x:element name="module">
                  <x:element name="web">
                    <x:element name="web-uri">${dep.getArtifact()}</x:element>
                    <x:element name="context-root">${dep.getProperty('ear.appxml.war.context-root')}</x:element>
                 </x:element>                
                </x:element>
              </j:when>
              <j:when test="${dep.type=='ejb'}">
                <x:element name="module">
                  <x:element name="ejb">${dep.getArtifact()}</x:element>                 
                </x:element>
              </j:when>       
              <j:when test="${dep.type=='jar'}">
                <j:if test="${dep.getProperty('ear.module')=='true'}">
                  <x:element name="module">  
                    <x:element name="java">${dep.getArtifact()}</x:element>                 
                  </x:element>
                </j:if>
              </j:when>
              <j:when test="${dep.type=='rar'}">
                <x:element name="module">  
                  <x:element name="connector">${dep.getArtifact()}</x:element>                 
                </x:element>
              </j:when>
              <j:when test="${dep.type=='sar'}">
                <x:element name="module">
                  <x:element name="connector">${dep.getArtifact()}</x:element>
                </x:element>
              </j:when>
            </j:choose> 
          </j:if>        
        </j:forEach>
         <!-- NEW 2: START -->
         <j:set var="securityRoles" value="${maven.ear.appxml.securityRoles}"/>
	 <j:if test="${!empty(securityRoles)}">
	 	<util:tokenize var="roles" delim="," trim="true">${maven.ear.appxml.securityRoles}</util:tokenize>
	 	<j:forEach var="role" items="${roles}">
	 		<x:element name="security-role">
	 			<x:element name="role-name">${role.trim()}</x:element>
	                 </x:element>
	 	</j:forEach>
	 </j:if > 
         <!-- NEW 2: END -->
       </x:element> 
     </j:file>  
          
   </goal>
   

  
  <!--==================================================================-->
  <!-- Install the ear in the local repository                          -->
  <!--==================================================================-->    
  <goal name="ear:install"
        prereqs="ear:ear"
        description="Install the ear in the local repository">
     
     <artifact:install
        artifact="${maven.build.dir}/${maven.final.name}.ear"
        type="ear"
        project="${pom}"/> 
  
  </goal>
  
  <!--==================================================================-->
  <!-- Install the snapshot version of the ear in the local repository  -->
  <!--==================================================================-->      
  <goal name="ear:install-snapshot"
        prereqs="ear:ear" 
        description="Install the snapshot version of the ear in the local repository">
        
      <artifact:install-snapshot
        artifact="${maven.build.dir}/${maven.final.name}.ear"
        type="ear"
        project="${pom}"/> 
        
  </goal>

  <!--==================================================================-->
  <!-- Deploys the ear to the remote repository                         -->
  <!--==================================================================-->      
  <goal name="ear:deploy" 
        prereqs="ear:ear" 
        description="Deploys the ear to the remote repository">

     <artifact:deploy
        artifact="${maven.build.dir}/${maven.final.name}.ear"
        type="ear"
        project="${pom}"/>   
        
  </goal>      
        
  <!--==================================================================-->
  <!-- Deploys the snapshot version of the ear to the remote repository         -->
  <!--==================================================================-->      
  <goal name="ear:deploy-snapshot" 
        prereqs="ear:ear"
        description="Deploys the snapshot version of  the ear to remote repository">  

     <artifact:deploy-snapshot
        artifact="${maven.build.dir}/${maven.final.name}.ear"
        type="ear"
        project="${pom}"/>    
        
  </goal>

  <!--==================================================================-->
  <!-- Special no-op goal which can be used by other plugin which need  -->
  <!-- to get access to any of this plugin's property. This is          -->
  <!-- temporary, until we get explicit plugin dependencies.            -->
  <!--==================================================================-->    
  <goal name="ear:load"/>
   
 

</project>

