build/buildutils/checkjava.py
author hgs
Mon, 04 Oct 2010 11:29:25 +0300
changeset 78 71ad690e91f5
permissions -rw-r--r--
v2.2.17_1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
78
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
     1
#
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
     2
# Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
     3
# All rights reserved.
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
     4
# This component and the accompanying materials are made available
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
     6
# which accompanies this distribution, and is available
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
     8
#
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
     9
# Initial Contributors:
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    11
#
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    12
# Contributors:
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    13
#
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    14
# Description: Check Java source code for inconsistencies. Includes following checks
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    15
#              - is package defined and matching with file path
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    16
#
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    17
#! /usr/bin/python
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    18
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    19
import os, fnmatch, re, sys
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    20
from optparse import OptionParser
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    21
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    22
RE_PACKAGE = re.compile(r"package\s+([\w.]+)\s*;")
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    23
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    24
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    25
def getPackage(f):
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    26
    ''' Return the package of Java source file, or None if not defined '''
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    27
    fin = file(f, "r")
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    28
    for l in fin.readlines():
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    29
        match = RE_PACKAGE.search(l)
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    30
        if match:
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    31
            return match.group(1)
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    32
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    33
    return None
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    34
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    35
def checkPackage(f, package):
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    36
    ''' Check if package is correct in file path. Return True if incorrect. '''
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    37
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    38
    if not package:
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    39
        print "%s(0): error: no package defined" % f
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    40
        return True
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    41
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    42
    dir = os.path.dirname(f).replace("\\", "/")
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    43
    if not dir.endswith(package.replace(".", "/")):
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    44
        print "%s(0): error: package \"%s\" does not match filepath" % (f, package)
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    45
        return True
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    46
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    47
    return False
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    48
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    49
def checkHierarchy(root, exclude = None):
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    50
    failures = False
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    51
    for path, dirs, files in os.walk(root):
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    52
        if exclude and exclude in path.replace("\\", "/").split("/"):
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    53
            continue
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    54
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    55
        filenames = [os.path.join(path, f) for f in fnmatch.filter(files, "*.java")]
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    56
        for f in filenames:
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    57
            result = checkPackage(f, getPackage(f))
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    58
            failures = failures or result
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    59
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    60
    return failures
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    61
        
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    62
def main():
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    63
    parser = OptionParser()
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    64
    parser.add_option("--exclude", dest = "exclude", 
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    65
                      help = "Exclude paths having this directory component, e.g. tsrc")
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    66
    (options, args) = parser.parse_args()
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    67
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    68
    failures = False
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    69
    for root in args:
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    70
        failures = failures or checkHierarchy(root, options.exclude)
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    71
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    72
    sys.exit(failures and 1 or 0)
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    73
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    74
if __name__ == "__main__":
71ad690e91f5 v2.2.17_1
hgs
parents:
diff changeset
    75
    main()