diff --git a/README.md b/README.md index a5f1d7a..35e3740 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,39 @@ ## UN Code Generator It takes as input a PlantUML class diagram and outputs the JAVA classes that match it + + +///// + +Integrantes del grupo: Andres Plata 200177477 + +Pasos para Ejecutar: + + 1. descargar la extension ESLint + + 2. Click derecho en el archivo 'index.html' + + 3. Open With Live Server (Esto abrira una pestaña de google con la pagina) + + 4. ingresar como input el diagrama en PlantUML + + Ejemplo: (Todo dentro de @startuml y @enduml ) + @startuml + class Profesor { + +String nombre + } + + class Curso { + +String titulo + } + + Profesor --> "*" Curso + @enduml + + 5. Click en 'Generate Java Files' + + + + + + diff --git a/script.js b/script.js index 998df90..cc1fe05 100644 --- a/script.js +++ b/script.js @@ -1,25 +1,120 @@ -document.getElementById('generateBtn').addEventListener('click', function() { +document.getElementById('generateBtn').addEventListener('click', function () { const umlInput = document.getElementById('umlInput').value; - const classList = extractClasses(umlInput); + const classList = extractClassesAndRelations(umlInput); const classListElement = document.getElementById('classList'); - classListElement.innerHTML = ''; + classListElement.innerHTML = ''; // Limpia la lista previa - classList.forEach(className => { + classList.forEach(classData => { const listItem = document.createElement('li'); - listItem.textContent = className + '.java'; + + // Crear un elemento
 para mostrar el código Java
+        const pre = document.createElement('pre');
+        pre.textContent = generateJavaCode(classData);
+
+        listItem.appendChild(pre);
         classListElement.appendChild(listItem);
     });
 });
 
-function extractClasses(umlText) {
-    const classPattern = /class\s+([a-zA-Z0-9_]+)/g;
-    let classNames = [];
+function extractClassesAndRelations(umlText) {
+    const classPattern = /(?:abstract\s+)?class\s+([a-zA-Z0-9_]+)(?:\s+extends\s+([a-zA-Z0-9_]+))?\s*\{([\s\S]*?)\}/g;
+    const attributePattern = /([+|-])\s*([\w\*]+)\s+([\w]+)/g;
+    const methodPattern = /([+|-])\s*(void|[\w]+)\s+([\w]+)\(\s*\)/g;
+    const relationPattern = /([a-zA-Z0-9_]+)\s*(--|<\|-|-->|\*--|\|>)\s*"?([*0-9]+)?"?\s*([a-zA-Z0-9_]+)/g;
+
+    const classes = [];
     let match;
 
+    // Extraer clases
     while ((match = classPattern.exec(umlText)) !== null) {
-        classNames.push(match[1]);
+        const className = match[1];
+        const body = match[3] || '';
+        const isAbstract = umlText.includes(`abstract class ${className}`);
+        const attributes = [];
+        const methods = [];
+
+        // Extraer métodos
+        let methodMatch;
+        while ((methodMatch = methodPattern.exec(body)) !== null) {
+            methods.push({
+                visibility: methodMatch[1] === '-' ? 'private' : 'public',
+                returnType: methodMatch[2],
+                name: methodMatch[3]
+            });
+        }
+
+        // Extraer atributos
+        let attrMatch;
+        while ((attrMatch = attributePattern.exec(body)) !== null) {
+            const type = attrMatch[2].includes('*') ? attrMatch[2].replace('*', '[]') : attrMatch[2];
+            attributes.push({
+                visibility: attrMatch[1] === '-' ? 'private' : 'public',
+                name: attrMatch[3],
+                type: type
+            });
+        }
+
+        classes.push({
+            className,
+            isAbstract,
+            parentClass: null,
+            attributes,
+            methods
+        });
     }
 
-    return classNames;
+    // Extraer relaciones
+    let relationMatch;
+    while ((relationMatch = relationPattern.exec(umlText)) !== null) {
+        const classA = relationMatch[1];
+        const classB = relationMatch[4];
+        const cardinality = relationMatch[3];
+
+        if (cardinality === "*") {
+            const classData = classes.find(cls => cls.className === classA);
+            if (classData) {
+                classData.attributes.push({
+                    visibility: 'public',
+                    name: classB.toLowerCase(),
+                    type: `${classB}[]`
+                });
+            }
+        }
+    }
+
+    return classes;
+}
+
+function generateJavaCode(classData) {
+    let code = '';
+
+    // Si la clase es abstracta
+    if (classData.isAbstract) {
+        code += `public abstract class ${classData.className}`;
+    } else {
+        code += `public class ${classData.className}`;
+    }
+
+    // Si la clase tiene herencia
+    if (classData.parentClass) {
+        code += ` extends ${classData.parentClass}`;
+    }
+
+    code += ' {\n';
+
+    // Generar atributos
+    classData.attributes.forEach(attr => {
+        code += `    ${attr.visibility} ${attr.type} ${attr.name};\n`;
+    });
+
+    // Generar métodos
+    classData.methods.forEach(method => {
+        code += `    ${method.visibility} ${method.returnType} ${method.name}() {\n`;
+        code += `        // Implementación aqui\n`;
+        code += `    }\n`;
+    });
+
+    code += '}\n';
+    return code;
 }