setDescription('Import Entities to Btm.') // the full command description shown when running the command with // the "--help" option ->setHelp('This command allows you to convert Import existing structure.'); } protected function execute(InputInterface $input, OutputInterface $output) { $output->writeln([ 'Import converter', '============================', '', ]); $btm = 'ErModel.btm'; $folderentity = 'src/Entity'; $btmdata = []; $ermapping = []; $width=100; $height=100; foreach (glob($folderentity . "/*.php") as $nombre_fichero) { $tokenize = explode('/', $nombre_fichero); $clase = preg_replace('/\\.[^.\\s]{3,4}$/', '', end($tokenize)); $reader = new Reader(); $ref = new ReflectionClass('App\Entity\\' . $clase); $this->parseClass($reader, $ref, $ermapping, $btmdata, $width, $height); } foreach (glob($folderentity . "/*.php") as $nombre_fichero) { $tokenize = explode('/', $nombre_fichero); $clase = preg_replace('/\\.[^.\\s]{3,4}$/', '', end($tokenize)); $reader = new Reader(); $ref = new ReflectionClass('App\Entity\\' . $clase); $this->parseRelations($reader, $ref, $ermapping, $btmdata); } file_put_contents($btm, json_encode($btmdata)); return 0; } protected function parseClass(Reader $reader, ReflectionClass $ref, array &$ermapping, array &$btmdata,&$width, &$height) { if ($reader->getClassAnnotation($ref, 'Doctrine\ORM\Mapping\Entity')) { $entity = new \stdClass(); $entity->type = 'TableShape'; $entity->cssClass = 'TableShape'; $entity->stroke = 1; $entity->radius = 3; $entity->alpha = 1; $entity->angle = 0; $entity->id = md5($ref->getName()); $entity->name = $ref->getName(); $entity->userData = new \stdClass(); $ermapping[base64_encode($entity->name)] = []; $ermapping[base64_encode($entity->name)]['uuid'] = md5($ref->getName()); foreach ($ref->getProperties() as $property) { $ermapping[base64_encode($entity->name)][$property->getName()] = []; } $entity->entities = []; $entity->ports = []; foreach ($ref->getProperties() as $field) { $id = $reader->getPropertyAnnotation($field, 'Doctrine\ORM\Mapping\Id'); $column = $reader->getPropertyAnnotation($field, 'Doctrine\ORM\Mapping\Column'); $autoincrement = $reader->getPropertyAnnotation($field, 'Doctrine\ORM\Mapping\GeneratedValue'); //$reader->getClassAnnotation($ref, 'Doctrine\ORM\Mapping\Entity'); $fieldid = md5($field->getName()); $fieldid =$field->getName(); $ermapping[base64_encode($entity->name)][$fieldid[0]] = []; $inputport = new \stdClass(); $inputport->type = 'draw2d.InputPort'; $inputport->port = 'draw2d.InputPort'; $inputport->name = 'input_' . $fieldid; $inputport->id = 'input_' . $fieldid; $inputport->userData = new \stdClass(); $inputport->width = 10; $inputport->height = 10; $inputport->alpha = 1; $inputport->angle = 0; $inputport->cssClass = 'draw2d_InputPort'; $inputport->bgColor = "#4F6870"; $inputport->color = "#1B1B1B"; $inputport->locator = "draw2d.layout.locator.InputPortLocator"; $inputport->stroke = 1; $inputport->dasharray = null; $inputport->maxFanOut = 9007199254740991; $ermapping[base64_encode($entity->name)][$fieldid]['inputport'] = $inputport->id; $outputport = new \stdClass(); $outputport->type = 'draw2d.OutputPort'; $outputport->port = 'draw2d.OutputPort'; $outputport->name = 'output_' . $fieldid; $outputport->id = 'output_' . $fieldid; $outputport->userData = new \stdClass(); $outputport->width = 10; $outputport->height = 10; $outputport->alpha = 1; $outputport->angle = 0; $outputport->cssClass = 'draw2d_OutputPort'; $outputport->bgColor = "#4F6870"; $outputport->color = "#1B1B1B"; $outputport->locator = "draw2d.layout.locator.OutputPortLocator"; $outputport->stroke = 1; $outputport->dasharray = null; $outputport->maxFanOut = 9007199254740991; echo "\nentityname==>$entity->name\n"; $ermapping[base64_encode($entity->name)][$fieldid]['outputport'] = $outputport->id; if ($column) { $entityfield = new \stdClass(); $entityfield->text = $field->getName(); $entityfield->id = $fieldid; $entityfield->primary = ($id) ? ["true"] : ["false"]; $entityfield->type = ($column->type) ? $column->type : 'string'; $entityfield->required = ($column->nullable) ? ["false"] : ["true"]; $entityfield->unique = ["false"]; $entityfield->unsigned = ["false"]; $entityfield->auto = ($autoincrement) ? ["true"] : ["false"]; $entity->ports[] = $inputport; $entity->ports[] = $outputport; $entity->entities[] = $entityfield; $entity->bgColor="#FFFFFF"; $entity->color="#D2D2D2"; $width=$width+100; $entity->x=$width; $entity->y=$height; $entity->width=202; $entity->height=115; }else{ //relation $entityfield = new \stdClass(); $entityfield->text = $field->getName(); $entityfield->id = $fieldid; // $entityfield->primary = ($id) ? ["true"] : ["false"]; // $entityfield->type = ($column->type) ? $column->type : 'string'; // $entityfield->required = ($column->nullable) ? ["false"] : ["true"]; // $entityfield->unique = ["false"]; // $entityfield->unsigned = ["false"]; // $entityfield->auto = ($autoincrement) ? ["true"] : ["false"]; $entity->ports[] = $inputport; $entity->ports[] = $outputport; $entity->entities[] = $entityfield; $entity->bgColor="#FFFFFF"; $entity->color="#000000"; $width=$width+100; $entity->x=$width; $entity->y=$height; $entity->width=202; $entity->height=115; } } } $btmdata[] = $entity; } protected function parseRelations(Reader $reader, ReflectionClass $ref, array &$ermapping, array &$btmdata) { echo 'inicia relaciones'; if ($reader->getClassAnnotation($ref, 'Doctrine\ORM\Mapping\Entity')) { foreach ($ref->getProperties() as $field) { echo 'inicia properties '.$ref->getName(); echo print_r($reader->getPropertyAnnotations($field)); $relation = false; $targetEntity = null; $relationtype = 0; $onetoone = $reader->getPropertyAnnotation($field, 'Doctrine\ORM\Mapping\OneToOne'); $onetomany = $reader->getPropertyAnnotation($field, 'Doctrine\ORM\Mapping\OneToMany'); $manytoone = $reader->getPropertyAnnotation($field, 'Doctrine\ORM\Mapping\ManyToOne'); $manytomany = $reader->getPropertyAnnotation($field, 'Doctrine\ORM\Mapping\ManyToMany'); if ($onetoone) { $relation = true; $relationtype = 1; $targetEntity = $onetoone->targetEntity; } elseif ($onetomany) { $relation = true; $relationtype = 2; $targetEntity = $onetomany->targetEntity; } elseif ($manytoone) { $relation = true; $relationtype = 3; $targetEntity = $manytoone->targetEntity; } elseif ($manytomany) { $relation = true; $relationtype = 4; $targetEntity = $manytomany->targetEntity; } // Metemos las relaciones if ($relation) { echo 'hay una relacion de tipo ->'.$relationtype.' con '.$targetEntity; $connection = new \stdClass(); $connection->type = 'draw2d.Connection'; $connection->id = md5(md5($ref->getName()) . $targetEntity); $connection->cssClass = 'draw2d_Connection'; $connection->policy = "draw2d.policy.line.OrthogonalSelectionFeedbackPolicy"; $connection->router = "draw2d.layout.connection.InteractiveManhattanConnectionRouter"; $connection->source = new \stdClass(); $connection->target = new \stdClass(); $join = $reader->getPropertyAnnotation($field, 'Doctrine\ORM\Mapping\JoinColumn'); $jointable = $reader->getPropertyAnnotation($field, 'Doctrine\ORM\Mapping\JoinTable'); if ($jointable) { if (empty($jointable->name)) { $jointable->name = strtolower($ref->getName() . '_' . $targetEntity); } $entity = new \stdClass(); $entity->type = 'TableShape'; $entity->cssClass = 'TableShape'; $entity->stroke = 1; $entity->radius = 3; $entity->alpha = 1; $entity->angle = 0; $entity->id = md5($jointable->name); $entity->name = $jointable->name; $entity->userData = new \stdClass(); $ermapping[base64_encode($entity->name)] = []; $ermapping[base64_encode($entity->name)]['uuid'] = md5($jointable->name); $entity->entities = []; $entity->ports = []; } $fieldfrom = md5($field->getName()); $fieldfrom = $field->getName(); switch ($relationtype) { case 1: if($onetoone->mappedBy){ $fieldto = $onetoone->mappedBy; }elseif($join->referencedColumnName){ $fieldto =$join->referencedColumnName; }else{ $fieldto ='id'; } $connection->source->decoration = "draw2d.decoration.connection.BarDecorator"; $connection->target->decoration = "draw2d.decoration.connection.BarDecorator"; $connection->color = '#00A8F0'; break; case 2: $fieldto = $onetomany->mappedBy; $connection->source->decoration = "draw2d.decoration.connection.BarDecorator"; $connection->target->decoration = "draw2d.decoration.connection.DiamondDecorator"; $connection->color = '#b9dd69'; break; case 3: $fieldto = $manytoone->inversedBy; $connection->source->decoration = "draw2d.decoration.connection.DiamondDecorator"; $connection->target->decoration = "draw2d.decoration.connection.BarDecorator"; $connection->color = '#b9dd69'; break; case 4: $fieldto = $jointable->referencedColumnName; $connection->source->decoration = "draw2d.decoration.connection.DiamondDecorator"; $connection->target->decoration = "draw2d.decoration.connection.DiamondDecorator"; $connection->color = '#f3546a'; break; default: break; } $from = $ref->getName(); echo "\nentitynameconnection==>$targetEntity\n"; $to ='App\Entity\\'.$targetEntity; if(empty($ermapping[base64_encode($to)]))continue; $connection->source->node = $ermapping[base64_encode($from)]['uuid']; // $connection->source->port=$ermapping[base64_encode($from)][$fieldfrom]=array(); $connection->source->port = $ermapping[base64_encode($from)][$fieldfrom]['inputport']; $connection->target = new \stdClass(); echo "\n\n\n Fieldto ===>".$fieldto."\n\n"; $connection->target->node = $ermapping[base64_encode($to)]['uuid']; //$connection->target->port = $ermapping[base64_encode($to)][md5($fieldto)]['outputport']; $connection->target->port = $ermapping[base64_encode($to)][$fieldto]['outputport']; echo 'aƱadimos relacion'; $btmdata[] = $connection; } } } } }