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