[comment
Copyright (c) 2009 Mia-Software and others.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v2.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/epl-v20.html

Contributors:
     Gregoire DUPE (Mia-Software) - initial API and implementation
	     Gregoire Dupe (Mia-Software) - Bug 346087 - Regression of the report of the Java discoverer benchmark
/]

[module htmlReport('http://www.eclipse.org/MoDisco/JavaBenchmark/0.9.0/javaBenchmark', 'http://www.eclipse.org/MoDisco/Benchmark/0.9.0/benchmark')/]

[template public htmlReport(b : MultiProjectBenchmark)]
	
	[comment @main /]
	[file ('report.html', false)]
<html>
<title>MoDisco Java Discover Benchmark - [b.projects->at(1).name/]</title>
<body>
<h1>MoDisco Java Discover Benchmark - [b.projects->at(1).name/]</h1>
<p>Maximum Java heap size = [b.jvmMaxHeapInMiB/] MiB<p>
<p>Java project name = [b.projects->at(1).name/]</p>

<h2>Summary</h2>
  <table border="1">
    <tr>
       <th></th>
       <th>Total discovery time (mn)</th>
       <th>Save time (mn)</th>
       <th>Maximum used memory</th>
       <th>Initialization time (mn)</th>
     </tr>
     [for (project : DiscoveredProject | b.projects)]
     [for (discovery : Discovery | project.discoveries)]
      <tr>
        <td><a href="#[discovery.name/]">[getName(discovery)/]</a></td>
        <td>[discovery.totalExecutionTimeInSeconds/]</td>
        <td>[discovery.saveTimeInSeconds/]</td>
        <td>[discovery.maxUsedMemoryInBytes/]</td>
        <td>[if (discovery.oclIsKindOf(CDODiscovery))]
	        [let cdoDiscovery: CDODiscovery = discovery.oclAsType(CDODiscovery)]
			  [cdoDiscovery.initTimeInSeconds/]
	        [/let]
	     [/if]</td>
     </tr>    
     [/for]	
     [/for]
</table>
[for (project : DiscoveredProject | b.projects)]
[for (discovery : Discovery |project.discoveries )]
	<h2><a name="[discovery.name/]"/>[getName(discovery)/]</h2>
	<table>
	  <tr>
	    <td>
	       <p>
	          <a href="[discovery.name/].png">
	          <img height="300" src="[discovery.name/].png"/>
	          </a>
	       </p>
	     </td>
	     <td>
	     <h3>Discovery properties</h3>
	     total execution time (mn) = [discovery.totalExecutionTimeInSeconds/]<br/>
	     save time (mn) = [discovery.saveTimeInSeconds/]<br/>
	     algo variant = [if (discovery.algorithmVariant<>null)][discovery.algorithmVariant/][/if]<br/>
	     meta-model variant = [if (discovery.metaModelVariant<>null)][discovery.metaModelVariant/][/if]<br/>
	     dicoverer class name = [discovery.discovererClassName/]<br/>
	     maximum used memory = [discovery.maxUsedMemoryInBytes/]<br/>
	     [if (discovery.oclIsKindOf(CDODiscovery))]
	        [let cdoConf: CDODiscovery = discovery.oclAsType(CDODiscovery)]
	     <h3>CDO properties</h3>
	     CDO version = [cdoConf.version/]<br/>
	     revised LRU capacity = [cdoConf.revisedLruCapacity/]<br/>
	     cache type = [cdoConf.cacheType/]<br/>
	     server description = [cdoConf.serverDescription/]<br/>
	     current LRU capacity = [cdoConf.currentLruCapacity/]<br/>
	     comment database initialisation time = __cdoConf.initTime/__<br/>
	        [/let]
	     [/if]
	     </td>
	   </tr>
	</table>
[/for]
[/for]
<hr/>
<p>This report has been generated with <a href="http://www.eclipse.org/gmt/modisco/">MoDisco</a> Java Discoverer Benchmark.</p>
</body></html>
	[/file]
[/template]

[template public getName(discovery : Discovery)]
[if (discovery.oclIsKindOf(CDODiscovery))]CDO[/if]
[if (discovery.algorithmVariant<>null)] [discovery.algorithmVariant/][/if]
[if (discovery.metaModelVariant<>null)] [discovery.metaModelVariant/][/if]
[if (discovery.oclIsKindOf(CDODiscovery))] [let cdoConf: CDODiscovery = discovery.oclAsType(CDODiscovery)]([cdoConf.serverDescription/])[/let][/if]  
[/template]