Skip to content

Trabajo Terminado | Andres Plata #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -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'






115 changes: 105 additions & 10 deletions script.js
Original file line number Diff line number Diff line change
@@ -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 <pre> 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;
}