build/buildutils/checkjava.py
changeset 78 71ad690e91f5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/build/buildutils/checkjava.py	Mon Oct 04 11:29:25 2010 +0300
@@ -0,0 +1,75 @@
+#
+# Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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: Check Java source code for inconsistencies. Includes following checks
+#              - is package defined and matching with file path
+#
+#! /usr/bin/python
+
+import os, fnmatch, re, sys
+from optparse import OptionParser
+
+RE_PACKAGE = re.compile(r"package\s+([\w.]+)\s*;")
+
+
+def getPackage(f):
+    ''' Return the package of Java source file, or None if not defined '''
+    fin = file(f, "r")
+    for l in fin.readlines():
+        match = RE_PACKAGE.search(l)
+        if match:
+            return match.group(1)
+
+    return None
+
+def checkPackage(f, package):
+    ''' Check if package is correct in file path. Return True if incorrect. '''
+
+    if not package:
+        print "%s(0): error: no package defined" % f
+        return True
+
+    dir = os.path.dirname(f).replace("\\", "/")
+    if not dir.endswith(package.replace(".", "/")):
+        print "%s(0): error: package \"%s\" does not match filepath" % (f, package)
+        return True
+
+    return False
+
+def checkHierarchy(root, exclude = None):
+    failures = False
+    for path, dirs, files in os.walk(root):
+        if exclude and exclude in path.replace("\\", "/").split("/"):
+            continue
+
+        filenames = [os.path.join(path, f) for f in fnmatch.filter(files, "*.java")]
+        for f in filenames:
+            result = checkPackage(f, getPackage(f))
+            failures = failures or result
+
+    return failures
+        
+def main():
+    parser = OptionParser()
+    parser.add_option("--exclude", dest = "exclude", 
+                      help = "Exclude paths having this directory component, e.g. tsrc")
+    (options, args) = parser.parse_args()
+
+    failures = False
+    for root in args:
+        failures = failures or checkHierarchy(root, options.exclude)
+
+    sys.exit(failures and 1 or 0)
+
+if __name__ == "__main__":
+    main()