185 lines
6.6 KiB
Python
185 lines
6.6 KiB
Python
import glob
|
|
import os
|
|
import re
|
|
|
|
inside_class = False
|
|
file_class = None
|
|
read = False
|
|
|
|
#Make folder to run test
|
|
path='class'
|
|
file_uml = open("DotUML.txt","r")
|
|
content= file_uml.readlines()
|
|
|
|
if not os.path.exists(path):
|
|
os.mkdir(path)
|
|
|
|
os.chdir(os.getcwd()+'/'+path)
|
|
for filename in glob.glob('*.java'):
|
|
os.remove(filename)
|
|
|
|
#Check files if it exists
|
|
def check_file(path_file):
|
|
return os.path.exists(path_file)
|
|
|
|
# Modify text exists from from_ to to_
|
|
def modify(filepath, from_, to_):
|
|
file = open(filepath,"r+")
|
|
text = file.read()
|
|
pattern = from_
|
|
splitted_text = re.split(pattern,text)
|
|
modified_text = to_.join(splitted_text)
|
|
with open(filepath,'r+') as file:
|
|
file.write(modified_text)
|
|
|
|
#Add @OneToMany and @ManyToOne to 2 classes
|
|
|
|
def onetomany(class_one, class_many):
|
|
|
|
class_one_java = class_one + '.java'
|
|
class_many_java= class_many + '.java'
|
|
|
|
# Insert the needed line @OneToMany
|
|
mappedBy = class_one.lower()
|
|
classes = class_many.lower() + 's'
|
|
assertion = '\t @OneToMany (mappedBy= "' + mappedBy + '") \n'
|
|
assertion = assertion + '\t public Collection<'+class_many+'> ' +classes+'; \n'
|
|
overwrite('public class',assertion, class_one_java, class_one_java,1)
|
|
|
|
# Insert the needed line @ManyToOne
|
|
assertion = '\t @ManyToOne \n'
|
|
assertion = assertion + '\t public '+ class_one + ' '+ class_one.lower()+ '; \n'
|
|
overwrite('public class',assertion, class_many_java, class_many_java,1)
|
|
|
|
|
|
def onetoone(class_one, class_two):
|
|
|
|
class_one_java = class_one + '.java'
|
|
class_two_java= class_two + '.java'
|
|
|
|
class1 = class_one.lower()
|
|
class2 = class_two.lower()
|
|
|
|
assertion = '\t @OneToOne \n'
|
|
|
|
overwrite('public class',assertion+ '\t public '+class_two+' '+class2+ ' \n', class_one_java, class_one_java,1)
|
|
overwrite('public class', assertion+ '\t public '+class_one+' '+class1+ ' \n', class_two_java, class_two_java, 1)
|
|
|
|
# Actually not overwrite, it creates an output file but in our project, I need output and input are same file
|
|
#String: line need to insert
|
|
def overwrite(find,string, input, output,option):
|
|
with open(input,'r') as input_file:
|
|
lines = input_file.readlines()
|
|
match_line_index= next ((i for i,line in enumerate(lines) if find in line), None)
|
|
|
|
if match_line_index is not None:
|
|
with open(output,'w') as output:
|
|
if(option==1):
|
|
output.writelines(lines[:match_line_index + 1])
|
|
output.write(string)
|
|
output.writelines(lines[match_line_index + 1:])
|
|
elif(option==2):
|
|
output.write(string)
|
|
output.writelines(lines[:match_line_index + 1])
|
|
output.writelines(lines[match_line_index + 1:])
|
|
|
|
#Cut the files into lines
|
|
for line in content:
|
|
|
|
#skip first line
|
|
if "ClassDiagram" in line:
|
|
continue
|
|
|
|
#print(line)
|
|
split_line=line.split()
|
|
read=False
|
|
#Cut lines into pieces
|
|
print(split_line)
|
|
print(len(split_line))
|
|
|
|
#Check if it is a blank line
|
|
if ( len(split_line)==0 or '//' in line):
|
|
continue
|
|
else:
|
|
# check "class X {" line
|
|
if split_line[0]=='class' and len(split_line)==3 and split_line[2]=='{':
|
|
class_name = split_line[1]
|
|
class_java = class_name + '.java'
|
|
read = True
|
|
# Check if the Java file already exists
|
|
if check_file(class_java):
|
|
print(f"File {class_java} already exists.")
|
|
|
|
else:
|
|
# Create the Java file
|
|
file_class=open(class_java,'x')
|
|
file_class.write("@Entity \n")
|
|
file_class.write('public class '+class_name +' { \n')
|
|
inside_class = True
|
|
|
|
#Check type of variables
|
|
while (inside_class==True and read== False):
|
|
file_class.write("\n")
|
|
if(len(split_line)==3 and split_line[1]==":"):
|
|
name_var =split_line[0]
|
|
if (split_line[2]=="int"):
|
|
type_var="Integer"
|
|
elif (split_line[2]=="void"):
|
|
type_var="void"
|
|
else:
|
|
type_var=split_line[2].capitalize()
|
|
file_class.write("\t @Column \n")
|
|
if ("()" in name_var) or(type_var=="void"):
|
|
file_class.write(f"\t private {type_var} {name_var} {{}} \n")
|
|
else:
|
|
file_class.write(f"\t private {type_var} {name_var} ;\n")
|
|
read = True
|
|
if split_line[0]=='}' and len(split_line)==1:
|
|
inside_class= False
|
|
read = True
|
|
file_class.write("} \n")
|
|
file_class.close()
|
|
|
|
#Check extends "X -g-> Y"
|
|
while (inside_class==False and read==False):
|
|
if(len(split_line)==3 and split_line[1]=='-g->'):
|
|
class_name = split_line[0]
|
|
class_java = class_name+'.java'
|
|
class_heritage= split_line[2]
|
|
|
|
if check_file(class_java):
|
|
class_declaration= 'public class ' + class_name
|
|
modify(class_java,class_declaration,class_declaration+ " extends "+ class_heritage)
|
|
break
|
|
|
|
|
|
# Check condition A "B" -- "C" D ;
|
|
if (len(split_line) == 6 and split_line[2] == '--' and split_line[5]==';'):
|
|
num1= split_line[1]
|
|
num2= split_line[3]
|
|
if(split_line[1]=='"1"' and split_line[3]!='"1"'):
|
|
onetomany(split_line[0], split_line[4])
|
|
elif(split_line[3]=='"1"' and split_line[1]!='"1"'):
|
|
onetomany(split_line[4], split_line[0])
|
|
elif(split_line[3]=='"1"' and split_line[1]=='"1"'):
|
|
onetoone(split_line[0], split_line[4])
|
|
break
|
|
|
|
# Check extends "X "a" -c-> "1" Y" ;
|
|
if (len(split_line) == 6 and split_line[2] == '-c->'):
|
|
class_name = split_line[0]
|
|
class_java = class_name + '.java'
|
|
|
|
class_heritage = split_line[4]
|
|
class_heritage_java = class_heritage + '.java'
|
|
|
|
modify(class_java,'@Entity','@Embeddable')
|
|
|
|
embedded = '\t @Embedded \n'
|
|
if(split_line[1]=='"1"'):
|
|
embedded = embedded + '\t public '+class_heritage+ ' '+class_heritage.lower()+' ; \n'
|
|
overwrite('public class',embedded,class_heritage_java,class_heritage_java,1)
|
|
else:
|
|
embedded = embedded + '\t public Collection<' + class_name + '> ' + class_name.lower() + 's ; \n'
|
|
overwrite('public class', embedded, class_heritage_java, class_heritage_java, 1)
|
|
break |