Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2022-05-15 07:17:30 +0000
committerEike Stepper2022-05-15 07:17:30 +0000
commiteed5476b2067138a2130fe562c23840561e73384 (patch)
tree6291dd12898b85c8cc8d90bd5ba197e5ebe77acd /plugins
parent3ffb12fc2d50970d5aeda377d0b010307687d389 (diff)
downloadcdo-eed5476b2067138a2130fe562c23840561e73384.tar.gz
cdo-eed5476b2067138a2130fe562c23840561e73384.tar.xz
cdo-eed5476b2067138a2130fe562c23840561e73384.zip
[579863] [LM] Implement a lifecycle management framework to support modular modeling
https://bugs.eclipse.org/bugs/show_bug.cgi?id=579863 Added tests.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/org.eclipse.emf.cdo.lm.client/src/org/eclipse/emf/cdo/lm/internal/client/SystemDescriptor.java30
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/.classpath11
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/.project52
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.jdt.core.prefs434
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.jdt.ui.prefs133
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.ltk.core.refactoring.prefs3
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.mylyn.tasks.ui.prefs4
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.mylyn.team.ui.prefs3
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.pde.prefs31
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/LMIntegrationTest.launch252
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/LMVersionEvolutionTest.launch252
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/META-INF/MANIFEST.MF23
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/about.html28
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/build.properties21
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/plugin.properties11
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/pom.xml31
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/AbstractIntegrationTest.java362
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/AbstractLMTest.java235
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/LMIntegrationTest.java97
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/LMVersionEvolutionTest.java278
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/bundle/OM.java44
22 files changed, 2307 insertions, 30 deletions
diff --git a/plugins/org.eclipse.emf.cdo.lm.client/src/org/eclipse/emf/cdo/lm/internal/client/SystemDescriptor.java b/plugins/org.eclipse.emf.cdo.lm.client/src/org/eclipse/emf/cdo/lm/internal/client/SystemDescriptor.java
index f44f2a2a01..baf8fd9fb2 100644
--- a/plugins/org.eclipse.emf.cdo.lm.client/src/org/eclipse/emf/cdo/lm/internal/client/SystemDescriptor.java
+++ b/plugins/org.eclipse.emf.cdo.lm.client/src/org/eclipse/emf/cdo/lm/internal/client/SystemDescriptor.java
@@ -655,36 +655,6 @@ public final class SystemDescriptor implements ISystemDescriptor
return assembly;
}
- private Assembly tryDeprecatedResolution(ResolutionException ex, ModuleDefinition rootDefinition, Baseline rootBaseline, IProgressMonitor monitor)
- throws ResolutionException
- {
- List<String> missingModules = new ArrayList<>();
-
- for (Reason reason : ex.getReasons())
- {
- if (reason instanceof Reason.Missing)
- {
- Reason.Missing missing = (Reason.Missing)reason;
- missingModules.add(missing.dependency.name);
- }
- }
-
- ModuleDefinition newDefinition = EcoreUtil.copy(rootDefinition);
- List<DependencyDefinition> depToRemove = new ArrayList<>();
- for (DependencyDefinition dep : newDefinition.getDependencies())
- {
- if (missingModules.contains(dep.getTargetName()))
- {
- depToRemove.add(dep);
- }
- }
-
- newDefinition.getDependencies().removeAll(depToRemove);
- OM.LOG.warn(ex);
- OM.LOG.warn("Trying to resolve without missing dependencies. You should consider updating module.md");
- return resolve(newDefinition, rootBaseline, monitor);
- }
-
private void resolveDependencies(ModuleDefinition rootDefinition, Assembly assembly, IProgressMonitor monitor) throws ResolutionException, ProvisionException
{
List<FixedBaseline> baselines = new ArrayList<>();
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/.classpath b/plugins/org.eclipse.emf.cdo.tests.lm/.classpath
new file mode 100644
index 0000000000..a42a828e04
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src">
+ <attributes>
+ <attribute name="test" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/.project b/plugins/org.eclipse.emf.cdo.tests.lm/.project
new file mode 100644
index 0000000000..0fe43a639b
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/.project
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.emf.cdo.tests.lm</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.oomph.version.VersionBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>check.maven.pom</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>ignore.lower.bound.dependency.ranges</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>release.path</key>
+ <value>/org.eclipse.emf.cdo.releng/versions/release.xml</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.oomph.version.VersionNature</nature>
+ </natures>
+ <filteredResources>
+ <filter>
+ <id>1396938000000</id>
+ <name></name>
+ <type>10</type>
+ <matcher>
+ <id>org.eclipse.ui.ide.multiFilter</id>
+ <arguments>1.0-projectRelativePath-matches-true-false-target</arguments>
+ </matcher>
+ </filter>
+ </filteredResources>
+</projectDescription>
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.core.resources.prefs b/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000..99f26c0203
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..62ff74e8a6
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,434 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=ignore
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,HIGH,LOW,LOW,LOW,LOW,LOW
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,PERF,MEM,POLISH,@generated NOT,@ADDED
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=2
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=160
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=2
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.jdt.ui.prefs b/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000000..e9ed36ce21
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,133 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=true
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=true
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=true
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=false
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=true
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=true
+cleanup.use_this_for_non_static_field_access=true
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=true
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup_profile=_CDO
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_EMFT
+formatter_settings_version=12
+org.eclipse.jdt.ui.exception.name=ex
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=org.eclipse.emf.cdo;org.eclipse.emf.internal.cdo;org.eclipse.net4j;org.eclipse.internal.net4j;org.eclipse.emf;org.eclipse;com;org;javax;java;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="false" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment"/><template autoinsert\="false" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment"/><template autoinsert\="false" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment"/><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*\r\n * Copyright (c) 2022 Eike Stepper (Loehne, Germany) and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n * \r\n * Contributors\:\r\n * Eike Stepper - initial API and implementation\r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author Eike Stepper\r\n */</template><template autoinsert\="false" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment"/><template autoinsert\="false" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment"/><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment"/><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=false
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_unnecessary_array_creation=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=true
+sp_cleanup.use_this_for_non_static_field_access=true
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=true
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.ltk.core.refactoring.prefs b/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000000..864e30fe5d
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Thu Feb 04 09:44:24 CET 2010
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.mylyn.tasks.ui.prefs b/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000000..b050639a54
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Feb 04 09:44:24 CET 2010
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.mylyn.team.ui.prefs b/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.mylyn.team.ui.prefs
new file mode 100644
index 0000000000..97c11e6725
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.mylyn.team.ui.prefs
@@ -0,0 +1,3 @@
+#Thu Feb 04 09:44:24 CET 2010
+commit.comment.template=[${task.id}] ${task.description}\r\n\r\n${task.url}
+eclipse.preferences.version=1
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.pde.prefs b/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000000..fe01bb701d
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,31 @@
+#Thu Feb 04 09:44:24 CET 2010
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=2
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=1
+compilers.p.missing-version-export-package=1
+compilers.p.missing-version-import-package=1
+compilers.p.missing-version-require-bundle=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+eclipse.preferences.version=1
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/LMIntegrationTest.launch b/plugins/org.eclipse.emf.cdo.tests.lm/LMIntegrationTest.launch
new file mode 100644
index 0000000000..ad18284ea4
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/LMIntegrationTest.launch
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
+ <booleanAttribute key="append.args" value="true"/>
+ <stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
+ <booleanAttribute key="askclear" value="false"/>
+ <booleanAttribute key="automaticAdd" value="false"/>
+ <booleanAttribute key="automaticValidate" value="true"/>
+ <stringAttribute key="bootstrap" value=""/>
+ <stringAttribute key="checked" value="[NONE]"/>
+ <booleanAttribute key="clearConfig" value="true"/>
+ <booleanAttribute key="clearws" value="true"/>
+ <booleanAttribute key="clearwslog" value="false"/>
+ <stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
+ <booleanAttribute key="default" value="false"/>
+ <setAttribute key="deselected_workspace_bundles"/>
+ <booleanAttribute key="includeOptional" value="true"/>
+ <stringAttribute key="location" value="${workspace_loc}/../ws-LMIntegrationTest"/>
+ <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+ <listEntry value="/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/LMIntegrationTest.java"/>
+ </listAttribute>
+ <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+ <listEntry value="1"/>
+ </listAttribute>
+ <stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+ <booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+ <stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+ <stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit5"/>
+ <booleanAttribute key="org.eclipse.jdt.launching.ATTR_ATTR_USE_ARGFILE" value="false"/>
+ <booleanAttribute key="org.eclipse.jdt.launching.ATTR_SHOW_CODEDETAILS_IN_EXCEPTION_MESSAGES" value="true"/>
+ <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
+ <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.emf.cdo.tests.lm.LMIntegrationTest"/>
+ <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/>
+ <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.emf.cdo.tests.lm"/>
+ <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+ <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Dorg.eclipse.emf.cdo.internal.server.Repository.DISABLE_FEATURE_MAP_CHECKS=true"/>
+ <stringAttribute key="pde.version" value="3.3"/>
+ <stringAttribute key="product" value="org.eclipse.platform.ide"/>
+ <booleanAttribute key="run_in_ui_thread" value="false"/>
+ <setAttribute key="selected_target_bundles">
+ <setEntry value="com.ibm.icu@default:default"/>
+ <setEntry value="com.sun.jna.platform@default:default"/>
+ <setEntry value="com.sun.jna@default:default"/>
+ <setEntry value="jakarta.servlet-api@default:default"/>
+ <setEntry value="javax.annotation@default:default"/>
+ <setEntry value="javax.inject@default:default"/>
+ <setEntry value="org.apache.batik.constants@default:default"/>
+ <setEntry value="org.apache.batik.css@default:default"/>
+ <setEntry value="org.apache.batik.i18n@default:default"/>
+ <setEntry value="org.apache.batik.util@default:default"/>
+ <setEntry value="org.apache.commons.io@default:default"/>
+ <setEntry value="org.apache.commons.jxpath@default:default"/>
+ <setEntry value="org.apache.commons.logging@default:default"/>
+ <setEntry value="org.apache.felix.gogo.command@default:default"/>
+ <setEntry value="org.apache.felix.gogo.runtime@default:default"/>
+ <setEntry value="org.apache.felix.gogo.shell@default:default"/>
+ <setEntry value="org.apache.felix.scr@1:true"/>
+ <setEntry value="org.apache.log4j@default:default"/>
+ <setEntry value="org.apache.xmlgraphics@default:default"/>
+ <setEntry value="org.apiguardian@default:default"/>
+ <setEntry value="org.bouncycastle.bcpg@default:default"/>
+ <setEntry value="org.bouncycastle.bcprov@default:default"/>
+ <setEntry value="org.eclipse.ant.core@default:default"/>
+ <setEntry value="org.eclipse.compare.core@default:default"/>
+ <setEntry value="org.eclipse.compare@default:default"/>
+ <setEntry value="org.eclipse.core.commands@default:default"/>
+ <setEntry value="org.eclipse.core.contenttype@default:default"/>
+ <setEntry value="org.eclipse.core.databinding.observable@default:default"/>
+ <setEntry value="org.eclipse.core.databinding.property@default:default"/>
+ <setEntry value="org.eclipse.core.databinding@default:default"/>
+ <setEntry value="org.eclipse.core.expressions@default:default"/>
+ <setEntry value="org.eclipse.core.filebuffers@default:default"/>
+ <setEntry value="org.eclipse.core.filesystem.win32.x86_64@default:false"/>
+ <setEntry value="org.eclipse.core.filesystem@default:default"/>
+ <setEntry value="org.eclipse.core.jobs@default:default"/>
+ <setEntry value="org.eclipse.core.resources.win32.x86_64@default:false"/>
+ <setEntry value="org.eclipse.core.resources@default:default"/>
+ <setEntry value="org.eclipse.core.runtime@default:true"/>
+ <setEntry value="org.eclipse.core.variables@default:default"/>
+ <setEntry value="org.eclipse.debug.core@default:default"/>
+ <setEntry value="org.eclipse.debug.ui@default:default"/>
+ <setEntry value="org.eclipse.e4.core.commands@default:default"/>
+ <setEntry value="org.eclipse.e4.core.contexts@default:default"/>
+ <setEntry value="org.eclipse.e4.core.di.annotations@default:default"/>
+ <setEntry value="org.eclipse.e4.core.di.extensions.supplier@default:default"/>
+ <setEntry value="org.eclipse.e4.core.di.extensions@default:default"/>
+ <setEntry value="org.eclipse.e4.core.di@default:default"/>
+ <setEntry value="org.eclipse.e4.core.services@default:default"/>
+ <setEntry value="org.eclipse.e4.emf.xpath@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.bindings@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.css.core@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.css.swt.theme@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.css.swt@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.di@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.dialogs@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.ide@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.model.workbench@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.services@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.swt.win32@default:false"/>
+ <setEntry value="org.eclipse.e4.ui.widgets@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench.addons.swt@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench.renderers.swt@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench.swt@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench3@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench@default:default"/>
+ <setEntry value="org.eclipse.emf.common@default:default"/>
+ <setEntry value="org.eclipse.emf.ecore.change@default:default"/>
+ <setEntry value="org.eclipse.emf.ecore.xmi@default:default"/>
+ <setEntry value="org.eclipse.emf.ecore@default:default"/>
+ <setEntry value="org.eclipse.equinox.app@default:default"/>
+ <setEntry value="org.eclipse.equinox.bidi@default:default"/>
+ <setEntry value="org.eclipse.equinox.common@2:true"/>
+ <setEntry value="org.eclipse.equinox.event@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.artifact.repository@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.core@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.director@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.engine@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.jarprocessor@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.metadata.repository@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.metadata@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.repository@default:default"/>
+ <setEntry value="org.eclipse.equinox.preferences@default:default"/>
+ <setEntry value="org.eclipse.equinox.registry@default:default"/>
+ <setEntry value="org.eclipse.equinox.security.win32.x86_64@default:false"/>
+ <setEntry value="org.eclipse.equinox.security@default:default"/>
+ <setEntry value="org.eclipse.equinox.simpleconfigurator@1:true"/>
+ <setEntry value="org.eclipse.equinox.weaving.hook@default:false"/>
+ <setEntry value="org.eclipse.help@default:default"/>
+ <setEntry value="org.eclipse.jdt.annotation*2.2.600.v20200408-1511@default:default"/>
+ <setEntry value="org.eclipse.jdt.compiler.apt@default:false"/>
+ <setEntry value="org.eclipse.jdt.compiler.tool@default:false"/>
+ <setEntry value="org.eclipse.jdt.core.manipulation@default:default"/>
+ <setEntry value="org.eclipse.jdt.core@default:default"/>
+ <setEntry value="org.eclipse.jdt.debug.ui@default:default"/>
+ <setEntry value="org.eclipse.jdt.debug@default:default"/>
+ <setEntry value="org.eclipse.jdt.junit.runtime@default:default"/>
+ <setEntry value="org.eclipse.jdt.junit5.runtime@default:default"/>
+ <setEntry value="org.eclipse.jdt.launching@default:default"/>
+ <setEntry value="org.eclipse.jdt.ui@default:default"/>
+ <setEntry value="org.eclipse.jetty.alpn.client@default:default"/>
+ <setEntry value="org.eclipse.jetty.client@default:default"/>
+ <setEntry value="org.eclipse.jetty.http@default:default"/>
+ <setEntry value="org.eclipse.jetty.io@default:default"/>
+ <setEntry value="org.eclipse.jetty.security@default:default"/>
+ <setEntry value="org.eclipse.jetty.server@default:default"/>
+ <setEntry value="org.eclipse.jetty.servlet@default:default"/>
+ <setEntry value="org.eclipse.jetty.util.ajax@default:default"/>
+ <setEntry value="org.eclipse.jetty.util@default:default"/>
+ <setEntry value="org.eclipse.jetty.webapp@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.api@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.client@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.common@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.core.client@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.core.common@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.core.server@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.server@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.servlet@default:default"/>
+ <setEntry value="org.eclipse.jetty.xml@default:default"/>
+ <setEntry value="org.eclipse.jface.databinding@default:default"/>
+ <setEntry value="org.eclipse.jface.text@default:default"/>
+ <setEntry value="org.eclipse.jface@default:default"/>
+ <setEntry value="org.eclipse.ltk.core.refactoring@default:default"/>
+ <setEntry value="org.eclipse.ltk.ui.refactoring@default:default"/>
+ <setEntry value="org.eclipse.osgi.compatibility.state@default:false"/>
+ <setEntry value="org.eclipse.osgi.services@default:default"/>
+ <setEntry value="org.eclipse.osgi.util@default:default"/>
+ <setEntry value="org.eclipse.osgi@1:true"/>
+ <setEntry value="org.eclipse.pde.junit.runtime@default:default"/>
+ <setEntry value="org.eclipse.rap.tools.launch.rwt@default:default"/>
+ <setEntry value="org.eclipse.search@default:default"/>
+ <setEntry value="org.eclipse.swt.win32.win32.x86_64@default:false"/>
+ <setEntry value="org.eclipse.swt@default:default"/>
+ <setEntry value="org.eclipse.team.core@default:default"/>
+ <setEntry value="org.eclipse.team.ui@default:default"/>
+ <setEntry value="org.eclipse.text@default:default"/>
+ <setEntry value="org.eclipse.ui.console@default:default"/>
+ <setEntry value="org.eclipse.ui.editors@default:default"/>
+ <setEntry value="org.eclipse.ui.forms@default:default"/>
+ <setEntry value="org.eclipse.ui.genericeditor@default:default"/>
+ <setEntry value="org.eclipse.ui.ide@default:default"/>
+ <setEntry value="org.eclipse.ui.navigator.resources@default:default"/>
+ <setEntry value="org.eclipse.ui.navigator@default:default"/>
+ <setEntry value="org.eclipse.ui.views.properties.tabbed@default:default"/>
+ <setEntry value="org.eclipse.ui.views@default:default"/>
+ <setEntry value="org.eclipse.ui.win32@default:false"/>
+ <setEntry value="org.eclipse.ui.workbench.texteditor@default:default"/>
+ <setEntry value="org.eclipse.ui.workbench@default:default"/>
+ <setEntry value="org.eclipse.ui@default:default"/>
+ <setEntry value="org.eclipse.urischeme@default:default"/>
+ <setEntry value="org.h2@default:default"/>
+ <setEntry value="org.hamcrest.core@default:default"/>
+ <setEntry value="org.junit.jupiter.api@default:default"/>
+ <setEntry value="org.junit.jupiter.engine@default:default"/>
+ <setEntry value="org.junit.jupiter.migrationsupport@default:default"/>
+ <setEntry value="org.junit.jupiter.params@default:default"/>
+ <setEntry value="org.junit.platform.commons@default:default"/>
+ <setEntry value="org.junit.platform.engine@default:default"/>
+ <setEntry value="org.junit.platform.launcher@default:default"/>
+ <setEntry value="org.junit.platform.runner@default:default"/>
+ <setEntry value="org.junit.platform.suite.api@default:default"/>
+ <setEntry value="org.junit.platform.suite.commons@default:default"/>
+ <setEntry value="org.junit.platform.suite.engine@default:default"/>
+ <setEntry value="org.junit.vintage.engine@default:default"/>
+ <setEntry value="org.junit@default:default"/>
+ <setEntry value="org.opentest4j@default:default"/>
+ <setEntry value="org.sat4j.core@default:default"/>
+ <setEntry value="org.sat4j.pb@default:default"/>
+ <setEntry value="org.slf4j.api@default:default"/>
+ <setEntry value="org.tukaani.xz@default:default"/>
+ <setEntry value="org.w3c.css.sac@default:default"/>
+ <setEntry value="org.w3c.dom.events@default:default"/>
+ <setEntry value="org.w3c.dom.smil@default:default"/>
+ <setEntry value="org.w3c.dom.svg@default:default"/>
+ </setAttribute>
+ <setAttribute key="selected_workspace_bundles">
+ <setEntry value="org.eclipse.emf.cdo.common@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.explorer@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.expressions@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.lm.assembly@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.lm.client@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.lm.modules@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.lm.server@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.lm@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.net4j@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.security@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.server.db@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.server.embedded@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.server.net4j@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.server.security@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.server@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.tests.lm@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.workspace@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo@default:default"/>
+ <setEntry value="org.eclipse.net4j.db.h2@default:default"/>
+ <setEntry value="org.eclipse.net4j.db.jdbc@default:default"/>
+ <setEntry value="org.eclipse.net4j.db@default:default"/>
+ <setEntry value="org.eclipse.net4j.jms.api@default:default"/>
+ <setEntry value="org.eclipse.net4j.jvm@default:default"/>
+ <setEntry value="org.eclipse.net4j.tcp@default:default"/>
+ <setEntry value="org.eclipse.net4j.tests@default:default"/>
+ <setEntry value="org.eclipse.net4j.util@default:default"/>
+ <setEntry value="org.eclipse.net4j.ws@default:default"/>
+ <setEntry value="org.eclipse.net4j@default:default"/>
+ </setAttribute>
+ <booleanAttribute key="show_selected_only" value="false"/>
+ <stringAttribute key="templateConfig" value="${target_home}\configuration\config.ini"/>
+ <booleanAttribute key="tracing" value="false"/>
+ <booleanAttribute key="useCustomFeatures" value="false"/>
+ <booleanAttribute key="useDefaultConfig" value="true"/>
+ <booleanAttribute key="useDefaultConfigArea" value="false"/>
+ <booleanAttribute key="useProduct" value="false"/>
+</launchConfiguration>
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/LMVersionEvolutionTest.launch b/plugins/org.eclipse.emf.cdo.tests.lm/LMVersionEvolutionTest.launch
new file mode 100644
index 0000000000..c507bd3fb2
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/LMVersionEvolutionTest.launch
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
+ <booleanAttribute key="append.args" value="true"/>
+ <stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
+ <booleanAttribute key="askclear" value="false"/>
+ <booleanAttribute key="automaticAdd" value="false"/>
+ <booleanAttribute key="automaticValidate" value="true"/>
+ <stringAttribute key="bootstrap" value=""/>
+ <stringAttribute key="checked" value="[NONE]"/>
+ <booleanAttribute key="clearConfig" value="true"/>
+ <booleanAttribute key="clearws" value="true"/>
+ <booleanAttribute key="clearwslog" value="false"/>
+ <stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
+ <booleanAttribute key="default" value="false"/>
+ <setAttribute key="deselected_workspace_bundles"/>
+ <booleanAttribute key="includeOptional" value="true"/>
+ <stringAttribute key="location" value="${workspace_loc}/../ws-LMIntegrationTest"/>
+ <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+ <listEntry value="/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/LMVersionEvolutionTest.java"/>
+ </listAttribute>
+ <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+ <listEntry value="1"/>
+ </listAttribute>
+ <stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+ <booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+ <stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+ <stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit5"/>
+ <booleanAttribute key="org.eclipse.jdt.launching.ATTR_ATTR_USE_ARGFILE" value="false"/>
+ <booleanAttribute key="org.eclipse.jdt.launching.ATTR_SHOW_CODEDETAILS_IN_EXCEPTION_MESSAGES" value="true"/>
+ <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
+ <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.emf.cdo.tests.lm.LMVersionEvolutionTest"/>
+ <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/>
+ <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.emf.cdo.tests.lm"/>
+ <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+ <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea&#13;&#10;-Dorg.eclipse.emf.cdo.internal.server.Repository.DISABLE_FEATURE_MAP_CHECKS=true"/>
+ <stringAttribute key="pde.version" value="3.3"/>
+ <stringAttribute key="product" value="org.eclipse.platform.ide"/>
+ <booleanAttribute key="run_in_ui_thread" value="false"/>
+ <setAttribute key="selected_target_bundles">
+ <setEntry value="com.ibm.icu@default:default"/>
+ <setEntry value="com.sun.jna.platform@default:default"/>
+ <setEntry value="com.sun.jna@default:default"/>
+ <setEntry value="jakarta.servlet-api@default:default"/>
+ <setEntry value="javax.annotation@default:default"/>
+ <setEntry value="javax.inject@default:default"/>
+ <setEntry value="org.apache.batik.constants@default:default"/>
+ <setEntry value="org.apache.batik.css@default:default"/>
+ <setEntry value="org.apache.batik.i18n@default:default"/>
+ <setEntry value="org.apache.batik.util@default:default"/>
+ <setEntry value="org.apache.commons.io@default:default"/>
+ <setEntry value="org.apache.commons.jxpath@default:default"/>
+ <setEntry value="org.apache.commons.logging@default:default"/>
+ <setEntry value="org.apache.felix.gogo.command@default:default"/>
+ <setEntry value="org.apache.felix.gogo.runtime@default:default"/>
+ <setEntry value="org.apache.felix.gogo.shell@default:default"/>
+ <setEntry value="org.apache.felix.scr@1:true"/>
+ <setEntry value="org.apache.log4j@default:default"/>
+ <setEntry value="org.apache.xmlgraphics@default:default"/>
+ <setEntry value="org.apiguardian@default:default"/>
+ <setEntry value="org.bouncycastle.bcpg@default:default"/>
+ <setEntry value="org.bouncycastle.bcprov@default:default"/>
+ <setEntry value="org.eclipse.ant.core@default:default"/>
+ <setEntry value="org.eclipse.compare.core@default:default"/>
+ <setEntry value="org.eclipse.compare@default:default"/>
+ <setEntry value="org.eclipse.core.commands@default:default"/>
+ <setEntry value="org.eclipse.core.contenttype@default:default"/>
+ <setEntry value="org.eclipse.core.databinding.observable@default:default"/>
+ <setEntry value="org.eclipse.core.databinding.property@default:default"/>
+ <setEntry value="org.eclipse.core.databinding@default:default"/>
+ <setEntry value="org.eclipse.core.expressions@default:default"/>
+ <setEntry value="org.eclipse.core.filebuffers@default:default"/>
+ <setEntry value="org.eclipse.core.filesystem.win32.x86_64@default:false"/>
+ <setEntry value="org.eclipse.core.filesystem@default:default"/>
+ <setEntry value="org.eclipse.core.jobs@default:default"/>
+ <setEntry value="org.eclipse.core.resources.win32.x86_64@default:false"/>
+ <setEntry value="org.eclipse.core.resources@default:default"/>
+ <setEntry value="org.eclipse.core.runtime@default:true"/>
+ <setEntry value="org.eclipse.core.variables@default:default"/>
+ <setEntry value="org.eclipse.debug.core@default:default"/>
+ <setEntry value="org.eclipse.debug.ui@default:default"/>
+ <setEntry value="org.eclipse.e4.core.commands@default:default"/>
+ <setEntry value="org.eclipse.e4.core.contexts@default:default"/>
+ <setEntry value="org.eclipse.e4.core.di.annotations@default:default"/>
+ <setEntry value="org.eclipse.e4.core.di.extensions.supplier@default:default"/>
+ <setEntry value="org.eclipse.e4.core.di.extensions@default:default"/>
+ <setEntry value="org.eclipse.e4.core.di@default:default"/>
+ <setEntry value="org.eclipse.e4.core.services@default:default"/>
+ <setEntry value="org.eclipse.e4.emf.xpath@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.bindings@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.css.core@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.css.swt.theme@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.css.swt@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.di@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.dialogs@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.ide@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.model.workbench@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.services@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.swt.win32@default:false"/>
+ <setEntry value="org.eclipse.e4.ui.widgets@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench.addons.swt@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench.renderers.swt@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench.swt@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench3@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench@default:default"/>
+ <setEntry value="org.eclipse.emf.common@default:default"/>
+ <setEntry value="org.eclipse.emf.ecore.change@default:default"/>
+ <setEntry value="org.eclipse.emf.ecore.xmi@default:default"/>
+ <setEntry value="org.eclipse.emf.ecore@default:default"/>
+ <setEntry value="org.eclipse.equinox.app@default:default"/>
+ <setEntry value="org.eclipse.equinox.bidi@default:default"/>
+ <setEntry value="org.eclipse.equinox.common@2:true"/>
+ <setEntry value="org.eclipse.equinox.event@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.artifact.repository@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.core@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.director@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.engine@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.jarprocessor@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.metadata.repository@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.metadata@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.repository@default:default"/>
+ <setEntry value="org.eclipse.equinox.preferences@default:default"/>
+ <setEntry value="org.eclipse.equinox.registry@default:default"/>
+ <setEntry value="org.eclipse.equinox.security.win32.x86_64@default:false"/>
+ <setEntry value="org.eclipse.equinox.security@default:default"/>
+ <setEntry value="org.eclipse.equinox.simpleconfigurator@1:true"/>
+ <setEntry value="org.eclipse.equinox.weaving.hook@default:false"/>
+ <setEntry value="org.eclipse.help@default:default"/>
+ <setEntry value="org.eclipse.jdt.annotation*2.2.600.v20200408-1511@default:default"/>
+ <setEntry value="org.eclipse.jdt.compiler.apt@default:false"/>
+ <setEntry value="org.eclipse.jdt.compiler.tool@default:false"/>
+ <setEntry value="org.eclipse.jdt.core.manipulation@default:default"/>
+ <setEntry value="org.eclipse.jdt.core@default:default"/>
+ <setEntry value="org.eclipse.jdt.debug.ui@default:default"/>
+ <setEntry value="org.eclipse.jdt.debug@default:default"/>
+ <setEntry value="org.eclipse.jdt.junit.runtime@default:default"/>
+ <setEntry value="org.eclipse.jdt.junit5.runtime@default:default"/>
+ <setEntry value="org.eclipse.jdt.launching@default:default"/>
+ <setEntry value="org.eclipse.jdt.ui@default:default"/>
+ <setEntry value="org.eclipse.jetty.alpn.client@default:default"/>
+ <setEntry value="org.eclipse.jetty.client@default:default"/>
+ <setEntry value="org.eclipse.jetty.http@default:default"/>
+ <setEntry value="org.eclipse.jetty.io@default:default"/>
+ <setEntry value="org.eclipse.jetty.security@default:default"/>
+ <setEntry value="org.eclipse.jetty.server@default:default"/>
+ <setEntry value="org.eclipse.jetty.servlet@default:default"/>
+ <setEntry value="org.eclipse.jetty.util.ajax@default:default"/>
+ <setEntry value="org.eclipse.jetty.util@default:default"/>
+ <setEntry value="org.eclipse.jetty.webapp@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.api@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.client@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.common@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.core.client@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.core.common@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.core.server@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.server@default:default"/>
+ <setEntry value="org.eclipse.jetty.websocket.servlet@default:default"/>
+ <setEntry value="org.eclipse.jetty.xml@default:default"/>
+ <setEntry value="org.eclipse.jface.databinding@default:default"/>
+ <setEntry value="org.eclipse.jface.text@default:default"/>
+ <setEntry value="org.eclipse.jface@default:default"/>
+ <setEntry value="org.eclipse.ltk.core.refactoring@default:default"/>
+ <setEntry value="org.eclipse.ltk.ui.refactoring@default:default"/>
+ <setEntry value="org.eclipse.osgi.compatibility.state@default:false"/>
+ <setEntry value="org.eclipse.osgi.services@default:default"/>
+ <setEntry value="org.eclipse.osgi.util@default:default"/>
+ <setEntry value="org.eclipse.osgi@1:true"/>
+ <setEntry value="org.eclipse.pde.junit.runtime@default:default"/>
+ <setEntry value="org.eclipse.rap.tools.launch.rwt@default:default"/>
+ <setEntry value="org.eclipse.search@default:default"/>
+ <setEntry value="org.eclipse.swt.win32.win32.x86_64@default:false"/>
+ <setEntry value="org.eclipse.swt@default:default"/>
+ <setEntry value="org.eclipse.team.core@default:default"/>
+ <setEntry value="org.eclipse.team.ui@default:default"/>
+ <setEntry value="org.eclipse.text@default:default"/>
+ <setEntry value="org.eclipse.ui.console@default:default"/>
+ <setEntry value="org.eclipse.ui.editors@default:default"/>
+ <setEntry value="org.eclipse.ui.forms@default:default"/>
+ <setEntry value="org.eclipse.ui.genericeditor@default:default"/>
+ <setEntry value="org.eclipse.ui.ide@default:default"/>
+ <setEntry value="org.eclipse.ui.navigator.resources@default:default"/>
+ <setEntry value="org.eclipse.ui.navigator@default:default"/>
+ <setEntry value="org.eclipse.ui.views.properties.tabbed@default:default"/>
+ <setEntry value="org.eclipse.ui.views@default:default"/>
+ <setEntry value="org.eclipse.ui.win32@default:false"/>
+ <setEntry value="org.eclipse.ui.workbench.texteditor@default:default"/>
+ <setEntry value="org.eclipse.ui.workbench@default:default"/>
+ <setEntry value="org.eclipse.ui@default:default"/>
+ <setEntry value="org.eclipse.urischeme@default:default"/>
+ <setEntry value="org.h2@default:default"/>
+ <setEntry value="org.hamcrest.core@default:default"/>
+ <setEntry value="org.junit.jupiter.api@default:default"/>
+ <setEntry value="org.junit.jupiter.engine@default:default"/>
+ <setEntry value="org.junit.jupiter.migrationsupport@default:default"/>
+ <setEntry value="org.junit.jupiter.params@default:default"/>
+ <setEntry value="org.junit.platform.commons@default:default"/>
+ <setEntry value="org.junit.platform.engine@default:default"/>
+ <setEntry value="org.junit.platform.launcher@default:default"/>
+ <setEntry value="org.junit.platform.runner@default:default"/>
+ <setEntry value="org.junit.platform.suite.api@default:default"/>
+ <setEntry value="org.junit.platform.suite.commons@default:default"/>
+ <setEntry value="org.junit.platform.suite.engine@default:default"/>
+ <setEntry value="org.junit.vintage.engine@default:default"/>
+ <setEntry value="org.junit@default:default"/>
+ <setEntry value="org.opentest4j@default:default"/>
+ <setEntry value="org.sat4j.core@default:default"/>
+ <setEntry value="org.sat4j.pb@default:default"/>
+ <setEntry value="org.slf4j.api@default:default"/>
+ <setEntry value="org.tukaani.xz@default:default"/>
+ <setEntry value="org.w3c.css.sac@default:default"/>
+ <setEntry value="org.w3c.dom.events@default:default"/>
+ <setEntry value="org.w3c.dom.smil@default:default"/>
+ <setEntry value="org.w3c.dom.svg@default:default"/>
+ </setAttribute>
+ <setAttribute key="selected_workspace_bundles">
+ <setEntry value="org.eclipse.emf.cdo.common@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.explorer@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.expressions@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.lm.assembly@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.lm.client@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.lm.modules@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.lm.server@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.lm@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.net4j@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.security@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.server.db@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.server.embedded@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.server.net4j@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.server.security@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.server@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.tests.lm@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo.workspace@default:default"/>
+ <setEntry value="org.eclipse.emf.cdo@default:default"/>
+ <setEntry value="org.eclipse.net4j.db.h2@default:default"/>
+ <setEntry value="org.eclipse.net4j.db.jdbc@default:default"/>
+ <setEntry value="org.eclipse.net4j.db@default:default"/>
+ <setEntry value="org.eclipse.net4j.jms.api@default:default"/>
+ <setEntry value="org.eclipse.net4j.jvm@default:default"/>
+ <setEntry value="org.eclipse.net4j.tcp@default:default"/>
+ <setEntry value="org.eclipse.net4j.tests@default:default"/>
+ <setEntry value="org.eclipse.net4j.util@default:default"/>
+ <setEntry value="org.eclipse.net4j.ws@default:default"/>
+ <setEntry value="org.eclipse.net4j@default:default"/>
+ </setAttribute>
+ <booleanAttribute key="show_selected_only" value="false"/>
+ <stringAttribute key="templateConfig" value="${target_home}\configuration\config.ini"/>
+ <booleanAttribute key="tracing" value="false"/>
+ <booleanAttribute key="useCustomFeatures" value="false"/>
+ <booleanAttribute key="useDefaultConfig" value="true"/>
+ <booleanAttribute key="useDefaultConfigArea" value="false"/>
+ <booleanAttribute key="useProduct" value="false"/>
+</launchConfiguration>
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.tests.lm/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..60793dad77
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.emf.cdo.tests.lm;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-ActivationPolicy: lazy
+Bundle-Activator: org.eclipse.emf.cdo.tests.lm.bundle.OM$Activator
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Bundle-ClassPath: .
+Require-Bundle: org.eclipse.net4j.tests;bundle-version="[4.0.0,5.0.0)";visibility:=reexport,
+ org.eclipse.emf.cdo.explorer;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.emf.cdo.lm.client;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.emf.cdo.lm.server;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.emf.cdo.server.db;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.emf.cdo.server.net4j;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.net4j.db.h2;bundle-version="[4.0.0,5.0.0)",
+ org.h2;bundle-version="[1.0.0,2.0.0)",
+ org.junit.jupiter.api;bundle-version="[5.0.0,6.0.0)"
+Automatic-Module-Name: org.eclipse.emf.cdo.tests.lm
+Export-Package: org.eclipse.emf.cdo.tests.lm;version="1.0.0",
+ org.eclipse.emf.cdo.tests.lm.bundle;version="1.0.0";x-internal:=true
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/about.html b/plugins/org.eclipse.emf.cdo.tests.lm/about.html
new file mode 100644
index 0000000000..d35d5aed64
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2007</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/build.properties b/plugins/org.eclipse.emf.cdo.tests.lm/build.properties
new file mode 100644
index 0000000000..ef4b3b8d87
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/build.properties
@@ -0,0 +1,21 @@
+# Copyright (c) 2022 Eike Stepper (Loehne, Germany) and others.
+# 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:
+# Eike Stepper - initial API and implementation
+
+source.. = src/
+output.. = bin/
+
+src.includes = about.html,\
+ pom.xml
+bin.includes = .,\
+ META-INF/,\
+ plugin.properties,\
+ about.html
+
+jars.compile.order = .
+generateSourceReferences = true
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/plugin.properties b/plugins/org.eclipse.emf.cdo.tests.lm/plugin.properties
new file mode 100644
index 0000000000..bf13d2e4cd
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/plugin.properties
@@ -0,0 +1,11 @@
+# Copyright (c) 2022 Eike Stepper (Loehne, Germany) and others.
+# 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:
+# Eike Stepper - initial API and implementation
+
+pluginName = CDO Model Repository Tests (Lifecycle Management)
+providerName = Eclipse Modeling Project
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/pom.xml b/plugins/org.eclipse.emf.cdo.tests.lm/pom.xml
new file mode 100644
index 0000000000..0e1647d899
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/pom.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2017-2022 Eike Stepper (Loehne, Germany) and others.
+ 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:
+ Eike Stepper - initial API and implementation
+-->
+<project
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.emf.cdo</groupId>
+ <artifactId>org.eclipse.emf.cdo.plugins</artifactId>
+ <version>4.7.0-SNAPSHOT</version>
+ <relativePath>../../releng/org.eclipse.emf.cdo.releng.parent/plugins</relativePath>
+ </parent>
+
+ <groupId>org.eclipse.emf.cdo</groupId>
+ <artifactId>org.eclipse.emf.cdo.tests.lm</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>eclipse-test-plugin</packaging>
+
+</project>
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/AbstractIntegrationTest.java b/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/AbstractIntegrationTest.java
new file mode 100644
index 0000000000..1ceb847df9
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/AbstractIntegrationTest.java
@@ -0,0 +1,362 @@
+/*
+ * Copyright (c) 2022 Eike Stepper (Loehne, Germany) and others.
+ * 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:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests.lm;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.eclipse.emf.cdo.common.branch.CDOBranch;
+import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
+import org.eclipse.emf.cdo.common.branch.CDOBranchPointRef;
+import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout;
+import org.eclipse.emf.cdo.lm.Change;
+import org.eclipse.emf.cdo.lm.Drop;
+import org.eclipse.emf.cdo.lm.DropType;
+import org.eclipse.emf.cdo.lm.Module;
+import org.eclipse.emf.cdo.lm.Stream;
+import org.eclipse.emf.cdo.lm.StreamMode;
+import org.eclipse.emf.cdo.lm.StreamSpec;
+import org.eclipse.emf.cdo.lm.System;
+import org.eclipse.emf.cdo.lm.assembly.Assembly;
+import org.eclipse.emf.cdo.lm.assembly.AssemblyModule;
+import org.eclipse.emf.cdo.lm.client.IAssemblyDescriptor;
+import org.eclipse.emf.cdo.lm.client.IAssemblyDescriptor.Updates;
+import org.eclipse.emf.cdo.lm.client.IAssemblyManager;
+import org.eclipse.emf.cdo.lm.client.ISystemDescriptor;
+import org.eclipse.emf.cdo.lm.modules.DependencyDefinition;
+import org.eclipse.emf.cdo.lm.modules.ModuleDefinition;
+import org.eclipse.emf.cdo.lm.modules.ModulesFactory;
+import org.eclipse.emf.cdo.lm.util.LMMerger;
+import org.eclipse.emf.cdo.transaction.CDOTransaction;
+import org.eclipse.emf.cdo.util.InvalidURIException;
+import org.eclipse.emf.cdo.view.CDOView;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.equinox.p2.metadata.Version;
+import org.eclipse.equinox.p2.metadata.VersionRange;
+
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+/**
+ * @author Eike Stepper
+ */
+public abstract class AbstractIntegrationTest extends AbstractLMTest
+{
+ protected Stream createStream(ISystemDescriptor systemDescriptor, Module module, Drop base, int major, int minor, String streamCodeName) throws Exception
+ {
+ Stream stream = systemDescriptor.createStream(module, base, new StreamSpec(major, minor, streamCodeName), monitor());
+
+ assertThat(stream.getModule(), is(module));
+ assertThat(stream.getSystem(), is(systemDescriptor.getSystem()));
+ assertThat(stream.getMajorVersion(), is(major));
+ assertThat(stream.getMinorVersion(), is(minor));
+ assertThat(stream.getCodeName(), is(streamCodeName));
+ assertThat(stream.getMode(), is(StreamMode.DEVELOPMENT));
+ assertThat(stream.getBranchPoint(), is(CDOBranchPointRef.MAIN_HEAD));
+ assertThat(stream, is(module.getStream(streamCodeName)));
+
+ return stream;
+ }
+
+ protected ModuleCreationResult createModule(ISystemDescriptor systemDescriptor, System system, String moduleName, String streamCodeName, int major, int minor)
+ throws Exception
+ {
+ Module module = systemDescriptor.createModule(moduleName, new StreamSpec(major, minor, streamCodeName), monitor());
+
+ Stream stream = module.getStream(0, 1);
+ String label = moduleName + "- Stream " + major + "." + minor;
+
+ IAssemblyDescriptor assemblyDescriptor = IAssemblyManager.INSTANCE.createDescriptor(label, stream, monitor());
+ {
+ assertThat(stream.getModule(), is(module));
+ assertThat(stream.getSystem(), is(system));
+ assertThat(stream.getMajorVersion(), is(major));
+ assertThat(stream.getMinorVersion(), is(minor));
+ assertThat(stream.getCodeName(), is(streamCodeName));
+ assertThat(stream.getMode(), is(StreamMode.DEVELOPMENT));
+ assertThat(stream.getBase(), nullValue());
+ assertThat(stream.getBranchPoint(), is(CDOBranchPointRef.MAIN_HEAD));
+ assertThat(stream, is(module.getStream(streamCodeName)));
+
+ assertThat(assemblyDescriptor.getSystemDescriptor(), is(systemDescriptor));
+ assertThat(assemblyDescriptor.getName(), is(label));
+ assertThat(assemblyDescriptor.getBaseline(), is(stream));
+
+ CDOCheckout checkout = assemblyDescriptor.getCheckout();
+ assertThat(checkout.isOnline(), is(true));
+ assertThat(checkout.isOpen(), is(true));
+ assertThat(checkout.getLabel(), is(label));
+ assertThat(checkout.getBranchPath(), is(CDOBranch.MAIN_BRANCH_NAME));
+ assertThat(checkout.getTimeStamp(), is(CDOBranchPoint.UNSPECIFIED_DATE));
+ assertThat(checkout.getRepository(), is(systemDescriptor.getModuleRepository(moduleName)));
+ assertThat(checkout.getView().getViewSet().getViews().length, is(1));
+
+ Assembly assembly = assemblyDescriptor.getAssembly();
+ assertThat(assembly.getSystemName(), is(SYSTEM_NAME));
+ assertThat(assembly.getModules().size(), is(1));
+
+ AssemblyModule assemblyModule = assembly.getModules().get(0);
+ assertThat(assemblyModule.getName(), is(moduleName));
+ assertThat(assemblyModule.getBranchPoint(), is(CDOBranchPointRef.MAIN_HEAD));
+
+ systemDescriptor.withModuleSession(moduleName, session -> {
+ CDOView view = session.openView();
+ CDOResource resource = view.getResource(MODULE_DEFINITION_PATH);
+ ModuleDefinition moduleDefinition = (ModuleDefinition)resource.getContents().get(0);
+ assertThat(moduleDefinition.getName(), is(moduleName));
+ assertThat(moduleDefinition.getVersion(), is(Version.createOSGi(major, minor, 0)));
+ assertThat(moduleDefinition.getDependencies().size(), is(0));
+ });
+ }
+
+ return new ModuleCreationResult(module, stream, assemblyDescriptor);
+
+ }
+
+ protected void setModuleVersion(Stream stream1_0, String moduleName, int major, int minor, int micro) throws Exception
+ {
+ IAssemblyDescriptor stream1_0Descriptor = IAssemblyManager.INSTANCE.createDescriptor("Checkout - Stream 1.0", stream1_0, monitor());
+
+ editStream(stream1_0Descriptor, transaction -> {
+ CDOResource moduleDefinitionResource = transaction.getResource(MODULE_DEFINITION_PATH);
+
+ EObject rootObject = moduleDefinitionResource.getContents().get(0);
+ assertThat(rootObject, notNullValue());
+ assertThat(rootObject, instanceOf(ModuleDefinition.class));
+
+ if (rootObject instanceof ModuleDefinition)
+ {
+ ModuleDefinition moduleDefinition = (ModuleDefinition)rootObject;
+ assertThat(moduleDefinition.getName(), is(moduleName));
+ moduleDefinition.setVersion(Version.createOSGi(major, minor, micro));
+
+ }
+
+ });
+ }
+
+ protected Change createChange(ISystemDescriptor systemDescriptor, Stream stream, String changeLabel, String changeDescriptorLabel,
+ Consumer<CDOTransaction> editFunction) throws Exception
+ {
+ Change change = systemDescriptor.createChange(stream, null, changeLabel, monitor());
+
+ IAssemblyDescriptor change1Descriptor = IAssemblyManager.INSTANCE.createDescriptor(changeDescriptorLabel, change, monitor());
+ CDOCheckout checkout = change1Descriptor.getCheckout();
+ assertThat(checkout.getView().getViewSet().getViews().length, is(1));
+
+ CDOTransaction transaction = checkout.openTransaction();
+ editFunction.accept(transaction);
+ transaction.commit();
+ transaction.close();
+
+ checkout.delete(true);
+ return change;
+ }
+
+ protected void editStream(IAssemblyDescriptor streamDescriptor, Consumer<CDOTransaction> editFunction) throws Exception
+ {
+ CDOTransaction transaction = streamDescriptor.getCheckout().openTransaction();
+ editFunction.accept(transaction);
+ transaction.commit();
+ transaction.close();
+ }
+
+ protected void deliverChange(ISystemDescriptor systemDescriptor, Stream stream, Change change) throws Exception
+ {
+ systemDescriptor.createDelivery(stream, change, LMMerger.CORE, monitor());
+ }
+
+ protected void removeDependencies(IAssemblyDescriptor clientStreamDescriptor) throws Exception
+ {
+ CDOCheckout checkout = clientStreamDescriptor.getCheckout();
+
+ CDOTransaction transaction = checkout.openTransaction();
+ CDOResource resource = transaction.getResource(MODULE_DEFINITION_PATH);
+ ModuleDefinition moduleDefinition = (ModuleDefinition)resource.getContents().get(0);
+ moduleDefinition.getDependencies().clear();
+ transaction.commit();
+
+ Updates updates = waitForUpdates(clientStreamDescriptor);
+ assertThat(updates.getAdditions().size(), is(0));
+ assertThat(updates.getModifications().size(), is(1)); // Dependency removed from Module2.
+ assertThat(updates.getRemovals().size(), is(1)); // Module1 removed.
+
+ CDOView[] views = transaction.getViewSet().getViews();
+ assertThat(views.length, is(2));
+
+ clientStreamDescriptor.update();
+ views = transaction.getViewSet().getViews();
+ assertThat(views.length, is(1));
+ assertThat(views[0], is(transaction));
+ transaction.close();
+ }
+
+ protected long publishDrop(ISystemDescriptor systemDescriptor, System system, Stream stream, String name, String type) throws Exception
+ {
+ long timeStamp = java.lang.System.currentTimeMillis();
+ DropType dropType = system.getProcess().getDropType(type);
+
+ Drop drop = systemDescriptor.createDrop(stream, dropType, timeStamp, name, monitor());
+ assertThat(drop.getBranchPoint().getTimeStamp(), is(timeStamp));
+
+ return timeStamp;
+ }
+
+ protected long publishRelease(ISystemDescriptor systemDescriptor, System system, Stream stream, String releaseName) throws Exception
+ {
+ return publishDrop(systemDescriptor, system, stream, releaseName, "Release");
+ }
+
+ protected long publishTag(ISystemDescriptor systemDescriptor, System system, Stream stream, String tagName) throws Exception
+ {
+ return publishDrop(systemDescriptor, system, stream, tagName, "Tag");
+ }
+
+ protected void publishTagUpdateClientAndCheckUri(ISystemDescriptor systemDescriptor, System system, Stream supplierStream,
+ IAssemblyDescriptor clientStreamDescriptor, URI uri) throws Exception
+ {
+ // Check that no updates are available in clientStreamDescriptor
+ assertThat(clientStreamDescriptor.hasUpdatesAvailable(), is(false));
+
+ // Verify that the uri resource is not visible, yet.
+ CDOView view = clientStreamDescriptor.getCheckout().openView();
+ ResourceSet resourceSet = view.getResourceSet();
+
+ try
+ {
+ resourceSet.getResource(uri, true);
+ fail("InvalidURIException expected");
+ }
+ catch (InvalidURIException expected)
+ {
+ // Success.
+ }
+
+ long timeStamp = publishTag(systemDescriptor, system, supplierStream, "TagName");
+
+ Updates updates = waitForUpdates(clientStreamDescriptor);
+ assertThat(updates.getAdditions().size(), is(0));
+ assertThat(updates.getModifications().size(), is(1));
+ assertThat(updates.getRemovals().size(), is(0));
+
+ clientStreamDescriptor.update();
+
+ // Verify that the uri resource is now visible.
+ CDOResource resource = (CDOResource)resourceSet.getResource(uri, true);
+ assertThat(resource, notNullValue());
+ assertThat(resource.cdoView().getTimeStamp(), is(timeStamp));
+ view.close();
+ }
+
+ protected void updateClient(IAssemblyDescriptor clientStreamDescriptor) throws Exception
+ {
+ waitForUpdates(clientStreamDescriptor);
+ clientStreamDescriptor.update();
+ }
+
+ protected void updateDependency(IAssemblyDescriptor clientStreamDescriptor, String supplierName, VersionRange newVersionRange) throws Exception
+ {
+ CDOCheckout checkout = clientStreamDescriptor.getCheckout();
+
+ CDOTransaction transaction = checkout.openTransaction();
+ CDOResource resource = transaction.getResource(MODULE_DEFINITION_PATH);
+ ModuleDefinition moduleDefinition = (ModuleDefinition)resource.getContents().get(0);
+
+ List<DependencyDefinition> dependencies = moduleDefinition.getDependencies().stream()
+ .filter(dependencyDefinition -> dependencyDefinition.getTargetName().equals(supplierName)).collect(Collectors.toList());
+ assertThat(dependencies.size(), is(1));
+
+ dependencies.get(0).setVersionRange(newVersionRange);
+
+ transaction.commit();
+ }
+
+ protected void createDependency(IAssemblyDescriptor clientStreamDescriptor, String supplierName, VersionRange versionRange) throws Exception
+ {
+ CDOCheckout checkout = clientStreamDescriptor.getCheckout();
+
+ CDOTransaction transaction = checkout.openTransaction();
+ CDOResource resource = transaction.getResource(MODULE_DEFINITION_PATH);
+ ModuleDefinition moduleDefinition = (ModuleDefinition)resource.getContents().get(0);
+ moduleDefinition.getDependencies().add(ModulesFactory.eINSTANCE.createDependencyDefinition(supplierName, versionRange));
+ transaction.commit();
+
+ transaction.close();
+ }
+
+ protected void createDependencyAndUpdate(IAssemblyDescriptor clientStreamDescriptor, String supplierName, VersionRange versionRange) throws Exception
+ {
+ CDOCheckout checkout = clientStreamDescriptor.getCheckout();
+
+ createDependency(clientStreamDescriptor, supplierName, versionRange);
+
+ CDOTransaction transaction = checkout.openTransaction();
+ Updates updates = waitForUpdates(clientStreamDescriptor);
+ assertThat(updates.getAdditions().get(supplierName), notNullValue()); // supplier added.
+ assertThat(updates.getModifications().size(), is(1)); // Dependency added to source.
+ assertThat(updates.getRemovals().size(), is(0));
+ assertThat(checkout.getView().getViewSet().getViews().length, is(1));
+
+ CDOView[] views = transaction.getViewSet().getViews();
+ assertThat(views.length, is(1));
+ assertThat(views[0], is(transaction));
+
+ clientStreamDescriptor.update();
+ views = transaction.getViewSet().getViews();
+ assertThat(views.length, is(2));
+ assertThat(views[0], is(transaction));
+ assertThat(views[1].isReadOnly(), is(true));
+ assertThat(checkout.getView().getViewSet().getViews().length, is(2));
+
+ transaction.close();
+ }
+
+ protected void createDependencyAndUpdate(IAssemblyDescriptor clientStreamDescriptor, String supplierName) throws Exception
+ {
+ createDependencyAndUpdate(clientStreamDescriptor, supplierName, null);
+ }
+
+ public static IProgressMonitor monitor()
+ {
+ return new NullProgressMonitor();
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public static final class ModuleCreationResult
+ {
+ public final Module module;
+
+ public final Stream stream;
+
+ public final IAssemblyDescriptor assemblyDescriptor;
+
+ public ModuleCreationResult(Module module, Stream stream, IAssemblyDescriptor assemblyDescriptor)
+ {
+ this.module = module;
+ this.stream = stream;
+ this.assemblyDescriptor = assemblyDescriptor;
+ }
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/AbstractLMTest.java b/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/AbstractLMTest.java
new file mode 100644
index 0000000000..bd16a7fa58
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/AbstractLMTest.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright (c) 2022 Eike Stepper (Loehne, Germany) and others.
+ * 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:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests.lm;
+
+import org.eclipse.emf.cdo.explorer.CDOExplorerUtil;
+import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout;
+import org.eclipse.emf.cdo.explorer.repositories.CDORepository;
+import org.eclipse.emf.cdo.explorer.repositories.CDORepositoryManager;
+import org.eclipse.emf.cdo.lm.LMFactory;
+import org.eclipse.emf.cdo.lm.client.IAssemblyDescriptor;
+import org.eclipse.emf.cdo.lm.client.IAssemblyDescriptor.Updates;
+import org.eclipse.emf.cdo.lm.client.ISystemDescriptor;
+import org.eclipse.emf.cdo.lm.client.ISystemManager;
+import org.eclipse.emf.cdo.lm.server.AbstractLifecycleManager;
+import org.eclipse.emf.cdo.server.CDOServerUtil;
+import org.eclipse.emf.cdo.server.IRepository;
+import org.eclipse.emf.cdo.server.IStore;
+import org.eclipse.emf.cdo.server.db.CDODBUtil;
+import org.eclipse.emf.cdo.server.db.mapping.IMappingStrategy;
+import org.eclipse.emf.cdo.server.db.mapping.ITypeMapping;
+import org.eclipse.emf.cdo.server.net4j.CDONet4jServerUtil;
+import org.eclipse.emf.cdo.spi.server.InternalRepository;
+import org.eclipse.emf.cdo.tests.lm.bundle.OM;
+
+import org.eclipse.net4j.Net4jUtil;
+import org.eclipse.net4j.acceptor.IAcceptor;
+import org.eclipse.net4j.db.IDBAdapter;
+import org.eclipse.net4j.db.IDBConnectionProvider;
+import org.eclipse.net4j.db.h2.H2Adapter;
+import org.eclipse.net4j.jvm.JVMUtil;
+import org.eclipse.net4j.util.container.IPluginContainer;
+import org.eclipse.net4j.util.io.TMPUtil;
+import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
+import org.eclipse.net4j.util.om.OMPlatform;
+
+import org.eclipse.core.runtime.CoreException;
+
+import org.h2.jdbcx.JdbcDataSource;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.TestInfo;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * @author Eike Stepper
+ */
+public abstract class AbstractLMTest
+{
+ public static final String SYSTEM_NAME = "System2022";
+
+ public static final String MODULE_DEFINITION_PATH = "module.md";
+
+ public static final IPluginContainer CONTAINER = IPluginContainer.INSTANCE;
+
+ @SuppressWarnings("restriction")
+ private static final String BROWSER_PORT = org.eclipse.emf.cdo.internal.server.bundle.CDOServerApplication.PROP_BROWSER_PORT;
+
+ private static final boolean STAND_ALONE = !OMPlatform.INSTANCE.isOSGiRunning();
+
+ private static final File TEST_FOLDER = STAND_ALONE ? //
+ TMPUtil.createTempFolder("lm-tests-") : //
+ new File(OM.BUNDLE.getStateLocation());
+
+ private static final String ACCEPTOR_NAME = "lm-test";
+
+ private InternalRepository systemRepository;
+
+ private AbstractLifecycleManager lifecycleManager;
+
+ private IAcceptor acceptor;
+
+ static
+ {
+ System.out.println("Test Folder: " + TEST_FOLDER);
+
+ if (STAND_ALONE)
+ {
+ Net4jUtil.prepareContainer(CONTAINER);
+ JVMUtil.prepareContainer(CONTAINER);
+ CDONet4jServerUtil.prepareContainer(CONTAINER);
+ CDODBUtil.prepareContainer(CONTAINER);
+ CONTAINER.activate();
+
+ ITypeMapping.Registry.INSTANCE.getClass();
+ }
+
+ String port = OMPlatform.INSTANCE.getProperty(BROWSER_PORT);
+ if (port != null)
+ {
+ System.out.println("DB Browser: http://localhost:" + port);
+ CONTAINER.getElement("org.eclipse.emf.cdo.server.browsers", "default", port);
+ }
+
+ System.out.println();
+ }
+
+ private static InternalRepository createRepository(String name, File dbFolder)
+ {
+ JdbcDataSource dataSource = new JdbcDataSource();
+ dataSource.setURL("jdbc:h2:" + dbFolder.toURI() + "/" + name);
+
+ IMappingStrategy mappingStrategy = CDODBUtil.createHorizontalMappingStrategy(true, true);
+ IDBAdapter dbAdapter = new H2Adapter();
+ IDBConnectionProvider dbConnectionProvider = dbAdapter.createConnectionProvider(dataSource);
+ IStore store = CDODBUtil.createStore(mappingStrategy, dbAdapter, dbConnectionProvider);
+
+ Map<String, String> props = new HashMap<>();
+ props.put(IRepository.Props.OVERRIDE_UUID, "");
+ props.put(IRepository.Props.SUPPORTING_AUDITS, "true");
+ props.put(IRepository.Props.SUPPORTING_BRANCHES, "true");
+
+ InternalRepository repository = (InternalRepository)CDOServerUtil.createRepository(name, store, props);
+ CDOServerUtil.addRepository(CONTAINER, repository);
+ return repository;
+ }
+
+ @BeforeEach
+ @SuppressWarnings("restriction")
+ protected void setUp(TestInfo testInfo) throws Exception
+ {
+ String testName = testInfo.getTestClass().get().getSimpleName() + "." + testInfo.getTestMethod().get().getName();
+ System.out.println("+++++++++++++++++++++++ " + testName + "() +++++++++++++++++++++++");
+
+ File testFolder = new File(TEST_FOLDER, testName);
+ System.out.println("Test folder: " + testFolder);
+
+ File dbFolder = new File(testFolder, "db");
+ dbFolder.mkdirs();
+
+ systemRepository = createRepository(SYSTEM_NAME, dbFolder);
+
+ lifecycleManager = new AbstractLifecycleManager()
+ {
+ @Override
+ protected InternalRepository createModuleRepository(String moduleName) throws CoreException
+ {
+ return createRepository(moduleName, dbFolder);
+ }
+ };
+
+ lifecycleManager.setProcessInitializer(process -> {
+ process.getDropTypes().add(LMFactory.eINSTANCE.createDropType("Tag", false));
+ process.getDropTypes().add(LMFactory.eINSTANCE.createDropType("Milestone", false));
+ process.getDropTypes().add(LMFactory.eINSTANCE.createDropType("Release", true));
+ });
+
+ lifecycleManager.setSystemRepository(systemRepository);
+ lifecycleManager.setSystemName(SYSTEM_NAME);
+ lifecycleManager.setModuleDefinitionPath(MODULE_DEFINITION_PATH);
+ lifecycleManager.activate();
+
+ acceptor = JVMUtil.getAcceptor(CONTAINER, ACCEPTOR_NAME);
+
+ if (STAND_ALONE)
+ {
+ org.eclipse.emf.cdo.internal.explorer.bundle.OM.initializeManagers(new File(testFolder, "explorer"));
+ org.eclipse.emf.cdo.lm.internal.client.bundle.OM.initializeManagers();
+ }
+ }
+
+ @AfterEach
+ @SuppressWarnings("restriction")
+ protected void tearDown() throws Exception
+ {
+ if (STAND_ALONE)
+ {
+ org.eclipse.emf.cdo.lm.internal.client.bundle.OM.disposeManagers();
+ org.eclipse.emf.cdo.internal.explorer.bundle.OM.disposeManagers();
+ }
+ else
+ {
+ for (CDOCheckout checkout : CDOExplorerUtil.getCheckoutManager().getCheckouts())
+ {
+ checkout.delete(true);
+ }
+
+ for (CDORepository repository : CDOExplorerUtil.getRepositoryManager().getRepositories())
+ {
+ repository.delete(true);
+ }
+ }
+
+ LifecycleUtil.deactivate(acceptor);
+ LifecycleUtil.deactivate(lifecycleManager);
+ LifecycleUtil.deactivate(systemRepository);
+
+ System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
+ }
+
+ protected static ISystemDescriptor createSystemRepository()
+ {
+ Properties props = new Properties();
+ props.put("type", "remote");
+ props.put("name", SYSTEM_NAME);
+ props.put("label", SYSTEM_NAME);
+ props.put("connectorType", "jvm");
+ props.put("connectorDescription", ACCEPTOR_NAME);
+
+ CDORepositoryManager repositoryManager = CDOExplorerUtil.getRepositoryManager();
+ CDORepository repository = repositoryManager.addRepository(props);
+ repository.connect();
+
+ ISystemDescriptor systemDescriptor = ISystemManager.INSTANCE.getDescriptor(SYSTEM_NAME, 5000);
+ systemDescriptor.open();
+ return systemDescriptor;
+ }
+
+ protected static Updates waitForUpdates(IAssemblyDescriptor assemblyDescriptor) throws InterruptedException
+ {
+ long end = System.currentTimeMillis() + 10000L;
+ while (!assemblyDescriptor.hasUpdatesAvailable())
+ {
+ if (System.currentTimeMillis() > end)
+ {
+ throw new InterruptedException();
+ }
+
+ Thread.sleep(10);
+ }
+
+ return assemblyDescriptor.getAvailableUpdates();
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/LMIntegrationTest.java b/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/LMIntegrationTest.java
new file mode 100644
index 0000000000..6c81cafd1b
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/LMIntegrationTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2022 Eike Stepper (Loehne, Germany) and others.
+ * 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:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests.lm;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants;
+import org.eclipse.emf.cdo.lm.Change;
+import org.eclipse.emf.cdo.lm.Stream;
+import org.eclipse.emf.cdo.lm.System;
+import org.eclipse.emf.cdo.lm.client.IAssemblyDescriptor;
+import org.eclipse.emf.cdo.lm.client.ISystemDescriptor;
+import org.eclipse.emf.cdo.view.CDOView;
+
+import org.eclipse.emf.common.util.URI;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author Eike Stepper
+ */
+public class LMIntegrationTest extends AbstractIntegrationTest
+{
+ private static final String INITIAL_STREAM = "InitialStream";
+
+ private static final String MODULE_CLIENT = "ModuleClient";
+
+ private static final String MODULE_SUPPLIER = "ModuleSupplier";
+
+ private static final String MODULE_SUPPLIER_A = "ModuleSupplierA";
+
+ private static final String MODULE_SUPPLIER_B = "ModuleSupplierB";
+
+ private static final String CHANGE_1 = "Change1";
+
+ @Test
+ protected void entireNormalFlow() throws Exception
+ {
+ ISystemDescriptor systemDescriptor = createSystemRepository();
+ System system = systemDescriptor.getSystem();
+
+ // Add supplier Module
+ ModuleCreationResult supplierModuleCreationResult = createModule(systemDescriptor, system, MODULE_SUPPLIER, INITIAL_STREAM, 0, 1);
+
+ // Module supplierModule = supplierModuleCreationResult.module;
+ Stream supplierStream = supplierModuleCreationResult.stream;
+ IAssemblyDescriptor supplierStreamDescriptor = supplierModuleCreationResult.assemblyDescriptor;
+
+ Change change1 = createChange(systemDescriptor, supplierStream, CHANGE_1, MODULE_SUPPLIER + " - " + CHANGE_1, transaction -> {
+ transaction.createResource(MODULE_SUPPLIER_A);
+ });
+
+ // Deliver change1 to supplierStream.
+ deliverChange(systemDescriptor, supplierStream, change1);
+
+ // Test delivery
+ {
+ CDOView view = supplierStreamDescriptor.getCheckout().openView();
+ assertThat(view.hasResource(MODULE_SUPPLIER_A), is(true));
+ view.close();
+ }
+
+ // Add ModuleClient
+ ModuleCreationResult clientModuleCreationResult = createModule(systemDescriptor, system, MODULE_CLIENT, INITIAL_STREAM, 0, 1);
+ // Module clientModule = clientModuleCreationResult.module;
+ // Stream clientStream = clientModuleCreationResult.stream;
+
+ IAssemblyDescriptor clientStreamDescriptor = clientModuleCreationResult.assemblyDescriptor;
+
+ // Create dependency from clientModule to supplierModule
+ createDependencyAndUpdate(clientStreamDescriptor, MODULE_SUPPLIER);
+
+ // Modify ModuleClient
+ editStream(supplierStreamDescriptor, transaction -> {
+ transaction.createResource(MODULE_SUPPLIER_B);
+ });
+
+ // Publish a Tag for ModuleSupplier and update ModuleClient.
+ URI uri = URI.createURI(CDOProtocolConstants.PROTOCOL_NAME + "://" + MODULE_SUPPLIER + "/" + MODULE_SUPPLIER_B);
+ publishTagUpdateClientAndCheckUri(systemDescriptor, system, supplierStream, clientStreamDescriptor, uri);
+
+ // Remove dependency on ModuleSupplier from ModuleClient and update ModuleClient.
+ removeDependencies(clientStreamDescriptor);
+
+ // Add dependency on ModuleSupplier back to ModuleClient and update ModuleClient.
+ createDependencyAndUpdate(clientStreamDescriptor, MODULE_SUPPLIER);
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/LMVersionEvolutionTest.java b/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/LMVersionEvolutionTest.java
new file mode 100644
index 0000000000..ab610099ff
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/LMVersionEvolutionTest.java
@@ -0,0 +1,278 @@
+/*
+ * Copyright (c) 2022 Eike Stepper (Loehne, Germany) and others.
+ * 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:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests.lm;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants;
+import org.eclipse.emf.cdo.common.util.CDOException;
+import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.lm.Baseline;
+import org.eclipse.emf.cdo.lm.Drop;
+import org.eclipse.emf.cdo.lm.DropType;
+import org.eclipse.emf.cdo.lm.LMFactory;
+import org.eclipse.emf.cdo.lm.Module;
+import org.eclipse.emf.cdo.lm.Process;
+import org.eclipse.emf.cdo.lm.Stream;
+import org.eclipse.emf.cdo.lm.StreamMode;
+import org.eclipse.emf.cdo.lm.System;
+import org.eclipse.emf.cdo.lm.client.IAssemblyDescriptor;
+import org.eclipse.emf.cdo.lm.client.IAssemblyDescriptor.Updates;
+import org.eclipse.emf.cdo.lm.client.ISystemDescriptor;
+import org.eclipse.emf.cdo.transaction.CDOTransaction;
+import org.eclipse.emf.cdo.view.CDOView;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+import org.eclipse.equinox.p2.metadata.Version;
+import org.eclipse.equinox.p2.metadata.VersionRange;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.function.Consumer;
+
+/**
+ * @author Eike Stepper
+ */
+public class LMVersionEvolutionTest extends AbstractIntegrationTest
+{
+ private static final String INITIAL_STREAM = "InitialStream";
+
+ private static final String MODULE_CLIENT = "ModuleClient";
+
+ private static final String MODULE_CLIENT_A = "ModuleClientA";
+
+ private static final String MODULE_SUPPLIER = "ModuleSupplier";
+
+ private static final String MODULE_SUPPLIER_A = "ModuleSupplierA";
+
+ private static final String SUPPLIER_DROP_TYPE = "SupplierDropType";
+
+ private static final String TAG1_0 = "Tag1.0";
+
+ @Test
+ protected void testVersionEvolution() throws Exception
+ {
+ ISystemDescriptor systemDescriptor = createSystemRepository();
+ System system = systemDescriptor.getSystem();
+
+ /*
+ * Add supplier Module
+ */
+ ModuleCreationResult supplierModuleCreationResult = createModule(systemDescriptor, system, MODULE_SUPPLIER, INITIAL_STREAM, 0, 1);
+
+ Module supplierModule = supplierModuleCreationResult.module;
+ Stream supplierStream = supplierModuleCreationResult.stream;
+ IAssemblyDescriptor supplierStreamDescriptor = supplierModuleCreationResult.assemblyDescriptor;
+
+ editStream(supplierStreamDescriptor, transaction -> {
+ CDOResource resource = transaction.createResource(MODULE_SUPPLIER_A);
+ DropType dropType = LMFactory.eINSTANCE.createDropType();
+ dropType.setName(SUPPLIER_DROP_TYPE);
+ System sys = LMFactory.eINSTANCE.createSystem();
+ sys.setName("SupplierSystem");
+ Process process = LMFactory.eINSTANCE.createProcess();
+ process.getDropTypes().add(dropType);
+ sys.setProcess(process);
+ // EClass eClass = EcoreFactory.eINSTANCE.createEClass();
+ // eClass.setName(SUPPLIER_TYPE);
+ resource.getContents().add(sys);
+ });
+
+ publishTag(systemDescriptor, system, supplierStream, "Tag0.1");
+
+ /*
+ * Add ModuleClient
+ */
+ ModuleCreationResult clientModuleCreationResult = createModule(systemDescriptor, system, MODULE_CLIENT, INITIAL_STREAM, 0, 1);
+ // Module clientModule = clientModuleCreationResult.module;
+ // Stream clientStream = clientModuleCreationResult.stream;
+ IAssemblyDescriptor clientStreamDescriptor = clientModuleCreationResult.assemblyDescriptor;
+
+ /*
+ * Create dependency from clientModule to supplierModule
+ */
+ createDependency(clientStreamDescriptor, MODULE_SUPPLIER, new VersionRange("[0.0.0,1.0.0)"));
+
+ /*
+ * Update the client
+ */
+ updateClient(clientStreamDescriptor);
+
+ /*
+ * Modify ModuleClient
+ */
+ editStream(clientStreamDescriptor, transaction -> {
+ CDOResource resourceClient = transaction.createResource(MODULE_CLIENT_A);
+
+ CDOView view = clientStreamDescriptor.getCheckout().openView();
+ ResourceSet resourceSet = view.getResourceSet();
+
+ /*
+ * Retrieve drop from supplier
+ */
+ URI uri = URI.createURI(CDOProtocolConstants.PROTOCOL_NAME + "://" + MODULE_SUPPLIER + "/" + MODULE_SUPPLIER_A);
+ CDOResource resourceSupplier = (CDOResource)resourceSet.getResource(uri, true);
+ assertThat(resourceSupplier, notNullValue());
+ EObject eObject = resourceSupplier.getContents().get(0);
+ assertThat(eObject, instanceOf(System.class));
+ DropType supplierDropType = ((System)resourceSupplier.getContents().get(0)).getProcess().getDropTypes().get(0);
+
+ System clientSystem = LMFactory.eINSTANCE.createSystem();
+ clientSystem.setName("ClientStream");
+
+ Module clientModule = LMFactory.eINSTANCE.createModule();
+ clientModule.setName("SampleClientModule");
+
+ clientSystem.getModules().add(clientModule);
+
+ Stream stream = LMFactory.eINSTANCE.createStream();
+ stream.setCodeName("ClientStream");
+
+ clientModule.getStreams().add(stream);
+
+ Drop drop = LMFactory.eINSTANCE.createDrop();
+ drop.setLabel("ClientDrop");
+
+ drop.setType(supplierDropType);
+
+ stream.getContents().add(drop);
+ resourceClient.getContents().add(clientSystem);
+ });
+
+ /*
+ * Check client refers to supplier
+ */
+ retrieveValueAndTest(clientStreamDescriptor, //
+ resourceSupplier -> assertNotEquals(0, resourceSupplier.getContents().size()), //
+ element -> assertNotEquals(null, element));
+
+ /*
+ * Try to get a version not published yet
+ */
+ updateDependency(clientStreamDescriptor, MODULE_SUPPLIER, new VersionRange("[1.0.0,2.0.0)"));
+
+ try
+ {
+ waitForUpdates(clientStreamDescriptor);
+ fail("InterruptedException expected");
+ }
+ catch (InterruptedException expected)
+ {
+ // Success
+ }
+
+ /*
+ * Make changes on supplier
+ */
+ editStream(supplierStreamDescriptor, transaction -> {
+ CDOResource resource = transaction.getResource(MODULE_SUPPLIER_A);
+ resource.getContents().clear();
+ });
+
+ /*
+ * Create release from initial stream of supplier
+ */
+ publishRelease(systemDescriptor, system, supplierStream, "Release0.1");
+ supplierStream.getLastRelease();
+
+ /*
+ * Create a new stream for 1.0
+ */
+ Stream stream1_0 = createStream(systemDescriptor, supplierModule, supplierStream.getLastRelease(), 1, 0, "Stream1.0");
+
+ /*
+ * Check that initialStream is now maintenance
+ */
+ assertThat(supplierStream.getMode(), is(StreamMode.MAINTENANCE));
+
+ /*
+ * Try to create tag from 1.0 stream of supplier
+ */
+ try
+ {
+ publishTag(systemDescriptor, system, stream1_0, TAG1_0);
+ fail("CDOException expected");
+ }
+ catch (CDOException expected)
+ {
+ // Success
+ // Module definition version 0.1.0 is inconsistent with the stream version 1.0
+ }
+
+ setModuleVersion(stream1_0, MODULE_SUPPLIER, 1, 0, 0);
+
+ /*
+ * Create tag from 1.0 stream of supplier
+ */
+ publishTag(systemDescriptor, system, stream1_0, TAG1_0);
+
+ Baseline baseline = stream1_0.getContents().stream().filter(b -> b.getName().equals(TAG1_0)).findAny().orElse(null);
+ assertThat(baseline, instanceOf(Drop.class));
+ if (baseline instanceof Drop)
+ {
+ Drop tag1_0 = (Drop)baseline;
+ assertTrue(tag1_0.getVersion().compareTo(Version.createOSGi(1, 0, 0)) > 0);
+ }
+
+ /*
+ * Update dependency in client
+ */
+ updateDependency(clientStreamDescriptor, MODULE_SUPPLIER, new VersionRange("[1.0.0,2.0.0)"));
+
+ Updates updates = waitForUpdates(clientStreamDescriptor);
+ assertEquals(2, updates.getModifications().size());
+
+ /*
+ * Update the client
+ */
+ updateClient(clientStreamDescriptor);
+
+ /*
+ * Check that client model cannot resolve the supplier model element (because deleted)
+ */
+ retrieveValueAndTest(clientStreamDescriptor, //
+ resourceSupplier -> assertEquals(0, resourceSupplier.getContents().size()), //
+ element -> assertEquals(null, element));
+ }
+
+ private void retrieveValueAndTest(IAssemblyDescriptor clientStreamDescriptor, Consumer<Resource> testResource, Consumer<DropType> testDropType)
+ {
+ CDOTransaction transaction = clientStreamDescriptor.getCheckout().openTransaction();
+ URI uriSupplier = URI.createURI(CDOProtocolConstants.PROTOCOL_NAME + "://" + MODULE_SUPPLIER + "/" + MODULE_SUPPLIER_A);
+
+ CDOResource resourceSupplier = (CDOResource)transaction.getResourceSet().getResource(uriSupplier, true);
+ testResource.accept(resourceSupplier);
+
+ CDOResource clientResource = transaction.getResource(MODULE_CLIENT_A);
+
+ System sampleClientSystem = (System)clientResource.getContents().get(0);
+ Module sampleClientModule = sampleClientSystem.getModules().get(0);
+ Stream sampleClientStream = sampleClientModule.getStreams().get(0);
+ Baseline sampleClientbaseline = sampleClientStream.getContents().get(0);
+ assertThat(sampleClientbaseline, instanceOf(Drop.class));
+ DropType sampleClientDropType = ((Drop)sampleClientbaseline).getType();
+
+ testDropType.accept(sampleClientDropType);
+
+ transaction.close();
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/bundle/OM.java b/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/bundle/OM.java
new file mode 100644
index 0000000000..e90a68d991
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests.lm/src/org/eclipse/emf/cdo/tests/lm/bundle/OM.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2022 Eike Stepper (Loehne, Germany) and others.
+ * 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:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests.lm.bundle;
+
+import org.eclipse.net4j.util.om.OMBundle;
+import org.eclipse.net4j.util.om.OMPlatform;
+import org.eclipse.net4j.util.om.OSGiActivator;
+import org.eclipse.net4j.util.om.log.OMLogger;
+import org.eclipse.net4j.util.om.trace.OMTracer;
+
+/**
+ * The <em>Operations & Maintenance</em> class of this bundle.
+ *
+ * @author Eike Stepper
+ */
+public abstract class OM
+{
+ public static final String BUNDLE_ID = "org.eclipse.emf.cdo.tests.lm"; //$NON-NLS-1$
+
+ public static final OMBundle BUNDLE = OMPlatform.INSTANCE.bundle(BUNDLE_ID, OM.class);
+
+ public static final OMTracer DEBUG = BUNDLE.tracer("debug"); //$NON-NLS-1$
+
+ public static final OMLogger LOG = BUNDLE.logger();
+
+ /**
+ * @author Eike Stepper
+ */
+ public static final class Activator extends OSGiActivator
+ {
+ public Activator()
+ {
+ super(BUNDLE);
+ }
+ }
+}

Back to the top