diff -r c7c26511138f -r 7c4a911dc066 buildframework/helium/sf/java/legacy/src/com/nokia/ant/BuildStatusDef.java --- a/buildframework/helium/sf/java/legacy/src/com/nokia/ant/BuildStatusDef.java Wed Jun 16 16:51:40 2010 +0300 +++ b/buildframework/helium/sf/java/legacy/src/com/nokia/ant/BuildStatusDef.java Fri Aug 13 14:59:05 2010 +0300 @@ -1,23 +1,22 @@ /* -* Copyright (c) 2007-2008 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: -* -*/ - + * Copyright (c) 2007-2008 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 com.nokia.ant; - import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -31,48 +30,47 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.Target; +import org.apache.tools.ant.types.DataType; import org.dom4j.Comment; import org.dom4j.Document; +import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.Visitor; import org.dom4j.VisitorSupport; import org.dom4j.io.SAXReader; -import org.dom4j.DocumentException; -import com.nokia.helium.core.ant.types.HlmPostDefImpl; - +import com.nokia.helium.ant.data.PropertyCommentMeta; import com.nokia.helium.ant.data.PropertyMeta; - +import com.nokia.helium.core.ant.PostBuildAction; /** * Class to store the status of the signal of a particular target. */ -public class BuildStatusDef extends HlmPostDefImpl -{ +public class BuildStatusDef extends DataType implements PostBuildAction { + private static final String DEPRECATED = "deprecated:"; private HashSet output = new HashSet(); - - - public void execute(Project prj, String module, String[] targetNames) - { - //Run after targets execute so dynamic target names are resolved - for (int i = 0; i < targetNames.length; i++) - { + + @Override + public void executeOnPostBuild(Project project, String[] targetNames) { + // Run after targets execute so dynamic target names are resolved + for (int i = 0; i < targetNames.length; i++) { String[] array = { targetNames[i] }; Target target = findTarget(targetNames[i], getProject(), array); targetCallsHeliumTarget(target, getProject()); } checkTargetsProperties(getProject()); - - if (!output.isEmpty()) - { + checkDeprecatedProperties(getProject()); + + if (!output.isEmpty()) { log("*** Configuration report ***", Project.MSG_INFO); - for (String outputStr : output) + for (String outputStr : output) { log(outputStr, Project.MSG_INFO); + } } } - - /** + + /** * @param desiredTarget * Target name to search * @param project @@ -82,8 +80,8 @@ * */ @SuppressWarnings("unchecked") - public Target findTarget(String desiredTarget, Project project, String[] targetNames) - { + public Target findTarget(String desiredTarget, Project project, + String[] targetNames) { Hashtable targets; Vector sorted; @@ -94,100 +92,102 @@ sorted = project.topoSort(targetNames[0], targets); // Find the desiredTarget Target object - for (Target target : sorted) - { - if (target.getName().equals(desiredTarget)) - { + for (Target target : sorted) { + if (target.getName().equals(desiredTarget)) { return target; } } - throw new BuildException("Could not find target matching " + desiredTarget + "\n"); + throw new BuildException("Could not find target matching " + + desiredTarget + "\n"); } - - /** - * If a target defined outside helium are calling a private Helium target then print warning + + /** + * If a target defined outside helium are calling a private Helium target + * then print warning * */ @SuppressWarnings("unchecked") - public void targetCallsHeliumTarget(Target target, Project project) - { + public void targetCallsHeliumTarget(Target target, Project project) { String location = target.getLocation().getFileName(); - + try { - String heliumpath = new File(project.getProperty("helium.dir")).getCanonicalPath(); + String heliumpath = new File(project.getProperty("helium.dir")) + .getCanonicalPath(); String targetpath = new File(location).getCanonicalPath(); - - if (!targetpath.contains(heliumpath)) - { + + if (!targetpath.contains(heliumpath)) { ArrayList antcallTargets = new ArrayList(); - Visitor visitorTarget = new AntTargetVisitor(antcallTargets, project); - + Visitor visitorTarget = new AntTargetVisitor(antcallTargets, + project); + Element element = findTargetElement(target, project); - if (element != null) + if (element != null) { element.accept(visitorTarget); - for (String depTargetString : antcallTargets) - { + } + for (String depTargetString : antcallTargets) { String[] array = { depTargetString }; try { - Target depTarget = findTarget(depTargetString, project, array); - targetCallsHeliumTarget(depTarget, project); - } catch (BuildException x) { - // We are Ignoring the errors as no need to fail the build. - log("Exception occured while target defined outside helium are calling a private Helium target " + x.toString(), Project.MSG_DEBUG); + Target depTarget = findTarget(depTargetString, project, + array); + targetCallsHeliumTarget(depTarget, project); + } catch (BuildException x) { + // We are Ignoring the errors as no need to fail the + // build. + log( + "Exception occured while target defined outside helium are calling a private Helium target " + + x.toString(), Project.MSG_DEBUG); x = null; - } + } } - - - for (Enumeration depsEnum = target.getDependencies(); depsEnum.hasMoreElements();) - { + + for (Enumeration depsEnum = target.getDependencies(); depsEnum + .hasMoreElements();) { String depTargetString = depsEnum.nextElement(); String[] array = { depTargetString }; try { - Target depTarget = findTarget(depTargetString, project, array); - targetCallsHeliumTarget(depTarget, project); + Target depTarget = findTarget(depTargetString, project, + array); + targetCallsHeliumTarget(depTarget, project); } catch (BuildException x) { - //We are Ignoring the errors as no need to fail the build. - log("Exception occured while target defined outside helium are calling a private Helium target " + x.toString(), Project.MSG_DEBUG); + // We are Ignoring the errors as no need to fail the + // build. + log( + "Exception occured while target defined outside helium are calling a private Helium target " + + x.toString(), Project.MSG_DEBUG); x = null; - } + } } - } - else - { + } else { checkIfTargetPrivate(target, project); } } catch (IOException e) { - //We are Ignoring the errors as no need to fail the build. - log("IOException occured while target defined outside helium are calling a private Helium target " + e.getMessage(), Project.MSG_DEBUG); + // We are Ignoring the errors as no need to fail the build. + log( + "IOException occured while target defined outside helium are calling a private Helium target " + + e.getMessage(), Project.MSG_DEBUG); e.printStackTrace(); } } - private class AntTargetVisitor extends VisitorSupport - { + private class AntTargetVisitor extends VisitorSupport { private List targetList; private Project project; - public AntTargetVisitor(List targetList, Project project) - { + public AntTargetVisitor(List targetList, Project project) { this.targetList = targetList; this.project = project; } - public void visit(Element node) - { + public void visit(Element node) { String name = node.getName(); - if (name.equals("antcall") || name.equals("runtarget")) - { + if (name.equals("antcall") || name.equals("runtarget")) { String text = node.attributeValue("target"); extractTarget(text); } } - private void extractTarget(String text) - { + private void extractTarget(String text) { String iText = project.replaceProperties(text); targetList.add(iText); } @@ -197,134 +197,224 @@ /** * Find the xml Element for the target * - */ + */ @SuppressWarnings("unchecked") - public Element findTargetElement(Target target, Project project) - { + public Element findTargetElement(Target target, Project project) { SAXReader xmlReader = new SAXReader(); - + Document antDoc = null; - + String location = target.getLocation().getFileName(); - + try { File file = new File(location); antDoc = xmlReader.read(file); } catch (DocumentException e) { // We are Ignoring the errors as no need to fail the build. - log("Not able read the XML file. " + e.getMessage(), Project.MSG_WARN); + log("Not able read the XML file. " + e.getMessage(), + Project.MSG_WARN); } - + String projectName = antDoc.valueOf("/project/@name"); - for (Iterator iterator = antDoc.selectNodes("//target").iterator(); iterator.hasNext();) - { + for (Iterator iterator = antDoc.selectNodes("//target") + .iterator(); iterator.hasNext();) { Element element = iterator.next(); String targetName = element.attributeValue("name"); - if (targetName.equals(target.getName()) || (projectName + "." + targetName).equals(target.getName())) + if (targetName.equals(target.getName()) + || (projectName + "." + targetName) + .equals(target.getName())) { return element; + } } return null; } - - /** + + /** * If target has comment that says it is private them print warning * */ @SuppressWarnings("unchecked") - public void checkIfTargetPrivate(Target target, Project project) - { + public void checkIfTargetPrivate(Target target, Project project) { Element targetElement = findTargetElement(target, project); - if (targetElement != null) - { - List children = targetElement.selectNodes("preceding-sibling::node()"); - if (children.size() > 0) - { + if (targetElement != null) { + List children = targetElement + .selectNodes("preceding-sibling::node()"); + if (children.size() > 0) { // Scan past the text nodes, which are most likely whitespace int index = children.size() - 1; Node child = children.get(index); - while (index > 0 && child.getNodeType() == Node.TEXT_NODE) - { + while (index > 0 && child.getNodeType() == Node.TEXT_NODE) { index--; child = (Node) children.get(index); } - + // Check if there is a comment node String commentText = null; - if (child.getNodeType() == Node.COMMENT_NODE) - { + if (child.getNodeType() == Node.COMMENT_NODE) { Comment macroComment = (Comment) child; commentText = macroComment.getStringValue().trim(); - //log(macroName + " comment: " + commentText, Project.MSG_DEBUG); + // log(macroName + " comment: " + commentText, + // Project.MSG_DEBUG); } - - if (commentText != null) - { - if (commentText.contains("Private:")) - { - output.add("Warning: " + target.getName() + " is private and should only be called by helium"); + + if (commentText != null) { + if (commentText.contains("Private:")) { + output + .add("Warning: " + + target.getName() + + " is private and should only be called by helium"); } - if (commentText.contains("")) - { - output.add("Warning: " + target.getName() + "\n" + commentText); + if (commentText.contains("")) { + output.add("Warning: " + target.getName() + "\n" + + commentText); } } } } } - - @SuppressWarnings("unchecked") - public void checkTargetsProperties(Project project) - { + + /** + * To check, is the private properties are overridden by customers. + * + * @param project + */ + public void checkTargetsProperties(Project project) { try { - String heliumpath = new File(project.getProperty("helium.dir")).getCanonicalPath(); - com.nokia.helium.ant.data.Database db = new com.nokia.helium.ant.data.Database(project, "private"); + String heliumpath = new File(project.getProperty("helium.dir")) + .getCanonicalPath(); + com.nokia.helium.ant.data.Database db = new com.nokia.helium.ant.data.Database( + project, "private"); ArrayList customerProps = getCustomerProperties(project); - - for (PropertyMeta propertyMeta : db.getProperties()) - { - if (propertyMeta.getLocation().contains(heliumpath) && propertyMeta.getScope().equals("private") && customerProps.contains(propertyMeta.getName())) + + for (PropertyMeta propertyMeta : db.getProperties()) { + if (propertyMeta.getType().equals("boolean")) + { + String value = project.getProperty(propertyMeta.getName()); + if (value != null && !value.equals("true") && !value.equals("false")) + { + output.add("Warning: " + propertyMeta.getName() + " property is boolean type and not set to true or false, value is " + value); + } + } + } + for (PropertyCommentMeta propertyMeta : db.getCommentProperties()) { + if (propertyMeta.getType().equals("boolean")) { - output.add("Warning: " + propertyMeta.getName() + " property has been overridden"); + String value = project.getProperty(propertyMeta.getName()); + if (value != null && !value.equals("true") && !value.equals("false")) + { + output.add("Warning: " + propertyMeta.getName() + " property is boolean type and not set to true or false, value is " + value); + } + } + } + for (PropertyMeta propertyMeta : db.getProperties()) { + if (propertyMeta.getLocation().contains(heliumpath) + && propertyMeta.getScope().equals("private") + && customerProps.contains(propertyMeta.getName())) { + output.add("Warning: " + propertyMeta.getName() + + " property has been overridden"); + } + } + + for (PropertyCommentMeta propertyCommentMeta : db.getCommentProperties()) { + if (propertyCommentMeta.getLocation().contains(heliumpath) + && propertyCommentMeta.getScope().equals("private") + && customerProps + .contains(propertyCommentMeta.getName())) { + output.add("Warning: " + propertyCommentMeta.getName() + + " property has been overridden"); } } - } catch (IOException e) { e.printStackTrace(); } + } catch (IOException e) { + e.printStackTrace(); + } } - + + /** + * To display the warnings for deprecated properties. + * + * @param project + */ + public void checkDeprecatedProperties(Project project) { + try { + String heliumpath = new File(project.getProperty("helium.dir")) + .getCanonicalPath(); + com.nokia.helium.ant.data.Database db = new com.nokia.helium.ant.data.Database( + project, "private"); + ArrayList customerProps = getCustomerProperties(project); + + for (PropertyMeta propertyMeta : db.getProperties()) { + if (propertyMeta.getLocation().contains(heliumpath) + && (!propertyMeta.getDeprecated().equals("")) + && customerProps.contains(propertyMeta.getName())) { + output.add("Warning: " + + propertyMeta.getName() + + " property has been deprecated " + + propertyMeta.getDeprecated() + + "." + + propertyMeta.getSummary().substring( + propertyMeta.getSummary().lastIndexOf( + DEPRECATED) + + DEPRECATED.length())); + } + } + + for (PropertyCommentMeta propertyCommentMeta : db + .getCommentProperties()) { + if (propertyCommentMeta.getLocation().contains(heliumpath) + && (!propertyCommentMeta.getDeprecated().equals("")) + && customerProps + .contains(propertyCommentMeta.getName())) { + output.add("Warning: " + + propertyCommentMeta.getName() + + " property has been deprecated " + + propertyCommentMeta.getDeprecated() + + "." + + propertyCommentMeta.getSummary().substring( + propertyCommentMeta.getSummary() + .lastIndexOf(DEPRECATED) + + DEPRECATED.length())); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + @SuppressWarnings("unchecked") - public ArrayList getCustomerProperties(Project project) - { + public ArrayList getCustomerProperties(Project project) { ArrayList props = new ArrayList(); Database db = new Database(null, null, null); try { - String heliumpath = new File(project.getProperty("helium.dir")).getCanonicalPath(); + String heliumpath = new File(project.getProperty("helium.dir")) + .getCanonicalPath(); - for (Object object : db.getAntFiles(project)) - { - String antFile = (String)object; + for (Object object : db.getAntFiles(project)) { + String antFile = (String) object; antFile = new File(antFile).getCanonicalPath(); - if (!antFile.contains(heliumpath)) - { + if (!antFile.contains(heliumpath)) { SAXReader xmlReader = new SAXReader(); Document antDoc = xmlReader.read(new File(antFile)); - - List propertyNodes = antDoc.selectNodes("//property | //param"); - for (Element propertyNode : propertyNodes) - { + + List propertyNodes = antDoc + .selectNodes("//property | //param"); + for (Element propertyNode : propertyNodes) { props.add(propertyNode.attributeValue("name")); } } } } catch (IOException e) { // We are Ignoring the errors as no need to fail the build. - log("IOException: Not able read the Customer Properties " + e.getMessage(), Project.MSG_WARN); + log("IOException: Not able read the Customer Properties " + + e.getMessage(), Project.MSG_WARN); } catch (DocumentException e) { // We are Ignoring the errors as no need to fail the build. - log("DocumentException: Not able read the Customer Properties " + e.getMessage(), Project.MSG_WARN); + log("DocumentException: Not able read the Customer Properties " + + e.getMessage(), Project.MSG_WARN); } - + return props; } - + } \ No newline at end of file