Bug 482857 - Discoverer Benchmark Report : wrong namespaces
diff --git a/org.eclipse.modisco.infra.discovery.benchmark.core/META-INF/MANIFEST.MF b/org.eclipse.modisco.infra.discovery.benchmark.core/META-INF/MANIFEST.MF
index 376df88..3a9443e 100644
--- a/org.eclipse.modisco.infra.discovery.benchmark.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.modisco.infra.discovery.benchmark.core/META-INF/MANIFEST.MF
@@ -23,5 +23,6 @@
org.eclipse.modisco.utils.chart.metamodel;bundle-version="0.10.0"
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.modisco.infra.discovery.benchmark.core.internal.exported;x-friends:="org.eclipse.modisco.infra.discovery.benchmark.ui"
+Export-Package: org.eclipse.modisco.infra.discovery.benchmark.core.internal.exported;x-friends:="org.eclipse.modisco.infra.discovery.benchmark.ui",
+ org.eclipse.modisco.infra.discovery.benchmark.core.internal.reporting.internal;x-internal:=true
diff --git a/org.eclipse.modisco.infra.discovery.benchmark.core/src/org/eclipse/modisco/infra/discovery/benchmark/core/internal/impl/DiscovererBenchmarkDiscoverer.java b/org.eclipse.modisco.infra.discovery.benchmark.core/src/org/eclipse/modisco/infra/discovery/benchmark/core/internal/impl/DiscovererBenchmarkDiscoverer.java
index 407b7ee..b33630d 100644
--- a/org.eclipse.modisco.infra.discovery.benchmark.core/src/org/eclipse/modisco/infra/discovery/benchmark/core/internal/impl/DiscovererBenchmarkDiscoverer.java
+++ b/org.eclipse.modisco.infra.discovery.benchmark.core/src/org/eclipse/modisco/infra/discovery/benchmark/core/internal/impl/DiscovererBenchmarkDiscoverer.java
@@ -1,11 +1,15 @@
/*******************************************************************************
- * Copyright (c) 2012 INRIA. All rights reserved. This program and the
+ * Copyright (c) 2012, 2015 INRIA, and Mia-Software.
+ *
+ * All rights reserved. This program and the
* accompanying materials are made available under the terms of the Eclipse
* Public License v1.0 which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
- * Contributors: Guillaume Doux - INRIA - Initial API and implementation
- *
+ * Contributors:
+ * Guillaume Doux (INRIA) - Initial API and implementation
+ * Grégoire Dupé (Mia-Software) - Bug 482672 - Benchmark command line interface
+ * Grégoire Dupé (Mia-Software) - Bug 482857 - Discoverer Benchmark Report : wrong namespaces
******************************************************************************/
package org.eclipse.modisco.infra.discovery.benchmark.core.internal.impl;
@@ -26,6 +30,8 @@
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -34,6 +40,8 @@
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EPackage.Registry;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
@@ -50,6 +58,7 @@
import org.eclipse.modisco.infra.discovery.benchmark.core.internal.reporting.internal.BenchmarkChartGeneration;
import org.eclipse.modisco.infra.discovery.benchmark.metamodel.internal.benchmark.Benchmark;
import org.eclipse.modisco.infra.discovery.benchmark.metamodel.internal.benchmark.BenchmarkFactory;
+import org.eclipse.modisco.infra.discovery.benchmark.metamodel.internal.benchmark.BenchmarkPackage;
import org.eclipse.modisco.infra.discovery.benchmark.metamodel.internal.benchmark.Discovery;
import org.eclipse.modisco.infra.discovery.benchmark.metamodel.internal.benchmark.DiscoveryIteration;
import org.eclipse.modisco.infra.discovery.benchmark.metamodel.internal.benchmark.EndEvent;
@@ -181,9 +190,9 @@
setLaunchParameter(disco, discoverer);
String serializationLocation;
if (discoverer.getTargetURI() != null) {
- serializationLocation = discoverer.getTargetURI().trimFileExtension().toPlatformString(false);
+ serializationLocation = discoverer.getTargetURI().trimFileExtension().toString();
} else {
- serializationLocation = this.getTargetURI().trimFileExtension().toPlatformString(false);
+ serializationLocation = this.getTargetURI().trimFileExtension().toString();
}
for (int i = 1; i <= this.iterations; i++) {
URI resultSerializationLocation = URI.createURI(serializationLocation);
@@ -194,28 +203,31 @@
if (IEventNotifier.class.isInstance(discoverer)) {
((IEventNotifier) discoverer).addListener(this.recorder);
}
-
progressMonitor.subTask("Project discovery: iteration " + String.valueOf(getIterations()));
this.recorder.start();
-
try {
if (discoverer.isApplicableTo(project)) {
IProgressMonitor subProgressMonitor = new SubProgressMonitor(progressMonitor, EIGHT);
discoverer.discoverElement(project, subProgressMonitor);
} else {
- MoDiscoLogger.logWarning("Discoverer " + discovererId + " is not applicable on project " + project.getName(),
- org.eclipse.modisco.infra.discovery.benchmark.core.internal.Activator.getDefault());
+ final String message = String.format(
+ "Discoverer '%s' is not applicable on project '%s'", //$NON-NLS-1$
+ discovererId,
+ project.getName()
+ );
+ MoDiscoLogger.logWarning(
+ message, Activator.getDefault());
}
- } catch (DiscoveryException e) {
+ } catch (Exception e) {
failure = true;
discoveryErrors.append(e.getStackTrace().toString());
+ final String message = String.format(
+ "Benchmark of discoverer '%s' fails on project '%s'", //$NON-NLS-1$
+ discovererId,
+ project.getName()
+ );
MoDiscoLogger.logError(e,
- "Benchmark of discoverer " + discovererId + " fails on project" + project.getName(), org.eclipse.modisco.infra.discovery.benchmark.core.internal.Activator.getDefault()); //$NON-NLS-1$
- } catch (ClassCastException e) {
- failure = true;
- discoveryErrors.append(e.getStackTrace().toString());
- MoDiscoLogger.logError(e,
- "Benchmark of discoverer " + discovererId + " fails on project" + project.getName(), org.eclipse.modisco.infra.discovery.benchmark.core.internal.Activator.getDefault()); //$NON-NLS-1$
+ message, Activator.getDefault());
}
this.recorder.stop();
this.events.addAll(this.recorder.getEvents());
@@ -229,9 +241,7 @@
discoveryIteration.setDiscoveryErrors(discoveryErrors.toString());
}
disco.getIterations().add(discoveryIteration);
-
}
-
postDiscoveryDiscoInit(disco, discoverer);
if (this.isTargetSerializationChosen()) {
try {
@@ -285,7 +295,7 @@
size++;
}
} else {
- MoDiscoLogger.logWarning("Unable to compute the number of element of an unexisting model", Activator.getDefault());
+ MoDiscoLogger.logWarning("Unable to compute the number of element of an unexisting model: "+targetModel.getURI().toString(), Activator.getDefault());
}
return size;
}
@@ -306,34 +316,48 @@
targetURI = this.getTargetURI();
}
if (targetURI == null) {
- MoDiscoLogger.logWarning("The HTML_REPORT_LOCATION or the TARGET_URI parameter should not be null", Activator.getDefault());
+ MoDiscoLogger.logWarning(
+ "The HTML_REPORT_LOCATION or the TARGET_URI parameter should not be null", //$NON-NLS-1$
+ Activator.getDefault());
return;
}
- IContainer location = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(targetURI.path().replace("/resource", ""))).getParent();
- String locationString = "";
- if (targetURI == this.getTargetURI()) {
- locationString = ResourcesPlugin.getWorkspace().getRoot().getLocation().toString()
- + targetURI.trimSegments(1).toString().replace("platform:/resource", "") + "/HTMLReport";
+ final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ final IWorkspaceRoot wsRoot = workspace.getRoot();
+ java.io.File file = null;
+ IFile iFile = null;
+ String targetUriStr = targetURI.toString();
+ if (targetURI.isPlatformResource()) {
+ final String pathStr =
+ targetUriStr.replaceAll("platform:/resource", ""); //$NON-NLS-1$//$NON-NLS-2$
+ iFile = wsRoot.getFile(new Path(pathStr));
+ iFile.getLocation().toFile();
+ } else if (targetURI.isFile()) {
+ file = new java.io.File(java.net.URI.create(targetUriStr));
} else {
- locationString = ResourcesPlugin.getWorkspace().getRoot().getLocation().toString()
- + targetURI.toString().replace("platform:/resource", "");
+ final String message = String.format(
+ "The following target URI '%s' is not managed. 'platform:/resource' or 'file:/' are expected.", //$NON-NLS-1$
+ targetURI.toString());
+ throw new IllegalArgumentException(message);
}
- java.net.URI uri = java.net.URI.create(locationString);
- java.io.File file = new java.io.File(uri.toString());
-
- ArrayList<Object> arguments = new ArrayList<Object>();
+ final ArrayList<Object> arguments = new ArrayList<Object>();
//Generation of the HTML report
try {
HtmlReport report = new HtmlReport(benchmark, file, arguments);
report.doGenerate(null);
} catch (Exception e) {
- MoDiscoLogger.logWarning(e, "Acceleo exception", org.eclipse.modisco.infra.discovery.benchmark.core.internal.Activator.getDefault());
+ MoDiscoLogger.logWarning(e,
+ "Acceleo exception", //$NON-NLS-1$
+ Activator.getDefault());
}
//Generation of the charts
- BenchmarkChartGeneration chartGenerator = new BenchmarkChartGeneration(file, this.measureMemoryUse);
+ final BenchmarkChartGeneration chartGenerator =
+ new BenchmarkChartGeneration(file, this.measureMemoryUse);
chartGenerator.generateAll(benchmark);
- location.refreshLocal(IResource.DEPTH_INFINITE, progressMonitor);
+ if (iFile != null) {
+ final IContainer location = iFile.getParent();
+ location.refreshLocal(IResource.DEPTH_INFINITE, progressMonitor);
+ }
}
/**
diff --git a/org.eclipse.modisco.infra.discovery.benchmark.core/src/org/eclipse/modisco/infra/discovery/benchmark/core/internal/reporting/HtmlReport.java b/org.eclipse.modisco.infra.discovery.benchmark.core/src/org/eclipse/modisco/infra/discovery/benchmark/core/internal/reporting/HtmlReport.java
index 79c9b89..6b4507e 100644
--- a/org.eclipse.modisco.infra.discovery.benchmark.core/src/org/eclipse/modisco/infra/discovery/benchmark/core/internal/reporting/HtmlReport.java
+++ b/org.eclipse.modisco.infra.discovery.benchmark.core/src/org/eclipse/modisco/infra/discovery/benchmark/core/internal/reporting/HtmlReport.java
@@ -8,6 +8,7 @@
* Contributors:
* Obeo - initial API and implementation
* Guillaume Doux - INRIA
+ * Grégoire Dupé (Mia-Software) - Bug 482857 - Discoverer Benchmark Report : wrong namespaces
*******************************************************************************/
package org.eclipse.modisco.infra.discovery.benchmark.core.internal.reporting;
@@ -36,7 +37,7 @@
*
* @generated
*/
- public static final String MODULE_FILE_NAME = "/org/eclipse/modisco/infra/discovery/benchmark/reporting/HtmlReport";
+ public static final String MODULE_FILE_NAME = "/org/eclipse/modisco/infra/discovery/benchmark/core/internal/reporting/HtmlReport";
/**
* The name of the templates that are to be generated.
@@ -130,6 +131,13 @@
List<String> arguments = new ArrayList<String>();
/*
+ * If you want to change the content of this method, do NOT forget to change the "@generated"
+ * tag in the Javadoc of this method to "@generated NOT". Without this new tag, any compilation
+ * of the Acceleo module with the main template that has caused the creation of this class will
+ * revert your modifications.
+ */
+
+ /*
* Add in this list all the arguments used by the starting point of the generation
* If your main template is called on an element of your model and a String, you can
* add in "arguments" this "String" attribute.
@@ -139,14 +147,12 @@
/*
* Add the properties from the launch arguments.
- * If you want to programmatically add new arguments, add them in "propertiesFiles"
+ * If you want to programmatically add new properties, add them in "propertiesFiles"
* You can add the absolute path of a properties files, or even a project relative path.
* If you want to add another "protocol" for your properties files, please override
* "getPropertiesLoaderService(AcceleoService)" in order to return a new property loader.
- * The basic properties loader will look for properties in the current project if the path
- * of the properties file is like this "packagea.packageb.packagec.default" for a properties
- * file named default.properties, or if the path is an absolute path. With a new property
- * loader you could for example, look for properties files in a bundle.
+ * The behavior of the properties loader service is explained in the Acceleo documentation
+ * (Help -> Help Contents).
*/
for (int i = 2; i < args.length; i++) {
@@ -183,6 +189,11 @@
//org.eclipse.emf.ecore.util.EcoreUtil.resolveAll(model);
+ /*
+ * If you want to check for potential errors in your models before the launch of the generation, you
+ * use the code below.
+ */
+
//if (model != null && model.eResource() != null) {
// List<org.eclipse.emf.ecore.resource.Resource.Diagnostic> errors = model.eResource().getErrors();
// for (org.eclipse.emf.ecore.resource.Resource.Diagnostic diagnostic : errors) {
@@ -261,13 +272,38 @@
@Override
public List<String> getProperties() {
/*
+ * If you want to change the content of this method, do NOT forget to change the "@generated"
+ * tag in the Javadoc of this method to "@generated NOT". Without this new tag, any compilation
+ * of the Acceleo module with the main template that has caused the creation of this class will
+ * revert your modifications.
+ */
+
+ /*
* TODO if your generation module requires access to properties files, add their qualified path to the list here.
- * Properties files are expected to be in source folders, and the path here to be the qualified path as if referring
- * to a Java class. For example, if you have a file named "messages.properties" in package "org.eclipse.acceleo.sample",
- * the path that needs be added to this list is "org.eclipse.acceleo.sample.messages". If you want to change the content
- * of this method, do NOT forget to change the "@generated" tag in the Javadoc of this method to "@generated NOT".
- * Without this new tag, any compilation of the Acceleo module with the main template that has caused the creation of
- * this class will revert your modifications.
+ *
+ * Properties files can be located in an Eclipse plug-in or in the file system (all Acceleo projects are Eclipse
+ * plug-in). In order to use properties files located in an Eclipse plugin, you need to add the path of the properties
+ * files to the "propertiesFiles" list:
+ *
+ * final String prefix = "platform:/plugin/";
+ * final String pluginName = "org.eclipse.acceleo.module.sample";
+ * final String packagePath = "/org/eclipse/acceleo/module/sample/properties/";
+ * final String fileName = "default.properties";
+ * propertiesFiles.add(prefix + pluginName + packagePath + fileName);
+ *
+ * With this mechanism, you can load properties files from your plugin or from another plugin.
+ *
+ * You may want to load properties files from the file system, for that you need to add the absolute path of the file:
+ *
+ * propertiesFiles.add("C:\Users\MyName\MyFile.properties");
+ *
+ * If you want to let your users add properties files located in the same folder as the model:
+ *
+ * if (EMFPlugin.IS_ECLIPSE_RUNNING && model != null && model.eResource() != null) {
+ * propertiesFiles.addAll(AcceleoEngineUtils.getPropertiesFilesNearModel(model.eResource()));
+ * }
+ *
+ * To learn more about Properties Files, have a look at the Acceleo documentation (Help -> Help Contents).
*/
return propertiesFiles;
}
@@ -305,35 +341,43 @@
@Override
public void registerPackages(ResourceSet resourceSet) {
super.registerPackages(resourceSet);
- //gdupe> The method isInWorkspace() does not exists in Helios. This avoid
- // to be install MoDisco on an Helios. The code generator is not used in a
- // workspace context : we do not need explicit load of the meta-models
- // That why I've commented the following lines.
- /*
if (!isInWorkspace(org.eclipse.modisco.infra.discovery.catalog.CatalogPackage.class)) {
resourceSet.getPackageRegistry().put(org.eclipse.modisco.infra.discovery.catalog.CatalogPackage.eINSTANCE.getNsURI(), org.eclipse.modisco.infra.discovery.catalog.CatalogPackage.eINSTANCE);
}
if (!isInWorkspace(org.eclipse.modisco.infra.discovery.launch.LaunchPackage.class)) {
resourceSet.getPackageRegistry().put(org.eclipse.modisco.infra.discovery.launch.LaunchPackage.eINSTANCE.getNsURI(), org.eclipse.modisco.infra.discovery.launch.LaunchPackage.eINSTANCE);
}
- */
+
/*
- * TODO If you need additional package registrations, you can register them here. The following line
- * (in comment) is an example of the package registration for UML. If you want to change the content
- * of this method, do NOT forget to change the "@generated" tag in the Javadoc of this method to
- * "@generated NOT". Without this new tag, any compilation of the Acceleo module with the main template
- * that has caused the creation of this class will revert your modifications. You can use the method
- * "isInWorkspace(Class c)" to check if the package that you are about to register is in the workspace.
- * To register a package properly, please follow the following conventions:
+ * If you want to change the content of this method, do NOT forget to change the "@generated"
+ * tag in the Javadoc of this method to "@generated NOT". Without this new tag, any compilation
+ * of the Acceleo module with the main template that has caused the creation of this class will
+ * revert your modifications.
+ */
+
+ /*
+ * If you need additional package registrations, you can register them here. The following line
+ * (in comment) is an example of the package registration for UML.
*
+ * You can use the method "isInWorkspace(Class c)" to check if the package that you are about to
+ * register is in the workspace.
+ *
+ * To register a package properly, please follow the following conventions:
+ *
+ * If the package is located in another plug-in, already installed in Eclipse. The following content should
+ * have been generated at the beginning of this method. Do not register the package using this mechanism if
+ * the metamodel is located in the workspace.
+ *
* if (!isInWorkspace(UMLPackage.class)) {
* // The normal package registration if your metamodel is in a plugin.
* resourceSet.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
- * } else {
- * // The package registration that will be used if the metamodel is not deployed in a plugin.
- * // This should be used if your metamodel is in your workspace and if you are using binary resource serialization.
- * resourceSet.getPackageRegistry().put("/myproject/myfolder/mysubfolder/MyUMLMetamodel.ecore", UMLPackage.eINSTANCE);
* }
+ *
+ * If the package is located in another project in your workspace, the plugin containing the package has not
+ * been register by EMF and Acceleo should register it automatically. If you want to use the generator in
+ * stand alone, the regular registration (seen a couple lines before) is needed.
+ *
+ * To learn more about Package Registration, have a look at the Acceleo documentation (Help -> Help Contents).
*/
}
@@ -348,11 +392,19 @@
public void registerResourceFactories(ResourceSet resourceSet) {
super.registerResourceFactories(resourceSet);
/*
+ * If you want to change the content of this method, do NOT forget to change the "@generated"
+ * tag in the Javadoc of this method to "@generated NOT". Without this new tag, any compilation
+ * of the Acceleo module with the main template that has caused the creation of this class will
+ * revert your modifications.
+ */
+
+ /*
* TODO If you need additional resource factories registrations, you can register them here. the following line
- * (in comment) is an example of the resource factory registration for UML. If you want to change the content
- * of this method, do NOT forget to change the "@generated" tag in the Javadoc of this method to "@generated NOT".
- * Without this new tag, any compilation of the Acceleo module with the main template that has caused the creation
- * of this class will revert your modifications.
+ * (in comment) is an example of the resource factory registration for UML.
+ *
+ * If you want to use the generator in stand alone, the resource factory registration will be required.
+ *
+ * To learn more about the registration of Resource Factories, have a look at the Acceleo documentation (Help -> Help Contents).
*/
// resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
diff --git a/org.eclipse.modisco.infra.discovery.benchmark.core/src/org/eclipse/modisco/infra/discovery/benchmark/core/internal/reporting/HtmlReport.mtl b/org.eclipse.modisco.infra.discovery.benchmark.core/src/org/eclipse/modisco/infra/discovery/benchmark/core/internal/reporting/HtmlReport.mtl
index 1dd5b60..a694c4c 100644
--- a/org.eclipse.modisco.infra.discovery.benchmark.core/src/org/eclipse/modisco/infra/discovery/benchmark/core/internal/reporting/HtmlReport.mtl
+++ b/org.eclipse.modisco.infra.discovery.benchmark.core/src/org/eclipse/modisco/infra/discovery/benchmark/core/internal/reporting/HtmlReport.mtl
@@ -5,15 +5,17 @@
* Public License v1.0 which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
- * Contributors: Guillaume Doux - INRIA - Initial API and implementation
- *
+ * Contributors:
+ * Guillaume Doux (INRIA) - Initial API and implementation
+ * Grégoire Dupé (Mia-Software) - Bug 482672 - Benchmark command line interface
+ * Grégoire Dupé (Mia-Software) - Bug 482857 - Discoverer Benchmark Report : wrong namespaces
******************************************************************************/ /]
-[module HtmlReport('http://www.eclipse.org/modisco/infra/discovery/0.1.incubation/benchmark','http://www.eclipse.org/MoDisco/Discovery/0.1.incubation/discovery/catalog','http://www.eclipse.org/MoDisco/Discovery/0.1.incubation/discovery/launch')/]
+[module HtmlReport('http://www.eclipse.org/modisco/infra/discovery/benchmark/0.11.incubation/internal/benchmark','http://www.eclipse.org/MoDisco/Discovery/0.1.incubation/discovery/catalog','http://www.eclipse.org/MoDisco/Discovery/0.1.incubation/discovery/launch')/]
-[query public maxExecutionTime (iterations : Set(DiscoveryIteration)) : Real = invoke('org.eclipse.modisco.infra.discovery.benchmark.reporting.internal.ReportingUtilities', 'maxExecutionTime(java.util.Collection)', Sequence{iterations})/]
-[query public maxSaveTime (iterations : Set(DiscoveryIteration)) : Real = invoke('org.eclipse.modisco.infra.discovery.benchmark.reporting.internal.ReportingUtilities', 'maxSaveTime(java.util.Collection)', Sequence{iterations})/]
-[query public sizeWithUnit (value : Real) : String = invoke('org.eclipse.modisco.infra.discovery.benchmark.reporting.internal.ReportingUtilities', 'sizeWithUnit(java.lang.Double)', Sequence{value})/]
-[query public timeWithUnit (value : Real) : String = invoke('org.eclipse.modisco.infra.discovery.benchmark.reporting.internal.ReportingUtilities', 'timeWithUnit(java.lang.Double)', Sequence{value})/]
+[query public maxExecutionTime (iterations : Set(DiscoveryIteration)) : Real = invoke('org.eclipse.modisco.infra.discovery.benchmark.core.internal.reporting.internal.ReportingUtilities', 'maxExecutionTime(java.util.Collection)', Sequence{iterations})/]
+[query public maxSaveTime (iterations : Set(DiscoveryIteration)) : Real = invoke('org.eclipse.modisco.infra.discovery.benchmark.core.internal.reporting.internal.ReportingUtilities', 'maxSaveTime(java.util.Collection)', Sequence{iterations})/]
+[query public sizeWithUnit (value : Real) : String = invoke('org.eclipse.modisco.infra.discovery.benchmark.core.internal.reporting.internal.ReportingUtilities', 'sizeWithUnit(java.lang.Double)', Sequence{value})/]
+[query public timeWithUnit (value : Real) : String = invoke('org.eclipse.modisco.infra.discovery.benchmark.core.internal.reporting.internal.ReportingUtilities', 'timeWithUnit(java.lang.Double)', Sequence{value})/]
[template public HtmlReport(b : Benchmark)]