#!/usr/bin/env python

# Copyright (c) 2007, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution.  The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

"""Ant Tasks Dom Element"""

import xml.dom.minidom, os

class AntTask:
    def __init__(self, document, _name, _body=None, **_attributes):
        """Instantiate an Ant task element
        document, _name=task name, _body=task body, **_attributes=task attributes
        """
        self.Document = document
        self.Root = ""
            
        if _name == None or _name == "":
            raise Exception("No Ant task name")

        taskElement = self.Document.createElement(_name)
        for name in _attributes:
            taskElement.setAttribute(name, _attributes[name])

        if _body != None:
            if isinstance(_body, str):
                text = self.Document.createTextNode(_body)
                taskElement.appendChild(text)
            elif isinstance(_body, list):
                for subtask in _body:
                    taskElement.appendChild(subtask)

        self.Root = taskElement

    def SubTask(self, _name, _body=None, **_attributes):
        """Insert a sub-task into this task"""
        newTask = AntTask(self.Document, _name , _body, **_attributes)
        self.Root.appendChild(newTask.Root)
        return newTask

    def AddSubTask(self, subTask):
        """Insert a existing sub-task into this task"""
        self.Root.appendChild(subTask.Root.cloneNode(True))
        return subTask
        
    def Comment(self, string):
        """Generate a XML comment"""
        self.Root.appendChild(self.Document.createComment(string))

    def Blankline(self):
        """Generate a blank line"""
        self.Root.appendChild(self.Document.createTextNode(""))


class AntBuildFile(AntTask):
    _FileComment = "DO NOT EDIT\nThis file is auto-generated by the build utility\n\nAbstract:\nAuto-generated ANT build file for building Framework modules and platforms\n"
    
    def __init__(self, name, basedir=".", default="all"):
        """Instantiate an Ant build.xml
           name=project name, basedir=project default directory, default=default target of this project
        """
        self.Document = xml.dom.minidom.getDOMImplementation().createDocument(None, "project", None)
        self.Root = self.Document.documentElement
        
        self.Document.insertBefore(self.Document.createComment(self._FileComment), self.Root)
        self.Root.setAttribute("name", name)
        self.Root.setAttribute("basedir", basedir)
        self.Root.setAttribute("default", default)
        
    def Create(self, file):
        """Generate the build.xml using given file path"""
        buildFileDir = os.path.dirname(file)
        if not os.path.exists(buildFileDir):
            os.makedirs(buildFileDir)
            
        f = open(file, "w")
        f.write(self.Document.toprettyxml(2*" ", encoding="UTF-8"))
        f.close()
