buildframework/helium/tools/quality/validate-policy.ant.xml
changeset 1 be27ed110b50
child 179 d8ac696cc51f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/validate-policy.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : validate-policy.ant.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:
+
+============================================================================
+-->
+<project name="quality.validate-policy" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+    Policy file validation.
+    </description>
+
+    <property name="validate.policy.log" location="${build.log.dir}/${build.id}_validate-policy.summary.xml" />
+    <property name="validate.policy.log.xml" location="${build.log.dir}/${build.id}_validate-policy.log.xml" />
+    <property name="validate.policy.csv" location="${helium.dir}/tests/minibuilds/compile/distribution.policy.extended_for_sf.id_status.csv" />
+    <property name="validate.policy.ignoreroot" value="false" />
+    <property name="validate.policy.pattern" value="distribution.policy.s60,distribution.policy" />
+
+    <!-- Default path settings for policy validation. -->
+    <path id="reference.policy.path.list">
+        <pathelement path="${build.drive}/s60" />
+    </path>
+
+    <!--
+    This task scan the directory provided by the path element, and valitate the content of the 
+    Distribution.policy.S60 file using some default rules. IDs could also be validate using a CSV input file.
+    'ignoreroot' specifies to ignore the toplevel directory.
+    
+    e.g.
+    <pre>
+      <hlm:validatePolicyMacro output="${validate.policy.log}"
+          ids="${validate.policy.csv}"
+          ignoreroot="${validate.policy.ignoreroot}">
+          <path refid="reference.policy.path.list"/>
+      </hlm:validatePolicyMacro>
+    </pre>
+  -->
+    <scriptdef name="validatePolicyMacro" language="jython" uri="http://www.nokia.com/helium">
+        <attribute name="output" />
+        <attribute name="ignoreroot" />
+        <attribute name="ids" />
+        <attribute name="pattern" />
+        <element name="path" type="path" />
+        <![CDATA[
+import integration.quality
+import os
+ignoreroot = False
+if (attributes.get('ignoreroot') != None) and (str(attributes.get('ignoreroot')).lower() == "true"):
+    self.log("Ignoring root path.")
+    ignoreroot = True
+
+output = None
+if attributes.get('output') is not None:
+    self.log("Creating %s" % str(attributes.get('output')))
+    output = open(str(attributes.get('output')), "w+")
+    output.write("<?xml version=\"1.0\"?>\n<policyvalidation>\n")
+components_per_file = {}
+
+pattern = ['distribution.policy.s60']
+if attributes.get('pattern') != None:
+    pattern = str(attributes.get('pattern')).split(',')
+
+validator = integration.quality.PolicyValidator(pattern, ignoreroot=ignoreroot)
+
+if attributes.get('ids') is not None:
+    self.log("Loading policy ids from: %s" % str(attributes.get('ids')))
+    if not os.path.exists(str(attributes.get('ids'))):
+        self.log("ERROR: Could not find: %s" % str(attributes.get('ids')), project.MSG_ERR)
+    else:
+        for result in validator.load_policy_ids(str(attributes.get('ids'))):
+            self.log(str("%s: - %s - %s" % (result[0], result[1], result[2])), project.MSG_ERR)
+            if output is not None:
+                output.write("    <error type=\"%s\" message=\"%s\" value=\"%s\"/>\n" % (result[0], result[1], result[2]))
+
+for eid in range(elements.get("path").size()):
+    iterator = elements.get("path").get(int(eid)).iterator()
+    while iterator.hasNext():
+        path = str(iterator.next())
+        self.log("Scanning " + path)
+        for result in validator.validate(path):
+            self.log("%s: %s" % (result[0], result[1]), project.MSG_ERR)
+            if output is not None:
+                output.write("    <error type=\"%s\" message=\"%s\" value=\"%s\"/>\n" % (result[0], result[1], result[2]))
+    
+if output is not None:
+    output.write("</policyvalidation>\n")
+    output.close()
+    ]]>
+  </scriptdef>
+
+    <!--
+    Parse all the path defined by 'reference.policy.path.list' and check all policy files.
+    It generates an XML log defined by property 'validate.policy.log'.
+  -->
+    <target name="integration-validate-policy">
+        <mkdir dir="${build.log.dir}"/>
+        <hlm:validatePolicyMacro output="${validate.policy.log}" ids="${validate.policy.csv}" ignoreroot="${validate.policy.ignoreroot}" pattern="${validate.policy.pattern}">
+            <path refid="reference.policy.path.list" />
+        </hlm:validatePolicyMacro>
+        <hlm:metadatarecord database="${metadata.dbfile}">
+            <hlm:policymetadatainput>
+                <fileset casesensitive="false" file="${validate.policy.log}/" />
+            </hlm:policymetadatainput>
+        </hlm:metadatarecord>
+        <hlm:generateBuildStatus file="${build.id}_validate_policy.log" />
+    </target>
+
+    <!--
+    Render the policy validation xml file ('validate.policy.log') into an text output.
+  -->
+    <target name="render-validate-policy" depends="integration-validate-policy">
+        <if>
+            <not>
+                <istrue value="${metadata.enable}" />
+            </not>
+            <then>
+                <fmpp sourceFile="${helium.dir}/tools/common/templates/integration/validate-policy.log.ftl" outputFile="${build.log.dir}/${build.id}_validate-policy.log">
+                    <freemarkerLinks expandProperties="yes">
+                      macro: ${helium.dir}/tools/common/templates/macro
+                  </freemarkerLinks>
+                    <data expandProperties="yes">
+                      doc: xml(${validate.policy.log})
+                      ant: antProperties()
+                    </data>
+                </fmpp>
+                <fmpp sourceFile="${helium.dir}/tools/common/templates/integration/validate-policy.log.xml.ftl" outputFile="${validate.policy.log.xml}">
+                    <freemarkerLinks expandProperties="yes">
+                      macro: ${helium.dir}/tools/common/templates/macro
+                  </freemarkerLinks>
+                    <data expandProperties="yes">
+                      doc: xml(${validate.policy.log})
+                      ant: antProperties()
+                    </data>
+                </fmpp>
+            </then>
+            <else>
+                <!-- Todo: check and if required convert as metadata template -->
+            </else>
+        </if>
+    </target>
+
+    <!-- Target that will apply regular IDO validation rules on Helium. -->
+    <target name="validate-helium-policy">
+        <hlm:validatePolicyMacro>
+            <path>
+                <pathelement path="${helium.dir}/" />
+            </path>
+        </hlm:validatePolicyMacro>
+    </target>
+
+    <!--
+      Internal target that set an intermediate property to disable policy validation execution.
+    -->
+    <target name="ido-validate-policy-skip">
+        <if>
+            <istrue value="${skip.policy-validation}"/>
+            <then>
+                <property name="do.skip.policy-validation" value="1"/>
+            </then>
+        </if>
+    </target>
+    
+    <!-- Policy validation target for IDO. Only detected ADO will get scanned. -->    
+    <target name="ido-validate-policy" depends="ido-create-ado-mapping,ido-validate-policy-skip" unless="do.skip.policy-validation">
+        <hlm:iniKeys2Path ini="${ado.quality.mapping.file}" pathid="reference.policy.path.list"/>
+        <runtarget target="render-validate-policy" />
+    </target>
+
+</project>