def process_file(in_fh, skip): content = in_fh.read().split('\n') activities = [] edges = [] count = 0 for line in content: # TODO: fix this, it is messy if(len(line) < 1): continue # TODO: fix this, it is messy line = line.split(gc.MESSY_SPLIT_TOKEN)[1] if not skip and len(line) > 1: activity_line = re.match(gc.ACTIVITY_REGEX, line) edge_line = re.match(gc.EDGE_REGEX, line) if activity_line: activities.append(activity_line.group(1)) elif edge_line: edges.append([gu.clean_line(edge_line.group(1)), gu.clean_line(edge_line.group(3))]) else: if not line.startswith(gc.NOPARSE): gu.tprint('WARNING line %d malformed. %s' % (count, line)) else: if '-->' not in line: activities.append(line) else: edge_line_skip = re.match(gc.SKIP_NODE_REGEX, line) if edge_line_skip: edges.append([edge_line_skip.group(1), edge_line_skip.group(2)]) else: gu.tprint('WARNING line %d malformed. %s' % (count, line)) count += 1 return [activities, edges]
def render(self): self.fh.write('}\n') self.fh.close() # Verbose if self.verbose: command = ['neato', self.file_name, '-v', '-Tsvg', '-o %s.svg' % self.file_name] else: command = ['neato', self.file_name, '-Tsvg', '-o %s.svg' % self.file_name] gu.tprint('Calling: %s' % ' '.join(command)) sp = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) for line in iter(sp.stdout.readline, ''): sys.stdout.write(line)
def add_edge(self, edge): if edge[0] not in self.nodes.keys(): if self.verbose: gu.tprint('verbose --> WARNING (from) node \'%s\' does not exist. skipping.' % edge[0]) elif edge[1] not in self.nodes.keys(): if self.verbose: gu.tprint('verbose --> WARNING (to) node \'%s\' does not exist. skipping.' % edge[1]) else: line = '%s -> %s' % (self.nodes[edge[0]], self.nodes[edge[1]]) if line not in self.edges: self.edges.append(line) self.fh.write('\t%s;\n' % line)
def check_results(input_file): fh = open(input_file, "r+") edges = process_file_checker(fh) fh.close() for edge in edges: edge[1] = edge[1].replace(".", os.sep) for edge in edges: filename = edge[0] + ".jimple" if os.path.isfile(os.path.join(gc.DEFAULT_SOOT_OUTPUT, filename)): # thanks stack overflow! # http://stackoverflow.com/a/4944929 f = open(os.path.join(gc.DEFAULT_SOOT_OUTPUT, filename)) s = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) if not s.find(edge[1]) != -1: gu.tprint("Edge: %s --> %s does not exist" % (edge[0], edge[1])) return False f.close() return True
def add_node(self, class_name, skip): if class_name not in self.nodes: if not skip: name_match = re.match(gc.NAME_REGEX, class_name) if name_match: short_name = name_match.group(1) self.nodes[class_name] = short_name self.fh.write('\t%s [label=\"%s\"];\n' % (short_name, short_name)) else: gu.tprint('ERROR name \'%s\' is malformed. skipping' % class_name) else: name_match = re.match(gc.SKIP_NODE_ADD_REGEX, class_name) if name_match: short_name = name_match.group(1) self.nodes[class_name] = short_name self.fh.write('\t%s [label=\"%s\"];\n' % (short_name, short_name)) else: gu.tprint('ERROR name \'%s\' is malformed. skipping' % class_name)
def main(input_file, output_name, verbose, skip, maxiter, epsilon): if skip: in_fh = open(input_file, 'r') nodes, edges = process_file(in_fh, skip) in_fh.close() gen_dot_file(nodes, edges, output_name, verbose, skip, maxiter, epsilon) elif checker.check_results(input_file): gu.tprint('Checker Passed!') gu.tprint('Input File: %s' % input_file) in_fh = open(input_file, 'r') activities, edges = process_file(in_fh, skip) in_fh.close() gen_dot_file(activities, edges, output_name, verbose, skip, maxiter, epsilon) else: gu.tprint('Checker Failed.')