bajapro/online-compiler/lib/java_runner.py
2025-06-07 16:18:13 +07:00

145 lines
4.8 KiB
Python

import os
import re
import subprocess
from lib.FileCreator import FileCreator
class JavaRunner:
__main_directory = "java_files/"
filename = str
test_filename = str
def __init__(self, user_directory, code):
self.user_directory = self.get_user_dir(user_directory)
self.code = code
def get_user_dir(self, user_mail):
replace_at = re.sub('@+', "_", user_mail)
replace_dot = re.sub('\.', "_", replace_at)
return replace_dot
def check_and_create_dir(self):
directory_name = "{}/{}".format(self.__main_directory, self.user_directory)
dir_is_exist = os.path.isdir(directory_name)
if not dir_is_exist:
os.mkdir(directory_name)
def create_file(self):
class_regx = r'(?<=class )\w+'
file = re.search(class_regx, self.code)
filename = file.group(0)
self.filename = filename
self.test_filename = "JUnit{}Test".format(filename)
try:
pack_name = "{}".format(self.user_directory)
fc = FileCreator(filename=self.filename, package_name=pack_name, user_dir=self.user_directory,
code=self.code)
fc.create_file()
fc.create_test_file()
except OSError as e:
print(e)
finally:
return self.compile_file()
def compile_file(self):
compile_command = "javac java_files/{}/{}.java".format(self.user_directory, self.filename)
try:
output = subprocess.run(compile_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except subprocess.CalledProcessError as err:
output = err
print(output)
return output
def run_file(self):
# windows
run_command = "cd java_files && java --version && java -cp .;{0}/{1} {0}.{1}".format(self.user_directory, self.filename)
# linux
# run_command = "cd java_files && java --version && java -cp .:{0}/{1} {0}.{1}".format(self.user_directory, self.filename)
try:
output = subprocess.run(run_command, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
except subprocess.CalledProcessError as err:
output = err
finally:
os.remove("java_files/{}/{}.class".format(self.user_directory, self.filename))
print(output)
return output
def run_test(self):
junit_file = "lib/junit-4.13.2.jar"
hamcrest_file = "lib/hamcrest-core-1.3.jar"
#windows
run_compile_test = "cd java_files && javac -cp .;{0};{1} {2}/{3}.java".\
format(junit_file, hamcrest_file, self.user_directory, self.test_filename)
run_test_command = "cd java_files && java -cp .;{0};{1};{2}/{3} org.junit.runner.JUnitCore {2}.{3}".\
format(junit_file, hamcrest_file, self.user_directory, self.test_filename) #
#linux
# run_compile_test = "cd java_files && javac -cp .:{0}:{1} {2}/{3}.java".\
# format(junit_file, hamcrest_file, self.user_directory, self.test_filename)
# run_test_command = "cd java_files && java -cp .:{0}:{1}:{2}/{3} org.junit.runner.JUnitCore {2}.{3}".\
# format(junit_file, hamcrest_file, self.user_directory, self.test_filename) #
try:
output = subprocess.run(run_compile_test, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except subprocess.CalledProcessError as err:
output = err
print(output)
try:
output = subprocess.run(run_test_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except subprocess.CalledProcessError as err:
output = err
print(output)
return output
def run(self):
self.check_and_create_dir()
create_n_compile = self.create_file()
if create_n_compile.returncode == 1:
return {"java": create_n_compile.stderr.decode("utf-8"), "test_output": "TEST FAILED!"}
final_output = self.run_file()
test_output = None
point = 0
if final_output.returncode == 1:
java = final_output.stderr.decode("utf-8")
else:
java = final_output.stdout.decode("utf-8")
o = self.run_test()
if o.returncode == 0:
test_output = o.stdout.decode("utf-8")
matcher = r'(OK \(\d+ test\))'
ok_matcher = re.compile(matcher)
res = ok_matcher.search(test_output)
# add point of found OK (<int> test)
point = len(res.groups()) * 10
else:
test_output = o.stderr.decode("utf-8") or o.stdout.decode("utf-8")
output = {
"java": java,
"test_output": test_output,
"point": point
}
return output