[576593] Use a test-specific trace base URI
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/AbstractCompilerChain.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/AbstractCompilerChain.java
index f5490f9..8a76422 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/AbstractCompilerChain.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/AbstractCompilerChain.java
@@ -231,9 +231,10 @@
 			try {
 				Resource sResource = createResource(QVTschedulePackage.eCONTENT_TYPE);
 				CompilerOptions.StepOptions schedulerOptions = compilerChain.basicGetOptions(CompilerChain.QVTS_STEP);
+				@Nullable String traceBaseURI = compilerChain.basicGetOption(CompilerChain.TRACE_STEP, CompilerChain.TRACE_BASE_URI_KEY);
 				Transformation asTransformation = QVTbaseUtil.getTransformation(pResource);
 				typedModelsConfiguration.reconcile(asTransformation);
-				QVTm2QVTs qvtm2qvts = new QVTm2QVTs(this, environmentFactory, asTransformation, typedModelsConfiguration, schedulerOptions);
+				QVTm2QVTs qvtm2qvts = new QVTm2QVTs(this, environmentFactory, asTransformation, typedModelsConfiguration, schedulerOptions, traceBaseURI);
 				ScheduleManager scheduleManager = qvtm2qvts.getScheduleManager();
 				sResource.getContents().add(scheduleManager.getScheduleModel());
 				Iterable<@NonNull RuleRegion> activeRegions = qvtm2qvts.transform();
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/CompilerChain.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/CompilerChain.java
index 79bd99f..9d6d918 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/CompilerChain.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/CompilerChain.java
@@ -48,6 +48,7 @@
 	public static final @NonNull String TRACE_STEP = "Trace";
 	public static final @NonNull String UMLX_STEP = "UMLX";
 
+	public static final CompilerOptions.@NonNull Key<@NonNull String> TRACE_BASE_URI_KEY = new CompilerOptions.Key<>("trace-base-uri");
 	public static final CompilerOptions.@NonNull Key<Boolean> CHECK_KEY = new CompilerOptions.Key<>("check");
 	public static final CompilerOptions.@NonNull Key<Boolean> DEBUG_KEY = new CompilerOptions.Key<>("debug");
 	//	public static final CompilerOptions.@NonNull Key<@NonNull QVTuConfiguration> QVTU_CONFIGURATION_KEY = new CompilerOptions.Key<>("qvtuConfiguration");
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/QVTrCompilerChain.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/QVTrCompilerChain.java
index f062789..f317ce6 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/QVTrCompilerChain.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/QVTrCompilerChain.java
@@ -139,8 +139,9 @@
 			ScheduleModel scheduleModel = QVTscheduleFactory.eINSTANCE.createScheduleModel();
 			qvtsResource.getContents().add(scheduleModel);
 			CompilerOptions.StepOptions schedulerOptions = compilerChain.basicGetOptions(CompilerChain.QVTS_STEP);
+			@Nullable String traceBaseURI = compilerChain.basicGetOption(TRACE_STEP, TRACE_BASE_URI_KEY);
 			//			RelationalTransformation asTransformation = (RelationalTransformation) QVTbaseUtil.getTransformation(qvtrResource);
-			QVTrelationMultipleScheduleManager multipleScheduleManager = new QVTrelationMultipleScheduleManager(environmentFactory, asTransformation, this, scheduleModel, schedulerOptions);
+			QVTrelationMultipleScheduleManager multipleScheduleManager = new QVTrelationMultipleScheduleManager(environmentFactory, asTransformation, this, scheduleModel, schedulerOptions, traceBaseURI);
 			try {
 				multipleScheduleManager.getDomainUsageAnalysis().analyzeTransformation();
 				throwCompilerChainExceptionForErrors();
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/AbstractScheduleManager.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/AbstractScheduleManager.java
index 1122267..a69f72b 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/AbstractScheduleManager.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/AbstractScheduleManager.java
@@ -181,6 +181,7 @@
 	protected final @NonNull ProblemHandler problemHandler;
 	private @Nullable TraceHelper traceHelper = null;
 	protected final CompilerOptions.@Nullable StepOptions schedulerOptions;
+	protected final @Nullable String traceBaseURI;
 	protected final @NonNull RootDomainUsageAnalysis domainUsageAnalysis;
 	private @Nullable DirectedDomainUsageAnalysis directedDomainUsageAnalysis = null;		// FIXME Move to derived DirectedScheduleManager
 	//	protected final @NonNull DatumCaches datumCaches;
@@ -203,13 +204,14 @@
 
 	protected AbstractScheduleManager(@NonNull ScheduleModel scheduleModel, @NonNull EnvironmentFactory environmentFactory,
 			@NonNull Transformation transformation, @NonNull ProblemHandler problemHandler, CompilerOptions.@Nullable StepOptions schedulerOptions,
-			@Nullable RootDomainUsageAnalysis domainUsageAnalysis) {
+			@Nullable String traceBaseURI, @Nullable RootDomainUsageAnalysis domainUsageAnalysis) {
 		this.scheduleModel = scheduleModel;
 		this.environmentFactory = environmentFactory;
 		this.transformation = transformation;
 		QVTbaseUtil.getPrimitiveTypedModel(transformation);		// FIXME debugging the must-exist side effect
 		this.problemHandler = problemHandler;
 		this.schedulerOptions = schedulerOptions;
+		this.traceBaseURI = traceBaseURI;
 		this.domainUsageAnalysis = domainUsageAnalysis != null ? domainUsageAnalysis : createDomainUsageAnalysis();
 		//		this.directedDomainUsageAnalysis = this.domainUsageAnalysis.createDirectedDomainUsageAnalysis();
 		this.standardLibraryHelper = new StandardLibraryHelper(environmentFactory.getStandardLibrary());
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/BasicScheduleManager.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/BasicScheduleManager.java
index a1c31b2..f6824e8 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/BasicScheduleManager.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/BasicScheduleManager.java
@@ -70,18 +70,20 @@
 	private final @NonNull Map<Type, Property> type2iterateProperty = new HashMap<>();
 
 	private final @NonNull Map<@NonNull Transformation, @NonNull Transformation2TracePackage> transformation2transformation2TracePackage = new HashMap<>();
+	protected final @NonNull String traceBaseURI;
 
 	protected BasicScheduleManager(@NonNull ScheduleModel scheduleModel, @NonNull EnvironmentFactory environmentFactory,
-			@NonNull Transformation transformation, @NonNull ProblemHandler problemHandler, CompilerOptions.@Nullable StepOptions schedulerOptions) {
-		this(scheduleModel, environmentFactory, transformation, problemHandler, schedulerOptions, null, null, null);
+			@NonNull Transformation transformation, @NonNull ProblemHandler problemHandler, CompilerOptions.@Nullable StepOptions schedulerOptions, @Nullable String traceBaseURI) {
+		this(scheduleModel, environmentFactory, transformation, problemHandler, schedulerOptions, traceBaseURI, null, null, null);
 	}
 
 	protected BasicScheduleManager(@NonNull ScheduleModel scheduleModel, @NonNull EnvironmentFactory environmentFactory,
-			@NonNull Transformation transformation, @NonNull ProblemHandler problemHandler, CompilerOptions.@Nullable StepOptions schedulerOptions,
+			@NonNull Transformation transformation, @NonNull ProblemHandler problemHandler, CompilerOptions.@Nullable StepOptions schedulerOptions, @Nullable String traceBaseURI,
 			@Nullable NameGenerator nameGenerator, @Nullable DatumCaches datumCaches, @Nullable RootDomainUsageAnalysis domainUsageAnalysis) {
-		super(scheduleModel, environmentFactory, transformation, problemHandler, schedulerOptions, domainUsageAnalysis);
+		super(scheduleModel, environmentFactory, transformation, problemHandler, schedulerOptions, traceBaseURI, domainUsageAnalysis);
 		this.nameGenerator = nameGenerator != null ? nameGenerator : createNameGenerator();
 		this.datumCaches = datumCaches != null ? datumCaches : new DatumCaches(this);
+		this.traceBaseURI = traceBaseURI != null ? traceBaseURI : "http://www.eclipse.org/qvtd-example";
 	}
 
 	@Override
@@ -224,6 +226,11 @@
 	}
 
 	@Override
+	public @NonNull String getTraceBaseURI() {
+		return traceBaseURI;
+	}
+
+	@Override
 	public @NonNull Transformation2TracePackage getTransformation2TracePackage(@NonNull Transformation transformation) {
 		Transformation2TracePackage transformation2TracePackage = transformation2transformation2TracePackage.get(transformation);
 		if (transformation2TracePackage == null) {
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/ScheduleManager.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/ScheduleManager.java
index d77eb59..ae48238 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/ScheduleManager.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/ScheduleManager.java
@@ -143,6 +143,7 @@
 	@NonNull PropertyDatum getSuccessPropertyDatum(@NonNull Property successProperty);
 	@NonNull Iterable<@NonNull ClassDatum> getSuperClassDatums(@NonNull ClassDatum classDatum);
 	@NonNull TypedModel getTargetTypedModel();
+	@NonNull String getTraceBaseURI();
 	@NonNull TraceHelper getTraceHelper();
 	@NonNull TypedModel getTraceTypedModel();
 	@NonNull AbstractTransformationAnalysis getTransformationAnalysis();
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/trace/Transformation2TracePackage.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/trace/Transformation2TracePackage.java
index b5473cd..46e462f 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/trace/Transformation2TracePackage.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/trace/Transformation2TracePackage.java
@@ -43,7 +43,6 @@
 public abstract class Transformation2TracePackage
 {
 	protected final @NonNull ScheduleManager scheduleManager;
-
 	protected final @NonNull NameGenerator nameGenerator;
 	protected final @NonNull Transformation transformation;
 	private final org.eclipse.ocl.pivot.@NonNull Package tracePackage;
@@ -446,19 +445,21 @@
 
 	public abstract org.eclipse.ocl.pivot.@Nullable Class getTransformationTraceClass();
 
-	private String getURI(org.eclipse.ocl.pivot.Package rPackage, @NonNull StringBuilder s) {
+	private void getURI(org.eclipse.ocl.pivot.Package rPackage, @NonNull StringBuilder s) {
 		if (rPackage == null) {
-			s.append("http://www.eclipse.org/qvtd-example");
+			s.append(scheduleManager.getTraceBaseURI());
 		}
 		else if (rPackage.getURI() != null) {
 			s.append(rPackage.getURI());
 		}
 		else {
 			getURI(rPackage.getOwningPackage(), s);
-			s.append("/");
-			s.append(rPackage.getName());
+			String name = rPackage.getName();
+			if (name.length() > 0) {
+				s.append("/");
+				s.append(name);
+			}
 		}
-		return null;
 	}
 
 	/*	public @NonNull VariableDeclaration2TraceProperty getVariableDeclaration2TraceProperty(@NonNull VariableDeclaration variable) {
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtm2qvts/QVTcoreScheduleManager.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtm2qvts/QVTcoreScheduleManager.java
index 5af8281..3c72706 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtm2qvts/QVTcoreScheduleManager.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtm2qvts/QVTcoreScheduleManager.java
@@ -40,8 +40,9 @@
 	protected final @NonNull TypedModelsConfiguration typedModelsConfiguration;
 	protected final @NonNull AbstractTransformationAnalysis transformationAnalysis;
 
-	public QVTcoreScheduleManager(@NonNull EnvironmentFactory environmentFactory, @NonNull Transformation transformation, @NonNull TypedModelsConfiguration typedModelsConfiguration, @NonNull ProblemHandler problemHandler, CompilerOptions.@Nullable StepOptions schedulerOptions) {
-		super(QVTscheduleFactory.eINSTANCE.createScheduleModel(), environmentFactory, transformation, problemHandler, schedulerOptions);
+	public QVTcoreScheduleManager(@NonNull EnvironmentFactory environmentFactory, @NonNull Transformation transformation, @NonNull TypedModelsConfiguration typedModelsConfiguration, @NonNull ProblemHandler problemHandler,
+			CompilerOptions.@Nullable StepOptions schedulerOptions, @Nullable String traceBaseURI) {
+		super(QVTscheduleFactory.eINSTANCE.createScheduleModel(), environmentFactory, transformation, problemHandler, schedulerOptions, traceBaseURI);
 		this.typedModelsConfiguration = typedModelsConfiguration;
 		this.transformationAnalysis = createTransformationAnalysis(transformation);
 	}
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtm2qvts/QVTm2QVTs.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtm2qvts/QVTm2QVTs.java
index 82221b3..8b0ffcb 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtm2qvts/QVTm2QVTs.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtm2qvts/QVTm2QVTs.java
@@ -27,8 +27,9 @@
 	protected final @NonNull TypedModelsConfiguration typedModelsConfiguration;
 
 	public QVTm2QVTs(@NonNull ProblemHandler problemHandler, @NonNull EnvironmentFactory environmentFactory,
-			@NonNull Transformation transformation, @NonNull TypedModelsConfiguration typedModelsConfiguration, CompilerOptions.@Nullable StepOptions schedulerOptions) {
-		super(new QVTcoreScheduleManager(environmentFactory, transformation, typedModelsConfiguration, problemHandler, schedulerOptions), problemHandler);
+			@NonNull Transformation transformation, @NonNull TypedModelsConfiguration typedModelsConfiguration,
+			CompilerOptions.@Nullable StepOptions schedulerOptions, @Nullable String traceBaseURI) {
+		super(new QVTcoreScheduleManager(environmentFactory, transformation, typedModelsConfiguration, problemHandler, schedulerOptions, traceBaseURI), problemHandler);
 		this.typedModelsConfiguration = typedModelsConfiguration;
 	}
 
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/QVTrelationDirectedScheduleManager.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/QVTrelationDirectedScheduleManager.java
index 4379fb1..7fb972a 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/QVTrelationDirectedScheduleManager.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/QVTrelationDirectedScheduleManager.java
@@ -48,9 +48,9 @@
 	protected final @NonNull AbstractTransformationAnalysis transformationAnalysis;
 
 	public QVTrelationDirectedScheduleManager(@NonNull QVTrelationMultipleScheduleManager multipleScheduleManager, @NonNull Transformation transformation,
-			@NonNull TypedModelsConfiguration typedModelsConfiguration, CompilerOptions.@Nullable StepOptions schedulerOptions) {
+			@NonNull TypedModelsConfiguration typedModelsConfiguration, CompilerOptions.@Nullable StepOptions schedulerOptions, @Nullable String traceBaseURI) {
 		super(multipleScheduleManager.getScheduleModel(), multipleScheduleManager.getEnvironmentFactory(), transformation,
-			multipleScheduleManager.getProblemHandler(), schedulerOptions,
+			multipleScheduleManager.getProblemHandler(), schedulerOptions, traceBaseURI,
 			multipleScheduleManager.getNameGenerator(), multipleScheduleManager.getDatumCaches(), multipleScheduleManager.getDomainUsageAnalysis());
 		this.multipleScheduleManager = multipleScheduleManager;
 		this.typedModelsConfiguration = typedModelsConfiguration;
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/QVTrelationMultipleScheduleManager.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/QVTrelationMultipleScheduleManager.java
index 5fb723c..c6dfe01 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/QVTrelationMultipleScheduleManager.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvts/QVTrelationMultipleScheduleManager.java
@@ -52,8 +52,8 @@
 	private @NonNull Map<@NonNull RootRegion, @NonNull QVTrelationDirectedScheduleManager> rootRegion2directedScheduleManager = new HashMap<>();
 
 	public QVTrelationMultipleScheduleManager(@NonNull EnvironmentFactory environmentFactory, @NonNull Transformation transformation, @NonNull ProblemHandler problemHandler,
-			@NonNull ScheduleModel scheduleModel, CompilerOptions.@Nullable StepOptions schedulerOptions) {
-		super(scheduleModel, environmentFactory, transformation, problemHandler, schedulerOptions, new QVTrelationNameGenerator(), null, null);
+			@NonNull ScheduleModel scheduleModel, CompilerOptions.@Nullable StepOptions schedulerOptions, @Nullable String traceBaseURI) {
+		super(scheduleModel, environmentFactory, transformation, problemHandler, schedulerOptions, traceBaseURI, new QVTrelationNameGenerator(), null, null);
 	}
 
 	/*	@Override
@@ -72,7 +72,7 @@
 	} */
 
 	public @NonNull QVTrelationDirectedScheduleManager createDirectedScheduleManager(@NonNull TypedModelsConfiguration typedModelsConfiguration) {
-		QVTrelationDirectedScheduleManager directedScheduleManager = new QVTrelationDirectedScheduleManager(this, transformation, typedModelsConfiguration, schedulerOptions);
+		QVTrelationDirectedScheduleManager directedScheduleManager = new QVTrelationDirectedScheduleManager(this, transformation, typedModelsConfiguration, schedulerOptions, traceBaseURI);
 		RootRegion rootRegion = directedScheduleManager.getRootRegion();
 		QVTrelationDirectedScheduleManager oldDirectedScheduleManager = rootRegion2directedScheduleManager.put(rootRegion, directedScheduleManager);
 		assert oldDirectedScheduleManager == null;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtbase.tests/src/org/eclipse/qvtd/xtext/qvtbase/tests/AbstractTestQVT.java b/tests/org.eclipse.qvtd.xtext.qvtbase.tests/src/org/eclipse/qvtd/xtext/qvtbase/tests/AbstractTestQVT.java
index 0ba1927..4ee65fc 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtbase.tests/src/org/eclipse/qvtd/xtext/qvtbase/tests/AbstractTestQVT.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtbase.tests/src/org/eclipse/qvtd/xtext/qvtbase/tests/AbstractTestQVT.java
@@ -337,6 +337,7 @@
 			URI genModelURI = intermediateFileNamePrefixURI.appendFileExtension(AbstractCompilerChain.getDefaultFileExtension(CompilerChain.GENMODEL_STEP));
 			compilerOptions.setGenerateGenModelOptions(genModelURI, getBasePrefix(), copyright, usedGenPackages);
 		}
+		compilerOptions.setOption(CompilerChain.TRACE_STEP, CompilerChain.TRACE_BASE_URI_KEY, "http://" + testProject.getName());
 		return compilerOptions;
 	}