public function close()
{
// Check for configured log file
if ($this->logFile === null) {
throw new NoLogOutputException($this);
}
$bias = 0.1;
$svg = new \DOMDocument('1.0', 'UTF-8');
$svg->loadXML(file_get_contents(dirname(__FILE__) . '/chart.svg'));
$layer = $svg->getElementById('jdepend.layer');
$bad = $svg->getElementById('jdepend.bad');
$bad->removeAttribute('xml:id');
$good = $svg->getElementById('jdepend.good');
$good->removeAttribute('xml:id');
$legendTemplate = $svg->getElementById('jdepend.legend');
$legendTemplate->removeAttribute('xml:id');
$max = 0;
$min = 0;
$items = array();
foreach ($this->code as $namespace) {
if (!$namespace->isUserDefined()) {
continue;
}
$metrics = $this->analyzer->getStats($namespace);
if (count($metrics) === 0) {
continue;
}
$size = $metrics['cc'] + $metrics['ac'];
if ($size > $max) {
$max = $size;
} elseif ($min === 0 || $size < $min) {
$min = $size;
}
$items[] = array('size' => $size, 'abstraction' => $metrics['a'], 'instability' => $metrics['i'], 'distance' => $metrics['d'], 'name' => Utf8Util::ensureEncoding($namespace->getName()));
}
$diff = ($max - $min) / 10;
// Sort items by size
usort($items, create_function('$a, $b', 'return ($a["size"] - $b["size"]);'));
foreach ($items as $item) {
if ($item['distance'] < $bias) {
$ellipse = $good->cloneNode(true);
} else {
$ellipse = $bad->cloneNode(true);
}
$r = 15;
if ($diff !== 0) {
$r = 5 + ($item['size'] - $min) / $diff;
}
$a = $r / 15;
$e = 50 - $r + $item['abstraction'] * 320;
$f = 20 - $r + 190 - $item['instability'] * 190;
$transform = "matrix({$a}, 0, 0, {$a}, {$e}, {$f})";
$ellipse->setAttribute('id', uniqid('pdepend_'));
$ellipse->setAttribute('title', $item['name']);
$ellipse->setAttribute('transform', $transform);
$layer->appendChild($ellipse);
$result = preg_match('#\\\\([^\\\\]+)$#', $item['name'], $found);
if ($result && count($found)) {
$angle = rand(0, 314) / 100 - 1.57;
$legend = $legendTemplate->cloneNode(true);
$legend->setAttribute('x', $e + $r * (1 + cos($angle)));
$legend->setAttribute('y', $f + $r * (1 + sin($angle)));
$legend->nodeValue = $found[1];
$legendTemplate->parentNode->appendChild($legend);
}
}
$bad->parentNode->removeChild($bad);
$good->parentNode->removeChild($good);
$legendTemplate->parentNode->removeChild($legendTemplate);
$temp = FileUtil::getSysTempDir();
$temp .= '/' . uniqid('pdepend_') . '.svg';
$svg->save($temp);
ImageConvert::convert($temp, $this->logFile);
// Remove temp file
unlink($temp);
}