/** * Turns any number of given classnames into a 'dia' diagram * * @param array classnames An array containing fully qualified class names * @param int recurse default 0 How many levels of recursion * @param bool depend default FALSE Include dependencies * @return org.dia.DiaDiagram */ public static function marshal($classnames, $recurse = 0, $depend = FALSE) { $I = DiaMarshaller::getInstance(); // initialize RootDoc $I->_root = new RootDoc(); // initialize DiaDiagram $I->_dia = new DiaDiagram(); $I->_dia->initialize(); $Layers = $I->_dia->getChildByType('DiaLayer'); $I->_layer = $Layers[0]; /* method 1: - loop over array of classnames - add classnames during recursion... method 2: - loop over array of classnames - recurse directly */ // initialize variables $I->_classes = array(); $I->_classnames = $classnames; reset($I->_classnames); // reset array // process given classes while ($name = current($I->_classnames)) { $I->_recurse($name, $recurse, $depend); next($I->_classnames); } /*foreach (array_values($I->_classnames) as $name) { //if (isset($this->_classes[$name])) continue; // already processed $I->_recurse($name, $recurse, $depend); }*/ Console::writeLine('Classes: ' . xp::stringOf(array_keys($I->_classes))); Console::writeLine('Dependencies: ' . xp::stringOf($I->_deps)); Console::writeLine('Implementations: ' . xp::stringOf($I->_imps)); Console::writeLine('Generalizations: ' . xp::stringOf($I->_gens)); // generate and add classes to DiaDiagram foreach (array_keys($I->_classes) as $classname) { try { $Dia_class = $I->_genClass($I->_classes[$classname]); } catch (IllegalArgumentException $e) { $e->printStackTrace(); exit(-1); } // save dia object-id by classname $I->_class_ids[$classname] = $Dia_class->getId(); // add to DiaDiagram $I->_layer->addObject($Dia_class); } //Console::writeLine('IDs: '.xp::stringOf($I->_class_ids)); // generate and add dependencies foreach (array_keys($I->_deps) as $from) { foreach ($I->_deps[$from] as $to) { // skip if there exists also a generalization or implementation if ($I->_gens[$from] === $to or in_array($to, $I->_imps[$from])) { // Console::writeLine("Skipping dependency: $from -> $to"); continue; } // add to DiaDiagram $I->_layer->addObject($I->_genDependency($from, $to)); } } // generate and add implementations foreach (array_keys($I->_imps) as $from) { foreach ($I->_imps[$from] as $to) { // skip if there exists also a generalization? if (in_array($to, $I->_gens[$from])) { // Console::writeLine("Skipping implementation: $from -> $to"); continue; } // add to DiaDiagram $I->_layer->addObject($I->_genImplemenation($from, $to)); } } // generate and add generalizations foreach (array_keys($I->_gens) as $from) { $to = $I->_gens[$from]; // Console::writeLine("Gen: $from -> $to..."); // add to DiaDiagram $I->_layer->addObject($I->_genGeneralization($from, $to)); } return $I->_dia; }