1
+ #!/usr/bin/env python3
2
+ import os
3
+ import sys
4
+ import subprocess
5
+ import glob
6
+
7
+ class Extract :
8
+ def __init__ (self , db , srcroot ):
9
+ self .dbname = db
10
+ self .srcroot = srcroot
11
+
12
+ def init_database (self ):
13
+ p = subprocess .run (["codeql" , "database" , "init" , self .dbname , "-l" , "java" , "--source-root" , self .srcroot ])
14
+ if p .returncode == 0 :
15
+ self .dbpath = os .path .realpath (self .dbname )
16
+ print (f"[*extract_log*] dbpath : { self .dbpath } " )
17
+ else :
18
+ sys .exit (1 )
19
+
20
+
21
+ def init_env (self ):
22
+ codeql_path = subprocess .check_output (["which" , "codeql" ]).decode ()
23
+ codeql_home = os .path .dirname (codeql_path )
24
+ self .codeql_home = codeql_home
25
+ print (f"[*extract_log*] codeql_home : { codeql_home } " )
26
+ codeql_java_home = glob .glob (f"{ codeql_home } /tools/**/java" )[0 ]
27
+ self .codeql_java_home = codeql_java_home
28
+ print (f"[*extract_log*] codeql_java_home : { codeql_java_home } " )
29
+ env = {
30
+ "CODEQL_DIST" : codeql_home ,
31
+ "CODEQL_EXTRACTOR_JAVA_LOG_DIR" : f"{ self .dbpath } /log" ,
32
+ "CODEQL_EXTRACTOR_JAVA_ROOT" : f"{ codeql_home } /java" ,
33
+ "CODEQL_EXTRACTOR_JAVA_SOURCE_ARCHIVE_DIR" : f"{ self .dbpath } /src" ,
34
+ "CODEQL_EXTRACTOR_JAVA_TRAP_DIR" : f"{ self .dbpath } /trap/java" ,
35
+ "CODEQL_EXTRACTOR_JAVA_WIP_DATABASE" : self .dbpath ,
36
+ "CODEQL_JAVA_HOME" : codeql_java_home
37
+ }
38
+ for key in env :
39
+ print (f"{ key } ={ env [key ]} " )
40
+ return env
41
+
42
+ def generate_javacargs (self ):
43
+ javafiles = glob .glob (f"{ self .srcroot } /**/*.java" , recursive = True )
44
+ print (len (javafiles ))
45
+ with open (f"{ self .dbpath } /log/javac.args" , "w" ) as f :
46
+ f .write ("-Xprefer:source" + "\n " )
47
+ for javafile in javafiles :
48
+ #if "test" not in javafile:
49
+ f .write (javafile + "\n " )
50
+
51
+
52
+ def generate_trap (self ):
53
+ env = self .init_env ()
54
+ p = subprocess .run ([f"{ self .codeql_java_home } /bin/java" , "-Xmx1024M" , "-Xms256M" , "-cp" , f"{ self .codeql_home } /java/tools/semmle-extractor-java.jar" , "com.semmle.extractor.java.JavaExtractor" , "--javac-args" , f"@@@{ self .dbpath } /log/javac.args" ], env = env )
55
+
56
+ def import_trap (self ):
57
+ p = subprocess .run (["codeql" , "dataset" , "import" , f"{ self .dbpath } /db-java" , f"{ self .dbpath } /trap" , "-S" , f"{ self .codeql_home } /java/semmlecode.dbscheme" ])
58
+
59
+ def finalize (self ):
60
+ p = subprocess .run (["codeql" , "database" , "finalize" , self .dbpath ])
61
+
62
+ def run (self ):
63
+ self .init_database ()
64
+ self .generate_javacargs ()
65
+ self .generate_trap ()
66
+ # self.import_trap()
67
+ self .finalize ()
68
+
69
+
70
+ if __name__ == "__main__" :
71
+ extractor = Extract (sys .argv [1 ], sys .argv [2 ])
72
+ extractor .run ()
0 commit comments