java hw2
unknown
java
a year ago
10 kB
9
Indexable
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class App { public static void main(String[] args) { if (args.length == 0) { System.err.println("Please input mermaid file name"); } else { // Get input String fileName = args[0]; String mermaidCode = readMermaidCodeFromFile(fileName); List<String> classCodes = Parser.splitByClass(mermaidCode); for (String classCode : classCodes) { // Extract class name String className = extractClassName(classCode); if (className == null) { System.err.println("Error: Class name not found in input"); continue; } // Write class code to file writeToFile(className + ".java", transformMermaidToJava(classCode)); } } } private static String transformMermaidToJava(String classCode) { StringBuilder javaCode = new StringBuilder(); // Split the class diagram code by lines String[] lines = classCode.split("\n"); // Loop through each line to process each class for (String line : lines) { // Trim the line line = line.trim(); // If the line starts with "class", it defines a new class if (line.startsWith("class ")) { // Extract the class name String className = line.substring(6).trim(); List<String> attributes = new ArrayList<>(); List<String> methods = new ArrayList<>(); // Loop through the remaining lines to process attributes and methods of the class for (String nextLine : lines) { // Skip if it's not related to the current class if (!nextLine.startsWith(className)) { continue; } // Trim the line nextLine = nextLine.trim(); // If the line contains attribute or method definitions if (nextLine.contains(":")) { // Split the line by colon to separate attribute/method name and visibility String[] parts = nextLine.split(":"); // Trim attribute/method name and visibility String declaration = parts[1].trim(); String visibility = declaration.substring(0, 1); // If it's an attribute if (visibility.equals("-")) { // Add the attribute to the list methods.add(generatePrivateMethod(attributes.add(declaration))); } // If it's a method else if (visibility.equals("+")) { // Extract the return type and method name int returnTypeEndIndex = declaration.lastIndexOf(" "); String methodName = declaration.substring(1, returnTypeEndIndex).trim(); String returnType = ""; if (returnTypeEndIndex > 1) { returnType = declaration.substring(1, returnTypeEndIndex).trim(); } if (methodName.contains("(") && methodName.contains(")")) { // Extract parameters int parametersStartIndex = methodName.indexOf("("); int parametersEndIndex = methodName.indexOf(")"); String parametersString = methodName.substring(parametersStartIndex + 1, parametersEndIndex); String[] parameters = parametersString.split(","); if (parameters.length > 1){ // Generate method with multiple parameters methods.add(generateMethodWithParameters(returnType, methodName, parameters, declaration)); } } // Add the method to the list with correct method signature and body if (methodName.startsWith("get")) { methods.add(generateGetterMethodSignature(returnType, methodName, declaration)); } else if (methodName.startsWith("set")) { methods.add(generateSetterMethodSignature(returnType, methodName,declaration)); } else { methods.add(generateMethodSignature(returnType, methodName, declaration)); } } } } // Generate Java code for the current class javaCode.append("public class ").append(className).append(" {\n"); // Generate method declarations for (String method : methods) { javaCode.append(" ").append(method).append("\n"); } javaCode.append("}"); } } return javaCode.toString(); } private static String generatePrivateMethod(String attribute) { return "private " + attribute.substring(1) + ";\n"; } private static String generateGetterMethodSignature(String returnType, String methodName, String declaration) { StringBuilder methodSignature = new StringBuilder(); // Extract method return type returnType = extractReturnType(declaration); methodSignature.append("public ").append(returnType).append(" ").append(methodName).append(" {\n"); methodSignature.append(" return ").append(methodName.substring(3,methodName.indexOf("(")).toLowerCase()).append(";\n"); methodSignature.append(" }"); return methodSignature.toString(); } private static String generateSetterMethodSignature(String returnType, String methodName, String declaration) { StringBuilder methodSignature = new StringBuilder(); // Extract method parameter type returnType = extractReturnType(declaration); String parameter = methodName.substring(3, methodName.indexOf("(")).toLowerCase(); // Append method signature with parameter methodSignature.append("public ").append(returnType).append(" ").append(methodName).append(" {\n"); methodSignature.append(" this.").append(parameter).append(" = ").append(parameter).append(";\n"); methodSignature.append(" }"); return methodSignature.toString(); } private static String generateMethodSignature(String returnType, String methodName, String declaration) { StringBuilder methodSignature = new StringBuilder(); // Extract method return type returnType = extractReturnType(declaration); methodSignature.append("public ").append(returnType).append(" ").append(methodName); methodSignature.append(" {"); if (returnType.equals("boolean")) { methodSignature.append("return false;"); } else if (returnType.equals("void")) { methodSignature.append(";"); } else { methodSignature.append("return 0;"); } methodSignature.append("}"); return methodSignature.toString(); } private static String generateMethodWithParameters(String returnType, String methodName, String[] parameters, String declaration) { StringBuilder methodSignature = new StringBuilder(); // Extract method return type returnType = extractReturnType(declaration); methodSignature.append("public ").append(returnType).append(" ").append(methodName); methodSignature.append(" {"); if (returnType.equals("boolean")) { methodSignature.append("return false;"); } else { methodSignature.append("return 0;"); } methodSignature.append("}"); return methodSignature.toString(); } // Helper method to extract the return type from method declaration private static String extractReturnType(String declaration) { String[] parts = declaration.split(" "); return parts[parts.length - 1]; // The last word represents the return type } private static String readMermaidCodeFromFile(String fileName) { StringBuilder mermaidCode = new StringBuilder(); try (FileReader fileReader = new FileReader(fileName)) { char[] buffer = new char[1024]; int length; while ((length = fileReader.read(buffer)) > 0) { mermaidCode.append(buffer, 0, length); } } catch (IOException e) { System.err.println("Error reading file: " + e.getMessage()); } return mermaidCode.toString(); } private static String extractClassName(String classCode) { int startIndex = classCode.indexOf("class "); if (startIndex == -1) { return null; } startIndex += 6; // Skip "class " substring int endIndex = classCode.indexOf("\n", startIndex); if (endIndex == -1) { return null; } return classCode.substring(startIndex, endIndex).trim(); } private static void writeToFile(String fileName, String classCode) { try (FileWriter fileWriter = new FileWriter(fileName)) { fileWriter.write(classCode); } catch (IOException e) { System.err.println("Error writing file: " + e.getMessage()); } } }
Editor is loading...
Leave a Comment