buildframework/helium/tools/common/common.antlib.xml
changeset 2 39c28ec933dd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/common.antlib.xml	Mon May 10 19:54:49 2010 +0100
@@ -0,0 +1,619 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : common.antlib.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!--* @package framework -->
+<antlib xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+    
+    
+    <!-- Macro to execute bldmake command. To be removed if not used. -->
+    <macrodef name="bldmakeBldfilesMacro" uri="http://www.nokia.com/helium">
+        <attribute name="dir"/>
+        <sequential>
+            <exec executable="${build.drive}/epoc32/tools/bldmake.bat" dir="@{dir}" failonerror="${failonerror}">
+                <arg value="bldfiles"/>
+                <arg value="-k"/>
+            </exec>
+        </sequential>
+    </macrodef>
+
+
+    <!-- Macro to execute abld command. Once used in rombuild.ant.xml. -->
+    <macrodef name="abldMacro" uri="http://www.nokia.com/helium">
+        <attribute name="dir"/>
+        <attribute name="command"/>
+        <attribute name="platform"/>
+        <sequential>
+            <exec executable="@{dir}/abld.bat" dir="@{dir}" failonerror="${failonerror}">
+                <arg value="@{command}"/>
+                <arg value="@{platform}"/>
+                <arg value="-k"/>
+            </exec>
+        </sequential>
+    </macrodef>
+
+    <!--
+        This macro generate a file that contains a list of path from a path structure:
+        <pre>
+        <hlm:pathToFileListMacro file="output.lst">
+            <path>
+                <pathelement path="${helium.dir}"/>
+            </path>
+        </hlm:pathToFileListMacro> 
+        </pre>
+    -->
+    <scriptdef name="pathToFileListMacro" language="beanshell" uri="http://www.nokia.com/helium">
+        <attribute name="file"/>
+        <element name="path" type="path"/>
+        <![CDATA[
+    import java.io.FileWriter;
+    FileWriter out = new FileWriter(attributes.get("file"));
+    paths = elements.get("path");
+    for (int i = 0 ; i < paths.size() ; i++) {
+        String[] files = paths.get(i).list();
+        for (int l = 0; l < files.length ; l++) {
+            out.write(files[l] + "\n");
+        }
+    }
+out.close();
+]]>   
+    </scriptdef>
+
+    
+   
+    <!-- This Macro is a wrapper to command line tool 
+        Currently supported command line tools are
+        configuration tool and
+        sbs tool
+        Usage: 
+            name - name of the tool:
+            toolvarset - reference id for variables to be passed to the tool
+        <pre>
+        <hlm:toolMacro name="configuration">
+            <hlm:toolvarset refid="cnftool.conf.50"/>
+        </hlm:toolMacro>
+        </pre>
+    -->
+    <scriptdef name="toolMacro" language="beanshell" uri="http://www.nokia.com/helium">
+        <element name="toolvarset" classname="com.nokia.helium.core.ant.types.VariableSet"/>
+        <attribute name="name"/>
+<![CDATA[
+import com.nokia.ant.util.ToolsProcess;
+import com.nokia.tools.*;
+import com.nokia.helium.core.ant.types.VariableSet;
+import org.apache.tools.ant.types.Reference;
+    Reference ref;
+    java.lang.String toolName = attributes.get("name");
+    confTool =  ToolsProcess.getTool(toolName);
+    varSets = elements.get("toolvarset");
+    for (i = 0; i < varSets.size(); ++i) {
+        try {
+            varSet = (VariableSet)varSets.get(i);
+            if (varSet.isReference()) {
+                varSet = varSet.getRefid().getReferencedObject(project);
+            }
+            confTool.execute(varSet,project);
+        } catch (Exception e) {
+            self.log("Error: " + e);
+            //self.log("Tool Argument Validation failure");
+            throw e;
+        }
+  }
+]]>
+    </scriptdef>
+    
+    <!-- ConE tool macro to run the command for each argument -->
+    <scriptdef name="conEToolMacro" language="beanshell" uri="http://www.nokia.com/helium">
+        <element name="arg" classname="com.nokia.ant.types.Variable"/>
+        <attribute name="name"/>
+<![CDATA[
+import com.nokia.ant.util.ToolsProcess;
+import com.nokia.tools.*;
+import com.nokia.ant.types.Variable;
+    conETool =  ToolsProcess.getTool("ConE");
+    vars = elements.get("arg");
+    for (i = 0; i < vars.size(); ++i) {
+        try {
+            var = (Variable)vars.get(i);
+            conETool.storeVariables(var.getName(), var.getValue());
+        } catch (Exception e) {
+            self.log("Error: " + e);
+            //self.log("Tool Argument Validation failure");
+            throw e;
+        }
+  }
+  conETool.execute(project);
+]]>
+    </scriptdef>
+    
+    
+    <!-- This macro will read the line from file which matches the regexp -->
+    <scriptdef name="grepMacro" language="beanshell" uri="http://www.nokia.com/helium">
+        <attribute name="filename"/>
+        <attribute name="output"/>
+        <attribute name="regexp"/>
+<![CDATA[
+import java.util.*;
+import java.io.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+if (attributes.get("filename") == null ||  attributes.get("output") == null || attributes.get("regexp") == null)
+    throw new BuildException("Filename/output/regexp attribute is not set for readLineMacro");
+    
+String search = attributes.get("regexp");
+String output = "";
+pattern = Pattern.compile(search);
+
+BufferedReader input =  new BufferedReader(new FileReader(attributes.get("filename")));
+try {
+        String line = null;
+        Matcher match = null;
+        while (( line = input.readLine()) != null) {
+             match = pattern.matcher(line);
+            if (match.find()) {
+                //self.log("Line containg " + search + " is = " + line + " returned vaue = " + match.group(1));
+                int checkIndex = output.indexOf(match.group(1), 0);
+                if (checkIndex == -1 ) {
+                   output = output + match.group(1) + ",";
+                }
+            }
+        }
+    } catch (IOException ex) {
+      ex.printStackTrace();
+    }
+    project.setNewProperty(attributes.get("output") , output);
+
+]]>
+    </scriptdef>
+
+    <!-- This task allow to dump the content of a text file to the shell. -->
+    <scriptdef name="echoFileMacro" language="beanshell" uri="http://www.nokia.com/helium">
+        <attribute name="file"/>
+        <![CDATA[        
+        //Open the file for reading
+         try {
+            java.io.BufferedReader in = new java.io.BufferedReader(new java.io.FileReader(attributes.get("file")));
+            while ((thisLine = in.readLine()) != null) { // while loop begins here
+                 self.log(thisLine);
+            } // end while 
+        } catch (java.io.IOException e) {
+            self.log("Error: " + e);
+            throw e;
+        }        
+        ]]>
+    </scriptdef>
+    
+    <!-- This task create the herder information in the symbian log file -->
+    <scriptdef name="symbianLogHeaderMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="config"/>
+        <attribute name="command"/>
+        <attribute name="dir"/>
+import log2xml
+log2xml.symbian_log_header(self, attributes.get('config'), attributes.get('command'), attributes.get('dir'))
+    </scriptdef>
+
+    <!-- This task create the footer information in the symbian log file -->
+    <scriptdef name="symbianLogFooterMacro" language="jython" uri="http://www.nokia.com/helium">
+import log2xml
+log2xml.symbian_log_footer(self)
+    </scriptdef>
+
+
+    
+    <!-- A generic assert macro similar to AntUnit "assertTrue". -->
+    <macrodef name="assert" uri="http://www.nokia.com/helium">
+        <attribute name="message" default="Value is not true."/>
+        <element name="condition" implicit="yes"/>
+        <sequential>
+            <if>
+                <isset property="hlm.enable.asserts"/>
+                <then>
+                    <au:assertTrue message="@{message}">
+                        <condition/>
+                    </au:assertTrue>
+                </then>
+                <else>
+                    <trycatch property="assert.try">
+                        <try>
+                            <au:assertTrue message="@{message}">
+                                <condition/>
+                            </au:assertTrue>
+                        </try>
+                        <catch>
+                            <echo message="Warning: @{message}"/>
+                            <hlm:hlmassertmessage assertName="hlm:assert" message="Warning: @{message}"/>
+                        </catch>
+                    </trycatch>
+                </else>
+            </if>
+        </sequential>
+    </macrodef>
+    
+    
+    <!-- A generic assert macro similar to AntUnit "assertFileExists". -->
+    <macrodef name="assertFileExists" uri="http://www.nokia.com/helium">
+        <attribute name="file"/>
+        <attribute name="message" default="@{file} does not exists."/>
+        <sequential>
+            <if>
+                <isset property="hlm.enable.asserts"/>
+                <then>
+                    <au:assertFileExists file="@{file}" message="Warning: @{message}"/>
+                </then>
+                <else>
+                    <trycatch property="assert.try">
+                        <try>
+                            <au:assertFileExists file="@{file}" message="Warning: @{message}"/>                                
+                        </try>
+                        <catch>
+                            <echo message="Warning: @{message}"/>
+                            <hlm:hlmassertmessage assertName="hlm:assertFileExists" message="Warning: @{message}"/>
+                        </catch>
+                    </trycatch>
+                </else>
+            </if>
+        </sequential>
+    </macrodef>
+
+    <!-- A generic assert macro similar to AntUnit "assertPropertySet". -->
+    <macrodef name="assertPropertySet" uri="http://www.nokia.com/helium">
+        <attribute name="property"/>
+        <attribute name="message" default="@{property} is not set."/>
+        <sequential>
+            <if>
+                <isset property="hlm.enable.asserts"/>
+                <then>
+                    <au:assertPropertySet name="@{property}" message="@{message}"/>
+                </then>
+                <else>
+                    <trycatch property="assert.try">
+                        <try>
+                            <au:assertPropertySet name="@{property}" message="@{message}"/>
+                        </try>
+                        <catch>
+                            <echo message="Warning: @{message}"/>
+                            <hlm:hlmassertmessage assertName="hlm:assertPropertySet" message="Warning: @{message}"/>
+                        </catch>
+                    </trycatch>
+                </else>
+            </if>
+        </sequential>
+    </macrodef>
+
+
+    
+    <!-- Script definition to collect target dependencies -->
+    <scriptdef name="dependencies" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="target"/>
+        <attribute name="format"/>
+parsedTargets = []
+targetList = []
+
+def collectTargetDependencies(targetName, indent):    
+    targetObject = project.getTargets().get(targetName)
+    if targetObject is None :
+        print  "Target '" + targetName + "' not found."   
+    else :
+        dependenciesEnum = targetObject.getDependencies()
+        while dependenciesEnum.hasMoreElements():
+            dependency = dependenciesEnum.nextElement()
+            if dependency not in parsedTargets:
+                collectTargetDependencies(dependency, indent + 1)
+                parsedTargets.append(dependency)
+                targetList.append((dependency, indent))
+
+target = str(attributes.get('target'))
+
+collectTargetDependencies(target, 1)
+targetList.append((target, 0))
+    
+format = str(attributes.get('format'))
+
+if format == 'nested':    
+    for target, indent in targetList:        
+        indentString = ''.join(['   ' for x in range(indent)])
+        print indentString + str(target)
+elif format == 'executable':
+    print "Top level targets:\n"
+    print ''.join([str(target) + ' ' for target, indent in targetList[:-1] if indent == 1])
+    print "\n\nAll targets in sequence:\n"
+    print ''.join([str(target) + ' ' for target, indent in targetList[:-1]])
+    </scriptdef>
+    
+    
+    <!-- This new task allows to save a reference to a file. -->
+    <scriptdef name="referenceToFileMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="refid"/>
+        <attribute name="output"/>
+    <![CDATA[
+from java.io import FileWriter
+
+refid = str(attributes.get("refid"))
+output = str(attributes.get("output"))
+
+if refid == None:
+    raise Exception("'refid' attribute must be defined!")    
+if output == None:
+    raise Exception("'output' attribute must be defined!")
+    
+self.log("Creating %s using %s" % (output, refid))
+
+reference = project.getReference(refid)
+if reference == None:
+    raise Exception("Unknown reference '%s'" % refid)
+output = FileWriter(output)
+i = reference.iterator()
+while i.hasNext():
+    path = i.next().toString()
+    self.log(path)
+    output.write(path + "\n")
+output.close()
+    ]]></scriptdef>
+    
+    <!-- Reads password from .netrc file for a specific type of service. -->
+    <scriptdef name="netrcPasswordMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="output-prop"/>
+        <attribute name="result-prop"/>
+        <attribute name="type"/>
+        <![CDATA[
+import netrc
+import os
+result = "0"
+try:
+    netrc_file = netrc.netrc()
+    self.log("Type: %s" % str(attributes.get("type")))
+    netrc_info = netrc_file.authenticators(str(attributes.get("type")))
+    if netrc_info == None:
+        raise Exception("No entry found for Type: %s" % str(attributes.get("type")))
+    (n_username, n_account, n_password) = netrc_info
+    if attributes.get('output-prop') != None:
+        project.setProperty(str(attributes.get('output-prop')), str(n_password))
+except Exception, e:
+    result = "-1"
+    print "Warning: %s" % e
+if attributes.get('result-prop') != None:
+    project.setProperty(str(attributes.get('result-prop')), str(result))
+        ]]>
+    </scriptdef>
+
+    <!-- Reads user name from .netrc file for a specific type of service. -->
+    <scriptdef name="netrcUsernameMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="output-prop"/>
+        <attribute name="result-prop"/>
+        <attribute name="type"/>
+        <![CDATA[
+import netrc
+import os
+result = "0"
+try:
+    netrc_file = netrc.netrc()
+    self.log("Type: %s" % str(attributes.get("type")))
+    netrc_info = netrc_file.authenticators(str(attributes.get("type")))
+    if netrc_info == None:
+        raise Exception("No entry found for Type: %s" % str(attributes.get("type")))
+    (n_username, n_account, n_password) = netrc_info
+    if attributes.get('output-prop') != None:
+        project.setProperty(str(attributes.get('output-prop')), str(n_username))
+except Exception, e:
+    result = "-1"
+    print "Warning: %s" % e
+if attributes.get('result-prop') != None:
+    project.setProperty(str(attributes.get('result-prop')), str(result))
+        ]]>
+    </scriptdef>
+     
+    <!-- Check availability of synergy. -->   
+    <scriptdef  name="ccmAvailableMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="resultproperty"/>
+        <![CDATA[
+import nokia.nokiaccm
+import logging
+import ccm.extra
+
+logging.basicConfig(level=logging.INFO)
+
+session = None
+result = "0"
+cache = None
+if project.getProperty("ccm.cache.xml")is not None:
+    cache = str(project.getProperty("ccm.cache.xml"))
+try:
+    database = project.getProperty('ccm.database')
+    
+    if project.getProperty('ccm.user.login') == None :
+        raise Exception("'ccm.user.login' property is not defined")
+        
+    username = project.getProperty('ccm.user.login')
+    
+    if project.getProperty('ccm.user.password') == None :
+        raise Exception("'ccm.user.password' property is not defined")
+        
+    password = project.getProperty('ccm.user.password')
+    
+    
+    engine = project.getProperty('ccm.engine.host')
+    dbpath = project.getProperty('ccm.database.path')
+    provider = ccm.extra.CachedSessionProvider(opener=nokia.nokiaccm.open_session, cache=cache)
+    if database != None:
+        session = provider.get(username, password, database=database, reuse=False)
+    else:
+        session = provider.get(username, password, engine, dbpath, reuse=False)
+    session.close()
+    provider.close()
+except Exception, e:
+    print "ERROR: %s" % e
+    if str(e).find("access denied") != -1:
+        result = "-2"
+    else:
+        result = "-1"
+self.log("Result: %s" % attributes.get('resultproperty'))
+project.setProperty(str(attributes.get('resultproperty')), str(result))
+        ]]>
+     </scriptdef>
+
+    <macrodef name="signalMacro" uri="http://www.nokia.com/helium">
+        <attribute name="logfile"/>
+        <attribute name="phase" default=""/>
+        <attribute name="signal.input" />
+        <attribute name="skip.count" default="false" />
+        <attribute name="result" default="not-set"/>
+        <sequential>
+            <var name="signal.errors.total" value="" unset="true"/>
+            <var name="base.signal.log.file" value="" unset="true"/>
+            <basename property="base.signal.log.file" file="@{logfile}"/>
+            <if>
+                <isfalse value="@{skip.count}" />
+                <then>
+                    <hlm:metadataCountSeverity severity="error" 
+                        log="@{logfile}"
+                        db="${metadata.dbfile}" property="signal.errors.total"/>
+                </then>
+                <else>
+                    <if>
+                        <equals arg1="@{result}" arg2="not-set"/>
+                        <then>
+                            <fail message="result parameter is missing for signa macro" />
+                        </then>
+                    </if>
+                    <var name="signal.errors.total" value="@{result}" />
+                </else>
+            </if>
+            <if>
+                <isset property="@{phase}.log.dir" />
+                <then>
+                    <var name="signal.log.dir" value="" unset="true"/>
+                    <property name="signal.log.dir" value="${@{phase}.log.dir}"/>
+                    <echo>signal.log.dir = ${signal.log.dir}</echo>
+                </then>
+                <else>
+                    <var name="signal.log.dir" value="" unset="true"/>
+                    <property name="signal.log.dir" value="${build.log.dir}"/>
+                </else>
+            </if>
+            <hlm:generateBuildStatus output-dir="${build.signal.status.dir}/" 
+                file="${base.signal.log.file}" />
+            <!-- signal for errors -->
+            <hlm:signal name="@{signal.input}" result="${signal.errors.total}" >
+                <signalNotifierInput>
+                    <signalInput refid="@{signal.input}" />
+                    <notifierInput>
+                        <fileset casesensitive="false" dir="${build.log.dir}" >
+                            <include name="**/${base.signal.log.file}*" />
+                        </fileset>
+                    </notifierInput>
+                </signalNotifierInput>
+            </hlm:signal>
+        </sequential>
+    </macrodef>
+
+    <!-- A simple test macro -->
+    <macrodef name="fooMacro" uri="http://www.nokia.com/helium">
+        <sequential>
+            <echo>foo</echo>
+            <runtarget target="hello"/>
+        </sequential>
+    </macrodef>
+    
+    
+    <!-- Asserts that two XML resources are logically equal.
+    
+    This looks at the XML content rather than just diffing the strings. -->
+    <scriptdef name="assertXmlEqual" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="control"/>
+        <attribute name="test"/>
+        <attribute name="failonerror"/>
+        <![CDATA[
+import logging
+
+import java.io
+import org.custommonkey.xmlunit
+
+control_id = str(attributes.get('control'))
+test_id = str(attributes.get('test'))
+
+control_resource = project.getReference(control_id)
+test_resource = project.getReference(test_id)
+control_reader = java.io.InputStreamReader(control_resource.getInputStream())
+test_reader = java.io.InputStreamReader(test_resource.getInputStream())
+
+org.custommonkey.xmlunit.XMLUnit.setIgnoreWhitespace(True)
+org.custommonkey.xmlunit.XMLUnit.setIgnoreComments(True)
+diff = org.custommonkey.xmlunit.Diff(control_reader, test_reader)
+detailed_diff = org.custommonkey.xmlunit.DetailedDiff(diff)
+differences = detailed_diff.getAllDifferences()
+print 'Differences total = ' + str(differences.size())
+for diff in differences.toArray():
+    print logging.warning(diff.toString())
+
+try:
+    control_reader = java.io.InputStreamReader(control_resource.getInputStream())
+    test_reader = java.io.InputStreamReader(test_resource.getInputStream())
+    org.custommonkey.xmlunit.XMLAssert.assertXMLEqual(control_reader, test_reader)
+    print 'XML is similar'
+except Exception, e:
+    print 'XML is NOT similar!'
+    failonerror = str(attributes.get('failonerror'))
+    if failonerror == 'true' or failonerror == 'None':
+        raise e
+        ]]>
+    </scriptdef>
+    
+    <!-- unsubst task, will unsubst a given drive. -->
+    <scriptdef name="unsubst" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="drive"/>
+        <attribute name="failonerror"/>
+""" internal.codescanner.drive """
+import fileutils
+self.setTaskName('unsubst')
+drive = attributes.get('drive')
+failonerror = attributes.get('failonerror')
+if (failonerror == None or str(failonerror) == "true"):
+    failonerror = True
+else:
+    failonerror = False
+if drive == None or len(str(drive)) != 2:
+    raise Exception("'drive' attribute is missing or invalid. " + str(drive))
+drive = str(drive)
+try:
+    self.log(str("Unsubsting %s..." % drive))
+    fileutils.unsubst(drive)
+except Exception, e:
+    if failonerror:
+        raise e
+    else:
+        self.log(str("Error: %s" % e))
+    </scriptdef>
+    
+    <!-- Touches the files in the paths given. -->
+    <scriptdef name="touch" language="jython" uri="http://www.nokia.com/helium">
+        <element name="path" type="path"/>
+        <![CDATA[
+import fileutils
+for id in range(elements.get("path").size()):
+    iterator = elements.get("path").get(int(id)).iterator()
+    while iterator.hasNext():
+        path = str(iterator.next())
+        fileutils.touch(path)
+        ]]>
+    </scriptdef>
+    
+</antlib>